From 8aa7f45af514b1b8e16329730f964a811803f521 Mon Sep 17 00:00:00 2001 From: Phi Date: Tue, 5 Dec 2023 10:09:26 +0100 Subject: [PATCH 01/38] Initial draft changelog Initial draft changelog --- CHANGELOG.md | 161 ++++++++++++++++++++++++--- build/openrpc/full.json.gz | Bin 34818 -> 34818 bytes build/openrpc/gateway.json.gz | Bin 11875 -> 11875 bytes build/openrpc/miner.json.gz | Bin 16370 -> 16370 bytes build/openrpc/worker.json.gz | Bin 6052 -> 6052 bytes build/version.go | 2 +- documentation/en/cli-lotus-miner.md | 2 +- documentation/en/cli-lotus-worker.md | 2 +- documentation/en/cli-lotus.md | 2 +- 9 files changed, 152 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6fb092922..7045a3f7d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,21 +1,156 @@ # Lotus changelog # UNRELEASED -- chore: Auto remove local chain data when importing chain file or snapshot ([filecoin-project/lotus#11277](https://github.com/filecoin-project/lotus/pull/11277)) -- feat: metric: export Mpool message count ([filecoin-project/lotus#11361](https://github.com/filecoin-project/lotus/pull/11361)) -- feat: sealing: load SectorsSummary from sealing SectorStats instead of calling API each time ([filecoin-project/lotus#11353](https://github.com/filecoin-project/lotus/pull/11353)) -- fix: miner info: Show correct sector state counts ([filecoin-project/lotus#11456](https://github.com/filecoin-project/lotus/pull/11456)) -- feat: add support for specifying block number when calling `eth_estimateGas` ([filecoin-project/lotus#11462](https://github.com/filecoin-project/lotus/pull/11462)). ## Improvements -- fix: Add time slicing to splitstore purging step during compaction to reduce lock congestion [filecoin-project/lotus#11269](https://github.com/filecoin-project/lotus/pull/11269) -- feat: Added instructions on how to setup Prometheus/Grafana for monitoring a local Lotus node [filecoin-project/lotus#11276](https://github.com/filecoin-project/lotus/pull/11276) -- fix: Exclude reverted events in `eth_getLogs` results [filecoin-project/lotus#11318](https://github.com/filecoin-project/lotus/pull/11318) -- fix: The Ethereum API will now use the correct state-tree when resolving "native" addresses into masked ID addresses. Additionally, pending messages from native account types won't be visible in the Ethereum API because there is no "correct" state-tree to pick in this case. However, pending _Ethereum_ transactions and native messages that have landed on-chain will still be visible through the Ethereum API. -- feat: Unambiguously translate native messages to Ethereum transactions by: - - Detecting native messages that "look" like Ethereum transactions (creating smart contracts, invoking a smart contract, etc.), and decoding them as such. - - Otherwise, ABI-encoding the inputs as if they were calls to a `handle_filecoin_method` Solidity method. -- fix: ensure that the Ethereum API never returns "empty" addresses for native messages. When a "to" address cannot be resolved to a 0x-style address, it will be re-written to `0xff0000000000000000000000ffffffffffffffff`. This can only happen when the native transaction _reverted_ (failing to create an account at the specified "to" address). + +# v1.25.1-rc1 / 2023-12-05 + +This is the first release candidate of the upcoming optional release of Lotus v1.25.1. This feature release includes numerous improvements and enhancements for node operators, ETH RPC-providers and storage providers. + +## ☢️ Upgrade Warnings ☢️ + +There are no upgrade warnings as of this first release candidate. + +## ⭐️ Highlights ⭐️ + +**Lotus-Provider** +The feature release ships the new Lotus-Provider binary, together with its initial features - High Availability of WindowPoSt and WinningPoSt. + +Over the next couple of days, we will sanity check some feature and build up a larger cataloge of documentation. Once out, they will be linked here. + +**SupraSeal PC2** + +In this release candidate we have verified SupraSeal PC2 to function properly with Committed Capacity (CC) sectors non-Synthetic, and SyntheticPoReps that is coming with the nv21-version. + +However, we have experienced errors when using it with deal sectors. As a result, we advise against using SupraSeal PC2 called through the `lotus-worker` for now with deal sectors in the sealing pipeline, except in testing environments. We will update this guidline in later release candidates, once we have a fix for deal sectors. + +[Refer to the documentation to learn how to use SupraSeal PC2](https://lotus.filecoin.io/tutorials/lotus-miner/supra-seal-pc2/) with your `lotus-worker`, as well as how to perform benchmarks using this feature. + +## New features +- feat: sturdypost work branch ([filecoin-project/lotus#11405](https://github.com/filecoin-project/lotus/pull/11405)) +- feat: worker: Support delegating precommit2 to external binary ([filecoin-project/lotus#11185](https://github.com/filecoin-project/lotus/pull/11185)) +- feat: build: Add SupraSeal-PC2 binary script ([filecoin-project/lotus#11430](https://github.com/filecoin-project/lotus/pull/11430)) +- Feat: daemon: Auto remove existing chain if importing chain file or snapshot ([filecoin-project/lotus#11277](https://github.com/filecoin-project/lotus/pull/11277)) +- feat: mpool/wdpost: Maximize feecap config ([filecoin-project/lotus#9746](https://github.com/filecoin-project/lotus/pull/9746)) +- feat: Add lotus-bench cli option to stress test any binary ([filecoin-project/lotus#11270](https://github.com/filecoin-project/lotus/pull/11270)) +- feat: chain import: don't walk to genesis - 2-3x faster snapshot import (#11446) ([filecoin-project/lotus#11446](https://github.com/filecoin-project/lotus/pull/11446)) +- feat: metric: export Mpool message count ([filecoin-project/lotus#11361](https://github.com/filecoin-project/lotus/pull/11361)) +- feat: bench: flag to output GenerateWinningPoStWithVanilla params ([filecoin-project/lotus#11460](https://github.com/filecoin-project/lotus/pull/11460)) +- feat: Add ETA to lotus sync wait (#11211) ([filecoin-project/lotus#11211](https://github.com/filecoin-project/lotus/pull/11211)) + + +## Improvements +- feat: bootstrap: add glif bootstrap node on calibration ([filecoin-project/lotus#11175](https://github.com/filecoin-project/lotus/pull/11175)) +- fix: bench: Set ticket and seed to a non-all zero value ([filecoin-project/lotus#11429](https://github.com/filecoin-project/lotus/pull/11429)) +- fix: alert: Check UDPbuffer-size ([filecoin-project/lotus#11360](https://github.com/filecoin-project/lotus/pull/11360)) +- feat: cli: sort actor CIDs alphabetically before printing (#11345) ([filecoin-project/lotus#11345](https://github.com/filecoin-project/lotus/pull/11345)) +- fix: worker: Connect when --listen is not set ([filecoin-project/lotus#11294](https://github.com/filecoin-project/lotus/pull/11294)) +- fix: miner info: Show correct sector state counts ([filecoin-project/lotus#11456](https://github.com/filecoin-project/lotus/pull/11456)) +- feat: miner: defensive check for equivocation ([filecoin-project/lotus#11321](https://github.com/filecoin-project/lotus/pull/11321)) +- feat: Instructions for setting up Grafana/Prometheus for monitoring local lotus node ([filecoin-project/lotus#11276](https://github.com/filecoin-project/lotus/pull/11276)) +- fix: cli: Wrap error in wallet sign ([filecoin-project/lotus#11273](https://github.com/filecoin-project/lotus/pull/11273)) +- fix: Add time slicing to splitstore purging to reduce lock congestion ([filecoin-project/lotus#11269](https://github.com/filecoin-project/lotus/pull/11269)) +- feat: sealing: load SectorsSummary from sealing SectorStats instead of calling API each time ([filecoin-project/lotus#11353](https://github.com/filecoin-project/lotus/pull/11353)) +- fix: shed: additional metrics in `mpool miner-select-messages` ([filecoin-project/lotus#11253](https://github.com/filecoin-project/lotus/pull/11253)) +- storage: Return soft err when sector alloc fails in acquire ([filecoin-project/lotus#11338](https://github.com/filecoin-project/lotus/pull/11338)) +- feat: miner: log detailed timing breakdown when mining takes longer than the block's timestamp ([filecoin-project/lotus#11228](https://github.com/filecoin-project/lotus/pull/11228)) +- fix: shed: make invariants checker work with splitstore ([filecoin-project/lotus#11391](https://github.com/filecoin-project/lotus/pull/11391)) +- feat: eth: encode eth tx input as solidity ABI (#11402) ([filecoin-project/lotus#11402](https://github.com/filecoin-project/lotus/pull/11402)) +- fix: eth: use the correct state-tree when resolving addresses (#11387) ([filecoin-project/lotus#11387](https://github.com/filecoin-project/lotus/pull/11387)) +- fix: eth: remove trace sanity check (#11385) ([filecoin-project/lotus#11385](https://github.com/filecoin-project/lotus/pull/11385)) +- fix: chain: make failure to load the chain state fatal (#11426) ([filecoin-project/lotus#11426](https://github.com/filecoin-project/lotus/pull/11426)) +- fix: build: an epoch is near an upgrade iff the upgrade is enabled (#11401) ([filecoin-project/lotus#11401](https://github.com/filecoin-project/lotus/pull/11401)) +- fix: eth: handle unresolvable addresses (#11433) ([filecoin-project/lotus#11433](https://github.com/filecoin-project/lotus/pull/11433)) +- fix: eth: correctly encode and simplify native input/output encoding (#11382) ([filecoin-project/lotus#11382](https://github.com/filecoin-project/lotus/pull/11382)) +- fix: worker: listen for interrupt signals in GetStorageMinerAPI loop (#11309) ([filecoin-project/lotus#11309](https://github.com/filecoin-project/lotus/pull/11309)) +- fix: sync: iterate over returned messages directly (#11373) ([filecoin-project/lotus#11373](https://github.com/filecoin-project/lotus/pull/11373)) +- fix: miner: correct duration logs in mineOne ([filecoin-project/lotus#11241](https://github.com/filecoin-project/lotus/pull/11241)) +- fix: cli: Add print to unseal cmd ([filecoin-project/lotus#11271](https://github.com/filecoin-project/lotus/pull/11271)) +- fix: networking: avoid dialing when trying to handshake peers ([filecoin-project/lotus#11262](https://github.com/filecoin-project/lotus/pull/11262)) +- metric milliseconds computation with golang original method (#11403) ([filecoin-project/lotus#11403](https://github.com/filecoin-project/lotus/pull/11403)) +- feat: shed: fix blockstore prune (#11197) ([filecoin-project/lotus#11197](https://github.com/filecoin-project/lotus/pull/11197)) +- refactor:ffi: replace ClearLayerData with ClearCache (#11352) ([filecoin-project/lotus#11352](https://github.com/filecoin-project/lotus/pull/11352)) +- fix: api: compute gasUsedRatio based on max gas in the tipset (#11354) ([filecoin-project/lotus#11354](https://github.com/filecoin-project/lotus/pull/11354)) +- fix: api: compute the effective gas cost with the correct base-fee (#11357) ([filecoin-project/lotus#11357](https://github.com/filecoin-project/lotus/pull/11357)) +- fix: api: return errors on failure to lookup an eth txn receipt (#11329) ([filecoin-project/lotus#11329](https://github.com/filecoin-project/lotus/pull/11329)) +- fix: api: exclude reverted events in `eth_getLogs` results (#11318) ([filecoin-project/lotus#11318](https://github.com/filecoin-project/lotus/pull/11318)) +- api: Add block param to eth_estimateGas ([filecoin-project/lotus#11462](https://github.com/filecoin-project/lotus/pull/11462)) +- opt: fix duplicate check exitcode ([filecoin-project/lotus#11171](https://github.com/filecoin-project/lotus/pull/11171)) + +## Dependencies +- update go-libp2p to v0.31.0 ([filecoin-project/lotus#11225](https://github.com/filecoin-project/lotus/pull/11225)) +- deps: gostatetype (#11437) ([filecoin-project/lotus#11437](https://github.com/filecoin-project/lotus/pull/11437)) +- fix: deps: stop using go-libp2p deprecated peer.ID.Pretty ([filecoin-project/lotus#11263](https://github.com/filecoin-project/lotus/pull/11263)) + +## Others +- chore: update FFI (#11431) ([filecoin-project/lotus#11431](https://github.com/filecoin-project/lotus/pull/11431)) +- chore: build: bump master to v1.25.1-dev ([filecoin-project/lotus#11450](https://github.com/filecoin-project/lotus/pull/11450)) +- chore: releases :merge releases into master ([filecoin-project/lotus#11448](https://github.com/filecoin-project/lotus/pull/11448)) +- chore: actors: update v12 to the final release ([filecoin-project/lotus#11440](https://github.com/filecoin-project/lotus/pull/11440)) +- chore: Remove ipfs main bootstrap nodes (#11200) ([filecoin-project/lotus#11200](https://github.com/filecoin-project/lotus/pull/11200)) +- Remove PL's european bootstrap nodes from mainnet.pi ([filecoin-project/lotus#11315](https://github.com/filecoin-project/lotus/pull/11315)) +- chore: deps: update to go-state-types v0.12.7 ([filecoin-project/lotus#11428](https://github.com/filecoin-project/lotus/pull/11428)) +- fix: Add .vscode to gitignore ([filecoin-project/lotus#11275](https://github.com/filecoin-project/lotus/pull/11275)) +- fix: test: temporarily exempt SynthPorep constants from test ([filecoin-project/lotus#11259](https://github.com/filecoin-project/lotus/pull/11259)) +- feat: skip TestSealAndVerify3 until it's fixed ([filecoin-project/lotus#11230](https://github.com/filecoin-project/lotus/pull/11230)) +- Update RELEASE_ISSUE_TEMPLATE.md ([filecoin-project/lotus#11250](https://github.com/filecoin-project/lotus/pull/11250)) +- fix: config: Update ColdStoreType comments ([filecoin-project/lotus#11274](https://github.com/filecoin-project/lotus/pull/11274)) +- readme: bump up golang version (#11347) ([filecoin-project/lotus#11347](https://github.com/filecoin-project/lotus/pull/11347)) +- chore: watermelon: upgrade epoch ([filecoin-project/lotus#11374](https://github.com/filecoin-project/lotus/pull/11374)) +- add support for v12 check invariants and also a default case to reduce future confusion (#11371) ([filecoin-project/lotus#11371](https://github.com/filecoin-project/lotus/pull/11371)) +- test: drand: switch tests to drand testnet (from devnet) (#11359) ([filecoin-project/lotus#11359](https://github.com/filecoin-project/lotus/pull/11359)) +- feat: chain: light-weight patch to fix calibrationnet again by removing move_partitions from built-in actors (#11409) ([filecoin-project/lotus#11409](https://github.com/filecoin-project/lotus/pull/11409)) +- chore: cli: Revert move-partitions cmd ([filecoin-project/lotus#11408](https://github.com/filecoin-project/lotus/pull/11408)) +- chore: forward-port calibnet hotfix to master ([filecoin-project/lotus#11407](https://github.com/filecoin-project/lotus/pull/11407)) +- fix: migration: set premigration to 90 minutes ([filecoin-project/lotus#11395](https://github.com/filecoin-project/lotus/pull/11395)) +- feat: chain: light-weight patch to fix calibrationnet (#11363) ([filecoin-project/lotus#11363](https://github.com/filecoin-project/lotus/pull/11363)) +- chore: merge feat/nv21 into master ([filecoin-project/lotus#11336](https://github.com/filecoin-project/lotus/pull/11336)) +- docs: Link the release section in the release flow doc ([filecoin-project/lotus#11299](https://github.com/filecoin-project/lotus/pull/11299)) +- fix: ci: fetch params for the storage unit tests ([filecoin-project/lotus#11441](https://github.com/filecoin-project/lotus/pull/11441)) +- Update mainnet.pi ([filecoin-project/lotus#11288](https://github.com/filecoin-project/lotus/pull/11288)) +- add go linter - "unused" (#11235) ([filecoin-project/lotus#11235](https://github.com/filecoin-project/lotus/pull/11235)) +- Fix/texts (#11298) ([filecoin-project/lotus#11298](https://github.com/filecoin-project/lotus/pull/11298)) +- fix typo in rate-limit flag description (#11316) ([filecoin-project/lotus#11316](https://github.com/filecoin-project/lotus/pull/11316)) +- eth_filter flake debug ([filecoin-project/lotus#11261](https://github.com/filecoin-project/lotus/pull/11261)) +- fix: sealing: typo in FinalizeReplicaUpdate ([filecoin-project/lotus#11255](https://github.com/filecoin-project/lotus/pull/11255)) +- chore: slice loop replace (#11349) ([filecoin-project/lotus#11349](https://github.com/filecoin-project/lotus/pull/11349)) + +## Contributors + +| Contributor | Commits | Lines ± | Files Changed | +|-------------|---------|---------|---------------| +| Andrew Jackson (Ajax) | 161 | +24328/-12464 | 4148 | +| Łukasz Magiera | 99 | +5238/-2690 | 260 | +| Shrenuj Bansal | 27 | +3402/-1265 | 76 | +| Fridrik Asmundsson | 15 | +1148/-307 | 58 | +| Steven Allen | 15 | +674/-337 | 35 | +| Ian Norden | 1 | +625/-3 | 4 | +| Aarsh Shah | 4 | +227/-167 | 14 | +| Phi | 19 | +190/-183 | 32 | +| Aayush Rajasekaran | 3 | +291/-56 | 16 | +| Mikers | 2 | +76/-262 | 19 | +| Aayush | 14 | +111/-59 | 21 | +| Friðrik Ásmundsson | 1 | +101/-1 | 2 | +| Alejandro Criado-Pérez | 1 | +36/-36 | 27 | +| Jie Hou | 5 | +36/-10 | 5 | +| Florian RUEN | 2 | +24/-19 | 5 | +| Phi-rjan | 3 | +20/-8 | 3 | +| Icarus9913 | 1 | +11/-11 | 6 | +| Jiaying Wang | 3 | +8/-7 | 5 | +| guangwu | 1 | +3/-10 | 2 | +| Marten Seemann | 1 | +6/-6 | 2 | +| simlecode | 1 | +0/-6 | 2 | +| GlacierWalrus | 2 | +0/-5 | 2 | +| Anton Evangelatov | 1 | +2/-2 | 1 | +| Ales Dumikau | 3 | +2/-2 | 3 | +| renran | 1 | +2/-1 | 1 | +| Volker Mische | 1 | +1/-1 | 1 | +| Icarus Wu | 1 | +1/-1 | 1 | +| Hubert | 1 | +1/-1 | 1 | +| Aloxaf | 1 | +1/-1 | 1 | +| Alejandro | 1 | +1/-1 | 1 | +| lazavikmaria | 1 | +1/-0 | 1 | # v 1.25.0 / 2023-11-22 diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 4e3f31fbac65da324b9d4afcfa0df76515c27435..1395acd3e3531a548f72ad003a10900743139b9c 100644 GIT binary patch literal 34818 zcma%?Q*b6gx2|JNoJ?%n*2K1L+qP{dUu@f)*tWmelT6G#`#*I~ots^?`=WbwS6{5| zi&eee^)z7&49I`l_f@Z#%T`Ad^qZQZcR(&#si*0L3{az7e?$g#&k5CFD{I^5aGMty zRtif6Bm$&YmS*qsC&o>TV04oiu8aJPCRsXEeWX?ZcCI4(?DKK)*j? zBJ}CW|B35_;NtpGo(c(@i+D%~I2YtyxAo~XKS2JRJS%h_XZAc3vVo=V^JY2xltO_)4C71j-Vfv-{0tbuUzx{448Eh2#uJgl zNEYEIiY@W>2iwny+MJG84^JEs#Rk71n02RDtpxqh9qFV$uIzeHzr*WjrNZ^!=#hk% zZ|`^w6lKN&h$Ei;Kcn+}69_(E$f2G+BEgTu({zuZ$AfhFvIG+f4an!-_+6{}_K4lc z*f){_27EE%g#u4fN%xJMS1zA_5BxifdG5RIZTntX(|EYZX}=tsL(da9&Dq-wn(x!r zdhy}jNum?_2bAAO4&nS(_je9S6LabJ+{DT1EG}~y93pQf@hOcK&9x@onk03ClzP=s ziSCc%n&m{TXw?-*nLH3e$Y5@)K!~2et9Y*FKvbNj48!n(F^d5db`bJpE4+nKhggw3 zGa}~YNPVWh6f+TE(Lnc*DO`i*n2TtK>F>Bw>>HOeuP}uQLW&QxT6+?GzMIzG_cn7o zLJ}mW2eS{2ZZ&)jMy)x&eFre;Zd~Yfy_U8^cOI=3t15_}>^3~->uCYZf)z1>ffQ7N z!&2%;=mw-CJa8Bi*%!6cJaLA@`?E&-O>P=DcN<~sTM&A10l~$B z*MpR6^WYGrTiE5B(fhrfaCf2ed(Bfo$RlN86(ZqxH-Jf0XXvsvZ{8B6nRyhfcR z*Veule_1lTSZC1IB2iXpSnt|YR7yl`QFxkut7G7c8`xjmE$}CTd`|q_9f>My|D5Di zSy+TJxy;wrm@e2|$R_TJnlu{PlSd3Rg#~&7EKnXqb@OjBUJtL&49vqutn)q)gnPRi zJQobJxjHflJI@3O3g}c-{6#L*j(G1y*fB0K{L?uIRq%Mt)NjLVyA2$6VE9g$8Ua7l zZ}u(2G#)ENW$t)DJ0%IzNaR$O%K;JLh`@!+i*+y04F_lp=B!g(w2` z5!h8oYT0=;IFNNz6uD$h89jxyYU1D;PDuKXG4lz;*g7I}nj7|b0`@C6+d$lzB_{%YuM^0BPJIJT62CJGzdxS) z!^rsW6G^?-%>1AFjGP5Ue*5@1yvNYolAb9#i+TpK6I-y6**iGctl#1bBg$NUp2f(^ zpL4I-1$=MFe0ne4PV_(Bc38Ib1gT&}maZR1sLT0_c=8>7N$$H_hW+0jZlwng4-Bx)~}WCh~(Fp z%F@NH6;U+W87xPtT!qzE1bnZAq<>R57v-;5D7BxZzkFPdj9O*5tw9pBoy~M^ZBP2a(5^nv&XiQ>Inyk0zI6$D$V|2mGu)b;vxei zm(oKin>z9DxCvNagY$-k`HuHGk;1@S$PC7a2nFS>}A*+Rj!qMc?zVR&SPYXA^<-?{VF^`D*`O$|ZD z?j5K_xU5G8h-OncIl_zKc5p|i7ZKtPGtZIK&T53eHQdPDiA=&1Vnm}n7%Q=3HpS00r$SFJQCEm?+8zPOyUCwehSgd8smKd z%pm;YK?>MICP-5CzKvc3)R}`eu2Q;uN$froe8FRre4cT>b%-!I3P6T~m~uSflZUnno${;n{)0o>q(@eB;{ zzXCw=<7emg{J40a$MOex9sRvs9Y4NaK(6wAxnJ~JJYOJvznqCL%(8o5NVFx_1h`(k zJzXoZJGlh-e|2?`8DK|i5f|rZ5mG^tN|cI_1&V}#a8IOmP`x=jd#)zji+)l)HnsiP z91du@ZG`CY|K4~fg~LNPKY^6K_X|jZP_JJOY5X1H7d(va;MHKg(Dumzpvw@#uzo))Acx-9NmXM>^I&8LRW1IDU4nAk?YO765UOYDT^J~u%g0M*<$_q}<=W{TKROfEu z?-GQGX&|kv(^st$+4cgSOMLL|?ujAO+4Car;VnOxS#R%-|E-5Bri`#7J-L5Br3Jr@ zNSdwh)C)%(b{}W*3bPqSw!_4Z7(Yfz-a}0$dfL)cbA_Zaz{?^2YMDf}l%U;xW3z6J zfl$@d!RE2(G9y3GH!YrF)@eLxR zVI2J8@nx&gWa8rJi**~Qi|Q6i#9eI(x|#y1xpAyVK9#&i@%sw9qcq3Msn%fZ%`Kg4 zx1o;5+hR>pqS?fmIB2bDlE;4h4_2vb1e?aT6KAVDie5*WNQo)ms5O5f17>_-5wqz) z2pSYihtPqZkG{i*#M~r4rWy_V=cwfug#HE3>_^rWLHqN_nUn(-$(Hq+#YEjj&#l55 zag$C)#|b!4IId-t6R4FIuaqx{6+YH?>Yub^Q=}`J1IP}|9=9G@NLpUAnHAME!!HA5 zQ%{&;+NDnOia5x4pgvB$FiwQc$Ofy+)^~Z2zE-vEEgwHnhmy5nfNYq{y6@l&OxqsP zf@g&>(}ibpPg(>0{4&8Z1LafqDzHFpcf=Kz>`V`8!`d-+>tyGy;V)QJN0NC2klJ(e zVzQYRT(lw@>a6M>i|VXf^{ohH&IXoWWZev9ElR+PRTb|orD~96*bd04d4G_iv5nZB zfwK~rCt*rZVM9>~)pPsF!787Ml_&!&R-8)Q@Uq~d)dkZ#`gpoYqPPa?R>l=HNi&+{ zqWtSWofRw&2NOHFl4 z9$x6w-GslSa~K5IsP_AX_MUG7_ldo%6F`F#tD7L?Q8J9cGepm7j#A0VQs)%sp)a_K z(TRMT-etg+f8~w_1b_FEvAlqQeBA&%Kl&F;`o85c{M!Sh2EP0JKi^g^*S@Q1FTU@a zS$FO^alGpYpkDrVlYB$&1w1z)9TDmO@p!N7-|PLjE8oFuoPb|*SfoMsB|)8B_CBdy z;L|Tzk;FTBgMMh)X=5U*?Zt^tz(@^^=GX}hfVyz#AnG&_qbjNdQ(c*9U%{0Ktx5*m z1Prq=ww=4)o+m2SR?{?njF_}e*b@pbZ@g@#{YYI1Hl?<9-;?8ldw{2>)KR8ai^Ap_ z<>~BD0BAwZ+f#cf@6-#zm_b`Wb;h`QrRp=M)#wbIaM?(uhLT~ZNlwp=l24SV5wlHt zD(m;rB6j_5qm(errd?lyK>r zhsYX%=#2`i(~jk*Re z)Yh~$ZBAZ{kyp20B0Bkp);!voR^0%vx0p+Jg`=u*Xfd0u8FJt@GkYM@yKc1f^Tt5( zKr+d8pwBRxO)r=86n!{wbBq@-%+-JC(uIpEP+J$h%M!E`ZB+8&y`u=VmtqOcUjrdJ zEX#Q_%POlQ%ihbM^0@Q z;=G#-DLu}_9_SXMn?y25ps4Pcg!V_Ux>V46AP5nQc+D+RtIxK-F~?0?CPtb(!EP+6 z=;IQNSmJ;weA77wN4n))huCbo&zQ|1jo6Rd|01fR$?`3r2t);wcOm*ywBBr6Bxb6y zsLJeFlYA$&S5E1%x%zL;lXq3h41m)O+Fd>*v4yXWv|8P%)z|9x%0G8>@fVr{tJNaV zaJV8tBWC@m>T8fct`z6grs*0t(VD`9r zP?Tb@wB61l7UxymtF?7N(Bzjmr`#q}&#jmbr>sX)vRChehza2@g;D2_U3FN4>ugaI ze)S#393r^+wBCgm6`llz!E2!#u67BpwYEmnRG^5El}uP_h5p= zoL6X$cV-_M7467+XQMXrVfK~WJ(6b}>zN5>k%pj$i6*0sLm+rdigtAh;AeBr1&0Q% zA8Y-~Z6E!kiG=|Zz19f}5Ygjj)W_B_2?tS6hrGE&j(4WcQlpW3M0&}4igsX{ruS@# zQg$stpDZ@v*sbf-viA4e!!d60-wU0f@=Tq^z`1`4fZp5@R>8&9Mk(s{PTda^702@} zR218DjA;e#3d(m+Z(GMS;jS1QwM_fwPJ!t-6VRiX#H0C6LO6kbrG84bajh-8CKH{S zEreA$#+c}+SOc8Qu8>`qP3GO5O1PSPCXx>j?^#g5oI=i2yzS=*^?_+)GbAzUhIlt@ zDiyLeDUS0e@4Sn!f-nd%(z3|UvFvfEJ0l)6_{$_EhBx&QqWEQ8w7_{Y{SX*XTf}f3 z1SRqARH(V1j#uhoidHv7i1&!Z5tyK4w#vcta%K{Jg*3!KVZ=^`W|W@-0;wFG35pHG z-vmL-rTT!7+M=yefZfVal&p)8e(yLn^6|LD?#fbhU4O^7(JB6qzOS*qzt>NP zU+;epB-}-R>25>i%hv^bGYVMUvMP)d@GG*FKQiap-t<+%)yXuTVFN+M*XDUe8@PDo zAPmY%X(lj5!%mnwgndO)`32Zgow5kJ(4D;&F~O@yxEno51CyzL3Q`czIf_Lwn~p=K zg0P>>4r{&U*2!kuwWpb`;p%@+1;AAh4F@XyU07u{{jl6$*yO zTxYs2vD+u8=FIdEm_0CBZNWegA3zO#7f|u>p}86Y9u-!|bG0MFU}yVS8$aX^01}1O zwiWH4dAh|(pqw}t(52W0TV=gArl{s;tX=MuVh*glEbI>!7P5WV>SCg!i`A}!Sw9?< zc4QrMWbBljgNF5mb#0y&<|Y`3r^=`}6dV`bB_T>@KK8|-{yIqAPoZAWU>_po0Q=F0JkRWj8Lh$ynuKs90IB_5(&iO3!w?jCt z*Ed-DfQ8f`;6b1QkVOprdye~)oZRg1Xfc--as)iL;ZA~znRny1HIvd#xN5Rw0~gXq z+6^d+S-YlrSry1tTQ|fl>E|zev$6qk$G`G__P;Zy4B0vbE3VP;3sQB{$O8CPT0-GA zs^Ij}ga7hV)ESniOOsXEqkg^6_;mn(iJ))$WyvZwU@1!gmI<09acn`WRfd=rIGBZ) z&rF@CLO}&W@TT|K!H~JA_L0#lb>6a6e!|wm_Y^>Y8r*jFv<${7fW@y#?`b?O)nt{X zrW25#8nQ6X)H%Zh7mZ$FoJciST&_pf8udTJrYwQPv>orr7{H1MS5hh*?Uhrl_aEMo zdU8sH%2awI@UJM|956e9L1-=hfLp{An}9BdkrI5Cr(b>W3HrTxU0pYz(J_pVEyQgs zXWo0qeqc?ZqZV`0JqQ9+SZWbLD3Ijly8qf&ak{m{1=sD|vkm>2_Pk(+Kjqha9K zEV(>A%6eEv{#f31@E*PE)@*4fc47n-%+0RuR`S>sW(nI*;-$da(GvkNFmAPaqoWzx z8dR>`vDg5m?hF2E+2O9E+?_5XpcKEQlh(-2StFEakTHekHfI!8xqQ?nSkF1div$V; z%;qm2v~>YkQk!fGGgW2+_bv?eGrR8_F<)y>BfTqhT5PS*;+=UCMtDHRJPaUp&w5$H`)&XD#=4aSARyd7H{q$O0z`6fh#F zP#hL)>)l(WUcg=-QmvOKiThQxLy=;B+d6;Lg}F6=Y=3Qm3s^?-EhDX=6Voe-ISo)bhb< zdFk2BmFQx4?b z-z;f9i&fZV73-XgPhb6JSEo$MfT^Dao|eT>S*UVc^RmQdyW7+q#<4!D2YyiWDTo*; zm1U?HDMv{el9i#Vlv0ddMh%DDtd^O~GqBYxnET#|bh_Qf=YD79+e z824Q1J!!vVnK&c##%3qF3N$BL1&}}>x^>4uskyW^{SDF?VnBi!-GV~u$!VzjcrN2; zACwq31+kP_jj8f*+)^#;tz*cYMC*)P1Ad`BKg_^SK!8iRZvP9pn%gW~Tir{8pcQ}PgwmPWym>X9XfT@1;l4q6B0~V^c~i`Y83*O zY$9|?W=w^B5djqq@ZoZPTTdZMPOZ_Yk`C+)f4A>)ebrm%43j&6ekXNYb={=d+i*={ zd-0}7CuQbcOMiPUxw2*X2Uzdzuf?#I^DfQkpW5~OdWwr;F(y!Eq*W;%MZUrYJXFHC zbgp0prz6;kp1SGsN3eUPw@0-2UQ&^+Uev{!R^4*Xv2EwtV{%)11rbl-Iug&Un~>g3 z2U`y9)(Xoq2yq4N=;kPow2jeDvgX^W{7ehitzx9vt7255D5%7V#&l%^WOa0`5e(6F zIm(nb_#2b=&)}3H^x#Bt!k~6^1#yrqje#5(^ElWFi{q9KX6p@txEPiQ!Zyg-A@kvo zoBx>(f#oY`?xX#6v0E$qyp(j`KL$sttRV=worW`b&89_FfBp3)~|CmY5u+WyKoj zCqoDjcL8a=n!mMUaOhMPe|ov2-b?FGzUlyi(B(Ex>7?0BCd`uJ>B zJN`~L6{9VakE!VsimPTkCUQ7GMsx^EDe8N1wSw9h#`Us`S&8J97VbgI>%39;3_ z`l35tw9as2xlW}?0YAwX5F(JX^32Vn%28;ZW!bKs$)a3ZUNyDgU`24LRRu&WoVIbe z#_MERu}&ENlD24YNbVO{^NB<0R7HIU63Nvg&7xsxr7)#c3govffx0Nk@C}9>f znU~AE(JfftoYc#-SRrB6N#uP3SH?KzzPbRPHA#mEE>~OV?+U+0{EJ0=IqLl-%!6mD zzcueKewojImvJP-sY2bZtI4zws?`U-3J4F5-W7&Eb2q%A_ISF@T7i_G;dg7pUl-T$ z@FCmzx{*rp0Sb=*ikx*reulDfF45 z9GUN81G+PIe~?EmWs*i`Nc}?FWDU4`qV&}9O^?9A^o+-fa4|?-$FrTR;HINm`Zc$( zmtQG>LVR0*L{*OXD6I^`-mA&7r9GLUgS_LVVQp=lmpkmIlhb(yKXcBmO|v4|6-6^q z&FW!`N666AMYf~MiJ5r>qnm0=CL%}_aF$AHjSh&KHC0wmC$sgLH%o4?aIYP6WLmF1 z#UC|Fl)9SF4uhjtb4vcf9lOYHOO`{8xn*afe!Z%!x!-!>FTv6MLe8b0f|0?ga@fefwJ_rW5&{7JBP;b-J4!Vm15fgf`zs7up zK4aD{D3!7TPQH1vCun*Y)5_`DeSLY+N*)#sW)^>ioZa274D4L@{D84(TMH|B>!bD> zkF7ua*CZ|@f0`#HQvaS`X4byXUnBpH{yJyxjTf2II&{pNreyT^)~386bpe{E>rDD` z21>?QWe;tctn8o2_j8VsJy!1{YBv7Tl*uczIR@PxFV(M%eWK?nyRVmfkjVuUh0Tr8 zwVhgZx`l@r+1;$exadN7Y-aLM(B;ZDknZ*&MQuGbgb7WBD{(-rp8u}vYEqXQHI4pz zF;3rXj2)2|vHcK)APtmZ@FR~5Dkj-uh>FGt1Op4IU~2;-BKv3GvM zVYpOlEOvJQ$j5(Md7kSZzZeFMwpy{l=SpKxTl*e}>kLM8>Vc@`&Q`q;jQS%&l`*;m zPCJNx1Xj_Q%$ke+jA$g|4ICOD>GIm^j~uT4O|njuNB0Lya{|wDfwA7Vq0^p8Taf89 z4Yo9$XMzKuk9^}w$UaK0iy48J+t}Vy&-}9ZT5$?9=Xw?sLUyP?iTqjfUF&o&+UGdg zNEyc1GI5)m!;Cy(S_al)7mjOPKC|j}E8L9{9gecd9fEmTg`xsG&xf~AiF(@gjY>IO z(iAAK$i`z3g~ib-L4`$;_5n(fPS6*r1?E9eZ-l6KZ{ZMXU_F|kCHio6=&aZ3$8E`3G*5*tKi_5sm8+b8 zN-H;OoSMtAH?@SY%P1neNO@e06T%~3kT9vwSx%(+u{5a5?n8BC7RsWDW>dmkSt1gwX{vdRS}Zlj5n zU4Wn#pZ=h=E`Npa5YC^Su<(y<2|Foa?hX+=L1$<@o_rbd@?;o8DD(gaI)G=LsVw>V>7)!cS>Yvu zeLH|zc=qU8$Aisjta!o^Hx9}H-=d?L9orsZ^l)%?cGa+DW2&rF`pdf6OJ%+GH3?A< z8*#Ca7N{XWJf1R%!h+XR%f*oCJNpBNzeXF9!dGiSJ?)F$gz8UGqF70u3+-FY!I3YB zmn5B!NllM*JT*>EWr!O8cSNVrAR5O1ueWeQJ)y zqmudt05KoHNstn5^#^TG2qr5;J+tu#`F|IZwFNlsoN`-9$QYWkCE`lbVHFldZerYCC-k38t-wBrf0^8Iha|Hs!arfDjJ+(elIG%eJ;I;&?9pd3G|sN2Ylg53m%Z`x#p!q=M zqkV9Sg|L(_@-Z0@?*#XSRm;bJ4xOkN47isIWB|NED(QXWyTOuz8#i?0EbYT)-Q)~K zlNJkO&Jauek|8OBRB~PG<-^9DyKsoe8`(K~?*ChOP%KVYbcI&tV zT!t-fQQji4%Lnyv^W?4D&CW~0AZ-EYY)2O*!YZ?~v6C$Bn6Y}z(=;(znYYU>D2Iy- zQ3zMerf2-Zntvi8*+gGZ5G{y=hz;*r+_@W$m`bzd zPT4q}xqEfnG;4~Hd1*ysInTKz^2VOR72o}d{D@H{slYpOC!V(CQpJt&Kz~B{Sjp4k zgsMv!fxw2jidI&U*KwkOlBUCkxY)Gp)@f^hvkuA=g8(V;eLke*_;;KQ=enr<%>sw^ z12c8C-qShCUU$H|mIJ7c!|~F+x^`h-s$zf&N=9{9swUjKhxcPU>Xp)_#2V1oVH|8aB$ThlA&d?9_&!t#)GfIf7r(Nag&Xd}L{c}9DqI><44tz`hp{eOPC>-q z0=F%43Gy3#5^kx#4K?Wa`LYZtA71pX{_dxW+%~-Evf9u*?L*8lEBtzyOw4IXDQQ_# zn5ReDH=>~u@*Un{(7-Mviw<9(`KmvgUJyc+&C7|gl=qVxR1FRj>9y`g0Ze&^XTK^h z=C48YmiEn8nfywAG{N#O#K@33*a#UqK`*cMCOBPK7>JU{s*VyzSAa=j$@LY6%T}1aQF_p!U{K^)OdvuKOp7=Wnk5m8f2akEPbVi#PP9D6$h`rs!tx(ANn`aF?OR zJ{Y(6-<+9a*RQmxg56s^L6QmD`|SR-6zeCwVRl-ulX=wKvn-}F`4Mu>V2?>VK)nLfrCRDh!u57*h)`o6VtjMh^nX*TX=`3JdU-iX5~vt z&&wB6)s(_V#fvmdiW`I1uQL6y22Et_YnR+5@rpU3PyT;KfUTszW==#+ppMzDnJT=j z1MHcb%V>wbJ?;SWE*G-!+jzM=r=r19qx5h-{G)yw1l@~6KU$KWA?;S!zYGkKqkB87 zVKt^zzvj`n7SpCz^KwL+an;-FZFQ=GW5!Cr4eB_VyCF(x z1|A~^%T2CuQ6vwc#j0MT2&v6FCI2MZ;A$_eRMWBs4Omw75Inn)=%Gp-pbjoX=+T11 zspgGGyO-1EMMuDtFe1FCWHlZBNF^Yh)S;KN!#475aUtA(3|VAfG59H2U-CobB-M4@+*6C}v_8J?Nt zRdjKfc&9wpWbx9~WVLQGt#Oc#<~b}@bbtUjTH62~(m5Hu5qoh=ag6WUGG-UXJJt!Q z`fn4XS%pL0&S!zmu}OxTUR{N}NF7$j)btgxQx(69UFba$da4*`^12bknffL`8E~wp z{&GD8x__K2Sl_%|sD37W`%u^KT0wK4efkV$u6 znaXbG{T*Z5Z-wqUqM7bqLDwTLtgJ)$7xyP~x1_O=?`?|qi9@x6#9OSrX-7-fMg0ue zTw8;umBbnhqvrO8IYNe;ubb;om>!nMYq9`EtjHW1a7zMoNLHNpB1VoIGSr!`6P%M( zG&EF#QxHr9Bm~5OboFX;NlZ4WE50+E{t7UY5UJ1(wc^q4E6yp?Xi4tD&=K5$f4Ymg zG+JC0FJE)K@t;!5I&Jjz&k?|YgO8XKrbI}MwU2X^T{Dl?w}q=qbY#o~TdPlZYE!j! zos6UQ%GgDk{>)i=L@ij$?26rl?4f!f>^>_xKa@aeURYE5p3SSDCV=3Xtss|YdC6jW z^N(j;)QGR0YX#rhg)~wsrbL4?V>G{GcXFCQl{}$Ge54PQgK~1$j4@-IF=|_>z2~fR z(4g0ru|>Eo(Oe_DY4Bpw&ZSVZgwN*{i8&*GzjeqGL2=+l)$AWmx=7-zr~KIz~T@k+MqX*89JtJN+bV{?N0NB9;95}CN-;~QHLnP$ok zBH*xI=n~H|MEUv<8yNqiDgvPl<-sA&OmC9|*T6&qMCZ+XAWi9e(NXGl6T?2ivKcEa z!p8?~_7|*_^_EplP!d4%g%D2?d09b%&m zH8Pj}$eZ}tA$e8ZR3`ju$Jr!{aH-!}g+|1J-{)AG;e?@cI=k}(>9-(N-Ee2mJhZPQ zENV#_w2$BL61K72ChsZJex__(HD9A-axLHjj}#NsH8DFALpN)=F4)Q%>44nx?o)!J z*Gbm}G=T!rX1%59uFN(YTale3Wn>pX5CY-_GzsAbvR*XFI7`i%cEdX=g@aNGHbESD z6Ds_!nMDrSEw)M%iT6m$t#E$(akQGI%NKn6%V$%i@wu6@VNJ}tSQ_c757DLM@2^v3 zk@6JDZ|OOWFD6I?uPPuTGqg#oy|+)!P*QBBiy~gzm!AvQ+rn*Hf_G~<^lshNvPjj& zlI2~@;P+cnkP!mgtQa~|=H93*hC;|{vYYxMP&;%v$7;}LGT~z$w0`P%M=p%3exl4T zrX?$>#j0WaUlk&r)1O|GV&z`Gw3+GK>j=k(b@FkBOxPCJ^v6vEhTFWfRySIZE9(?uzKFN z5?c#1O)YLZj!sZRB4D04Pd55Rr;ZX*tu{{Cx_Dfz35OKu?O#~-YtKXn7wFF@S7?I0q^3zEBQd#gCn2v!TVc`rE7MWX;! zcYH@QM(CB8dEN@SXs)i5OmgR&!w?f(fgrUE7 zEER7?Eo*loPk+oX{hWzDY*-+~q12zBp0S)c5|qbMxO)o=~GfHski-r+ev5EO!+abgICVbCa?SO2`168oI|{NYzK zL0IW{9QWfYpY)5j%Li7!f-;760{yKXMfjWpS1P|rNE{a__{(`ig$&_5A6}Li94#~u z{PSk^!oqz0Po%$Vyxo6uyn6Gy`ecT0z0Z@7_}^bO_CGNozaw*pdi$`-WL4-)1O)`k zFqJ><*#uqiW*8{Do_^IUCI7WllW zwn67+Y`slib@9r2$6QL;Vx_RKo%8T_;{)#ejQ8tmCMo6^71snTq?;6|h?!FP5ea{7 zTbipH?CD6$0l|NY0(PjivE8!vpN~7e_@g?ak8ga8=w?L3o z8ZD0rrYa>vlH7YPzc9Ga{6N)^5N8T}9VO>JF$8P;2PqAQErZL0{$pjwl_I<%=+YZC zM~$=CM_Dj1GY^CBw|`znL#?3`*s7IOjbF4&7SKT>yV9y56UXvl4)y#}^JXn-*V%bt zNA*^}+8T%FyWT@KVFtxS$%5_a$P!{;4kt8(2IVL&JPl@6&NLAQ2Vs#|QN=%S5ve=oBbn4!&W_fL7gQVl*3AjG!(PTSX zQ26u2AH9B!mgA4m$fw;{{q@{+WU%lp3h5bh`jT(?S6z8Gk&*-qhp|I<&8(6Ocvr*l z$J2$f*MZSrZCJ_!)_@+})^X5M-$iT0{AZ4u?Pclu>N4_XrR2{iSSXFiewQ7;GoibQ zoK3-3DEMM>T7G}*TU^frLytp{ZZ~m-ykMNQJp0-tje66-n7BMJxp_D2%+TSq9A9T2 zMGVmS12)etr$mMEr8bV)bQaqJ4fmk4qgOEK!XvfcgN-pTV`#cSI=%r07zlQF6b3^I zk=>(K8rD(Ms+YV!k@ZPG9Je>2xK6-w>se2$PUy|$r|@f0z+_eW;nd07LaV(`!L z0u2eg@pysPHiSGH<8eMHF3-w0bs~SHQnQ6Pw#MHWyM>}_RUm3AS=MVMmCH+3p@-*? zMF!bv7${lo60HaMJa=7r%jZXE+MFjxmGE&4$gHBdQj`g1tt7b$QY2sIh@hDS2b4N- zdU=sW(Q6A zGQj|$k=GZXvmHHbG6lipy3A4ostY5hq)G^*NCpN*(p4e~&VbmwPnokZpt5x}uk|Uf zqP4wQD~Veus>UI6ZX0B`Wf@B8F=7!y>6>-|ta32RIxsU2_Y)eN_^v{CQX2`v)gC|a zQlVB2R-K$rEsd#Wyy6ZP4IOXX27OacHOZlX1xwxxR?KBD1dp8A{{D`VqxR=VrvOis z11+)dF($G(?;P>|YM*#3R$pv@2@@34pSsf#(o`0DyNo*XAEqT0K6qbtL~I1#{`M6_?tOu%i+AU>5n(8*O>C z@lVI^>bo2|sO1%q>h58NP3{y{y0+mi1nLXW&eu%ATz+_bHcAUk3b>Jx+;Te(|kAsB!~mSH^!o?HSVs4ec+HiE3c_D z)%}O5&{DI0ox&B_%4`J*XbbukVPfjSn5ppAHJ}v75?z^j6c?H`GRhTH<2dOh6qaJC z;xo+0mRh@O%VY}C(MfY;1RhdSd>Ubj_IZTyi z!g}{kf56Ch{|7yR{~-_RqPb04_HG#dJXwlbE-OiUQI0cYXc9DQw~IP>h`H>c2A zqo8GbkuuA0O?xVcWw<0OutIJ{vc;`AP(``?xVBIMLdHSui2D0T<>Ff8W?Ei^!zR9j zb*0+z;hE6;`5aFH*15Hl!Xc0o_Sfu#l25)*HOSEivbB7^IW=}ne;{E~R?AZ+9-bsQ z6ri}XVnHu^?mmhQ(uo7?Qh>B!Q-9Hp)WY^CHZJ%4$o!b4m_Z$t{I{DCM8LE7UBV(Q zFmE0l@Yk4b&ZV&2K_#D)l!G3t`o&`I z1^9j!5>Bblavu@vz|6AnuL7HzPI5w8K438So9Vm+;D$-e2Z~j$1d+Ia?BJ;&6;8Nu zj7ql*pbitEI_T>0zrO+r+}U3zX)TkI#KdiaVi#qa&)D_3k*U%0$&<^9GJ_gkzf=Z7 zNf_JX8ZbHv+Bwgj`#uQb9;sk}3HA2pSC2k~jXW8!WAY9TE?lUqis9!vjr|1D&1bS= zO-jFui6m=-OTsLf1dfDl0OppPo@%|8D-ddhTgxoy%^TjY{LEaBWfvz&nveM;B&Lec z6*OzfuX1ElAl16%&tdh^ChS34UdGk)>9Tq^UIQA(COxHi#>ldF>?Cu4H&JO%YBSr7 z1t?EEpw-qEhKo-BB_*zk(8dC5$yQjK$<6|6mwpqkKts7B-@J94>MkOn15Mxcgf&slP@K|G!An({e>&01m7$yp z1G=j_hixyDGTML=i;XxeUejKQ($Ck4P2#;Vx@~ba%ty<3^>lfi4GNo__Yo1Lx#mFG; zo|MAZRe@F=J@xkJA)7LZH4HKr8$Z<SE80VVSjc)5)F?zYM`)T31 zZtz6d1~UE#Vc%zRcVoZKNE5!&pk?w2qRP%`88WU&)LX>R;BI^K$Ux2J&-4lcronL+ z>_AYGZ(!7~*JRyfha%-g91&f?HlhAA_VlgUC1hr(0!A|PKw=5Q;CXTsum#A};cll{ zcw-WQw&bpz5sh}3ejg0QdhFGviix5!GY$f~s&)&&#mqRaeXXlasg9q?V_fUv+Q!RP z?bP9_5FBUml^uRZzg%(~{V}vdVlBPQ98QU4bJcp4admVpO4mrbJ&s?>Tf-}#31uXs6vD)}|5g7>VGB!(9D?DGEIB^wu$FUyUVaW_F2?Ly)BH1k z%~g1rgpC}>e{ptBZJI^PnoZkgrES~Bm$q%&wr$(CD{b4AwvDQjd-r*szV5!8>kq6M zGh)0W9Vt<0%{F8T*aUqD@AEysI! z2uom1$H8xP)Hj)gP}tn2fy31$CqAH`dA&&BEXayp2TVD!V(`vMjXZG7htT8|_4`%J zL^-|=DNvH!$ZImJ@hcmhQRN3q8f4XC%O$K0k5JVf=; z7y9rXFq7&>AF$EIea&$jc!){iLfH#-fuCcP)FYK>uUi||hxTH;XsvHyyx6Il7OEIr zsTk(8b*QWBW4vMH+tLNQv8n0~?wAyK_Gm}Dl1Q_rm>89Sv|KR05k{><8C=3B){zr| zJJUtAQo7Yv(iN#kL(=_f@t8jliiX@e_hC*_N!G%8N9srrZcowk%F&3U{FwoJjv(=;!f{G3{v+Q4%an1Dh@C(?j zd0+yB0yc-%!7FOOvYeX0spylzZbD+6oXM#$(#}BTSgr|%dv9#Xc+fP%qH*4C@do$q zd+aT)m`ow_m)hDsZDwtihY}MCQ%GnBT~Py(&t>@|RG92Q3)68k-qqr1w0TkRI6g%Q z*a4*hwQZpjm>$Xs>J$5b*o7P}_d9B=PFD))` zgr}Zy*lYsfI6p4zqBvfw%c2h}3@L5WUSftbZe{K5A$b~H79~hTB!li*=dMr6&MUwK zlQS^MbXl7LpcRmBXscwMtd+gISt7qczEeA?Id|t08E|s4Ful|Dz!RrN53gFs4rP6i zTzxHg+0tG%O2WoQE7$}y0YVC!kVh=&rJTCPwfZ>qcEv*Ha@I80c{;_yGi-ZB|0i!Q zroec>^d!gMh0~@K;j*gOVpZQ(=*T$pu&Cb)pKlBsRA=W{VVZJXs%sCE)V+Rej5 zo)vnsaluL!_a*NG8rZ;TS8z&XXHh;Jex3B_KIt&7iAy~%mPfnXPJRRvGF<$Fe+>zm zZNw1vdqqN@V0jt9@frGK9ZxG9(qK_5j|UJKlv@}7q|0)P92NHwno};As#xcqb&;%W zm2ua!@Uh$UHpc!tz*0~88pI*q!6mk4DaSa`&agM^3w@VII_bw(F?})j_yE3lUqkYC zxGMAw-Pbbwo8*>tWqEhCBgpVOn)aw(;)X1DZF@AO5jCsmBfc_d_{@&{T&+BC zo3bDo?I+(At-!X=GG4s@jXP~_2V@Ub0Bpcd{FT|Y*V(H$i8Xzcu$nd4;EG;2lm+*X z07*dAy{a`er|ZKB%{)Zpm?cJPUP4M6*M3fz=q~i< z-#1ZBthFjM@^b*>`;-uHc*c(iB%^C5=fe~a0*^4CyZH)Mbo9UJ&!SJ!Zo=n`I8$0}$NP_`W!em}-gOD=2#Uun^ zqo6Ww{!0!}^~u6oz9y;5v;nhNj;m3A8NcY_3bE%L%+?P=B?5rk2RA{_|BK@_SzVmG zDGS0qrxRZCLRoM~nBP2&3mkNM2U9r&#Ufb-rLZVp{0A)B*-HwHSDo(csicTSm7fY? zG>h@*#dTI~20tAP6_ZE7tE4D8(E`E-qRHH?oBrkR3HoPNCo4Ux`vm)J zWNslmu$4i~V;@b+Njuj&W|b}G{Eb{vK~qI?4PCQWD=X6Xney>H@QGxTvAdn#yRbAo z-c+={P4S1iz2jE?gnC%iPO(?)6MM%v77$DMS4N)SB^W7lq#|Fn$1rLieabWYI}h6r zJF8yefvr<;%E71Hk!Xh5l|Jkdqd|MX4*1g;;tB&q8_I^LA#^|<8Kl2&$@_OQi(&U(6e{8D1hgRm)5H^g}AL{GU6J97+DnkF8cCOT?E45sZCVE1Rv$;I%4P%4bBsyMHPhRsH3wTV zv|1BWOR22{afm zqR>4w>5OkdCrnp#^B^6WUNV>s$llAnAWeoFZYX@H%JeHObZV(igH4`y zx!x?-G(Z2mz7S5veK}4yRjZl}DG>RUox-qS>ZYW{R4{gZf-~|-1{+Jti$nB!|G_C{ zkRSdhaD$dZbVQtjBkpV?$(lRE>$LH1t<{}d&;E}uYgOKVzs;2;zt@!H9UX-VkLn5v za;(mS>$jyvdWWtuO`+w#THZEOSlf4-sd!C-8R4b+2|@g>+@@hZANRR^iygf0h<+j2yhO30zv6{JxxgdFzMd8!wnr;0ZP;y*m5axjdS`^%TfgPshTDCVJZ`Bi5@oPn@KVy zcu@`^zo&*5owj%nY6T4tAXL_{%0m*cdW)XZR7QUURxQ|I#}S90y=suy_U6HNmJ+Ou zgKi0>VUrx6hu};b<5ICfe8+^0kn|Oy^vp#=h@7H_1_Bbtu+rz7reUb9C6q!-mfuN zNLb=JT2E{de{ z895~M3-NwVE>oZzA3Whpgto;caSsH-2vZ0T|2|d(^GtuJk*~5<30eE(zUBEWw^H$) zhnB8)?2o2LzRFt@Cnbu#-0bzC;`OHSV;ur4+mn2@h4C$vtWa9gx&xkvhQPje~pvt_BB=KQPzA@+OoTtR|f<~YTxNX|Wt4f#@tv!d0a=R0aCi-8X znDQi=R^PO%b4K5^bF*`c*W_6W%Vu5Wg!Nk4Dz5j5)~F+zVfD_#wN%HKQ3mdpN=_EC zj*KF+E1mHXuw%CPhNS@4SnHL12&&X-sSC>APS+W9C9Mgo!dkGF|L3q79@v5?oY+hL z8!EZ4QU)s-LiNEb>G;0F#!Qp;Ln%LxRVce@$f=|gY&a&&5Vc=Z!_u%cG!;WlOXK~_ z(DYoDyih$v_QQ}GNWxuWIC=~|Vt2K)H;OPowz?4yD+#~~EWD9x><_k#4*YXxsb{j! z9Z|5pj8AayfR`MFo5$m%29-SDr>EmH2zbxU_H#;%5k@t>LE01oyDJ69nW zcA4OrMFY6$aP&^|x&4rQ!m~7=Pq6^rO07KKRSC*2GVKBdO2|#o6nNAB@gunZC$XRO#X}mZa+SdqOl9*9_Xa#|n~^uTpvkYt71y z-Uebquf&<)tjJ>(g-0B`&=utPk1%Y^5SDlb5G8K#u2SFGmeD#B+cXc0>A!Bo7D~TK zd?W#J4#<02g3}puhd>r_Lv`;aHqAq;y2T3*3;7q9rH`3Zy~m4l5At~`sbcGvC|S3M zu1lhXr~7Rg%d1)?Mt=MLFw_{1?+|)(fV))D1#A;lj|@B(e*Xv!4J{&rc0*MBwOwKToN9@h-TZxc_ z{LsyKAA6}7e+?V4=vZ-K|0sOR7i0lzvfin0s9nm?7E0s>(%#`DY-eP1-4E)yc?7ppmen~twWh=pb^4I%vrfSB}o_|kLEiHz3CjX^KwrM7Y5`zFO zstBiy8tHREk4|=vczd6Qh+uzOx~lRRG^pn#8~H%-lNDSpO~5ee@w922Ze%2qEGH095ItDPvtn3$r1%EKZ%ELc}51Eu!Sl_K-2~K?0vC3Z+rEh(> zH%27E@JMOgeWNgXDHSvpLCUq-j)0`KoR9ier})2Tp@fYvx zU%+uMo^4@P{#1$hR^ANnxlx(R+0x7=%o{1**&Ex@dZXSB)C0`W%Q5Ujlf-m{AYkPTe3+bklyibB6m(P5Y~Po(jeG6U%cpBR|e7yb7chy=kC96%VQ)klcyX_?Xs6x}gC zN1??NS&+={nR%+d^h#QWfno@}Xje)-UMp#W8Lj`Pj_F6br9aT@Bv{1%Y|&P}(3Nf0 z17pD=n0c!a4PT_&*P4~?A1il4=e`h-{SJTJ-JK=;E0MPkHTKha)6iM>?7#J-C_Mc} zp+1ycCmO*(90H<-Pp~eM3Q^n+gKk?0`Jx?6Bd%sABv5hU1P4 zT3^OCwXeIxPMovWq6dTGHYmbgvgIYv1${0DcNV6zEuCO4J8Fi{t_(ue*k%-ae-zv$ z5gaAjJh?*eds_#`Z`qliYguHqMG`l2AHJ}+fhBevnjA~JdoTHFfl;1e)%V`!<`+Vq zO@fWGl)dQ_R z7BEz8p$w)|$OFM>h$r;=@6rZyNPL3VBtwa`aQ_Ve$f<3#UU8b3moA3rGQ@ z3t9muC&_<+U(gI#-{o{1U>3nhcZ%Y?;t|R|IM~w%Sa-|;!}f4oJen!`>BYB+D{pU4 zd%Ze%8YMVt`VwaWn?xpJ-AVkhu;{?q8|>6LlF$x%2nyQIPS2!IfdnRJ)K8h_)I z@KI$HnFseE2Dep_VMTAv6J%WF#%I{VQZ5i>za-Ym1iWc~@uo5!^hPSomU zMfwO1$)nH$F}PAZjRO9CKaLJVja_$fLC8Ft8*s72W>irWI+D5v%LbO4NsVn;R}w<` zC`Uc)a#m=kmTt!H1a{|q2*bhX;2I6ABye-o6(KnsWfA^xPvCVUP$u@?8C zQu}%7&`U{js^!!Cs@iv8f)cBW(E*T?9}sfA8zGA>xl1J>j9JBrgn>{2_{-N71E{B& zo|Xto|58bPDf=)GL4xCZ$(8EB4#1Pw|jY_hQos(&D?l~RhQ%6XPGa_O`vUt=Ulfi==IS7WNjx1+o3A;&| zRDgo!LO=+7G?RKd7(~V73pwarvf#Uw&)qz^=1BF@e^#{G;)d{J#^xA-xmaSO#@nSk zc6{f>`85OoGz2ywG`0lwaSeJ`A9tAtx(p*+yBl&dNVY;mwkqs!S8R*BY*pH0FWMA$ z*sHcaylU#l#9akERNTpMysUtgilb;07jY-U6NXkNaGGsdr7qydJPzRijRp9fr;>F_ z+zXf(QSISSUSr`8n}bF@ftE#Mw1L%u&A4z=6-&4VaH5Fhz`0XcItXWA3J+Sg zhuu(Kb8I8-BVC#sCmY!a?6Z?MU(#wFnNz;r)~wSvRIS(=hNM&WRA}{x&Dt>R6z9cp z=lbfdeX5SJDP4Dxk%QJ(Mf(9>zm6yacKP8Ww;oi~b)#L8L(1n}6TPDngJxd7fhIB-P zT9^D5y`+L69?RP)>R0#G8r=_tuB9|dsf8Qk$-7gt)no4=k<$fit#__&3O$R;Zsc}( zS0W?|;%ss(E3J{yv9cMbR$n@E&h547FS}}-B|^K*&*?)@(-T#8W4&(+;$l@}dl8;m z+*IEI)ceLEqG-SuAdSb9fL4LH*2hpRCo7K5aA+#Gk4UXHb_)@_Tt;nsvee3H)J+!a zw%AtH?6WRsQVgi4jbC#Av`FS$B<>VMnhlx$sxqDcocI$ z9Qz_mi_s|vp4VC5Mj_R*wHG;&u(V_`iD@7}s>wY7 z#q=F))=D8PQq!nUd7gD*#fo^vztNS4`WI@tsi;StTBH~v9Gt(D(yvZcAJGKlNgL%^ z{$&7mo4468t*b_MS9QxNLYht$A+5MJl~P9ltPAE&45Wg}GkK19O)J{HcIJdJ6}Bf zi-lKA_Qkt}4q0NsVnud%DF7ua40YV;YDr5LO>)xxG&bgFbuXwj-|ye61vdzzF?n9{ z!OEgKvSr~=Z9Q3yWxu;B(m3&2mmzK-&`c^dkwq!tHs)>WiWY&m$L~;G{kg#Us%Qx8 z0$6ml;n3virJmSVlH?><3W*%MW92l_0y<0D(wMTVp`;sOwy15Y8)^srC_{TS-SY*- z)myfor`sBH{Jnmp`733c@pi1QMLbYiNb^1tt&G+HHl8V(#~dYd?Aja2&O4o2|LWju zvSIt*z@^xaTdl@et&0E;%EpqV~dzAF7)0i98L5X}f4z5WT4G9a2!e-Bhn=9gH_M5Mnts z0L0ho1l{*!c!IKxn8pc8^hys!o}Ilrha#zc(;tG@XkI|{^?z*2Pam2;AFwzf*sYOy zy$8IRyJ{~mpTa!Wrknu`;ms#AD0^f><*xtmc0OCt%7ojobq!E=T}x4wh*woF*H!%c z6}m>=7E)J?8Z%|Obou(9WeWJjKPVGPBX@h4FOdKiF|7$R_$7s`+<9yQDl?uyo3WoW&>Kg`S9MK=Op4<<_>rqunBaIu*3t9ZNl!-Gfjcv$-)9UfE55h;;l~DtLR|l~1O7xa{?3>44_`RXyAt9KxCxf? zl_`@Pd%C$5u^=2@YxjW)1}hBx@C!wdxt8#JAeg8cO9H8hxAtSj9A~@0(li{?kg<;N z=`c4QgkxY$^=Z07gm0Wi&p$I4^(?)gr@sr9dUx8uK~-$7#mY)&)6G_iX$}N%QMS=3)C-5pT9s~o3X%G_*eSG616>UYv%i5lIQm4MT3*_N&5x3CG#_?Wty5U1$` z-N<^m=tzl*6F^vJ&5+W1vy5@GObeSrAuZp}?ofQYR{=(SnaE_O8~U8x6{C-?^aq4T zJ)-?}Wu>JP;y_E;>E8o)X3z_Wc6*~DQPWB)teTN_q%GNtaq7A~=Fz;gS+BA|FP0L| z@7%fbQKDQC+1W%S?4ov9&e&uwGtsx8r@<-7$ItMc(ts^OWJmN3M3Bzv{{6|2cdJ=6 z0cL;+Dw6h&h3nx%m!o$BA&a`&vYYuBmIkAB8UF3YBvrfp=Gj=pT{xpdjbF>h!i7XN z0YRd1zjOO&AgXChGAgz*oti)@r0QObO#J>REnzf%O5OR1qp{&Gqb73=b$xLM zIX~qB$w=l_gi?1tN@Ko(dA^?n4sV4%0q^-|>`v#97pc*<_GNN$$PPKTV0ZCK*JELc zoJ#-7h$TgT>NyJnhp_wW|I+8uX}i7gs;cmpS%!*#_kecKh-V9*=dk~p^fb@03PDsD zrH)ciBp{7V+4EIq28{L4 zg+IN)Z9C{!#&|~Djmz~mhjR=|UlF#-tAR`ohL(tX^<5-WvMbrtgzkazR(UTZ$Cg3Kth2qt9nQ)QtFT1xBIE9AuSmKt8exO|}3@Nv|U( ziAA1T4zgJh+CJ(ynNfUCMU*gOIc&-=e3Jye1oODRKnnzfc~8Ix1<(PfDT|iO=^bOX z!-;jhyJFt<_a)l4%zgEASxtFdqNt^KBN1a*J7=<&`SMB;_}on{zTXY~E`xU-1unu6NQi!yrFIOi-j&`QO0Nyj-3M@^%EN%F zKD7sS2_rtKY?4-`*%N6F$#oqr|97pc{9uzA=Q5ks37x3fSK5ek;Y|~{O4il0kg}DF zN-i3GC!8TBkSHexe((EEVIOves{?J!v5>4zoKevk-S?p-D#P)&E;89@_oFP2g26A> zrCyb1Re7Wst*TiJVE3gHxY>V7ZbtEqp#-X2! z@Fg`R7Kf95B22#w(WK3uJFrT+r_FPSmQ3g5{ve4}siUj{-XWJlR7j@<=2_l(M}fH| z8vUrq`V0MJi=mv*VC9ZrM0l>nCD$C26!IAm+sAgV+hXy?}=Y|UPC8l%;@jsQ0CF9O-t$Hy!5z$ zY*gqF_tl=LyTE`km#_*as2GQrz)l*+rKM-^Se3qxYgDh6`WQ;phjP4|p!ahC+_zUS z+z^c8KzYMUu6+}jbJeU2vW!*tZ&pUbE7;iy za&Te1s^VJ5&TpPFy}7LfRIzB%hclLPimv-Gpr-~Z`0{%`!p*+0>g=^gSn zNNk^P`u#VEO2p-t0{x=qyu-is1pQNIdA4HL@;cE^wR~$oCMSR`1 z-9F^cz$<)w+g{&VzrqIPTD9D!8qh=?qjy;Xw=~ypNtMsK!j95DOZ)0h%={ndN&FNU zW=vAR+n+}QSmF<~j$Q$H%+R27^U{_p{XB0FFw6>4FK%%P=3|*8AoUBBjt9R%hPH3b zfA?Gm-H7`8slzc*9p&n`+hnF`->RA6$m8CcwgkQZP8%r!&jTF5bh1QqmyorBCcB3 z6KQ8-U0t&FCotk4q=adYXZ%O_*J0Tl@QA;u7`@}9rmC!`)B_Yqv-hp?vi5{erK?dD!xMKg7eRtWRB^fCD4efo^#gST z3rE&sDC&<|_6kzr;~G4i3*m{H7yg7-1J3r)<`L{{pM7W@x41z-k1Z{ZiUU${dc-s< z0!gtY3;=^m1gnKM?jQ^p4VXbb5B~CA=#p;PMC~^tTuMjS^EuVjjp63C0D(@F`2_pT zI9NhgqnLHo#A?;!irwcj{bI(RWi-w}vCPA}`io_gYrrnwvHnupd6+>SV&BWRZfze_ zU3PZFNB6Lfiw{%u*A(?D3QdN<0HqZndj_h8;z(NyS7ix4s86)Lv`7B)jQWbr96byY zzn<(Kn*u6E^tb5++mvqT^|2qrtM1WXD;^OUmf(c9IcXMt8xX5R*zU#aGkRLFXSPBR zIBX7NDrt5huncB8@Zy{JYK@d_6)^ZCP)+a7wJE;x>c6e9i++bF?H{K>M~5Q)OCDMN z58!l@h$9cNmQS+7SN@9c+rt$%KX>=*e$S_cZ9OTY%*bf%Wc)2oN)q$* zDXF}(!4)VN&ORA9>J##lVXtS?zt{hbTOD{*$Bz%y^7+L;-Yu1A5QSVd`xQBd<=%A> zArUFL5l^CdzQ&PT7%bKyV8y+{%O}(b8}cUvtLFLNnk0AhSFCkI?JrT zAQbQdtEDom-jf||%movl#zk%AXU5R4KvbK6AaV!SH>3FCs-o_)aT*m6x&Rj zzc*EmX1#4NqRXsOdR(Jt%lF8>FjYlYRcIWqib7xOw2z0K+B0Q01u^-S(xu|+1?{A( zyjct+H@wvp*wW3RZp)cL*RGV9enRES?Xd!5Ri=(d=QrJf(>NVal3F;0GnO#P8#~LG zHOr_*o%ZQRO}B(k&VJ5WjgK+*ix*$D)u&c79nir55mK9cgI>o2X9l5hZKV!gWZ@HC zndKZi6l6MSCnoJUBs36u0KurwO%)ENd0MUyp>lIrN9W1Yy2=e5{;*r3Gh(i_cc3uL z;SbCRWw>6_fsC}89Cy!h$<{TkFQ8Op zS0y_tV*DknRa5$qbXgVOXLN5K&NSUTMlN7fm6XvCW?mIj@!rUU78*>?i01XDPj6eS zi<%mQ;mTdk_>Delai{~KD*>Y3^!^+i<_sQ%$LD^g(p7$ycWN(BRer69Bb2r{aL;r1 zrr3UG(7+@3t7gc3B;l2b;(h01MUKQMdt3BKwTO+~O3{A?mL8jEELM~J`r<_``aHb) zQ{_GZu^B_&Wm)o8=-QoL|0)0DIK%(ch`o`z=iB`fgg!0}?|g4@=_MabJcD5`^dEya zHEO*RR%^v8bQ6oL(^^0;9A@W-YF(&LI4@;7*2}KBQ*c9HI+4I|d^?5wbjd%fc4SR? zIRWE-ULhqr|AI^Vd^S>oG{ye7sTr+j+|e@Y=Dv*hCMu+=HZNyC``O!>_g=1kj#B}b z-cF9w`r@anT2U_^b&dn8dY1PyZZ2tS9C*@L+t;&8;Y;0YL}_1Vc2cxA7y~rYMA>SF zCq&~$$OKSvb0|V0ky0;^rL8DuG-Dh+RLQ{{Eo18b2u0FZ%kY^A3UI$&vlyNo9 z4a!9C)1ohY3da~IhEe_KP8uQpCG&i#2s_o9$9(4$OOr8VQ|#r9doXciVvM&;RtW-% zoH+6G=38b~Irb#o(zKHP%L1;(5S2im(v&`!#%fPb>2nvTV9UHnR5VcqOBF6ZUUb3g zXt}~xE1#UGlfF=y*zJ98^$IK~jyonUP@SkM>;o5xl{_msq9iu`&HlPf;aN5rmepP} zKXHNX^=b7_nuXq&OA9)M(3tUFosOBT{$QE*&b}@yc8u_9hP}~Bj{5$9Eo<6u@a<2` zVn~|AK2~~jNQFpnX?_rNg!?wz`${G+L@HNFA?4pPtuCthm8rCJuPb9&x<~XG1qPEq zzko9&4;cR?uW^qUtD)#I})CO$$&!M{69-=|U;jje1c z2l8EyJ4zOTTY};)ACR}2&Q%Fvv+QJaIrk*gP1nul*cU7f0TPv)(UIUw6=K{XI%O`b z5CW@)aie2oW8Ok%(31-3#ie(PBYy5t_CM86WrFf^dlay0hq2x$oyhP;T8j&f_l4wh zI;>)YMf|XZK`d8qjbry>a|Wg?dQvE)11W7?*+RNBdLr3 zmJy*8Wzb0l2oF@I+v$|XrgUq67^I5fv6^$mx7AqIr(YlDz1C+3BtK#KiZE4o4P3H3 zv&D7=TfIL)pK`tyvI4J}7DjW_#AHEeF~rw|7fDpBNB&`KS9m(;Shy|l1v&QEEzNBd zIO-s9vO1A|m(J zJnv7=!P=1kJ0P?e9oB{RnB_=;&9D`BEFi2tPY*kcg;xw55JScyI|}675J3AZM!EOG zSoFIk22i>@b8YPe;ExAd?*ENO7s^k}w?_m6xrm6Mx)o?4(oT&}loE^#kc6TH{taft z+(BNHihY2J69gVN-K!52iDNjhuLNFbb-XsOEhz4{@WiSdvg$-;HQ1@K#)OfbPalpQ zL77{GMCv@k{R=y7(QE*#36m*njFYj1(v#?YE(&@zTr!>u<~M9WWC7_C2XjfVh1i+` zR83@y@95~5#;Y#eJlul;adh;Ulk>_B>Kq7`7$pR(B`dx$jvc;$K4X5xIHqaV zQljHz5JV#b%b2l@0ZLN~i1dSGLM+hnI%t_7ASQO{B8yDsEQBW@T5`^eap{BTKqz_S z0K$?9Mq!3^yhMfB8TS=sL@oU&c~LQ5oI(xB!^1g>gCz!F{J{8xKwK=ch=~mcK$8(% zJTw~2JP;ge-GnG|flrXpb1srPcA_UE^31?kQ@3mh#X3}KGaHh6xS zMAo8vxKM)*Fr*SU1gH>h$Zd0rN~b<_vSjtV0vB0-VX+N2^;qzgIgkAdW-GgKMQOEz5Cl*6{pSye1e{+S42hzA4anl5~WHY^D3Njq1^9Jf2X5 z0Et`47hV2ukI=pM=)LTu^JQokT?|x8pu$Em4X?azQ*j8^B#N2jv#=0rZ@TucvLouS zi-y8-O-K4;^DMqxJchRLa+GeB@}5aE20Uuk z-Z06yQ?3-fJ2-V>k7?nSf5!Vm@2guwxlaN_LG;Om^EFD23-O=2@jOyRXXWe6yRfzW zviGD+dFLR|1U+fPW8Jmbm6EqgdR4z<*AGv#G%4hT;61_hf3Me?PdDPZ)1A8Lx5L=f zVo4OH=gpyC*`&T@YA!##u$`O8teP6c7&vr&*N{m}`ABm8Iat&qx2p;Q3u$=7$E8DA z3*VnQN>R_ECt2L~syES_T9}O-aZ?sR_02@1tc|FON_#mp9d2RG#AyCoEk}5wzMwSs zrDm>|{b0wg+SB74s9NFvS4c{F?y=UqG98 zWG^!Y-$Y`?t%;gP(7WzHEr{3MB1W$Z{5-M^Hi+d}zDb(ef0zvhe)*fqg(C z-BvW@VEKsq!8pIfGWQ`d7GU`xk}5LH6;k`jCq*rdFcP``WkQnqwR4;_Ws=2g(Puv- zEPL6Q)I$pHsi%H_=wpew7#3Ch<8U^Pm{jVp32us(nE7=MOoh}zp7gUn!RNWIU>AM4 zJIG620n`2NLHli#nDQ9E5`j<{;RgCo5w~mT1_?E@x<-ADj-~FW_EX+x1DOm zWKw9rvQ0>Ky{1yk>j;ACFY~N}+Gy)-FTb&MCeLn&Kp3Htu$)NGCR31uIB^3)3axTM z9biTy%F*kgCwC`eTld&MZ6C31vjGLd)9h2an+PZ{#S z4B1HUu5xl%&OLQ()MQQP$pcjIKC+5b`nm*QR|wwt;LLI286mWQju-vMr%;#O6GYHC z?qHjGWdZrz&6;Pk&`s*&B0#w&)iHRw?Av>=qIn7)C<{PlZVt*Fo6Y63cAUKB z{F>5sdQUj@u=(-2k`c;JTP2QV%Ph6ekyT4KdD$wI1p7>=VpL(EIOkq^vvx7(g8Fir z?Vb3<1g1GbUX3MK#U8`gkJD&#N9$q9^Z>=OvtqWVecKWz}(p*mSn#FC*RogR48H)+sFQGj*2M zyrPPA0yA;J6D27Pc@HMlSwv@ZZk#PIzcLBel+W(Q0l}oNtOOe!^PGA+9C2tIMm0^A ze^PZ2JDEJbrl6K%KPTVqw~{h)ytTm;rwZZDjG<-H!U|)|L)RTxz~f>UIV@e;S-1fK zwxfjaf3&OHFQP|^=?MJHh53BFW@Iql-fpL4-=>Ln1>CeWTGLG!^n%dCD5bUsmPp}*#E_owx`Th2BbD6KHUt%@JGk`%`Wo2ls z$jozD3yDep(bJn z5VXvkOuwy@G6XLO$Sj?5#msb+${t?{qEMsQ2}IPRhc%r;BVmM4hLX^Ge)#S(0JOTr>8(gewt0xJ}^VVFRqB!Ev5N~ zcSmtK(zbBysJK3?3KoN}Z+lzW&U_511d+|v$BLjz9UtzU^(Ua>kA_fK_%6gn|L#$g4rg`3%M#R&p9E0}4;uJC+0bJ|jMvHT= zZ%J}0#oH|x<368>^K~iy_n3LO?}uM>lLR&}?<^ z$`WLx5kSDRUhG6=nWu5`j|0-xz{)IhhKl^y#by>nLe2e!qRN{F03xwijlo4168mRX zXuBdT)WT4Fosq~W=!pyl^5L&cR=bKMp0wW|pq&DZnqjH{*bcDbj9H))U$lMSjM{!u zMJ{S}ftFzxFO{ewiM~Po)j}0IDF=wd)sK+6Zlzocouw>EOjz#2a!3LnZCVM?e9MU?cmy1YEP@@spW{|wZ)N-Z?_ja{`dwBrQHtDPDiWs zx&^p0iio61LUK_$G-DLuI6Vhm5mmFow$-{tcs7LG#`xuSr(?!!62GB@nJGIISuN*3 z8#}t*k6kx6SxCPo9Kt$vTCPJp)%xX-zjSluOfp&6^$L-+z`7M+9>3UV!rYdCNevd&n7GQI6{V)tRrrM&3y%2yFs;(+ zDrC|qUU5?-3{83oKoli9drh!i_y65#^6UL&GtvLks8KD`!vLEtTrc5Sp+KL&TQxEi zQ6@X;+b%^MLs~7;=_b-}KVtiXK=mtEuMaogm=%M1a?8KHu0+T7Sf}wMEWp~w|wp>`i zT+{J(t|WgB2!p&1Q939m+cr6P67o7FFDS*fysd7eH|=8Q%;sg#A8ts0lZY>4_GK6mi<;OY05?w*$My?D)d^q1QT4ZD`W2@P5xJJ_ZXX!+zE%N{T@+3QW3 z$qI2ZD{i{j{{%4x&iRv9e%p!j903OeMN6UXtlRm|QJEA!uQWaD>Dt!%&|9oe_uss! zLo8U5;47KIc=|4i+B&>!0+sgbM#F|(y9>)kftz}>My}y`5|5GebZO&70D}n{fEk>M z^@BN>Q^xQxl8`mhj?JmMZy@mzZ!k?*w9JRttZm|cX7lu5XQ%Flcly27o1|;|Wm7WU zO;s1)Y}RZ->in~nGj%ATm~aTqeF){K1#k>;@00C)vQI{G?A6`FUXtLOUIAAUsjQXw z$dho#ff!O6t@7FCX;%vtHPD{&rNnfzkSXwyEswCPi{oX@{RH!=Bh(@c(XQ;gz15zVZEEWtmkXS&+PHM1q5Ma|9P1e_?-;b5 z(T{#ZdUnUc!#5~3~ zkRvcf60pKrP-|=ukA6AjKWSZ5TK3u{DD6t8mW-H8Xd#DP9Dr*AxqN(H7O{2X0BXEj zPh@j_Rg=0>EssyIt-ARMx&rt)n2u7C9a)TQ7FS6K(Q37QD1RQr&s#q9hMCgRdR=pO zM$N0wvo$tkRe43YwHC&0&UK3ZM$dC;7gjAm%}a~|B*E1nNc9Ti+z6s1ly9uPTVMK@ zl^Kw^^fYo;*Xy(2`+8K~`;#(nYOZ#u#dC^TTNxv&R-1|b`r$251hEEjQli*GplE)Z zM2X}g!i>u-lD0Vrt+jhsP4H5eN}r*sgoEcNo#j6UCP?Zpr?5b4!drW-iaC1JYhZV$ zCgw+d^)G1AatVAvi)R1lA82_co#y^q>=(4y=>DpBU$wakF4R>frmi+sA9k~3=}PHk zcr5z8eNEooKpaT`X>nebqw*FEBQ^jG1@pa^htpl_&leF2$0)ugx*rmnlq540;{Zmc z`Yw23*WLp!z|rZY(6F=V*Rl6ie@M4&Mr_($MlkeyVMlUcwKZZ*#HrL;Scsb{E`!YiaUbVf7q8%EPHS5i(8?2TY9us>(iHrYSx zUR{}le>j|nXnYgzCXk-fzz_~&qTvp1R1DPIi3+bO&~U|Tb?qK!$)dh2H&71@>aepPo(0S)($Ba8?)`nI7)Dr literal 34818 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 diff --git a/build/openrpc/gateway.json.gz b/build/openrpc/gateway.json.gz index fe52522fdc80bd103c059f6980f4e7d8ed94f483..12b5766113c3f667b65901d12928c7a61e3339fa 100644 GIT binary patch delta 23 fcmaDH^EhTgD|5~2F~Wx*Qd$Va3_KObh^q-wDeA diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index 30e2c6dd12d3702fda55db9a6b717d193e22ec9e..d73a9c61cb447321ac44346d0696ce184b755ea0 100644 GIT binary patch delta 23 fcmexV|EYdL8}l~13mZEV?KxCl{XP5Go|ypvnM@0x delta 23 fcmexV|EYdL8#CLk>l-^0?K!@)3p+oyXJ!BZjwcE3 diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index de03ea05b48c1679f61c5fb24731eb2a005bc3f8..02bfa68d558449f573d7292b434eea6ed2313661 100644 GIT binary patch delta 5894 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 cvpni4)j)^K{1kLN$< z-tT_*ZSVcI<6*5`#973d7y@DU!_9c@#+~i^37`tgqmksOx{onXl-3fR}H-$(+S$c52x1K;d|~texyRr z1Rt^RIPVZ-j}(%6K>@}nvrX1!p0LOSHq3ry!-dsqWIxK(-`pCN{tziF${^3|SEU2a zW8y3T&HYKbQ#WacOfjJ3PAr!ahRX~cDz!MkOvE_}B*%@(f^>orFu?Cw6qv{IG-{ra zf8v{J8Z)bR4oS8F9(7!3i@S*{iBqWDPGak=Bvu)BNCDCE4`^EgnebRAz(md5oYF&E z+*j@AtB_lmoc*|B^L^P{mAad z^f>EP26x@}o?0ap4`(XeszgruA{+X4=ev)1$;kGRQWBvF@V*ROo^GopA33+n7lolt z6N9e%WaJ?4*M8{o)RX-fri@k>0-c0kLBke{ky)Na>RB2gYZ!%Zx7SZu1n@Uh3p&}; z;@axJw|&&=NFIUtLM@k8SSKun)MJ<4)c)>WLiPaQ&5>_kLC4rLj`zt5h}icNG{>(D zT~i-o>3Xvwxq)=$!dT`J-p+ZNqqReoVJT`+B?d;!=#+hnDnA!JR7I>mlm1+PW!6zM zMd}n1zR&e6bnlF^T*bJ#*FtTaX51yPPU3!$tf%t^aro# zmgBRh_@9rn?4O(5mg9aM|NYtH?u*-VmPkBI%U!2$Bs%+HxoorN;yc88WtaBFrxlMW zweV^2h%`@(&>8ul<%OcTQZ|^juZSt#MS~@>GKQ;cQ%+6cL)(>B_0|;^t@6mtHBU$M z$Ko@lw)i@dD@5;3YJ}oPFb4;Gpk|N_ez_vxEExG7tEKZy>*(vfv+7iwxYpW>nT07i zoRHxCSn@$Z!W+T%i&zMO`^xNei+gL?oNnR0#3}8c0^P63a`rqM@2_9ENEx1%$Wu4b zed%g;Urw9OzyQ7DYpI&~$VJ~dVSplC=*<1*KI=zR$ibL-iaxM<2fZz(Q(2fwft55Q zG1Hu%t3Nz7q*FF&nMrbAn>Hg8I<1K?)4m7tx*BOF6})$!bk&3O#N%CUZwZ@SY&!dZ zwwZX%9!bZ$_=DVJ>E61AA@VD>o0`TDa9SNIj~)B^I8!yKK`h`^Mi@5wzqbeO_e7j(Z2T(h_-8_4Ds0pt;yIp-w4jWxvaF^75 zmK>d#3`8A+iVO*UbAXA2L`G_1=w<6HIpxtGCPVT74E^QukVFGp^+4B6kh>2E!qT`8 z*n22GSslJP@Toa@AtqG9SEN{xI9(^*Z}vSL%4pQ|^q#D*9Q$`4u{g!cO~lL|ah{&E z>9HV3euqOtQKifKyN0d-d2|#j62_6-1>iw=X(N#N1R@R(b$&%@V&y}Tku_&Q0-`Vl z=#lhF2C|z}85{)i_ATE}7jiVhEs*eT>BL|10jMfsnAvN~-Ae*HaK`k}h=B(u>4iY1&+aikx*ScfR^OL8YU+{xU((g^N?TgXV{K)%LL(ub2DoUg`rp!UfUd#}y3lFsL8!5vjO;yf~Y;q&g;Y};ueV#x~TZHRL z@)6mPAok%iWdn%IMi08aconq%CV0{6O(o_|4pd~lnOj@n0t+F%V%$3!<7%K4h z=(@0_tpQVpZJa>}oyW;UdQR42T05|_M1?^HQoY=3G)L17Kgy96pZJ6%73HMASV7*9 zoRp(cNHR63-H?{kXyw+vfW$$iPRqHk{CCiL%Y62)Oq7xN0pInLvWy*38#hAqsVCG_w?Mg)z%f2K?dZShOL8 z%;fTa^+D;I=Db9m|Dk5@d%Mvcfvc8@lGvKG>oGSUq<|UyNwV}n2rp}ek=1FO;OWY_ z(@XumnGcDe)v*YQD3=D+7oC~IZ`2PAkmL5bL%{=zRdT%Jn>=7w4`W?-;wdyNBe*LJ z@AiIXC(c7-R7a})-MZ(8Rl}(V+7+TgBfcz^uFn{r3`=QFP3Xt%pLa7|7lCqFoa%#E zwx->`?Kcr7hA6B|%v9u9(PtB6Sw8$ocvTvHBNh+uk&IkO$^V{|SGHAVmxp~IfP6F% z4%3iXf@SHosHF+dzxW^-c=jTQmcZZ}A};|ts$No|Qz;u5j7ZI7zmxDWc=_Uvwz?3- zH@xKZl@5~5;Aa08$~muufTQYoRq$<Aw z!CAfylv`ts^fJ@`^xzIbTu1o;G4PAOC?ZW02B(4*`f-+m!5z8AorKy!)arpTK0;TK zWE#;JAx!%kLBH8GQmL)J>ePLonr7W)S<8D0+us4I{H*F;hDz%+-~tE8?$enX^%SDyZBQ2R68 zT>j;JwoU1a}6U!ND(bYBRT`(8h%{IZ81#T9s?#^JJG|5Hg>KPNb6BA8eoCKcnZ zIx!V4ErNbozc~(t-L^%~IBrnq*9U-}(2K5E4$XaFwsj6wdXU2u-^+!$QdUXMP=B1A zghVVGCYetRl^oajF)e5_XbXiZ)}61}b@F=`D6WO)^7-TZznxkgndF6A%)%E`eS7$; z&!(IsX-w_5$^qq}rR0UrPSp*}>7uqy zvK1EUAJ}YA&Erj$2CKx{ScUJDGjtf3I!4dGZALP@gVe|{q!%@E4`UW~( zyN?3Z5d4oju0mk?98Og62#X7%M7`RY>*#?}9$8LQfAY1&Og0;u#SOd#n^Im!j|RnE zTd#M`$5dML9)8<*m;}s?ezK%hyMOF)a43)0zV%7R-8P}Qc~~ta)7Z~%cBIZ!ZxWVXK4F$-^7E*;;JUs&XhZ*qJS>4(6`68V}tmPcZtHY6=>I&JWg3R=M-hs@rn9m{?Pfx6$ zDMWDu`r?ni!IN-N zmK>B5I}ThSv;IYMIDWdLi$`-gPQ8iNr*^DUBbg*uToo zRgU-HcW!Bk@9+8{;@qY%D~r@!ALG}0pn2kawo1mBlXWAJ7xDXVV!|FqUpv}!a{ZsX z_2mu4ZFN3ix7s}IVN&HAh&;k?ryPEX-knh4O8#Pu6o895Qg}_2^~;s)=*4)g4B3zU z=DX&_Lsvg|ZFw8P;_|&t^))=z=Mr6XIT2*3Dmfuc$1ONjAA(B_sLA;?ja`@-mKu12 zDzT|AssSHQecrAap12Vks_s2tyOU68Sm#)|W2GjdhX0S}K>m;Dz_S0>b3&xZ@Ai6Y zPJl_gy1#MO2CwvS0yz7xkW1`62{T;}X<-Vt_|5Gh8v^6v3^n+gRK;4_K^?u8&OAn} zr{8^6E^p+^!2E?;OD=J*G4QoVd}Y_g8*|9C;?VZVujGst>dy69T$?9cEG$8>WXOjQ z08KSVGJ)HP2XE}Ae}n1Lxs>Ft4E|fPiAMLsH!Ce4h(E`A*Jx5VYe>4kdGRzn9p9Ju zmC*>B{0KZ2uPWy75sd*IViWBy&|letp6vQKa(mkvehH8h_cyrqY)g(tk|0fDta9ff})XR%lwwBfBM{ITqK&_rt`1K0w_T)#atAD zFz+T`--wDI-QXs-?k?k&^ydqH{Ybc2Cmg~QUIHJ_jr#tx5TS&+M8~ula6^z*u((g{)PsNF3E6=4V^1z*??K@5 z>{ri3nbkVYuO3Of12^`VaV-vkC$4{3i$FLqf3vraKvWr&TkR~mk%0URlfVMekz37y zo~UgsUXgOx!N1y(Ei+Aq7`_v^k*t}F^D|BA76+WD^K=PyQ0YKRI z`Ey{-p0lB4S5Qh;eGpsBIt`qpdbZLXPPT#Lvae2RU{VV}e+=ULN+FLYbj4;D?1}5T z_#Gu%SAd%Kq#K*kGW+qUCSgRxuF}_ZQUmw@Ve6dDlm?(6DondMf-#7G*3*y4x@-vP6vl%n$L-~)VBvdb;8 zA6?&Lb8RI5!2%jBtU5j3JhwiSlayDB9iPbFY<&q#L%Oa6>PmBBR>M4v1*wH$S|loy zJt|UN^QDDCq9kDOioCO01tH{-K*MXc_sk)!X$kmZ;i_a?tb6!6aL@Tu{WSro%Bt~5 z|AVqW=XqL3SiEN9GrpM8sQYXgb^JvRNN1Iq7d8#Gu?Hz4DiaKwU2+%adaNw=5q*_q zutn+0`7?zP*6=6Ha6MihL*g137Zk?A1@$B6ZI0S1eNuP)mYjp>4{1KsiV9*tOMi2_ z#wE5(8nLGs`+aJcFx8!qU6cPHeD{qQ?GEkGYepgTg5@vILeWVB7T029XK#S zON0NEZP{4`ySOqjZ!3MtG`$mIbvkY!-!O8OfJ-f2pOV$CbA1P^T*#Su&PfpHcw(7c zvdwRf_RY&)Q=jC9L2kZ~6TIq|R&Lap0y(~~Vw&Uw?N8geOv(nkVvKcIIf+w%5TF{yuZF&B~rf8UpflvT31WeJ&bUrGus7tID-Ck(|jf+{idL1*n`o zzthMb!e;+S*_e~cP&R6kN#^C_uh1tWX{Q^Sd5co^06x zY#l%J)AWA9xM$ox5d^PJoYD@+j7`qU0b66Eb}t$WT^wv8EBpB4^jFSSP0j zrwc95$IZSc;)|YM2OJVWB`LHS()A?zEfM!&$|mGtoQa;l{==Z-fJD%-TjgeWtKvui zW0JshW43lLgadb$DY{ z3$MS-A)#}b3uGSr9_2SaNOTZNXE?lRZc*{uB=aBq094GfCsnX6uobTmn zvC+2HulXxrU(&2FSQlfBTyV#>L@m;9)I|Q!BVJ2Gl$*2Y8*l`Yl}~!N&qNxmc$Fj* ziA06oKRVr;rGEdeq9XQWp*K0&?~Y(JX!Y|^vFBMVmY?^)nJJ~v+sbXK@ph~Kri-C& zaop!{?$Si9QvSfuPfQ5B4JG5*ks#(OPS&p~pS_GWXaN1$=Hsti;&|!)I{sr*)F}M# zt6#lZ5R?d?J}u2SXv$@Rqkeb97qFfgrO=0_;re^@HrFJ`Z@m(c2RG2L{SJ>Tbdu7R zn1OxPpn2fWYBUpjK5zftxr_D;-#h>O4O9>I9<^Dp9TmIb@vXd(^w<6Z^6sB(?tC+m zn0BU9l9zbp1C8q2m#d{;sE#znnkdw#eWaafAmH;DJCQHCYV53+muGL@B7|np^k3$< z7=LeI)W&W^72_~HoyklonV(qKxQ@$m*tTWH#VaN+2Y@@5OTEs@OTLuYqz7}wQiKP$ z((E%nADWi2mn?`(Bi9u*;C8xnSD^QExwPEa%*J|vTEB%_yt4k4pKhVxl+~jM_ht4n zgw$|9#b?_}{hkd~IC_3t->Osl(wwZYj0=Dr9A(;UqK=!oS=W|s!C3lRwsy8bTcfkz zJd3~@wF5b+fPTSz=>D4?<7^SH%7-jz+>YwsDsuAo4}YNf`*h~3RZ0@RO)_JN1{6^mgk_@GXHl~iD%YbH7Q|Aee-{nlWM-uPv<*8J z&}yii((HqdUZk)8Tmg~ouOw-yg&k(lvphxFT~|%?Rg`>$9Uv6fbah1BfNaZ Date: Tue, 5 Dec 2023 15:11:25 +0100 Subject: [PATCH 02/38] Update changelog Update changelog --- CHANGELOG.md | 36 +++++++++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7045a3f7d..0419d2e5d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,25 +14,47 @@ There are no upgrade warnings as of this first release candidate. ## ⭐️ Highlights ⭐️ -**Lotus-Provider** -The feature release ships the new Lotus-Provider binary, together with its initial features - High Availability of WindowPoSt and WinningPoSt. +### Lotus-Provider +The feature release ships the alpha release of the new Lotus-Provider binary, together with its initial features - High Availability of WindowPoSt and WinningPoSt. -Over the next couple of days, we will sanity check some feature and build up a larger cataloge of documentation. Once out, they will be linked here. +Over the next couple of days, we will sanity check some features and build up a catalogue of documentation for how you can test out `Lotus-Provider`. Once out, they will be linked in this section here, and sent as an update in the relevant Slack channels. -**SupraSeal PC2** +So what is so exciting about Lotus-Provider: -In this release candidate we have verified SupraSeal PC2 to function properly with Committed Capacity (CC) sectors non-Synthetic, and SyntheticPoReps that is coming with the nv21-version. +**High Availability** +- You can run as many instances as you want. +- You can connect them to as many clustered Yugabyte instances as you want to. This allows for an NxN configuration where all instances can communicate with all others. +- You have the option to connect different instances to different chain daemons. -However, we have experienced errors when using it with deal sectors. As a result, we advise against using SupraSeal PC2 called through the `lotus-worker` for now with deal sectors in the sealing pipeline, except in testing environments. We will update this guidline in later release candidates, once we have a fix for deal sectors. +**Simplicity** +- Once the configuration is in the database, setting up a new machine with Lotus-Provider is straightforward. Simply start the binary with the correct flags to find Yugabyte and specify which configuration layers it should use. -[Refer to the documentation to learn how to use SupraSeal PC2](https://lotus.filecoin.io/tutorials/lotus-miner/supra-seal-pc2/) with your `lotus-worker`, as well as how to perform benchmarks using this feature. +**Durability** +- Feel free to update one of your Lotus-Provider machines. The system is designed to handle updates and maintain performance and reliability. + +### External PC2-binaries + +In this release candidate, storage providers have the ability to call external PC2-binaries during the sealing process. Sealing is a critical part of preparing data for storage in Filecoin, and the PC2 phase is a part of this process. + +This feature allows storage providers to leverage the SupraSeal PC2 binary, which has been shown to improve sealing speed in the PC2-phase. For instance, our current benchmarks show that an A5000 card was able to complete PC2 in approximately 2.5 minutes. + +We have verified that SupraSeal PC2 functions properly with Committed Capacity (CC) sectors that are non-Synthetic, and with SyntheticPoReps that will be introduced in the upcoming nv21-version. + +However, we have encountered errors when using SupraSeal PC2 with deal sectors. As a result, we advise against using SupraSeal PC2 through the `lotus-worker` with deal sectors in the sealing pipeline, except in testing environments. We plan to update this guideline in future release candidates, once we have a fix for deal sectors. + +For more information on how to use SupraSeal PC2 with your `lotus-worker`, as well as how to perform benchmarks using this feature, please [refer to the documentation](https://lotus.filecoin.io/tutorials/lotus-miner/supra-seal-pc2/). ## New features - feat: sturdypost work branch ([filecoin-project/lotus#11405](https://github.com/filecoin-project/lotus/pull/11405)) + - Adds the `Lotus-Provider` binary, and the HarmonyDB framework. - feat: worker: Support delegating precommit2 to external binary ([filecoin-project/lotus#11185](https://github.com/filecoin-project/lotus/pull/11185)) + - Allows for delegating PreCommit2 to an exteranl binary. - feat: build: Add SupraSeal-PC2 binary script ([filecoin-project/lotus#11430](https://github.com/filecoin-project/lotus/pull/11430)) + - Adds a script for building the SupraSeal-PC2 binary easily. - Feat: daemon: Auto remove existing chain if importing chain file or snapshot ([filecoin-project/lotus#11277](https://github.com/filecoin-project/lotus/pull/11277)) + - Auto removes the existing chain when importing a snapshot. - feat: mpool/wdpost: Maximize feecap config ([filecoin-project/lotus#9746](https://github.com/filecoin-project/lotus/pull/9746)) + - Adds a Maximixe FeeCap Config - feat: Add lotus-bench cli option to stress test any binary ([filecoin-project/lotus#11270](https://github.com/filecoin-project/lotus/pull/11270)) - feat: chain import: don't walk to genesis - 2-3x faster snapshot import (#11446) ([filecoin-project/lotus#11446](https://github.com/filecoin-project/lotus/pull/11446)) - feat: metric: export Mpool message count ([filecoin-project/lotus#11361](https://github.com/filecoin-project/lotus/pull/11361)) From ed2890c837d0e9c61087277ffac77a0106113ab9 Mon Sep 17 00:00:00 2001 From: Phi Date: Tue, 5 Dec 2023 15:52:26 +0100 Subject: [PATCH 03/38] Add sub-bullets to new features Add sub-bullets to new features --- CHANGELOG.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0419d2e5d..cc27d9a5e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -53,14 +53,17 @@ For more information on how to use SupraSeal PC2 with your `lotus-worker`, as we - Adds a script for building the SupraSeal-PC2 binary easily. - Feat: daemon: Auto remove existing chain if importing chain file or snapshot ([filecoin-project/lotus#11277](https://github.com/filecoin-project/lotus/pull/11277)) - Auto removes the existing chain when importing a snapshot. +- feat: Add ETA to lotus sync wait (#11211) ([filecoin-project/lotus#11211](https://github.com/filecoin-project/lotus/pull/11211)) + - Adds a ETA indicator to `lotus sync wait`, so you can get an estimate for how long until sync is completed. - feat: mpool/wdpost: Maximize feecap config ([filecoin-project/lotus#9746](https://github.com/filecoin-project/lotus/pull/9746)) - Adds a Maximixe FeeCap Config - feat: Add lotus-bench cli option to stress test any binary ([filecoin-project/lotus#11270](https://github.com/filecoin-project/lotus/pull/11270)) + - Enables the `Lotus-Bench` to run any binary and analyze their latency and histogram distribution, track most common errors, perform stress testing under different concurrency levels and see how it works under different QPS. - feat: chain import: don't walk to genesis - 2-3x faster snapshot import (#11446) ([filecoin-project/lotus#11446](https://github.com/filecoin-project/lotus/pull/11446)) + - Improves Snapshot import speed, by not walking back to genesis on import. - feat: metric: export Mpool message count ([filecoin-project/lotus#11361](https://github.com/filecoin-project/lotus/pull/11361)) + - Adds the mpool count as a prometheus metric. - feat: bench: flag to output GenerateWinningPoStWithVanilla params ([filecoin-project/lotus#11460](https://github.com/filecoin-project/lotus/pull/11460)) -- feat: Add ETA to lotus sync wait (#11211) ([filecoin-project/lotus#11211](https://github.com/filecoin-project/lotus/pull/11211)) - ## Improvements - feat: bootstrap: add glif bootstrap node on calibration ([filecoin-project/lotus#11175](https://github.com/filecoin-project/lotus/pull/11175)) From 2d7ba43777436bd7640014c2782e31da4dabf66d Mon Sep 17 00:00:00 2001 From: "Andrew Jackson (Ajax)" Date: Tue, 5 Dec 2023 10:34:17 -0600 Subject: [PATCH 04/38] fix sender --- provider/lpmessage/sender.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/provider/lpmessage/sender.go b/provider/lpmessage/sender.go index 8d6cd4027..cb43b7401 100644 --- a/provider/lpmessage/sender.go +++ b/provider/lpmessage/sender.go @@ -76,7 +76,7 @@ func (s *SendTask) Do(taskID harmonytask.TaskID, stillOwned func() bool) (done b SignedData []byte `db:"signed_data"` } - err = s.db.QueryRow(ctx, `select from_key, nonce, to_addr, unsigned_data, unsigned_cid from message_sends where id = $1`, taskID).Scan(&dbMsg) + err = s.db.QueryRow(ctx, `select from_key, nonce, to_addr, unsigned_data, unsigned_cid from message_sends where send_task_id = $1`, taskID).Scan(&dbMsg) if err != nil { return false, xerrors.Errorf("getting message from db: %w", err) } From 2bf5a57dbdc11a1a416f777f878d87d252c94417 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 5 Dec 2023 17:51:42 +0100 Subject: [PATCH 05/38] fix: lotus-provider: Fix winning PoSt --- provider/lpwinning/winning_task.go | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/provider/lpwinning/winning_task.go b/provider/lpwinning/winning_task.go index f02ffa1ae..907b594fd 100644 --- a/provider/lpwinning/winning_task.go +++ b/provider/lpwinning/winning_task.go @@ -4,10 +4,8 @@ import ( "bytes" "context" "crypto/rand" - "database/sql" "encoding/binary" "encoding/json" - "errors" "time" "github.com/ipfs/go-cid" @@ -579,12 +577,13 @@ func (t *WinPostTask) mineBasic(ctx context.Context) { taskFn(func(id harmonytask.TaskID, tx *harmonydb.Tx) (shouldCommit bool, seriousError error) { // First we check if the mining base includes blocks we may have mined previously to avoid getting slashed // select mining_tasks where epoch==base_epoch if win=true to maybe get base block cid which has to be included in our tipset - var baseBlockCid string - err := tx.QueryRow(`SELECT mined_cid FROM mining_tasks WHERE epoch = $1 AND sp_id = $2 AND won = true`, baseEpoch, spID).Scan(&baseBlockCid) - if err != nil && !errors.Is(err, sql.ErrNoRows) { + var baseBlockCids []string + err := tx.Select(&baseBlockCids, `SELECT mined_cid FROM mining_tasks WHERE epoch = $1 AND sp_id = $2 AND won = true`, baseEpoch, spID) + if err != nil { return false, xerrors.Errorf("querying mining_tasks: %w", err) } - if baseBlockCid != "" { + if len(baseBlockCids) >= 1 { + baseBlockCid := baseBlockCids[0] c, err := cid.Parse(baseBlockCid) if err != nil { return false, xerrors.Errorf("parsing mined_cid: %w", err) From a95f3d685d9162808ceeef40e4f46416d1a16d98 Mon Sep 17 00:00:00 2001 From: Phi Date: Tue, 5 Dec 2023 19:42:24 +0100 Subject: [PATCH 06/38] Fix changelog Fix changelog --- CHANGELOG.md | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cc27d9a5e..6b28f549f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,28 +17,26 @@ There are no upgrade warnings as of this first release candidate. ### Lotus-Provider The feature release ships the alpha release of the new Lotus-Provider binary, together with its initial features - High Availability of WindowPoSt and WinningPoSt. -Over the next couple of days, we will sanity check some features and build up a catalogue of documentation for how you can test out `Lotus-Provider`. Once out, they will be linked in this section here, and sent as an update in the relevant Slack channels. +Over the next couple of days, we will build up a catalogue of documentation for how you can test out `Lotus-Provider`. Once out, they will be linked in this section here, and sent as an update in the relevant Slack channels. If you are interested in testing out Lotus-Provider in your setup on the Calibration network feel free to reach out to us in the `#fil-lotus-dev` channel. So what is so exciting about Lotus-Provider: **High Availability** -- You can run as many instances as you want. +- You can run as many `Lotus-Provider` instances as you want for both WindowPoSt and WinningPOSt. - You can connect them to as many clustered Yugabyte instances as you want to. This allows for an NxN configuration where all instances can communicate with all others. - You have the option to connect different instances to different chain daemons. **Simplicity** -- Once the configuration is in the database, setting up a new machine with Lotus-Provider is straightforward. Simply start the binary with the correct flags to find Yugabyte and specify which configuration layers it should use. +- Once the configuration is in the database, setting up a new machine with Lotus-Provider is straightforward. Simply start the binary with the correct flags to find YugabyteDB and specify which configuration layers it should use. **Durability** -- Feel free to update one of your Lotus-Provider machines. The system is designed to handle updates and maintain performance and reliability. +- `Lotus-Provider` is designed with robustness in mind. Updates to the system are handled seamlessly, ensuring that performance and stability are maintained when taking down machines in your cluster for updates. ### External PC2-binaries -In this release candidate, storage providers have the ability to call external PC2-binaries during the sealing process. Sealing is a critical part of preparing data for storage in Filecoin, and the PC2 phase is a part of this process. +In this release candidate, storage providers have the ability to call external PC2-binaries during the sealing process. This allows storage providers to leverage the SupraSeal PC2 binary, which has been shown to improve sealing speed in the PC2-phase. For instance, our current benchmarks show that an NVIDIA RTX A5000 card was able to complete PC2 in approximately 2.5 minutes. -This feature allows storage providers to leverage the SupraSeal PC2 binary, which has been shown to improve sealing speed in the PC2-phase. For instance, our current benchmarks show that an A5000 card was able to complete PC2 in approximately 2.5 minutes. - -We have verified that SupraSeal PC2 functions properly with Committed Capacity (CC) sectors that are non-Synthetic, and with SyntheticPoReps that will be introduced in the upcoming nv21-version. +We have verified that SupraSeal PC2 functions properly with Committed Capacity (CC) sectors that are non-Synthetic, and with SyntheticPoReps that is introduced in the upcoming nv21-version. However, we have encountered errors when using SupraSeal PC2 with deal sectors. As a result, we advise against using SupraSeal PC2 through the `lotus-worker` with deal sectors in the sealing pipeline, except in testing environments. We plan to update this guideline in future release candidates, once we have a fix for deal sectors. From 4ba2cc21f6fe85a400dcfa48e8eeb1ac08ce34a7 Mon Sep 17 00:00:00 2001 From: "Andrew Jackson (Ajax)" Date: Tue, 5 Dec 2023 13:45:08 -0600 Subject: [PATCH 07/38] fix: sql Scan cannot write to an object --- provider/lpmessage/sender.go | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/provider/lpmessage/sender.go b/provider/lpmessage/sender.go index cb43b7401..bee22ff69 100644 --- a/provider/lpmessage/sender.go +++ b/provider/lpmessage/sender.go @@ -76,7 +76,11 @@ func (s *SendTask) Do(taskID harmonytask.TaskID, stillOwned func() bool) (done b SignedData []byte `db:"signed_data"` } - err = s.db.QueryRow(ctx, `select from_key, nonce, to_addr, unsigned_data, unsigned_cid from message_sends where send_task_id = $1`, taskID).Scan(&dbMsg) + err = s.db.QueryRow(ctx, ` + SELECT from_key, nonce, to_addr, unsigned_data, unsigned_cid + FROM message_sends + WHERE send_task_id = $1`, taskID).Scan( + &dbMsg.FromKey, &dbMsg.Nonce, &dbMsg.ToAddr, &dbMsg.UnsignedData, &dbMsg.UnsignedCid) if err != nil { return false, xerrors.Errorf("getting message from db: %w", err) } @@ -96,8 +100,11 @@ func (s *SendTask) Do(taskID harmonytask.TaskID, stillOwned func() bool) (done b } // try to acquire lock - cn, err := s.db.Exec(ctx, `INSERT INTO message_send_locks (from_key, task_id, claimed_at) VALUES ($1, $2, CURRENT_TIMESTAMP) - ON CONFLICT (from_key) DO UPDATE SET task_id = EXCLUDED.task_id, claimed_at = CURRENT_TIMESTAMP WHERE message_send_locks.task_id = $2;`, dbMsg.FromKey, taskID) + cn, err := s.db.Exec(ctx, ` + INSERT INTO message_send_locks (from_key, task_id, claimed_at) + VALUES ($1, $2, CURRENT_TIMESTAMP) ON CONFLICT (from_key) DO UPDATE + SET task_id = EXCLUDED.task_id, claimed_at = CURRENT_TIMESTAMP + WHERE message_send_locks.task_id = $2;`, dbMsg.FromKey, taskID) if err != nil { return false, xerrors.Errorf("acquiring send lock: %w", err) } @@ -114,7 +121,8 @@ func (s *SendTask) Do(taskID harmonytask.TaskID, stillOwned func() bool) (done b // defer release db send lock defer func() { - _, err2 := s.db.Exec(ctx, `delete from message_send_locks where from_key = $1 and task_id = $2`, dbMsg.FromKey, taskID) + _, err2 := s.db.Exec(ctx, ` + DELETE from message_send_locks WHERE from_key = $1 AND task_id = $2`, dbMsg.FromKey, taskID) if err2 != nil { log.Errorw("releasing send lock", "task_id", taskID, "from", dbMsg.FromKey, "error", err2) @@ -135,7 +143,8 @@ func (s *SendTask) Do(taskID harmonytask.TaskID, stillOwned func() bool) (done b // get nonce from db var dbNonce *uint64 - r := s.db.QueryRow(ctx, `select max(nonce) from message_sends where from_key = $1 and send_success = true`, msg.From.String()) + r := s.db.QueryRow(ctx, ` + SELECT MAX(nonce) FROM message_sends WHERE from_key = $1 AND send_success = true`, msg.From.String()) if err := r.Scan(&dbNonce); err != nil { return false, xerrors.Errorf("getting nonce from db: %w", err) } @@ -164,7 +173,9 @@ func (s *SendTask) Do(taskID harmonytask.TaskID, stillOwned func() bool) (done b // write to db - n, err := s.db.Exec(ctx, `update message_sends set nonce = $1, signed_data = $2, signed_json = $3, signed_cid = $4 where send_task_id = $5`, + n, err := s.db.Exec(ctx, ` + UPDATE message_sends SET nonce = $1, signed_data = $2, signed_json = $3, signed_cid = $4 + WHERE send_task_id = $5`, msg.Nonce, data, string(jsonBytes), sigMsg.Cid().String(), taskID) if err != nil { return false, xerrors.Errorf("updating db record: %w", err) @@ -198,7 +209,9 @@ func (s *SendTask) Do(taskID harmonytask.TaskID, stillOwned func() bool) (done b sendError = err.Error() } - _, err = s.db.Exec(ctx, `update message_sends set send_success = $1, send_error = $2, send_time = CURRENT_TIMESTAMP where send_task_id = $3`, sendSuccess, sendError, taskID) + _, err = s.db.Exec(ctx, ` + UPDATE message_sends SET send_success = $1, send_error = $2, send_time = CURRENT_TIMESTAMP + WHERE send_task_id = $3`, sendSuccess, sendError, taskID) if err != nil { return false, xerrors.Errorf("updating db record: %w", err) } From cb1939bc5ef9182d13549d7394062b3e86a4b8f2 Mon Sep 17 00:00:00 2001 From: Phi Date: Tue, 5 Dec 2023 22:33:33 +0100 Subject: [PATCH 08/38] Add backports to changelog Add backports to changelog --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6b28f549f..0a4db7c42 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -259,6 +259,9 @@ Lotus-workers can now be built to leverage the SupraSeal C2 sealing optimization - fix(client): single-root error message ([filecoin-project/lotus#11214](https://github.com/filecoin-project/lotus/pull/11214)) - fix: worker: Convert `DC_[SectorSize]_[ResourceRestriction]` if set ([filecoin-project/lotus#11224](https://github.com/filecoin-project/lotus/pull/11224)) - chore: backport #11338 onto release/v1.25.0 ([filecoin-project/lotus#11350](https://github.com/filecoin-project/lotus/pull/11350)) +- fix: lotus-provider: lotus-provider msg sending ([filecoin-project/lotus#11480](https://github.com/filecoin-project/lotus/pull/11480)) +- fix: lotus-provider: Fix winning PoSt ([filecoin-project/lotus#11483](https://github.com/filecoin-project/lotus/pull/11483)) +- chore: fix: sql Scan cannot write to an object ([filecoin-project/lotus#11487](https://github.com/filecoin-project/lotus/pull/11487)) ## Dependencies - deps: update go-libp2p to v0.28.1 ([filecoin-project/lotus#10998](https://github.com/filecoin-project/lotus/pull/10998)) From 514129eee54ccb06ced57f86ee98a49802e652c3 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Sat, 9 Dec 2023 18:08:32 +0900 Subject: [PATCH 09/38] fix: exchange: allow up to 10k messages per block Also explicitly limit how many bytes we're willing to read in one go such that we're capable of reading a worst-case tipset (like, really, never going to happen worst-case). Previously, this wasn't an issue. However, we've bumped the max number of messages from 8,192 to 150,000 and need to limit allocations somewhere else. --- chain/exchange/cbor_gen.go | 140 +++++----------------------- chain/exchange/client.go | 10 +- chain/exchange/protocol.go | 2 + chain/exchange/protocol_encoding.go | 125 +++++++++++++++++++++++++ gen/main.go | 2 +- 5 files changed, 161 insertions(+), 118 deletions(-) create mode 100644 chain/exchange/protocol_encoding.go diff --git a/chain/exchange/cbor_gen.go b/chain/exchange/cbor_gen.go index e66b6d798..71c75869d 100644 --- a/chain/exchange/cbor_gen.go +++ b/chain/exchange/cbor_gen.go @@ -306,9 +306,9 @@ func (t *Response) UnmarshalCBOR(r io.Reader) (err error) { return nil } -var lengthBufCompactedMessages = []byte{132} +var lengthBufCompactedMessagesCBOR = []byte{132} -func (t *CompactedMessages) MarshalCBOR(w io.Writer) error { +func (t *CompactedMessagesCBOR) MarshalCBOR(w io.Writer) error { if t == nil { _, err := w.Write(cbg.CborNull) return err @@ -316,12 +316,12 @@ func (t *CompactedMessages) MarshalCBOR(w io.Writer) error { cw := cbg.NewCborWriter(w) - if _, err := cw.Write(lengthBufCompactedMessages); err != nil { + if _, err := cw.Write(lengthBufCompactedMessagesCBOR); err != nil { return err } // t.Bls ([]*types.Message) (slice) - if len(t.Bls) > cbg.MaxLength { + if len(t.Bls) > 150000 { return xerrors.Errorf("Slice value in field t.Bls was too long") } @@ -334,7 +334,7 @@ func (t *CompactedMessages) MarshalCBOR(w io.Writer) error { } } - // t.BlsIncludes ([][]uint64) (slice) + // t.BlsIncludes ([]exchange.messageIndices) (slice) if len(t.BlsIncludes) > cbg.MaxLength { return xerrors.Errorf("Slice value in field t.BlsIncludes was too long") } @@ -343,24 +343,13 @@ func (t *CompactedMessages) MarshalCBOR(w io.Writer) error { return err } for _, v := range t.BlsIncludes { - if len(v) > cbg.MaxLength { - return xerrors.Errorf("Slice value in field v was too long") - } - - if err := cw.WriteMajorTypeHeader(cbg.MajArray, uint64(len(v))); err != nil { + if err := v.MarshalCBOR(cw); err != nil { return err } - for _, v := range v { - - if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(v)); err != nil { - return err - } - - } } // t.Secpk ([]*types.SignedMessage) (slice) - if len(t.Secpk) > cbg.MaxLength { + if len(t.Secpk) > 150000 { return xerrors.Errorf("Slice value in field t.Secpk was too long") } @@ -373,7 +362,7 @@ func (t *CompactedMessages) MarshalCBOR(w io.Writer) error { } } - // t.SecpkIncludes ([][]uint64) (slice) + // t.SecpkIncludes ([]exchange.messageIndices) (slice) if len(t.SecpkIncludes) > cbg.MaxLength { return xerrors.Errorf("Slice value in field t.SecpkIncludes was too long") } @@ -382,26 +371,15 @@ func (t *CompactedMessages) MarshalCBOR(w io.Writer) error { return err } for _, v := range t.SecpkIncludes { - if len(v) > cbg.MaxLength { - return xerrors.Errorf("Slice value in field v was too long") - } - - if err := cw.WriteMajorTypeHeader(cbg.MajArray, uint64(len(v))); err != nil { + if err := v.MarshalCBOR(cw); err != nil { return err } - for _, v := range v { - - if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(v)); err != nil { - return err - } - - } } return nil } -func (t *CompactedMessages) UnmarshalCBOR(r io.Reader) (err error) { - *t = CompactedMessages{} +func (t *CompactedMessagesCBOR) UnmarshalCBOR(r io.Reader) (err error) { + *t = CompactedMessagesCBOR{} cr := cbg.NewCborReader(r) @@ -430,7 +408,7 @@ func (t *CompactedMessages) UnmarshalCBOR(r io.Reader) (err error) { return err } - if extra > cbg.MaxLength { + if extra > 150000 { return fmt.Errorf("t.Bls: array too large (%d)", extra) } @@ -471,7 +449,7 @@ func (t *CompactedMessages) UnmarshalCBOR(r io.Reader) (err error) { } } - // t.BlsIncludes ([][]uint64) (slice) + // t.BlsIncludes ([]exchange.messageIndices) (slice) maj, extra, err = cr.ReadHeader() if err != nil { @@ -487,7 +465,7 @@ func (t *CompactedMessages) UnmarshalCBOR(r io.Reader) (err error) { } if extra > 0 { - t.BlsIncludes = make([][]uint64, extra) + t.BlsIncludes = make([]messageIndices, extra) } for i := 0; i < int(extra); i++ { @@ -499,47 +477,13 @@ func (t *CompactedMessages) UnmarshalCBOR(r io.Reader) (err error) { _ = extra _ = err - maj, extra, err = cr.ReadHeader() - if err != nil { - return err - } + { - if extra > cbg.MaxLength { - return fmt.Errorf("t.BlsIncludes[i]: array too large (%d)", extra) - } - - if maj != cbg.MajArray { - return fmt.Errorf("expected cbor array") - } - - if extra > 0 { - t.BlsIncludes[i] = make([]uint64, extra) - } - - for j := 0; j < int(extra); j++ { - { - var maj byte - var extra uint64 - var err error - _ = maj - _ = extra - _ = err - - { - - maj, extra, err = cr.ReadHeader() - if err != nil { - return err - } - if maj != cbg.MajUnsignedInt { - return fmt.Errorf("wrong type for uint64 field") - } - t.BlsIncludes[i][j] = uint64(extra) - - } + if err := t.BlsIncludes[i].UnmarshalCBOR(cr); err != nil { + return xerrors.Errorf("unmarshaling t.BlsIncludes[i]: %w", err) } - } + } } } @@ -550,7 +494,7 @@ func (t *CompactedMessages) UnmarshalCBOR(r io.Reader) (err error) { return err } - if extra > cbg.MaxLength { + if extra > 150000 { return fmt.Errorf("t.Secpk: array too large (%d)", extra) } @@ -591,7 +535,7 @@ func (t *CompactedMessages) UnmarshalCBOR(r io.Reader) (err error) { } } - // t.SecpkIncludes ([][]uint64) (slice) + // t.SecpkIncludes ([]exchange.messageIndices) (slice) maj, extra, err = cr.ReadHeader() if err != nil { @@ -607,7 +551,7 @@ func (t *CompactedMessages) UnmarshalCBOR(r io.Reader) (err error) { } if extra > 0 { - t.SecpkIncludes = make([][]uint64, extra) + t.SecpkIncludes = make([]messageIndices, extra) } for i := 0; i < int(extra); i++ { @@ -619,47 +563,13 @@ func (t *CompactedMessages) UnmarshalCBOR(r io.Reader) (err error) { _ = extra _ = err - maj, extra, err = cr.ReadHeader() - if err != nil { - return err - } + { - if extra > cbg.MaxLength { - return fmt.Errorf("t.SecpkIncludes[i]: array too large (%d)", extra) - } - - if maj != cbg.MajArray { - return fmt.Errorf("expected cbor array") - } - - if extra > 0 { - t.SecpkIncludes[i] = make([]uint64, extra) - } - - for j := 0; j < int(extra); j++ { - { - var maj byte - var extra uint64 - var err error - _ = maj - _ = extra - _ = err - - { - - maj, extra, err = cr.ReadHeader() - if err != nil { - return err - } - if maj != cbg.MajUnsignedInt { - return fmt.Errorf("wrong type for uint64 field") - } - t.SecpkIncludes[i][j] = uint64(extra) - - } + if err := t.SecpkIncludes[i].UnmarshalCBOR(cr); err != nil { + return xerrors.Errorf("unmarshaling t.SecpkIncludes[i]: %w", err) } - } + } } } diff --git a/chain/exchange/client.go b/chain/exchange/client.go index db39628be..fca8249ce 100644 --- a/chain/exchange/client.go +++ b/chain/exchange/client.go @@ -4,6 +4,7 @@ import ( "bufio" "context" "fmt" + "io" "math/rand" "time" @@ -23,6 +24,10 @@ import ( "github.com/filecoin-project/lotus/lib/peermgr" ) +// Set the max exchange message size to 120MiB. Purely based on gas numbers, we can include ~8MiB of +// messages per block, so I've set this to 120MiB to be _very_ safe. +const maxExchangeMessageSize = (15 * 8) << 20 + // client implements exchange.Client, using the libp2p ChainExchange protocol // as the fetching mechanism. type client struct { @@ -434,10 +439,11 @@ func (c *client) sendRequestToPeer(ctx context.Context, peer peer.ID, req *Reque log.Warnw("CloseWrite err", "error", err) } - // Read response. + // Read response, limiting the size of the response to maxExchangeMessageSize as we allow a + // lot of messages (10k+) but they'll mostly be quite small. var res Response err = cborutil.ReadCborRPC( - bufio.NewReader(incrt.New(stream, ReadResMinSpeed, ReadResDeadline)), + bufio.NewReader(io.LimitReader(incrt.New(stream, ReadResMinSpeed, ReadResDeadline), maxExchangeMessageSize)), &res) if err != nil { c.peerTracker.logFailure(peer, build.Clock.Since(connectionStart), req.Length) diff --git a/chain/exchange/protocol.go b/chain/exchange/protocol.go index 5e12d31cc..cd25f4a43 100644 --- a/chain/exchange/protocol.go +++ b/chain/exchange/protocol.go @@ -154,6 +154,8 @@ type BSTipSet struct { // FIXME: The logic to decompress this structure should belong // // to itself, not to the consumer. +// +// NOTE: Max messages is: BlockMessageLimit (10k) * MaxTipsetSize (15) = 150k type CompactedMessages struct { Bls []*types.Message BlsIncludes [][]uint64 diff --git a/chain/exchange/protocol_encoding.go b/chain/exchange/protocol_encoding.go new file mode 100644 index 000000000..7df00a639 --- /dev/null +++ b/chain/exchange/protocol_encoding.go @@ -0,0 +1,125 @@ +package exchange + +import ( + "fmt" + "io" + + cbg "github.com/whyrusleeping/cbor-gen" + xerrors "golang.org/x/xerrors" + + "github.com/filecoin-project/lotus/build" + types "github.com/filecoin-project/lotus/chain/types" +) + +// Type used for encoding/decoding compacted messages. This is a ustom type as we need custom limits. +// - Max messages is 150,000 as that's 15 times the max block size (in messages). It needs to be +// large enough to cover a full tipset full of full blocks. +type CompactedMessagesCBOR struct { + Bls []*types.Message `cborgen:"maxlen=150000"` + BlsIncludes []messageIndices + + Secpk []*types.SignedMessage `cborgen:"maxlen=150000"` + SecpkIncludes []messageIndices +} + +// Unmarshal into the "decoding" struct, then copy into the actual struct. +func (t *CompactedMessages) UnmarshalCBOR(r io.Reader) (err error) { + var c CompactedMessagesCBOR + if err := c.UnmarshalCBOR(r); err != nil { + return err + } + t.Bls = c.Bls + t.BlsIncludes = make([][]uint64, len(c.BlsIncludes)) + for i, v := range c.BlsIncludes { + t.BlsIncludes[i] = v.v + } + t.Secpk = c.Secpk + t.SecpkIncludes = make([][]uint64, len(c.SecpkIncludes)) + for i, v := range c.SecpkIncludes { + t.SecpkIncludes[i] = v.v + } + return nil +} + +// Copy into the encoding struct, then marshal. +func (t *CompactedMessages) MarshalCBOR(w io.Writer) error { + if t == nil { + _, err := w.Write(cbg.CborNull) + return err + } + + var c CompactedMessagesCBOR + c.Bls = t.Bls + c.BlsIncludes = make([]messageIndices, len(t.BlsIncludes)) + for i, v := range t.BlsIncludes { + c.BlsIncludes[i].v = v + } + c.Secpk = t.Secpk + c.SecpkIncludes = make([]messageIndices, len(t.SecpkIncludes)) + for i, v := range t.SecpkIncludes { + c.SecpkIncludes[i].v = v + } + return c.MarshalCBOR(w) +} + +// this needs to be a struct or cborgen will peak into it and ignore the Unmarshal/Marshal functions +type messageIndices struct { + v []uint64 +} + +func (t *messageIndices) UnmarshalCBOR(r io.Reader) (err error) { + cr := cbg.NewCborReader(r) + + maj, extra, err := cr.ReadHeader() + if err != nil { + return err + } + + if maj != cbg.MajArray { + return fmt.Errorf("cbor input should be of type array") + } + + if extra > build.BlockMessageLimit { + return fmt.Errorf("cbor input had wrong number of fields") + } + + if extra > 0 { + t.v = make([]uint64, extra) + } + + for i := 0; i < int(extra); i++ { + maj, extra, err := cr.ReadHeader() + if err != nil { + return err + } + if maj != cbg.MajUnsignedInt { + return fmt.Errorf("wrong type for uint64 field") + } + t.v[i] = uint64(extra) + + } + return nil +} + +func (t *messageIndices) MarshalCBOR(w io.Writer) error { + if t == nil { + _, err := w.Write(cbg.CborNull) + return err + } + + cw := cbg.NewCborWriter(w) + + if len(t.v) > build.BlockMessageLimit { + return xerrors.Errorf("Slice value in field v was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajArray, uint64(len(t.v))); err != nil { + return err + } + for _, v := range t.v { + if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(v)); err != nil { + return err + } + } + return nil +} diff --git a/gen/main.go b/gen/main.go index 0cd3999c3..942b3ac2c 100644 --- a/gen/main.go +++ b/gen/main.go @@ -92,7 +92,7 @@ func main() { err = gen.WriteTupleEncodersToFile("./chain/exchange/cbor_gen.go", "exchange", exchange.Request{}, exchange.Response{}, - exchange.CompactedMessages{}, + exchange.CompactedMessagesCBOR{}, exchange.BSTipSet{}, ) if err != nil { From d532ac616901895ae9101e0afbecce2a142a90eb Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Sat, 9 Dec 2023 18:21:22 +0900 Subject: [PATCH 10/38] fix lints --- chain/exchange/protocol_encoding.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/chain/exchange/protocol_encoding.go b/chain/exchange/protocol_encoding.go index 7df00a639..ca15831d6 100644 --- a/chain/exchange/protocol_encoding.go +++ b/chain/exchange/protocol_encoding.go @@ -95,7 +95,7 @@ func (t *messageIndices) UnmarshalCBOR(r io.Reader) (err error) { if maj != cbg.MajUnsignedInt { return fmt.Errorf("wrong type for uint64 field") } - t.v[i] = uint64(extra) + t.v[i] = extra } return nil @@ -117,7 +117,7 @@ func (t *messageIndices) MarshalCBOR(w io.Writer) error { return err } for _, v := range t.v { - if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(v)); err != nil { + if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, v); err != nil { return err } } From 410ca250712349eeb8e977135bd9c1ad0f4fea0f Mon Sep 17 00:00:00 2001 From: jennijuju Date: Sat, 9 Dec 2023 21:05:12 +0800 Subject: [PATCH 11/38] hot fix - backport #11506 --- CHANGELOG.md | 10 ++++++++++ build/openrpc/full.json.gz | Bin 34820 -> 34820 bytes build/openrpc/gateway.json.gz | Bin 11865 -> 11866 bytes build/openrpc/miner.json.gz | Bin 16368 -> 16368 bytes build/openrpc/worker.json.gz | Bin 6047 -> 6047 bytes build/version.go | 2 +- documentation/en/cli-lotus-miner.md | 2 +- documentation/en/cli-lotus-worker.md | 2 +- documentation/en/cli-lotus.md | 2 +- 9 files changed, 14 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dd2888747..fe1ec0de5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ # Lotus changelog +#v1.25.1 / 2023-12-09 + +This is a **highly recommended PATCH RELEASE.** The patch release fixes the issue were node operators trying to catch up sync were unable to sync large message blocks/epochs due to an increased number of messages on the network. + +This patch release allows for up to 10k messages per block. Additionally, it introduces a limit on the amount of data that can be read at once, ensuring the system can handle worst-case scenarios. + +## Improvements +- fix: exchange: allow up to 10k messages per block ([filecoin-project/lotus#11506](https://github.com/filecoin-project/lotus/pull/11506)) + + # v 1.25.0 / 2023-11-22 This is a highly recommended feature release of Lotus. This optional release supports the Filecoin network version 21 upgrade, codenamed Watermelon 🍉, in addition to the numerous improvements and enhancements for node operators, ETH RPC-providers and storage providers. diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index b72419e4f17c9265669e26553617b3eba8681c80..4e8edaee0e6aadd18bf834690db98ac164109444 100644 GIT binary patch literal 34820 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 literal 34820 zcmZ^qQ;;Z2)TP_DZQIsq+qSz;+qP}nwr$(CZFA23XC`7^rXI3()9L`LPxZ?A

~;jcMAspS?q>RxP1d%*xcE>S5C_Q7 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 U{PFYu2LJ&7|KPc?uUGsA01j>=BLDyZ diff --git a/build/openrpc/gateway.json.gz b/build/openrpc/gateway.json.gz index 90f41df1d370ca94787c61d8a572cc442c9b5a70..3d83445edf9ce1e1b11f1591b200194682f20d11 100644 GIT binary patch delta 9397 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

JrQ{fTh;Y#`Z$`&4Z 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 diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index f5d61d7a8fd39b629750e964b4b3cd6e3bccfefa..0f75197d7db689f6b40f16f76aaa285f9f7ea65f 100644 GIT binary patch delta 22 ecmexR|Dk?DGm}il#@1we4&@1381CCMGXMa2ObFlr delta 22 ecmexR|Dk?DGt-;wjjhS{9Jah`4&S$DW&i+&fC>cw diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index b466383978fe8a917aed3f539f967306b59927d8..cbbe526db77a7aa99c779f7783855d019aee1160 100644 GIT binary patch delta 5930 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 delta 5903 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 DOz)rR diff --git a/build/version.go b/build/version.go index d97b0099a..dbf3c96f4 100644 --- a/build/version.go +++ b/build/version.go @@ -37,7 +37,7 @@ func BuildTypeString() string { } // BuildVersion is the local build version -const BuildVersion = "1.25.0" +const BuildVersion = "1.25.1" func UserVersion() string { if os.Getenv("LOTUS_VERSION_IGNORE_COMMIT") == "1" { diff --git a/documentation/en/cli-lotus-miner.md b/documentation/en/cli-lotus-miner.md index 1614e4d88..6693d2a79 100644 --- a/documentation/en/cli-lotus-miner.md +++ b/documentation/en/cli-lotus-miner.md @@ -7,7 +7,7 @@ USAGE: lotus-miner [global options] command [command options] [arguments...] VERSION: - 1.25.0 + 1.25.1 COMMANDS: init Initialize a lotus miner repo diff --git a/documentation/en/cli-lotus-worker.md b/documentation/en/cli-lotus-worker.md index a47879738..733723bad 100644 --- a/documentation/en/cli-lotus-worker.md +++ b/documentation/en/cli-lotus-worker.md @@ -7,7 +7,7 @@ USAGE: lotus-worker [global options] command [command options] [arguments...] VERSION: - 1.25.0 + 1.25.1 COMMANDS: run Start lotus worker diff --git a/documentation/en/cli-lotus.md b/documentation/en/cli-lotus.md index 46635abcf..c7a2cb09a 100644 --- a/documentation/en/cli-lotus.md +++ b/documentation/en/cli-lotus.md @@ -7,7 +7,7 @@ USAGE: lotus [global options] command [command options] [arguments...] VERSION: - 1.25.0 + 1.25.1 COMMANDS: daemon Start a lotus daemon process From 2b771693ebf358ebdeab0d9cfc08acaa31d6d3e4 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Sat, 9 Dec 2023 18:08:32 +0900 Subject: [PATCH 12/38] fix: exchange: allow up to 10k messages per block Also explicitly limit how many bytes we're willing to read in one go such that we're capable of reading a worst-case tipset (like, really, never going to happen worst-case). Previously, this wasn't an issue. However, we've bumped the max number of messages from 8,192 to 150,000 and need to limit allocations somewhere else. --- chain/exchange/cbor_gen.go | 140 +++++----------------------- chain/exchange/client.go | 10 +- chain/exchange/protocol.go | 2 + chain/exchange/protocol_encoding.go | 125 +++++++++++++++++++++++++ gen/main.go | 2 +- 5 files changed, 161 insertions(+), 118 deletions(-) create mode 100644 chain/exchange/protocol_encoding.go diff --git a/chain/exchange/cbor_gen.go b/chain/exchange/cbor_gen.go index e66b6d798..71c75869d 100644 --- a/chain/exchange/cbor_gen.go +++ b/chain/exchange/cbor_gen.go @@ -306,9 +306,9 @@ func (t *Response) UnmarshalCBOR(r io.Reader) (err error) { return nil } -var lengthBufCompactedMessages = []byte{132} +var lengthBufCompactedMessagesCBOR = []byte{132} -func (t *CompactedMessages) MarshalCBOR(w io.Writer) error { +func (t *CompactedMessagesCBOR) MarshalCBOR(w io.Writer) error { if t == nil { _, err := w.Write(cbg.CborNull) return err @@ -316,12 +316,12 @@ func (t *CompactedMessages) MarshalCBOR(w io.Writer) error { cw := cbg.NewCborWriter(w) - if _, err := cw.Write(lengthBufCompactedMessages); err != nil { + if _, err := cw.Write(lengthBufCompactedMessagesCBOR); err != nil { return err } // t.Bls ([]*types.Message) (slice) - if len(t.Bls) > cbg.MaxLength { + if len(t.Bls) > 150000 { return xerrors.Errorf("Slice value in field t.Bls was too long") } @@ -334,7 +334,7 @@ func (t *CompactedMessages) MarshalCBOR(w io.Writer) error { } } - // t.BlsIncludes ([][]uint64) (slice) + // t.BlsIncludes ([]exchange.messageIndices) (slice) if len(t.BlsIncludes) > cbg.MaxLength { return xerrors.Errorf("Slice value in field t.BlsIncludes was too long") } @@ -343,24 +343,13 @@ func (t *CompactedMessages) MarshalCBOR(w io.Writer) error { return err } for _, v := range t.BlsIncludes { - if len(v) > cbg.MaxLength { - return xerrors.Errorf("Slice value in field v was too long") - } - - if err := cw.WriteMajorTypeHeader(cbg.MajArray, uint64(len(v))); err != nil { + if err := v.MarshalCBOR(cw); err != nil { return err } - for _, v := range v { - - if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(v)); err != nil { - return err - } - - } } // t.Secpk ([]*types.SignedMessage) (slice) - if len(t.Secpk) > cbg.MaxLength { + if len(t.Secpk) > 150000 { return xerrors.Errorf("Slice value in field t.Secpk was too long") } @@ -373,7 +362,7 @@ func (t *CompactedMessages) MarshalCBOR(w io.Writer) error { } } - // t.SecpkIncludes ([][]uint64) (slice) + // t.SecpkIncludes ([]exchange.messageIndices) (slice) if len(t.SecpkIncludes) > cbg.MaxLength { return xerrors.Errorf("Slice value in field t.SecpkIncludes was too long") } @@ -382,26 +371,15 @@ func (t *CompactedMessages) MarshalCBOR(w io.Writer) error { return err } for _, v := range t.SecpkIncludes { - if len(v) > cbg.MaxLength { - return xerrors.Errorf("Slice value in field v was too long") - } - - if err := cw.WriteMajorTypeHeader(cbg.MajArray, uint64(len(v))); err != nil { + if err := v.MarshalCBOR(cw); err != nil { return err } - for _, v := range v { - - if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(v)); err != nil { - return err - } - - } } return nil } -func (t *CompactedMessages) UnmarshalCBOR(r io.Reader) (err error) { - *t = CompactedMessages{} +func (t *CompactedMessagesCBOR) UnmarshalCBOR(r io.Reader) (err error) { + *t = CompactedMessagesCBOR{} cr := cbg.NewCborReader(r) @@ -430,7 +408,7 @@ func (t *CompactedMessages) UnmarshalCBOR(r io.Reader) (err error) { return err } - if extra > cbg.MaxLength { + if extra > 150000 { return fmt.Errorf("t.Bls: array too large (%d)", extra) } @@ -471,7 +449,7 @@ func (t *CompactedMessages) UnmarshalCBOR(r io.Reader) (err error) { } } - // t.BlsIncludes ([][]uint64) (slice) + // t.BlsIncludes ([]exchange.messageIndices) (slice) maj, extra, err = cr.ReadHeader() if err != nil { @@ -487,7 +465,7 @@ func (t *CompactedMessages) UnmarshalCBOR(r io.Reader) (err error) { } if extra > 0 { - t.BlsIncludes = make([][]uint64, extra) + t.BlsIncludes = make([]messageIndices, extra) } for i := 0; i < int(extra); i++ { @@ -499,47 +477,13 @@ func (t *CompactedMessages) UnmarshalCBOR(r io.Reader) (err error) { _ = extra _ = err - maj, extra, err = cr.ReadHeader() - if err != nil { - return err - } + { - if extra > cbg.MaxLength { - return fmt.Errorf("t.BlsIncludes[i]: array too large (%d)", extra) - } - - if maj != cbg.MajArray { - return fmt.Errorf("expected cbor array") - } - - if extra > 0 { - t.BlsIncludes[i] = make([]uint64, extra) - } - - for j := 0; j < int(extra); j++ { - { - var maj byte - var extra uint64 - var err error - _ = maj - _ = extra - _ = err - - { - - maj, extra, err = cr.ReadHeader() - if err != nil { - return err - } - if maj != cbg.MajUnsignedInt { - return fmt.Errorf("wrong type for uint64 field") - } - t.BlsIncludes[i][j] = uint64(extra) - - } + if err := t.BlsIncludes[i].UnmarshalCBOR(cr); err != nil { + return xerrors.Errorf("unmarshaling t.BlsIncludes[i]: %w", err) } - } + } } } @@ -550,7 +494,7 @@ func (t *CompactedMessages) UnmarshalCBOR(r io.Reader) (err error) { return err } - if extra > cbg.MaxLength { + if extra > 150000 { return fmt.Errorf("t.Secpk: array too large (%d)", extra) } @@ -591,7 +535,7 @@ func (t *CompactedMessages) UnmarshalCBOR(r io.Reader) (err error) { } } - // t.SecpkIncludes ([][]uint64) (slice) + // t.SecpkIncludes ([]exchange.messageIndices) (slice) maj, extra, err = cr.ReadHeader() if err != nil { @@ -607,7 +551,7 @@ func (t *CompactedMessages) UnmarshalCBOR(r io.Reader) (err error) { } if extra > 0 { - t.SecpkIncludes = make([][]uint64, extra) + t.SecpkIncludes = make([]messageIndices, extra) } for i := 0; i < int(extra); i++ { @@ -619,47 +563,13 @@ func (t *CompactedMessages) UnmarshalCBOR(r io.Reader) (err error) { _ = extra _ = err - maj, extra, err = cr.ReadHeader() - if err != nil { - return err - } + { - if extra > cbg.MaxLength { - return fmt.Errorf("t.SecpkIncludes[i]: array too large (%d)", extra) - } - - if maj != cbg.MajArray { - return fmt.Errorf("expected cbor array") - } - - if extra > 0 { - t.SecpkIncludes[i] = make([]uint64, extra) - } - - for j := 0; j < int(extra); j++ { - { - var maj byte - var extra uint64 - var err error - _ = maj - _ = extra - _ = err - - { - - maj, extra, err = cr.ReadHeader() - if err != nil { - return err - } - if maj != cbg.MajUnsignedInt { - return fmt.Errorf("wrong type for uint64 field") - } - t.SecpkIncludes[i][j] = uint64(extra) - - } + if err := t.SecpkIncludes[i].UnmarshalCBOR(cr); err != nil { + return xerrors.Errorf("unmarshaling t.SecpkIncludes[i]: %w", err) } - } + } } } diff --git a/chain/exchange/client.go b/chain/exchange/client.go index 120b554a1..769c375ca 100644 --- a/chain/exchange/client.go +++ b/chain/exchange/client.go @@ -4,6 +4,7 @@ import ( "bufio" "context" "fmt" + "io" "math/rand" "time" @@ -23,6 +24,10 @@ import ( "github.com/filecoin-project/lotus/lib/peermgr" ) +// Set the max exchange message size to 120MiB. Purely based on gas numbers, we can include ~8MiB of +// messages per block, so I've set this to 120MiB to be _very_ safe. +const maxExchangeMessageSize = (15 * 8) << 20 + // client implements exchange.Client, using the libp2p ChainExchange protocol // as the fetching mechanism. type client struct { @@ -434,10 +439,11 @@ func (c *client) sendRequestToPeer(ctx context.Context, peer peer.ID, req *Reque log.Warnw("CloseWrite err", "error", err) } - // Read response. + // Read response, limiting the size of the response to maxExchangeMessageSize as we allow a + // lot of messages (10k+) but they'll mostly be quite small. var res Response err = cborutil.ReadCborRPC( - bufio.NewReader(incrt.New(stream, ReadResMinSpeed, ReadResDeadline)), + bufio.NewReader(io.LimitReader(incrt.New(stream, ReadResMinSpeed, ReadResDeadline), maxExchangeMessageSize)), &res) if err != nil { c.peerTracker.logFailure(peer, build.Clock.Since(connectionStart), req.Length) diff --git a/chain/exchange/protocol.go b/chain/exchange/protocol.go index 5e12d31cc..cd25f4a43 100644 --- a/chain/exchange/protocol.go +++ b/chain/exchange/protocol.go @@ -154,6 +154,8 @@ type BSTipSet struct { // FIXME: The logic to decompress this structure should belong // // to itself, not to the consumer. +// +// NOTE: Max messages is: BlockMessageLimit (10k) * MaxTipsetSize (15) = 150k type CompactedMessages struct { Bls []*types.Message BlsIncludes [][]uint64 diff --git a/chain/exchange/protocol_encoding.go b/chain/exchange/protocol_encoding.go new file mode 100644 index 000000000..7df00a639 --- /dev/null +++ b/chain/exchange/protocol_encoding.go @@ -0,0 +1,125 @@ +package exchange + +import ( + "fmt" + "io" + + cbg "github.com/whyrusleeping/cbor-gen" + xerrors "golang.org/x/xerrors" + + "github.com/filecoin-project/lotus/build" + types "github.com/filecoin-project/lotus/chain/types" +) + +// Type used for encoding/decoding compacted messages. This is a ustom type as we need custom limits. +// - Max messages is 150,000 as that's 15 times the max block size (in messages). It needs to be +// large enough to cover a full tipset full of full blocks. +type CompactedMessagesCBOR struct { + Bls []*types.Message `cborgen:"maxlen=150000"` + BlsIncludes []messageIndices + + Secpk []*types.SignedMessage `cborgen:"maxlen=150000"` + SecpkIncludes []messageIndices +} + +// Unmarshal into the "decoding" struct, then copy into the actual struct. +func (t *CompactedMessages) UnmarshalCBOR(r io.Reader) (err error) { + var c CompactedMessagesCBOR + if err := c.UnmarshalCBOR(r); err != nil { + return err + } + t.Bls = c.Bls + t.BlsIncludes = make([][]uint64, len(c.BlsIncludes)) + for i, v := range c.BlsIncludes { + t.BlsIncludes[i] = v.v + } + t.Secpk = c.Secpk + t.SecpkIncludes = make([][]uint64, len(c.SecpkIncludes)) + for i, v := range c.SecpkIncludes { + t.SecpkIncludes[i] = v.v + } + return nil +} + +// Copy into the encoding struct, then marshal. +func (t *CompactedMessages) MarshalCBOR(w io.Writer) error { + if t == nil { + _, err := w.Write(cbg.CborNull) + return err + } + + var c CompactedMessagesCBOR + c.Bls = t.Bls + c.BlsIncludes = make([]messageIndices, len(t.BlsIncludes)) + for i, v := range t.BlsIncludes { + c.BlsIncludes[i].v = v + } + c.Secpk = t.Secpk + c.SecpkIncludes = make([]messageIndices, len(t.SecpkIncludes)) + for i, v := range t.SecpkIncludes { + c.SecpkIncludes[i].v = v + } + return c.MarshalCBOR(w) +} + +// this needs to be a struct or cborgen will peak into it and ignore the Unmarshal/Marshal functions +type messageIndices struct { + v []uint64 +} + +func (t *messageIndices) UnmarshalCBOR(r io.Reader) (err error) { + cr := cbg.NewCborReader(r) + + maj, extra, err := cr.ReadHeader() + if err != nil { + return err + } + + if maj != cbg.MajArray { + return fmt.Errorf("cbor input should be of type array") + } + + if extra > build.BlockMessageLimit { + return fmt.Errorf("cbor input had wrong number of fields") + } + + if extra > 0 { + t.v = make([]uint64, extra) + } + + for i := 0; i < int(extra); i++ { + maj, extra, err := cr.ReadHeader() + if err != nil { + return err + } + if maj != cbg.MajUnsignedInt { + return fmt.Errorf("wrong type for uint64 field") + } + t.v[i] = uint64(extra) + + } + return nil +} + +func (t *messageIndices) MarshalCBOR(w io.Writer) error { + if t == nil { + _, err := w.Write(cbg.CborNull) + return err + } + + cw := cbg.NewCborWriter(w) + + if len(t.v) > build.BlockMessageLimit { + return xerrors.Errorf("Slice value in field v was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajArray, uint64(len(t.v))); err != nil { + return err + } + for _, v := range t.v { + if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(v)); err != nil { + return err + } + } + return nil +} diff --git a/gen/main.go b/gen/main.go index 0cd3999c3..942b3ac2c 100644 --- a/gen/main.go +++ b/gen/main.go @@ -92,7 +92,7 @@ func main() { err = gen.WriteTupleEncodersToFile("./chain/exchange/cbor_gen.go", "exchange", exchange.Request{}, exchange.Response{}, - exchange.CompactedMessages{}, + exchange.CompactedMessagesCBOR{}, exchange.BSTipSet{}, ) if err != nil { From f086374233ee594696dc97d16c032d03de67c6e3 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Sat, 9 Dec 2023 18:21:22 +0900 Subject: [PATCH 13/38] fix lints --- chain/exchange/protocol_encoding.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/chain/exchange/protocol_encoding.go b/chain/exchange/protocol_encoding.go index 7df00a639..ca15831d6 100644 --- a/chain/exchange/protocol_encoding.go +++ b/chain/exchange/protocol_encoding.go @@ -95,7 +95,7 @@ func (t *messageIndices) UnmarshalCBOR(r io.Reader) (err error) { if maj != cbg.MajUnsignedInt { return fmt.Errorf("wrong type for uint64 field") } - t.v[i] = uint64(extra) + t.v[i] = extra } return nil @@ -117,7 +117,7 @@ func (t *messageIndices) MarshalCBOR(w io.Writer) error { return err } for _, v := range t.v { - if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(v)); err != nil { + if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, v); err != nil { return err } } From cad43b3b9fc432c90eab728dba7f97bb3c100293 Mon Sep 17 00:00:00 2001 From: jennijuju Date: Sat, 9 Dec 2023 21:23:45 +0800 Subject: [PATCH 14/38] v1.25.2-rc1 --- CHANGELOG.md | 6 ++++-- build/openrpc/full.json.gz | Bin 34818 -> 34818 bytes build/openrpc/gateway.json.gz | Bin 11875 -> 11875 bytes build/openrpc/miner.json.gz | Bin 16370 -> 16370 bytes build/openrpc/worker.json.gz | Bin 6052 -> 6052 bytes build/version.go | 2 +- documentation/en/cli-lotus-miner.md | 2 +- documentation/en/cli-lotus-worker.md | 2 +- documentation/en/cli-lotus.md | 2 +- 9 files changed, 8 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0a4db7c42..c901055f2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,9 +4,11 @@ ## Improvements -# v1.25.1-rc1 / 2023-12-05 +# v1.25.2-rc1 / 2023-12-09 -This is the first release candidate of the upcoming optional release of Lotus v1.25.1. This feature release includes numerous improvements and enhancements for node operators, ETH RPC-providers and storage providers. +This is the first release candidate of the upcoming optional release of Lotus v1.25.2, which was bumped from the previous v1.25.1-rc1 with the hot fix (see v1.24.1 & v1.25.1 for more details).. + +This feature release includes numerous improvements and enhancements for node operators, ETH RPC-providers and storage providers. ## ☢️ Upgrade Warnings ☢️ diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 1395acd3e3531a548f72ad003a10900743139b9c..7d5fd71f8441436b516771e43a947eb6c4bb03c6 100644 GIT binary patch literal 34818 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 diff --git a/build/openrpc/gateway.json.gz b/build/openrpc/gateway.json.gz index 12b5766113c3f667b65901d12928c7a61e3339fa..d68b6ecc61fad1af60ce8b41275e6bf45077788a 100644 GIT binary patch delta 21 dcmaDH^EhTgGvls}E!TB9{+{cYl-M0r#y5L~Al~;eyKDK9O004Iq3Eltz diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index 02bfa68d558449f573d7292b434eea6ed2313661..a304593f5a39f2e92c909d8410480f7fc6f0ca74 100644 GIT binary patch delta 5897 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 KE9CZZSOEayt&h_H diff --git a/build/version.go b/build/version.go index 360c4a136..e3249808a 100644 --- a/build/version.go +++ b/build/version.go @@ -37,7 +37,7 @@ func BuildTypeString() string { } // BuildVersion is the local build version -const BuildVersion = "1.25.1-rc1" +const BuildVersion = "1.25.2-rc1" func UserVersion() string { if os.Getenv("LOTUS_VERSION_IGNORE_COMMIT") == "1" { diff --git a/documentation/en/cli-lotus-miner.md b/documentation/en/cli-lotus-miner.md index 909c93e8e..5519bbc6b 100644 --- a/documentation/en/cli-lotus-miner.md +++ b/documentation/en/cli-lotus-miner.md @@ -7,7 +7,7 @@ USAGE: lotus-miner [global options] command [command options] [arguments...] VERSION: - 1.25.1-rc1 + 1.25.2-rc1 COMMANDS: init Initialize a lotus miner repo diff --git a/documentation/en/cli-lotus-worker.md b/documentation/en/cli-lotus-worker.md index 7813cc717..f6ae93fc5 100644 --- a/documentation/en/cli-lotus-worker.md +++ b/documentation/en/cli-lotus-worker.md @@ -7,7 +7,7 @@ USAGE: lotus-worker [global options] command [command options] [arguments...] VERSION: - 1.25.1-rc1 + 1.25.2-rc1 COMMANDS: run Start lotus worker diff --git a/documentation/en/cli-lotus.md b/documentation/en/cli-lotus.md index edc18b10a..c752a3600 100644 --- a/documentation/en/cli-lotus.md +++ b/documentation/en/cli-lotus.md @@ -7,7 +7,7 @@ USAGE: lotus [global options] command [command options] [arguments...] VERSION: - 1.25.1-rc1 + 1.25.2-rc1 COMMANDS: daemon Start a lotus daemon process From e8b5d18ee5a8de9c97c13dc39006df4ed7f7185f Mon Sep 17 00:00:00 2001 From: Jiaying Wang <42981373+jennijuju@users.noreply.github.com> Date: Sat, 9 Dec 2023 21:27:28 +0800 Subject: [PATCH 15/38] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fe1ec0de5..fc7987e61 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Lotus changelog -#v1.25.1 / 2023-12-09 +# v1.25.1 / 2023-12-09 This is a **highly recommended PATCH RELEASE.** The patch release fixes the issue were node operators trying to catch up sync were unable to sync large message blocks/epochs due to an increased number of messages on the network. From aa6413622ef12ee30b899d9ef45637b270450514 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Sat, 9 Dec 2023 23:24:43 +0900 Subject: [PATCH 16/38] fix: exchange: explicitly cast the block message limit const (#11511) It's not a const for the testground build, and needs to be an int 99% of the time. So we might as well just cast here. --- chain/exchange/protocol_encoding.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chain/exchange/protocol_encoding.go b/chain/exchange/protocol_encoding.go index ca15831d6..040dd0d40 100644 --- a/chain/exchange/protocol_encoding.go +++ b/chain/exchange/protocol_encoding.go @@ -79,7 +79,7 @@ func (t *messageIndices) UnmarshalCBOR(r io.Reader) (err error) { return fmt.Errorf("cbor input should be of type array") } - if extra > build.BlockMessageLimit { + if extra > uint64(build.BlockMessageLimit) { return fmt.Errorf("cbor input had wrong number of fields") } From 7caaa609928a704aa433c324734536245bf808d5 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Sat, 9 Dec 2023 23:24:43 +0900 Subject: [PATCH 17/38] fix: exchange: explicitly cast the block message limit const (#11511) It's not a const for the testground build, and needs to be an int 99% of the time. So we might as well just cast here. --- chain/exchange/protocol_encoding.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chain/exchange/protocol_encoding.go b/chain/exchange/protocol_encoding.go index ca15831d6..040dd0d40 100644 --- a/chain/exchange/protocol_encoding.go +++ b/chain/exchange/protocol_encoding.go @@ -79,7 +79,7 @@ func (t *messageIndices) UnmarshalCBOR(r io.Reader) (err error) { return fmt.Errorf("cbor input should be of type array") } - if extra > build.BlockMessageLimit { + if extra > uint64(build.BlockMessageLimit) { return fmt.Errorf("cbor input had wrong number of fields") } From 5d868f071be9defc41756dd64a42f352a5b5e534 Mon Sep 17 00:00:00 2001 From: "Andrew Jackson (Ajax)" Date: Wed, 6 Dec 2023 09:28:41 -0600 Subject: [PATCH 18/38] Merge pull request #11490 from filecoin-project/phi-fix-lp-info-log fix: lotus-provider: show addresses in log --- cmd/lotus-provider/run.go | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/cmd/lotus-provider/run.go b/cmd/lotus-provider/run.go index bf19ee537..de97aa766 100644 --- a/cmd/lotus-provider/run.go +++ b/cmd/lotus-provider/run.go @@ -176,7 +176,7 @@ var runCmd = &cli.Command{ } } log.Infow("This lotus_provider instance handles", - "miner_addresses", maddrs, + "miner_addresses", minerAddressesToStrings(maddrs), "tasks", lo.Map(activeTasks, func(t harmonytask.TaskInterface, _ int) string { return t.TypeDetails().Name })) taskEngine, err := harmonytask.New(db, activeTasks, deps.listenAddr) @@ -457,3 +457,11 @@ func (p *ProviderAPI) Shutdown(context.Context) error { close(p.ShutdownChan) return nil } + +func minerAddressesToStrings(maddrs []dtypes.MinerAddress) []string { + strs := make([]string, len(maddrs)) + for i, addr := range maddrs { + strs[i] = address.Address(addr).String() + } + return strs +} From ccd74ac3bab9f59d3a5b526c3af2902ab0b90f7d Mon Sep 17 00:00:00 2001 From: "Andrew Jackson (Ajax)" Date: Wed, 6 Dec 2023 16:16:08 -0600 Subject: [PATCH 19/38] Merge pull request #11493 from filecoin-project/fix/lp-send-taskid-wait fix: lotus-provider: Wait for the correct taskID --- lib/harmony/harmonytask/harmonytask.go | 5 +++++ provider/lpmessage/sender.go | 20 ++++++++++++++++---- provider/lpwindow/recover_task.go | 2 +- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/lib/harmony/harmonytask/harmonytask.go b/lib/harmony/harmonytask/harmonytask.go index 595e5b63a..31b632975 100644 --- a/lib/harmony/harmonytask/harmonytask.go +++ b/lib/harmony/harmonytask/harmonytask.go @@ -146,6 +146,11 @@ func New( TaskTypeDetails: c.TypeDetails(), TaskEngine: e, } + + if len(h.Name) > 16 { + return nil, fmt.Errorf("task name too long: %s, max 16 characters", h.Name) + } + e.handlers = append(e.handlers, &h) e.taskMap[h.TaskTypeDetails.Name] = &h } diff --git a/provider/lpmessage/sender.go b/provider/lpmessage/sender.go index bee22ff69..0db0c0b51 100644 --- a/provider/lpmessage/sender.go +++ b/provider/lpmessage/sender.go @@ -324,6 +324,7 @@ func (s *Sender) Send(ctx context.Context, msg *types.Message, mss *api.MessageS return cid.Undef, xerrors.Errorf("marshaling message: %w", err) } + var sendTaskID *harmonytask.TaskID taskAdder(func(id harmonytask.TaskID, tx *harmonydb.Tx) (shouldCommit bool, seriousError error) { _, err := tx.Exec(`insert into message_sends (from_key, to_addr, send_reason, unsigned_data, unsigned_cid, send_task_id) values ($1, $2, $3, $4, $5, $6)`, msg.From.String(), msg.To.String(), reason, unsBytes.Bytes(), msg.Cid().String(), id) @@ -331,9 +332,15 @@ func (s *Sender) Send(ctx context.Context, msg *types.Message, mss *api.MessageS return false, xerrors.Errorf("inserting message into db: %w", err) } + sendTaskID = &id + return true, nil }) + if sendTaskID == nil { + return cid.Undef, xerrors.Errorf("failed to add task") + } + // wait for exec var ( pollInterval = 50 * time.Millisecond @@ -347,10 +354,10 @@ func (s *Sender) Send(ctx context.Context, msg *types.Message, mss *api.MessageS for { var err error - var sigCidStr, sendError string + var sigCidStr, sendError *string var sendSuccess *bool - err = s.db.QueryRow(ctx, `select signed_cid, send_success, send_error from message_sends where send_task_id = $1`, taskAdder).Scan(&sigCidStr, &sendSuccess, &sendError) + err = s.db.QueryRow(ctx, `select signed_cid, send_success, send_error from message_sends where send_task_id = $1`, &sendTaskID).Scan(&sigCidStr, &sendSuccess, &sendError) if err != nil { return cid.Undef, xerrors.Errorf("getting cid for task: %w", err) } @@ -366,10 +373,15 @@ func (s *Sender) Send(ctx context.Context, msg *types.Message, mss *api.MessageS continue } + if sigCidStr == nil || sendError == nil { + // should never happen because sendSuccess is already not null here + return cid.Undef, xerrors.Errorf("got null values for sigCidStr or sendError, this should never happen") + } + if !*sendSuccess { - sendErr = xerrors.Errorf("send error: %s", sendError) + sendErr = xerrors.Errorf("send error: %s", *sendError) } else { - sigCid, err = cid.Parse(sigCidStr) + sigCid, err = cid.Parse(*sigCidStr) if err != nil { return cid.Undef, xerrors.Errorf("parsing signed cid: %w", err) } diff --git a/provider/lpwindow/recover_task.go b/provider/lpwindow/recover_task.go index 6006f3c35..12f8522b5 100644 --- a/provider/lpwindow/recover_task.go +++ b/provider/lpwindow/recover_task.go @@ -217,7 +217,7 @@ func (w *WdPostRecoverDeclareTask) CanAccept(ids []harmonytask.TaskID, engine *h func (w *WdPostRecoverDeclareTask) TypeDetails() harmonytask.TaskTypeDetails { return harmonytask.TaskTypeDetails{ Max: 128, - Name: "WdPostRecoverDeclare", + Name: "WdPostRecover", Cost: resources.Resources{ Cpu: 1, Gpu: 0, From 194594426077816c85bdd70f99a9ccb083938aff Mon Sep 17 00:00:00 2001 From: "Andrew Jackson (Ajax)" Date: Thu, 7 Dec 2023 09:46:33 -0600 Subject: [PATCH 20/38] Merge pull request #11498 from filecoin-project/fix/harmony-reclaim harmony: Fix task reclaim on restart --- lib/harmony/harmonytask/harmonytask.go | 4 +-- lib/harmony/harmonytask/task_type_handler.go | 38 ++++++++++++-------- 2 files changed, 25 insertions(+), 17 deletions(-) diff --git a/lib/harmony/harmonytask/harmonytask.go b/lib/harmony/harmonytask/harmonytask.go index 31b632975..7577c5cf5 100644 --- a/lib/harmony/harmonytask/harmonytask.go +++ b/lib/harmony/harmonytask/harmonytask.go @@ -176,7 +176,7 @@ func New( continue // not really fatal, but not great } } - if !h.considerWork("recovered", []TaskID{TaskID(w.ID)}) { + if !h.considerWork(workSourceRecover, []TaskID{TaskID(w.ID)}) { log.Error("Strange: Unable to accept previously owned task: ", w.ID, w.Name) } } @@ -285,7 +285,7 @@ func (e *TaskEngine) pollerTryAllWork() { continue } if len(unownedTasks) > 0 { - accepted := v.considerWork("poller", unownedTasks) + accepted := v.considerWork(workSourcePoller, unownedTasks) if accepted { return // accept new work slowly and in priority order } diff --git a/lib/harmony/harmonytask/task_type_handler.go b/lib/harmony/harmonytask/task_type_handler.go index 79a156fef..34f7a5c3e 100644 --- a/lib/harmony/harmonytask/task_type_handler.go +++ b/lib/harmony/harmonytask/task_type_handler.go @@ -49,6 +49,11 @@ func (h *taskTypeHandler) AddTask(extra func(TaskID, *harmonydb.Tx) (bool, error } } +const ( + workSourcePoller = "poller" + workSourceRecover = "recovered" +) + // considerWork is called to attempt to start work on a task-id of this task type. // It presumes single-threaded calling, so there should not be a multi-threaded re-entry. // The only caller should be the one work poller thread. This does spin off other threads, @@ -87,22 +92,25 @@ top: return false } - // 4. Can we claim the work for our hostname? - ct, err := h.TaskEngine.db.Exec(h.TaskEngine.ctx, "UPDATE harmony_task SET owner_id=$1 WHERE id=$2 AND owner_id IS NULL", h.TaskEngine.ownerID, *tID) - if err != nil { - log.Error(err) - return false - } - if ct == 0 { - log.Infow("did not accept task", "task_id", strconv.Itoa(int(*tID)), "reason", "already Taken", "name", h.Name) - var tryAgain = make([]TaskID, 0, len(ids)-1) - for _, id := range ids { - if id != *tID { - tryAgain = append(tryAgain, id) - } + // if recovering we don't need to try to claim anything because those tasks are already claimed by us + if from != workSourceRecover { + // 4. Can we claim the work for our hostname? + ct, err := h.TaskEngine.db.Exec(h.TaskEngine.ctx, "UPDATE harmony_task SET owner_id=$1 WHERE id=$2 AND owner_id IS NULL", h.TaskEngine.ownerID, *tID) + if err != nil { + log.Error(err) + return false + } + if ct == 0 { + log.Infow("did not accept task", "task_id", strconv.Itoa(int(*tID)), "reason", "already Taken", "name", h.Name) + var tryAgain = make([]TaskID, 0, len(ids)-1) + for _, id := range ids { + if id != *tID { + tryAgain = append(tryAgain, id) + } + } + ids = tryAgain + goto top } - ids = tryAgain - goto top } h.Count.Add(1) From 0f6b83cdf2699fec5ada765165c69fc224f19673 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 11 Dec 2023 13:30:41 +0100 Subject: [PATCH 21/38] Merge pull request #11504 from filecoin-project/lp-wdposttaskcmd-format fix: lotus-provider: Fix log output format in wdPostTaskCmd --- cmd/lotus-provider/proving.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/lotus-provider/proving.go b/cmd/lotus-provider/proving.go index 577b5b5f9..a3211b176 100644 --- a/cmd/lotus-provider/proving.go +++ b/cmd/lotus-provider/proving.go @@ -117,7 +117,7 @@ var wdPostTaskCmd = &cli.Command{ } fmt.Print(".") } - log.Infof("Result:", result.String) + log.Infof("Result: %s", result.String) return nil }, } From 753b51df25b5666d1c39bafba066367992680b08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 11 Dec 2023 13:31:54 +0100 Subject: [PATCH 22/38] Merge pull request #11488 from filecoin-project/lpdocsgen lp docsgen --- Makefile | 4 +++- api/docgen/docgen.go | 4 ++++ documentation/en/api-v0-methods-provider.md | 25 +++++++++++++++++++++ 3 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 documentation/en/api-v0-methods-provider.md diff --git a/Makefile b/Makefile index 68d97227b..c3c46f71e 100644 --- a/Makefile +++ b/Makefile @@ -356,7 +356,7 @@ docsgen-md-bin: api-gen actors-gen docsgen-openrpc-bin: api-gen actors-gen $(GOCC) build $(GOFLAGS) -o docgen-openrpc ./api/docgen-openrpc/cmd -docsgen-md: docsgen-md-full docsgen-md-storage docsgen-md-worker +docsgen-md: docsgen-md-full docsgen-md-storage docsgen-md-worker docsgen-md-provider docsgen-md-full: docsgen-md-bin ./docgen-md "api/api_full.go" "FullNode" "api" "./api" > documentation/en/api-v1-unstable-methods.md @@ -365,6 +365,8 @@ docsgen-md-storage: docsgen-md-bin ./docgen-md "api/api_storage.go" "StorageMiner" "api" "./api" > documentation/en/api-v0-methods-miner.md docsgen-md-worker: docsgen-md-bin ./docgen-md "api/api_worker.go" "Worker" "api" "./api" > documentation/en/api-v0-methods-worker.md +docsgen-md-provider: docsgen-md-bin + ./docgen-md "api/api_lp.go" "Provider" "api" "./api" > documentation/en/api-v0-methods-provider.md docsgen-openrpc: docsgen-openrpc-full docsgen-openrpc-storage docsgen-openrpc-worker docsgen-openrpc-gateway diff --git a/api/docgen/docgen.go b/api/docgen/docgen.go index 018629600..5a05c8d0e 100644 --- a/api/docgen/docgen.go +++ b/api/docgen/docgen.go @@ -432,6 +432,10 @@ func GetAPIType(name, pkg string) (i interface{}, t reflect.Type, permStruct []r i = &api.GatewayStruct{} t = reflect.TypeOf(new(struct{ api.Gateway })).Elem() permStruct = append(permStruct, reflect.TypeOf(api.GatewayStruct{}.Internal)) + case "Provider": + i = &api.LotusProviderStruct{} + t = reflect.TypeOf(new(struct{ api.LotusProvider })).Elem() + permStruct = append(permStruct, reflect.TypeOf(api.LotusProviderStruct{}.Internal)) default: panic("unknown type") } diff --git a/documentation/en/api-v0-methods-provider.md b/documentation/en/api-v0-methods-provider.md new file mode 100644 index 000000000..fc4a2daf7 --- /dev/null +++ b/documentation/en/api-v0-methods-provider.md @@ -0,0 +1,25 @@ +# Groups +* [](#) + * [Shutdown](#Shutdown) + * [Version](#Version) +## + + +### Shutdown + + +Perms: admin + +Inputs: `null` + +Response: `{}` + +### Version + + +Perms: admin + +Inputs: `null` + +Response: `131840` + From 970ce52ab14f8bd9c5930f251d3d5eee40f6d8c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 11 Dec 2023 13:32:42 +0100 Subject: [PATCH 23/38] Merge pull request #11486 from filecoin-project/lpMigrateNicer do not suggest the default layer --- cmd/lotus-provider/migrate.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/cmd/lotus-provider/migrate.go b/cmd/lotus-provider/migrate.go index 819499402..3869c7dfb 100644 --- a/cmd/lotus-provider/migrate.go +++ b/cmd/lotus-provider/migrate.go @@ -231,12 +231,17 @@ func fromMiner(cctx *cli.Context) (err error) { dbSettings += ` --db-name="` + smCfg.HarmonyDB.Database + `"` } + var layerMaybe string + if name != "base" { + layerMaybe = "--layer=" + name + } + msg += ` To work with the config: ` + cliCommandColor(`lotus-provider `+dbSettings+` config help `) msg += ` To run Lotus Provider: in its own machine or cgroup without other files, use the command: -` + cliCommandColor(`lotus-provider `+dbSettings+` run --layers="`+name+`"`) +` + cliCommandColor(`lotus-provider `+dbSettings+` run `+layerMaybe) fmt.Println(msg) return nil } From 3569e4e10abfafa1238ee670468dca295af9a997 Mon Sep 17 00:00:00 2001 From: Aarsh Shah Date: Thu, 14 Dec 2023 12:21:39 +0530 Subject: [PATCH 24/38] update libp2p deps --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 59db622c9..11a4a5d22 100644 --- a/go.mod +++ b/go.mod @@ -110,7 +110,7 @@ require ( github.com/kelseyhightower/envconfig v1.4.0 github.com/koalacxr/quantile v0.0.1 github.com/libp2p/go-buffer-pool v0.1.0 - github.com/libp2p/go-libp2p v0.31.0 + github.com/libp2p/go-libp2p v0.31.1 github.com/libp2p/go-libp2p-consensus v0.0.1 github.com/libp2p/go-libp2p-gorpc v0.5.0 github.com/libp2p/go-libp2p-kad-dht v0.24.0 @@ -305,7 +305,7 @@ require ( github.com/prometheus/statsd_exporter v0.22.7 // indirect github.com/quic-go/qpack v0.4.0 // indirect github.com/quic-go/qtls-go1-20 v0.3.3 // indirect - github.com/quic-go/quic-go v0.38.1 // indirect + github.com/quic-go/quic-go v0.38.2 // indirect github.com/quic-go/webtransport-go v0.5.3 // indirect github.com/rivo/uniseg v0.1.0 // indirect github.com/rs/cors v1.7.0 // indirect diff --git a/go.sum b/go.sum index a1bbb9473..b0f13f5bb 100644 --- a/go.sum +++ b/go.sum @@ -984,8 +984,8 @@ github.com/libp2p/go-libp2p v0.7.0/go.mod h1:hZJf8txWeCduQRDC/WSqBGMxaTHCOYHt2xS github.com/libp2p/go-libp2p v0.7.4/go.mod h1:oXsBlTLF1q7pxr+9w6lqzS1ILpyHsaBPniVO7zIHGMw= github.com/libp2p/go-libp2p v0.8.1/go.mod h1:QRNH9pwdbEBpx5DTJYg+qxcVaDMAz3Ee/qDKwXujH5o= github.com/libp2p/go-libp2p v0.14.3/go.mod h1:d12V4PdKbpL0T1/gsUNN8DfgMuRPDX8bS2QxCZlwRH0= -github.com/libp2p/go-libp2p v0.31.0 h1:LFShhP8F6xthWiBBq3euxbKjZsoRajVEyBS9snfHxYg= -github.com/libp2p/go-libp2p v0.31.0/go.mod h1:W/FEK1c/t04PbRH3fA9i5oucu5YcgrG0JVoBWT1B7Eg= +github.com/libp2p/go-libp2p v0.31.1 h1:mUiFPwdzC2zMLIATKVddjCuPXVbtC3BsKKVPMs4+jzY= +github.com/libp2p/go-libp2p v0.31.1/go.mod h1:+9TCv+XySSOdaxPF1WIgTK8rXP9jBb8WbemlMCSXGsU= github.com/libp2p/go-libp2p-asn-util v0.3.0 h1:gMDcMyYiZKkocGXDQ5nsUQyquC9+H+iLEQHwOCZ7s8s= github.com/libp2p/go-libp2p-asn-util v0.3.0/go.mod h1:B1mcOrKUE35Xq/ASTmQ4tN3LNzVVaMNmq2NACuqyB9w= github.com/libp2p/go-libp2p-autonat v0.1.0/go.mod h1:1tLf2yXxiE/oKGtDwPYWTSYG3PtvYlJmg7NeVtPRqH8= @@ -1475,8 +1475,8 @@ github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo= github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A= github.com/quic-go/qtls-go1-20 v0.3.3 h1:17/glZSLI9P9fDAeyCHBFSWSqJcwx1byhLwP5eUIDCM= github.com/quic-go/qtls-go1-20 v0.3.3/go.mod h1:X9Nh97ZL80Z+bX/gUXMbipO6OxdiDi58b/fMC9mAL+k= -github.com/quic-go/quic-go v0.38.1 h1:M36YWA5dEhEeT+slOu/SwMEucbYd0YFidxG3KlGPZaE= -github.com/quic-go/quic-go v0.38.1/go.mod h1:ijnZM7JsFIkp4cRyjxJNIzdSfCLmUMg9wdyhGmg+SN4= +github.com/quic-go/quic-go v0.38.2 h1:VWv/6gxIoB8hROQJhx1JEyiegsUQ+zMN3em3kynTGdg= +github.com/quic-go/quic-go v0.38.2/go.mod h1:ijnZM7JsFIkp4cRyjxJNIzdSfCLmUMg9wdyhGmg+SN4= github.com/quic-go/webtransport-go v0.5.3 h1:5XMlzemqB4qmOlgIus5zB45AcZ2kCgCy2EptUrfOPWU= github.com/quic-go/webtransport-go v0.5.3/go.mod h1:OhmmgJIzTTqXK5xvtuX0oBpLV2GkLWNDA+UeTGJXErU= github.com/raulk/clock v1.1.0 h1:dpb29+UKMbLqiU/jqIJptgLR1nn23HLgMY0sTCDza5Y= From 74aaa570abdc564ef8efca1379254693c2935c35 Mon Sep 17 00:00:00 2001 From: Aarsh Shah Date: Thu, 14 Dec 2023 12:27:25 +0530 Subject: [PATCH 25/38] Revert "update libp2p deps" This reverts commit 3569e4e10abfafa1238ee670468dca295af9a997. --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 11a4a5d22..59db622c9 100644 --- a/go.mod +++ b/go.mod @@ -110,7 +110,7 @@ require ( github.com/kelseyhightower/envconfig v1.4.0 github.com/koalacxr/quantile v0.0.1 github.com/libp2p/go-buffer-pool v0.1.0 - github.com/libp2p/go-libp2p v0.31.1 + github.com/libp2p/go-libp2p v0.31.0 github.com/libp2p/go-libp2p-consensus v0.0.1 github.com/libp2p/go-libp2p-gorpc v0.5.0 github.com/libp2p/go-libp2p-kad-dht v0.24.0 @@ -305,7 +305,7 @@ require ( github.com/prometheus/statsd_exporter v0.22.7 // indirect github.com/quic-go/qpack v0.4.0 // indirect github.com/quic-go/qtls-go1-20 v0.3.3 // indirect - github.com/quic-go/quic-go v0.38.2 // indirect + github.com/quic-go/quic-go v0.38.1 // indirect github.com/quic-go/webtransport-go v0.5.3 // indirect github.com/rivo/uniseg v0.1.0 // indirect github.com/rs/cors v1.7.0 // indirect diff --git a/go.sum b/go.sum index b0f13f5bb..a1bbb9473 100644 --- a/go.sum +++ b/go.sum @@ -984,8 +984,8 @@ github.com/libp2p/go-libp2p v0.7.0/go.mod h1:hZJf8txWeCduQRDC/WSqBGMxaTHCOYHt2xS github.com/libp2p/go-libp2p v0.7.4/go.mod h1:oXsBlTLF1q7pxr+9w6lqzS1ILpyHsaBPniVO7zIHGMw= github.com/libp2p/go-libp2p v0.8.1/go.mod h1:QRNH9pwdbEBpx5DTJYg+qxcVaDMAz3Ee/qDKwXujH5o= github.com/libp2p/go-libp2p v0.14.3/go.mod h1:d12V4PdKbpL0T1/gsUNN8DfgMuRPDX8bS2QxCZlwRH0= -github.com/libp2p/go-libp2p v0.31.1 h1:mUiFPwdzC2zMLIATKVddjCuPXVbtC3BsKKVPMs4+jzY= -github.com/libp2p/go-libp2p v0.31.1/go.mod h1:+9TCv+XySSOdaxPF1WIgTK8rXP9jBb8WbemlMCSXGsU= +github.com/libp2p/go-libp2p v0.31.0 h1:LFShhP8F6xthWiBBq3euxbKjZsoRajVEyBS9snfHxYg= +github.com/libp2p/go-libp2p v0.31.0/go.mod h1:W/FEK1c/t04PbRH3fA9i5oucu5YcgrG0JVoBWT1B7Eg= github.com/libp2p/go-libp2p-asn-util v0.3.0 h1:gMDcMyYiZKkocGXDQ5nsUQyquC9+H+iLEQHwOCZ7s8s= github.com/libp2p/go-libp2p-asn-util v0.3.0/go.mod h1:B1mcOrKUE35Xq/ASTmQ4tN3LNzVVaMNmq2NACuqyB9w= github.com/libp2p/go-libp2p-autonat v0.1.0/go.mod h1:1tLf2yXxiE/oKGtDwPYWTSYG3PtvYlJmg7NeVtPRqH8= @@ -1475,8 +1475,8 @@ github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo= github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A= github.com/quic-go/qtls-go1-20 v0.3.3 h1:17/glZSLI9P9fDAeyCHBFSWSqJcwx1byhLwP5eUIDCM= github.com/quic-go/qtls-go1-20 v0.3.3/go.mod h1:X9Nh97ZL80Z+bX/gUXMbipO6OxdiDi58b/fMC9mAL+k= -github.com/quic-go/quic-go v0.38.2 h1:VWv/6gxIoB8hROQJhx1JEyiegsUQ+zMN3em3kynTGdg= -github.com/quic-go/quic-go v0.38.2/go.mod h1:ijnZM7JsFIkp4cRyjxJNIzdSfCLmUMg9wdyhGmg+SN4= +github.com/quic-go/quic-go v0.38.1 h1:M36YWA5dEhEeT+slOu/SwMEucbYd0YFidxG3KlGPZaE= +github.com/quic-go/quic-go v0.38.1/go.mod h1:ijnZM7JsFIkp4cRyjxJNIzdSfCLmUMg9wdyhGmg+SN4= github.com/quic-go/webtransport-go v0.5.3 h1:5XMlzemqB4qmOlgIus5zB45AcZ2kCgCy2EptUrfOPWU= github.com/quic-go/webtransport-go v0.5.3/go.mod h1:OhmmgJIzTTqXK5xvtuX0oBpLV2GkLWNDA+UeTGJXErU= github.com/raulk/clock v1.1.0 h1:dpb29+UKMbLqiU/jqIJptgLR1nn23HLgMY0sTCDza5Y= From b3270ee3056ef34ad0cc1b5c102eda8f46f0ac00 Mon Sep 17 00:00:00 2001 From: Aarsh Shah Date: Thu, 14 Dec 2023 12:29:18 +0530 Subject: [PATCH 26/38] update libp2p deps --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 59db622c9..11a4a5d22 100644 --- a/go.mod +++ b/go.mod @@ -110,7 +110,7 @@ require ( github.com/kelseyhightower/envconfig v1.4.0 github.com/koalacxr/quantile v0.0.1 github.com/libp2p/go-buffer-pool v0.1.0 - github.com/libp2p/go-libp2p v0.31.0 + github.com/libp2p/go-libp2p v0.31.1 github.com/libp2p/go-libp2p-consensus v0.0.1 github.com/libp2p/go-libp2p-gorpc v0.5.0 github.com/libp2p/go-libp2p-kad-dht v0.24.0 @@ -305,7 +305,7 @@ require ( github.com/prometheus/statsd_exporter v0.22.7 // indirect github.com/quic-go/qpack v0.4.0 // indirect github.com/quic-go/qtls-go1-20 v0.3.3 // indirect - github.com/quic-go/quic-go v0.38.1 // indirect + github.com/quic-go/quic-go v0.38.2 // indirect github.com/quic-go/webtransport-go v0.5.3 // indirect github.com/rivo/uniseg v0.1.0 // indirect github.com/rs/cors v1.7.0 // indirect diff --git a/go.sum b/go.sum index a1bbb9473..b0f13f5bb 100644 --- a/go.sum +++ b/go.sum @@ -984,8 +984,8 @@ github.com/libp2p/go-libp2p v0.7.0/go.mod h1:hZJf8txWeCduQRDC/WSqBGMxaTHCOYHt2xS github.com/libp2p/go-libp2p v0.7.4/go.mod h1:oXsBlTLF1q7pxr+9w6lqzS1ILpyHsaBPniVO7zIHGMw= github.com/libp2p/go-libp2p v0.8.1/go.mod h1:QRNH9pwdbEBpx5DTJYg+qxcVaDMAz3Ee/qDKwXujH5o= github.com/libp2p/go-libp2p v0.14.3/go.mod h1:d12V4PdKbpL0T1/gsUNN8DfgMuRPDX8bS2QxCZlwRH0= -github.com/libp2p/go-libp2p v0.31.0 h1:LFShhP8F6xthWiBBq3euxbKjZsoRajVEyBS9snfHxYg= -github.com/libp2p/go-libp2p v0.31.0/go.mod h1:W/FEK1c/t04PbRH3fA9i5oucu5YcgrG0JVoBWT1B7Eg= +github.com/libp2p/go-libp2p v0.31.1 h1:mUiFPwdzC2zMLIATKVddjCuPXVbtC3BsKKVPMs4+jzY= +github.com/libp2p/go-libp2p v0.31.1/go.mod h1:+9TCv+XySSOdaxPF1WIgTK8rXP9jBb8WbemlMCSXGsU= github.com/libp2p/go-libp2p-asn-util v0.3.0 h1:gMDcMyYiZKkocGXDQ5nsUQyquC9+H+iLEQHwOCZ7s8s= github.com/libp2p/go-libp2p-asn-util v0.3.0/go.mod h1:B1mcOrKUE35Xq/ASTmQ4tN3LNzVVaMNmq2NACuqyB9w= github.com/libp2p/go-libp2p-autonat v0.1.0/go.mod h1:1tLf2yXxiE/oKGtDwPYWTSYG3PtvYlJmg7NeVtPRqH8= @@ -1475,8 +1475,8 @@ github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo= github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A= github.com/quic-go/qtls-go1-20 v0.3.3 h1:17/glZSLI9P9fDAeyCHBFSWSqJcwx1byhLwP5eUIDCM= github.com/quic-go/qtls-go1-20 v0.3.3/go.mod h1:X9Nh97ZL80Z+bX/gUXMbipO6OxdiDi58b/fMC9mAL+k= -github.com/quic-go/quic-go v0.38.1 h1:M36YWA5dEhEeT+slOu/SwMEucbYd0YFidxG3KlGPZaE= -github.com/quic-go/quic-go v0.38.1/go.mod h1:ijnZM7JsFIkp4cRyjxJNIzdSfCLmUMg9wdyhGmg+SN4= +github.com/quic-go/quic-go v0.38.2 h1:VWv/6gxIoB8hROQJhx1JEyiegsUQ+zMN3em3kynTGdg= +github.com/quic-go/quic-go v0.38.2/go.mod h1:ijnZM7JsFIkp4cRyjxJNIzdSfCLmUMg9wdyhGmg+SN4= github.com/quic-go/webtransport-go v0.5.3 h1:5XMlzemqB4qmOlgIus5zB45AcZ2kCgCy2EptUrfOPWU= github.com/quic-go/webtransport-go v0.5.3/go.mod h1:OhmmgJIzTTqXK5xvtuX0oBpLV2GkLWNDA+UeTGJXErU= github.com/raulk/clock v1.1.0 h1:dpb29+UKMbLqiU/jqIJptgLR1nn23HLgMY0sTCDza5Y= From ee7c251a90a11d3536b2b99b06c273cd9a299cf1 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Mon, 18 Dec 2023 15:09:52 -0500 Subject: [PATCH 27/38] Merge pull request #11533 from filecoin-project/asr/speedup-fork-sync feat: syncer: optimize syncFork for one-epoch forks --- chain/sync.go | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/chain/sync.go b/chain/sync.go index 1b9a302f7..c61c9f310 100644 --- a/chain/sync.go +++ b/chain/sync.go @@ -886,6 +886,35 @@ func (syncer *Syncer) syncFork(ctx context.Context, incoming *types.TipSet, know } } + incomingParentsTsk := incoming.Parents() + commonParent := false + for _, incomingParent := range incomingParentsTsk.Cids() { + if known.Contains(incomingParent) { + commonParent = true + } + } + + if commonParent { + // known contains at least one of incoming's Parents => the common ancestor is known's Parents (incoming's Grandparents) + // in this case, we need to return {incoming, incoming.Parents()} + incomingParents, err := syncer.store.LoadTipSet(ctx, incomingParentsTsk) + if err != nil { + // fallback onto the network + tips, err := syncer.Exchange.GetBlocks(ctx, incoming.Parents(), 1) + if err != nil { + return nil, xerrors.Errorf("failed to fetch incomingParents from the network: %w", err) + } + + if len(tips) == 0 { + return nil, xerrors.Errorf("network didn't return any tipsets") + } + + incomingParents = tips[0] + } + + return []*types.TipSet{incoming, incomingParents}, nil + } + // TODO: Does this mean we always ask for ForkLengthThreshold blocks from the network, even if we just need, like, 2? Yes. // Would it not be better to ask in smaller chunks, given that an ~ForkLengthThreshold is very rare? tips, err := syncer.Exchange.GetBlocks(ctx, incoming.Parents(), int(build.ForkLengthThreshold)) From b1c0d3cce5bf060a8c25372d69e15b39c11eb0eb Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 19 Dec 2023 16:39:52 -0500 Subject: [PATCH 28/38] fix: sync: do not include incoming in return of syncFork (#11541) --- chain/sync.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/chain/sync.go b/chain/sync.go index c61c9f310..4dccc2036 100644 --- a/chain/sync.go +++ b/chain/sync.go @@ -896,7 +896,7 @@ func (syncer *Syncer) syncFork(ctx context.Context, incoming *types.TipSet, know if commonParent { // known contains at least one of incoming's Parents => the common ancestor is known's Parents (incoming's Grandparents) - // in this case, we need to return {incoming, incoming.Parents()} + // in this case, we need to return {incoming.Parents()} incomingParents, err := syncer.store.LoadTipSet(ctx, incomingParentsTsk) if err != nil { // fallback onto the network @@ -912,7 +912,7 @@ func (syncer *Syncer) syncFork(ctx context.Context, incoming *types.TipSet, know incomingParents = tips[0] } - return []*types.TipSet{incoming, incomingParents}, nil + return []*types.TipSet{incomingParents}, nil } // TODO: Does this mean we always ask for ForkLengthThreshold blocks from the network, even if we just need, like, 2? Yes. From d612a857cc0a92af10ad1c2afbf25ace9eb8570c Mon Sep 17 00:00:00 2001 From: "Andrew Jackson (Ajax)" Date: Thu, 4 Jan 2024 07:42:30 -0800 Subject: [PATCH 29/38] Merge pull request #11550 from filecoin-project/fix/worker-multipart-post-err fix: wdpost: fix vanilla proof indexes --- storage/sealer/worker_local.go | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/storage/sealer/worker_local.go b/storage/sealer/worker_local.go index 9f2f2efdc..7fc494955 100644 --- a/storage/sealer/worker_local.go +++ b/storage/sealer/worker_local.go @@ -664,7 +664,7 @@ func (l *LocalWorker) GenerateWindowPoStAdv(ctx context.Context, ppt abi.Registe var wg sync.WaitGroup wg.Add(len(sectors)) - vproofs := make([][]byte, 0, len(sectors)) + vproofs := make([][]byte, len(sectors)) for i, s := range sectors { if l.challengeThrottle != nil { @@ -702,8 +702,7 @@ func (l *LocalWorker) GenerateWindowPoStAdv(ctx context.Context, ppt abi.Registe return } - //vproofs[i] = vanilla // todo substitutes?? - vproofs = append(vproofs, vanilla) + vproofs[i] = vanilla }(i, s) } wg.Wait() @@ -717,6 +716,22 @@ func (l *LocalWorker) GenerateWindowPoStAdv(ctx context.Context, ppt abi.Registe return storiface.WindowPoStResult{Skipped: skipped}, nil } + // compact skipped sectors + var skippedSoFar int + for i := range vproofs { + if len(vproofs[i]) == 0 { + skippedSoFar++ + continue + } + + if skippedSoFar > 0 { + vproofs[i-skippedSoFar] = vproofs[i] + } + } + + vproofs = vproofs[:len(vproofs)-skippedSoFar] + + // compute the PoSt! res, err := sb.GenerateWindowPoStWithVanilla(ctx, ppt, mid, randomness, vproofs, partitionIdx) r := storiface.WindowPoStResult{ PoStProofs: res, From f23e5a4938f6d10f909c72915bda92ef8a117168 Mon Sep 17 00:00:00 2001 From: "Andrew Jackson (Ajax)" Date: Mon, 18 Dec 2023 08:51:48 -0800 Subject: [PATCH 30/38] Merge pull request #11535 from filecoin-project/lp-generate-cli-docs fix: docs: Modify generate-lotus-cli.py to ignoring aliases. --- documentation/en/cli-lotus-miner.md | 27 +- documentation/en/cli-lotus-provider.md | 410 +++++++++++++++++++++++++ documentation/en/cli-lotus.md | 88 +++++- scripts/generate-lotus-cli.py | 5 +- 4 files changed, 518 insertions(+), 12 deletions(-) create mode 100644 documentation/en/cli-lotus-provider.md diff --git a/documentation/en/cli-lotus-miner.md b/documentation/en/cli-lotus-miner.md index 5519bbc6b..ee26f462c 100644 --- a/documentation/en/cli-lotus-miner.md +++ b/documentation/en/cli-lotus-miner.md @@ -231,8 +231,19 @@ OPTIONS: --help, -h show help ``` -#### lotus-miner actor set-addresses, set-addrs +### lotus-miner actor set-addresses ``` +NAME: + lotus-miner actor set-addresses - set addresses that your miner can be publicly dialed on + +USAGE: + lotus-miner actor set-addresses [command options] + +OPTIONS: + --from value optionally specify the account to send the message from + --gas-limit value set gas limit (default: 0) + --unset unset address (default: false) + --help, -h show help ``` ### lotus-miner actor withdraw @@ -1161,8 +1172,20 @@ OPTIONS: --help, -h show help ``` -##### lotus-miner proving compute windowed-post, window-post +#### lotus-miner proving compute windowed-post ``` +NAME: + lotus-miner proving compute windowed-post - Compute WindowPoSt for a specific deadline + +USAGE: + lotus-miner proving compute windowed-post [command options] [deadline index] + +DESCRIPTION: + Note: This command is intended to be used to verify PoSt compute performance. + It will not send any messages to the chain. + +OPTIONS: + --help, -h show help ``` ### lotus-miner proving recover-faults diff --git a/documentation/en/cli-lotus-provider.md b/documentation/en/cli-lotus-provider.md new file mode 100644 index 000000000..de77697e3 --- /dev/null +++ b/documentation/en/cli-lotus-provider.md @@ -0,0 +1,410 @@ +# lotus-provider +``` +NAME: + lotus-provider - Filecoin decentralized storage network provider + +USAGE: + lotus-provider [global options] command [command options] [arguments...] + +VERSION: + 1.25.3-dev + +COMMANDS: + run Start a lotus provider process + stop Stop a running lotus provider + config Manage node config by layers. The layer 'base' will always be applied. + test Utility functions for testing + version Print version + help, h Shows a list of commands or help for one command + DEVELOPER: + auth Manage RPC permissions + log Manage logging + wait-api Wait for lotus api to come online + fetch-params Fetch proving parameters + +GLOBAL OPTIONS: + --color use color in display output (default: depends on output being a TTY) + --db-host value Command separated list of hostnames for yugabyte cluster (default: "yugabyte") [$LOTUS_DB_HOST] + --db-name value (default: "yugabyte") [$LOTUS_DB_NAME, $LOTUS_HARMONYDB_HOSTS] + --db-user value (default: "yugabyte") [$LOTUS_DB_USER, $LOTUS_HARMONYDB_USERNAME] + --db-password value (default: "yugabyte") [$LOTUS_DB_PASSWORD, $LOTUS_HARMONYDB_PASSWORD] + --layers value (default: "base") [$LOTUS_LAYERS, $LOTUS_CONFIG_LAYERS] + --repo-path value (default: "~/.lotusprovider") [$LOTUS_REPO_PATH] + --vv enables very verbose mode, useful for debugging the CLI (default: false) + --help, -h show help + --version, -v print the version +``` + +## lotus-provider run +``` +NAME: + lotus-provider run - Start a lotus provider process + +USAGE: + lotus-provider run [command options] [arguments...] + +OPTIONS: + --listen value host address and port the worker api will listen on (default: "0.0.0.0:12300") [$LOTUS_WORKER_LISTEN] + --nosync don't check full-node sync status (default: false) + --manage-fdlimit manage open file limit (default: true) + --layers value [ --layers value ] list of layers to be interpreted (atop defaults). Default: base (default: "base") + --storage-json value path to json file containing storage config (default: "~/.lotus-provider/storage.json") + --journal value path to journal files (default: "~/.lotus-provider/") + --help, -h show help +``` + +## lotus-provider stop +``` +NAME: + lotus-provider stop - Stop a running lotus provider + +USAGE: + lotus-provider stop [command options] [arguments...] + +OPTIONS: + --help, -h show help +``` + +## lotus-provider config +``` +NAME: + lotus-provider config - Manage node config by layers. The layer 'base' will always be applied. + +USAGE: + lotus-provider config command [command options] [arguments...] + +COMMANDS: + default, defaults Print default node config + set, add, update, create Set a config layer or the base by providing a filename or stdin. + get, cat, show Get a config layer by name. You may want to pipe the output to a file, or use 'less' + list, ls List config layers you can get. + interpret, view, stacked, stack Interpret stacked config layers by this version of lotus-provider, with system-generated comments. + remove, rm, del, delete Remove a named config layer. + from-miner Express a database config (for lotus-provider) from an existing miner. + help, h Shows a list of commands or help for one command + +OPTIONS: + --help, -h show help +``` + +### lotus-provider config default +``` +NAME: + lotus-provider config default - Print default node config + +USAGE: + lotus-provider config default [command options] [arguments...] + +OPTIONS: + --no-comment don't comment default values (default: false) + --help, -h show help +``` + +### lotus-provider config set +``` +NAME: + lotus-provider config set - Set a config layer or the base by providing a filename or stdin. + +USAGE: + lotus-provider config set [command options] a layer's file name + +OPTIONS: + --title value title of the config layer (req'd for stdin) + --help, -h show help +``` + +### lotus-provider config get +``` +NAME: + lotus-provider config get - Get a config layer by name. You may want to pipe the output to a file, or use 'less' + +USAGE: + lotus-provider config get [command options] layer name + +OPTIONS: + --help, -h show help +``` + +### lotus-provider config list +``` +NAME: + lotus-provider config list - List config layers you can get. + +USAGE: + lotus-provider config list [command options] [arguments...] + +OPTIONS: + --help, -h show help +``` + +### lotus-provider config interpret +``` +NAME: + lotus-provider config interpret - Interpret stacked config layers by this version of lotus-provider, with system-generated comments. + +USAGE: + lotus-provider config interpret [command options] a list of layers to be interpreted as the final config + +OPTIONS: + --layers value [ --layers value ] comma or space separated list of layers to be interpreted (default: "base") + --help, -h show help +``` + +### lotus-provider config remove +``` +NAME: + lotus-provider config remove - Remove a named config layer. + +USAGE: + lotus-provider config remove [command options] [arguments...] + +OPTIONS: + --help, -h show help +``` + +### lotus-provider config from-miner +``` +NAME: + lotus-provider config from-miner - Express a database config (for lotus-provider) from an existing miner. + +USAGE: + lotus-provider config from-miner [command options] [arguments...] + +DESCRIPTION: + Express a database config (for lotus-provider) from an existing miner. + +OPTIONS: + --miner-repo value, --storagerepo value Specify miner repo path. flag(storagerepo) and env(LOTUS_STORAGE_PATH) are DEPRECATION, will REMOVE SOON (default: "~/.lotusminer") [$LOTUS_MINER_PATH, $LOTUS_STORAGE_PATH] + --to-layer value, -t value The layer name for this data push. 'base' is recommended for single-miner setup. + --overwrite, -o Use this with --to-layer to replace an existing layer (default: false) + --help, -h show help +``` + +## lotus-provider test +``` +NAME: + lotus-provider test - Utility functions for testing + +USAGE: + lotus-provider test command [command options] [arguments...] + +COMMANDS: + window-post, wd, windowpost, wdpost Compute a proof-of-spacetime for a sector (requires the sector to be pre-sealed). These will not send to the chain. + help, h Shows a list of commands or help for one command + +OPTIONS: + --help, -h show help +``` + +### lotus-provider test window-post +``` +NAME: + lotus-provider test window-post - Compute a proof-of-spacetime for a sector (requires the sector to be pre-sealed). These will not send to the chain. + +USAGE: + lotus-provider test window-post command [command options] [arguments...] + +COMMANDS: + here, cli Compute WindowPoSt for performance and configuration testing. + task, scheduled, schedule, async, asynchronous Test the windowpost scheduler by running it on the next available lotus-provider. + help, h Shows a list of commands or help for one command + +OPTIONS: + --help, -h show help +``` + +#### lotus-provider test window-post here +``` +NAME: + lotus-provider test window-post here - Compute WindowPoSt for performance and configuration testing. + +USAGE: + lotus-provider test window-post here [command options] [deadline index] + +DESCRIPTION: + Note: This command is intended to be used to verify PoSt compute performance. + It will not send any messages to the chain. Since it can compute any deadline, output may be incorrectly timed for the chain. + +OPTIONS: + --deadline value deadline to compute WindowPoSt for (default: 0) + --layers value [ --layers value ] list of layers to be interpreted (atop defaults). Default: base (default: "base") + --storage-json value path to json file containing storage config (default: "~/.lotus-provider/storage.json") + --partition value partition to compute WindowPoSt for (default: 0) + --help, -h show help +``` + +#### lotus-provider test window-post task +``` +NAME: + lotus-provider test window-post task - Test the windowpost scheduler by running it on the next available lotus-provider. + +USAGE: + lotus-provider test window-post task [command options] [arguments...] + +OPTIONS: + --deadline value deadline to compute WindowPoSt for (default: 0) + --layers value [ --layers value ] list of layers to be interpreted (atop defaults). Default: base (default: "base") + --help, -h show help +``` + +## lotus-provider version +``` +NAME: + lotus-provider version - Print version + +USAGE: + lotus-provider version [command options] [arguments...] + +OPTIONS: + --help, -h show help +``` + +## lotus-provider auth +``` +NAME: + lotus-provider auth - Manage RPC permissions + +USAGE: + lotus-provider auth command [command options] [arguments...] + +COMMANDS: + create-token Create token + api-info Get token with API info required to connect to this node + help, h Shows a list of commands or help for one command + +OPTIONS: + --help, -h show help +``` + +### lotus-provider auth create-token +``` +NAME: + lotus-provider auth create-token - Create token + +USAGE: + lotus-provider auth create-token [command options] [arguments...] + +OPTIONS: + --perm value permission to assign to the token, one of: read, write, sign, admin + --help, -h show help +``` + +### lotus-provider auth api-info +``` +NAME: + lotus-provider auth api-info - Get token with API info required to connect to this node + +USAGE: + lotus-provider auth api-info [command options] [arguments...] + +OPTIONS: + --perm value permission to assign to the token, one of: read, write, sign, admin + --help, -h show help +``` + +## lotus-provider log +``` +NAME: + lotus-provider log - Manage logging + +USAGE: + lotus-provider log command [command options] [arguments...] + +COMMANDS: + list List log systems + set-level Set log level + alerts Get alert states + help, h Shows a list of commands or help for one command + +OPTIONS: + --help, -h show help +``` + +### lotus-provider log list +``` +NAME: + lotus-provider log list - List log systems + +USAGE: + lotus-provider log list [command options] [arguments...] + +OPTIONS: + --help, -h show help +``` + +### lotus-provider log set-level +``` +NAME: + lotus-provider log set-level - Set log level + +USAGE: + lotus-provider log set-level [command options] [level] + +DESCRIPTION: + Set the log level for logging systems: + + The system flag can be specified multiple times. + + eg) log set-level --system chain --system chainxchg debug + + Available Levels: + debug + info + warn + error + + Environment Variables: + GOLOG_LOG_LEVEL - Default log level for all log systems + GOLOG_LOG_FMT - Change output log format (json, nocolor) + GOLOG_FILE - Write logs to file + GOLOG_OUTPUT - Specify whether to output to file, stderr, stdout or a combination, i.e. file+stderr + + +OPTIONS: + --system value [ --system value ] limit to log system + --help, -h show help +``` + +### lotus-provider log alerts +``` +NAME: + lotus-provider log alerts - Get alert states + +USAGE: + lotus-provider log alerts [command options] [arguments...] + +OPTIONS: + --all get all (active and inactive) alerts (default: false) + --help, -h show help +``` + +## lotus-provider wait-api +``` +NAME: + lotus-provider wait-api - Wait for lotus api to come online + +USAGE: + lotus-provider wait-api [command options] [arguments...] + +CATEGORY: + DEVELOPER + +OPTIONS: + --timeout value duration to wait till fail (default: 30s) + --help, -h show help +``` + +## lotus-provider fetch-params +``` +NAME: + lotus-provider fetch-params - Fetch proving parameters + +USAGE: + lotus-provider fetch-params [command options] [sectorSize] + +CATEGORY: + DEVELOPER + +OPTIONS: + --help, -h show help +``` diff --git a/documentation/en/cli-lotus.md b/documentation/en/cli-lotus.md index c752a3600..b488686ab 100644 --- a/documentation/en/cli-lotus.md +++ b/documentation/en/cli-lotus.md @@ -1807,8 +1807,16 @@ OPTIONS: --help, -h show help ``` -#### lotus state sector, sector-info +### lotus state sector ``` +NAME: + lotus state sector - Get miner sector info + +USAGE: + lotus state sector [command options] [minerAddress] [sectorNumber] + +OPTIONS: + --help, -h show help ``` ### lotus state get-actor @@ -1937,12 +1945,29 @@ OPTIONS: --help, -h show help ``` -#### lotus state wait-msg, wait-message +### lotus state wait-msg ``` +NAME: + lotus state wait-msg - Wait for a message to appear on chain + +USAGE: + lotus state wait-msg [command options] [messageCid] + +OPTIONS: + --timeout value (default: "10m") + --help, -h show help ``` -#### lotus state search-msg, search-message +### lotus state search-msg ``` +NAME: + lotus state search-msg - Search to see whether a message has appeared on chain + +USAGE: + lotus state search-msg [command options] [messageCid] + +OPTIONS: + --help, -h show help ``` ### lotus state miner-info @@ -2080,8 +2105,17 @@ OPTIONS: --help, -h show help ``` -#### lotus chain get-block, getblock +### lotus chain get-block ``` +NAME: + lotus chain get-block - Get a block and print its details + +USAGE: + lotus chain get-block [command options] [blockCid] + +OPTIONS: + --raw print just the raw block header (default: false) + --help, -h show help ``` ### lotus chain read-obj @@ -2132,16 +2166,46 @@ OPTIONS: --help, -h show help ``` -##### lotus chain getmessage, get-message, get-msg +### lotus chain getmessage ``` +NAME: + lotus chain getmessage - Get and print a message by its cid + +USAGE: + lotus chain getmessage [command options] [messageCid] + +OPTIONS: + --help, -h show help ``` -#### lotus chain sethead, set-head +### lotus chain sethead ``` +NAME: + lotus chain sethead - manually set the local nodes head tipset (Caution: normally only used for recovery) + +USAGE: + lotus chain sethead [command options] [tipsetkey] + +OPTIONS: + --genesis reset head to genesis (default: false) + --epoch value reset head to given epoch (default: 0) + --help, -h show help ``` -#### lotus chain list, love +### lotus chain list ``` +NAME: + lotus chain list - View a segment of the chain + +USAGE: + lotus chain list [command options] [arguments...] + +OPTIONS: + --height value (default: current head) + --count value (default: 30) + --format value specify the format to print out tipsets (default: ": (