From d85d4f60946557e76629a5777997731810965f48 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Wed, 13 Jul 2022 08:54:19 -0400 Subject: [PATCH 001/185] butterfly artifacts --- build/bootstrap/butterflynet.pi | 4 ++-- build/genesis/butterflynet.car | Bin 2200634 -> 2200632 bytes 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build/bootstrap/butterflynet.pi b/build/bootstrap/butterflynet.pi index 919b71aa8..b8b2b1b88 100644 --- a/build/bootstrap/butterflynet.pi +++ b/build/bootstrap/butterflynet.pi @@ -1,2 +1,2 @@ -/dns4/bootstrap-0.butterfly.fildev.network/tcp/1347/p2p/12D3KooWSUZhAY3eyoPUboJ1ZWe4dNPFWTr1EPoDjbTDSAN15uhY -/dns4/bootstrap-1.butterfly.fildev.network/tcp/1347/p2p/12D3KooWDfvNrSRVGWAGbn3sm9C8z98W2x25qCZjaXGHXmGiH24e +/dns4/bootstrap-0.butterfly.fildev.network/tcp/1347/p2p/12D3KooWHc8xB2S1wFeF9ar9bVdXoEEaBPGLqfKxVQH55c4nNmxs +/dns4/bootstrap-1.butterfly.fildev.network/tcp/1347/p2p/12D3KooWPcNcwS3cKarWrN7MfANWNpzXmZA9Ag6eH9FHFdLQ3LFQ diff --git a/build/genesis/butterflynet.car b/build/genesis/butterflynet.car index 2a23ff147badc0ccf791da913b168c480b02b234..d80c3d9ce67d6b7acb5eff6994dcfbfb1f7b2e8e 100644 GIT binary patch delta 2172 zcmb7_XH=7C6vs12B#ba*WKmy&hy|&DLWzqg!-|P)hzJE#0w~Y}gsB)42w{kfsNq-z zR4O0=Z4(KCxWIxDCkS}hN))gJg)khHzCk|poYtm(_`P4A=iYOl|Nq|m)>mXe>p=4L zm>6ye%&6^`tRpt52j@>u1WDgtN!jueghd0M7Bhzv@JLEKwxco_(mOwTKjNhI$O~`XKc}ityrCjCgv???Xa&68KwDA% zsE+^3<-wfA9JqF#-ObJWLGnS8Ai#ukc?I=_i$3?OH4dqq=ZVK~$e zN>vt{rqXRrGlP6C{ZN9Po<%d2|0JvKNCB1g+_g6{(6_&A_Z%ZP()E->3r_>S4p4e2 z2+jfAF&GVFM~OkZSEE*sDy*uDb*qE$*Hbwjk+HApKQLZesrX znu5p2av+}~vj#1E=Wh%_q{|aUMX92B6CPEy3%J!|c&z^{X%f|jbTK<~<3x-Jdk^{i zRWyZM$S9k>a-HXdS_d%q*gr6Bb+u4^ZE(MadB7sXghVX6Fli)y^s(t~xdg}KgO@5z z(ADLhGBs&A;ud;*pO{*P4CLOkLkxf1r~O(xiohE~tp*O!lQjzU;{wJ*RtFtUx#Dh# zJ6f3&FSL@*2B)WRJe$&N)VMZkP!O2dMhy--?5#{&7R?%d>EXb&fZC~LPKSyKxbGdS zx{#+|#S({B=ZG12_2Ad(St@JyiHP&2>ZmpIb?pZHgib11VK!<-tyI6DKL+c#4p=zoa)+cjzs2 zA2sccUhsf({cv}#j$tyksWoFdkp2{9#ls_TV)+6x1>vjA@kJGiuWzVaO&i|3HNlfS zAjmhHeqbuQa2?IqSm@|F)={yglv%#NDQ}MAap0LZ$2#)`jQ0V#iaUl_2BHdr0#O4| z2hjl01VMvnfoOy1faroO2hju32Qd(jAq@Ren97|{-L|;3& zePRvgI4)`A6|ry4p8PN*7A}k28_!^b#?m8`qeB@jDxX#Uk2vOHAlu1QH8VYv&Gvys z5Yb-Q9h8}oNCeoZjx>bJ;Il&mx0}g}+e*!AgtV zdk7;qO;y!P_>1aEw0_hS7Cz2a=3ejs^B?YELRpHqOJ8XUCJZd(Ut101ugJ&kMTEU` zC^Nb&QJa|itspyQJ3TKvvH*|5Zx*nsTKy@F-pyxoX$RcXERX(hx?{2mv!CC{GQ=}| zV6V(^^7D`d`vvlo_4L{~=c`?#u~_&Bdoit@kVRNeVO7|Qf9_*!aU(4}(=~q>M4GMj zp6&{A7FwJF-gfTr4fNb5j1gA!@iFwp$Nm4gV=fLJCSp;Pv=eJR!s!ny`H8Y>(gVM( zP+cF0XmEW_UU`>qX{`T_dQN;!^|P9$Hw&e9Wi}oHOt`|G607?z=Qf{$dQT68|8B`< z_S-_lSokP-(#VL-vl)YOL?Mn`<8Y2;=sV3oEPQNe=^vF874aQc&Nc+WfM7vzAb1dh zSk5*YY+x!|gNph3g7jZherY!-Tb_#4%&%2sDYvqntH^!4(=Ap@Dv@~^-5NEO&~_2e zpv+1nRaupfU;*cLUX*To;cz?5R&bRht&7$a=p8X%%B^fwFG}*2ZNnvzzX4eR0*Fau HW2pCE^kC}` delta 2183 zcmdn7qK$DE5Kj=PuU6Gso$VE+9Q9@9U*nu@yQ1_BH}jen^82fB-cB>qbxbcyEh^5; z&tu%k#8|lC36laL4HKLg7#brK4%q+w`DfiPFY}hnJ+6}uuUebf%uqL(Ws~R?k3FG1 zO4pkh92%P#A|_6bRLFh#tnS8fS?Q&f{h}wsO9TTi^l2>JUX->hbo~eGL&vqJ^G;C& z6Wo)X7?qh<7zk|6U<_yUC8V#J<%U*-Is?Sn3194UYwsAmuy&ev!R^=A=XoJtJ}lek z@cQX8hU}#}oIR6yn2i+(DvD=rRY>-5vwT?hc~fXiU~Ahh`LwpWRSrvc&XkA^6g=8@ zA=zLu3rm;6Db^HjeUGju52gqys;HzYXtg@93+nN-?K)a2gZ zeW@oly(wtB>2>zjce$`*n~$@lF)G}BKk3@Sf5rb&|9x}TnsGUKFxch@6tsp)GQy?PIlomR>gUH?LY&MqwoiV=siDC7h-dziFYjbGd>8%q$$xX?bAz-wRpsS!#a4%f zzWra;+HAztZp6h1#7x_bxR{x0LI{OzV}v2|^m#1Bmojx!;#o^er_SgO{WqRF>8L(g00URETbSviBPnG9ND~BX#2Dqt7p0`s1`qZ+K;VL_gMA&6&j&s z#f7`>h|IrkllC%c@m2X(T`+kjd*1oNOyS-CYlKEXuQfWy^YEfEFWnOB@Nft;b z8ea zOU!C3i;N>%&&)V1+cII1|BqLa%x{4*Wue|?X6KKDE2q_)ML%kM%{c9Py(IH1pvK3UK?)GM@QC(3prHqkv4#T7Wp}P+X_boDbvn0M+t5b2~rg`(X9R9*+Td*c% zpF|qS#K=u2OXa@vDSTMgzGCmG;`w~3rhg=vUpGy^)hI4iPbigPNn{eKVAnL6TWNer z_T<$v3oBSLt*^+P;gh6_?0h3;*Lk7sYmPqg6DsG*vAVuy-!8rQE9;(algI#TLrrq^ zgwvcvdK1X=jqc0R*DYV^Yg`^E>A&J(>)DzkYx{lplUxO_6`ft1E_%Iv{n5h4&08lt zsI*-i&i_s#1*D5mHWxzA=MtIi&zi)6SOSP8fmjNNrGZ#x`?Dt5H@oWzm44uCMWS1w zMFOER6J&Hfslg64n@~{;GJAD2(>wkEjkzoC^1h#QJ1ga6*d6oFi?=;-e3GE0_pn26 zir1Ht`Z&=U@|}sfcHSuq@}OoDDxpDUlbUvA7(*F&(lT@O&Gm~?%M*)IpzL;k2RR^? N2V#Zo{tk*Sg8{^U=-U7Q From 4b6a9e0387360ad452d446a02deb2cb918b8d125 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 9 Aug 2022 12:42:35 +0200 Subject: [PATCH 002/185] sealing pipeline: Cleanup journal plumbing --- storage/miner.go | 32 ++++---------------------------- storage/pipeline/sealing.go | 26 ++++++++++++++++++++++---- storage/pipeline/types.go | 9 +++++++++ 3 files changed, 35 insertions(+), 32 deletions(-) diff --git a/storage/miner.go b/storage/miner.go index e4a7c8cfa..0c5319e94 100644 --- a/storage/miner.go +++ b/storage/miner.go @@ -61,20 +61,9 @@ type Miner struct { getSealConfig dtypes.GetSealingConfigFunc sealing *pipeline.Sealing - sealingEvtType journal.EventType - journal journal.Journal } -// SealingStateEvt is a journal event that records a sector state transition. -type SealingStateEvt struct { - SectorNumber abi.SectorNumber - SectorType abi.RegisteredSealProof - From pipeline.SectorState - After pipeline.SectorState - Error string -} - // fullNodeFilteredAPI is the subset of the full node API the Miner needs from // a Lotus full node. type fullNodeFilteredAPI interface { @@ -151,10 +140,9 @@ func NewMiner(api fullNodeFilteredAPI, prover: prover, addrSel: as, - maddr: maddr, - getSealConfig: gsd, - journal: journal, - sealingEvtType: journal.RegisterEventType("storage", "sealing_states"), + maddr: maddr, + getSealConfig: gsd, + journal: journal, } return m, nil @@ -189,7 +177,7 @@ func (m *Miner) Run(ctx context.Context) error { } // Instantiate the sealing FSM. - m.sealing = pipeline.New(ctx, m.api, m.feeCfg, evts, m.maddr, m.ds, m.sealer, m.sc, m.verif, m.prover, &pcp, cfg, m.handleSealingNotifications, as) + m.sealing = pipeline.New(ctx, m.api, m.feeCfg, evts, m.maddr, m.ds, m.sealer, m.sc, m.verif, m.prover, &pcp, cfg, m.journal, as) // Run the sealing FSM. go m.sealing.Run(ctx) //nolint:errcheck // logged intside the function @@ -197,18 +185,6 @@ func (m *Miner) Run(ctx context.Context) error { return nil } -func (m *Miner) handleSealingNotifications(before, after pipeline.SectorInfo) { - m.journal.RecordEvent(m.sealingEvtType, func() interface{} { - return SealingStateEvt{ - SectorNumber: before.SectorNumber, - SectorType: before.SectorType, - From: before.State, - After: after.State, - Error: after.LastErr, - } - }) -} - func (m *Miner) Stop(ctx context.Context) error { return m.sealing.Stop(ctx) } diff --git a/storage/pipeline/sealing.go b/storage/pipeline/sealing.go index 7196dfe54..0786f61bc 100644 --- a/storage/pipeline/sealing.go +++ b/storage/pipeline/sealing.go @@ -2,6 +2,7 @@ package sealing import ( "context" + "github.com/filecoin-project/lotus/journal" "sync" "time" @@ -99,8 +100,10 @@ type Sealing struct { available map[abi.SectorID]struct{} - notifee SectorStateNotifee - addrSel AddrSel + journal journal.Journal + sealingEvtType journal.EventType + notifee SectorStateNotifee + addrSel AddrSel stats SectorStats @@ -149,7 +152,7 @@ type pendingPiece struct { accepted func(abi.SectorNumber, abi.UnpaddedPieceSize, error) } -func New(mctx context.Context, api SealingAPI, fc config.MinerFeeConfig, events Events, maddr address.Address, ds datastore.Batching, sealer sealer.SectorManager, sc SectorIDCounter, verif storiface.Verifier, prov storiface.Prover, pcp PreCommitPolicy, gc GetSealingConfigFunc, notifee SectorStateNotifee, as AddrSel) *Sealing { +func New(mctx context.Context, api SealingAPI, fc config.MinerFeeConfig, events Events, maddr address.Address, ds datastore.Batching, sealer sealer.SectorManager, sc SectorIDCounter, verif storiface.Verifier, prov storiface.Prover, pcp PreCommitPolicy, gc GetSealingConfigFunc, journal journal.Journal, as AddrSel) *Sealing { s := &Sealing{ Api: api, DealInfo: &CurrentDealInfoManager{api}, @@ -170,7 +173,9 @@ func New(mctx context.Context, api SealingAPI, fc config.MinerFeeConfig, events available: map[abi.SectorID]struct{}{}, - notifee: notifee, + journal: journal, + sealingEvtType: journal.RegisterEventType("storage", "sealing_states"), + addrSel: as, terminator: NewTerminationBatcher(mctx, maddr, api, as, fc, gc), @@ -184,6 +189,19 @@ func New(mctx context.Context, api SealingAPI, fc config.MinerFeeConfig, events byState: map[SectorState]int64{}, }, } + + s.notifee = func(before, after SectorInfo) { + s.journal.RecordEvent(s.sealingEvtType, func() interface{} { + return SealingStateEvt{ + SectorNumber: before.SectorNumber, + SectorType: before.SectorType, + From: before.State, + After: after.State, + Error: after.LastErr, + } + }) + } + s.startupWait.Add(1) s.sectors = statemachine.New(namespace.Wrap(ds, datastore.NewKey(SectorStorePrefix)), s, SectorInfo{}) diff --git a/storage/pipeline/types.go b/storage/pipeline/types.go index 105a1a64a..17d1edfb7 100644 --- a/storage/pipeline/types.go +++ b/storage/pipeline/types.go @@ -196,3 +196,12 @@ type SectorIDCounter interface { } type GetSealingConfigFunc func() (sealiface.Config, error) + +// SealingStateEvt is a journal event that records a sector state transition. +type SealingStateEvt struct { + SectorNumber abi.SectorNumber + SectorType abi.RegisteredSealProof + From SectorState + After SectorState + Error string +} From fe2a5898907035091b8c105105b1fd0ee58b70bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 9 Aug 2022 12:57:20 +0200 Subject: [PATCH 003/185] sealing pipeline: Cleanup AddresSelector plumbing --- storage/ctladdr/addresses.go | 8 +-- storage/miner.go | 7 +-- storage/pipeline/commit_batch.go | 14 +++-- storage/pipeline/commit_batch_test.go | 13 +++- storage/pipeline/mocks/api.go | 45 ++++++++++++++ storage/pipeline/mocks/mock_commit_batcher.go | 60 +++++++++++++++++++ .../pipeline/mocks/mock_precommit_batcher.go | 60 +++++++++++++++++++ storage/pipeline/precommit_batch.go | 14 +++-- storage/pipeline/precommit_batch_test.go | 4 +- storage/pipeline/sealing.go | 26 +++++--- storage/pipeline/states_replica_update.go | 2 +- storage/pipeline/states_sealing.go | 4 +- storage/pipeline/terminate_batch.go | 12 +++- 13 files changed, 232 insertions(+), 37 deletions(-) diff --git a/storage/ctladdr/addresses.go b/storage/ctladdr/addresses.go index 701fea933..ee778cb38 100644 --- a/storage/ctladdr/addresses.go +++ b/storage/ctladdr/addresses.go @@ -15,7 +15,7 @@ import ( var log = logging.Logger("ctladdr") -type addrSelectApi interface { +type NodeApi interface { WalletBalance(context.Context, address.Address) (types.BigInt, error) WalletHas(context.Context, address.Address) (bool, error) @@ -27,7 +27,7 @@ type AddressSelector struct { api.AddressConfig } -func (as *AddressSelector) AddressFor(ctx context.Context, a addrSelectApi, mi api.MinerInfo, use api.AddrUse, goodFunds, minFunds abi.TokenAmount) (address.Address, abi.TokenAmount, error) { +func (as *AddressSelector) AddressFor(ctx context.Context, a NodeApi, mi api.MinerInfo, use api.AddrUse, goodFunds, minFunds abi.TokenAmount) (address.Address, abi.TokenAmount, error) { if as == nil { // should only happen in some tests log.Warnw("smart address selection disabled, using worker address") @@ -85,7 +85,7 @@ func (as *AddressSelector) AddressFor(ctx context.Context, a addrSelectApi, mi a return pickAddress(ctx, a, mi, goodFunds, minFunds, addrs) } -func pickAddress(ctx context.Context, a addrSelectApi, mi api.MinerInfo, goodFunds, minFunds abi.TokenAmount, addrs []address.Address) (address.Address, abi.TokenAmount, error) { +func pickAddress(ctx context.Context, a NodeApi, mi api.MinerInfo, goodFunds, minFunds abi.TokenAmount, addrs []address.Address) (address.Address, abi.TokenAmount, error) { leastBad := mi.Worker bestAvail := minFunds @@ -119,7 +119,7 @@ func pickAddress(ctx context.Context, a addrSelectApi, mi api.MinerInfo, goodFun return leastBad, bestAvail, nil } -func maybeUseAddress(ctx context.Context, a addrSelectApi, addr address.Address, goodFunds abi.TokenAmount, leastBad *address.Address, bestAvail *abi.TokenAmount) bool { +func maybeUseAddress(ctx context.Context, a NodeApi, addr address.Address, goodFunds abi.TokenAmount, leastBad *address.Address, bestAvail *abi.TokenAmount) bool { b, err := a.WalletBalance(ctx, addr) if err != nil { log.Errorw("checking control address balance", "addr", addr, "error", err) diff --git a/storage/miner.go b/storage/miner.go index 0c5319e94..fadd94962 100644 --- a/storage/miner.go +++ b/storage/miner.go @@ -171,13 +171,8 @@ func (m *Miner) Run(ctx context.Context) error { pcp := pipeline.NewBasicPreCommitPolicy(m.api, cfg, provingBuffer) - // address selector. - as := func(ctx context.Context, mi api.MinerInfo, use api.AddrUse, goodFunds, minFunds abi.TokenAmount) (address.Address, abi.TokenAmount, error) { - return m.addrSel.AddressFor(ctx, m.api, mi, use, goodFunds, minFunds) - } - // Instantiate the sealing FSM. - m.sealing = pipeline.New(ctx, m.api, m.feeCfg, evts, m.maddr, m.ds, m.sealer, m.sc, m.verif, m.prover, &pcp, cfg, m.journal, as) + m.sealing = pipeline.New(ctx, m.api, m.feeCfg, evts, m.maddr, m.ds, m.sealer, m.sc, m.verif, m.prover, &pcp, cfg, m.journal, m.addrSel) // Run the sealing FSM. go m.sealing.Run(ctx) //nolint:errcheck // logged intside the function diff --git a/storage/pipeline/commit_batch.go b/storage/pipeline/commit_batch.go index 1e1993f6a..8ab7d77c5 100644 --- a/storage/pipeline/commit_batch.go +++ b/storage/pipeline/commit_batch.go @@ -43,6 +43,12 @@ type CommitBatcherApi interface { StateMinerInitialPledgeCollateral(context.Context, address.Address, miner.SectorPreCommitInfo, types.TipSetKey) (big.Int, error) StateNetworkVersion(ctx context.Context, tsk types.TipSetKey) (network.Version, error) StateMinerAvailableBalance(context.Context, address.Address, types.TipSetKey) (big.Int, error) + + // Address selector + WalletBalance(context.Context, address.Address) (types.BigInt, error) + WalletHas(context.Context, address.Address) (bool, error) + StateAccountKey(context.Context, address.Address, types.TipSetKey) (address.Address, error) + StateLookupID(context.Context, address.Address, types.TipSetKey) (address.Address, error) } type AggregateInput struct { @@ -55,7 +61,7 @@ type CommitBatcher struct { api CommitBatcherApi maddr address.Address mctx context.Context - addrSel AddrSel + addrSel AddressSelector feeCfg config.MinerFeeConfig getConfig GetSealingConfigFunc prover storiface.Prover @@ -69,7 +75,7 @@ type CommitBatcher struct { lk sync.Mutex } -func NewCommitBatcher(mctx context.Context, maddr address.Address, api CommitBatcherApi, addrSel AddrSel, feeCfg config.MinerFeeConfig, getConfig GetSealingConfigFunc, prov storiface.Prover) *CommitBatcher { +func NewCommitBatcher(mctx context.Context, maddr address.Address, api CommitBatcherApi, addrSel AddressSelector, feeCfg config.MinerFeeConfig, getConfig GetSealingConfigFunc, prov storiface.Prover) *CommitBatcher { b := &CommitBatcher{ api: api, maddr: maddr, @@ -363,7 +369,7 @@ func (b *CommitBatcher) processBatch(cfg sealiface.Config) ([]sealiface.CommitBa goodFunds := big.Add(maxFee, needFunds) - from, _, err := b.addrSel(b.mctx, mi, api.CommitAddr, goodFunds, needFunds) + from, _, err := b.addrSel.AddressFor(b.mctx, b.api, mi, api.CommitAddr, goodFunds, needFunds) if err != nil { return []sealiface.CommitBatchRes{res}, xerrors.Errorf("no good address found: %w", err) } @@ -458,7 +464,7 @@ func (b *CommitBatcher) processSingle(cfg sealiface.Config, mi api.MinerInfo, av goodFunds := big.Add(collateral, big.Int(b.feeCfg.MaxCommitGasFee)) - from, _, err := b.addrSel(b.mctx, mi, api.CommitAddr, goodFunds, collateral) + from, _, err := b.addrSel.AddressFor(b.mctx, b.api, mi, api.CommitAddr, goodFunds, collateral) if err != nil { return cid.Undef, xerrors.Errorf("no good address to send commit message from: %w", err) } diff --git a/storage/pipeline/commit_batch_test.go b/storage/pipeline/commit_batch_test.go index a05b9e9cd..439ee0ed1 100644 --- a/storage/pipeline/commit_batch_test.go +++ b/storage/pipeline/commit_batch_test.go @@ -4,6 +4,7 @@ package sealing_test import ( "bytes" "context" + "github.com/filecoin-project/lotus/storage/ctladdr" "sort" "sync" "testing" @@ -37,9 +38,9 @@ func TestCommitBatcher(t *testing.T) { ctx := context.Background() - as := func(ctx context.Context, mi api.MinerInfo, use api.AddrUse, goodFunds, minFunds abi.TokenAmount) (address.Address, abi.TokenAmount, error) { + as := asel(func(ctx context.Context, mi api.MinerInfo, use api.AddrUse, goodFunds, minFunds abi.TokenAmount) (address.Address, abi.TokenAmount, error) { return t0123, big.Zero(), nil - } + }) maxBatch := miner5.MaxAggregatedSectors minBatch := miner5.MinAggregatedSectors @@ -438,3 +439,11 @@ var dummySmsg = &types.SignedMessage{ }, Signature: crypto.Signature{Type: crypto.SigTypeBLS}, } + +type asel func(ctx context.Context, mi api.MinerInfo, use api.AddrUse, goodFunds, minFunds abi.TokenAmount) (address.Address, abi.TokenAmount, error) + +func (s asel) AddressFor(ctx context.Context, _ ctladdr.NodeApi, mi api.MinerInfo, use api.AddrUse, goodFunds, minFunds abi.TokenAmount) (address.Address, abi.TokenAmount, error) { + return s(ctx, mi, use, goodFunds, minFunds) +} + +var _ pipeline.AddressSelector = asel(nil) diff --git a/storage/pipeline/mocks/api.go b/storage/pipeline/mocks/api.go index 51f319f2a..99de10fd2 100644 --- a/storage/pipeline/mocks/api.go +++ b/storage/pipeline/mocks/api.go @@ -107,6 +107,21 @@ func (mr *MockSealingAPIMockRecorder) MpoolPushMessage(arg0, arg1, arg2 interfac return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MpoolPushMessage", reflect.TypeOf((*MockSealingAPI)(nil).MpoolPushMessage), arg0, arg1, arg2) } +// StateAccountKey mocks base method. +func (m *MockSealingAPI) StateAccountKey(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (address.Address, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateAccountKey", arg0, arg1, arg2) + ret0, _ := ret[0].(address.Address) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateAccountKey indicates an expected call of StateAccountKey. +func (mr *MockSealingAPIMockRecorder) StateAccountKey(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateAccountKey", reflect.TypeOf((*MockSealingAPI)(nil).StateAccountKey), arg0, arg1, arg2) +} + // StateComputeDataCID mocks base method. func (m *MockSealingAPI) StateComputeDataCID(arg0 context.Context, arg1 address.Address, arg2 abi.RegisteredSealProof, arg3 []abi.DealID, arg4 types.TipSetKey) (cid.Cid, error) { m.ctrl.T.Helper() @@ -391,3 +406,33 @@ func (mr *MockSealingAPIMockRecorder) StateWaitMsg(arg0, arg1, arg2, arg3, arg4 mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateWaitMsg", reflect.TypeOf((*MockSealingAPI)(nil).StateWaitMsg), arg0, arg1, arg2, arg3, arg4) } + +// WalletBalance mocks base method. +func (m *MockSealingAPI) WalletBalance(arg0 context.Context, arg1 address.Address) (big.Int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WalletBalance", arg0, arg1) + ret0, _ := ret[0].(big.Int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// WalletBalance indicates an expected call of WalletBalance. +func (mr *MockSealingAPIMockRecorder) WalletBalance(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WalletBalance", reflect.TypeOf((*MockSealingAPI)(nil).WalletBalance), arg0, arg1) +} + +// WalletHas mocks base method. +func (m *MockSealingAPI) WalletHas(arg0 context.Context, arg1 address.Address) (bool, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WalletHas", arg0, arg1) + ret0, _ := ret[0].(bool) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// WalletHas indicates an expected call of WalletHas. +func (mr *MockSealingAPIMockRecorder) WalletHas(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WalletHas", reflect.TypeOf((*MockSealingAPI)(nil).WalletHas), arg0, arg1) +} diff --git a/storage/pipeline/mocks/mock_commit_batcher.go b/storage/pipeline/mocks/mock_commit_batcher.go index 3d7e753ad..d61fde912 100644 --- a/storage/pipeline/mocks/mock_commit_batcher.go +++ b/storage/pipeline/mocks/mock_commit_batcher.go @@ -73,6 +73,36 @@ func (mr *MockCommitBatcherApiMockRecorder) MpoolPushMessage(arg0, arg1, arg2 in return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MpoolPushMessage", reflect.TypeOf((*MockCommitBatcherApi)(nil).MpoolPushMessage), arg0, arg1, arg2) } +// StateAccountKey mocks base method. +func (m *MockCommitBatcherApi) StateAccountKey(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (address.Address, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateAccountKey", arg0, arg1, arg2) + ret0, _ := ret[0].(address.Address) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateAccountKey indicates an expected call of StateAccountKey. +func (mr *MockCommitBatcherApiMockRecorder) StateAccountKey(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateAccountKey", reflect.TypeOf((*MockCommitBatcherApi)(nil).StateAccountKey), arg0, arg1, arg2) +} + +// StateLookupID mocks base method. +func (m *MockCommitBatcherApi) StateLookupID(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (address.Address, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateLookupID", arg0, arg1, arg2) + ret0, _ := ret[0].(address.Address) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateLookupID indicates an expected call of StateLookupID. +func (mr *MockCommitBatcherApiMockRecorder) StateLookupID(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateLookupID", reflect.TypeOf((*MockCommitBatcherApi)(nil).StateLookupID), arg0, arg1, arg2) +} + // StateMinerAvailableBalance mocks base method. func (m *MockCommitBatcherApi) StateMinerAvailableBalance(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (big.Int, error) { m.ctrl.T.Helper() @@ -147,3 +177,33 @@ func (mr *MockCommitBatcherApiMockRecorder) StateSectorPreCommitInfo(arg0, arg1, mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateSectorPreCommitInfo", reflect.TypeOf((*MockCommitBatcherApi)(nil).StateSectorPreCommitInfo), arg0, arg1, arg2, arg3) } + +// WalletBalance mocks base method. +func (m *MockCommitBatcherApi) WalletBalance(arg0 context.Context, arg1 address.Address) (big.Int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WalletBalance", arg0, arg1) + ret0, _ := ret[0].(big.Int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// WalletBalance indicates an expected call of WalletBalance. +func (mr *MockCommitBatcherApiMockRecorder) WalletBalance(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WalletBalance", reflect.TypeOf((*MockCommitBatcherApi)(nil).WalletBalance), arg0, arg1) +} + +// WalletHas mocks base method. +func (m *MockCommitBatcherApi) WalletHas(arg0 context.Context, arg1 address.Address) (bool, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WalletHas", arg0, arg1) + ret0, _ := ret[0].(bool) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// WalletHas indicates an expected call of WalletHas. +func (mr *MockCommitBatcherApiMockRecorder) WalletHas(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WalletHas", reflect.TypeOf((*MockCommitBatcherApi)(nil).WalletHas), arg0, arg1) +} diff --git a/storage/pipeline/mocks/mock_precommit_batcher.go b/storage/pipeline/mocks/mock_precommit_batcher.go index dc9239a10..2f65e3e03 100644 --- a/storage/pipeline/mocks/mock_precommit_batcher.go +++ b/storage/pipeline/mocks/mock_precommit_batcher.go @@ -71,6 +71,36 @@ func (mr *MockPreCommitBatcherApiMockRecorder) MpoolPushMessage(arg0, arg1, arg2 return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MpoolPushMessage", reflect.TypeOf((*MockPreCommitBatcherApi)(nil).MpoolPushMessage), arg0, arg1, arg2) } +// StateAccountKey mocks base method. +func (m *MockPreCommitBatcherApi) StateAccountKey(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (address.Address, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateAccountKey", arg0, arg1, arg2) + ret0, _ := ret[0].(address.Address) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateAccountKey indicates an expected call of StateAccountKey. +func (mr *MockPreCommitBatcherApiMockRecorder) StateAccountKey(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateAccountKey", reflect.TypeOf((*MockPreCommitBatcherApi)(nil).StateAccountKey), arg0, arg1, arg2) +} + +// StateLookupID mocks base method. +func (m *MockPreCommitBatcherApi) StateLookupID(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (address.Address, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateLookupID", arg0, arg1, arg2) + ret0, _ := ret[0].(address.Address) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateLookupID indicates an expected call of StateLookupID. +func (mr *MockPreCommitBatcherApiMockRecorder) StateLookupID(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateLookupID", reflect.TypeOf((*MockPreCommitBatcherApi)(nil).StateLookupID), arg0, arg1, arg2) +} + // StateMinerAvailableBalance mocks base method. func (m *MockPreCommitBatcherApi) StateMinerAvailableBalance(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (big.Int, error) { m.ctrl.T.Helper() @@ -115,3 +145,33 @@ func (mr *MockPreCommitBatcherApiMockRecorder) StateNetworkVersion(arg0, arg1 in mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateNetworkVersion", reflect.TypeOf((*MockPreCommitBatcherApi)(nil).StateNetworkVersion), arg0, arg1) } + +// WalletBalance mocks base method. +func (m *MockPreCommitBatcherApi) WalletBalance(arg0 context.Context, arg1 address.Address) (big.Int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WalletBalance", arg0, arg1) + ret0, _ := ret[0].(big.Int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// WalletBalance indicates an expected call of WalletBalance. +func (mr *MockPreCommitBatcherApiMockRecorder) WalletBalance(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WalletBalance", reflect.TypeOf((*MockPreCommitBatcherApi)(nil).WalletBalance), arg0, arg1) +} + +// WalletHas mocks base method. +func (m *MockPreCommitBatcherApi) WalletHas(arg0 context.Context, arg1 address.Address) (bool, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WalletHas", arg0, arg1) + ret0, _ := ret[0].(bool) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// WalletHas indicates an expected call of WalletHas. +func (mr *MockPreCommitBatcherApiMockRecorder) WalletHas(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WalletHas", reflect.TypeOf((*MockPreCommitBatcherApi)(nil).WalletHas), arg0, arg1) +} diff --git a/storage/pipeline/precommit_batch.go b/storage/pipeline/precommit_batch.go index 0a27725df..cb34e7f6c 100644 --- a/storage/pipeline/precommit_batch.go +++ b/storage/pipeline/precommit_batch.go @@ -33,6 +33,12 @@ type PreCommitBatcherApi interface { StateMinerAvailableBalance(context.Context, address.Address, types.TipSetKey) (big.Int, error) ChainHead(ctx context.Context) (*types.TipSet, error) StateNetworkVersion(ctx context.Context, tsk types.TipSetKey) (network.Version, error) + + // Address selector + WalletBalance(context.Context, address.Address) (types.BigInt, error) + WalletHas(context.Context, address.Address) (bool, error) + StateAccountKey(context.Context, address.Address, types.TipSetKey) (address.Address, error) + StateLookupID(context.Context, address.Address, types.TipSetKey) (address.Address, error) } type preCommitEntry struct { @@ -44,7 +50,7 @@ type PreCommitBatcher struct { api PreCommitBatcherApi maddr address.Address mctx context.Context - addrSel AddrSel + addrSel AddressSelector feeCfg config.MinerFeeConfig getConfig GetSealingConfigFunc @@ -57,7 +63,7 @@ type PreCommitBatcher struct { lk sync.Mutex } -func NewPreCommitBatcher(mctx context.Context, maddr address.Address, api PreCommitBatcherApi, addrSel AddrSel, feeCfg config.MinerFeeConfig, getConfig GetSealingConfigFunc) *PreCommitBatcher { +func NewPreCommitBatcher(mctx context.Context, maddr address.Address, api PreCommitBatcherApi, addrSel AddressSelector, feeCfg config.MinerFeeConfig, getConfig GetSealingConfigFunc) *PreCommitBatcher { b := &PreCommitBatcher{ api: api, maddr: maddr, @@ -296,7 +302,7 @@ func (b *PreCommitBatcher) processSingle(cfg sealiface.Config, mi api.MinerInfo, goodFunds := big.Add(deposit, big.Int(b.feeCfg.MaxPreCommitGasFee)) - from, _, err := b.addrSel(b.mctx, mi, api.PreCommitAddr, goodFunds, deposit) + from, _, err := b.addrSel.AddressFor(b.mctx, b.api, mi, api.PreCommitAddr, goodFunds, deposit) if err != nil { return cid.Undef, xerrors.Errorf("no good address to send precommit message from: %w", err) } @@ -353,7 +359,7 @@ func (b *PreCommitBatcher) processBatch(cfg sealiface.Config, tsk types.TipSetKe goodFunds := big.Add(maxFee, needFunds) - from, _, err := b.addrSel(b.mctx, mi, api.PreCommitAddr, goodFunds, deposit) + from, _, err := b.addrSel.AddressFor(b.mctx, b.api, mi, api.PreCommitAddr, goodFunds, deposit) if err != nil { return []sealiface.PreCommitBatchRes{res}, xerrors.Errorf("no good address found: %w", err) } diff --git a/storage/pipeline/precommit_batch_test.go b/storage/pipeline/precommit_batch_test.go index e6b3f0f9e..d380acbeb 100644 --- a/storage/pipeline/precommit_batch_test.go +++ b/storage/pipeline/precommit_batch_test.go @@ -42,9 +42,9 @@ func TestPrecommitBatcher(t *testing.T) { ctx := context.Background() - as := func(ctx context.Context, mi api.MinerInfo, use api.AddrUse, goodFunds, minFunds abi.TokenAmount) (address.Address, abi.TokenAmount, error) { + as := asel(func(ctx context.Context, mi api.MinerInfo, use api.AddrUse, goodFunds, minFunds abi.TokenAmount) (address.Address, abi.TokenAmount, error) { return t0123, big.Zero(), nil - } + }) maxBatch := miner6.PreCommitSectorBatchMaxSize diff --git a/storage/pipeline/sealing.go b/storage/pipeline/sealing.go index 0786f61bc..072307bf5 100644 --- a/storage/pipeline/sealing.go +++ b/storage/pipeline/sealing.go @@ -2,7 +2,6 @@ package sealing import ( "context" - "github.com/filecoin-project/lotus/journal" "sync" "time" @@ -25,7 +24,9 @@ import ( lminer "github.com/filecoin-project/lotus/chain/actors/builtin/miner" "github.com/filecoin-project/lotus/chain/events" "github.com/filecoin-project/lotus/chain/types" + "github.com/filecoin-project/lotus/journal" "github.com/filecoin-project/lotus/node/config" + "github.com/filecoin-project/lotus/storage/ctladdr" "github.com/filecoin-project/lotus/storage/pipeline/sealiface" "github.com/filecoin-project/lotus/storage/sealer" "github.com/filecoin-project/lotus/storage/sealer/storiface" @@ -64,16 +65,23 @@ type SealingAPI interface { StateGetRandomnessFromBeacon(ctx context.Context, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte, tsk types.TipSetKey) (abi.Randomness, error) StateGetRandomnessFromTickets(ctx context.Context, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte, tsk types.TipSetKey) (abi.Randomness, error) ChainReadObj(context.Context, cid.Cid) ([]byte, error) + + // Address selector + WalletBalance(context.Context, address.Address) (types.BigInt, error) + WalletHas(context.Context, address.Address) (bool, error) + StateAccountKey(context.Context, address.Address, types.TipSetKey) (address.Address, error) } type SectorStateNotifee func(before, after SectorInfo) -type AddrSel func(ctx context.Context, mi api.MinerInfo, use api.AddrUse, goodFunds, minFunds abi.TokenAmount) (address.Address, abi.TokenAmount, error) - type Events interface { ChainAt(ctx context.Context, hnd events.HeightHandler, rev events.RevertHandler, confidence int, h abi.ChainEpoch) error } +type AddressSelector interface { + AddressFor(ctx context.Context, a ctladdr.NodeApi, mi api.MinerInfo, use api.AddrUse, goodFunds, minFunds abi.TokenAmount) (address.Address, abi.TokenAmount, error) +} + type Sealing struct { Api SealingAPI DealInfo *CurrentDealInfoManager @@ -103,7 +111,7 @@ type Sealing struct { journal journal.Journal sealingEvtType journal.EventType notifee SectorStateNotifee - addrSel AddrSel + addrSel AddressSelector stats SectorStats @@ -152,7 +160,7 @@ type pendingPiece struct { accepted func(abi.SectorNumber, abi.UnpaddedPieceSize, error) } -func New(mctx context.Context, api SealingAPI, fc config.MinerFeeConfig, events Events, maddr address.Address, ds datastore.Batching, sealer sealer.SectorManager, sc SectorIDCounter, verif storiface.Verifier, prov storiface.Prover, pcp PreCommitPolicy, gc GetSealingConfigFunc, journal journal.Journal, as AddrSel) *Sealing { +func New(mctx context.Context, api SealingAPI, fc config.MinerFeeConfig, events Events, maddr address.Address, ds datastore.Batching, sealer sealer.SectorManager, sc SectorIDCounter, verif storiface.Verifier, prov storiface.Prover, pcp PreCommitPolicy, gc GetSealingConfigFunc, journal journal.Journal, addrSel AddressSelector) *Sealing { s := &Sealing{ Api: api, DealInfo: &CurrentDealInfoManager{api}, @@ -176,11 +184,11 @@ func New(mctx context.Context, api SealingAPI, fc config.MinerFeeConfig, events journal: journal, sealingEvtType: journal.RegisterEventType("storage", "sealing_states"), - addrSel: as, + addrSel: addrSel, - terminator: NewTerminationBatcher(mctx, maddr, api, as, fc, gc), - precommiter: NewPreCommitBatcher(mctx, maddr, api, as, fc, gc), - commiter: NewCommitBatcher(mctx, maddr, api, as, fc, gc, prov), + terminator: NewTerminationBatcher(mctx, maddr, api, addrSel, fc, gc), + precommiter: NewPreCommitBatcher(mctx, maddr, api, addrSel, fc, gc), + commiter: NewCommitBatcher(mctx, maddr, api, addrSel, fc, gc, prov), getConfig: gc, diff --git a/storage/pipeline/states_replica_update.go b/storage/pipeline/states_replica_update.go index 499048acb..3392b92e7 100644 --- a/storage/pipeline/states_replica_update.go +++ b/storage/pipeline/states_replica_update.go @@ -168,7 +168,7 @@ func (m *Sealing) handleSubmitReplicaUpdate(ctx statemachine.Context, sector Sec return nil } - from, _, err := m.addrSel(ctx.Context(), mi, api.CommitAddr, goodFunds, collateral) + from, _, err := m.addrSel.AddressFor(ctx.Context(), m.Api, mi, api.CommitAddr, goodFunds, collateral) if err != nil { log.Errorf("no good address to send replica update message from: %+v", err) return ctx.Send(SectorSubmitReplicaUpdateFailed{}) diff --git a/storage/pipeline/states_sealing.go b/storage/pipeline/states_sealing.go index cc248a078..5ec8f077f 100644 --- a/storage/pipeline/states_sealing.go +++ b/storage/pipeline/states_sealing.go @@ -407,7 +407,7 @@ func (m *Sealing) handlePreCommitting(ctx statemachine.Context, sector SectorInf goodFunds := big.Add(deposit, big.Int(m.feeCfg.MaxPreCommitGasFee)) - from, _, err := m.addrSel(ctx.Context(), mi, api.PreCommitAddr, goodFunds, deposit) + from, _, err := m.addrSel.AddressFor(ctx.Context(), m.Api, mi, api.PreCommitAddr, goodFunds, deposit) if err != nil { return ctx.Send(SectorChainPreCommitFailed{xerrors.Errorf("no good address to send precommit message from: %w", err)}) } @@ -667,7 +667,7 @@ func (m *Sealing) handleSubmitCommit(ctx statemachine.Context, sector SectorInfo goodFunds := big.Add(collateral, big.Int(m.feeCfg.MaxCommitGasFee)) - from, _, err := m.addrSel(ctx.Context(), mi, api.CommitAddr, goodFunds, collateral) + from, _, err := m.addrSel.AddressFor(ctx.Context(), m.Api, mi, api.CommitAddr, goodFunds, collateral) if err != nil { return ctx.Send(SectorCommitFailed{xerrors.Errorf("no good address to send commit message from: %w", err)}) } diff --git a/storage/pipeline/terminate_batch.go b/storage/pipeline/terminate_batch.go index 0f65ca31a..9212cbc65 100644 --- a/storage/pipeline/terminate_batch.go +++ b/storage/pipeline/terminate_batch.go @@ -30,13 +30,19 @@ type TerminateBatcherApi interface { StateMinerInfo(context.Context, address.Address, types.TipSetKey) (api.MinerInfo, error) StateMinerProvingDeadline(context.Context, address.Address, types.TipSetKey) (*dline.Info, error) StateMinerPartitions(ctx context.Context, m address.Address, dlIdx uint64, tsk types.TipSetKey) ([]api.Partition, error) + + // Address selector + WalletBalance(context.Context, address.Address) (types.BigInt, error) + WalletHas(context.Context, address.Address) (bool, error) + StateAccountKey(context.Context, address.Address, types.TipSetKey) (address.Address, error) + StateLookupID(context.Context, address.Address, types.TipSetKey) (address.Address, error) } type TerminateBatcher struct { api TerminateBatcherApi maddr address.Address mctx context.Context - addrSel AddrSel + addrSel AddressSelector feeCfg config.MinerFeeConfig getConfig GetSealingConfigFunc @@ -49,7 +55,7 @@ type TerminateBatcher struct { lk sync.Mutex } -func NewTerminationBatcher(mctx context.Context, maddr address.Address, api TerminateBatcherApi, addrSel AddrSel, feeCfg config.MinerFeeConfig, getConfig GetSealingConfigFunc) *TerminateBatcher { +func NewTerminationBatcher(mctx context.Context, maddr address.Address, api TerminateBatcherApi, addrSel AddressSelector, feeCfg config.MinerFeeConfig, getConfig GetSealingConfigFunc) *TerminateBatcher { b := &TerminateBatcher{ api: api, maddr: maddr, @@ -217,7 +223,7 @@ func (b *TerminateBatcher) processBatch(notif, after bool) (*cid.Cid, error) { return nil, xerrors.Errorf("couldn't get miner info: %w", err) } - from, _, err := b.addrSel(b.mctx, mi, api.TerminateSectorsAddr, big.Int(b.feeCfg.MaxTerminateGasFee), big.Int(b.feeCfg.MaxTerminateGasFee)) + from, _, err := b.addrSel.AddressFor(b.mctx, b.api, mi, api.TerminateSectorsAddr, big.Int(b.feeCfg.MaxTerminateGasFee), big.Int(b.feeCfg.MaxTerminateGasFee)) if err != nil { return nil, xerrors.Errorf("no good address found: %w", err) } From 71dacb5af85b7cc2ade64f18b7da001c612aecab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 9 Aug 2022 13:30:34 +0200 Subject: [PATCH 004/185] sealing pipeline: Remove useless storage adapter code --- node/builder.go | 1 + node/builder_miner.go | 6 +- node/impl/storminer.go | 9 +- node/modules/storageminer.go | 62 ++++-- storage/miner.go | 266 -------------------------- storage/miner_sealing.go | 165 ---------------- storage/pipeline/commit_batch.go | 5 +- storage/pipeline/commit_batch_test.go | 2 +- storage/pipeline/input.go | 81 +++++++- storage/pipeline/precommit_batch.go | 5 +- storage/pipeline/precommit_policy.go | 5 +- storage/pipeline/sealing.go | 10 +- storage/pipeline/terminate_batch.go | 5 +- storage/pipeline/types.go | 3 - storage/pipeline/upgrade_queue.go | 2 +- storage/winning_prover.go | 79 ++++++++ 16 files changed, 239 insertions(+), 467 deletions(-) delete mode 100644 storage/miner.go delete mode 100644 storage/miner_sealing.go create mode 100644 storage/winning_prover.go diff --git a/node/builder.go b/node/builder.go index a8b082008..a36c8e66d 100644 --- a/node/builder.go +++ b/node/builder.go @@ -106,6 +106,7 @@ const ( RelayIndexerMessagesKey // miner + PreflightChecksKey GetParamsKey HandleMigrateProviderFundsKey HandleDealsKey diff --git a/node/builder_miner.go b/node/builder_miner.go index b72b23761..54ab22683 100644 --- a/node/builder_miner.go +++ b/node/builder_miner.go @@ -116,9 +116,11 @@ func ConfigStorageMiner(c interface{}) Option { Override(new(*slashfilter.SlashFilter), modules.NewSlashFilter), Override(new(*miner.Miner), modules.SetupBlockProducer), Override(new(gen.WinningPoStProver), storage.NewWinningPoStProver), - Override(new(*storage.Miner), modules.StorageMiner(cfg.Fees)), + Override(PreflightChecksKey, modules.PreflightChecks), + Override(new(*sealing.Sealing), modules.SealingPipeline(cfg.Fees)), + Override(new(*wdpost.WindowPoStScheduler), modules.WindowPostScheduler(cfg.Fees, cfg.Proving)), - Override(new(sectorblocks.SectorBuilder), From(new(*storage.Miner))), + Override(new(sectorblocks.SectorBuilder), From(new(*sealing.Sealing))), ), If(cfg.Subsystems.EnableSectorStorage, diff --git a/node/impl/storminer.go b/node/impl/storminer.go index 74f4429ef..4d1659dbd 100644 --- a/node/impl/storminer.go +++ b/node/impl/storminer.go @@ -49,7 +49,6 @@ import ( "github.com/filecoin-project/lotus/miner" "github.com/filecoin-project/lotus/node/modules" "github.com/filecoin-project/lotus/node/modules/dtypes" - "github.com/filecoin-project/lotus/storage" "github.com/filecoin-project/lotus/storage/ctladdr" "github.com/filecoin-project/lotus/storage/paths" sealing "github.com/filecoin-project/lotus/storage/pipeline" @@ -88,7 +87,7 @@ type StorageMinerAPI struct { DAGStoreWrapper *mktsdagstore.Wrapper `optional:"true"` // Miner / storage - Miner *storage.Miner `optional:"true"` + Miner *sealing.Sealing `optional:"true"` BlockMiner *miner.Miner `optional:"true"` StorageMgr *sealer.Manager `optional:"true"` IStorageMgr sealer.SectorManager `optional:"true"` @@ -405,7 +404,11 @@ func (sm *StorageMinerAPI) SectorPreCommitPending(ctx context.Context) ([]abi.Se } func (sm *StorageMinerAPI) SectorMarkForUpgrade(ctx context.Context, id abi.SectorNumber, snap bool) error { - return sm.Miner.MarkForUpgrade(ctx, id, snap) + if !snap { + return fmt.Errorf("non-snap upgrades are not supported") + } + + return sm.Miner.MarkForUpgrade(ctx, id) } func (sm *StorageMinerAPI) SectorAbortUpgrade(ctx context.Context, number abi.SectorNumber) error { diff --git a/node/modules/storageminer.go b/node/modules/storageminer.go index fc6c6d888..c28342504 100644 --- a/node/modules/storageminer.go +++ b/node/modules/storageminer.go @@ -50,6 +50,7 @@ import ( "github.com/filecoin-project/lotus/blockstore" "github.com/filecoin-project/lotus/build" "github.com/filecoin-project/lotus/chain/actors/builtin/miner" + "github.com/filecoin-project/lotus/chain/events" "github.com/filecoin-project/lotus/chain/gen" "github.com/filecoin-project/lotus/chain/gen/slashfilter" "github.com/filecoin-project/lotus/chain/types" @@ -64,7 +65,6 @@ import ( "github.com/filecoin-project/lotus/node/modules/dtypes" "github.com/filecoin-project/lotus/node/modules/helpers" "github.com/filecoin-project/lotus/node/repo" - "github.com/filecoin-project/lotus/storage" "github.com/filecoin-project/lotus/storage/ctladdr" "github.com/filecoin-project/lotus/storage/paths" sealing "github.com/filecoin-project/lotus/storage/pipeline" @@ -202,7 +202,37 @@ func AddressSelector(addrConf *config.MinerAddressConfig) func() (*ctladdr.Addre } } -type StorageMinerParams struct { +func PreflightChecks(mctx helpers.MetricsCtx, lc fx.Lifecycle, api v1api.FullNode, maddr dtypes.MinerAddress) error { + ctx := helpers.LifecycleCtx(mctx, lc) + + lc.Append(fx.Hook{OnStart: func(context.Context) error { + mi, err := api.StateMinerInfo(ctx, address.Address(maddr), types.EmptyTSK) + if err != nil { + return xerrors.Errorf("failed to resolve miner info: %w", err) + } + + workerKey, err := api.StateAccountKey(ctx, mi.Worker, types.EmptyTSK) + if err != nil { + return xerrors.Errorf("failed to resolve worker key: %w", err) + } + + has, err := api.WalletHas(ctx, workerKey) + if err != nil { + return xerrors.Errorf("failed to check wallet for worker key: %w", err) + } + + if !has { + return errors.New("key for worker not found in local wallet") + } + + log.Infof("starting up miner %s, worker addr %s", maddr, workerKey) + return nil + }}) + + return nil +} + +type SealingPipelineParams struct { fx.In Lifecycle fx.Lifecycle @@ -219,8 +249,8 @@ type StorageMinerParams struct { Maddr dtypes.MinerAddress } -func StorageMiner(fc config.MinerFeeConfig) func(params StorageMinerParams) (*storage.Miner, error) { - return func(params StorageMinerParams) (*storage.Miner, error) { +func SealingPipeline(fc config.MinerFeeConfig) func(params SealingPipelineParams) (*sealing.Sealing, error) { + return func(params SealingPipelineParams) (*sealing.Sealing, error) { var ( ds = params.MetadataDS mctx = params.MetricsCtx @@ -238,24 +268,34 @@ func StorageMiner(fc config.MinerFeeConfig) func(params StorageMinerParams) (*st ctx := helpers.LifecycleCtx(mctx, lc) - sm, err := storage.NewMiner(api, maddr, ds, sealer, sc, verif, prover, gsd, fc, j, as) + evts, err := events.NewEvents(ctx, api) if err != nil { - return nil, err + return nil, xerrors.Errorf("failed to subscribe to events: %w", err) } + md, err := api.StateMinerProvingDeadline(ctx, maddr, types.EmptyTSK) + if err != nil { + return nil, xerrors.Errorf("getting miner info: %w", err) + } + provingBuffer := md.WPoStProvingPeriod * 2 + pcp := sealing.NewBasicPreCommitPolicy(api, gsd, provingBuffer) + + pipeline := sealing.New(ctx, api, fc, evts, maddr, ds, sealer, sc, verif, prover, &pcp, gsd, j, as) + lc.Append(fx.Hook{ OnStart: func(context.Context) error { - return sm.Run(ctx) + go pipeline.Run(ctx) + return nil }, - OnStop: sm.Stop, + OnStop: pipeline.Stop, }) - return sm, nil + return pipeline, nil } } -func WindowPostScheduler(fc config.MinerFeeConfig, pc config.ProvingConfig) func(params StorageMinerParams) (*wdpost.WindowPoStScheduler, error) { - return func(params StorageMinerParams) (*wdpost.WindowPoStScheduler, error) { +func WindowPostScheduler(fc config.MinerFeeConfig, pc config.ProvingConfig) func(params SealingPipelineParams) (*wdpost.WindowPoStScheduler, error) { + return func(params SealingPipelineParams) (*wdpost.WindowPoStScheduler, error) { var ( mctx = params.MetricsCtx lc = params.Lifecycle diff --git a/storage/miner.go b/storage/miner.go deleted file mode 100644 index fadd94962..000000000 --- a/storage/miner.go +++ /dev/null @@ -1,266 +0,0 @@ -package storage - -import ( - "context" - "errors" - "time" - - blocks "github.com/ipfs/go-block-format" - "github.com/ipfs/go-cid" - "github.com/ipfs/go-datastore" - logging "github.com/ipfs/go-log/v2" - "golang.org/x/xerrors" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-bitfield" - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/builtin/v8/miner" - "github.com/filecoin-project/go-state-types/crypto" - "github.com/filecoin-project/go-state-types/dline" - "github.com/filecoin-project/go-state-types/network" - - "github.com/filecoin-project/lotus/api" - "github.com/filecoin-project/lotus/api/v1api" - "github.com/filecoin-project/lotus/build" - "github.com/filecoin-project/lotus/chain/actors/builtin" - lminer "github.com/filecoin-project/lotus/chain/actors/builtin/miner" - "github.com/filecoin-project/lotus/chain/events" - "github.com/filecoin-project/lotus/chain/gen" - "github.com/filecoin-project/lotus/chain/types" - "github.com/filecoin-project/lotus/journal" - "github.com/filecoin-project/lotus/node/config" - "github.com/filecoin-project/lotus/node/modules/dtypes" - "github.com/filecoin-project/lotus/storage/ctladdr" - pipeline "github.com/filecoin-project/lotus/storage/pipeline" - "github.com/filecoin-project/lotus/storage/sealer" - "github.com/filecoin-project/lotus/storage/sealer/storiface" -) - -var log = logging.Logger("storageminer") - -// Miner is the central miner entrypoint object inside Lotus. It is -// instantiated in the node builder, along with the WindowPoStScheduler. -// -// This object is the owner of the sealing pipeline. Most of the actual logic -// lives in the pipeline module (sealing.Sealing), and the Miner object -// exposes it to the rest of the system by proxying calls. -// -// Miner#Run starts the sealing FSM. -type Miner struct { - api fullNodeFilteredAPI - feeCfg config.MinerFeeConfig - sealer sealer.SectorManager - ds datastore.Batching - sc pipeline.SectorIDCounter - verif storiface.Verifier - prover storiface.Prover - addrSel *ctladdr.AddressSelector - - maddr address.Address - - getSealConfig dtypes.GetSealingConfigFunc - sealing *pipeline.Sealing - - journal journal.Journal -} - -// fullNodeFilteredAPI is the subset of the full node API the Miner needs from -// a Lotus full node. -type fullNodeFilteredAPI interface { - // Call a read only method on actors (no interaction with the chain required) - StateCall(context.Context, *types.Message, types.TipSetKey) (*api.InvocResult, error) - StateMinerSectors(context.Context, address.Address, *bitfield.BitField, types.TipSetKey) ([]*miner.SectorOnChainInfo, error) - StateSectorPreCommitInfo(context.Context, address.Address, abi.SectorNumber, types.TipSetKey) (*miner.SectorPreCommitOnChainInfo, error) - StateSectorGetInfo(context.Context, address.Address, abi.SectorNumber, types.TipSetKey) (*miner.SectorOnChainInfo, error) - StateSectorPartition(ctx context.Context, maddr address.Address, sectorNumber abi.SectorNumber, tok types.TipSetKey) (*lminer.SectorLocation, error) - StateMinerInfo(context.Context, address.Address, types.TipSetKey) (api.MinerInfo, error) - StateMinerAvailableBalance(ctx context.Context, maddr address.Address, tok types.TipSetKey) (types.BigInt, error) - StateMinerActiveSectors(context.Context, address.Address, types.TipSetKey) ([]*miner.SectorOnChainInfo, error) - StateMinerDeadlines(context.Context, address.Address, types.TipSetKey) ([]api.Deadline, error) - StateMinerPartitions(context.Context, address.Address, uint64, types.TipSetKey) ([]api.Partition, error) - StateMinerProvingDeadline(context.Context, address.Address, types.TipSetKey) (*dline.Info, error) - StateMinerPreCommitDepositForPower(context.Context, address.Address, miner.SectorPreCommitInfo, types.TipSetKey) (types.BigInt, error) - StateMinerInitialPledgeCollateral(context.Context, address.Address, miner.SectorPreCommitInfo, types.TipSetKey) (types.BigInt, error) - StateMinerSectorAllocated(context.Context, address.Address, abi.SectorNumber, types.TipSetKey) (bool, error) - StateSearchMsg(ctx context.Context, from types.TipSetKey, msg cid.Cid, limit abi.ChainEpoch, allowReplaced bool) (*api.MsgLookup, error) - StateWaitMsg(ctx context.Context, cid cid.Cid, confidence uint64, limit abi.ChainEpoch, allowReplaced bool) (*api.MsgLookup, error) - StateGetActor(ctx context.Context, actor address.Address, ts types.TipSetKey) (*types.Actor, error) - StateMarketStorageDeal(context.Context, abi.DealID, types.TipSetKey) (*api.MarketDeal, error) - StateMinerFaults(context.Context, address.Address, types.TipSetKey) (bitfield.BitField, error) - StateMinerRecoveries(context.Context, address.Address, types.TipSetKey) (bitfield.BitField, error) - StateAccountKey(context.Context, address.Address, types.TipSetKey) (address.Address, error) - StateNetworkVersion(context.Context, types.TipSetKey) (network.Version, error) - StateComputeDataCID(ctx context.Context, maddr address.Address, sectorType abi.RegisteredSealProof, deals []abi.DealID, tsk types.TipSetKey) (cid.Cid, error) - StateLookupID(context.Context, address.Address, types.TipSetKey) (address.Address, error) - - MpoolPushMessage(context.Context, *types.Message, *api.MessageSendSpec) (*types.SignedMessage, error) - - GasEstimateMessageGas(context.Context, *types.Message, *api.MessageSendSpec, types.TipSetKey) (*types.Message, error) - GasEstimateFeeCap(context.Context, *types.Message, int64, types.TipSetKey) (types.BigInt, error) - GasEstimateGasPremium(_ context.Context, nblocksincl uint64, sender address.Address, gaslimit int64, tsk types.TipSetKey) (types.BigInt, error) - - ChainHead(context.Context) (*types.TipSet, error) - ChainNotify(context.Context) (<-chan []*api.HeadChange, error) - StateGetRandomnessFromTickets(ctx context.Context, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte, tsk types.TipSetKey) (abi.Randomness, error) - StateGetRandomnessFromBeacon(ctx context.Context, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte, tsk types.TipSetKey) (abi.Randomness, error) - ChainGetTipSetByHeight(context.Context, abi.ChainEpoch, types.TipSetKey) (*types.TipSet, error) - ChainGetTipSetAfterHeight(context.Context, abi.ChainEpoch, types.TipSetKey) (*types.TipSet, error) - ChainGetBlockMessages(context.Context, cid.Cid) (*api.BlockMessages, error) - ChainGetMessage(ctx context.Context, mc cid.Cid) (*types.Message, error) - ChainGetPath(ctx context.Context, from, to types.TipSetKey) ([]*api.HeadChange, error) - ChainReadObj(context.Context, cid.Cid) ([]byte, error) - ChainHasObj(context.Context, cid.Cid) (bool, error) - ChainPutObj(context.Context, blocks.Block) error - ChainGetTipSet(ctx context.Context, key types.TipSetKey) (*types.TipSet, error) - - WalletSign(context.Context, address.Address, []byte) (*crypto.Signature, error) - WalletBalance(context.Context, address.Address) (types.BigInt, error) - WalletHas(context.Context, address.Address) (bool, error) -} - -// NewMiner creates a new Miner object. -func NewMiner(api fullNodeFilteredAPI, - maddr address.Address, - ds datastore.Batching, - sealer sealer.SectorManager, - sc pipeline.SectorIDCounter, - verif storiface.Verifier, - prover storiface.Prover, - gsd dtypes.GetSealingConfigFunc, - feeCfg config.MinerFeeConfig, - journal journal.Journal, - as *ctladdr.AddressSelector) (*Miner, error) { - m := &Miner{ - api: api, - feeCfg: feeCfg, - sealer: sealer, - ds: ds, - sc: sc, - verif: verif, - prover: prover, - addrSel: as, - - maddr: maddr, - getSealConfig: gsd, - journal: journal, - } - - return m, nil -} - -// Run starts the sealing FSM in the background, running preliminary checks first. -func (m *Miner) Run(ctx context.Context) error { - if err := m.runPreflightChecks(ctx); err != nil { - return xerrors.Errorf("miner preflight checks failed: %w", err) - } - - md, err := m.api.StateMinerProvingDeadline(ctx, m.maddr, types.EmptyTSK) - if err != nil { - return xerrors.Errorf("getting miner info: %w", err) - } - - // consumer of chain head changes. - evts, err := events.NewEvents(ctx, m.api) - if err != nil { - return xerrors.Errorf("failed to subscribe to events: %w", err) - } - - // Instantiate a precommit policy. - cfg := pipeline.GetSealingConfigFunc(m.getSealConfig) - provingBuffer := md.WPoStProvingPeriod * 2 - - pcp := pipeline.NewBasicPreCommitPolicy(m.api, cfg, provingBuffer) - - // Instantiate the sealing FSM. - m.sealing = pipeline.New(ctx, m.api, m.feeCfg, evts, m.maddr, m.ds, m.sealer, m.sc, m.verif, m.prover, &pcp, cfg, m.journal, m.addrSel) - - // Run the sealing FSM. - go m.sealing.Run(ctx) //nolint:errcheck // logged intside the function - - return nil -} - -func (m *Miner) Stop(ctx context.Context) error { - return m.sealing.Stop(ctx) -} - -// runPreflightChecks verifies that preconditions to run the miner are satisfied. -func (m *Miner) runPreflightChecks(ctx context.Context) error { - mi, err := m.api.StateMinerInfo(ctx, m.maddr, types.EmptyTSK) - if err != nil { - return xerrors.Errorf("failed to resolve miner info: %w", err) - } - - workerKey, err := m.api.StateAccountKey(ctx, mi.Worker, types.EmptyTSK) - if err != nil { - return xerrors.Errorf("failed to resolve worker key: %w", err) - } - - has, err := m.api.WalletHas(ctx, workerKey) - if err != nil { - return xerrors.Errorf("failed to check wallet for worker key: %w", err) - } - - if !has { - return errors.New("key for worker not found in local wallet") - } - - log.Infof("starting up miner %s, worker addr %s", m.maddr, workerKey) - return nil -} - -type StorageWpp struct { - prover storiface.ProverPoSt - verifier storiface.Verifier - miner abi.ActorID - winnRpt abi.RegisteredPoStProof -} - -func NewWinningPoStProver(api v1api.FullNode, prover storiface.ProverPoSt, verifier storiface.Verifier, miner dtypes.MinerID) (*StorageWpp, error) { - ma, err := address.NewIDAddress(uint64(miner)) - if err != nil { - return nil, err - } - - mi, err := api.StateMinerInfo(context.TODO(), ma, types.EmptyTSK) - if err != nil { - return nil, xerrors.Errorf("getting sector size: %w", err) - } - - if build.InsecurePoStValidation { - log.Warn("*****************************************************************************") - log.Warn(" Generating fake PoSt proof! You should only see this while running tests! ") - log.Warn("*****************************************************************************") - } - - return &StorageWpp{prover, verifier, abi.ActorID(miner), mi.WindowPoStProofType}, nil -} - -var _ gen.WinningPoStProver = (*StorageWpp)(nil) - -func (wpp *StorageWpp) GenerateCandidates(ctx context.Context, randomness abi.PoStRandomness, eligibleSectorCount uint64) ([]uint64, error) { - start := build.Clock.Now() - - cds, err := wpp.verifier.GenerateWinningPoStSectorChallenge(ctx, wpp.winnRpt, wpp.miner, randomness, eligibleSectorCount) - if err != nil { - return nil, xerrors.Errorf("failed to generate candidates: %w", err) - } - log.Infof("Generate candidates took %s (C: %+v)", time.Since(start), cds) - return cds, nil -} - -func (wpp *StorageWpp) ComputeProof(ctx context.Context, ssi []builtin.ExtendedSectorInfo, rand abi.PoStRandomness, currEpoch abi.ChainEpoch, nv network.Version) ([]builtin.PoStProof, error) { - if build.InsecurePoStValidation { - return []builtin.PoStProof{{ProofBytes: []byte("valid proof")}}, nil - } - - log.Infof("Computing WinningPoSt ;%+v; %v", ssi, rand) - - start := build.Clock.Now() - proof, err := wpp.prover.GenerateWinningPoSt(ctx, wpp.miner, ssi, rand) - if err != nil { - return nil, err - } - log.Infof("GenerateWinningPoSt took %s", time.Since(start)) - return proof, nil -} diff --git a/storage/miner_sealing.go b/storage/miner_sealing.go deleted file mode 100644 index 11db5a845..000000000 --- a/storage/miner_sealing.go +++ /dev/null @@ -1,165 +0,0 @@ -package storage - -import ( - "context" - - "github.com/ipfs/go-cid" - "golang.org/x/xerrors" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/big" - - "github.com/filecoin-project/lotus/api" - pipeline "github.com/filecoin-project/lotus/storage/pipeline" - "github.com/filecoin-project/lotus/storage/pipeline/sealiface" - "github.com/filecoin-project/lotus/storage/sealer/storiface" - "github.com/filecoin-project/lotus/storage/sectorblocks" -) - -// TODO: refactor this to be direct somehow - -func (m *Miner) Address() address.Address { - return m.sealing.Address() -} - -func (m *Miner) StartPackingSector(sectorNum abi.SectorNumber) error { - return m.sealing.StartPacking(sectorNum) -} - -func (m *Miner) ListSectors() ([]pipeline.SectorInfo, error) { - return m.sealing.ListSectors() -} - -func (m *Miner) PledgeSector(ctx context.Context) (storiface.SectorRef, error) { - return m.sealing.PledgeSector(ctx) -} - -func (m *Miner) ForceSectorState(ctx context.Context, id abi.SectorNumber, state pipeline.SectorState) error { - return m.sealing.ForceSectorState(ctx, id, state) -} - -func (m *Miner) RemoveSector(ctx context.Context, id abi.SectorNumber) error { - return m.sealing.Remove(ctx, id) -} - -func (m *Miner) TerminateSector(ctx context.Context, id abi.SectorNumber) error { - return m.sealing.Terminate(ctx, id) -} - -func (m *Miner) TerminateFlush(ctx context.Context) (*cid.Cid, error) { - return m.sealing.TerminateFlush(ctx) -} - -func (m *Miner) TerminatePending(ctx context.Context) ([]abi.SectorID, error) { - return m.sealing.TerminatePending(ctx) -} - -func (m *Miner) SectorPreCommitFlush(ctx context.Context) ([]sealiface.PreCommitBatchRes, error) { - return m.sealing.SectorPreCommitFlush(ctx) -} - -func (m *Miner) SectorPreCommitPending(ctx context.Context) ([]abi.SectorID, error) { - return m.sealing.SectorPreCommitPending(ctx) -} - -func (m *Miner) CommitFlush(ctx context.Context) ([]sealiface.CommitBatchRes, error) { - return m.sealing.CommitFlush(ctx) -} - -func (m *Miner) CommitPending(ctx context.Context) ([]abi.SectorID, error) { - return m.sealing.CommitPending(ctx) -} - -func (m *Miner) SectorMatchPendingPiecesToOpenSectors(ctx context.Context) error { - return m.sealing.MatchPendingPiecesToOpenSectors(ctx) -} - -func (m *Miner) MarkForUpgrade(ctx context.Context, id abi.SectorNumber, snap bool) error { - if snap { - return m.sealing.MarkForSnapUpgrade(ctx, id) - } - return xerrors.Errorf("Old CC upgrade deprecated, use snap deals CC upgrade") -} - -func (m *Miner) SectorAbortUpgrade(sectorNum abi.SectorNumber) error { - return m.sealing.AbortUpgrade(sectorNum) -} - -func (m *Miner) SectorAddPieceToAny(ctx context.Context, size abi.UnpaddedPieceSize, r storiface.Data, d api.PieceDealInfo) (api.SectorOffset, error) { - return m.sealing.SectorAddPieceToAny(ctx, size, r, d) -} - -func (m *Miner) SectorsStatus(ctx context.Context, sid abi.SectorNumber, showOnChainInfo bool) (api.SectorInfo, error) { - if showOnChainInfo { - return api.SectorInfo{}, xerrors.Errorf("on-chain info not supported") - } - - info, err := m.sealing.GetSectorInfo(sid) - if err != nil { - return api.SectorInfo{}, err - } - - deals := make([]abi.DealID, len(info.Pieces)) - pieces := make([]api.SectorPiece, len(info.Pieces)) - for i, piece := range info.Pieces { - pieces[i].Piece = piece.Piece - if piece.DealInfo == nil { - continue - } - - pdi := *piece.DealInfo // copy - pieces[i].DealInfo = &pdi - - deals[i] = piece.DealInfo.DealID - } - - log := make([]api.SectorLog, len(info.Log)) - for i, l := range info.Log { - log[i] = api.SectorLog{ - Kind: l.Kind, - Timestamp: l.Timestamp, - Trace: l.Trace, - Message: l.Message, - } - } - - sInfo := api.SectorInfo{ - SectorID: sid, - State: api.SectorState(info.State), - CommD: info.CommD, - CommR: info.CommR, - Proof: info.Proof, - Deals: deals, - Pieces: pieces, - Ticket: api.SealTicket{ - Value: info.TicketValue, - Epoch: info.TicketEpoch, - }, - Seed: api.SealSeed{ - Value: info.SeedValue, - Epoch: info.SeedEpoch, - }, - PreCommitMsg: info.PreCommitMessage, - CommitMsg: info.CommitMessage, - Retries: info.InvalidProofs, - ToUpgrade: false, - ReplicaUpdateMessage: info.ReplicaUpdateMessage, - - LastErr: info.LastErr, - Log: log, - // on chain info - SealProof: info.SectorType, - Activation: 0, - Expiration: 0, - DealWeight: big.Zero(), - VerifiedDealWeight: big.Zero(), - InitialPledge: big.Zero(), - OnTime: 0, - Early: 0, - } - - return sInfo, nil -} - -var _ sectorblocks.SectorBuilder = &Miner{} diff --git a/storage/pipeline/commit_batch.go b/storage/pipeline/commit_batch.go index 8ab7d77c5..d3d6fd12c 100644 --- a/storage/pipeline/commit_batch.go +++ b/storage/pipeline/commit_batch.go @@ -25,6 +25,7 @@ import ( "github.com/filecoin-project/lotus/chain/actors/policy" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/node/config" + "github.com/filecoin-project/lotus/node/modules/dtypes" "github.com/filecoin-project/lotus/storage/pipeline/sealiface" "github.com/filecoin-project/lotus/storage/sealer/storiface" ) @@ -63,7 +64,7 @@ type CommitBatcher struct { mctx context.Context addrSel AddressSelector feeCfg config.MinerFeeConfig - getConfig GetSealingConfigFunc + getConfig dtypes.GetSealingConfigFunc prover storiface.Prover cutoffs map[abi.SectorNumber]time.Time @@ -75,7 +76,7 @@ type CommitBatcher struct { lk sync.Mutex } -func NewCommitBatcher(mctx context.Context, maddr address.Address, api CommitBatcherApi, addrSel AddressSelector, feeCfg config.MinerFeeConfig, getConfig GetSealingConfigFunc, prov storiface.Prover) *CommitBatcher { +func NewCommitBatcher(mctx context.Context, maddr address.Address, api CommitBatcherApi, addrSel AddressSelector, feeCfg config.MinerFeeConfig, getConfig dtypes.GetSealingConfigFunc, prov storiface.Prover) *CommitBatcher { b := &CommitBatcher{ api: api, maddr: maddr, diff --git a/storage/pipeline/commit_batch_test.go b/storage/pipeline/commit_batch_test.go index 439ee0ed1..b25b78438 100644 --- a/storage/pipeline/commit_batch_test.go +++ b/storage/pipeline/commit_batch_test.go @@ -4,7 +4,6 @@ package sealing_test import ( "bytes" "context" - "github.com/filecoin-project/lotus/storage/ctladdr" "sort" "sync" "testing" @@ -25,6 +24,7 @@ import ( "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/chain/types" + "github.com/filecoin-project/lotus/storage/ctladdr" pipeline "github.com/filecoin-project/lotus/storage/pipeline" "github.com/filecoin-project/lotus/storage/pipeline/mocks" "github.com/filecoin-project/lotus/storage/pipeline/sealiface" diff --git a/storage/pipeline/input.go b/storage/pipeline/input.go index d59630e84..a95e9cbf7 100644 --- a/storage/pipeline/input.go +++ b/storage/pipeline/input.go @@ -23,6 +23,7 @@ import ( "github.com/filecoin-project/lotus/storage/sealer" "github.com/filecoin-project/lotus/storage/sealer/ffiwrapper" "github.com/filecoin-project/lotus/storage/sealer/storiface" + "github.com/filecoin-project/lotus/storage/sectorblocks" ) func (m *Sealing) handleWaitDeals(ctx statemachine.Context, sector SectorInfo) error { @@ -376,7 +377,7 @@ func waitAddPieceResp(ctx context.Context, pp *pendingPiece) (*pieceAcceptResp, } } -func (m *Sealing) MatchPendingPiecesToOpenSectors(ctx context.Context) error { +func (m *Sealing) SectorMatchPendingPiecesToOpenSectors(ctx context.Context) error { sp, err := m.currentSealProof(ctx) if err != nil { return xerrors.Errorf("failed to get current seal proof: %w", err) @@ -708,14 +709,14 @@ func (m *Sealing) tryGetDealSector(ctx context.Context, sp abi.RegisteredSealPro return nil } -func (m *Sealing) StartPacking(sid abi.SectorNumber) error { +func (m *Sealing) StartPackingSector(sid abi.SectorNumber) error { m.startupWait.Wait() log.Infow("starting to seal deal sector", "sector", sid, "trigger", "user") return m.sectors.Send(uint64(sid), SectorStartPacking{}) } -func (m *Sealing) AbortUpgrade(sid abi.SectorNumber) error { +func (m *Sealing) SectorAbortUpgrade(sid abi.SectorNumber) error { m.startupWait.Wait() m.inputLk.Lock() @@ -727,6 +728,78 @@ func (m *Sealing) AbortUpgrade(sid abi.SectorNumber) error { return m.sectors.Send(uint64(sid), SectorAbortUpgrade{xerrors.New("triggered by user")}) } +func (m *Sealing) SectorsStatus(ctx context.Context, sid abi.SectorNumber, showOnChainInfo bool) (api.SectorInfo, error) { + if showOnChainInfo { + return api.SectorInfo{}, xerrors.Errorf("on-chain info not supported") + } + + info, err := m.GetSectorInfo(sid) + if err != nil { + return api.SectorInfo{}, err + } + + deals := make([]abi.DealID, len(info.Pieces)) + pieces := make([]api.SectorPiece, len(info.Pieces)) + for i, piece := range info.Pieces { + pieces[i].Piece = piece.Piece + if piece.DealInfo == nil { + continue + } + + pdi := *piece.DealInfo // copy + pieces[i].DealInfo = &pdi + + deals[i] = piece.DealInfo.DealID + } + + log := make([]api.SectorLog, len(info.Log)) + for i, l := range info.Log { + log[i] = api.SectorLog{ + Kind: l.Kind, + Timestamp: l.Timestamp, + Trace: l.Trace, + Message: l.Message, + } + } + + sInfo := api.SectorInfo{ + SectorID: sid, + State: api.SectorState(info.State), + CommD: info.CommD, + CommR: info.CommR, + Proof: info.Proof, + Deals: deals, + Pieces: pieces, + Ticket: api.SealTicket{ + Value: info.TicketValue, + Epoch: info.TicketEpoch, + }, + Seed: api.SealSeed{ + Value: info.SeedValue, + Epoch: info.SeedEpoch, + }, + PreCommitMsg: info.PreCommitMessage, + CommitMsg: info.CommitMessage, + Retries: info.InvalidProofs, + ToUpgrade: false, + ReplicaUpdateMessage: info.ReplicaUpdateMessage, + + LastErr: info.LastErr, + Log: log, + // on chain info + SealProof: info.SectorType, + Activation: 0, + Expiration: 0, + DealWeight: big.Zero(), + VerifiedDealWeight: big.Zero(), + InitialPledge: big.Zero(), + OnTime: 0, + Early: 0, + } + + return sInfo, nil +} + func proposalCID(deal api.PieceDealInfo) cid.Cid { pc, err := deal.DealProposal.Cid() if err != nil { @@ -736,3 +809,5 @@ func proposalCID(deal api.PieceDealInfo) cid.Cid { return pc } + +var _ sectorblocks.SectorBuilder = &Sealing{} diff --git a/storage/pipeline/precommit_batch.go b/storage/pipeline/precommit_batch.go index cb34e7f6c..d0de68daa 100644 --- a/storage/pipeline/precommit_batch.go +++ b/storage/pipeline/precommit_batch.go @@ -22,6 +22,7 @@ import ( "github.com/filecoin-project/lotus/chain/actors/policy" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/node/config" + "github.com/filecoin-project/lotus/node/modules/dtypes" "github.com/filecoin-project/lotus/storage/pipeline/sealiface" ) @@ -52,7 +53,7 @@ type PreCommitBatcher struct { mctx context.Context addrSel AddressSelector feeCfg config.MinerFeeConfig - getConfig GetSealingConfigFunc + getConfig dtypes.GetSealingConfigFunc cutoffs map[abi.SectorNumber]time.Time todo map[abi.SectorNumber]*preCommitEntry @@ -63,7 +64,7 @@ type PreCommitBatcher struct { lk sync.Mutex } -func NewPreCommitBatcher(mctx context.Context, maddr address.Address, api PreCommitBatcherApi, addrSel AddressSelector, feeCfg config.MinerFeeConfig, getConfig GetSealingConfigFunc) *PreCommitBatcher { +func NewPreCommitBatcher(mctx context.Context, maddr address.Address, api PreCommitBatcherApi, addrSel AddressSelector, feeCfg config.MinerFeeConfig, getConfig dtypes.GetSealingConfigFunc) *PreCommitBatcher { b := &PreCommitBatcher{ api: api, maddr: maddr, diff --git a/storage/pipeline/precommit_policy.go b/storage/pipeline/precommit_policy.go index 8a753ccf9..e0761d209 100644 --- a/storage/pipeline/precommit_policy.go +++ b/storage/pipeline/precommit_policy.go @@ -12,6 +12,7 @@ import ( "github.com/filecoin-project/lotus/chain/actors/builtin" "github.com/filecoin-project/lotus/chain/actors/policy" "github.com/filecoin-project/lotus/chain/types" + "github.com/filecoin-project/lotus/node/modules/dtypes" ) type PreCommitPolicy interface { @@ -39,7 +40,7 @@ type Chain interface { // current epoch + the provided default duration. type BasicPreCommitPolicy struct { api Chain - getSealingConfig GetSealingConfigFunc + getSealingConfig dtypes.GetSealingConfigFunc provingBuffer abi.ChainEpoch } @@ -48,7 +49,7 @@ type BasicPreCommitPolicy struct { // // The provided duration is used as the default sector expiry when the sector // contains no deals. The proving boundary is used to adjust/align the sector's expiration. -func NewBasicPreCommitPolicy(api Chain, cfgGetter GetSealingConfigFunc, provingBuffer abi.ChainEpoch) BasicPreCommitPolicy { +func NewBasicPreCommitPolicy(api Chain, cfgGetter dtypes.GetSealingConfigFunc, provingBuffer abi.ChainEpoch) BasicPreCommitPolicy { return BasicPreCommitPolicy{ api: api, getSealingConfig: cfgGetter, diff --git a/storage/pipeline/sealing.go b/storage/pipeline/sealing.go index 072307bf5..c261c0468 100644 --- a/storage/pipeline/sealing.go +++ b/storage/pipeline/sealing.go @@ -26,6 +26,7 @@ import ( "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/journal" "github.com/filecoin-project/lotus/node/config" + "github.com/filecoin-project/lotus/node/modules/dtypes" "github.com/filecoin-project/lotus/storage/ctladdr" "github.com/filecoin-project/lotus/storage/pipeline/sealiface" "github.com/filecoin-project/lotus/storage/sealer" @@ -119,7 +120,7 @@ type Sealing struct { precommiter *PreCommitBatcher commiter *CommitBatcher - getConfig GetSealingConfigFunc + getConfig dtypes.GetSealingConfigFunc } type openSector struct { @@ -160,7 +161,7 @@ type pendingPiece struct { accepted func(abi.SectorNumber, abi.UnpaddedPieceSize, error) } -func New(mctx context.Context, api SealingAPI, fc config.MinerFeeConfig, events Events, maddr address.Address, ds datastore.Batching, sealer sealer.SectorManager, sc SectorIDCounter, verif storiface.Verifier, prov storiface.Prover, pcp PreCommitPolicy, gc GetSealingConfigFunc, journal journal.Journal, addrSel AddressSelector) *Sealing { +func New(mctx context.Context, api SealingAPI, fc config.MinerFeeConfig, events Events, maddr address.Address, ds datastore.Batching, sealer sealer.SectorManager, sc SectorIDCounter, verif storiface.Verifier, prov storiface.Prover, pcp PreCommitPolicy, gc dtypes.GetSealingConfigFunc, journal journal.Journal, addrSel AddressSelector) *Sealing { s := &Sealing{ Api: api, DealInfo: &CurrentDealInfoManager{api}, @@ -218,6 +219,7 @@ func New(mctx context.Context, api SealingAPI, fc config.MinerFeeConfig, events } func (m *Sealing) Run(ctx context.Context) error { + if err := m.restartSectors(ctx); err != nil { log.Errorf("%+v", err) return xerrors.Errorf("failed load sector states: %w", err) @@ -237,13 +239,13 @@ func (m *Sealing) Stop(ctx context.Context) error { return nil } -func (m *Sealing) Remove(ctx context.Context, sid abi.SectorNumber) error { +func (m *Sealing) RemoveSector(ctx context.Context, sid abi.SectorNumber) error { m.startupWait.Wait() return m.sectors.Send(uint64(sid), SectorRemove{}) } -func (m *Sealing) Terminate(ctx context.Context, sid abi.SectorNumber) error { +func (m *Sealing) TerminateSector(ctx context.Context, sid abi.SectorNumber) error { m.startupWait.Wait() return m.sectors.Send(uint64(sid), SectorTerminate{}) diff --git a/storage/pipeline/terminate_batch.go b/storage/pipeline/terminate_batch.go index 9212cbc65..4842a4e1b 100644 --- a/storage/pipeline/terminate_batch.go +++ b/storage/pipeline/terminate_batch.go @@ -22,6 +22,7 @@ import ( lminer "github.com/filecoin-project/lotus/chain/actors/builtin/miner" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/node/config" + "github.com/filecoin-project/lotus/node/modules/dtypes" ) type TerminateBatcherApi interface { @@ -44,7 +45,7 @@ type TerminateBatcher struct { mctx context.Context addrSel AddressSelector feeCfg config.MinerFeeConfig - getConfig GetSealingConfigFunc + getConfig dtypes.GetSealingConfigFunc todo map[lminer.SectorLocation]*bitfield.BitField // MinerSectorLocation -> BitField @@ -55,7 +56,7 @@ type TerminateBatcher struct { lk sync.Mutex } -func NewTerminationBatcher(mctx context.Context, maddr address.Address, api TerminateBatcherApi, addrSel AddressSelector, feeCfg config.MinerFeeConfig, getConfig GetSealingConfigFunc) *TerminateBatcher { +func NewTerminationBatcher(mctx context.Context, maddr address.Address, api TerminateBatcherApi, addrSel AddressSelector, feeCfg config.MinerFeeConfig, getConfig dtypes.GetSealingConfigFunc) *TerminateBatcher { b := &TerminateBatcher{ api: api, maddr: maddr, diff --git a/storage/pipeline/types.go b/storage/pipeline/types.go index 17d1edfb7..69045bdfb 100644 --- a/storage/pipeline/types.go +++ b/storage/pipeline/types.go @@ -11,7 +11,6 @@ import ( "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/chain/types" - "github.com/filecoin-project/lotus/storage/pipeline/sealiface" "github.com/filecoin-project/lotus/storage/sealer" "github.com/filecoin-project/lotus/storage/sealer/storiface" ) @@ -195,8 +194,6 @@ type SectorIDCounter interface { Next() (abi.SectorNumber, error) } -type GetSealingConfigFunc func() (sealiface.Config, error) - // SealingStateEvt is a journal event that records a sector state transition. type SealingStateEvt struct { SectorNumber abi.SectorNumber diff --git a/storage/pipeline/upgrade_queue.go b/storage/pipeline/upgrade_queue.go index 97dbf4ced..309e59573 100644 --- a/storage/pipeline/upgrade_queue.go +++ b/storage/pipeline/upgrade_queue.go @@ -11,7 +11,7 @@ import ( "github.com/filecoin-project/lotus/chain/types" ) -func (m *Sealing) MarkForSnapUpgrade(ctx context.Context, id abi.SectorNumber) error { +func (m *Sealing) MarkForUpgrade(ctx context.Context, id abi.SectorNumber) error { si, err := m.GetSectorInfo(id) if err != nil { return xerrors.Errorf("getting sector info: %w", err) diff --git a/storage/winning_prover.go b/storage/winning_prover.go new file mode 100644 index 000000000..d61cd213c --- /dev/null +++ b/storage/winning_prover.go @@ -0,0 +1,79 @@ +package storage + +import ( + "context" + "time" + + logging "github.com/ipfs/go-log/v2" + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/network" + + "github.com/filecoin-project/lotus/api/v1api" + "github.com/filecoin-project/lotus/build" + "github.com/filecoin-project/lotus/chain/actors/builtin" + "github.com/filecoin-project/lotus/chain/gen" + "github.com/filecoin-project/lotus/chain/types" + "github.com/filecoin-project/lotus/node/modules/dtypes" + "github.com/filecoin-project/lotus/storage/sealer/storiface" +) + +var log = logging.Logger("storageminer") + +type StorageWpp struct { + prover storiface.ProverPoSt + verifier storiface.Verifier + miner abi.ActorID + winnRpt abi.RegisteredPoStProof +} + +func NewWinningPoStProver(api v1api.FullNode, prover storiface.ProverPoSt, verifier storiface.Verifier, miner dtypes.MinerID) (*StorageWpp, error) { + ma, err := address.NewIDAddress(uint64(miner)) + if err != nil { + return nil, err + } + + mi, err := api.StateMinerInfo(context.TODO(), ma, types.EmptyTSK) + if err != nil { + return nil, xerrors.Errorf("getting sector size: %w", err) + } + + if build.InsecurePoStValidation { + log.Warn("*****************************************************************************") + log.Warn(" Generating fake PoSt proof! You should only see this while running tests! ") + log.Warn("*****************************************************************************") + } + + return &StorageWpp{prover, verifier, abi.ActorID(miner), mi.WindowPoStProofType}, nil +} + +var _ gen.WinningPoStProver = (*StorageWpp)(nil) + +func (wpp *StorageWpp) GenerateCandidates(ctx context.Context, randomness abi.PoStRandomness, eligibleSectorCount uint64) ([]uint64, error) { + start := build.Clock.Now() + + cds, err := wpp.verifier.GenerateWinningPoStSectorChallenge(ctx, wpp.winnRpt, wpp.miner, randomness, eligibleSectorCount) + if err != nil { + return nil, xerrors.Errorf("failed to generate candidates: %w", err) + } + log.Infof("Generate candidates took %s (C: %+v)", time.Since(start), cds) + return cds, nil +} + +func (wpp *StorageWpp) ComputeProof(ctx context.Context, ssi []builtin.ExtendedSectorInfo, rand abi.PoStRandomness, currEpoch abi.ChainEpoch, nv network.Version) ([]builtin.PoStProof, error) { + if build.InsecurePoStValidation { + return []builtin.PoStProof{{ProofBytes: []byte("valid proof")}}, nil + } + + log.Infof("Computing WinningPoSt ;%+v; %v", ssi, rand) + + start := build.Clock.Now() + proof, err := wpp.prover.GenerateWinningPoSt(ctx, wpp.miner, ssi, rand) + if err != nil { + return nil, err + } + log.Infof("GenerateWinningPoSt took %s", time.Since(start)) + return proof, nil +} From f536257d3cd46335882a3056e7d6b3d58fb867e5 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Tue, 9 Aug 2022 13:38:28 -0400 Subject: [PATCH 005/185] Bump version --- build/openrpc/full.json.gz | Bin 28171 -> 28171 bytes build/openrpc/gateway.json.gz | Bin 4893 -> 4893 bytes build/openrpc/miner.json.gz | Bin 14637 -> 14637 bytes build/openrpc/worker.json.gz | Bin 5001 -> 5001 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 +- 8 files changed, 4 insertions(+), 4 deletions(-) diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index ea033cf21cb7f99fe6cd59bd2304046edfe5731c..24842baa0c73e787fc39fe39322823135f48334d 100644 GIT binary patch delta 23 fcmeCa!`OX?aY85Kw~bwuxg7U@l;3cxWMu#ViuVfi delta 23 fcmeCa!`OX?aY85KwT)esxg70_+V8kkvN8Ywgpmq5 diff --git a/build/openrpc/gateway.json.gz b/build/openrpc/gateway.json.gz index 0f571ca11756eba475afb29e18ee997764e973e8..f4f0d376264848c5e27b7bcd08cc767e6198f1e7 100644 GIT binary patch delta 21 dcmbQMHdk#z9pl`M_0xnngl9(G$o9z4G>t@Iib0|0!Z3eW%m delta 21 dcmZ2mw6gr7YQDZR$T0047r39A4A diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index 10c082b511e96a48832da852df05eec29bb4792a..193c9f0569b42b0459cb5b50338b2e29929a2c10 100644 GIT binary patch delta 4915 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 delta 4915 zcmV-36U^+1Cy6JJgMXdwsfiw?l`Jg~o!h1-o!>r71TI+CU$KP@8l^e0th0S^6kyndqVKdb4*xF$rwcr4 zyLbu>)VW3mwcRT;m4Tyz+j}^{og3mn(?nqr*Z2pLfun()P%Kc)lZd6iNE)jktG@ku>O0s6>)dk)#iyk`3D(PN;Zn4fZKHm_kSx{a?!ti>>^V-r>>9Ka5ye9 zAZ1U2#;xS-c&VB3Dp37OV|LqBRQ>*5mM}$;Vr1HotS#&~s+qUzJojvL*UzBq z!XtmQ`#mOoU1@-LpiVZ&6luBwgA)mB_kD zP{j{~et)CX7chgCltK94Y0f|E|D?S(SyOwk=%_()f^Ru&AkfdYS zi?eCO8crS8W^$cbjDeg@EPHacfF4Ee8FcWO zF*Z4=N0h6Gc@(h-^)MC@)!Gz^*fwg-A@aGywvw<@SXJH~sfkj&O4pr5TH(5d>lUuN z7S}!M=ezD-2%K1m*L6p^a$NTb_%N|;tIPvOne#nx*kc?HcPq-lle9d$XN}2pPV{iM zeSb48iFrnr4?*&}RY_-#CQp@qMbwycDpHV#ckLnloJqiDgu&v&_T?p{^XPGW<>6-| z==iU;i8!f4AZ$~_VcipA=|L<#R3Jo2&2Ns{)xhhrD+^g0t)z95hoFVYOo|ERQ8#!} z=Q=^mLsXM%VLzh1g%WI2u+2BdHudhXfPW%j0xkRlT_MN92E1`hNO^ZGa?9Y~zSzFG zf@H=`1@eSwj2aZQxO{~{P=t3$5i*)xZC~P9`eQov5M?8!>ar9p7zMvq$?Xb`USF43 zrQ5^$_Up4fH$MdM3gCTfz^jhRfj1h9{SY_Id@QI9OKlosH*FN)+A>oW;3~jXfPbq1 z*W-b!uH=L37etT?X@njBjh4T<_9EJ`)or}fsqgjE=)uyp5mO9?=d!k%c}Pfq0B*h$eNypX(pJ=LW3g|K+|-Q=OGi| zO=%r)L77{h+U^3GV6p@d{1pc6%6|ZYv27v)e0Z8;V-7GeF>4~LW8qsA8|>|=1C0k{ zZfaqjbpjwU0R&%JsyX!Lo#bNtvvkJv98Q<&(hzmJ)nj2kNy4M zj=!`Q&OejI6fLKkKE;~9?E5~_)kj@giFIm$=mOD0MDKOW5&dsWO#A85zJI2BLix6U zvM{$RG{a0rWU`cjpAB%Fz5AJI0|RbHOH8FNZI6bkGM+=rLSzU{`@rS0M)5Je3$hx{AHHL81fGd*iI3jS_@{!D(!}b=XK4T}+J{i~&@X zM)rz#=zP@)_%#Z=s6Ca=hkt7yyMYrqc#X_)==d(Zo0 z#nz2dStQ!@S*2BmcpsKBu_$XqKUV4Ss8ZRwGoRP5*0EJ}E@G6%3t&Q7TW$-xzJ?Y+Ya?Zk?& z#C+Gnmr&nK(fcyqSbs;oXgH{#yMpctx+~~z9^HMr)G_0>bBr>ZqLLYMal^fBMT zll`ad(M?rMO~E6ye1?}7Gh(~w3VF8g8td;sWhwUHS^A0=mw)r6hYe^+=ejDh2R9y5 z$>@*kC+H;p*uEWK-gx1!FTtZU{)YQte)Nq))t)|3m85uzrVK`Ex7StlN&=qdOW4mysOeg7G|+}xKfnLTsx!l;@T7lsB>YjG~EmQZj=Wms|ujJsPX6E*xX*$6Hj{CcO zrEM<%0DAv3|FAb4jWoSCQj-H3d;D_3 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 l+|C28Pe>4?Ct{cQl&Uw9R;&Bf{|5j7|Nq8Eu> Date: Wed, 10 Aug 2022 11:44:52 -0700 Subject: [PATCH 006/185] Use lotus snap (and fix typo) for packer builds --- tools/packer/setup-snap.sh | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tools/packer/setup-snap.sh b/tools/packer/setup-snap.sh index 2e921f8da..2bf11086e 100644 --- a/tools/packer/setup-snap.sh +++ b/tools/packer/setup-snap.sh @@ -26,14 +26,14 @@ MANAGED_FILES=( apt update apt reinstall snapd -snap install lotus-filecoin +snap install lotus -snap alias lotus-filecoin.lotus lotus -snap alias lotus-file.con.lotus-daemon lotus-daemon -snap alias lotus-filecoin.lotus-miner lotus-miner -snap alias lotus-filecoin.lotus-worker lotus-worker +snap alias lotus.lotus lotus +snap alias lotus.lotus-daemon lotus-daemon +snap alias lotus.lotus-miner lotus-miner +snap alias lotus.lotus-worker lotus-worker -snap stop lotus-filecoin.lotus-daemon +snap stop lotus.lotus-daemon # Setup firewall yes | ufw enable From f5086c98e847c7676fd0aea55618bebaec11d384 Mon Sep 17 00:00:00 2001 From: Rob Quist Date: Wed, 10 Aug 2022 21:33:19 +0200 Subject: [PATCH 007/185] fix: Add information on what worker a job was assigned to in logs More detailed logs --- storage/sealer/sched_worker.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/storage/sealer/sched_worker.go b/storage/sealer/sched_worker.go index 0cd876511..e6e1f62da 100644 --- a/storage/sealer/sched_worker.go +++ b/storage/sealer/sched_worker.go @@ -366,7 +366,7 @@ assignLoop: todo := firstWindow.Todo[tidx] - log.Debugf("assign worker sector %d", todo.Sector.ID.Number) + log.Debugf("assign worker sector %d to %s", todo.Sector.ID.Number, worker.Info.Hostname) err := sw.startProcessingTask(todo) if err != nil { From f390c186e62a225874c850f0dd248a6d721b90ac Mon Sep 17 00:00:00 2001 From: Shrenuj Bansal Date: Wed, 10 Aug 2022 17:06:01 -0400 Subject: [PATCH 008/185] Close all storage paths on worker shutdown --- api/api_worker.go | 1 + api/proxy_gen.go | 13 +++++++++++++ build/openrpc/full.json.gz | Bin 28171 -> 28171 bytes build/openrpc/gateway.json.gz | Bin 4893 -> 4897 bytes build/openrpc/miner.json.gz | Bin 14637 -> 14637 bytes build/openrpc/worker.json.gz | Bin 5001 -> 5036 bytes cmd/lotus-worker/main.go | 4 ++++ cmd/lotus-worker/sealworker/rpc.go | 14 ++++++++++++++ documentation/en/api-v0-methods-worker.md | 10 ++++++++++ 9 files changed, 42 insertions(+) diff --git a/api/api_worker.go b/api/api_worker.go index 77c22a517..609cb4271 100644 --- a/api/api_worker.go +++ b/api/api_worker.go @@ -62,6 +62,7 @@ type Worker interface { StorageLocal(ctx context.Context) (map[storiface.ID]string, error) //perm:admin StorageAddLocal(ctx context.Context, path string) error //perm:admin StorageDetachLocal(ctx context.Context, path string) error //perm:admin + StorageDetachAll(ctx context.Context) error //perm:admin StorageRedeclareLocal(ctx context.Context, id *storiface.ID, dropMissing bool) error //perm:admin // SetEnabled marks the worker as enabled/disabled. Not that this setting diff --git a/api/proxy_gen.go b/api/proxy_gen.go index 1520a5111..64855ab0f 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -981,6 +981,8 @@ type WorkerStruct struct { StorageAddLocal func(p0 context.Context, p1 string) error `perm:"admin"` + StorageDetachAll func(p0 context.Context) error `perm:"admin"` + StorageDetachLocal func(p0 context.Context, p1 string) error `perm:"admin"` StorageLocal func(p0 context.Context) (map[storiface.ID]string, error) `perm:"admin"` @@ -5668,6 +5670,17 @@ func (s *WorkerStub) StorageAddLocal(p0 context.Context, p1 string) error { return ErrNotSupported } +func (s *WorkerStruct) StorageDetachAll(p0 context.Context) error { + if s.Internal.StorageDetachAll == nil { + return ErrNotSupported + } + return s.Internal.StorageDetachAll(p0) +} + +func (s *WorkerStub) StorageDetachAll(p0 context.Context) error { + return ErrNotSupported +} + func (s *WorkerStruct) StorageDetachLocal(p0 context.Context, p1 string) error { if s.Internal.StorageDetachLocal == nil { return ErrNotSupported diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 24842baa0c73e787fc39fe39322823135f48334d..fb9fd4e66bc7dc466387b17e9ccf8ae222115d6f 100644 GIT binary patch delta 24584 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 INi?{h(GQgMa_0EW1;$jHpu7` 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 I*lqCu0J^OcWB>pF diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index f448d05eb0d21dd68b3136ff13db58172f11be63..7177e4f0712dbff1d6f4f9202bfbbb61932dd1bb 100644 GIT binary patch delta 7013 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 DV9|=r delta 7013 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 Df{vOt diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index 193c9f0569b42b0459cb5b50338b2e29929a2c10..c2201b2dfea8f6fcb7aced4f3f6f314f971a82be 100644 GIT binary patch delta 5024 zcmV;R6JP9!C#)xbABzY8000000RQY=ZF8fzlm99z?#;{=aWLSgRLzSS&+c6Ac6Rem zHam5fq;6!8ZEdjN4)%HRD;fNh?QY=}vs+NxOxkkk_0{rjoaNKcaOAmTcPbS8B> zYNs#B5++kyI(w2RrWTUUq~C4od*Je73_f0*OS1HUTo2oSBq-4xbkq|QJxD8AS|B>N zO;0+zd6EcRu%f?V3mG;hosXt@fsuhESu&AlxY(g#72m&qpV_x$>JtOJ^T03PZ1*0y zSJd?l`W~!{y>k>`*o2}Vv@;I>F9W9wJZigm3Juh`LI$SCz64Gqk*D3daSn3kiz%i-S)y5TGshz86elS-S^<>mfTW21zzWzP~;M5ZF&ek zd;kPn;Ul-yMbvi*_=TXyOm**N@T=?oVbd$$acq|&la*Pqf1+YJ^}llz)^*lR)*UAJ z`&+WQCEve)mt@KF7Ypbvr87yAB?r225sszrviC86S)Mqyhl8guA(Ti^oPHgu)jttS-Nm-d-~VXLDJc9btg;E zGy}n)b>Z3$aw%r@Orhl=S#n~R)-`h!h=kbcGzkTfB^n5@{(H3*ard*U%@up{4>G8f z>=Z|T1vl#&?pCtoqJR6?MW%E{T_3U6;kd|vlwAorx01K-OU=Bm0@bhd&ThJjs^8to z5~e6pj7%Srt%ainum>PWb@OIj=8nDH^)=|aaLM0KEz>e*FZbz3Y-ECg$>|wqH}n$o zVm_yuWffZs6QPn!ckCh0wL{f)2W9jdsC_|OF_UW_`OOlS8$B_y2dKQ9=5mNnC-dvA%Ir^?`s2Ity>Pf(Yx3W zal^vLg4(dwrZINYM**%aGgSe9t^!;IxC(GR9=PgiKDd5C1i6q#*zwwt60-1^jZ7sv#YC4k_6?=Wds1`v#G z6B*#$;~X1vfQgA&7g-w%-=f%HcTXH>+#_?-3LC8V01^{G@RdC^hu*xC48}i6r%cb` zbg52$LIXkV(KF}$r3SS=ooL=YS~&mMKmP6bOMBt`Gg(a0a;oW5toh5n?;~A((501# zQwu~Fh#n$(Pb)|CZNAz;Sl(Bhv;3+>Vx* zN?+I>4OL}4hn9uNEL`Zugw@*%%Cg!nAu;U*L7tbO16#o^1Ea1&47Oz|F@kgxdvSxr z0H)W*Sw|Zs2n8>vvE|lbBWZLoHEJ*iP*ECLE8d~=RVUzADDa|x_Eb6>u6^tVPUPS= zGRL9suLEUeX)EH{jjrCwQncC?<{|Dq?~hemH%euZXftM&q73mdEM;O*(TIMm((j{6 zW9z|uTHjjdR@E8AD9snZgf?eQs#b$B^>RHy5)`T>IDC5i@Ih+LS1aXAGz~i?oHXar zD(rNF1A*ynQGt1Xmf+W?C1sCF|3fV0f3H5x4f0=e^sf&e0#(1qj>GzLQ%G*_I2mhF zo_z{dv$=TRo}>jbaWFO$OrX2`l^C|k%$fO45B2q!M_C(s-mG#n9x-p$KH{5pj<1af zv)8qQ2op?ZhcV%G4bMe|b1Cr6ox>{a#Hz2veAmL4P~S{{)%!Bu*g!pNI;fz#g6;~s zE9h<>-F>~(G2^y#j57N~B{SsWhI`w{(P&%^D%VmzH0b5?p>r~|ISCLelK-Jp`WsO8 zWEmS__p3$THq~)4kVw)-zN5+$u54x&f2hiw>_2UfZkl3h3Lc>4GrT;X5!*$V$g_Rd zSbqm9OR)=oPtsSkxR@_JY(Pso(^Z*Wxb~PzMt@vALMQRZ_U`!N+6#Yu34Yxq1-MH! z<=7rQeNavxgSn@(Hd`f{%zQ-)n{`!H^r0+$g+G!PzFb^iQ*7a%FdVXO@XQ5t8A@8% zTjX5&a&ax4DYEnldMK}ju}uu$brGS`nX;0lZc3DYp*9@$m83MAYc&cKZznC2nv$uj z477pX9jbaltZu)n^t(?sTwlyVJIxQugrm9_4?dbzmNs6av%3!2+dtF7ZB;ZND zg#CkVMkasyb&abzHv%mg&-2Mx^+4=)@P*=p?aF|pv8#S=hKD-axC z-P6v$W$K>x{H;>=l^lH3%-lXSO()pEaetSuw9VxoAW$8%fs$8xfMluGc6onY9qFU~ zKppiH!o@E?pKxj4KkN-hBTes()Z`0|U4A~3>W0ICY~{F5CC9e;Xv zHOvB<6Rw6iKvTkH0YDW&pSQ9eun|wGIoMd&dVs3vN>>@_{a#O=b zf%`YX(1%J-Q~K*kTH{n@t1-Jgc34UntN{M)apL6l^*64iNzqd-~Gw!}kI-l$R4~g67h*=OwIwAm6mVc<>$o(Or z@vhx&1C#~g)f^S%jMEeaRuk8sQNH@1;BfV?8w+Yt{~F@<4XS^J@wZI<)1c5U^-rLJ z{eax?yaqq`c30%}94&w^@_IyGkI3s0c|FI<>&XEFk>m3$GX;_3)8Z5dk>ewBd_;~< z2oWxtA>sww0^OsfSV%b1On*V7`iNAYm$a17DyOWepo z4+R329(0s^uF}aWfg2d~r`^$TI5|O6O*zrc0Xmsz$T%6nzB-ud6WD`8NtV7LJe$+- zjE3KB16n~tnS&z6kX!|Ew@{nepVW2_Kf!2SZQe9&+eqHs=znaX^t>t7hn&0X-tGr% zuj?F_o-!;jbk{bJ=UpMs3w4^y;uD4QP2cyi*}1+hr=rPpPddg6B~ z96?oyEi`gO)qigMe;sDl9Tl3{1G)?swZkLKvNM;RwwA7eciw1VvopqKaBSrEx4!<( zIep9#sHtgWe&3(JkYi7eTaC)(_QCojQf-MUM{Kh+&Fssi;nAIG@%(^H@ zb4zSrkbmYkP5=aHegSVrkmk0&nO+I{I*rwGD(lqs>*b2L7B* zJw(}?QgvCn!aq^?d;it_b&XYqJ#6n;*X0Gk3V(ooZ2;R-ivV_EKk()whlPsZ6i#pi z3Fn{Rhwzw>j;xY=P~-u>NEFs|KHjbKmQTT-bdFrE6pJzdjQ6vmwHMeppV>BR0i61t z=PUp4Eh{JeBe)ow>uyp%EbE0ES6?eKu2@u++s0yL`I#$I&I^nTbWWx=H*bwK-5hI8 z_J2=s)^^x`%Q$O7kE=4)HAmG{Sqch|!$Gbi{IoyojZ0D*=*wiM3Jxqdu;9Q4!}LJU zhv_Q>t#NQ10dJyZtRyc)hwKqrmqAuAL7o?^F0;!4MnZ$)2b6h2Ph)#(?Kx~@j7{DZ z=U7*og8bxYi4|r6{-xlbwUBC=>z^J!e1B*rGkve@^RlJdQfq(Vz0EFv3O08vHdk@& za|<379ph$Qrl!}y_)wkoaeCuz<9u&4J`6l1>kPUGaxTdEOD5;T-Y#;^oA((jx&N*i z5nuh&r+f41#xggP9TWkymRV>UICP#OzeHXs5Kkc9YeT$I!9G#UtzWok|A^GKaDPof zsl%3&k|H$;hKY{H<4Xb)TVlg)z{EEYR}zsHv2G@aiXbYr5S6}Cu<=&{a`%~?Zwv1~ zLEmEjeslD#49~($#7w<~2HOT!QlQZDoFv;18PuI*05Z>;Vr^ ziplJjEZ`DQc#i-CQ}hTtWZ1;?0JQ;g?{EewVt-KR-2q3 z5l>nmXJ({}pQ{qntaL)hnRIGG3QrwK=Rx4I7GoWsh>F4-0KE zR^Oo(m=vvf3YO_+MSnUL9i46jtBt3spk#+=c())+g1wV41iXiWhXrfX@36W$)O#bC z(C#;(-D<)5=lY%S9ssy0S2ESeym&^VeS)z3e{8>rq^HpXiYrA4vx;Cw|r`3)rNNI+`>wnH27-$8{py6kuL3%5v z^~6fQn8mjH}hHzBt z4s~U3ByFie_6w4fzCld?6yIA zWTtkL)V2(=tqB&qAd+^c{NJ|(*ye6zLrfCYRP{KZ%aL@>c^*jz=~=QJL|n&^&ZTZg z?eryC!enYo=g$(w)I!p^^qWn64_sZ2!Oxc$k}N$U*TXh{337A?9re^ikJ3t(7KqMm z)056`pCtkpEbFh>LWYe==V#Nr#K=IBESbnNTQUAneC{d4Ic>3q1lmnCSL zfnd3ex)(H?JBB%e=kdz zqDV0^ZAjJ@_7=b%fFRY(+jX9MHoEI)&~@RGznxm9X3kdb(~elr1RaypGR|h`CFaF^ zPBqIawiYHrC7JG7BG0!dD?5@d?Vd_x-6W`g;s-*%QR)krK}*UY{O>g9pY?yzUY;US z=jTewyVFA~;P;ELz;0ib7MR5TiV}xfzLH~YZ=bi?+x=vpFa%U+^z;`@=l%q^ zXkk+XEKD9GS@K;=I+x~@I^Ox&*(^xXG3>?JG-3^>j%zcy&Md}2&L);UIa@%FBKHh` zI{3_S?eEL~n<3Jf+5hodPaF1Fo3h-48P*t^oYW)ARm41sScG~Qi->A%ibQN1wdN4{ z++kZu*eR?k?~c?&DPE=P&LXXF-NJPX*IkS29`*BG_b&uaEX3=&qg*+z`viQL*tS*X zfuqd%9yshV4u`uH<={zLp53#?WI88*dbr!ZnU=&nBg=;%dEKg{Ge?uBO1~m%%sCY) z$iut#kbcf2U^BvC@nQS&64H6}IKJ}mvk`RsSKCCK)FBYIDdMp139|%O!el1Jgz~5xJgIY?Am$;e$+fT_(cVG{wkg==8)KV)dUser z5io%k{(-KLV_^f{I3}dLI~KWR@NZvi-&{d5c+y1xK&1ORUoEVSW4c*`Avp0(b@RzBS-gN9Dj9jm3V5 z8)iNh)P|)tjj@|H3UFUtN0@&0qF?AL;6&F0I5m zwLo-%=pmx_y5)%eHzuZk{d8$x(>Tu+ZCE&CL=Og%D~SCIL_Yv%(Q_4x1%Md z(wDYJLsc2ip=BX53pctkVdeIMysWeID261zyyDo=WG#wU6Dvi5$E} z<~a2Ib)c*)ZACo4)zy1higvrgIK;i@{jp-}MyV_kZThUzDnq;vOPN@dHKHG@^mtUM zY~7j9>sRa8syY`jO5+7Eq0L#7s?}gjyL#aCj!YvD_%Z>H#feHm}8qh2%|RM1^PcLm)Q zbT^OgzFq2=aoagYnN3m247s@B-ZpYH8drnLwUiGHw0u5vL8dk*0b*J5Ka@&;1IkjC zu@UyZ+REFeI4%YfN!rMFRC&Uc&CKG7s?5p$)As15DyF935n4XO%ZnMYU37&!+joui zcc8Kqd+;oOeMO7Q`O?D%w4`%gmDz(EkEvwz$Mq9*5`S#pjxTS#@Yk2%*KJaO`&3nq z?a{MGzXR>`)tDY?>VDd{v-?W$@|AE-)FJVjFmBemP>DtaXWPxB@0 zXC%~gtv4EIL#?0Re|k#7zOJi!PZ{ZYNL-MYKYlsk(!PJ#8;(Yr-W#dO0gXL=IpOw`@CYIetXnStWF8$G0ICY~@{=D49e*0T z8fF2_30K1$pef<90HBIRpZBsKun|wGd9kss{QyhVkuucPVXEV_ zfvyclJxw3f%~eXo6a1WupSMQm)Be3xI-ha(ZPNK%|9{B3eU6v~3rR-=fPcyoHN0|v zh-kcfx7!8E0`Y2I735r}DOy-fJbyv?>VtyA)xT~ms73v2ShsIb{WFZeW$K>>g?6cb z0u}5>MLbF8?Y954_uJ})v;5HUV24sj4MJ|f0P z#Q1~|;i4HLUT`eX16qoWgnuK=6hx?x2=#eQTM4bwdJ*b#@Jt~wNf0O?P(Yx7KmmaQ z?+gWe!hQ+&&+YzO6Imgmi9|G!h$d>0&bK?7Xtm2vmU>CAzr*+ZjKXOi-q z#~qw;TIHDGFHy?Pq1_ol(+6-TPGPN5#pYmEj>O@?tras=PnE<>lFw9-4Ka*O1Gr?te5 zT=Y;NVCh9i$#j)&Rtem|pg--7hQrAznrh0aZVu4tL_@~u2=>*%RG+{e97?kEH^Q?y z4ex09%{HJFRFt_WVhqW3uMbH3^OJ~lfyH|10`Sx|}9Z%X5{^R%4#1|Mc* z$mRxjI{{V^u&3ZDXf^P{{4$tDH`JL?LTd@0=7>b;?uZlC2RsU0>fMn8J;|ognc<1Q zsc;2VCAQGW6@OK`@&9d@S$9xqW{>D9+|&-QFw4$dcG_CH1m1b0fz8eso58h_+u!>7 zH|O**N1&#rk@;0YkW<@TAQMcM0D`}e8v+RgV}IL32Kewa$Hp9BVq(@rR>#7( zC^p#JQwJIk$lTOIgQXrwOaQ@GmTC^Yc_%r^t>-e!7zc`IRSg$=ijir@$YgJ}6eDxQ zkrAs)Vs+__tuFP{VO2Jq1#n(Atk%qiW#IH;d84}if&^O@4ET+AFkx0-jxeh^gqbx_ zkmi=yzJDOi@0K1e zKKs8y7J?qS34;5P$;tdvxp`TCe7E%qk{NH%RI2)>2z<7cB6zB0=Gq3rp3&y2Q3HQW zryingq*Ps&uJI2P{@#Cge_djgZV&5w(S3OVuzvzz-x|R7lp=s#*pIyN$YG`;IE51& zLBhr7lMo*B(UBFB4~jhC7m32E&d0lT-0~UtgU*r56=G2afbn)#wDtlU=QG=8Er3(s z^L*v+zGdZve*_O>bKOnohh@ETzbo#sw@SW$6+VevHY|@>y1lNy3m)2P8A$jaA3iK4~FT1 znh(?02wLOdIs)E6%UDichz{8!w621vV1hg^*j;9i1B`?Q#g8bHLQi9RYVSF$WQSdU#6zvV0@^~@;JTmwsO7^jduf2&N>%e1UVPv{56yFp|*>h^TvI~a_)a> zM#NYD@af)sy0OU3WCO(lTFWf74IDa8kzXUP6o@Af@2w%;sNkF^=GHG=wEv3KHh*(X zi&BSeCnZH{5)2a!kFPHYOl*k_w*eF1!Mc)IX%YKof~W|hQVUV(D+LFCB_Ma7+4(l} z{uA^q=I=L0-^%bJ%tXx8TWGLtU?l|_{Tiu>z(9e4Zw&*x1!v;zcNpH`r{Fbp{N1i| z?|#D%D0P;f3?@DWn*;Gk6!INA<$sP@fr&jhu~^;Wgu8cg!d+i2IN|OZ(O*cQ4cvCK z&R9ekC$?>sd~~oa;Lr~b5~7rRe6X!>0o?}=&^cOL1@r(4-<_?kqXT}oDWG%6{=pvb z5T%&R?#Kcz0fi3;Krls5z(a;jOb<{SF!v5;kRtX6h28^T>Tdd0jh{NOUVp7*R7^u- ztYLjDtN50nvdw4(=ipq=eQMfI+(;8;%Y~X^Gl_B?Y$V&-^UdQ=7tdzM1zwc!V03tQ z`l1(nIURlV^s{LOCm-{wO)_`!^xVZ{R;EbFat_v~j9A5#dJ;aoa1A%$lSr1N0u zspOiongU1LY7E1oFLOeTxI!i}Ea)C$70EJ+oc>SoF%Nbcc1QL{EU_!g!g?4ufqBz!L!h40=CSS=^BQx-fM*9YR zUX@KbHYM+xZxk2LHSdVGq+ppcN&!yqd_~a^2=5C!c(rmzEAnS0rRl58PS$qCv~+D+ z=g+GhQ;^a<=C{53J5URDf5Q*|f&fKM>xt#uKlbT{IM6ha`G09i(FHNl_stOk>o-9K z*Z2ntjtrqKW5^A* zM6IJ4+0XvpT)chu6MAv5ySNQWgd2)*!`cX^RuDNA*)k{DjB@2q)Hd#+nCeAIN@!k` zf{Wd4rD|lSr(>wAw$B^FQLQ`FmA#R)r3$GRgeCnAG5wd15#?0LO+LQBq)oO%SHR-+ z=d0hgs)=PA4<7Id#TKA* Date: Wed, 10 Aug 2022 17:36:38 -0400 Subject: [PATCH 009/185] Add return value assignments --- cmd/lotus-worker/main.go | 5 ++++- cmd/lotus-worker/sealworker/rpc.go | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/cmd/lotus-worker/main.go b/cmd/lotus-worker/main.go index 353641264..286cce883 100644 --- a/cmd/lotus-worker/main.go +++ b/cmd/lotus-worker/main.go @@ -131,7 +131,10 @@ var stopCmd = &cli.Command{ ctx := lcli.ReqContext(cctx) // Detach any storage associated with this worker - api.StorageDetachAll(ctx) + err = api.StorageDetachAll(ctx) + if err != nil { + return err + } err = api.Shutdown(ctx) if err != nil { diff --git a/cmd/lotus-worker/sealworker/rpc.go b/cmd/lotus-worker/sealworker/rpc.go index 613a58081..5d1b963ff 100644 --- a/cmd/lotus-worker/sealworker/rpc.go +++ b/cmd/lotus-worker/sealworker/rpc.go @@ -154,7 +154,10 @@ func (w *Worker) StorageDetachAll(ctx context.Context) error { } for _, lp := range lps { - w.LocalStore.ClosePath(ctx, lp.ID) + err = w.LocalStore.ClosePath(ctx, lp.ID) + if err != nil { + return xerrors.Errorf("unable to close path: %w", err) + } } return nil From 509c44d446b65e9524f4068171e18f7c750e256e Mon Sep 17 00:00:00 2001 From: Phi Date: Thu, 11 Aug 2022 09:34:18 +0200 Subject: [PATCH 010/185] fix: ux: msg receipt for actor withdrawal Prints the message receipt when withdrawing from the miner-actor. Also highlights that the command is waiting for the message to be included in a block. --- cmd/lotus-miner/actor.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cmd/lotus-miner/actor.go b/cmd/lotus-miner/actor.go index c266a7bca..15167fc2e 100644 --- a/cmd/lotus-miner/actor.go +++ b/cmd/lotus-miner/actor.go @@ -249,6 +249,8 @@ var actorWithdrawCmd = &cli.Command{ return err } + fmt.Printf("Requested withdrawal in message %s\nwaiting for it to be included in a block..\n", res) + // wait for it to get mined into a block wait, err := api.StateWaitMsg(ctx, res, uint64(cctx.Int("confidence"))) if err != nil { From 4d1048746325a8aa25f7561b2698196824957028 Mon Sep 17 00:00:00 2001 From: Shrenuj Bansal Date: Thu, 11 Aug 2022 10:44:26 -0400 Subject: [PATCH 011/185] log errors when closing all paths instead of stopping execution --- cmd/lotus-worker/sealworker/rpc.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/cmd/lotus-worker/sealworker/rpc.go b/cmd/lotus-worker/sealworker/rpc.go index 5d1b963ff..a882c9a0a 100644 --- a/cmd/lotus-worker/sealworker/rpc.go +++ b/cmd/lotus-worker/sealworker/rpc.go @@ -2,6 +2,7 @@ package sealworker import ( "context" + logging "github.com/ipfs/go-log/v2" "net/http" "sync/atomic" @@ -23,6 +24,8 @@ import ( "github.com/filecoin-project/lotus/storage/sealer/storiface" ) +var log = logging.Logger("sealworker") + func WorkerHandler(authv func(ctx context.Context, token string) ([]auth.Permission, error), remote http.HandlerFunc, a api.Worker, permissioned bool) http.Handler { mux := mux.NewRouter() readerHandler, readerServerOpt := rpcenc.ReaderParamDecoder() @@ -156,7 +159,7 @@ func (w *Worker) StorageDetachAll(ctx context.Context) error { for _, lp := range lps { err = w.LocalStore.ClosePath(ctx, lp.ID) if err != nil { - return xerrors.Errorf("unable to close path: %w", err) + log.Warnf("unable to close path: %w", err) } } From 1c98e37db84b84154af4977a684bf4d78b605646 Mon Sep 17 00:00:00 2001 From: Shrenuj Bansal Date: Thu, 11 Aug 2022 11:53:58 -0400 Subject: [PATCH 012/185] fiximports --- cmd/lotus-worker/sealworker/rpc.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/lotus-worker/sealworker/rpc.go b/cmd/lotus-worker/sealworker/rpc.go index a882c9a0a..1b98ccb83 100644 --- a/cmd/lotus-worker/sealworker/rpc.go +++ b/cmd/lotus-worker/sealworker/rpc.go @@ -2,12 +2,12 @@ package sealworker import ( "context" - logging "github.com/ipfs/go-log/v2" "net/http" "sync/atomic" "github.com/google/uuid" "github.com/gorilla/mux" + logging "github.com/ipfs/go-log/v2" "github.com/mitchellh/go-homedir" "golang.org/x/xerrors" From 766d809f0cbc67cdfadbcecb907e8c39326e8976 Mon Sep 17 00:00:00 2001 From: Marco Munizaga Date: Tue, 5 Jul 2022 15:07:56 -0700 Subject: [PATCH 013/185] Update to go-libp2p v0.21-RC --- api/types.go | 6 -- go.mod | 79 +++++++++++----------- go.sum | 134 +++++++++++++++++++++++++------------ node/impl/net/rcmgr.go | 75 +++++---------------- node/modules/lp2p/rcmgr.go | 82 ++++++++++++++++------- 5 files changed, 206 insertions(+), 170 deletions(-) diff --git a/api/types.go b/api/types.go index 6a4b18fa7..b62d54e6e 100644 --- a/api/types.go +++ b/api/types.go @@ -134,13 +134,7 @@ type NetStat struct { } type NetLimit struct { - Dynamic bool `json:",omitempty"` - // set if Dynamic is false Memory int64 `json:",omitempty"` - // set if Dynamic is true - MemoryFraction float64 `json:",omitempty"` - MinMemory int64 `json:",omitempty"` - MaxMemory int64 `json:",omitempty"` Streams, StreamsInbound, StreamsOutbound int Conns, ConnsInbound, ConnsOutbound int diff --git a/go.mod b/go.mod index bcf24788e..ce951bee1 100644 --- a/go.mod +++ b/go.mod @@ -15,7 +15,7 @@ require ( github.com/alecthomas/jsonschema v0.0.0-20200530073317-71f438968921 github.com/buger/goterm v1.0.3 github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e - github.com/containerd/cgroups v1.0.3 + github.com/containerd/cgroups v1.0.4 github.com/coreos/go-systemd/v22 v22.3.2 github.com/detailyang/go-fallocate v0.0.0-20180908115635-432fa640bd2e github.com/dgraph-io/badger/v2 v2.2007.3 @@ -71,7 +71,7 @@ require ( github.com/icza/backscanner v0.0.0-20210726202459-ac2ffc679f94 github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab github.com/ipfs/bbloom v0.0.4 - github.com/ipfs/go-bitswap v0.6.0 + github.com/ipfs/go-bitswap v0.7.1-0.20220705171910-84973686518b github.com/ipfs/go-block-format v0.0.3 github.com/ipfs/go-blockservice v0.3.0 github.com/ipfs/go-cid v0.2.0 @@ -108,34 +108,35 @@ require ( github.com/ipld/go-ipld-selector-text-lite v0.0.1 github.com/kelseyhightower/envconfig v1.4.0 github.com/koalacxr/quantile v0.0.1 - github.com/libp2p/go-buffer-pool v0.0.2 + github.com/libp2p/go-buffer-pool v0.1.0 github.com/libp2p/go-eventbus v0.2.1 - github.com/libp2p/go-libp2p v0.20.3 - github.com/libp2p/go-libp2p-core v0.16.1 + github.com/libp2p/go-libp2p v0.21.0 + github.com/libp2p/go-libp2p-core v0.19.1 github.com/libp2p/go-libp2p-kad-dht v0.15.0 - github.com/libp2p/go-libp2p-peerstore v0.7.0 + github.com/libp2p/go-libp2p-peerstore v0.7.1 github.com/libp2p/go-libp2p-pubsub v0.7.1 github.com/libp2p/go-libp2p-record v0.1.3 - github.com/libp2p/go-libp2p-resource-manager v0.3.0 + github.com/libp2p/go-libp2p-resource-manager v0.5.1 github.com/libp2p/go-libp2p-routing-helpers v0.2.3 github.com/libp2p/go-maddr-filter v0.1.0 github.com/mattn/go-isatty v0.0.14 github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 github.com/mitchellh/go-homedir v1.1.0 github.com/multiformats/go-base32 v0.0.4 - github.com/multiformats/go-multiaddr v0.5.0 + github.com/multiformats/go-multiaddr v0.6.0 github.com/multiformats/go-multiaddr-dns v0.3.1 github.com/multiformats/go-multibase v0.1.1 - github.com/multiformats/go-multihash v0.1.0 + github.com/multiformats/go-multihash v0.2.0 github.com/multiformats/go-varint v0.0.6 github.com/open-rpc/meta-schema v0.0.0-20201029221707-1b72ef2ea333 github.com/opentracing/opentracing-go v1.2.0 + github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 github.com/polydawn/refmt v0.0.0-20201211092308-30ac6d18308e github.com/prometheus/client_golang v1.12.1 github.com/raulk/clock v1.1.0 - github.com/raulk/go-watchdog v1.2.0 - github.com/stretchr/testify v1.7.1 - github.com/syndtr/goleveldb v1.0.0 + github.com/raulk/go-watchdog v1.3.0 + github.com/stretchr/testify v1.8.0 + github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 github.com/urfave/cli/v2 v2.8.1 github.com/whyrusleeping/bencher v0.0.0-20190829221104-bb6607aa8bba github.com/whyrusleeping/cbor-gen v0.0.0-20220323183124-98fa8256a799 @@ -143,19 +144,19 @@ require ( github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 github.com/xorcare/golden v0.6.1-0.20191112154924-b87f686d7542 go.opencensus.io v0.23.0 - go.opentelemetry.io/otel v1.3.0 + go.opentelemetry.io/otel v1.7.0 go.opentelemetry.io/otel/bridge/opencensus v0.25.0 go.opentelemetry.io/otel/exporters/jaeger v1.2.0 go.opentelemetry.io/otel/sdk v1.2.0 go.uber.org/fx v1.15.0 go.uber.org/multierr v1.8.0 go.uber.org/zap v1.21.0 - golang.org/x/net v0.0.0-20220418201149-a630d4f3e7a2 + golang.org/x/net v0.0.0-20220630215102-69896b714898 golang.org/x/sync v0.0.0-20210220032951-036812b2e83c - golang.org/x/sys v0.0.0-20220422013727-9388b58f7150 + golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac - golang.org/x/tools v0.1.10 - golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f + golang.org/x/tools v0.1.11 + golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f gopkg.in/cheggaaa/pb.v1 v1.0.28 gotest.tools v2.2.0+incompatible ) @@ -171,9 +172,7 @@ require ( github.com/benbjohnson/clock v1.3.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bep/debounce v1.2.0 // indirect - github.com/btcsuite/btcd v0.22.1 // indirect - github.com/btcsuite/btcd/btcec/v2 v2.1.3 // indirect - github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 // indirect + github.com/btcsuite/btcd/btcec/v2 v2.2.0 // indirect github.com/cespare/xxhash v1.1.0 // indirect github.com/cespare/xxhash/v2 v2.1.2 // indirect github.com/cheekybits/genny v1.0.0 // indirect @@ -200,12 +199,12 @@ require ( github.com/filecoin-project/storetheindex v0.4.17 // indirect github.com/flynn/noise v1.0.0 // indirect github.com/francoispqt/gojay v1.2.13 // indirect - github.com/fsnotify/fsnotify v1.5.1 // indirect + github.com/fsnotify/fsnotify v1.5.4 // indirect github.com/gdamore/encoding v1.0.0 // indirect github.com/go-kit/log v0.2.0 // indirect github.com/go-logfmt/logfmt v0.5.1 // indirect - github.com/go-logr/logr v1.2.1 // indirect - github.com/go-logr/stdr v1.2.0 // indirect + github.com/go-logr/logr v1.2.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.2.5 // indirect github.com/go-openapi/jsonpointer v0.19.3 // indirect github.com/go-openapi/jsonreference v0.19.4 // indirect @@ -217,11 +216,11 @@ require ( github.com/golang/glog v1.0.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.2 // indirect - github.com/golang/snappy v0.0.3 // indirect + github.com/golang/snappy v0.0.4 // indirect github.com/google/go-cmp v0.5.8 // indirect github.com/google/gopacket v1.1.19 // indirect github.com/hannahhoward/cbor-gen-for v0.0.0-20200817222906-ea96cece81f1 // indirect - github.com/hashicorp/errwrap v1.0.0 // indirect + github.com/hashicorp/errwrap v1.1.0 // indirect github.com/huin/goupnp v1.0.3 // indirect github.com/iancoleman/orderedmap v0.1.0 // indirect github.com/ipfs/go-bitfield v1.0.0 // indirect @@ -249,8 +248,8 @@ require ( github.com/jpillora/backoff v1.0.0 // indirect github.com/kilic/bls12-381 v0.0.0-20200820230200-6b2c19996391 // indirect github.com/klauspost/compress v1.15.1 // indirect - github.com/klauspost/cpuid/v2 v2.0.12 // indirect - github.com/koron/go-ssdp v0.0.2 // indirect + github.com/klauspost/cpuid/v2 v2.0.14 // indirect + github.com/koron/go-ssdp v0.0.3 // indirect github.com/libp2p/go-cidranger v1.1.0 // indirect github.com/libp2p/go-flow-metrics v0.0.3 // indirect github.com/libp2p/go-libp2p-asn-util v0.2.0 // indirect @@ -268,18 +267,19 @@ require ( github.com/libp2p/go-openssl v0.0.7 // indirect github.com/libp2p/go-reuseport v0.2.0 // indirect github.com/libp2p/go-yamux/v3 v3.1.2 // indirect - github.com/lucas-clemente/quic-go v0.27.1 // indirect + github.com/lucas-clemente/quic-go v0.28.0 // indirect github.com/lucasb-eyer/go-colorful v1.0.3 // indirect github.com/magefile/mage v1.9.0 // indirect github.com/mailru/easyjson v0.7.6 // indirect github.com/marten-seemann/qtls-go1-16 v0.1.5 // indirect - github.com/marten-seemann/qtls-go1-17 v0.1.1 // indirect - github.com/marten-seemann/qtls-go1-18 v0.1.1 // indirect + github.com/marten-seemann/qtls-go1-17 v0.1.2 // indirect + github.com/marten-seemann/qtls-go1-18 v0.1.2 // indirect + github.com/marten-seemann/qtls-go1-19 v0.1.0-beta.1 // indirect github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd // indirect github.com/mattn/go-colorable v0.1.9 // indirect github.com/mattn/go-runewidth v0.0.10 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect - github.com/miekg/dns v1.1.48 // indirect + github.com/miekg/dns v1.1.50 // indirect github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b // indirect github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc // indirect github.com/minio/sha256-simd v1.0.0 // indirect @@ -293,12 +293,11 @@ require ( github.com/nxadm/tail v1.4.8 // indirect github.com/onsi/ginkgo v1.16.5 // indirect github.com/opencontainers/runtime-spec v1.0.2 // indirect - github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/prometheus/client_model v0.2.0 // indirect - github.com/prometheus/common v0.33.0 // indirect + github.com/prometheus/common v0.35.0 // indirect github.com/prometheus/procfs v0.7.3 // indirect github.com/prometheus/statsd_exporter v0.21.0 // indirect github.com/rivo/uniseg v0.1.0 // indirect @@ -320,25 +319,27 @@ require ( github.com/zondax/ledger-go v0.12.1 // indirect go.opentelemetry.io/otel/metric v0.25.0 // indirect go.opentelemetry.io/otel/sdk/export/metric v0.25.0 // indirect - go.opentelemetry.io/otel/trace v1.3.0 // indirect + go.opentelemetry.io/otel/trace v1.7.0 // indirect go.uber.org/atomic v1.9.0 // indirect go.uber.org/dig v1.12.0 // indirect go4.org v0.0.0-20200411211856-f5505b9728dd // indirect - golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4 // indirect - golang.org/x/exp v0.0.0-20210715201039-d37aa40e8013 // indirect - golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 // indirect + golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e // indirect + golang.org/x/exp v0.0.0-20220426173459-3bcf042a4bf5 // indirect + golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect golang.org/x/text v0.3.7 // indirect google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4 // indirect - google.golang.org/grpc v1.45.0 // indirect + google.golang.org/grpc v1.47.0 // indirect google.golang.org/protobuf v1.28.0 // indirect gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect - gopkg.in/yaml.v3 v3.0.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect howett.net/plist v0.0.0-20181124034731-591f970eefbb // indirect lukechampine.com/blake3 v1.1.7 // indirect ) replace github.com/filecoin-project/filecoin-ffi => ./extern/filecoin-ffi +replace github.com/filecoin-project/go-fil-markets => github.com/marcopolo/go-fil-markets v1.23.1-0.20220811180806-b8e84162b48e + replace github.com/filecoin-project/test-vectors => ./extern/test-vectors diff --git a/go.sum b/go.sum index 8f08f96c2..bdddfb080 100644 --- a/go.sum +++ b/go.sum @@ -145,8 +145,9 @@ github.com/btcsuite/btcd v0.21.0-beta/go.mod h1:ZSWyehm27aAuS9bvkATT+Xte3hjHZ+MR github.com/btcsuite/btcd v0.22.0-beta/go.mod h1:9n5ntfhhHQBIhUvlhDvD3Qg6fRUj4jkN0VB8L8svzOA= github.com/btcsuite/btcd v0.22.1 h1:CnwP9LM/M9xuRrGSCGeMVs9iv09uMqwsVX7EeIpgV2c= github.com/btcsuite/btcd v0.22.1/go.mod h1:wqgTSL29+50LRkmOVknEdmt8ZojIzhuWvgu/iptuN7Y= -github.com/btcsuite/btcd/btcec/v2 v2.1.3 h1:xM/n3yIhHAhHy04z4i43C8p4ehixJZMsnrVJkgl+MTE= github.com/btcsuite/btcd/btcec/v2 v2.1.3/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE= +github.com/btcsuite/btcd/btcec/v2 v2.2.0 h1:fzn1qaOt32TuLjFlkzYSsBC35Q3KUjT1SwPxiMSCF5k= +github.com/btcsuite/btcd/btcec/v2 v2.2.0/go.mod h1:U7MHm051Al6XmscBQ0BoNydpOTsFAn707034b5nY8zU= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= @@ -199,13 +200,15 @@ github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XP github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/codegangsta/cli v1.20.0/go.mod h1:/qJNoX69yVSKu5o4jLyXAENLRyk1uhi7zkbQ3slBdOA= github.com/containerd/cgroups v0.0.0-20201119153540-4cbc285b3327/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= -github.com/containerd/cgroups v1.0.3 h1:ADZftAkglvCiD44c77s5YmMqaP2pzVCFZvBmAlBdAP4= github.com/containerd/cgroups v1.0.3/go.mod h1:/ofk34relqNjSGyqPrmEULrO4Sc8LJhvJmWbUCUKqj8= +github.com/containerd/cgroups v1.0.4 h1:jN/mbWBEaz+T1pi5OFtnkQ+8qnmEbAr1Oo1FRm5B0dA= +github.com/containerd/cgroups v1.0.4/go.mod h1:nLNQtsF7Sl2HxNebu77i1R0oDlhiTG+kO4JTrUzo6IA= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= @@ -304,6 +307,7 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.m github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= +github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/etclabscore/go-jsonschema-walk v0.0.6 h1:DrNzoKWKd8f8XB5nFGBY00IcjakRE22OTI12k+2LkyY= github.com/etclabscore/go-jsonschema-walk v0.0.6/go.mod h1:VdfDY72AFAiUhy0ZXEaWSpveGjMT5JcDIm903NGqFwQ= @@ -356,8 +360,6 @@ github.com/filecoin-project/go-fil-commcid v0.1.0 h1:3R4ds1A9r6cr8mvZBfMYxTS88Oq github.com/filecoin-project/go-fil-commcid v0.1.0/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 h1:imrrpZWEHRnNqqv0tN7LXep5bFEVOVmQWHJvl2mgsGo= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0/go.mod h1:73S8WSEWh9vr0fDJVnKADhfIv/d6dCbAGaAGWbdJEI8= -github.com/filecoin-project/go-fil-markets v1.23.1 h1:F2jr4qldYrpbLgdtKe5LqUHXv2eRxeuWTMr+nX4gASc= -github.com/filecoin-project/go-fil-markets v1.23.1/go.mod h1:V+1vFO34RZmpdECdikKGiyWhSNJK81Q89Kn0egA9iAk= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= @@ -446,8 +448,9 @@ github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3 github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= +github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= +github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/gabriel-vasile/mimetype v1.4.0/go.mod h1:fA8fi6KUiG7MgQQ+mEWotXoEOvmxRtOJlERCzSmRvr8= github.com/gammazero/keymutex v0.0.2/go.mod h1:qtzWCCLMisQUmVa4dvqHVgwfh4BP2YB7JxNDGXnsKrs= github.com/gammazero/radixtree v0.2.5/go.mod h1:VPqqCDZ3YZZxAzUUsIF/ytFBigVWV7JIV1Stld8hri0= @@ -480,10 +483,13 @@ github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNV github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.1 h1:DX7uPQ4WgAWfoh+NGGlbJQswnYIVvz0SRlLS3rPZQDA= github.com/go-logr/logr v1.2.1/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/stdr v1.2.0 h1:j4LrlVXgrbIWO83mmQUnK0Hi+YnbD+vzrE1z/EphbFE= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= +github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/stdr v1.2.0/go.mod h1:YkVgnZu1ZjjL7xTxrfm/LLZBfkhTqSR1ydtm6jTKKwI= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-ole/go-ole v1.2.5 h1:t4MGB5xEDZvXI+0rMjjsfBsD7yAgp/s9ZDkL1JndXwY= github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= @@ -569,8 +575,9 @@ github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.3 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -656,8 +663,9 @@ github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoP github.com/hashicorp/consul/api v1.10.1/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= -github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= @@ -727,8 +735,9 @@ github.com/ipfs/go-bitswap v0.1.2/go.mod h1:qxSWS4NXGs7jQ6zQvoPY3+NmOfHHG47mhkiL github.com/ipfs/go-bitswap v0.1.8/go.mod h1:TOWoxllhccevbWFUR2N7B1MTSVVge1s6XSMiCSA4MzM= github.com/ipfs/go-bitswap v0.3.4/go.mod h1:4T7fvNv/LmOys+21tnLzGKncMeeXUYUd1nUiJ2teMvI= github.com/ipfs/go-bitswap v0.5.1/go.mod h1:P+ckC87ri1xFLvk74NlXdP0Kj9RmWAh4+H78sC6Qopo= -github.com/ipfs/go-bitswap v0.6.0 h1:f2rc6GZtoSFhEIzQmddgGiel9xntj02Dg0ZNf2hSC+w= github.com/ipfs/go-bitswap v0.6.0/go.mod h1:Hj3ZXdOC5wBJvENtdqsixmzzRukqd8EHLxZLZc3mzRA= +github.com/ipfs/go-bitswap v0.7.1-0.20220705171910-84973686518b h1:D0ovjO1DVGRlT+FLDoJeL3GnZ/6qyov5xpqUXt7TEkM= +github.com/ipfs/go-bitswap v0.7.1-0.20220705171910-84973686518b/go.mod h1:EKDX22BNE4CaW8jDn4yjsN8YcqKQZUL4/dXxtKQ6hto= github.com/ipfs/go-block-format v0.0.1/go.mod h1:DK/YYcsSUIVAFNwo/KZCdIIbpN0ROH/baNLgayt4pFc= github.com/ipfs/go-block-format v0.0.2/go.mod h1:AWR46JfpcObNfg3ok2JHDUfdiHRgWhJgCQF+KIgOPJY= github.com/ipfs/go-block-format v0.0.3 h1:r8t66QstRp/pd/or4dpnbVfXT5Gt7lOqRvC+/dDTpMc= @@ -1059,16 +1068,18 @@ github.com/klauspost/compress v1.15.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47e github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.6/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.0.12 h1:p9dKCg8i4gmOxtv35DvrYoWqYzQrvEVdjQ762Y0OqZE= github.com/klauspost/cpuid/v2 v2.0.12/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c= +github.com/klauspost/cpuid/v2 v2.0.14 h1:QRqdp6bb9M9S5yyKeYteXKuoKE4p0tGlra81fKOpWH8= +github.com/klauspost/cpuid/v2 v2.0.14/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c= github.com/koalacxr/quantile v0.0.1 h1:wAW+SQ286Erny9wOjVww96t8ws+x5Zj6AKHDULUK+o0= github.com/koalacxr/quantile v0.0.1/go.mod h1:bGN/mCZLZ4lrSDHRQ6Lglj9chowGux8sGUIND+DQeD0= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/koron/go-ssdp v0.0.0-20180514024734-4a0ed625a78b/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk= github.com/koron/go-ssdp v0.0.0-20191105050749-2e1c40ed0b5d/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk= -github.com/koron/go-ssdp v0.0.2 h1:fL3wAoyT6hXHQlORyXUW4Q23kkQpJRgEAYcZB5BR71o= github.com/koron/go-ssdp v0.0.2/go.mod h1:XoLfkAiA2KeZsYh4DbHxD7h3nR2AZNqVQOa+LJuqPYs= +github.com/koron/go-ssdp v0.0.3 h1:JivLMY45N76b4p/vsWGOKewBQu6uf39y8l+AQ7sDKx8= +github.com/koron/go-ssdp v0.0.3/go.mod h1:b2MxI6yh02pKrsyNoQUsk4+YNikaGhe4894J+Q5lDvA= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= @@ -1084,8 +1095,9 @@ github.com/libp2p/go-addr-util v0.0.1/go.mod h1:4ac6O7n9rIAKB1dnd+s8IbbMXkt+oBpz github.com/libp2p/go-addr-util v0.0.2/go.mod h1:Ecd6Fb3yIuLzq4bD7VcywcVSBtefcAwnUISBM3WG15E= github.com/libp2p/go-addr-util v0.1.0/go.mod h1:6I3ZYuFr2O/9D+SoyM0zEw0EF3YkldtTX406BpdQMqw= github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ= -github.com/libp2p/go-buffer-pool v0.0.2 h1:QNK2iAFa8gjAe1SPz6mHSMuCcjs+X1wlHzeOSqcmlfs= github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM= +github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= +github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= github.com/libp2p/go-cidranger v1.1.0 h1:ewPN8EZ0dd1LSnrtuwd4709PXVcITVeuwbag38yPW7c= github.com/libp2p/go-cidranger v1.1.0/go.mod h1:KWZTfSr+r9qEo9OkI9/SIEeAtw+NNoU0dXIXt15Okic= github.com/libp2p/go-conn-security v0.0.1/go.mod h1:bGmu51N0KU9IEjX7kl2PQjgZa40JQWnayTvNMgD/vyk= @@ -1123,8 +1135,8 @@ github.com/libp2p/go-libp2p v0.18.0/go.mod h1:+veaZ9z1SZQhmc5PW78jvnnxZ89Mgvmh4c github.com/libp2p/go-libp2p v0.19.4/go.mod h1:MIt8y481VDhUe4ErWi1a4bvt/CjjFfOq6kZTothWIXY= github.com/libp2p/go-libp2p v0.20.0/go.mod h1:g0C5Fu+aXXbCXkusCzLycuBowEih3ElmDqtbo61Em7k= github.com/libp2p/go-libp2p v0.20.1/go.mod h1:XgJHsOhEBVBXp/2Sj9bm/yEyD94uunAaP6oaegdcKks= -github.com/libp2p/go-libp2p v0.20.3 h1:tjjDNfp7FqdI/7v1rXtB/BtELaPlAThL2uzlj18kcrw= -github.com/libp2p/go-libp2p v0.20.3/go.mod h1:I+vndVanE/p/SjFbnA+BEmmfAUEpWxrdXZeyQ1Dus5c= +github.com/libp2p/go-libp2p v0.21.0 h1:s9yYScuIFY33FOOzwTXbc8QqbvsRyKIWFf0FCSJKrfM= +github.com/libp2p/go-libp2p v0.21.0/go.mod h1:zvcA6/C4mr5/XQarRICh+L1SN9dAHHlSWDq4x5VYxg4= github.com/libp2p/go-libp2p-asn-util v0.0.0-20200825225859-85005c6cf052/go.mod h1:nRMRTab+kZuk0LnKZpxhOVH/ndsdr2Nr//Zltc/vwgo= github.com/libp2p/go-libp2p-asn-util v0.1.0/go.mod h1:wu+AnM9Ii2KgO5jMmS1rz9dvzTdj8BXqsPR9HR0XB7I= github.com/libp2p/go-libp2p-asn-util v0.2.0 h1:rg3+Os8jbnO5DxkC7K/Utdi+DkY3q/d1/1q+8WeNAsw= @@ -1154,7 +1166,6 @@ github.com/libp2p/go-libp2p-circuit v0.1.3/go.mod h1:Xqh2TjSy8DD5iV2cCOMzdynd6h8 github.com/libp2p/go-libp2p-circuit v0.1.4/go.mod h1:CY67BrEjKNDhdTk8UgBX1Y/H5c3xkAcs3gnksxY7osU= github.com/libp2p/go-libp2p-circuit v0.2.1/go.mod h1:BXPwYDN5A8z4OEY9sOfr2DUQMLQvKt/6oku45YUmjIo= github.com/libp2p/go-libp2p-circuit v0.4.0/go.mod h1:t/ktoFIUzM6uLQ+o1G6NuBl2ANhBKN9Bc8jRIk31MoA= -github.com/libp2p/go-libp2p-circuit v0.6.0 h1:rw/HlhmUB3OktS/Ygz6+2XABOmHKzZpPUuMNUMosj8w= github.com/libp2p/go-libp2p-circuit v0.6.0/go.mod h1:kB8hY+zCpMeScyvFrKrGicRdid6vNXbunKE4rXATZ0M= github.com/libp2p/go-libp2p-connmgr v0.1.1/go.mod h1:wZxh8veAmU5qdrfJ0ZBLcU8oJe9L82ciVP/fl1VHjXk= github.com/libp2p/go-libp2p-connmgr v0.2.4/go.mod h1:YV0b/RIm8NGPnnNWM7hG9Q38OeQiQfKhHCCs1++ufn0= @@ -1197,8 +1208,10 @@ github.com/libp2p/go-libp2p-core v0.12.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQR github.com/libp2p/go-libp2p-core v0.13.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= github.com/libp2p/go-libp2p-core v0.14.0/go.mod h1:tLasfcVdTXnixsLB0QYaT1syJOhsbrhG7q6pGrHtBg8= github.com/libp2p/go-libp2p-core v0.15.1/go.mod h1:agSaboYM4hzB1cWekgVReqV5M4g5M+2eNNejV+1EEhs= -github.com/libp2p/go-libp2p-core v0.16.1 h1:bWoiEBqVkpJ13hbv/f69tHODp86t6mvc4fBN4DkK73M= github.com/libp2p/go-libp2p-core v0.16.1/go.mod h1:O3i/7y+LqUb0N+qhzXjBjjpchgptWAVMG1Voegk7b4c= +github.com/libp2p/go-libp2p-core v0.19.0/go.mod h1:AkA+FUKQfYt1FLNef5fOPlo/naAWjKy/RCjkcPjqzYg= +github.com/libp2p/go-libp2p-core v0.19.1 h1:zaZQQCeCrFMtxFa1wHy6AhsVynyNmZAvwgWqSSPT3WE= +github.com/libp2p/go-libp2p-core v0.19.1/go.mod h1:2uLhmmqDiFY+dw+70KkBLeKvvsJHGWUINRDdeV1ip7k= github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE= github.com/libp2p/go-libp2p-crypto v0.0.2/go.mod h1:eETI5OUfBnvARGOHrJz2eWNyTUxEGZnBxMcbUjfIj4I= github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI= @@ -1274,8 +1287,9 @@ github.com/libp2p/go-libp2p-peerstore v0.2.7/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuD github.com/libp2p/go-libp2p-peerstore v0.2.8/go.mod h1:gGiPlXdz7mIHd2vfAsHzBNAMqSDkt2UBFwgcITgw1lA= github.com/libp2p/go-libp2p-peerstore v0.4.0/go.mod h1:rDJUFyzEWPpXpEwywkcTYYzDHlwza8riYMaUzaN6hX0= github.com/libp2p/go-libp2p-peerstore v0.6.0/go.mod h1:DGEmKdXrcYpK9Jha3sS7MhqYdInxJy84bIPtSu65bKc= -github.com/libp2p/go-libp2p-peerstore v0.7.0 h1:2iIUwok3vtmnWJTZeTeLgnBO6GbkXcwSRwgZHEKrQZs= github.com/libp2p/go-libp2p-peerstore v0.7.0/go.mod h1:cdUWTHro83vpg6unCpGUr8qJoX3e93Vy8o97u5ppIM0= +github.com/libp2p/go-libp2p-peerstore v0.7.1 h1:7FpALlqR+3+oOBXdzm3AVt0vjMYLW1b7jM03E4iEHlw= +github.com/libp2p/go-libp2p-peerstore v0.7.1/go.mod h1:cdUWTHro83vpg6unCpGUr8qJoX3e93Vy8o97u5ppIM0= github.com/libp2p/go-libp2p-pnet v0.2.0/go.mod h1:Qqvq6JH/oMZGwqs3N1Fqhv8NVhrdYcO0BW4wssv21LA= github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1VZNHYcK8cLgFJLZ4s= github.com/libp2p/go-libp2p-protocol v0.1.0/go.mod h1:KQPHpAabB57XQxGrXCNvbL6UEXfQqUgC/1adR2Xtflk= @@ -1302,8 +1316,9 @@ github.com/libp2p/go-libp2p-record v0.1.3 h1:R27hoScIhQf/A8XJZ8lYpnqh9LatJ5YbHs2 github.com/libp2p/go-libp2p-record v0.1.3/go.mod h1:yNUff/adKIfPnYQXgp6FQmNu3gLJ6EMg7+/vv2+9pY4= github.com/libp2p/go-libp2p-resource-manager v0.1.5/go.mod h1:wJPNjeE4XQlxeidwqVY5G6DLOKqFK33u2n8blpl0I6Y= github.com/libp2p/go-libp2p-resource-manager v0.2.1/go.mod h1:K+eCkiapf+ey/LADO4TaMpMTP9/Qde/uLlrnRqV4PLQ= -github.com/libp2p/go-libp2p-resource-manager v0.3.0 h1:2+cYxUNi33tcydsVLt6K5Fv2E3OTiVeafltecAj15E0= github.com/libp2p/go-libp2p-resource-manager v0.3.0/go.mod h1:K+eCkiapf+ey/LADO4TaMpMTP9/Qde/uLlrnRqV4PLQ= +github.com/libp2p/go-libp2p-resource-manager v0.5.1 h1:jm0mdqn7yfh7wbUzlj948BYZX0KZ3RW7OqerkGQ5rYY= +github.com/libp2p/go-libp2p-resource-manager v0.5.1/go.mod h1:CggtV6EZb+Y0dGh41q5ezO4udcVKyhcEFpydHD8EMe0= github.com/libp2p/go-libp2p-routing v0.0.1/go.mod h1:N51q3yTr4Zdr7V8Jt2JIktVU+3xBBylx1MZeVA6t1Ys= github.com/libp2p/go-libp2p-routing v0.1.0/go.mod h1:zfLhI1RI8RLEzmEaaPwzonRvXeeSHddONWkcTcB54nE= github.com/libp2p/go-libp2p-routing-helpers v0.2.3 h1:xY61alxJ6PurSi+MXbywZpelvuU4U4p/gPTxjqCqTzY= @@ -1345,8 +1360,9 @@ github.com/libp2p/go-libp2p-testing v0.6.0/go.mod h1:QBk8fqIL1XNcno/l3/hhaIEn4aL github.com/libp2p/go-libp2p-testing v0.7.0/go.mod h1:OLbdn9DbgdMwv00v+tlp1l3oe2Cl+FAjoWIA2pa0X6E= github.com/libp2p/go-libp2p-testing v0.8.0/go.mod h1:gRdsNxQSxAZowTgcLY7CC33xPmleZzoBpqSYbWenqPc= github.com/libp2p/go-libp2p-testing v0.9.0/go.mod h1:Td7kbdkWqYTJYQGTwzlgXwaqldraIanyjuRiAbK/XQU= -github.com/libp2p/go-libp2p-testing v0.9.2 h1:dCpODRtRaDZKF8HXT9qqqgON+OMEB423Knrgeod8j84= github.com/libp2p/go-libp2p-testing v0.9.2/go.mod h1:Td7kbdkWqYTJYQGTwzlgXwaqldraIanyjuRiAbK/XQU= +github.com/libp2p/go-libp2p-testing v0.11.0 h1:+R7FRl/U3Y00neyBSM2qgDzqz3HkWH24U9nMlascHL4= +github.com/libp2p/go-libp2p-testing v0.11.0/go.mod h1:qG4sF27dfKFoK9KlVzK2y52LQKhp0VEmLjV5aDqr1Hg= github.com/libp2p/go-libp2p-tls v0.1.3/go.mod h1:wZfuewxOndz5RTnCAxFliGjvYSDA40sKitV4c50uI1M= github.com/libp2p/go-libp2p-tls v0.3.0/go.mod h1:fwF5X6PWGxm6IDRwF3V8AVCCj/hOd5oFlg+wo2FxJDY= github.com/libp2p/go-libp2p-tls v0.3.1/go.mod h1:fwF5X6PWGxm6IDRwF3V8AVCCj/hOd5oFlg+wo2FxJDY= @@ -1497,8 +1513,9 @@ github.com/lucas-clemente/quic-go v0.23.0/go.mod h1:paZuzjXCE5mj6sikVLMvqXk8lJV2 github.com/lucas-clemente/quic-go v0.24.0/go.mod h1:paZuzjXCE5mj6sikVLMvqXk8lJV2AsqtJ6bDhjEfxx0= github.com/lucas-clemente/quic-go v0.25.0/go.mod h1:YtzP8bxRVCBlO77yRanE264+fY/T2U9ZlW1AaHOsMOg= github.com/lucas-clemente/quic-go v0.27.0/go.mod h1:AzgQoPda7N+3IqMMMkywBKggIFo2KT6pfnlrQ2QieeI= -github.com/lucas-clemente/quic-go v0.27.1 h1:sOw+4kFSVrdWOYmUjufQ9GBVPqZ+tu+jMtXxXNmRJyk= github.com/lucas-clemente/quic-go v0.27.1/go.mod h1:AzgQoPda7N+3IqMMMkywBKggIFo2KT6pfnlrQ2QieeI= +github.com/lucas-clemente/quic-go v0.28.0 h1:9eXVRgIkMQQyiyorz/dAaOYIx3TFzXsIFkNFz4cxuJM= +github.com/lucas-clemente/quic-go v0.28.0/go.mod h1:oGz5DKK41cJt5+773+BSO9BXDsREY4HLf7+0odGAPO0= github.com/lucasb-eyer/go-colorful v1.0.3 h1:QIbQXiugsb+q10B+MI+7DI1oQLdmnep86tWFlaaUAac= github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/lufia/iostat v1.1.0/go.mod h1:rEPNA0xXgjHQjuI5Cy05sLlS2oRcSlWHRLrvh/AQ+Pg= @@ -1514,6 +1531,8 @@ github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN github.com/mailru/easyjson v0.7.1/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA= github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/marcopolo/go-fil-markets v1.23.1-0.20220811180806-b8e84162b48e h1:eItqdWJLVVGhsEuAFcYYaOHVsVd2Fdy5D/tn91nHlaE= +github.com/marcopolo/go-fil-markets v1.23.1-0.20220811180806-b8e84162b48e/go.mod h1:ZOPAjEUia7H60F7p0kEupi0FR7Hy4Zfz90BpR1TMBwI= github.com/marten-seemann/qpack v0.2.1/go.mod h1:F7Gl5L1jIgN1D11ucXefiuJS9UMVP2opoCp2jDKb7wc= github.com/marten-seemann/qtls v0.2.3/go.mod h1:xzjG7avBwGGbdZ8dTGxlBnLArsVKLvwmjgmPuiQEcYk= github.com/marten-seemann/qtls v0.10.0/go.mod h1:UvMd1oaYDACI99/oZUYLzMCkBXQVT0aGm99sJhbT8hs= @@ -1525,11 +1544,15 @@ github.com/marten-seemann/qtls-go1-16 v0.1.5 h1:o9JrYPPco/Nukd/HpOHMHZoBDXQqoNtU github.com/marten-seemann/qtls-go1-16 v0.1.5/go.mod h1:gNpI2Ol+lRS3WwSOtIUUtRwZEQMXjYK+dQSBFbethAk= github.com/marten-seemann/qtls-go1-17 v0.1.0-rc.1/go.mod h1:fz4HIxByo+LlWcreM4CZOYNuz3taBQ8rN2X6FqvaWo8= github.com/marten-seemann/qtls-go1-17 v0.1.0/go.mod h1:fz4HIxByo+LlWcreM4CZOYNuz3taBQ8rN2X6FqvaWo8= -github.com/marten-seemann/qtls-go1-17 v0.1.1 h1:DQjHPq+aOzUeh9/lixAGunn6rIOQyWChPSI4+hgW7jc= github.com/marten-seemann/qtls-go1-17 v0.1.1/go.mod h1:C2ekUKcDdz9SDWxec1N/MvcXBpaX9l3Nx67XaR84L5s= +github.com/marten-seemann/qtls-go1-17 v0.1.2 h1:JADBlm0LYiVbuSySCHeY863dNkcpMmDR7s0bLKJeYlQ= +github.com/marten-seemann/qtls-go1-17 v0.1.2/go.mod h1:C2ekUKcDdz9SDWxec1N/MvcXBpaX9l3Nx67XaR84L5s= github.com/marten-seemann/qtls-go1-18 v0.1.0-beta.1/go.mod h1:PUhIQk19LoFt2174H4+an8TYvWOGjb/hHwphBeaDHwI= -github.com/marten-seemann/qtls-go1-18 v0.1.1 h1:qp7p7XXUFL7fpBvSS1sWD+uSqPvzNQK43DH+/qEkj0Y= github.com/marten-seemann/qtls-go1-18 v0.1.1/go.mod h1:mJttiymBAByA49mhlNZZGrH5u1uXYZJ+RW28Py7f4m4= +github.com/marten-seemann/qtls-go1-18 v0.1.2 h1:JH6jmzbduz0ITVQ7ShevK10Av5+jBEKAHMntXmIV7kM= +github.com/marten-seemann/qtls-go1-18 v0.1.2/go.mod h1:mJttiymBAByA49mhlNZZGrH5u1uXYZJ+RW28Py7f4m4= +github.com/marten-seemann/qtls-go1-19 v0.1.0-beta.1 h1:7m/WlWcSROrcK5NxuXaxYD32BZqe/LEEnBrWcH/cOqQ= +github.com/marten-seemann/qtls-go1-19 v0.1.0-beta.1/go.mod h1:5HTDWtVudo/WFsHKRNuOhWlbdjrfs5JHrYb0wIJqGpI= github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd h1:br0buuQ854V8u83wA0rVZ8ttrq5CpaPZdvrK0LP2lOk= github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd/go.mod h1:QuCEs1Nt24+FYQEqAAncTDPJIuGs+LxK1MCiFL25pMU= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= @@ -1573,8 +1596,9 @@ github.com/miekg/dns v1.1.28/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7 github.com/miekg/dns v1.1.31/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= -github.com/miekg/dns v1.1.48 h1:Ucfr7IIVyMBz4lRE8qmGUuZ4Wt3/ZGu9hmcMT3Uu4tQ= github.com/miekg/dns v1.1.48/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME= +github.com/miekg/dns v1.1.50 h1:DQUfb9uc6smULcREF09Uc+/Gd46YWqJd5DbpPE9xkcA= +github.com/miekg/dns v1.1.50/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME= github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c h1:bzE/A84HN25pxAuk9Eej1Kz9OUelF97nAc82bDquQI8= github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c/go.mod h1:0SQS9kMwD2VsyFEB++InYyBJroV/FRmBgcydeSUcJms= github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b h1:z78hV3sbSMAUoyUMM0I83AUIT6Hu17AWfgjzIbtrYFc= @@ -1633,8 +1657,9 @@ github.com/multiformats/go-multiaddr v0.3.1/go.mod h1:uPbspcUPd5AfaP6ql3ujFY+QWz github.com/multiformats/go-multiaddr v0.3.3/go.mod h1:lCKNGP1EQ1eZ35Za2wlqnabm9xQkib3fyB+nZXHLag0= github.com/multiformats/go-multiaddr v0.4.0/go.mod h1:YcpyLH8ZPudLxQlemYBPhSm0/oCXAT8Z4mzFpyoPyRc= github.com/multiformats/go-multiaddr v0.4.1/go.mod h1:3afI9HfVW8csiF8UZqtpYRiDyew8pRX7qLIGHu9FLuM= -github.com/multiformats/go-multiaddr v0.5.0 h1:i/JuOoVg4szYQ4YEzDGtb2h0o8M7CG/Yq6cGlcjWZpM= github.com/multiformats/go-multiaddr v0.5.0/go.mod h1:3KAxNkUqLTJ20AAwN4XVX4kZar+bR+gh4zgbfr3SNug= +github.com/multiformats/go-multiaddr v0.6.0 h1:qMnoOPj2s8xxPU5kZ57Cqdr0hHhARz7mFsPMIiYNqzg= +github.com/multiformats/go-multiaddr v0.6.0/go.mod h1:F4IpaKZuPP360tOMn2Tpyu0At8w23aRyVqeK0DbFeGM= github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= github.com/multiformats/go-multiaddr-dns v0.0.2/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= github.com/multiformats/go-multiaddr-dns v0.0.3/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= @@ -1674,8 +1699,9 @@ github.com/multiformats/go-multihash v0.0.13/go.mod h1:VdAWLKTwram9oKAatUcLxBNUj github.com/multiformats/go-multihash v0.0.14/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= github.com/multiformats/go-multihash v0.0.15/go.mod h1:D6aZrWNLFTV/ynMpKsNtB40mJzmCl4jb1alC0OvHiHg= github.com/multiformats/go-multihash v0.0.16/go.mod h1:zhfEIgVnB/rPMfxgFw15ZmGoNaKyNUIE4IWHG/kC+Ag= -github.com/multiformats/go-multihash v0.1.0 h1:CgAgwqk3//SVEw3T+6DqI4mWMyRuDwZtOWcJT0q9+EA= github.com/multiformats/go-multihash v0.1.0/go.mod h1:RJlXsxt6vHGaia+S8We0ErjhojtKzPP2AH4+kYM7k84= +github.com/multiformats/go-multihash v0.2.0 h1:oytJb9ZA1OUW0r0f9ea18GiaPOo4SXyc7p2movyUuo4= +github.com/multiformats/go-multihash v0.2.0/go.mod h1:WxoMcYG85AZVQUyRyo9s4wULvW5qrI9vb2Lt6evduFc= github.com/multiformats/go-multistream v0.0.1/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= github.com/multiformats/go-multistream v0.0.4/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= @@ -1827,8 +1853,9 @@ github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9 github.com/prometheus/common v0.28.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.33.0 h1:rHgav/0a6+uYgGdNt3jwz8FNSesO/Hsang3O0T9A5SE= github.com/prometheus/common v0.33.0/go.mod h1:gB3sOl7P0TvJabZpLY5uQMpUqRCPPCyRLCZYc7JZTNE= +github.com/prometheus/common v0.35.0 h1:Eyr+Pw2VymWejHqCugNaQXkAi6KayVNxaHeu6khmFBE= +github.com/prometheus/common v0.35.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= github.com/prometheus/node_exporter v1.0.0-rc.0.0.20200428091818-01054558c289/go.mod h1:FGbBv5OPKjch+jNUJmEQpMZytIdyW0NdBtWFcfSKusc= github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= @@ -1848,8 +1875,9 @@ github.com/prometheus/statsd_exporter v0.21.0 h1:hA05Q5RFeIjgwKIYEdFd59xu5Wwaznf github.com/prometheus/statsd_exporter v0.21.0/go.mod h1:rbT83sZq2V+p73lHhPZfMc3MLCHmSHelCh9hSGYNLTQ= github.com/raulk/clock v1.1.0 h1:dpb29+UKMbLqiU/jqIJptgLR1nn23HLgMY0sTCDza5Y= github.com/raulk/clock v1.1.0/go.mod h1:3MpVxdZ/ODBQDxbN+kzshf5OSZwPjtMDx6BBXBmOeY0= -github.com/raulk/go-watchdog v1.2.0 h1:konN75pw2BMmZ+AfuAm5rtFsWcJpKF3m02rKituuXNo= github.com/raulk/go-watchdog v1.2.0/go.mod h1:lzSbAl5sh4rtI8tYHU01BWIDzgzqaQLj6RcA1i4mlqI= +github.com/raulk/go-watchdog v1.3.0 h1:oUmdlHxdkXRJlwfG0O9omj8ukerm8MEQavSiDTEtBsk= +github.com/raulk/go-watchdog v1.3.0/go.mod h1:fIvOnLbF0b0ZwkB9YU4mOW9Did//4vPZtDqv66NfsMU= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rivo/uniseg v0.1.0 h1:+2KBaVoUmb9XzDsrx/Ct0W/EYOSFf/nWTauy++DprtY= @@ -1945,8 +1973,9 @@ github.com/streadway/amqp v1.0.0/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1Sd github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= github.com/streadway/handy v0.0.0-20200128134331-0f66f006fb2e/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0 h1:M2gUjqZET1qApGOWNSnZ49BAIMX4F/1plDv3+l31EJ4= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.3.1-0.20190311161405-34c6fa2dc709/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -1954,10 +1983,12 @@ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81P github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFdE= +github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= +github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= +github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= github.com/texttheater/golang-levenshtein v0.0.0-20180516184445-d188e65d659e/go.mod h1:XDKHRm5ThF8YJjx001LtgelzsoaEcvnA7lVWz9EeX3g= github.com/tidwall/gjson v1.6.0 h1:9VEQWz6LLMUsUl6PueE49ir4Ka6CzLymOAZDxpFsTDc= @@ -2096,8 +2127,9 @@ go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= go.opentelemetry.io/otel v1.2.0/go.mod h1:aT17Fk0Z1Nor9e0uisf98LrntPGMnk4frBO9+dkf69I= -go.opentelemetry.io/otel v1.3.0 h1:APxLf0eiBwLl+SOXiJJCVYzA1OOJNyAoV8C5RNRyy7Y= go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs= +go.opentelemetry.io/otel v1.7.0 h1:Z2lA3Tdch0iDcrhJXDIlC94XE+bxok1F9B+4Lz/lGsM= +go.opentelemetry.io/otel v1.7.0/go.mod h1:5BdUoMIz5WEs0vt0CUEMtSSaTSHBBVwrhnz7+nrD5xk= go.opentelemetry.io/otel/bridge/opencensus v0.25.0 h1:18Ww8TpCEGes12HZJzB2nEbUglvMLzPxqgZypsrKiNc= go.opentelemetry.io/otel/bridge/opencensus v0.25.0/go.mod h1:dkZDdaNwLlIutxK2Kc2m3jwW2M1ISaNf8/rOYVwuVHs= go.opentelemetry.io/otel/exporters/jaeger v1.2.0 h1:C/5Egj3MJBXRJi22cSl07suqPqtZLnLFmH//OxETUEc= @@ -2117,8 +2149,9 @@ go.opentelemetry.io/otel/sdk/metric v0.25.0 h1:J+Ta+4IAA5W9AdWhGQLfciEpavBqqSkBz go.opentelemetry.io/otel/sdk/metric v0.25.0/go.mod h1:G4xzj4LvC6xDDSsVXpvRVclQCbofGGg4ZU2VKKtDRfg= go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= go.opentelemetry.io/otel/trace v1.2.0/go.mod h1:N5FLswTubnxKxOJHM7XZC074qpeEdLy3CgAVsdMucK0= -go.opentelemetry.io/otel/trace v1.3.0 h1:doy8Hzb1RJ+I3yFhtDmwNc7tIyw1tNMOIsyPzp1NOGY= go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk= +go.opentelemetry.io/otel/trace v1.7.0 h1:O37Iogk1lEkMRXewVtZ1BBTVn5JEp8GrJvP92bJqC6o= +go.opentelemetry.io/otel/trace v1.7.0/go.mod h1:fzLSB9nqR2eXzxPXb2JW9IKE+ScyXA48yyE4TNvoHqU= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= @@ -2208,8 +2241,9 @@ golang.org/x/crypto v0.0.0-20210915214749-c084706c2272/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211117183948-ae814b36b871/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20211209193657-4570a0811e8b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4 h1:kUhD7nTDoI3fVd9G4ORWrbV5NY0liEs/Jg2pv5f+bBA= golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e h1:T8NU3HyQ8ClP4SEE+KbFlg6n0NhuTsN4MyznaarGsZM= +golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20181106170214-d68db9428509/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -2227,8 +2261,8 @@ golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EH golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20210615023648-acb5c1269671/go.mod h1:DVyR6MI7P4kEQgvZJSj1fQGrWIi2RzIrfYWycwheUAc= golang.org/x/exp v0.0.0-20210714144626-1041f73d31d8/go.mod h1:DVyR6MI7P4kEQgvZJSj1fQGrWIi2RzIrfYWycwheUAc= -golang.org/x/exp v0.0.0-20210715201039-d37aa40e8013 h1:Jp57DBw4K7mimZNA3F9f7CndVcUt4kJjmyJf2rzJHoI= -golang.org/x/exp v0.0.0-20210715201039-d37aa40e8013/go.mod h1:DVyR6MI7P4kEQgvZJSj1fQGrWIi2RzIrfYWycwheUAc= +golang.org/x/exp v0.0.0-20220426173459-3bcf042a4bf5 h1:rxKZ2gOnYxjfmakvUUqh9Gyb6KXfrj7JWTxORTYqb0E= +golang.org/x/exp v0.0.0-20220426173459-3bcf042a4bf5/go.mod h1:lgLbSvA5ygNOMpwM/9anMpWVlVJ7Z+cHWq/eFuinpGE= golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= @@ -2256,8 +2290,11 @@ golang.org/x/mod v0.1.1-0.20191209134235-331c550502dd/go.mod h1:s0Qsj1ACt9ePp/hM golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 h1:kQgndtyPBW/JIYERgdxfwMYh3AVStj88WQTlNDi2a+o= +golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/mod v0.6.0-dev.0.20211013180041-c96bc1413d57/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -2304,6 +2341,7 @@ golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= @@ -2325,8 +2363,11 @@ golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220418201149-a630d4f3e7a2 h1:6mzvA99KwZxbOrxww4EvWVQUnN1+xEu9tafK5ZxkYeA= golang.org/x/net v0.0.0-20220418201149-a630d4f3e7a2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220630215102-69896b714898 h1:K7wO6V1IrczY9QOQ2WkVpw4JQSwCd52UsxVEirZUfiw= +golang.org/x/net v0.0.0-20220630215102-69896b714898/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -2425,6 +2466,7 @@ golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200812155832-6a926be9bd1d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200926100807-9d91bd62050c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2457,8 +2499,9 @@ golang.org/x/sys v0.0.0-20211209171907-798191bca915/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220422013727-9388b58f7150 h1:xHms4gcpe1YE7A3yIllJXP16CMAGuqwO2lX1mTyyRRc= golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a h1:dGzPydgVsqGcTRVwiLJ1jVbufYwmzD3LfVPLKsKg+0k= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -2547,14 +2590,17 @@ golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.6-0.20210726203631-07bc1bf47fb2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.10 h1:QjFRCZxdOhBJ/UNgnBZLbNV13DlbnK0quyivTnXJM20= +golang.org/x/tools v0.1.8-0.20211029000441-d6a9af8af023/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= +golang.org/x/tools v0.1.11 h1:loJ25fNOEhSXfHrpoGj91eCUThwdNX6u24rO1xnNteY= +golang.org/x/tools v0.1.11/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f h1:GGU+dLjvlC3qDwqYgL6UgRmHXhOOgns0bZu2Ty5mm6U= golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f h1:uF6paiQQebLeSXkrTqHqz0MXhXXS1KgF41eUdBNvxK0= +golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= @@ -2653,8 +2699,9 @@ google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.45.0 h1:NEpgUqV3Z+ZjkqMsxMg11IaDrXY4RY6CQukSGK0uI1M= google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= +google.golang.org/grpc v1.47.0 h1:9n77onPX5F3qfFCqjy9dhn8PbNQsIKeVU04J9G7umt8= +google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -2703,8 +2750,9 @@ gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0 h1:hjy8E9ON/egN1tAYqKb61G10WtihqetD4sz2H+8nIeA= gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o= diff --git a/node/impl/net/rcmgr.go b/node/impl/net/rcmgr.go index 36c4cf16b..9fe4fcdc1 100644 --- a/node/impl/net/rcmgr.go +++ b/node/impl/net/rcmgr.go @@ -108,33 +108,14 @@ func (a *NetAPI) NetLimit(ctx context.Context, scope string) (result api.NetLimi } limit := limiter.Limit() - switch l := limit.(type) { - case *rcmgr.StaticLimit: - result.Memory = l.Memory - result.Streams = l.BaseLimit.Streams - result.StreamsInbound = l.BaseLimit.StreamsInbound - result.StreamsOutbound = l.BaseLimit.StreamsOutbound - result.Conns = l.BaseLimit.Conns - result.ConnsInbound = l.BaseLimit.ConnsInbound - result.ConnsOutbound = l.BaseLimit.ConnsOutbound - result.FD = l.BaseLimit.FD - - case *rcmgr.DynamicLimit: - result.Dynamic = true - result.MemoryFraction = l.MemoryLimit.MemoryFraction - result.MinMemory = l.MemoryLimit.MinMemory - result.MaxMemory = l.MemoryLimit.MaxMemory - result.Streams = l.BaseLimit.Streams - result.StreamsInbound = l.BaseLimit.StreamsInbound - result.StreamsOutbound = l.BaseLimit.StreamsOutbound - result.Conns = l.BaseLimit.Conns - result.ConnsInbound = l.BaseLimit.ConnsInbound - result.ConnsOutbound = l.BaseLimit.ConnsOutbound - result.FD = l.BaseLimit.FD - - default: - return xerrors.Errorf("unknown limit type %T", limit) - } + result.Memory = limit.GetMemoryLimit() + result.Streams = limit.GetStreamTotalLimit() + result.StreamsInbound = limit.GetStreamLimit(network.DirInbound) + result.StreamsOutbound = limit.GetStreamLimit(network.DirOutbound) + result.Conns = limit.GetConnTotalLimit() + result.ConnsInbound = limit.GetConnLimit(network.DirInbound) + result.ConnsOutbound = limit.GetConnLimit(network.DirOutbound) + result.FD = limit.GetFDLimit() return nil } @@ -189,37 +170,15 @@ func (a *NetAPI) NetSetLimit(ctx context.Context, scope string, limit api.NetLim return xerrors.Errorf("resource scope doesn't implement ResourceScopeLimiter interface") } - var newLimit rcmgr.Limit - if limit.Dynamic { - newLimit = &rcmgr.DynamicLimit{ - MemoryLimit: rcmgr.MemoryLimit{ - MemoryFraction: limit.MemoryFraction, - MinMemory: limit.MinMemory, - MaxMemory: limit.MaxMemory, - }, - BaseLimit: rcmgr.BaseLimit{ - Streams: limit.Streams, - StreamsInbound: limit.StreamsInbound, - StreamsOutbound: limit.StreamsOutbound, - Conns: limit.Conns, - ConnsInbound: limit.ConnsInbound, - ConnsOutbound: limit.ConnsOutbound, - FD: limit.FD, - }, - } - } else { - newLimit = &rcmgr.StaticLimit{ - Memory: limit.Memory, - BaseLimit: rcmgr.BaseLimit{ - Streams: limit.Streams, - StreamsInbound: limit.StreamsInbound, - StreamsOutbound: limit.StreamsOutbound, - Conns: limit.Conns, - ConnsInbound: limit.ConnsInbound, - ConnsOutbound: limit.ConnsOutbound, - FD: limit.FD, - }, - } + newLimit := &rcmgr.BaseLimit{ + Memory: limit.Memory, + Streams: limit.Streams, + StreamsInbound: limit.StreamsInbound, + StreamsOutbound: limit.StreamsOutbound, + Conns: limit.Conns, + ConnsInbound: limit.ConnsInbound, + ConnsOutbound: limit.ConnsOutbound, + FD: limit.FD, } limiter.SetLimit(newLimit) diff --git a/node/modules/lp2p/rcmgr.go b/node/modules/lp2p/rcmgr.go index 5caec3464..026aa7675 100644 --- a/node/modules/lp2p/rcmgr.go +++ b/node/modules/lp2p/rcmgr.go @@ -8,16 +8,22 @@ import ( "os" "path/filepath" + ocprom "contrib.go.opencensus.io/exporter/prometheus" logging "github.com/ipfs/go-log/v2" "github.com/libp2p/go-libp2p" "github.com/libp2p/go-libp2p-core/network" "github.com/libp2p/go-libp2p-core/peer" "github.com/libp2p/go-libp2p-core/protocol" rcmgr "github.com/libp2p/go-libp2p-resource-manager" + rcmgrObs "github.com/libp2p/go-libp2p-resource-manager/obs" + "github.com/pbnjay/memory" + "github.com/prometheus/client_golang/prometheus" "go.opencensus.io/stats" + "go.opencensus.io/stats/view" "go.opencensus.io/tag" "go.uber.org/fx" + "github.com/filecoin-project/lotus/lib/ulimit" "github.com/filecoin-project/lotus/metrics" "github.com/filecoin-project/lotus/node/repo" ) @@ -36,38 +42,56 @@ func ResourceManager(connMgrHi uint) func(lc fx.Lifecycle, repo repo.LockedRepo) // enable debug logs for rcmgr logging.SetLogLevel("rcmgr", "debug") - // Adjust default limits + // Adjust default defaultLimits // - give it more memory, up to 4G, min of 1G - // - if maxconns are too high, adjust Conn/FD/Stream limits - defaultLimits := rcmgr.DefaultLimits.WithSystemMemory(.125, 1<<30, 4<<30) + // - if maxconns are too high, adjust Conn/FD/Stream defaultLimits + defaultLimits := rcmgr.DefaultLimits + + // TODO: also set appropriate default limits for lotus protocols + libp2p.SetDefaultServiceLimits(&defaultLimits) + + // Minimum 1GB of memory + defaultLimits.SystemBaseLimit.Memory = 1 << 30 + // For every extra 1GB of memory we have available, increase our limit by 1GiB + defaultLimits.SystemLimitIncrease.Memory = 1 << 30 + availFDs, _, err := ulimit.GetLimit() + if err != nil { + availFDs = 0 + } + defaultLimitConfig := defaultLimits.Scale(int64(memory.TotalMemory())/8, int(availFDs>>1)) + if defaultLimitConfig.System.Memory > 4<<30 { + // Cap our memory limit + defaultLimitConfig.System.Memory = 4 << 30 + } + maxconns := int(connMgrHi) - if 2*maxconns > defaultLimits.SystemBaseLimit.ConnsInbound { + if 2*maxconns > defaultLimitConfig.System.ConnsInbound { // adjust conns to 2x to allow for two conns per peer (TCP+QUIC) - defaultLimits.SystemBaseLimit.ConnsInbound = logScale(2 * maxconns) - defaultLimits.SystemBaseLimit.ConnsOutbound = logScale(2 * maxconns) - defaultLimits.SystemBaseLimit.Conns = logScale(4 * maxconns) + defaultLimitConfig.System.ConnsInbound = logScale(2 * maxconns) + defaultLimitConfig.System.ConnsOutbound = logScale(2 * maxconns) + defaultLimitConfig.System.Conns = logScale(4 * maxconns) - defaultLimits.SystemBaseLimit.StreamsInbound = logScale(16 * maxconns) - defaultLimits.SystemBaseLimit.StreamsOutbound = logScale(64 * maxconns) - defaultLimits.SystemBaseLimit.Streams = logScale(64 * maxconns) + defaultLimitConfig.System.StreamsInbound = logScale(16 * maxconns) + defaultLimitConfig.System.StreamsOutbound = logScale(64 * maxconns) + defaultLimitConfig.System.Streams = logScale(64 * maxconns) - if 2*maxconns > defaultLimits.SystemBaseLimit.FD { - defaultLimits.SystemBaseLimit.FD = logScale(2 * maxconns) + if 2*maxconns > defaultLimitConfig.System.FD { + defaultLimitConfig.System.FD = logScale(2 * maxconns) } - defaultLimits.ServiceBaseLimit.StreamsInbound = logScale(8 * maxconns) - defaultLimits.ServiceBaseLimit.StreamsOutbound = logScale(32 * maxconns) - defaultLimits.ServiceBaseLimit.Streams = logScale(32 * maxconns) + defaultLimitConfig.ServiceDefault.StreamsInbound = logScale(8 * maxconns) + defaultLimitConfig.ServiceDefault.StreamsOutbound = logScale(32 * maxconns) + defaultLimitConfig.ServiceDefault.Streams = logScale(32 * maxconns) - defaultLimits.ProtocolBaseLimit.StreamsInbound = logScale(8 * maxconns) - defaultLimits.ProtocolBaseLimit.StreamsOutbound = logScale(32 * maxconns) - defaultLimits.ProtocolBaseLimit.Streams = logScale(32 * maxconns) + defaultLimitConfig.ProtocolDefault.StreamsInbound = logScale(8 * maxconns) + defaultLimitConfig.ProtocolDefault.StreamsOutbound = logScale(32 * maxconns) + defaultLimitConfig.ProtocolDefault.Streams = logScale(32 * maxconns) log.Info("adjusted default resource manager limits") } // initialize - var limiter *rcmgr.BasicLimiter + var limiter rcmgr.Limiter var opts []rcmgr.Option repoPath := repo.Path() @@ -78,22 +102,25 @@ func ResourceManager(connMgrHi uint) func(lc fx.Lifecycle, repo repo.LockedRepo) switch { case err == nil: defer limitsIn.Close() //nolint:errcheck - limiter, err = rcmgr.NewLimiterFromJSON(limitsIn, defaultLimits) + limiter, err = rcmgr.NewLimiterFromJSON(limitsIn, defaultLimitConfig) if err != nil { return nil, fmt.Errorf("error parsing limit file: %w", err) } case errors.Is(err, os.ErrNotExist): - limiter = rcmgr.NewStaticLimiter(defaultLimits) + limiter = rcmgr.NewFixedLimiter(defaultLimitConfig) default: return nil, err } - // TODO: also set appropriate default limits for lotus protocols - libp2p.SetDefaultServiceLimits(limiter) + str, err := rcmgrObs.NewStatsTraceReporter() + if err != nil { + return nil, fmt.Errorf("error creating resource manager stats reporter: %w", err) + } - opts = append(opts, rcmgr.WithMetrics(rcmgrMetrics{})) + // Metrics + opts = append(opts, rcmgr.WithMetrics(rcmgrMetrics{}), rcmgr.WithTraceReporter(str)) if os.Getenv("LOTUS_DEBUG_RCMGR") != "" { debugPath := filepath.Join(repoPath, "debug") @@ -109,6 +136,13 @@ func ResourceManager(connMgrHi uint) func(lc fx.Lifecycle, repo repo.LockedRepo) return nil, fmt.Errorf("error creating resource manager: %w", err) } + // Hook up resource manager metrics + view.Register(rcmgrObs.DefaultViews...) + ocprom.NewExporter(ocprom.Options{ + Registry: prometheus.DefaultRegisterer.(*prometheus.Registry), + Namespace: "rcmgr_trace_metrics", + }) + lc.Append(fx.Hook{ OnStop: func(_ context.Context) error { return mgr.Close() From 6a17cad206060cc8e0cc7819756298bf8ca6f2c7 Mon Sep 17 00:00:00 2001 From: Marco Munizaga Date: Tue, 5 Jul 2022 16:02:52 -0700 Subject: [PATCH 014/185] Update testplans go.mod --- testplans/lotus-soup/go.mod | 82 ++++++++++----------- testplans/lotus-soup/go.sum | 138 ++++++++++++++++++++++++------------ 2 files changed, 135 insertions(+), 85 deletions(-) diff --git a/testplans/lotus-soup/go.mod b/testplans/lotus-soup/go.mod index c15953264..92d5fc2ec 100644 --- a/testplans/lotus-soup/go.mod +++ b/testplans/lotus-soup/go.mod @@ -27,10 +27,10 @@ require ( github.com/ipfs/go-unixfs v0.3.1 github.com/ipld/go-car v0.4.0 github.com/kpacha/opencensus-influxdb v0.0.0-20181102202715-663e2683a27c - github.com/libp2p/go-libp2p v0.20.3 - github.com/libp2p/go-libp2p-core v0.16.1 + github.com/libp2p/go-libp2p v0.21.0 + github.com/libp2p/go-libp2p-core v0.19.1 github.com/libp2p/go-libp2p-pubsub-tracer v0.0.0-20200626141350-e730b32bf1e6 - github.com/multiformats/go-multiaddr v0.5.0 + github.com/multiformats/go-multiaddr v0.6.0 github.com/testground/sdk-go v0.2.6 go.opencensus.io v0.23.0 golang.org/x/sync v0.0.0-20210220032951-036812b2e83c @@ -52,9 +52,7 @@ require ( github.com/benbjohnson/clock v1.3.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bep/debounce v1.2.0 // indirect - github.com/btcsuite/btcd v0.22.1 // indirect - github.com/btcsuite/btcd/btcec/v2 v2.1.3 // indirect - github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 // indirect + github.com/btcsuite/btcd/btcec/v2 v2.2.0 // indirect github.com/buger/goterm v1.0.3 // indirect github.com/cespare/xxhash v1.1.0 // indirect github.com/cespare/xxhash/v2 v2.1.2 // indirect @@ -62,7 +60,7 @@ require ( github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e // indirect github.com/cilium/ebpf v0.4.0 // indirect github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0 // indirect - github.com/containerd/cgroups v1.0.3 // indirect + github.com/containerd/cgroups v1.0.4 // indirect github.com/coreos/go-systemd/v22 v22.3.2 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.1 // indirect github.com/crackcomm/go-gitignore v0.0.0-20170627025303-887ab5e44cc3 // indirect @@ -114,15 +112,15 @@ require ( github.com/filecoin-project/storetheindex v0.4.17 // indirect github.com/flynn/noise v1.0.0 // indirect github.com/francoispqt/gojay v1.2.13 // indirect - github.com/fsnotify/fsnotify v1.5.1 // indirect + github.com/fsnotify/fsnotify v1.5.4 // indirect github.com/gbrlsnchs/jwt/v3 v3.0.1 // indirect github.com/gdamore/encoding v1.0.0 // indirect github.com/gdamore/tcell/v2 v2.2.0 // indirect github.com/go-kit/kit v0.12.0 // indirect github.com/go-kit/log v0.2.0 // indirect github.com/go-logfmt/logfmt v0.5.1 // indirect - github.com/go-logr/logr v1.2.1 // indirect - github.com/go-logr/stdr v1.2.0 // indirect + github.com/go-logr/logr v1.2.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.2.5 // indirect github.com/go-redis/redis/v7 v7.4.0 // indirect github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 // indirect @@ -134,7 +132,7 @@ require ( github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/mock v1.6.0 // indirect github.com/golang/protobuf v1.5.2 // indirect - github.com/golang/snappy v0.0.3 // indirect + github.com/golang/snappy v0.0.4 // indirect github.com/google/gopacket v1.1.19 // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.2.0 // indirect @@ -143,7 +141,7 @@ require ( github.com/hako/durafmt v0.0.0-20200710122514-c0fb7b4da026 // indirect github.com/hannahhoward/cbor-gen-for v0.0.0-20200817222906-ea96cece81f1 // indirect github.com/hannahhoward/go-pubsub v0.0.0-20200423002714-8d62886cc36e // indirect - github.com/hashicorp/errwrap v1.0.0 // indirect + github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/golang-lru v0.5.4 // indirect github.com/huin/goupnp v1.0.3 // indirect github.com/icza/backscanner v0.0.0-20210726202459-ac2ffc679f94 // indirect @@ -151,7 +149,7 @@ require ( github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab // indirect github.com/ipfs/bbloom v0.0.4 // indirect github.com/ipfs/go-bitfield v1.0.0 // indirect - github.com/ipfs/go-bitswap v0.6.0 // indirect + github.com/ipfs/go-bitswap v0.7.1-0.20220705171910-84973686518b // indirect github.com/ipfs/go-block-format v0.0.3 // indirect github.com/ipfs/go-blockservice v0.3.0 // indirect github.com/ipfs/go-cidutil v0.1.0 // indirect @@ -198,9 +196,9 @@ require ( github.com/kelseyhightower/envconfig v1.4.0 // indirect github.com/kilic/bls12-381 v0.0.0-20200820230200-6b2c19996391 // indirect github.com/klauspost/compress v1.15.1 // indirect - github.com/klauspost/cpuid/v2 v2.0.12 // indirect - github.com/koron/go-ssdp v0.0.2 // indirect - github.com/libp2p/go-buffer-pool v0.0.2 // indirect + github.com/klauspost/cpuid/v2 v2.0.14 // indirect + github.com/koron/go-ssdp v0.0.3 // indirect + github.com/libp2p/go-buffer-pool v0.1.0 // indirect github.com/libp2p/go-cidranger v1.1.0 // indirect github.com/libp2p/go-eventbus v0.2.1 // indirect github.com/libp2p/go-flow-metrics v0.0.3 // indirect @@ -212,10 +210,10 @@ require ( github.com/libp2p/go-libp2p-kbucket v0.4.7 // indirect github.com/libp2p/go-libp2p-loggables v0.1.0 // indirect github.com/libp2p/go-libp2p-noise v0.5.0 // indirect - github.com/libp2p/go-libp2p-peerstore v0.7.0 // indirect + github.com/libp2p/go-libp2p-peerstore v0.7.1 // indirect github.com/libp2p/go-libp2p-pubsub v0.7.1 // indirect github.com/libp2p/go-libp2p-record v0.1.3 // indirect - github.com/libp2p/go-libp2p-resource-manager v0.3.0 // indirect + github.com/libp2p/go-libp2p-resource-manager v0.5.2 // indirect github.com/libp2p/go-libp2p-routing-helpers v0.2.3 // indirect github.com/libp2p/go-libp2p-tls v0.5.0 // indirect github.com/libp2p/go-maddr-filter v0.1.0 // indirect @@ -225,18 +223,19 @@ require ( github.com/libp2p/go-openssl v0.0.7 // indirect github.com/libp2p/go-reuseport v0.2.0 // indirect github.com/libp2p/go-yamux/v3 v3.1.2 // indirect - github.com/lucas-clemente/quic-go v0.27.1 // indirect + github.com/lucas-clemente/quic-go v0.28.0 // indirect github.com/lucasb-eyer/go-colorful v1.0.3 // indirect github.com/magefile/mage v1.9.0 // indirect github.com/marten-seemann/qtls-go1-16 v0.1.5 // indirect - github.com/marten-seemann/qtls-go1-17 v0.1.1 // indirect - github.com/marten-seemann/qtls-go1-18 v0.1.1 // indirect + github.com/marten-seemann/qtls-go1-17 v0.1.2 // indirect + github.com/marten-seemann/qtls-go1-18 v0.1.2 // indirect + github.com/marten-seemann/qtls-go1-19 v0.1.0-beta.1 // indirect github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd // indirect github.com/mattn/go-colorable v0.1.9 // indirect github.com/mattn/go-isatty v0.0.14 // indirect github.com/mattn/go-runewidth v0.0.10 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect - github.com/miekg/dns v1.1.48 // indirect + github.com/miekg/dns v1.1.50 // indirect github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b // indirect github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc // indirect github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 // indirect @@ -247,9 +246,9 @@ require ( github.com/multiformats/go-base36 v0.1.0 // indirect github.com/multiformats/go-multiaddr-dns v0.3.1 // indirect github.com/multiformats/go-multiaddr-fmt v0.1.0 // indirect - github.com/multiformats/go-multibase v0.0.3 // indirect + github.com/multiformats/go-multibase v0.1.1 // indirect github.com/multiformats/go-multicodec v0.5.0 // indirect - github.com/multiformats/go-multihash v0.1.0 // indirect + github.com/multiformats/go-multihash v0.2.0 // indirect github.com/multiformats/go-multistream v0.3.3 // indirect github.com/multiformats/go-varint v0.0.6 // indirect github.com/nikkolasg/hexjson v0.0.0-20181101101858-78e39397e00c // indirect @@ -267,11 +266,11 @@ require ( github.com/polydawn/refmt v0.0.0-20201211092308-30ac6d18308e // indirect github.com/prometheus/client_golang v1.12.1 // indirect github.com/prometheus/client_model v0.2.0 // indirect - github.com/prometheus/common v0.33.0 // indirect + github.com/prometheus/common v0.35.0 // indirect github.com/prometheus/procfs v0.7.3 // indirect github.com/prometheus/statsd_exporter v0.21.0 // indirect github.com/raulk/clock v1.1.0 // indirect - github.com/raulk/go-watchdog v1.2.0 // indirect + github.com/raulk/go-watchdog v1.3.0 // indirect github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0 // indirect github.com/rivo/uniseg v0.1.0 // indirect github.com/rs/cors v1.7.0 // indirect @@ -281,11 +280,10 @@ require ( github.com/sirupsen/logrus v1.8.1 // indirect github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect - github.com/stretchr/testify v1.7.1 // indirect - github.com/syndtr/goleveldb v1.0.0 // indirect + github.com/stretchr/testify v1.8.0 // indirect + github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 // indirect github.com/uber/jaeger-client-go v2.28.0+incompatible // indirect github.com/uber/jaeger-lib v2.4.1+incompatible // indirect - github.com/urfave/cli v1.22.2 // indirect github.com/urfave/cli/v2 v2.8.1 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/fasttemplate v1.2.1 // indirect @@ -305,31 +303,31 @@ require ( go.dedis.ch/fixbuf v1.0.3 // indirect go.dedis.ch/protobuf v1.0.11 // indirect go.etcd.io/bbolt v1.3.4 // indirect - go.opentelemetry.io/otel v1.3.0 // indirect - go.opentelemetry.io/otel/trace v1.3.0 // indirect + go.opentelemetry.io/otel v1.7.0 // indirect + go.opentelemetry.io/otel/trace v1.7.0 // indirect go.uber.org/atomic v1.9.0 // indirect go.uber.org/dig v1.12.0 // indirect go.uber.org/fx v1.15.0 // indirect go.uber.org/multierr v1.8.0 // indirect go.uber.org/zap v1.21.0 // indirect go4.org v0.0.0-20200411211856-f5505b9728dd // indirect - golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4 // indirect - golang.org/x/exp v0.0.0-20210715201039-d37aa40e8013 // indirect - golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 // indirect - golang.org/x/net v0.0.0-20220418201149-a630d4f3e7a2 // indirect - golang.org/x/sys v0.0.0-20220422013727-9388b58f7150 // indirect + golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e // indirect + golang.org/x/exp v0.0.0-20220426173459-3bcf042a4bf5 // indirect + golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect + golang.org/x/net v0.0.0-20220630215102-69896b714898 // indirect + golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a // indirect golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect golang.org/x/text v0.3.7 // indirect golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac // indirect - golang.org/x/tools v0.1.10 // indirect - golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f // indirect + golang.org/x/tools v0.1.11 // indirect + golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f // indirect google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4 // indirect - google.golang.org/grpc v1.45.0 // indirect + google.golang.org/grpc v1.47.0 // indirect google.golang.org/protobuf v1.28.0 // indirect gopkg.in/cheggaaa/pb.v1 v1.0.28 // indirect gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect - gopkg.in/yaml.v3 v3.0.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect howett.net/plist v0.0.0-20181124034731-591f970eefbb // indirect lukechampine.com/blake3 v1.1.7 // indirect ) @@ -339,4 +337,6 @@ require ( // as an "extra source" in the manifest. replace github.com/filecoin-project/filecoin-ffi => ../../extern/filecoin-ffi -replace github.com/filecoin-project/lotus => ../../ +replace github.com/filecoin-project/lotus => ../.. + +replace github.com/filecoin-project/go-fil-markets => github.com/marcopolo/go-fil-markets v1.23.1-0.20220811180806-b8e84162b48e diff --git a/testplans/lotus-soup/go.sum b/testplans/lotus-soup/go.sum index 64f0faed0..cc0ae04ad 100644 --- a/testplans/lotus-soup/go.sum +++ b/testplans/lotus-soup/go.sum @@ -215,8 +215,9 @@ github.com/btcsuite/btcd v0.21.0-beta/go.mod h1:ZSWyehm27aAuS9bvkATT+Xte3hjHZ+MR github.com/btcsuite/btcd v0.22.0-beta/go.mod h1:9n5ntfhhHQBIhUvlhDvD3Qg6fRUj4jkN0VB8L8svzOA= github.com/btcsuite/btcd v0.22.1 h1:CnwP9LM/M9xuRrGSCGeMVs9iv09uMqwsVX7EeIpgV2c= github.com/btcsuite/btcd v0.22.1/go.mod h1:wqgTSL29+50LRkmOVknEdmt8ZojIzhuWvgu/iptuN7Y= -github.com/btcsuite/btcd/btcec/v2 v2.1.3 h1:xM/n3yIhHAhHy04z4i43C8p4ehixJZMsnrVJkgl+MTE= github.com/btcsuite/btcd/btcec/v2 v2.1.3/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE= +github.com/btcsuite/btcd/btcec/v2 v2.2.0 h1:fzn1qaOt32TuLjFlkzYSsBC35Q3KUjT1SwPxiMSCF5k= +github.com/btcsuite/btcd/btcec/v2 v2.2.0/go.mod h1:U7MHm051Al6XmscBQ0BoNydpOTsFAn707034b5nY8zU= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= @@ -273,6 +274,7 @@ github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XP github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= @@ -282,8 +284,9 @@ github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcju github.com/codeskyblue/go-sh v0.0.0-20200712050446-30169cf553fe h1:69JI97HlzP+PH5Mi1thcGlDoBr6PS2Oe+l3mNmAkbs4= github.com/codeskyblue/go-sh v0.0.0-20200712050446-30169cf553fe/go.mod h1:VQx0hjo2oUeQkQUET7wRwradO6f+fN5jzXgB/zROxxE= github.com/containerd/cgroups v0.0.0-20201119153540-4cbc285b3327/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= -github.com/containerd/cgroups v1.0.3 h1:ADZftAkglvCiD44c77s5YmMqaP2pzVCFZvBmAlBdAP4= github.com/containerd/cgroups v1.0.3/go.mod h1:/ofk34relqNjSGyqPrmEULrO4Sc8LJhvJmWbUCUKqj8= +github.com/containerd/cgroups v1.0.4 h1:jN/mbWBEaz+T1pi5OFtnkQ+8qnmEbAr1Oo1FRm5B0dA= +github.com/containerd/cgroups v1.0.4/go.mod h1:nLNQtsF7Sl2HxNebu77i1R0oDlhiTG+kO4JTrUzo6IA= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= @@ -396,6 +399,7 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.m github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= +github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/etclabscore/go-jsonschema-walk v0.0.6/go.mod h1:VdfDY72AFAiUhy0ZXEaWSpveGjMT5JcDIm903NGqFwQ= github.com/etclabscore/go-openrpc-reflect v0.0.36/go.mod h1:0404Ky3igAasAOpyj1eESjstTyneBAIk5PgJFbK4s5E= @@ -447,8 +451,6 @@ github.com/filecoin-project/go-fil-commcid v0.1.0 h1:3R4ds1A9r6cr8mvZBfMYxTS88Oq github.com/filecoin-project/go-fil-commcid v0.1.0/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 h1:imrrpZWEHRnNqqv0tN7LXep5bFEVOVmQWHJvl2mgsGo= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0/go.mod h1:73S8WSEWh9vr0fDJVnKADhfIv/d6dCbAGaAGWbdJEI8= -github.com/filecoin-project/go-fil-markets v1.23.1 h1:F2jr4qldYrpbLgdtKe5LqUHXv2eRxeuWTMr+nX4gASc= -github.com/filecoin-project/go-fil-markets v1.23.1/go.mod h1:V+1vFO34RZmpdECdikKGiyWhSNJK81Q89Kn0egA9iAk= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= @@ -538,8 +540,9 @@ github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3 github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= +github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= +github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/gabriel-vasile/mimetype v1.4.0/go.mod h1:fA8fi6KUiG7MgQQ+mEWotXoEOvmxRtOJlERCzSmRvr8= github.com/gammazero/keymutex v0.0.2/go.mod h1:qtzWCCLMisQUmVa4dvqHVgwfh4BP2YB7JxNDGXnsKrs= github.com/gammazero/radixtree v0.2.5/go.mod h1:VPqqCDZ3YZZxAzUUsIF/ytFBigVWV7JIV1Stld8hri0= @@ -581,10 +584,13 @@ github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KE github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.1 h1:DX7uPQ4WgAWfoh+NGGlbJQswnYIVvz0SRlLS3rPZQDA= github.com/go-logr/logr v1.2.1/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/stdr v1.2.0 h1:j4LrlVXgrbIWO83mmQUnK0Hi+YnbD+vzrE1z/EphbFE= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= +github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/stdr v1.2.0/go.mod h1:YkVgnZu1ZjjL7xTxrfm/LLZBfkhTqSR1ydtm6jTKKwI= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-ole/go-ole v1.2.5 h1:t4MGB5xEDZvXI+0rMjjsfBsD7yAgp/s9ZDkL1JndXwY= github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= @@ -752,8 +758,9 @@ github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.3 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= @@ -851,8 +858,9 @@ github.com/hashicorp/consul/api v1.10.1/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/ github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/consul/sdk v0.4.0/go.mod h1:fY08Y9z5SvJqevyZNy6WWPXiG3KwBPAvlcdx16zZ0fM= github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= -github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= @@ -948,8 +956,9 @@ github.com/ipfs/go-bitswap v0.1.2/go.mod h1:qxSWS4NXGs7jQ6zQvoPY3+NmOfHHG47mhkiL github.com/ipfs/go-bitswap v0.1.8/go.mod h1:TOWoxllhccevbWFUR2N7B1MTSVVge1s6XSMiCSA4MzM= github.com/ipfs/go-bitswap v0.3.4/go.mod h1:4T7fvNv/LmOys+21tnLzGKncMeeXUYUd1nUiJ2teMvI= github.com/ipfs/go-bitswap v0.5.1/go.mod h1:P+ckC87ri1xFLvk74NlXdP0Kj9RmWAh4+H78sC6Qopo= -github.com/ipfs/go-bitswap v0.6.0 h1:f2rc6GZtoSFhEIzQmddgGiel9xntj02Dg0ZNf2hSC+w= github.com/ipfs/go-bitswap v0.6.0/go.mod h1:Hj3ZXdOC5wBJvENtdqsixmzzRukqd8EHLxZLZc3mzRA= +github.com/ipfs/go-bitswap v0.7.1-0.20220705171910-84973686518b h1:D0ovjO1DVGRlT+FLDoJeL3GnZ/6qyov5xpqUXt7TEkM= +github.com/ipfs/go-bitswap v0.7.1-0.20220705171910-84973686518b/go.mod h1:EKDX22BNE4CaW8jDn4yjsN8YcqKQZUL4/dXxtKQ6hto= github.com/ipfs/go-block-format v0.0.1/go.mod h1:DK/YYcsSUIVAFNwo/KZCdIIbpN0ROH/baNLgayt4pFc= github.com/ipfs/go-block-format v0.0.2/go.mod h1:AWR46JfpcObNfg3ok2JHDUfdiHRgWhJgCQF+KIgOPJY= github.com/ipfs/go-block-format v0.0.3 h1:r8t66QstRp/pd/or4dpnbVfXT5Gt7lOqRvC+/dDTpMc= @@ -1289,8 +1298,9 @@ github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM52 github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.6/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.0.12 h1:p9dKCg8i4gmOxtv35DvrYoWqYzQrvEVdjQ762Y0OqZE= github.com/klauspost/cpuid/v2 v2.0.12/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c= +github.com/klauspost/cpuid/v2 v2.0.14 h1:QRqdp6bb9M9S5yyKeYteXKuoKE4p0tGlra81fKOpWH8= +github.com/klauspost/cpuid/v2 v2.0.14/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c= github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6/go.mod h1:+ZoRqAPRLkC4NPOvfYeR5KNOrY6TD+/sAC3HXPZgDYg= github.com/klauspost/pgzip v1.0.2-0.20170402124221-0bf5dcad4ada/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/koalacxr/quantile v0.0.1/go.mod h1:bGN/mCZLZ4lrSDHRQ6Lglj9chowGux8sGUIND+DQeD0= @@ -1299,8 +1309,9 @@ github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxv github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/koron/go-ssdp v0.0.0-20180514024734-4a0ed625a78b/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk= github.com/koron/go-ssdp v0.0.0-20191105050749-2e1c40ed0b5d/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk= -github.com/koron/go-ssdp v0.0.2 h1:fL3wAoyT6hXHQlORyXUW4Q23kkQpJRgEAYcZB5BR71o= github.com/koron/go-ssdp v0.0.2/go.mod h1:XoLfkAiA2KeZsYh4DbHxD7h3nR2AZNqVQOa+LJuqPYs= +github.com/koron/go-ssdp v0.0.3 h1:JivLMY45N76b4p/vsWGOKewBQu6uf39y8l+AQ7sDKx8= +github.com/koron/go-ssdp v0.0.3/go.mod h1:b2MxI6yh02pKrsyNoQUsk4+YNikaGhe4894J+Q5lDvA= github.com/kpacha/opencensus-influxdb v0.0.0-20181102202715-663e2683a27c h1:3pM6OrLfkfe0rKZjE6MHdcTaI0ohcHbRUZJeJqkvPb4= github.com/kpacha/opencensus-influxdb v0.0.0-20181102202715-663e2683a27c/go.mod h1:ESXZSm2iaF+1P5o6VFEWpeARTQpcil4e1DwumnTopdg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= @@ -1323,8 +1334,9 @@ github.com/libp2p/go-addr-util v0.0.1/go.mod h1:4ac6O7n9rIAKB1dnd+s8IbbMXkt+oBpz github.com/libp2p/go-addr-util v0.0.2/go.mod h1:Ecd6Fb3yIuLzq4bD7VcywcVSBtefcAwnUISBM3WG15E= github.com/libp2p/go-addr-util v0.1.0/go.mod h1:6I3ZYuFr2O/9D+SoyM0zEw0EF3YkldtTX406BpdQMqw= github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ= -github.com/libp2p/go-buffer-pool v0.0.2 h1:QNK2iAFa8gjAe1SPz6mHSMuCcjs+X1wlHzeOSqcmlfs= github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM= +github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= +github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= github.com/libp2p/go-cidranger v1.1.0 h1:ewPN8EZ0dd1LSnrtuwd4709PXVcITVeuwbag38yPW7c= github.com/libp2p/go-cidranger v1.1.0/go.mod h1:KWZTfSr+r9qEo9OkI9/SIEeAtw+NNoU0dXIXt15Okic= github.com/libp2p/go-conn-security v0.0.1/go.mod h1:bGmu51N0KU9IEjX7kl2PQjgZa40JQWnayTvNMgD/vyk= @@ -1364,8 +1376,8 @@ github.com/libp2p/go-libp2p v0.18.0/go.mod h1:+veaZ9z1SZQhmc5PW78jvnnxZ89Mgvmh4c github.com/libp2p/go-libp2p v0.19.4/go.mod h1:MIt8y481VDhUe4ErWi1a4bvt/CjjFfOq6kZTothWIXY= github.com/libp2p/go-libp2p v0.20.0/go.mod h1:g0C5Fu+aXXbCXkusCzLycuBowEih3ElmDqtbo61Em7k= github.com/libp2p/go-libp2p v0.20.1/go.mod h1:XgJHsOhEBVBXp/2Sj9bm/yEyD94uunAaP6oaegdcKks= -github.com/libp2p/go-libp2p v0.20.3 h1:tjjDNfp7FqdI/7v1rXtB/BtELaPlAThL2uzlj18kcrw= -github.com/libp2p/go-libp2p v0.20.3/go.mod h1:I+vndVanE/p/SjFbnA+BEmmfAUEpWxrdXZeyQ1Dus5c= +github.com/libp2p/go-libp2p v0.21.0 h1:s9yYScuIFY33FOOzwTXbc8QqbvsRyKIWFf0FCSJKrfM= +github.com/libp2p/go-libp2p v0.21.0/go.mod h1:zvcA6/C4mr5/XQarRICh+L1SN9dAHHlSWDq4x5VYxg4= github.com/libp2p/go-libp2p-asn-util v0.0.0-20200825225859-85005c6cf052/go.mod h1:nRMRTab+kZuk0LnKZpxhOVH/ndsdr2Nr//Zltc/vwgo= github.com/libp2p/go-libp2p-asn-util v0.1.0/go.mod h1:wu+AnM9Ii2KgO5jMmS1rz9dvzTdj8BXqsPR9HR0XB7I= github.com/libp2p/go-libp2p-asn-util v0.2.0 h1:rg3+Os8jbnO5DxkC7K/Utdi+DkY3q/d1/1q+8WeNAsw= @@ -1399,7 +1411,6 @@ github.com/libp2p/go-libp2p-circuit v0.2.1/go.mod h1:BXPwYDN5A8z4OEY9sOfr2DUQMLQ github.com/libp2p/go-libp2p-circuit v0.2.2/go.mod h1:nkG3iE01tR3FoQ2nMm06IUrCpCyJp1Eo4A1xYdpjfs4= github.com/libp2p/go-libp2p-circuit v0.2.3/go.mod h1:nkG3iE01tR3FoQ2nMm06IUrCpCyJp1Eo4A1xYdpjfs4= github.com/libp2p/go-libp2p-circuit v0.4.0/go.mod h1:t/ktoFIUzM6uLQ+o1G6NuBl2ANhBKN9Bc8jRIk31MoA= -github.com/libp2p/go-libp2p-circuit v0.6.0 h1:rw/HlhmUB3OktS/Ygz6+2XABOmHKzZpPUuMNUMosj8w= github.com/libp2p/go-libp2p-circuit v0.6.0/go.mod h1:kB8hY+zCpMeScyvFrKrGicRdid6vNXbunKE4rXATZ0M= github.com/libp2p/go-libp2p-connmgr v0.1.1/go.mod h1:wZxh8veAmU5qdrfJ0ZBLcU8oJe9L82ciVP/fl1VHjXk= github.com/libp2p/go-libp2p-connmgr v0.2.4/go.mod h1:YV0b/RIm8NGPnnNWM7hG9Q38OeQiQfKhHCCs1++ufn0= @@ -1442,8 +1453,10 @@ github.com/libp2p/go-libp2p-core v0.12.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQR github.com/libp2p/go-libp2p-core v0.13.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= github.com/libp2p/go-libp2p-core v0.14.0/go.mod h1:tLasfcVdTXnixsLB0QYaT1syJOhsbrhG7q6pGrHtBg8= github.com/libp2p/go-libp2p-core v0.15.1/go.mod h1:agSaboYM4hzB1cWekgVReqV5M4g5M+2eNNejV+1EEhs= -github.com/libp2p/go-libp2p-core v0.16.1 h1:bWoiEBqVkpJ13hbv/f69tHODp86t6mvc4fBN4DkK73M= github.com/libp2p/go-libp2p-core v0.16.1/go.mod h1:O3i/7y+LqUb0N+qhzXjBjjpchgptWAVMG1Voegk7b4c= +github.com/libp2p/go-libp2p-core v0.19.0/go.mod h1:AkA+FUKQfYt1FLNef5fOPlo/naAWjKy/RCjkcPjqzYg= +github.com/libp2p/go-libp2p-core v0.19.1 h1:zaZQQCeCrFMtxFa1wHy6AhsVynyNmZAvwgWqSSPT3WE= +github.com/libp2p/go-libp2p-core v0.19.1/go.mod h1:2uLhmmqDiFY+dw+70KkBLeKvvsJHGWUINRDdeV1ip7k= github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE= github.com/libp2p/go-libp2p-crypto v0.0.2/go.mod h1:eETI5OUfBnvARGOHrJz2eWNyTUxEGZnBxMcbUjfIj4I= github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI= @@ -1522,8 +1535,9 @@ github.com/libp2p/go-libp2p-peerstore v0.2.7/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuD github.com/libp2p/go-libp2p-peerstore v0.2.8/go.mod h1:gGiPlXdz7mIHd2vfAsHzBNAMqSDkt2UBFwgcITgw1lA= github.com/libp2p/go-libp2p-peerstore v0.4.0/go.mod h1:rDJUFyzEWPpXpEwywkcTYYzDHlwza8riYMaUzaN6hX0= github.com/libp2p/go-libp2p-peerstore v0.6.0/go.mod h1:DGEmKdXrcYpK9Jha3sS7MhqYdInxJy84bIPtSu65bKc= -github.com/libp2p/go-libp2p-peerstore v0.7.0 h1:2iIUwok3vtmnWJTZeTeLgnBO6GbkXcwSRwgZHEKrQZs= github.com/libp2p/go-libp2p-peerstore v0.7.0/go.mod h1:cdUWTHro83vpg6unCpGUr8qJoX3e93Vy8o97u5ppIM0= +github.com/libp2p/go-libp2p-peerstore v0.7.1 h1:7FpALlqR+3+oOBXdzm3AVt0vjMYLW1b7jM03E4iEHlw= +github.com/libp2p/go-libp2p-peerstore v0.7.1/go.mod h1:cdUWTHro83vpg6unCpGUr8qJoX3e93Vy8o97u5ppIM0= github.com/libp2p/go-libp2p-pnet v0.2.0/go.mod h1:Qqvq6JH/oMZGwqs3N1Fqhv8NVhrdYcO0BW4wssv21LA= github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1VZNHYcK8cLgFJLZ4s= github.com/libp2p/go-libp2p-protocol v0.1.0/go.mod h1:KQPHpAabB57XQxGrXCNvbL6UEXfQqUgC/1adR2Xtflk= @@ -1554,8 +1568,10 @@ github.com/libp2p/go-libp2p-record v0.1.3 h1:R27hoScIhQf/A8XJZ8lYpnqh9LatJ5YbHs2 github.com/libp2p/go-libp2p-record v0.1.3/go.mod h1:yNUff/adKIfPnYQXgp6FQmNu3gLJ6EMg7+/vv2+9pY4= github.com/libp2p/go-libp2p-resource-manager v0.1.5/go.mod h1:wJPNjeE4XQlxeidwqVY5G6DLOKqFK33u2n8blpl0I6Y= github.com/libp2p/go-libp2p-resource-manager v0.2.1/go.mod h1:K+eCkiapf+ey/LADO4TaMpMTP9/Qde/uLlrnRqV4PLQ= -github.com/libp2p/go-libp2p-resource-manager v0.3.0 h1:2+cYxUNi33tcydsVLt6K5Fv2E3OTiVeafltecAj15E0= github.com/libp2p/go-libp2p-resource-manager v0.3.0/go.mod h1:K+eCkiapf+ey/LADO4TaMpMTP9/Qde/uLlrnRqV4PLQ= +github.com/libp2p/go-libp2p-resource-manager v0.5.1/go.mod h1:CggtV6EZb+Y0dGh41q5ezO4udcVKyhcEFpydHD8EMe0= +github.com/libp2p/go-libp2p-resource-manager v0.5.2 h1:ngCef92Mg53l/OKwCN+4YwWrr+aPHFgEG2CHfuzW0ys= +github.com/libp2p/go-libp2p-resource-manager v0.5.2/go.mod h1:CggtV6EZb+Y0dGh41q5ezO4udcVKyhcEFpydHD8EMe0= github.com/libp2p/go-libp2p-routing v0.0.1/go.mod h1:N51q3yTr4Zdr7V8Jt2JIktVU+3xBBylx1MZeVA6t1Ys= github.com/libp2p/go-libp2p-routing v0.1.0/go.mod h1:zfLhI1RI8RLEzmEaaPwzonRvXeeSHddONWkcTcB54nE= github.com/libp2p/go-libp2p-routing-helpers v0.2.3 h1:xY61alxJ6PurSi+MXbywZpelvuU4U4p/gPTxjqCqTzY= @@ -1599,8 +1615,9 @@ github.com/libp2p/go-libp2p-testing v0.6.0/go.mod h1:QBk8fqIL1XNcno/l3/hhaIEn4aL github.com/libp2p/go-libp2p-testing v0.7.0/go.mod h1:OLbdn9DbgdMwv00v+tlp1l3oe2Cl+FAjoWIA2pa0X6E= github.com/libp2p/go-libp2p-testing v0.8.0/go.mod h1:gRdsNxQSxAZowTgcLY7CC33xPmleZzoBpqSYbWenqPc= github.com/libp2p/go-libp2p-testing v0.9.0/go.mod h1:Td7kbdkWqYTJYQGTwzlgXwaqldraIanyjuRiAbK/XQU= -github.com/libp2p/go-libp2p-testing v0.9.2 h1:dCpODRtRaDZKF8HXT9qqqgON+OMEB423Knrgeod8j84= github.com/libp2p/go-libp2p-testing v0.9.2/go.mod h1:Td7kbdkWqYTJYQGTwzlgXwaqldraIanyjuRiAbK/XQU= +github.com/libp2p/go-libp2p-testing v0.11.0 h1:+R7FRl/U3Y00neyBSM2qgDzqz3HkWH24U9nMlascHL4= +github.com/libp2p/go-libp2p-testing v0.11.0/go.mod h1:qG4sF27dfKFoK9KlVzK2y52LQKhp0VEmLjV5aDqr1Hg= github.com/libp2p/go-libp2p-tls v0.1.3/go.mod h1:wZfuewxOndz5RTnCAxFliGjvYSDA40sKitV4c50uI1M= github.com/libp2p/go-libp2p-tls v0.3.0/go.mod h1:fwF5X6PWGxm6IDRwF3V8AVCCj/hOd5oFlg+wo2FxJDY= github.com/libp2p/go-libp2p-tls v0.3.1/go.mod h1:fwF5X6PWGxm6IDRwF3V8AVCCj/hOd5oFlg+wo2FxJDY= @@ -1752,8 +1769,9 @@ github.com/lucas-clemente/quic-go v0.23.0/go.mod h1:paZuzjXCE5mj6sikVLMvqXk8lJV2 github.com/lucas-clemente/quic-go v0.24.0/go.mod h1:paZuzjXCE5mj6sikVLMvqXk8lJV2AsqtJ6bDhjEfxx0= github.com/lucas-clemente/quic-go v0.25.0/go.mod h1:YtzP8bxRVCBlO77yRanE264+fY/T2U9ZlW1AaHOsMOg= github.com/lucas-clemente/quic-go v0.27.0/go.mod h1:AzgQoPda7N+3IqMMMkywBKggIFo2KT6pfnlrQ2QieeI= -github.com/lucas-clemente/quic-go v0.27.1 h1:sOw+4kFSVrdWOYmUjufQ9GBVPqZ+tu+jMtXxXNmRJyk= github.com/lucas-clemente/quic-go v0.27.1/go.mod h1:AzgQoPda7N+3IqMMMkywBKggIFo2KT6pfnlrQ2QieeI= +github.com/lucas-clemente/quic-go v0.28.0 h1:9eXVRgIkMQQyiyorz/dAaOYIx3TFzXsIFkNFz4cxuJM= +github.com/lucas-clemente/quic-go v0.28.0/go.mod h1:oGz5DKK41cJt5+773+BSO9BXDsREY4HLf7+0odGAPO0= github.com/lucasb-eyer/go-colorful v1.0.3 h1:QIbQXiugsb+q10B+MI+7DI1oQLdmnep86tWFlaaUAac= github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/lufia/iostat v1.1.0/go.mod h1:rEPNA0xXgjHQjuI5Cy05sLlS2oRcSlWHRLrvh/AQ+Pg= @@ -1770,6 +1788,8 @@ github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= github.com/mailru/easyjson v0.7.1/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/marcopolo/go-fil-markets v1.23.1-0.20220811180806-b8e84162b48e h1:eItqdWJLVVGhsEuAFcYYaOHVsVd2Fdy5D/tn91nHlaE= +github.com/marcopolo/go-fil-markets v1.23.1-0.20220811180806-b8e84162b48e/go.mod h1:ZOPAjEUia7H60F7p0kEupi0FR7Hy4Zfz90BpR1TMBwI= github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= github.com/marten-seemann/qpack v0.1.0/go.mod h1:LFt1NU/Ptjip0C2CPkhimBz5CGE3WGDAUWqna+CNTrI= @@ -1785,11 +1805,15 @@ github.com/marten-seemann/qtls-go1-16 v0.1.5 h1:o9JrYPPco/Nukd/HpOHMHZoBDXQqoNtU github.com/marten-seemann/qtls-go1-16 v0.1.5/go.mod h1:gNpI2Ol+lRS3WwSOtIUUtRwZEQMXjYK+dQSBFbethAk= github.com/marten-seemann/qtls-go1-17 v0.1.0-rc.1/go.mod h1:fz4HIxByo+LlWcreM4CZOYNuz3taBQ8rN2X6FqvaWo8= github.com/marten-seemann/qtls-go1-17 v0.1.0/go.mod h1:fz4HIxByo+LlWcreM4CZOYNuz3taBQ8rN2X6FqvaWo8= -github.com/marten-seemann/qtls-go1-17 v0.1.1 h1:DQjHPq+aOzUeh9/lixAGunn6rIOQyWChPSI4+hgW7jc= github.com/marten-seemann/qtls-go1-17 v0.1.1/go.mod h1:C2ekUKcDdz9SDWxec1N/MvcXBpaX9l3Nx67XaR84L5s= +github.com/marten-seemann/qtls-go1-17 v0.1.2 h1:JADBlm0LYiVbuSySCHeY863dNkcpMmDR7s0bLKJeYlQ= +github.com/marten-seemann/qtls-go1-17 v0.1.2/go.mod h1:C2ekUKcDdz9SDWxec1N/MvcXBpaX9l3Nx67XaR84L5s= github.com/marten-seemann/qtls-go1-18 v0.1.0-beta.1/go.mod h1:PUhIQk19LoFt2174H4+an8TYvWOGjb/hHwphBeaDHwI= -github.com/marten-seemann/qtls-go1-18 v0.1.1 h1:qp7p7XXUFL7fpBvSS1sWD+uSqPvzNQK43DH+/qEkj0Y= github.com/marten-seemann/qtls-go1-18 v0.1.1/go.mod h1:mJttiymBAByA49mhlNZZGrH5u1uXYZJ+RW28Py7f4m4= +github.com/marten-seemann/qtls-go1-18 v0.1.2 h1:JH6jmzbduz0ITVQ7ShevK10Av5+jBEKAHMntXmIV7kM= +github.com/marten-seemann/qtls-go1-18 v0.1.2/go.mod h1:mJttiymBAByA49mhlNZZGrH5u1uXYZJ+RW28Py7f4m4= +github.com/marten-seemann/qtls-go1-19 v0.1.0-beta.1 h1:7m/WlWcSROrcK5NxuXaxYD32BZqe/LEEnBrWcH/cOqQ= +github.com/marten-seemann/qtls-go1-19 v0.1.0-beta.1/go.mod h1:5HTDWtVudo/WFsHKRNuOhWlbdjrfs5JHrYb0wIJqGpI= github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd h1:br0buuQ854V8u83wA0rVZ8ttrq5CpaPZdvrK0LP2lOk= github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd/go.mod h1:QuCEs1Nt24+FYQEqAAncTDPJIuGs+LxK1MCiFL25pMU= github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= @@ -1842,8 +1866,9 @@ github.com/miekg/dns v1.1.29/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7 github.com/miekg/dns v1.1.31/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= -github.com/miekg/dns v1.1.48 h1:Ucfr7IIVyMBz4lRE8qmGUuZ4Wt3/ZGu9hmcMT3Uu4tQ= github.com/miekg/dns v1.1.48/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME= +github.com/miekg/dns v1.1.50 h1:DQUfb9uc6smULcREF09Uc+/Gd46YWqJd5DbpPE9xkcA= +github.com/miekg/dns v1.1.50/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME= github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c h1:bzE/A84HN25pxAuk9Eej1Kz9OUelF97nAc82bDquQI8= github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c/go.mod h1:0SQS9kMwD2VsyFEB++InYyBJroV/FRmBgcydeSUcJms= github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b h1:z78hV3sbSMAUoyUMM0I83AUIT6Hu17AWfgjzIbtrYFc= @@ -1907,8 +1932,9 @@ github.com/multiformats/go-multiaddr v0.3.1/go.mod h1:uPbspcUPd5AfaP6ql3ujFY+QWz github.com/multiformats/go-multiaddr v0.3.3/go.mod h1:lCKNGP1EQ1eZ35Za2wlqnabm9xQkib3fyB+nZXHLag0= github.com/multiformats/go-multiaddr v0.4.0/go.mod h1:YcpyLH8ZPudLxQlemYBPhSm0/oCXAT8Z4mzFpyoPyRc= github.com/multiformats/go-multiaddr v0.4.1/go.mod h1:3afI9HfVW8csiF8UZqtpYRiDyew8pRX7qLIGHu9FLuM= -github.com/multiformats/go-multiaddr v0.5.0 h1:i/JuOoVg4szYQ4YEzDGtb2h0o8M7CG/Yq6cGlcjWZpM= github.com/multiformats/go-multiaddr v0.5.0/go.mod h1:3KAxNkUqLTJ20AAwN4XVX4kZar+bR+gh4zgbfr3SNug= +github.com/multiformats/go-multiaddr v0.6.0 h1:qMnoOPj2s8xxPU5kZ57Cqdr0hHhARz7mFsPMIiYNqzg= +github.com/multiformats/go-multiaddr v0.6.0/go.mod h1:F4IpaKZuPP360tOMn2Tpyu0At8w23aRyVqeK0DbFeGM= github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= github.com/multiformats/go-multiaddr-dns v0.0.2/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= github.com/multiformats/go-multiaddr-dns v0.0.3/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= @@ -1930,8 +1956,9 @@ github.com/multiformats/go-multiaddr-net v0.1.5/go.mod h1:ilNnaM9HbmVFqsb/qcNysj github.com/multiformats/go-multiaddr-net v0.2.0/go.mod h1:gGdH3UXny6U3cKKYCvpXI5rnK7YaOIEOPVDI9tsJbEA= github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= github.com/multiformats/go-multibase v0.0.2/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= -github.com/multiformats/go-multibase v0.0.3 h1:l/B6bJDQjvQ5G52jw4QGSYeOTZoAwIO77RblWplfIqk= github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc= +github.com/multiformats/go-multibase v0.1.1 h1:3ASCDsuLX8+j4kx58qnJ4YFq/JWTJpCyDW27ztsVTOI= +github.com/multiformats/go-multibase v0.1.1/go.mod h1:ZEjHE+IsUrgp5mhlEAYjMtZwK1k4haNkcaPg9aoe1a8= github.com/multiformats/go-multicodec v0.2.0/go.mod h1:/y4YVwkfMyry5kFbMTbLJKErhycTIftytRV+llXdyS4= github.com/multiformats/go-multicodec v0.3.0/go.mod h1:qGGaQmioCDh+TeFOnxrbU0DaIPw8yFgAZgFG0V7p1qQ= github.com/multiformats/go-multicodec v0.3.1-0.20210902112759-1539a079fd61/go.mod h1:1Hj/eHRaVWSXiSNNfcEPcwZleTmdNP81xlxDLnWU9GQ= @@ -1948,8 +1975,9 @@ github.com/multiformats/go-multihash v0.0.13/go.mod h1:VdAWLKTwram9oKAatUcLxBNUj github.com/multiformats/go-multihash v0.0.14/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= github.com/multiformats/go-multihash v0.0.15/go.mod h1:D6aZrWNLFTV/ynMpKsNtB40mJzmCl4jb1alC0OvHiHg= github.com/multiformats/go-multihash v0.0.16/go.mod h1:zhfEIgVnB/rPMfxgFw15ZmGoNaKyNUIE4IWHG/kC+Ag= -github.com/multiformats/go-multihash v0.1.0 h1:CgAgwqk3//SVEw3T+6DqI4mWMyRuDwZtOWcJT0q9+EA= github.com/multiformats/go-multihash v0.1.0/go.mod h1:RJlXsxt6vHGaia+S8We0ErjhojtKzPP2AH4+kYM7k84= +github.com/multiformats/go-multihash v0.2.0 h1:oytJb9ZA1OUW0r0f9ea18GiaPOo4SXyc7p2movyUuo4= +github.com/multiformats/go-multihash v0.2.0/go.mod h1:WxoMcYG85AZVQUyRyo9s4wULvW5qrI9vb2Lt6evduFc= github.com/multiformats/go-multistream v0.0.1/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= github.com/multiformats/go-multistream v0.0.4/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= @@ -2121,8 +2149,9 @@ github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9 github.com/prometheus/common v0.28.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.33.0 h1:rHgav/0a6+uYgGdNt3jwz8FNSesO/Hsang3O0T9A5SE= github.com/prometheus/common v0.33.0/go.mod h1:gB3sOl7P0TvJabZpLY5uQMpUqRCPPCyRLCZYc7JZTNE= +github.com/prometheus/common v0.35.0 h1:Eyr+Pw2VymWejHqCugNaQXkAi6KayVNxaHeu6khmFBE= +github.com/prometheus/common v0.35.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= github.com/prometheus/node_exporter v1.0.0-rc.0.0.20200428091818-01054558c289/go.mod h1:FGbBv5OPKjch+jNUJmEQpMZytIdyW0NdBtWFcfSKusc= github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= @@ -2144,8 +2173,9 @@ github.com/prometheus/statsd_exporter v0.21.0 h1:hA05Q5RFeIjgwKIYEdFd59xu5Wwaznf github.com/prometheus/statsd_exporter v0.21.0/go.mod h1:rbT83sZq2V+p73lHhPZfMc3MLCHmSHelCh9hSGYNLTQ= github.com/raulk/clock v1.1.0 h1:dpb29+UKMbLqiU/jqIJptgLR1nn23HLgMY0sTCDza5Y= github.com/raulk/clock v1.1.0/go.mod h1:3MpVxdZ/ODBQDxbN+kzshf5OSZwPjtMDx6BBXBmOeY0= -github.com/raulk/go-watchdog v1.2.0 h1:konN75pw2BMmZ+AfuAm5rtFsWcJpKF3m02rKituuXNo= github.com/raulk/go-watchdog v1.2.0/go.mod h1:lzSbAl5sh4rtI8tYHU01BWIDzgzqaQLj6RcA1i4mlqI= +github.com/raulk/go-watchdog v1.3.0 h1:oUmdlHxdkXRJlwfG0O9omj8ukerm8MEQavSiDTEtBsk= +github.com/raulk/go-watchdog v1.3.0/go.mod h1:fIvOnLbF0b0ZwkB9YU4mOW9Did//4vPZtDqv66NfsMU= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0 h1:MkV+77GLUNo5oJ0jf870itWm3D0Sjh7+Za9gazKc5LQ= github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= @@ -2261,8 +2291,9 @@ github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5J github.com/streadway/handy v0.0.0-20200128134331-0f66f006fb2e/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/objx v0.4.0 h1:M2gUjqZET1qApGOWNSnZ49BAIMX4F/1plDv3+l31EJ4= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -2272,10 +2303,12 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/stretchr/testify v1.6.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFdE= +github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= +github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= +github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= github.com/testground/sdk-go v0.2.6 h1:sMwv0/caNNODKfdPigNqmSSIZLcse7pZX6fgrjCGBIs= github.com/testground/sdk-go v0.2.6/go.mod h1:Q4dnWsUBH+dZ1u7aEGDBHWGUaLfhitjUq3UJQqxeTmk= @@ -2433,8 +2466,9 @@ go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= go.opentelemetry.io/otel v1.2.0/go.mod h1:aT17Fk0Z1Nor9e0uisf98LrntPGMnk4frBO9+dkf69I= -go.opentelemetry.io/otel v1.3.0 h1:APxLf0eiBwLl+SOXiJJCVYzA1OOJNyAoV8C5RNRyy7Y= go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs= +go.opentelemetry.io/otel v1.7.0 h1:Z2lA3Tdch0iDcrhJXDIlC94XE+bxok1F9B+4Lz/lGsM= +go.opentelemetry.io/otel v1.7.0/go.mod h1:5BdUoMIz5WEs0vt0CUEMtSSaTSHBBVwrhnz7+nrD5xk= go.opentelemetry.io/otel/bridge/opencensus v0.25.0/go.mod h1:dkZDdaNwLlIutxK2Kc2m3jwW2M1ISaNf8/rOYVwuVHs= go.opentelemetry.io/otel/exporters/jaeger v1.2.0/go.mod h1:KJLFbEMKTNPIfOxcg/WikIozEoKcPgJRz3Ce1vLlM8E= go.opentelemetry.io/otel/internal/metric v0.25.0/go.mod h1:Nhuw26QSX7d6n4duoqAFi5KOQR4AuzyMcl5eXOgwxtc= @@ -2448,8 +2482,9 @@ go.opentelemetry.io/otel/sdk/export/metric v0.25.0/go.mod h1:Ej7NOa+WpN49EIcr1HM go.opentelemetry.io/otel/sdk/metric v0.25.0/go.mod h1:G4xzj4LvC6xDDSsVXpvRVclQCbofGGg4ZU2VKKtDRfg= go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= go.opentelemetry.io/otel/trace v1.2.0/go.mod h1:N5FLswTubnxKxOJHM7XZC074qpeEdLy3CgAVsdMucK0= -go.opentelemetry.io/otel/trace v1.3.0 h1:doy8Hzb1RJ+I3yFhtDmwNc7tIyw1tNMOIsyPzp1NOGY= go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk= +go.opentelemetry.io/otel/trace v1.7.0 h1:O37Iogk1lEkMRXewVtZ1BBTVn5JEp8GrJvP92bJqC6o= +go.opentelemetry.io/otel/trace v1.7.0/go.mod h1:fzLSB9nqR2eXzxPXb2JW9IKE+ScyXA48yyE4TNvoHqU= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= @@ -2551,8 +2586,9 @@ golang.org/x/crypto v0.0.0-20210915214749-c084706c2272/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211117183948-ae814b36b871/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20211209193657-4570a0811e8b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4 h1:kUhD7nTDoI3fVd9G4ORWrbV5NY0liEs/Jg2pv5f+bBA= golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e h1:T8NU3HyQ8ClP4SEE+KbFlg6n0NhuTsN4MyznaarGsZM= +golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20181106170214-d68db9428509/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -2570,8 +2606,8 @@ golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EH golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20210615023648-acb5c1269671/go.mod h1:DVyR6MI7P4kEQgvZJSj1fQGrWIi2RzIrfYWycwheUAc= golang.org/x/exp v0.0.0-20210714144626-1041f73d31d8/go.mod h1:DVyR6MI7P4kEQgvZJSj1fQGrWIi2RzIrfYWycwheUAc= -golang.org/x/exp v0.0.0-20210715201039-d37aa40e8013 h1:Jp57DBw4K7mimZNA3F9f7CndVcUt4kJjmyJf2rzJHoI= -golang.org/x/exp v0.0.0-20210715201039-d37aa40e8013/go.mod h1:DVyR6MI7P4kEQgvZJSj1fQGrWIi2RzIrfYWycwheUAc= +golang.org/x/exp v0.0.0-20220426173459-3bcf042a4bf5 h1:rxKZ2gOnYxjfmakvUUqh9Gyb6KXfrj7JWTxORTYqb0E= +golang.org/x/exp v0.0.0-20220426173459-3bcf042a4bf5/go.mod h1:lgLbSvA5ygNOMpwM/9anMpWVlVJ7Z+cHWq/eFuinpGE= golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= @@ -2599,8 +2635,11 @@ golang.org/x/mod v0.1.1-0.20191209134235-331c550502dd/go.mod h1:s0Qsj1ACt9ePp/hM golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 h1:kQgndtyPBW/JIYERgdxfwMYh3AVStj88WQTlNDi2a+o= +golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/mod v0.6.0-dev.0.20211013180041-c96bc1413d57/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -2656,6 +2695,7 @@ golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= @@ -2677,8 +2717,11 @@ golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220418201149-a630d4f3e7a2 h1:6mzvA99KwZxbOrxww4EvWVQUnN1+xEu9tafK5ZxkYeA= golang.org/x/net v0.0.0-20220418201149-a630d4f3e7a2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220630215102-69896b714898 h1:K7wO6V1IrczY9QOQ2WkVpw4JQSwCd52UsxVEirZUfiw= +golang.org/x/net v0.0.0-20220630215102-69896b714898/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -2792,6 +2835,7 @@ golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200812155832-6a926be9bd1d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200828194041-157a740278f4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200926100807-9d91bd62050c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2827,8 +2871,9 @@ golang.org/x/sys v0.0.0-20211209171907-798191bca915/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220422013727-9388b58f7150 h1:xHms4gcpe1YE7A3yIllJXP16CMAGuqwO2lX1mTyyRRc= golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a h1:dGzPydgVsqGcTRVwiLJ1jVbufYwmzD3LfVPLKsKg+0k= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -2934,14 +2979,17 @@ golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.6-0.20210726203631-07bc1bf47fb2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.10 h1:QjFRCZxdOhBJ/UNgnBZLbNV13DlbnK0quyivTnXJM20= +golang.org/x/tools v0.1.8-0.20211029000441-d6a9af8af023/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= +golang.org/x/tools v0.1.11 h1:loJ25fNOEhSXfHrpoGj91eCUThwdNX6u24rO1xnNteY= +golang.org/x/tools v0.1.11/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f h1:GGU+dLjvlC3qDwqYgL6UgRmHXhOOgns0bZu2Ty5mm6U= golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f h1:uF6paiQQebLeSXkrTqHqz0MXhXXS1KgF41eUdBNvxK0= +golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.0.0-20181121035319-3f7ecaa7e8ca/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.6.0/go.mod h1:9mxDZsDKxgMAuccQkewq682L+0eCu4dCN2yonUJTCLU= @@ -3049,8 +3097,9 @@ google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.45.0 h1:NEpgUqV3Z+ZjkqMsxMg11IaDrXY4RY6CQukSGK0uI1M= google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= +google.golang.org/grpc v1.47.0 h1:9n77onPX5F3qfFCqjy9dhn8PbNQsIKeVU04J9G7umt8= +google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -3101,8 +3150,9 @@ gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0 h1:hjy8E9ON/egN1tAYqKb61G10WtihqetD4sz2H+8nIeA= gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o= From abd418af41e0b8aa609e940e481d2d0ef4888e25 Mon Sep 17 00:00:00 2001 From: Marco Munizaga Date: Tue, 5 Jul 2022 16:07:01 -0700 Subject: [PATCH 015/185] Fix lint --- node/modules/lp2p/rcmgr.go | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/node/modules/lp2p/rcmgr.go b/node/modules/lp2p/rcmgr.go index 026aa7675..3d5a2b599 100644 --- a/node/modules/lp2p/rcmgr.go +++ b/node/modules/lp2p/rcmgr.go @@ -137,11 +137,17 @@ func ResourceManager(connMgrHi uint) func(lc fx.Lifecycle, repo repo.LockedRepo) } // Hook up resource manager metrics - view.Register(rcmgrObs.DefaultViews...) - ocprom.NewExporter(ocprom.Options{ + err = view.Register(rcmgrObs.DefaultViews...) + if err != nil { + return nil, fmt.Errorf("error registering metrics: %w", err) + } + _, err = ocprom.NewExporter(ocprom.Options{ Registry: prometheus.DefaultRegisterer.(*prometheus.Registry), Namespace: "rcmgr_trace_metrics", }) + if err != nil { + return nil, fmt.Errorf("error registering metrics: %w", err) + } lc.Append(fx.Hook{ OnStop: func(_ context.Context) error { From 57772135ada8c1f0d738a0784374aa28e92a0cee Mon Sep 17 00:00:00 2001 From: Marco Munizaga Date: Tue, 5 Jul 2022 16:48:04 -0700 Subject: [PATCH 016/185] Update dep --- go.mod | 2 +- go.sum | 5 +---- testplans/lotus-soup/go.mod | 2 +- testplans/lotus-soup/go.sum | 30 ++++++++++++++++++++++++++---- 4 files changed, 29 insertions(+), 10 deletions(-) diff --git a/go.mod b/go.mod index ce951bee1..d0a8d382f 100644 --- a/go.mod +++ b/go.mod @@ -329,7 +329,7 @@ require ( golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect golang.org/x/text v0.3.7 // indirect google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4 // indirect - google.golang.org/grpc v1.47.0 // indirect + google.golang.org/grpc v1.45.0 // indirect google.golang.org/protobuf v1.28.0 // indirect gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/go.sum b/go.sum index bdddfb080..b2b741450 100644 --- a/go.sum +++ b/go.sum @@ -200,7 +200,6 @@ github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XP github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= @@ -307,7 +306,6 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.m github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/etclabscore/go-jsonschema-walk v0.0.6 h1:DrNzoKWKd8f8XB5nFGBY00IcjakRE22OTI12k+2LkyY= github.com/etclabscore/go-jsonschema-walk v0.0.6/go.mod h1:VdfDY72AFAiUhy0ZXEaWSpveGjMT5JcDIm903NGqFwQ= @@ -2699,9 +2697,8 @@ google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.45.0 h1:NEpgUqV3Z+ZjkqMsxMg11IaDrXY4RY6CQukSGK0uI1M= google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc v1.47.0 h1:9n77onPX5F3qfFCqjy9dhn8PbNQsIKeVU04J9G7umt8= -google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= diff --git a/testplans/lotus-soup/go.mod b/testplans/lotus-soup/go.mod index 92d5fc2ec..c7c313c6f 100644 --- a/testplans/lotus-soup/go.mod +++ b/testplans/lotus-soup/go.mod @@ -322,7 +322,7 @@ require ( golang.org/x/tools v0.1.11 // indirect golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f // indirect google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4 // indirect - google.golang.org/grpc v1.47.0 // indirect + google.golang.org/grpc v1.45.0 // indirect google.golang.org/protobuf v1.28.0 // indirect gopkg.in/cheggaaa/pb.v1 v1.0.28 // indirect gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect diff --git a/testplans/lotus-soup/go.sum b/testplans/lotus-soup/go.sum index cc0ae04ad..0a5e7ae14 100644 --- a/testplans/lotus-soup/go.sum +++ b/testplans/lotus-soup/go.sum @@ -274,7 +274,6 @@ github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XP github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= @@ -399,7 +398,6 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.m github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/etclabscore/go-jsonschema-walk v0.0.6/go.mod h1:VdfDY72AFAiUhy0ZXEaWSpveGjMT5JcDIm903NGqFwQ= github.com/etclabscore/go-openrpc-reflect v0.0.36/go.mod h1:0404Ky3igAasAOpyj1eESjstTyneBAIk5PgJFbK4s5E= @@ -451,6 +449,14 @@ github.com/filecoin-project/go-fil-commcid v0.1.0 h1:3R4ds1A9r6cr8mvZBfMYxTS88Oq github.com/filecoin-project/go-fil-commcid v0.1.0/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 h1:imrrpZWEHRnNqqv0tN7LXep5bFEVOVmQWHJvl2mgsGo= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0/go.mod h1:73S8WSEWh9vr0fDJVnKADhfIv/d6dCbAGaAGWbdJEI8= +<<<<<<< HEAD +||||||| parent of 5ec99621d (Update dep) +github.com/filecoin-project/go-fil-markets v1.22.2-0.20220705225656-4c032afe40f4 h1:WkN/exKo7huGtMkn36FLmU32SUqLN3IrFS6C9SbRgqA= +github.com/filecoin-project/go-fil-markets v1.22.2-0.20220705225656-4c032afe40f4/go.mod h1:R7N6Dcqyf9oVEfSJcxPbavl7qQiQSAFfoLtKtmDOWE4= +======= +github.com/filecoin-project/go-fil-markets v1.22.2-0.20220705234416-74b64809273a h1:KjVJ1/PJLngSha73vzyPbUnkLPmGDPVtAiZY+Vth42s= +github.com/filecoin-project/go-fil-markets v1.22.2-0.20220705234416-74b64809273a/go.mod h1:eGYWMHCNFGJzDntkbpk76sLX/1Nj6HDlY8Ne7Q5Sg7o= +>>>>>>> 5ec99621d (Update dep) github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= @@ -1376,8 +1382,17 @@ github.com/libp2p/go-libp2p v0.18.0/go.mod h1:+veaZ9z1SZQhmc5PW78jvnnxZ89Mgvmh4c github.com/libp2p/go-libp2p v0.19.4/go.mod h1:MIt8y481VDhUe4ErWi1a4bvt/CjjFfOq6kZTothWIXY= github.com/libp2p/go-libp2p v0.20.0/go.mod h1:g0C5Fu+aXXbCXkusCzLycuBowEih3ElmDqtbo61Em7k= github.com/libp2p/go-libp2p v0.20.1/go.mod h1:XgJHsOhEBVBXp/2Sj9bm/yEyD94uunAaP6oaegdcKks= +<<<<<<< HEAD github.com/libp2p/go-libp2p v0.21.0 h1:s9yYScuIFY33FOOzwTXbc8QqbvsRyKIWFf0FCSJKrfM= github.com/libp2p/go-libp2p v0.21.0/go.mod h1:zvcA6/C4mr5/XQarRICh+L1SN9dAHHlSWDq4x5VYxg4= +||||||| parent of 5ec99621d (Update dep) +github.com/libp2p/go-libp2p v0.21.0-rc.0.20220705195358-7e9cfb579c0c/go.mod h1:htzcqL3z4f2xMms8cTOwfbTtLhL71GpSqlXDBh/OTn8= +github.com/libp2p/go-libp2p v0.21.0-rc.0.20220705232148-e6efd78ad5cc h1:AMeCfUBNU0GJZCJT1oJF/gzoYmb3lBmhXcY7b86A37U= +github.com/libp2p/go-libp2p v0.21.0-rc.0.20220705232148-e6efd78ad5cc/go.mod h1:fpu5XDWqdH6U/Wc0oOo1AI+Gqe5tC2AI0IsUCgOxzQ8= +======= +github.com/libp2p/go-libp2p v0.21.0-rc.0.20220705232148-e6efd78ad5cc h1:AMeCfUBNU0GJZCJT1oJF/gzoYmb3lBmhXcY7b86A37U= +github.com/libp2p/go-libp2p v0.21.0-rc.0.20220705232148-e6efd78ad5cc/go.mod h1:fpu5XDWqdH6U/Wc0oOo1AI+Gqe5tC2AI0IsUCgOxzQ8= +>>>>>>> 5ec99621d (Update dep) github.com/libp2p/go-libp2p-asn-util v0.0.0-20200825225859-85005c6cf052/go.mod h1:nRMRTab+kZuk0LnKZpxhOVH/ndsdr2Nr//Zltc/vwgo= github.com/libp2p/go-libp2p-asn-util v0.1.0/go.mod h1:wu+AnM9Ii2KgO5jMmS1rz9dvzTdj8BXqsPR9HR0XB7I= github.com/libp2p/go-libp2p-asn-util v0.2.0 h1:rg3+Os8jbnO5DxkC7K/Utdi+DkY3q/d1/1q+8WeNAsw= @@ -1484,6 +1499,14 @@ github.com/libp2p/go-libp2p-interface-pnet v0.0.1/go.mod h1:el9jHpQAXK5dnTpKA4yf github.com/libp2p/go-libp2p-kad-dht v0.2.1/go.mod h1:k7ONOlup7HKzQ68dE6lSnp07cdxdkmnRa+6B4Fh9/w0= github.com/libp2p/go-libp2p-kad-dht v0.15.0 h1:Ke+Oj78gX5UDXnA6HBdrgvi+fStJxgYTDa51U0TsCLo= github.com/libp2p/go-libp2p-kad-dht v0.15.0/go.mod h1:rZtPxYu1TnHHz6n1RggdGrxUX/tA1C2/Wiw3ZMUDrU0= +<<<<<<< HEAD +||||||| parent of 5ec99621d (Update dep) +github.com/libp2p/go-libp2p-kad-dht v0.16.1-0.20220705225540-29f55adf236a h1:RbsMmKOL2+RgZ3YQpNi9we1wxeFrMJV4dFqV6jfb+WE= +github.com/libp2p/go-libp2p-kad-dht v0.16.1-0.20220705225540-29f55adf236a/go.mod h1:XAyHWL6AVbk6XtJtcnvUOKh/jrLyNo2y4ADvYMfb1o0= +======= +github.com/libp2p/go-libp2p-kad-dht v0.16.1-0.20220705234258-f3aa0f62d5f5 h1:OKJFzksZWFXV61wu501jzqVnZq8VYw5FEDj4oa3taY0= +github.com/libp2p/go-libp2p-kad-dht v0.16.1-0.20220705234258-f3aa0f62d5f5/go.mod h1:1bh5jk0kVCg6FPIQlsK28thznd95Pyef43/n4UnNvfo= +>>>>>>> 5ec99621d (Update dep) github.com/libp2p/go-libp2p-kbucket v0.2.1/go.mod h1:/Rtu8tqbJ4WQ2KTCOMJhggMukOLNLNPY1EtEWWLxUvc= github.com/libp2p/go-libp2p-kbucket v0.3.1/go.mod h1:oyjT5O7tS9CQurok++ERgc46YLwEpuGoFq9ubvoUOio= github.com/libp2p/go-libp2p-kbucket v0.4.7 h1:spZAcgxifvFZHBD8tErvppbnNiKA5uokDu3CV7axu70= @@ -3097,9 +3120,8 @@ google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.45.0 h1:NEpgUqV3Z+ZjkqMsxMg11IaDrXY4RY6CQukSGK0uI1M= google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc v1.47.0 h1:9n77onPX5F3qfFCqjy9dhn8PbNQsIKeVU04J9G7umt8= -google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= From 15e00a125d7917b7d1a8ae92d802027a24ef4f87 Mon Sep 17 00:00:00 2001 From: Marco Munizaga Date: Wed, 6 Jul 2022 10:11:40 -0700 Subject: [PATCH 017/185] Update rcmgr --- testplans/lotus-soup/go.sum | 25 ------------------------- 1 file changed, 25 deletions(-) diff --git a/testplans/lotus-soup/go.sum b/testplans/lotus-soup/go.sum index 0a5e7ae14..48a908640 100644 --- a/testplans/lotus-soup/go.sum +++ b/testplans/lotus-soup/go.sum @@ -449,14 +449,6 @@ github.com/filecoin-project/go-fil-commcid v0.1.0 h1:3R4ds1A9r6cr8mvZBfMYxTS88Oq github.com/filecoin-project/go-fil-commcid v0.1.0/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 h1:imrrpZWEHRnNqqv0tN7LXep5bFEVOVmQWHJvl2mgsGo= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0/go.mod h1:73S8WSEWh9vr0fDJVnKADhfIv/d6dCbAGaAGWbdJEI8= -<<<<<<< HEAD -||||||| parent of 5ec99621d (Update dep) -github.com/filecoin-project/go-fil-markets v1.22.2-0.20220705225656-4c032afe40f4 h1:WkN/exKo7huGtMkn36FLmU32SUqLN3IrFS6C9SbRgqA= -github.com/filecoin-project/go-fil-markets v1.22.2-0.20220705225656-4c032afe40f4/go.mod h1:R7N6Dcqyf9oVEfSJcxPbavl7qQiQSAFfoLtKtmDOWE4= -======= -github.com/filecoin-project/go-fil-markets v1.22.2-0.20220705234416-74b64809273a h1:KjVJ1/PJLngSha73vzyPbUnkLPmGDPVtAiZY+Vth42s= -github.com/filecoin-project/go-fil-markets v1.22.2-0.20220705234416-74b64809273a/go.mod h1:eGYWMHCNFGJzDntkbpk76sLX/1Nj6HDlY8Ne7Q5Sg7o= ->>>>>>> 5ec99621d (Update dep) github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= @@ -1382,17 +1374,8 @@ github.com/libp2p/go-libp2p v0.18.0/go.mod h1:+veaZ9z1SZQhmc5PW78jvnnxZ89Mgvmh4c github.com/libp2p/go-libp2p v0.19.4/go.mod h1:MIt8y481VDhUe4ErWi1a4bvt/CjjFfOq6kZTothWIXY= github.com/libp2p/go-libp2p v0.20.0/go.mod h1:g0C5Fu+aXXbCXkusCzLycuBowEih3ElmDqtbo61Em7k= github.com/libp2p/go-libp2p v0.20.1/go.mod h1:XgJHsOhEBVBXp/2Sj9bm/yEyD94uunAaP6oaegdcKks= -<<<<<<< HEAD github.com/libp2p/go-libp2p v0.21.0 h1:s9yYScuIFY33FOOzwTXbc8QqbvsRyKIWFf0FCSJKrfM= github.com/libp2p/go-libp2p v0.21.0/go.mod h1:zvcA6/C4mr5/XQarRICh+L1SN9dAHHlSWDq4x5VYxg4= -||||||| parent of 5ec99621d (Update dep) -github.com/libp2p/go-libp2p v0.21.0-rc.0.20220705195358-7e9cfb579c0c/go.mod h1:htzcqL3z4f2xMms8cTOwfbTtLhL71GpSqlXDBh/OTn8= -github.com/libp2p/go-libp2p v0.21.0-rc.0.20220705232148-e6efd78ad5cc h1:AMeCfUBNU0GJZCJT1oJF/gzoYmb3lBmhXcY7b86A37U= -github.com/libp2p/go-libp2p v0.21.0-rc.0.20220705232148-e6efd78ad5cc/go.mod h1:fpu5XDWqdH6U/Wc0oOo1AI+Gqe5tC2AI0IsUCgOxzQ8= -======= -github.com/libp2p/go-libp2p v0.21.0-rc.0.20220705232148-e6efd78ad5cc h1:AMeCfUBNU0GJZCJT1oJF/gzoYmb3lBmhXcY7b86A37U= -github.com/libp2p/go-libp2p v0.21.0-rc.0.20220705232148-e6efd78ad5cc/go.mod h1:fpu5XDWqdH6U/Wc0oOo1AI+Gqe5tC2AI0IsUCgOxzQ8= ->>>>>>> 5ec99621d (Update dep) github.com/libp2p/go-libp2p-asn-util v0.0.0-20200825225859-85005c6cf052/go.mod h1:nRMRTab+kZuk0LnKZpxhOVH/ndsdr2Nr//Zltc/vwgo= github.com/libp2p/go-libp2p-asn-util v0.1.0/go.mod h1:wu+AnM9Ii2KgO5jMmS1rz9dvzTdj8BXqsPR9HR0XB7I= github.com/libp2p/go-libp2p-asn-util v0.2.0 h1:rg3+Os8jbnO5DxkC7K/Utdi+DkY3q/d1/1q+8WeNAsw= @@ -1499,14 +1482,6 @@ github.com/libp2p/go-libp2p-interface-pnet v0.0.1/go.mod h1:el9jHpQAXK5dnTpKA4yf github.com/libp2p/go-libp2p-kad-dht v0.2.1/go.mod h1:k7ONOlup7HKzQ68dE6lSnp07cdxdkmnRa+6B4Fh9/w0= github.com/libp2p/go-libp2p-kad-dht v0.15.0 h1:Ke+Oj78gX5UDXnA6HBdrgvi+fStJxgYTDa51U0TsCLo= github.com/libp2p/go-libp2p-kad-dht v0.15.0/go.mod h1:rZtPxYu1TnHHz6n1RggdGrxUX/tA1C2/Wiw3ZMUDrU0= -<<<<<<< HEAD -||||||| parent of 5ec99621d (Update dep) -github.com/libp2p/go-libp2p-kad-dht v0.16.1-0.20220705225540-29f55adf236a h1:RbsMmKOL2+RgZ3YQpNi9we1wxeFrMJV4dFqV6jfb+WE= -github.com/libp2p/go-libp2p-kad-dht v0.16.1-0.20220705225540-29f55adf236a/go.mod h1:XAyHWL6AVbk6XtJtcnvUOKh/jrLyNo2y4ADvYMfb1o0= -======= -github.com/libp2p/go-libp2p-kad-dht v0.16.1-0.20220705234258-f3aa0f62d5f5 h1:OKJFzksZWFXV61wu501jzqVnZq8VYw5FEDj4oa3taY0= -github.com/libp2p/go-libp2p-kad-dht v0.16.1-0.20220705234258-f3aa0f62d5f5/go.mod h1:1bh5jk0kVCg6FPIQlsK28thznd95Pyef43/n4UnNvfo= ->>>>>>> 5ec99621d (Update dep) github.com/libp2p/go-libp2p-kbucket v0.2.1/go.mod h1:/Rtu8tqbJ4WQ2KTCOMJhggMukOLNLNPY1EtEWWLxUvc= github.com/libp2p/go-libp2p-kbucket v0.3.1/go.mod h1:oyjT5O7tS9CQurok++ERgc46YLwEpuGoFq9ubvoUOio= github.com/libp2p/go-libp2p-kbucket v0.4.7 h1:spZAcgxifvFZHBD8tErvppbnNiKA5uokDu3CV7axu70= From d03992f878278b4dc27e455b1c6dde83c3f55dcc Mon Sep 17 00:00:00 2001 From: Marco Munizaga Date: Wed, 6 Jul 2022 10:12:09 -0700 Subject: [PATCH 018/185] Update rcmgr --- node/modules/lp2p/rcmgr.go | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/node/modules/lp2p/rcmgr.go b/node/modules/lp2p/rcmgr.go index 3d5a2b599..6c8c8c3ab 100644 --- a/node/modules/lp2p/rcmgr.go +++ b/node/modules/lp2p/rcmgr.go @@ -16,14 +16,12 @@ import ( "github.com/libp2p/go-libp2p-core/protocol" rcmgr "github.com/libp2p/go-libp2p-resource-manager" rcmgrObs "github.com/libp2p/go-libp2p-resource-manager/obs" - "github.com/pbnjay/memory" "github.com/prometheus/client_golang/prometheus" "go.opencensus.io/stats" "go.opencensus.io/stats/view" "go.opencensus.io/tag" "go.uber.org/fx" - "github.com/filecoin-project/lotus/lib/ulimit" "github.com/filecoin-project/lotus/metrics" "github.com/filecoin-project/lotus/node/repo" ) @@ -54,11 +52,7 @@ func ResourceManager(connMgrHi uint) func(lc fx.Lifecycle, repo repo.LockedRepo) defaultLimits.SystemBaseLimit.Memory = 1 << 30 // For every extra 1GB of memory we have available, increase our limit by 1GiB defaultLimits.SystemLimitIncrease.Memory = 1 << 30 - availFDs, _, err := ulimit.GetLimit() - if err != nil { - availFDs = 0 - } - defaultLimitConfig := defaultLimits.Scale(int64(memory.TotalMemory())/8, int(availFDs>>1)) + defaultLimitConfig := defaultLimits.AutoScale() if defaultLimitConfig.System.Memory > 4<<30 { // Cap our memory limit defaultLimitConfig.System.Memory = 4 << 30 From 6ae75aa1a20025ae3d2263249f1a3308d96fb337 Mon Sep 17 00:00:00 2001 From: Marco Munizaga Date: Wed, 6 Jul 2022 10:20:33 -0700 Subject: [PATCH 019/185] Mod tidy --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index d0a8d382f..9cf539476 100644 --- a/go.mod +++ b/go.mod @@ -130,7 +130,6 @@ require ( github.com/multiformats/go-varint v0.0.6 github.com/open-rpc/meta-schema v0.0.0-20201029221707-1b72ef2ea333 github.com/opentracing/opentracing-go v1.2.0 - github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 github.com/polydawn/refmt v0.0.0-20201211092308-30ac6d18308e github.com/prometheus/client_golang v1.12.1 github.com/raulk/clock v1.1.0 @@ -293,6 +292,7 @@ require ( github.com/nxadm/tail v1.4.8 // indirect github.com/onsi/ginkgo v1.16.5 // indirect github.com/opencontainers/runtime-spec v1.0.2 // indirect + github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect From 61abd91eb9756313fa8f69f9c98ad5386577b627 Mon Sep 17 00:00:00 2001 From: Marco Munizaga Date: Thu, 11 Aug 2022 11:39:06 -0700 Subject: [PATCH 020/185] Use kad-dht fork --- go.mod | 2 +- go.sum | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 9cf539476..b277a43fd 100644 --- a/go.mod +++ b/go.mod @@ -112,7 +112,7 @@ require ( github.com/libp2p/go-eventbus v0.2.1 github.com/libp2p/go-libp2p v0.21.0 github.com/libp2p/go-libp2p-core v0.19.1 - github.com/libp2p/go-libp2p-kad-dht v0.15.0 + github.com/libp2p/go-libp2p-kad-dht v0.16.1-0.20220811151450-6a2603e9927e github.com/libp2p/go-libp2p-peerstore v0.7.1 github.com/libp2p/go-libp2p-pubsub v0.7.1 github.com/libp2p/go-libp2p-record v0.1.3 diff --git a/go.sum b/go.sum index b2b741450..535f13576 100644 --- a/go.sum +++ b/go.sum @@ -1234,8 +1234,9 @@ github.com/libp2p/go-libp2p-interface-connmgr v0.0.4/go.mod h1:GarlRLH0LdeWcLnYM github.com/libp2p/go-libp2p-interface-connmgr v0.0.5/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= github.com/libp2p/go-libp2p-interface-pnet v0.0.1/go.mod h1:el9jHpQAXK5dnTpKA4yfCNBZXvrzdOU75zz+C6ryp3k= github.com/libp2p/go-libp2p-kad-dht v0.2.1/go.mod h1:k7ONOlup7HKzQ68dE6lSnp07cdxdkmnRa+6B4Fh9/w0= -github.com/libp2p/go-libp2p-kad-dht v0.15.0 h1:Ke+Oj78gX5UDXnA6HBdrgvi+fStJxgYTDa51U0TsCLo= github.com/libp2p/go-libp2p-kad-dht v0.15.0/go.mod h1:rZtPxYu1TnHHz6n1RggdGrxUX/tA1C2/Wiw3ZMUDrU0= +github.com/libp2p/go-libp2p-kad-dht v0.16.1-0.20220811151450-6a2603e9927e h1:5zZOxnbjc8RHXIVEC1qsZEgpbVow54zNZrL3zyVCsI4= +github.com/libp2p/go-libp2p-kad-dht v0.16.1-0.20220811151450-6a2603e9927e/go.mod h1:zeE26Xo+PY7sS2AgkBQQcBnJEazMT26KGZLUFttl+rk= github.com/libp2p/go-libp2p-kbucket v0.2.1/go.mod h1:/Rtu8tqbJ4WQ2KTCOMJhggMukOLNLNPY1EtEWWLxUvc= github.com/libp2p/go-libp2p-kbucket v0.3.1/go.mod h1:oyjT5O7tS9CQurok++ERgc46YLwEpuGoFq9ubvoUOio= github.com/libp2p/go-libp2p-kbucket v0.4.7 h1:spZAcgxifvFZHBD8tErvppbnNiKA5uokDu3CV7axu70= @@ -1382,6 +1383,7 @@ github.com/libp2p/go-libp2p-transport-upgrader v0.6.0/go.mod h1:1e07y1ZSZdHo9HPb github.com/libp2p/go-libp2p-transport-upgrader v0.7.0/go.mod h1:GIR2aTRp1J5yjVlkUoFqMkdobfob6RnAwYg/RZPhrzg= github.com/libp2p/go-libp2p-transport-upgrader v0.7.1/go.mod h1:GIR2aTRp1J5yjVlkUoFqMkdobfob6RnAwYg/RZPhrzg= github.com/libp2p/go-libp2p-xor v0.0.0-20210714161855-5c005aca55db/go.mod h1:LSTM5yRnjGZbWNTA/hRwq2gGFrvRIbQJscoIL/u6InY= +github.com/libp2p/go-libp2p-xor v0.1.0/go.mod h1:LSTM5yRnjGZbWNTA/hRwq2gGFrvRIbQJscoIL/u6InY= github.com/libp2p/go-libp2p-yamux v0.1.2/go.mod h1:xUoV/RmYkg6BW/qGxA9XJyg+HzXFYkeXbnhjmnYzKp8= github.com/libp2p/go-libp2p-yamux v0.1.3/go.mod h1:VGSQVrqkh6y4nm0189qqxMtvyBft44MOYYPpYKXiVt4= github.com/libp2p/go-libp2p-yamux v0.2.0/go.mod h1:Db2gU+XfLpm6E4rG5uGCFX6uXA8MEXOxFcRoXUODaK8= From 6d4b9623917c3b746385f15a6bdfa2ccc937e818 Mon Sep 17 00:00:00 2001 From: Marco Munizaga Date: Thu, 11 Aug 2022 12:38:50 -0700 Subject: [PATCH 021/185] Use v0.8.0 go-bitswap --- go.mod | 4 ++-- go.sum | 7 ++++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index b277a43fd..4cbbca462 100644 --- a/go.mod +++ b/go.mod @@ -71,7 +71,7 @@ require ( github.com/icza/backscanner v0.0.0-20210726202459-ac2ffc679f94 github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab github.com/ipfs/bbloom v0.0.4 - github.com/ipfs/go-bitswap v0.7.1-0.20220705171910-84973686518b + github.com/ipfs/go-bitswap v0.8.0 github.com/ipfs/go-block-format v0.0.3 github.com/ipfs/go-blockservice v0.3.0 github.com/ipfs/go-cid v0.2.0 @@ -86,7 +86,7 @@ require ( github.com/ipfs/go-ipfs-blocksutil v0.0.1 github.com/ipfs/go-ipfs-chunker v0.0.5 github.com/ipfs/go-ipfs-ds-help v1.1.0 - github.com/ipfs/go-ipfs-exchange-interface v0.1.0 + github.com/ipfs/go-ipfs-exchange-interface v0.2.0 github.com/ipfs/go-ipfs-exchange-offline v0.2.0 github.com/ipfs/go-ipfs-files v0.1.1 github.com/ipfs/go-ipfs-http-client v0.4.0 diff --git a/go.sum b/go.sum index 535f13576..b1b5b9350 100644 --- a/go.sum +++ b/go.sum @@ -734,8 +734,8 @@ github.com/ipfs/go-bitswap v0.1.8/go.mod h1:TOWoxllhccevbWFUR2N7B1MTSVVge1s6XSMi github.com/ipfs/go-bitswap v0.3.4/go.mod h1:4T7fvNv/LmOys+21tnLzGKncMeeXUYUd1nUiJ2teMvI= github.com/ipfs/go-bitswap v0.5.1/go.mod h1:P+ckC87ri1xFLvk74NlXdP0Kj9RmWAh4+H78sC6Qopo= github.com/ipfs/go-bitswap v0.6.0/go.mod h1:Hj3ZXdOC5wBJvENtdqsixmzzRukqd8EHLxZLZc3mzRA= -github.com/ipfs/go-bitswap v0.7.1-0.20220705171910-84973686518b h1:D0ovjO1DVGRlT+FLDoJeL3GnZ/6qyov5xpqUXt7TEkM= -github.com/ipfs/go-bitswap v0.7.1-0.20220705171910-84973686518b/go.mod h1:EKDX22BNE4CaW8jDn4yjsN8YcqKQZUL4/dXxtKQ6hto= +github.com/ipfs/go-bitswap v0.8.0 h1:UEV7kogQu2iGggkE9GhLykDrRCUpsNnpu2NODww/srw= +github.com/ipfs/go-bitswap v0.8.0/go.mod h1:/h8sBij8UVEaNWl8ABzpLRA5Y1cttdNUnpeGo2AA/LQ= github.com/ipfs/go-block-format v0.0.1/go.mod h1:DK/YYcsSUIVAFNwo/KZCdIIbpN0ROH/baNLgayt4pFc= github.com/ipfs/go-block-format v0.0.2/go.mod h1:AWR46JfpcObNfg3ok2JHDUfdiHRgWhJgCQF+KIgOPJY= github.com/ipfs/go-block-format v0.0.3 h1:r8t66QstRp/pd/or4dpnbVfXT5Gt7lOqRvC+/dDTpMc= @@ -840,8 +840,9 @@ github.com/ipfs/go-ipfs-ds-help v1.0.0/go.mod h1:ujAbkeIgkKAWtxxNkoZHWLCyk5JpPoK github.com/ipfs/go-ipfs-ds-help v1.1.0 h1:yLE2w9RAsl31LtfMt91tRZcrx+e61O5mDxFRR994w4Q= github.com/ipfs/go-ipfs-ds-help v1.1.0/go.mod h1:YR5+6EaebOhfcqVCyqemItCLthrpVNot+rsOU/5IatU= github.com/ipfs/go-ipfs-exchange-interface v0.0.1/go.mod h1:c8MwfHjtQjPoDyiy9cFquVtVHkO9b9Ob3FG91qJnWCM= -github.com/ipfs/go-ipfs-exchange-interface v0.1.0 h1:TiMekCrOGQuWYtZO3mf4YJXDIdNgnKWZ9IE3fGlnWfo= github.com/ipfs/go-ipfs-exchange-interface v0.1.0/go.mod h1:ych7WPlyHqFvCi/uQI48zLZuAWVP5iTQPXEfVaw5WEI= +github.com/ipfs/go-ipfs-exchange-interface v0.2.0 h1:8lMSJmKogZYNo2jjhUs0izT+dck05pqUw4mWNW9Pw6Y= +github.com/ipfs/go-ipfs-exchange-interface v0.2.0/go.mod h1:z6+RhJuDQbqKguVyslSOuVDhqF9JtTrO3eptSAiW2/Y= github.com/ipfs/go-ipfs-exchange-offline v0.0.1/go.mod h1:WhHSFCVYX36H/anEKQboAzpUws3x7UeEGkzQc3iNkM0= github.com/ipfs/go-ipfs-exchange-offline v0.1.1/go.mod h1:vTiBRIbzSwDD0OWm+i3xeT0mO7jG2cbJYatp3HPk5XY= github.com/ipfs/go-ipfs-exchange-offline v0.2.0 h1:2PF4o4A7W656rC0RxuhUace997FTcDTcIQ6NoEtyjAI= From df777b3166cf6e58a7da469fed97e709d66b5f59 Mon Sep 17 00:00:00 2001 From: Marco Munizaga Date: Thu, 11 Aug 2022 12:53:10 -0700 Subject: [PATCH 022/185] Update deps --- go.mod | 4 ++-- go.sum | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 4cbbca462..187166290 100644 --- a/go.mod +++ b/go.mod @@ -73,7 +73,7 @@ require ( github.com/ipfs/bbloom v0.0.4 github.com/ipfs/go-bitswap v0.8.0 github.com/ipfs/go-block-format v0.0.3 - github.com/ipfs/go-blockservice v0.3.0 + github.com/ipfs/go-blockservice v0.4.0 github.com/ipfs/go-cid v0.2.0 github.com/ipfs/go-cidutil v0.1.0 github.com/ipfs/go-datastore v0.5.1 @@ -87,7 +87,7 @@ require ( github.com/ipfs/go-ipfs-chunker v0.0.5 github.com/ipfs/go-ipfs-ds-help v1.1.0 github.com/ipfs/go-ipfs-exchange-interface v0.2.0 - github.com/ipfs/go-ipfs-exchange-offline v0.2.0 + github.com/ipfs/go-ipfs-exchange-offline v0.3.0 github.com/ipfs/go-ipfs-files v0.1.1 github.com/ipfs/go-ipfs-http-client v0.4.0 github.com/ipfs/go-ipfs-routing v0.2.1 diff --git a/go.sum b/go.sum index b1b5b9350..dc40d3e19 100644 --- a/go.sum +++ b/go.sum @@ -745,8 +745,9 @@ github.com/ipfs/go-blockservice v0.1.0/go.mod h1:hzmMScl1kXHg3M2BjTymbVPjv627N7s github.com/ipfs/go-blockservice v0.1.4/go.mod h1:OTZhFpkgY48kNzbgyvcexW9cHrpjBYIjSR0KoDOFOLU= github.com/ipfs/go-blockservice v0.1.7/go.mod h1:GmS+BAt4hrwBKkzE11AFDQUrnvqjwFatGS2MY7wOjEM= github.com/ipfs/go-blockservice v0.2.1/go.mod h1:k6SiwmgyYgs4M/qt+ww6amPeUH9EISLRBnvUurKJhi8= -github.com/ipfs/go-blockservice v0.3.0 h1:cDgcZ+0P0Ih3sl8+qjFr2sVaMdysg/YZpLj5WJ8kiiw= github.com/ipfs/go-blockservice v0.3.0/go.mod h1:P5ppi8IHDC7O+pA0AlGTF09jruB2h+oP3wVVaZl8sfk= +github.com/ipfs/go-blockservice v0.4.0 h1:7MUijAW5SqdsqEW/EhnNFRJXVF8mGU5aGhZ3CQaCWbY= +github.com/ipfs/go-blockservice v0.4.0/go.mod h1:kRjO3wlGW9mS1aKuiCeGhx9K1DagQ10ACpVO59qgAx4= github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/ipfs/go-cid v0.0.2/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/ipfs/go-cid v0.0.3/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= @@ -845,8 +846,9 @@ github.com/ipfs/go-ipfs-exchange-interface v0.2.0 h1:8lMSJmKogZYNo2jjhUs0izT+dck github.com/ipfs/go-ipfs-exchange-interface v0.2.0/go.mod h1:z6+RhJuDQbqKguVyslSOuVDhqF9JtTrO3eptSAiW2/Y= github.com/ipfs/go-ipfs-exchange-offline v0.0.1/go.mod h1:WhHSFCVYX36H/anEKQboAzpUws3x7UeEGkzQc3iNkM0= github.com/ipfs/go-ipfs-exchange-offline v0.1.1/go.mod h1:vTiBRIbzSwDD0OWm+i3xeT0mO7jG2cbJYatp3HPk5XY= -github.com/ipfs/go-ipfs-exchange-offline v0.2.0 h1:2PF4o4A7W656rC0RxuhUace997FTcDTcIQ6NoEtyjAI= github.com/ipfs/go-ipfs-exchange-offline v0.2.0/go.mod h1:HjwBeW0dvZvfOMwDP0TSKXIHf2s+ksdP4E3MLDRtLKY= +github.com/ipfs/go-ipfs-exchange-offline v0.3.0 h1:c/Dg8GDPzixGd0MC8Jh6mjOwU57uYokgWRFidfvEkuA= +github.com/ipfs/go-ipfs-exchange-offline v0.3.0/go.mod h1:MOdJ9DChbb5u37M1IcbrRB02e++Z7521fMxqCNRrz9s= github.com/ipfs/go-ipfs-files v0.0.3/go.mod h1:INEFm0LL2LWXBhNJ2PMIIb2w45hpXgPjNoE7yA8Y1d4= github.com/ipfs/go-ipfs-files v0.0.4/go.mod h1:INEFm0LL2LWXBhNJ2PMIIb2w45hpXgPjNoE7yA8Y1d4= github.com/ipfs/go-ipfs-files v0.0.8/go.mod h1:wiN/jSG8FKyk7N0WyctKSvq3ljIa2NNTiZB55kpTdOs= From 05f5e02c03750d676298b7c3a04886cd6cda62d4 Mon Sep 17 00:00:00 2001 From: Marco Munizaga Date: Thu, 11 Aug 2022 13:22:58 -0700 Subject: [PATCH 023/185] Rerun ci --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 6097343eb..40bcdeeb2 100644 --- a/README.md +++ b/README.md @@ -136,3 +136,5 @@ Note: The default branch `master` is the dev branch where the latest new feature ## License Dual-licensed under [MIT](https://github.com/filecoin-project/lotus/blob/master/LICENSE-MIT) + [Apache 2.0](https://github.com/filecoin-project/lotus/blob/master/LICENSE-APACHE) + +touch \ No newline at end of file From 3c2c827bc35acf1ece25d84dce2749e5c05193ba Mon Sep 17 00:00:00 2001 From: Marco Munizaga Date: Thu, 11 Aug 2022 13:42:33 -0700 Subject: [PATCH 024/185] Revert "Rerun ci" This reverts commit 05f5e02c03750d676298b7c3a04886cd6cda62d4. --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index 40bcdeeb2..6097343eb 100644 --- a/README.md +++ b/README.md @@ -136,5 +136,3 @@ Note: The default branch `master` is the dev branch where the latest new feature ## License Dual-licensed under [MIT](https://github.com/filecoin-project/lotus/blob/master/LICENSE-MIT) + [Apache 2.0](https://github.com/filecoin-project/lotus/blob/master/LICENSE-APACHE) - -touch \ No newline at end of file From 8bc79a65c7c7eff24380a009be09c88c8cbee76d Mon Sep 17 00:00:00 2001 From: Ian Davis Date: Thu, 11 Aug 2022 15:44:09 -0700 Subject: [PATCH 025/185] Don't automatically start the lotus daemon on snap install --- snap/snapcraft.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index 08854555f..3f83ad16d 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -85,7 +85,7 @@ apps: lotus-daemon: command: snap-lotus-entrypoint.sh daemon: simple - install-mode: enable + install-mode: disable plugs: - network - network-bind From 5a133ff2d44816a3ae6611ee8f62096d8d8997ad Mon Sep 17 00:00:00 2001 From: Marco Munizaga Date: Thu, 11 Aug 2022 15:56:48 -0700 Subject: [PATCH 026/185] Hook up resource manager metrics --- metrics/metrics.go | 2 ++ node/modules/lp2p/rcmgr.go | 16 ---------------- 2 files changed, 2 insertions(+), 16 deletions(-) diff --git a/metrics/metrics.go b/metrics/metrics.go index 8a4c3aa31..18c996b01 100644 --- a/metrics/metrics.go +++ b/metrics/metrics.go @@ -9,6 +9,7 @@ import ( "go.opencensus.io/tag" rpcmetrics "github.com/filecoin-project/go-jsonrpc/metrics" + "github.com/libp2p/go-libp2p-resource-manager/obs" "github.com/filecoin-project/lotus/blockstore" ) @@ -645,6 +646,7 @@ var DefaultViews = func() []*view.View { } views = append(views, blockstore.DefaultViews...) views = append(views, rpcmetrics.DefaultViews...) + views = append(views, obs.DefaultViews...) return views }() diff --git a/node/modules/lp2p/rcmgr.go b/node/modules/lp2p/rcmgr.go index 6c8c8c3ab..6725b869c 100644 --- a/node/modules/lp2p/rcmgr.go +++ b/node/modules/lp2p/rcmgr.go @@ -8,7 +8,6 @@ import ( "os" "path/filepath" - ocprom "contrib.go.opencensus.io/exporter/prometheus" logging "github.com/ipfs/go-log/v2" "github.com/libp2p/go-libp2p" "github.com/libp2p/go-libp2p-core/network" @@ -16,9 +15,7 @@ import ( "github.com/libp2p/go-libp2p-core/protocol" rcmgr "github.com/libp2p/go-libp2p-resource-manager" rcmgrObs "github.com/libp2p/go-libp2p-resource-manager/obs" - "github.com/prometheus/client_golang/prometheus" "go.opencensus.io/stats" - "go.opencensus.io/stats/view" "go.opencensus.io/tag" "go.uber.org/fx" @@ -130,19 +127,6 @@ func ResourceManager(connMgrHi uint) func(lc fx.Lifecycle, repo repo.LockedRepo) return nil, fmt.Errorf("error creating resource manager: %w", err) } - // Hook up resource manager metrics - err = view.Register(rcmgrObs.DefaultViews...) - if err != nil { - return nil, fmt.Errorf("error registering metrics: %w", err) - } - _, err = ocprom.NewExporter(ocprom.Options{ - Registry: prometheus.DefaultRegisterer.(*prometheus.Registry), - Namespace: "rcmgr_trace_metrics", - }) - if err != nil { - return nil, fmt.Errorf("error registering metrics: %w", err) - } - lc.Append(fx.Hook{ OnStop: func(_ context.Context) error { return mgr.Close() From bb05aeb860e34584849bf200863b7036de7877ce Mon Sep 17 00:00:00 2001 From: Yu Date: Fri, 12 Aug 2022 11:53:06 +0800 Subject: [PATCH 027/185] chore: fix typo in comment --- api/v0api/full.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/v0api/full.go b/api/v0api/full.go index 05b91830a..15da14411 100644 --- a/api/v0api/full.go +++ b/api/v0api/full.go @@ -591,7 +591,7 @@ type FullNode interface { // Returns nil if there is no entry in the data cap table for the // address. StateVerifiedClientStatus(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*abi.StoragePower, error) //perm:read - // StateVerifiedClientStatus returns the address of the Verified Registry's root key + // StateVerifiedRegistryRootKey returns the address of the Verified Registry's root key StateVerifiedRegistryRootKey(ctx context.Context, tsk types.TipSetKey) (address.Address, error) //perm:read // StateDealProviderCollateralBounds returns the min and max collateral a storage provider // can issue. It takes the deal size and verified status as parameters. From 0ad96858ff5b7ebb1af0e3d6e222edd526538480 Mon Sep 17 00:00:00 2001 From: Yu Date: Fri, 12 Aug 2022 15:12:22 +0800 Subject: [PATCH 028/185] chore: do make docsgen --- api/api_full.go | 2 +- build/openrpc/full.json.gz | Bin 28171 -> 28173 bytes documentation/en/api-v0-methods.md | 2 +- documentation/en/api-v1-unstable-methods.md | 2 +- 4 files changed, 3 insertions(+), 3 deletions(-) diff --git a/api/api_full.go b/api/api_full.go index 98b89fd43..bfd5e4f6b 100644 --- a/api/api_full.go +++ b/api/api_full.go @@ -581,7 +581,7 @@ type FullNode interface { // Returns nil if there is no entry in the data cap table for the // address. StateVerifiedClientStatus(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*abi.StoragePower, error) //perm:read - // StateVerifiedClientStatus returns the address of the Verified Registry's root key + // StateVerifiedRegistryRootKey returns the address of the Verified Registry's root key StateVerifiedRegistryRootKey(ctx context.Context, tsk types.TipSetKey) (address.Address, error) //perm:read // StateDealProviderCollateralBounds returns the min and max collateral a storage provider // can issue. It takes the deal size and verified status as parameters. diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index fb9fd4e66bc7dc466387b17e9ccf8ae222115d6f..0bc6e15c1b647a4d55cd7c16424671047c7eafab 100644 GIT binary patch delta 2696 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 Date: Fri, 12 Aug 2022 09:49:38 -0700 Subject: [PATCH 029/185] Update go-libp2p-resource-manager to v0.5.3 --- go.mod | 2 +- go.sum | 3 ++- metrics/metrics.go | 2 -- node/modules/lp2p/rcmgr.go | 3 +++ 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 187166290..c70dbcdfb 100644 --- a/go.mod +++ b/go.mod @@ -116,7 +116,7 @@ require ( github.com/libp2p/go-libp2p-peerstore v0.7.1 github.com/libp2p/go-libp2p-pubsub v0.7.1 github.com/libp2p/go-libp2p-record v0.1.3 - github.com/libp2p/go-libp2p-resource-manager v0.5.1 + github.com/libp2p/go-libp2p-resource-manager v0.5.3 github.com/libp2p/go-libp2p-routing-helpers v0.2.3 github.com/libp2p/go-maddr-filter v0.1.0 github.com/mattn/go-isatty v0.0.14 diff --git a/go.sum b/go.sum index dc40d3e19..5bd8e4e12 100644 --- a/go.sum +++ b/go.sum @@ -1319,8 +1319,9 @@ github.com/libp2p/go-libp2p-record v0.1.3/go.mod h1:yNUff/adKIfPnYQXgp6FQmNu3gLJ github.com/libp2p/go-libp2p-resource-manager v0.1.5/go.mod h1:wJPNjeE4XQlxeidwqVY5G6DLOKqFK33u2n8blpl0I6Y= github.com/libp2p/go-libp2p-resource-manager v0.2.1/go.mod h1:K+eCkiapf+ey/LADO4TaMpMTP9/Qde/uLlrnRqV4PLQ= github.com/libp2p/go-libp2p-resource-manager v0.3.0/go.mod h1:K+eCkiapf+ey/LADO4TaMpMTP9/Qde/uLlrnRqV4PLQ= -github.com/libp2p/go-libp2p-resource-manager v0.5.1 h1:jm0mdqn7yfh7wbUzlj948BYZX0KZ3RW7OqerkGQ5rYY= github.com/libp2p/go-libp2p-resource-manager v0.5.1/go.mod h1:CggtV6EZb+Y0dGh41q5ezO4udcVKyhcEFpydHD8EMe0= +github.com/libp2p/go-libp2p-resource-manager v0.5.3 h1:W8rG2abNBO52SRQYj24AvKmutTJZfoc1OrgzGQPwcRU= +github.com/libp2p/go-libp2p-resource-manager v0.5.3/go.mod h1:CggtV6EZb+Y0dGh41q5ezO4udcVKyhcEFpydHD8EMe0= github.com/libp2p/go-libp2p-routing v0.0.1/go.mod h1:N51q3yTr4Zdr7V8Jt2JIktVU+3xBBylx1MZeVA6t1Ys= github.com/libp2p/go-libp2p-routing v0.1.0/go.mod h1:zfLhI1RI8RLEzmEaaPwzonRvXeeSHddONWkcTcB54nE= github.com/libp2p/go-libp2p-routing-helpers v0.2.3 h1:xY61alxJ6PurSi+MXbywZpelvuU4U4p/gPTxjqCqTzY= diff --git a/metrics/metrics.go b/metrics/metrics.go index 18c996b01..8a4c3aa31 100644 --- a/metrics/metrics.go +++ b/metrics/metrics.go @@ -9,7 +9,6 @@ import ( "go.opencensus.io/tag" rpcmetrics "github.com/filecoin-project/go-jsonrpc/metrics" - "github.com/libp2p/go-libp2p-resource-manager/obs" "github.com/filecoin-project/lotus/blockstore" ) @@ -646,7 +645,6 @@ var DefaultViews = func() []*view.View { } views = append(views, blockstore.DefaultViews...) views = append(views, rpcmetrics.DefaultViews...) - views = append(views, obs.DefaultViews...) return views }() diff --git a/node/modules/lp2p/rcmgr.go b/node/modules/lp2p/rcmgr.go index 6725b869c..a6cae331c 100644 --- a/node/modules/lp2p/rcmgr.go +++ b/node/modules/lp2p/rcmgr.go @@ -14,8 +14,10 @@ import ( "github.com/libp2p/go-libp2p-core/peer" "github.com/libp2p/go-libp2p-core/protocol" rcmgr "github.com/libp2p/go-libp2p-resource-manager" + "github.com/libp2p/go-libp2p-resource-manager/obs" rcmgrObs "github.com/libp2p/go-libp2p-resource-manager/obs" "go.opencensus.io/stats" + "go.opencensus.io/stats/view" "go.opencensus.io/tag" "go.uber.org/fx" @@ -109,6 +111,7 @@ func ResourceManager(connMgrHi uint) func(lc fx.Lifecycle, repo repo.LockedRepo) if err != nil { return nil, fmt.Errorf("error creating resource manager stats reporter: %w", err) } + view.Register(obs.DefaultViews...) // Metrics opts = append(opts, rcmgr.WithMetrics(rcmgrMetrics{}), rcmgr.WithTraceReporter(str)) From 1af9e3c313d0df86eb73b06f6213fb470dd88c59 Mon Sep 17 00:00:00 2001 From: Marco Munizaga Date: Fri, 12 Aug 2022 09:55:03 -0700 Subject: [PATCH 030/185] Check err for view.Register --- node/modules/lp2p/rcmgr.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/node/modules/lp2p/rcmgr.go b/node/modules/lp2p/rcmgr.go index a6cae331c..bd4ff75ab 100644 --- a/node/modules/lp2p/rcmgr.go +++ b/node/modules/lp2p/rcmgr.go @@ -111,7 +111,10 @@ func ResourceManager(connMgrHi uint) func(lc fx.Lifecycle, repo repo.LockedRepo) if err != nil { return nil, fmt.Errorf("error creating resource manager stats reporter: %w", err) } - view.Register(obs.DefaultViews...) + err = view.Register(obs.DefaultViews...) + if err != nil { + return nil, fmt.Errorf("error registering rcmgr metrics: %w", err) + } // Metrics opts = append(opts, rcmgr.WithMetrics(rcmgrMetrics{}), rcmgr.WithTraceReporter(str)) From e0428ca8c249993a2b3509e8540ae56934928a17 Mon Sep 17 00:00:00 2001 From: Ian Davis Date: Fri, 12 Aug 2022 14:44:31 -0700 Subject: [PATCH 031/185] Snap starts disabled now, so no need to disable --- tools/packer/setup-snap.sh | 2 -- 1 file changed, 2 deletions(-) diff --git a/tools/packer/setup-snap.sh b/tools/packer/setup-snap.sh index 2bf11086e..3db06e5b4 100644 --- a/tools/packer/setup-snap.sh +++ b/tools/packer/setup-snap.sh @@ -33,8 +33,6 @@ snap alias lotus.lotus-daemon lotus-daemon snap alias lotus.lotus-miner lotus-miner snap alias lotus.lotus-worker lotus-worker -snap stop lotus.lotus-daemon - # Setup firewall yes | ufw enable ufw default deny incoming From 77208728ad545c25cdad7364a5c39fbb52dd1b33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 9 Aug 2022 13:43:08 +0200 Subject: [PATCH 032/185] sealing: fix lint/tests --- node/modules/storageminer.go | 2 +- storage/pipeline/precommit_policy_test.go | 3 ++- storage/pipeline/sealing.go | 8 ++------ 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/node/modules/storageminer.go b/node/modules/storageminer.go index c28342504..7a6d48784 100644 --- a/node/modules/storageminer.go +++ b/node/modules/storageminer.go @@ -222,7 +222,7 @@ func PreflightChecks(mctx helpers.MetricsCtx, lc fx.Lifecycle, api v1api.FullNod } if !has { - return errors.New("key for worker not found in local wallet") + return xerrors.New("key for worker not found in local wallet") } log.Infof("starting up miner %s, worker addr %s", maddr, workerKey) diff --git a/storage/pipeline/precommit_policy_test.go b/storage/pipeline/precommit_policy_test.go index d673126b9..5d2da1ee0 100644 --- a/storage/pipeline/precommit_policy_test.go +++ b/storage/pipeline/precommit_policy_test.go @@ -18,6 +18,7 @@ import ( "github.com/filecoin-project/lotus/chain/actors/builtin" "github.com/filecoin-project/lotus/chain/actors/policy" "github.com/filecoin-project/lotus/chain/types" + "github.com/filecoin-project/lotus/node/modules/dtypes" pipeline "github.com/filecoin-project/lotus/storage/pipeline" "github.com/filecoin-project/lotus/storage/pipeline/sealiface" ) @@ -30,7 +31,7 @@ type fakeConfigStub struct { CCSectorLifetime time.Duration } -func fakeConfigGetter(stub *fakeConfigStub) pipeline.GetSealingConfigFunc { +func fakeConfigGetter(stub *fakeConfigStub) dtypes.GetSealingConfigFunc { return func() (sealiface.Config, error) { if stub == nil { return sealiface.Config{}, nil diff --git a/storage/pipeline/sealing.go b/storage/pipeline/sealing.go index c261c0468..6bc5f508d 100644 --- a/storage/pipeline/sealing.go +++ b/storage/pipeline/sealing.go @@ -218,14 +218,10 @@ func New(mctx context.Context, api SealingAPI, fc config.MinerFeeConfig, events return s } -func (m *Sealing) Run(ctx context.Context) error { - +func (m *Sealing) Run(ctx context.Context) { if err := m.restartSectors(ctx); err != nil { - log.Errorf("%+v", err) - return xerrors.Errorf("failed load sector states: %w", err) + log.Errorf("failed load sector states: %+v", err) } - - return nil } func (m *Sealing) Stop(ctx context.Context) error { From 84a2ebcbfd1e5d9e851707b4c1edba6f80c9c7e6 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Fri, 12 Aug 2022 10:56:43 -0400 Subject: [PATCH 033/185] Update xcode version for macos builds --- .circleci/config.yml | 2 +- .circleci/template.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 24e5d8e13..02b42d335 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -382,7 +382,7 @@ jobs: description: publish github release and homebrew? type: boolean macos: - xcode: "12.5.0" + xcode: "13.4.1" working_directory: ~/go/src/github.com/filecoin-project/lotus steps: - prepare: diff --git a/.circleci/template.yml b/.circleci/template.yml index 46f72e87b..c4b28dbf2 100644 --- a/.circleci/template.yml +++ b/.circleci/template.yml @@ -382,7 +382,7 @@ jobs: description: publish github release and homebrew? type: boolean macos: - xcode: "12.5.0" + xcode: "13.4.1" working_directory: ~/go/src/github.com/filecoin-project/lotus steps: - prepare: From fa4a479b979949119ce1af1978a6af6f4e0def04 Mon Sep 17 00:00:00 2001 From: Shrenuj Bansal Date: Tue, 16 Aug 2022 15:39:06 -0400 Subject: [PATCH 034/185] Add uuid to mpool message sent to chain node from miner --- api/types.go | 13 ++++++++----- api/v1api/latest.go | 2 ++ chain/messagesigner/messagesigner.go | 22 +++++++++++++++++++++ cmd/lotus-miner/run.go | 4 ++-- itests/kit/ensemble.go | 5 ++--- node/builder_miner.go | 2 ++ node/impl/full/mpool.go | 29 +++++++++++++++++++++++++--- node/modules/storageminer.go | 14 ++++++++++++++ 8 files changed, 78 insertions(+), 13 deletions(-) diff --git a/api/types.go b/api/types.go index 6a4b18fa7..74d0cce72 100644 --- a/api/types.go +++ b/api/types.go @@ -5,8 +5,10 @@ import ( "fmt" "time" + "github.com/google/uuid" "github.com/ipfs/go-cid" "github.com/ipfs/go-graphsync" + "github.com/libp2p/go-libp2p-core/network" "github.com/libp2p/go-libp2p-core/peer" pubsub "github.com/libp2p/go-libp2p-pubsub" @@ -53,7 +55,8 @@ type PubsubScore struct { } type MessageSendSpec struct { - MaxFee abi.TokenAmount + MaxFee abi.TokenAmount + MsgUuid uuid.UUID } // GraphSyncDataTransfer provides diagnostics on a data transfer happening over graphsync @@ -252,10 +255,10 @@ type RestrievalRes struct { } // Selector specifies ipld selector string -// - if the string starts with '{', it's interpreted as json selector string -// see https://ipld.io/specs/selectors/ and https://ipld.io/specs/selectors/fixtures/selector-fixtures-1/ -// - otherwise the string is interpreted as ipld-selector-text-lite (simple ipld path) -// see https://github.com/ipld/go-ipld-selector-text-lite +// - if the string starts with '{', it's interpreted as json selector string +// see https://ipld.io/specs/selectors/ and https://ipld.io/specs/selectors/fixtures/selector-fixtures-1/ +// - otherwise the string is interpreted as ipld-selector-text-lite (simple ipld path) +// see https://github.com/ipld/go-ipld-selector-text-lite type Selector string type DagSpec struct { diff --git a/api/v1api/latest.go b/api/v1api/latest.go index 6f57d8826..aefb1543b 100644 --- a/api/v1api/latest.go +++ b/api/v1api/latest.go @@ -7,6 +7,8 @@ import ( type FullNode = api.FullNode type FullNodeStruct = api.FullNodeStruct +type RawFullNodeAPI FullNode + func PermissionedFullAPI(a FullNode) FullNode { return api.PermissionedFullAPI(a) } diff --git a/chain/messagesigner/messagesigner.go b/chain/messagesigner/messagesigner.go index e2229bb51..214fe9fda 100644 --- a/chain/messagesigner/messagesigner.go +++ b/chain/messagesigner/messagesigner.go @@ -3,6 +3,7 @@ package messagesigner import ( "bytes" "context" + "github.com/google/uuid" "sync" "github.com/ipfs/go-datastore" @@ -19,6 +20,7 @@ import ( ) const dsKeyActorNonce = "ActorNextNonce" +const dsKeyMsgUuidSet = "MsgUuidSet" var log = logging.Logger("messagesigner") @@ -91,6 +93,26 @@ func (ms *MessageSigner) SignMessage(ctx context.Context, msg *types.Message, cb return smsg, nil } +func (ms *MessageSigner) GetSignedMessage(ctx context.Context, uuid uuid.UUID) (*types.SignedMessage, error) { + + key := datastore.KeyWithNamespaces([]string{dsKeyMsgUuidSet, uuid.String()}) + bytes, err := ms.ds.Get(ctx, key) + if err != nil { + return nil, err + } + return types.DecodeSignedMessage(bytes) +} + +func (ms *MessageSigner) StoreSignedMessage(ctx context.Context, uuid uuid.UUID, message *types.SignedMessage) error { + + key := datastore.KeyWithNamespaces([]string{dsKeyMsgUuidSet, uuid.String()}) + serializedMsg, err := message.Serialize() + if err != nil { + return err + } + return ms.ds.Put(ctx, key, serializedMsg) +} + // nextNonce gets the next nonce for the given address. // If there is no nonce in the datastore, gets the nonce from the message pool. func (ms *MessageSigner) nextNonce(ctx context.Context, addr address.Address) (uint64, error) { diff --git a/cmd/lotus-miner/run.go b/cmd/lotus-miner/run.go index 14dde73ff..f363a7b1f 100644 --- a/cmd/lotus-miner/run.go +++ b/cmd/lotus-miner/run.go @@ -2,6 +2,7 @@ package main import ( "fmt" + "github.com/filecoin-project/lotus/api/v1api" _ "net/http/pprof" "os" @@ -14,7 +15,6 @@ import ( "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/api/v0api" - "github.com/filecoin-project/lotus/api/v1api" "github.com/filecoin-project/lotus/build" lcli "github.com/filecoin-project/lotus/cli" "github.com/filecoin-project/lotus/lib/ulimit" @@ -150,7 +150,7 @@ var runCmd = &cli.Command{ node.Override(new(dtypes.APIEndpoint), func() (dtypes.APIEndpoint, error) { return multiaddr.NewMultiaddr("/ip4/127.0.0.1/tcp/" + cctx.String("miner-api")) })), - node.Override(new(v1api.FullNode), nodeApi), + node.Override(new(v1api.RawFullNodeAPI), nodeApi), ) if err != nil { return xerrors.Errorf("creating node: %w", err) diff --git a/itests/kit/ensemble.go b/itests/kit/ensemble.go index 8a8f54df3..420925f7c 100644 --- a/itests/kit/ensemble.go +++ b/itests/kit/ensemble.go @@ -6,6 +6,7 @@ import ( "crypto/rand" "encoding/binary" "fmt" + "github.com/filecoin-project/lotus/api/v1api" "io/ioutil" "net" "net/http" @@ -32,7 +33,6 @@ import ( power3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/power" "github.com/filecoin-project/lotus/api" - "github.com/filecoin-project/lotus/api/v1api" "github.com/filecoin-project/lotus/build" "github.com/filecoin-project/lotus/chain" "github.com/filecoin-project/lotus/chain/actors" @@ -628,8 +628,7 @@ func (n *Ensemble) Start() *Ensemble { node.Test(), node.If(m.options.disableLibp2p, node.MockHost(n.mn)), - - node.Override(new(v1api.FullNode), m.FullNode.FullNode), + node.Override(new(v1api.RawFullNodeAPI), m.FullNode.FullNode), node.Override(new(*lotusminer.Miner), lotusminer.NewTestMiner(mineBlock, m.ActorAddr)), // disable resource filtering so that local worker gets assigned tasks diff --git a/node/builder_miner.go b/node/builder_miner.go index 54ab22683..fb2dd0fb8 100644 --- a/node/builder_miner.go +++ b/node/builder_miner.go @@ -2,6 +2,7 @@ package node import ( "errors" + "github.com/filecoin-project/lotus/api/v1api" "time" "go.uber.org/fx" @@ -77,6 +78,7 @@ func ConfigStorageMiner(c interface{}) Option { return Options( + Override(new(v1api.FullNode), modules.GetUuidWrapper), // Needed to instantiate pubsub used by index provider via ConfigCommon Override(new(dtypes.DrandSchedule), modules.BuiltinDrandConfig), Override(new(dtypes.BootstrapPeers), modules.BuiltinBootstrap), diff --git a/node/impl/full/mpool.go b/node/impl/full/mpool.go index e7a461784..9bf0d7e77 100644 --- a/node/impl/full/mpool.go +++ b/node/impl/full/mpool.go @@ -3,12 +3,12 @@ package full import ( "context" "encoding/json" - + "github.com/filecoin-project/go-address" "github.com/ipfs/go-cid" + "go.uber.org/fx" "golang.org/x/xerrors" - "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/lotus/api" @@ -141,6 +141,16 @@ func (a *MpoolAPI) MpoolPushMessage(ctx context.Context, msg *types.Message, spe cp := *msg msg = &cp inMsg := *msg + + // Check if this uuid has already been processed + if spec != nil { + signedMessage, err := a.MessageSigner.GetSignedMessage(ctx, spec.MsgUuid) + if err == nil { + log.Warnf("Message already processed. cid=%s", signedMessage.Cid()) + return signedMessage, nil + } + } + fromA, err := a.Stmgr.ResolveToKeyAddress(ctx, msg.From, nil) if err != nil { return nil, xerrors.Errorf("getting key address: %w", err) @@ -185,12 +195,25 @@ func (a *MpoolAPI) MpoolPushMessage(ctx context.Context, msg *types.Message, spe } // Sign and push the message - return a.MessageSigner.SignMessage(ctx, msg, func(smsg *types.SignedMessage) error { + signedMsg, err := a.MessageSigner.SignMessage(ctx, msg, func(smsg *types.SignedMessage) error { if _, err := a.MpoolModuleAPI.MpoolPush(ctx, smsg); err != nil { return xerrors.Errorf("mpool push: failed to push message: %w", err) } return nil }) + if err != nil { + return nil, err + } + + // Store uuid->signed message in datastore + if spec != nil { + err = a.MessageSigner.StoreSignedMessage(ctx, spec.MsgUuid, signedMsg) + if err != nil { + return nil, err + } + } + + return signedMsg, nil } func (a *MpoolAPI) MpoolBatchPush(ctx context.Context, smsgs []*types.SignedMessage) ([]cid.Cid, error) { diff --git a/node/modules/storageminer.go b/node/modules/storageminer.go index 7a6d48784..52a08b476 100644 --- a/node/modules/storageminer.go +++ b/node/modules/storageminer.go @@ -5,6 +5,7 @@ import ( "context" "errors" "fmt" + "github.com/google/uuid" "net/http" "os" "path/filepath" @@ -79,6 +80,19 @@ var ( StagingAreaDirName = "deal-staging" ) +type UuidWrapper struct { + v1api.FullNode +} + +func (a *UuidWrapper) MpoolPushMessage(ctx context.Context, msg *types.Message, spec *api.MessageSendSpec) (*types.SignedMessage, error) { + spec.MsgUuid = uuid.New() + return a.FullNode.MpoolPushMessage(ctx, msg, spec) +} + +func GetUuidWrapper(a v1api.RawFullNodeAPI) v1api.FullNode { + return &UuidWrapper{a} +} + func minerAddrFromDS(ds dtypes.MetadataDS) (address.Address, error) { maddrb, err := ds.Get(context.TODO(), datastore.NewKey("miner-address")) if err != nil { From b7227d3a6b2b9adfde8ab6f2ae04e2cf2bffa481 Mon Sep 17 00:00:00 2001 From: Shrenuj Bansal Date: Tue, 16 Aug 2022 15:56:32 -0400 Subject: [PATCH 035/185] run make gen --- api/types.go | 1 - build/openrpc/full.json.gz | Bin 28173 -> 28226 bytes build/openrpc/gateway.json.gz | Bin 4897 -> 4941 bytes chain/messagesigner/messagesigner.go | 2 +- cmd/lotus-miner/run.go | 2 +- documentation/en/api-v0-methods.md | 9 ++++++--- documentation/en/api-v1-unstable-methods.md | 9 ++++++--- itests/kit/ensemble.go | 2 +- node/builder_miner.go | 2 +- node/impl/full/mpool.go | 4 ++-- node/modules/storageminer.go | 2 +- 11 files changed, 19 insertions(+), 14 deletions(-) diff --git a/api/types.go b/api/types.go index 74d0cce72..ae9c75c98 100644 --- a/api/types.go +++ b/api/types.go @@ -8,7 +8,6 @@ import ( "github.com/google/uuid" "github.com/ipfs/go-cid" "github.com/ipfs/go-graphsync" - "github.com/libp2p/go-libp2p-core/network" "github.com/libp2p/go-libp2p-core/peer" pubsub "github.com/libp2p/go-libp2p-pubsub" diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 0bc6e15c1b647a4d55cd7c16424671047c7eafab..aeb7555df172b85e06b52cb2eea9773c42ccd9c5 100644 GIT binary patch delta 24541 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 PkB^GjxDZ=kXt4hR$|R00 delta 24320 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 INi?{h(GQgMa_0EW1;$jHpu7` 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 diff --git a/build/openrpc/gateway.json.gz b/build/openrpc/gateway.json.gz index 3db11ade1e363ec50fe815d1e083c844332d923c..22c4f769f922a04f2f3a62e29b4d3a8cedbc8ae6 100644 GIT binary patch literal 4941 zcmV-T6SC|diwFP!00000|LlEhbJM!k@L%!h{Q`_>b8FgWW`F37(gTH@1~%s$U|tkk zNkkpVTbA1drvLpJS#}~{BRgqHTMsipY-veaURrl8{RY%Ugt->zf#yzYrwdGg$%um9 zZ@@8k5a@yTl>44>)ju(g`WL_iH;8$dlAuR(f2Z}@MmONj1XIK()b>E{>u*5dRCIlV z9b{2Vc1|V`lXJw69co=)BF}?k!BxrF!Q$B!}nMn*odj2E8q>Kt-(3+DsQ ze2c#{GJ(8s8-_&*M>D>2BL6iFw`o||-Z{bcOXJ0>SbNhzj8XQ|`2CH1<9K9vI~Rl_ zMxc{DOXIJ<41yim{u^hA`;3Surg6sD2g(P&>r%#%EgIa3zrr@FAir=MVyZ8{k-Kl? z$B!St1fD;gLN*6I@M(e=G9W_+q1>1wZa^|OEIOSc!aZX|nZYO6GbGk`fC*g4;8fzu zX9D}f`D>SYI6!XrI`(zkX6g%sSc}a>{IDiy3RR*AP))dTVI#uv2qTt)b%Je!A(tU9 zm@zaw^N?-e1+*RGf*Uwk=M>q-aBe{3Z%KHj0gV%CBg=Sk zJHgh(z{JKDCW4*-Q~l!ca5g*PdfX@_2+cz{v1w6Xg+FpM!4gWh5A;|)S5&|SXlGc?8iG<kF1pWK3zkmr& zE>6YN<6mSrbZs=gVQt*8sE2O(WbTdkX4fB#GeiW zW*fE+f8WK4tn5e;J?e}TZUCL85pDklQ)J_S6AdweY<@;8Y75RN2*E?$j%Xcr4|(RD z+=yjY67I>;-696CdRccF-NOfvF*px)PC)7knLSR?SSamNpDT%k1jntm=@ceiZ`FFM zuD?}dQm_O`NjX^+J;8%26JE`2?w0Ci*hEj=%y=f0VQI0PQY(XRont=nhXzAa%8}t< zat%!2GY9m*gmc&H?e30)COa0L?v6t1@3qUQnAff&EXm!WLx;Ol=yAk$p^JB2MrZT? zKSpF{O#k2ec5AOK)|78Uo+E-hT-kaIyJy&q!d4WR^maaBcYwH#sTe}rsFApw;X|8- znHGqOlC%Mmc&lT7Na09)$1y=*zbt;eMR+{npx0Qb+&w9Z7fhpw;v*SYk>bPd8lDpQ zF~jycWwi+Y`n`nojRVgX!mkLrT|#|XMIfivP|M|7E*Hw>1-+%vtG-z+jis@W zmV4D!Xg)KK|K0cRX5@4GTFTcEBE6jZubQWB&7q1sCW@d^h+BG19=Gf|=<3L>D`X+; z@-<~w1Vu-7#TD+br@kbMhANa~nPaRW*Oc|ua;=tYE96=x^<_x8ymneL?`(#-z$xf8 zOmG#@Z??2Jhu&vTO!=@nuU`(PX>G|7bs9%guVe>312%rRzlx3XNpt4dE$gqPoi8Y8hZxgFdpig(FZ$zz4sf%vgn{Y-t z?d$z<+b0a!zxGEn(i#8UYq#w-?X>wnq~*4-JDW||jWxMJAYdT(;BsFgtyLp!J<+q= zJy`-L_ErmzpHzlx+ytggVB&;&`N|+ob)mC}hbA@qaP%@>tfwz1+Kq!^L6H-j(-al5 zx2CYD5+s!^HyR{b%z4{%_L`@a4&T(F<@@6t%|ji|aWvwHg&10ki70^b_z4_hIr^DP ztx1mVS&_vk!`}n9i7##&wa_?jSNjbXrdu4$hv2a=_@S|AqU^I~quFRGA~tMOYlJoT zd|KSI-O%Bl$Ma3F&Irn%;G5Cd_rNrjWz`(B=9o3deA*nd(=6baZ=v^b__Gq5lwDWH zpoWw>EBT%Tmd)%WD$BCF#q_q#9IZo0TNXkR1e(HZ_;5AH5hE$H5&aM(kDO=hwTgHK zf_62IfuOyKB!2;Cb9zxYt2(j&SxCcf(NUJZ&#Ov9*)>lZ4g=Kh1Yh8#B=216mXNaP zyCi8ZCbexcP{oHHCFfJApuoz!|AX(Od4Kp&k;n@h!Eqir{T~$N*j^!MSKR<%U!9z! z;he9IUWf1sqt^mZ`LOkJrrWkHYSnPdR6|K(8L{2)@oL7E&Jn6Qzis6xhdG&#r`WUT zO$KGI;3iSOY)uimSgJuET|}<>C#Tf%#hxtUClSN~UXlm46n9Z(z75)B-kQ=LxBP}W zI%b*bRIQ!n?idlo1Qq|)YP1@!o6Xm))~Cinuhr^xTCW@3UZW8&UiIBf)x;9J)rDLj zz8_0t*m;$otRQ!mMy|pm-j1C{P6pdK^v*nvr;wvC1@au0&O^=wk|*+$XII^p@hbc= zK*S!n$TAJLo$oW(ICqmdp^eyvc}tC4=3?sGq&w6nE9;Y$^~uUVeX_DBE|g?`ntSvT z&fcJCyIp$Y&px)ruYLLFb;e)OA5fC|qoGQZRy3>J@=BS}xYfipg|iC@u-P@i6cgpw zhDxq1zgWAD85Pw$x^6<|I>Jx|BM7-z$COX3=qlZ8E@Pg6!xdzVRY- zz!g~>3(y7Lgvi-h#@SyIc+k^DC&jafc9#^a0P zSWC{}1HE-nggFy`{{slXIXW z+}(Xd0v(_l4-9*+$NIj0enZbM}N3P50jabN%s;XB=SVGgiHz8#q@x*-$()M3%LYA>i zAB(y9^ovAv_HvHiguMH2w1_oAetFQ;*j>iuG!+nRV$%ebc?HZIXbc|>XUH4mE!h^?(4DnRI7YepBT63)I}U%5*49_HZ&kXA~QXvmG6hDL(^=_8K`QGXgIA9(()}6U3?+ILq$(*9Uz4Ue>*{ z9HlVBX>A8jY&F|UiI9~L|>umh_Xi)HxNh34cVneqAgN_M$?-{YmKQrsMSl^hYwks zWLp)%y_{3tQscn{u?sSy)fB*}_nJm|1ZK7F7qu)h#-lbB3~^;WTdDWeM)(ue^z!$i z`bI~~`*=&@+SC`yuH#QWpxg9Av27W3Leff-j%+V))Q_t@eT3MBuDCs>n^qK@{nGt z{4E%Nr zHDzW1V@KcePmI24>6uzvEk|oP`haqDxgFASH1Z6buq=qtNF55*kfnhsg%_fw65cmI7OBNWetPae9GGL%Oz^r?-D;+O=I6er$-FA+8r_wq0={{0G+0i zLbSpuDyeCi$T?rSeBX$Kw0ou~R=;PQqMx5_eo$0E;{)QilwC))?W<@VaS;0FDi#-O z#sRFs49&aoUtgYnfi&<=rr>hH7%L0iR)+*!nGuJ|iR9{&2Coiljs?Zc?2lrUys@Z66 zAnCsIhpJp<2L~g5nGqXQUX{Giax>b(6|xX^gXx~lFqg8tA)X8Fn|-mxIrKgUIX;JX zQNvSY36;YHlHqNPmN&)9Oz;-r@q|}%i$;C*F3VVap>hh5@+Hcg5L7BnO>j1IF^fME-M)mnLg3j^4;RH=gk|pg z4zkCQ8|ZB2B8wyY6wa^EEo64$d34@M?Q?}(2U^IMC^}MN)6ttGG}-bUng<9YzT=cs zhE!DOs1XZXDrwjnJAF0aWLmb0}YJx@RlBaRSBfnbl!7M;)#;*cxCfv|k ziS1c)*qq9mv%)$_uMUMhpxT$*6lr}gqeXq&T9PTYi%N!lftXi~{e*q#X2Ume22hKsS(<@!Ua2jbod33+kk~qRPklT5ruXH36WrZ>zx%%c00960 LP+7dxgl>32UP%TDCiNKRVZ);E;c(n?yde!DBJR=-W+K}LY@~8tqqGotF;0Hg7F+3fY7>zS;l!+r(hX ztG+=lvDPZsh z%r6-YZ1&v9CGyN`88*QT&e+zG_-h$n+pv+db%dPf#Cj~}LG`oVMx=-lj^pC*t(15jvS!i+g&2EcQ}Cetaz%r{1a8f=1mLvVe|v`i0B zFcrKCDChog{?a2p3Yi5O$Ca802kC1D7G2zkTTe`wBXXR@mHw&kcYb0~qJL)CBkw&Nny%Q_qEh zHQStTU^MRxe*qhU?v3wEcIREt-DShBe+8%BPcr+*3+80%{Txn5a6anxMyMOicY^@- zI@dk(_Pb^B#?1a#(`OXnvHAVhGAaBgKomM=pV0tvW_c9yZaZdw1Y95TdKCJB%Q&N> zZ}g&k#$;X>e73|G4_$vzga7_3p3uFHWqu-N-yF5too>&x%r}%w<=-C&wxKBa7jOgK z!`qA>;n8-AOgLJ93y<}qL(ul3uFe}N<9Y;cls ziokI~cmwW$5)V>__@@nLlVy6+qm zFCA5nF!NSSMBR}@b5grn3;?T#b(>Q?dH^T|^Kj;bqArQq!&Hr>+CKBS(o9GpZna4# zfpjxfo2k0~R843>4UrOhvMPJR2UR+}8f|Wu=4Mnx&D_j+#*Ja&u^baS2e(cUn*>9H z!YN_Ua1p*TEi<65**7PQd47L;dmI+ovdMIN6nTFyJxX}Lwq5Q?ZVz2D+@1oTLAnh* zwCzzcoB#h9;;k|HzxUnFPM43V*oQoY82YHP_ZU^r@f*3X$T{h6eL~(PWGb#=L~Wx^ z;)ivJ;$BMw~GGDH7m@#`%_;|VkSt(C^zqmp%fW< zA5~XaDG?ttDz75`QPGWx|FXNy>d2or0qeawk`UM;a9X}rL8m9M6rkrhH@0+ROVh_^ zX1>}fSGog0A!h6DRV1mbR>5DtYiQpj@q8ux0>hgn)#p_da%K#TUT*Yqsa{^lTZX;z zo7LJ_I15?5S8asW6I=1W{r=sG*WA8pt#w39*IWLpwoY6NWs#KHZwy}m@lg8KRwMMV4&}+HUm!sv1$|>o* zlNn;1r)IxpnHQn_=4*>n;D7dcm-nk<{jxDdZ%eeOQaJ8~M&jg&mg}^zQ0Icecut_;|FX>eT>~Ktc47|^Eg6b6eRA>4|%-W2( z=ym-Gqqx_-dNu9_m_p~*tI-Vi#y@wuU8hTWUG@*|cpc=;W)pgCPp+XE0>~XKxi6X4 zX_&U2>RHa7JcW~ZtHj4oGT<85p=%SmIFVhxa+9XI(pl_>rY-xZb)8kL$FC^5t-W$Z zQLs6us47HlMP*TClT?)4=qAyk&vmoe8%)#QzG=3W?+!WI`zpwBFk+BK99j!RBtk`a z0)|Mme&P{(Qeb;lgczy$J3yP{;Oc0FCV9Jh-C*ImCCPjUA9IHv7>gp(JZrbwt+u3M zqcV*}*r4a*LeFkX1w9Yvn}E)k%Adf^xa~UtO=(ySVm64`Am-yn%wD?$G2a6J9Nv=D8(t3r{J=3| zr&ER*5IEHk0|I9gLH?Z1=Io-VS5095lhB5{Wk*>C0jsJFMb#p0I1E|86@G!|Lc9y5 zTTsfEZ%xr&bgFJTQ09l4Bo|95m%z%{{~>U**dINVH1fhnaNP$k|9fRIwiggMRVP4H zS0yHCIA^POuOoV;yVsnM{qudax)Ul93t zjC`A1=Sb!XG>PlwTZ+I#!VLQ8L3}YdIwp3&=VTe4#1u=gq=>8*x=1~*gEd(+rtFGa zaX}RuQztuBXREzEh8R*V#jiW9PU~g6{j$^f)Y|KJI{jYfWox(JY9*6beYY|>vG{ED z0OO1wB*GZBUK9r_h?%7jtMGuQW3N>Z!FCG#6Q7|eU@!`SJO$cu$hky{RDSyGs@E}I zL_aPeb}l_=TZY#yUNcuXcaz(pjrfK|LyecrdDrV?J2WRNo0FBz$;v-{va)PnC=Gs! zbMzd{-as+kG=({?xqk4T=GeQ+5)z5)6M=pQf8*VOuN7lb9BdxW@yz}G&!vZ%Pi z%D+To44wE)yYVbq$||$n7o>fZI+5pusFsi*C^nLyQf|L710rr8-LXEi+0Hc=6(-@@4Rzbhz z2piCAK<{4D2&AMpFPA{Jh!RJ+OT3?6BajyY6kYoR&!gm;4`eA-)pHFjsj1#TknxaM z>ShDs`>%E(bv)CD;%+|vbPK(mf;pI6Pz^N3Zov^I2@DY)U)mGs1a8%pp%j(%ydzFCBB-b?q^3*shD5ij z+DMME@sAqaaepu! zg^xA21=DTmIsfYReU}U{cwpNkz|nluLi<$p^lt<)xQlN&i#m>xu9Yd5y`y`L@0pMI&AO8JGNYf3hA8CaNE zYGc%-(06&cM^gh-UcE`*;G%YqR?GsuTFNohk4(?(vgedzS`Rp8FNUJ$G%j)Wh z_`iPFUEW!?QX1j3_5x30G<7=`(?GaRywIuzle`iN{9I^o^{}2t9(JOX4P2ti_q&!Hw|bW=$oIU`i$Jd}>gM#-ME>Su^({ELL{1e}%^rDZox@M32`nNp z_Anauk&7T^^3kGr-&=n69t@!?hLRI#cY>YdgJ`}ED6-)I(&%NVe6qXh(F@U$)MF7r z$HH~dOK3AfbDDn-eD>LM_@_&C!v+3Cex#ceME*V+)ncA%FE?jcpi5!-B~*e9qpzyl zh%BjkYuu7VDjnWhNTPNZbENF9LpSq7k(Q$#~Xvy(_PRPfzicW3`qcdxsx<3(BZ7U1 z{lI?%0+*e*!1MXnsd8eYfRu`!$})UoXWM0-N<=FiN>9_4gh#iVk!Wh0SCNGM&UQ`~ z0TrH?Nrq=xfQ#7t!1=j+8YWL+z^zd4E%46~ zjvj?q!|7Q7iTYU&+DZ*bgL0NTgo@iC61^mgAMQvVn|^#%khwro43u0WJU)iN zaS^V#3!g)1O`RFi*i!fWQ>|}WduGPg=+Q=x-lHB}PKT@>O}tYIv=1nSn5CU{iii`g zs4kwJVF%8HWBk#Bc=7zmB|cpKngG{@c)WZPdb~#gBcsvc*_Y5Y3LA;1QRH)fiJT@r z!$g5(r3HQAViml6Psr5}*jLF;97Ed$B8NeuKf1pBa)?U)yWo#f(ZshX*`n#)yh4Sr6gxPlf*j}&m@^j zZLc+CLh$ILRuK^%v9LlfSJ%_qFifDq+mj4&79(b zDn?I2ocjBgc`35Rl2H@{4P5AK^dz4+St=a@J+K+Nmebl>=E=-MH2H{E`x4m-;mVGD zxG3==N^?JOp)-z`flg)~v>9}c!TbW=0P3Wk$LF2oIv3D$fejtOq62AfI)0O;CQ818 z^N?XUa9vGfNM?nK8L{A{6o#!Z(^nHthh@u5);`CV<$YBWsn1k_3{t<0AR|fIVP#n{ zsY*hULA9f8i%G0nd@;*4ml_iyU#)hGJ}Ob0%xS2%8|iW-II-&A#-c$l7~3C7RpT(xBKaOBwbBAXatnC#qWn zeal^*ju9Ztc6*!K@QIq<9O5mQ{X5XS7`xaSX7Xp4~ix9m{WC&_@TbkXLX1Ar; zZE1E}>SUhv3bF@Q4CO8k-+pd9I~bfPL}#y#$X?RX3c_CY?Y@nwJOp13BE#dvD-{Hf zOUF~ixCU+jO-rWKZ+F{!y_RJjhF5_?7tGCmucNyxDiKtf?{Z^`i%JXP1(W}gOuXHK zY)xN)>sHR9oT#k0DD>QT#-uC5%cf?6e8~ir>1j>TbpPviLZWudJ Date: Tue, 16 Aug 2022 16:25:42 -0400 Subject: [PATCH 036/185] fix lint --- chain/messagesigner/messagesigner.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chain/messagesigner/messagesigner.go b/chain/messagesigner/messagesigner.go index cdfd1a3ee..fd8748d4e 100644 --- a/chain/messagesigner/messagesigner.go +++ b/chain/messagesigner/messagesigner.go @@ -20,7 +20,7 @@ import ( ) const dsKeyActorNonce = "ActorNextNonce" -const dsKeyMsgUuidSet = "MsgUuidSet" +const dsKeyMsgUUIDSet = "MsgUuidSet" var log = logging.Logger("messagesigner") From 32a2ae12cb0f9cc04bf31fc662d7f7e2b4006f59 Mon Sep 17 00:00:00 2001 From: Shrenuj Bansal Date: Tue, 16 Aug 2022 16:44:14 -0400 Subject: [PATCH 037/185] fix lint rename --- chain/messagesigner/messagesigner.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/chain/messagesigner/messagesigner.go b/chain/messagesigner/messagesigner.go index fd8748d4e..249639d2a 100644 --- a/chain/messagesigner/messagesigner.go +++ b/chain/messagesigner/messagesigner.go @@ -95,7 +95,7 @@ func (ms *MessageSigner) SignMessage(ctx context.Context, msg *types.Message, cb func (ms *MessageSigner) GetSignedMessage(ctx context.Context, uuid uuid.UUID) (*types.SignedMessage, error) { - key := datastore.KeyWithNamespaces([]string{dsKeyMsgUuidSet, uuid.String()}) + key := datastore.KeyWithNamespaces([]string{dsKeyMsgUUIDSet, uuid.String()}) bytes, err := ms.ds.Get(ctx, key) if err != nil { return nil, err @@ -105,7 +105,7 @@ func (ms *MessageSigner) GetSignedMessage(ctx context.Context, uuid uuid.UUID) ( func (ms *MessageSigner) StoreSignedMessage(ctx context.Context, uuid uuid.UUID, message *types.SignedMessage) error { - key := datastore.KeyWithNamespaces([]string{dsKeyMsgUuidSet, uuid.String()}) + key := datastore.KeyWithNamespaces([]string{dsKeyMsgUUIDSet, uuid.String()}) serializedMsg, err := message.Serialize() if err != nil { return err From 60751f809b125ade6d80b84ccff7b2e2d96cc207 Mon Sep 17 00:00:00 2001 From: Shrenuj Bansal Date: Wed, 17 Aug 2022 10:47:05 -0400 Subject: [PATCH 038/185] Change func name and nil pointer check based on comments --- node/builder_miner.go | 2 +- node/modules/storageminer.go | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/node/builder_miner.go b/node/builder_miner.go index db3e8d4ac..be318c447 100644 --- a/node/builder_miner.go +++ b/node/builder_miner.go @@ -78,7 +78,7 @@ func ConfigStorageMiner(c interface{}) Option { return Options( - Override(new(v1api.FullNode), modules.GetUuidWrapper), + Override(new(v1api.FullNode), modules.MakeUuidWrapper), // Needed to instantiate pubsub used by index provider via ConfigCommon Override(new(dtypes.DrandSchedule), modules.BuiltinDrandConfig), Override(new(dtypes.BootstrapPeers), modules.BuiltinBootstrap), diff --git a/node/modules/storageminer.go b/node/modules/storageminer.go index 9ffc19f9d..4bb373e75 100644 --- a/node/modules/storageminer.go +++ b/node/modules/storageminer.go @@ -85,11 +85,14 @@ type UuidWrapper struct { } func (a *UuidWrapper) MpoolPushMessage(ctx context.Context, msg *types.Message, spec *api.MessageSendSpec) (*types.SignedMessage, error) { + if spec == nil { + spec = new(api.MessageSendSpec) + } spec.MsgUuid = uuid.New() return a.FullNode.MpoolPushMessage(ctx, msg, spec) } -func GetUuidWrapper(a v1api.RawFullNodeAPI) v1api.FullNode { +func MakeUuidWrapper(a v1api.RawFullNodeAPI) v1api.FullNode { return &UuidWrapper{a} } From 99040a89c6d7ca5cb14ebb8d74bb14f816d9b5c5 Mon Sep 17 00:00:00 2001 From: Shrenuj Bansal Date: Wed, 17 Aug 2022 12:38:23 -0400 Subject: [PATCH 039/185] Add test for dedup mpool messages --- itests/dup_mpool_messages_test.go | 53 +++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 itests/dup_mpool_messages_test.go diff --git a/itests/dup_mpool_messages_test.go b/itests/dup_mpool_messages_test.go new file mode 100644 index 000000000..267112ecc --- /dev/null +++ b/itests/dup_mpool_messages_test.go @@ -0,0 +1,53 @@ +package itests + +import ( + "context" + "github.com/filecoin-project/go-state-types/big" + "github.com/filecoin-project/lotus/api" + "github.com/filecoin-project/lotus/chain/actors/builtin" + "github.com/filecoin-project/lotus/chain/types" + "github.com/filecoin-project/lotus/itests/kit" + uuid2 "github.com/google/uuid" + "github.com/stretchr/testify/require" + "testing" + "time" +) + +func TestDuplicateMpoolMessages(t *testing.T) { + kit.QuietMiningLogs() + + blockTime := 50 * time.Millisecond + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + client, _, ens := kit.EnsembleMinimal(t, kit.MockProofs()) + ens.InterconnectAll().BeginMining(blockTime) + + // send f099 half of account balance + msgBal := &types.Message{ + From: client.DefaultKey.Address, + To: builtin.BurntFundsActorAddr, + Value: big.NewInt(10000), + } + + uuid := uuid2.New() + msgSpec := &api.MessageSendSpec{MsgUuid: uuid} + + msg, err := client.MpoolPushMessage(ctx, msgBal, msgSpec) + require.NoError(t, err) + + client.StateWaitMsg(ctx, msg.Cid(), 3, api.LookbackNoLimit, true) + + remBal, err := client.WalletBalance(ctx, client.DefaultKey.Address) + require.NoError(t, err) + + msg2, err := client.MpoolPushMessage(ctx, msgBal, msgSpec) + require.NoError(t, err) + + currBal, err := client.WalletBalance(ctx, client.DefaultKey.Address) + require.NoError(t, err) + + require.Equal(t, msg, msg2) + require.Equal(t, remBal, currBal) +} From 087a838db52d691d4f7d5c534748db3dde371035 Mon Sep 17 00:00:00 2001 From: Shrenuj Bansal Date: Wed, 17 Aug 2022 14:02:53 -0400 Subject: [PATCH 040/185] make gen for tests --- .circleci/config.yml | 5 +++++ itests/dup_mpool_messages_test.go | 12 +++++++----- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 02b42d335..c438612ad 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -889,6 +889,11 @@ workflows: suite: itest-deals target: "./itests/deals_test.go" + - test: + name: test-itest-dup_mpool_messages + suite: itest-dup_mpool_messages + target: "./itests/dup_mpool_messages_test.go" + - test: name: test-itest-gas_estimation suite: itest-gas_estimation diff --git a/itests/dup_mpool_messages_test.go b/itests/dup_mpool_messages_test.go index 267112ecc..a595cf842 100644 --- a/itests/dup_mpool_messages_test.go +++ b/itests/dup_mpool_messages_test.go @@ -2,15 +2,18 @@ package itests import ( "context" + "testing" + "time" + + uuid2 "github.com/google/uuid" + "github.com/stretchr/testify/require" + "github.com/filecoin-project/go-state-types/big" + "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/chain/actors/builtin" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/itests/kit" - uuid2 "github.com/google/uuid" - "github.com/stretchr/testify/require" - "testing" - "time" ) func TestDuplicateMpoolMessages(t *testing.T) { @@ -24,7 +27,6 @@ func TestDuplicateMpoolMessages(t *testing.T) { client, _, ens := kit.EnsembleMinimal(t, kit.MockProofs()) ens.InterconnectAll().BeginMining(blockTime) - // send f099 half of account balance msgBal := &types.Message{ From: client.DefaultKey.Address, To: builtin.BurntFundsActorAddr, From cd5dd2727c4e5f421d99fd6de0e2d6e293e37c2c Mon Sep 17 00:00:00 2001 From: Shrenuj Bansal Date: Wed, 17 Aug 2022 14:14:07 -0400 Subject: [PATCH 041/185] fix lint --- itests/dup_mpool_messages_test.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/itests/dup_mpool_messages_test.go b/itests/dup_mpool_messages_test.go index a595cf842..0798af70f 100644 --- a/itests/dup_mpool_messages_test.go +++ b/itests/dup_mpool_messages_test.go @@ -39,7 +39,8 @@ func TestDuplicateMpoolMessages(t *testing.T) { msg, err := client.MpoolPushMessage(ctx, msgBal, msgSpec) require.NoError(t, err) - client.StateWaitMsg(ctx, msg.Cid(), 3, api.LookbackNoLimit, true) + _, err = client.StateWaitMsg(ctx, msg.Cid(), 3, api.LookbackNoLimit, true) + require.NoError(t, err) remBal, err := client.WalletBalance(ctx, client.DefaultKey.Address) require.NoError(t, err) From a59f977db113d34cf34dcac5cb2922e925e2105d Mon Sep 17 00:00:00 2001 From: Shrenuj Bansal Date: Wed, 17 Aug 2022 14:22:31 -0400 Subject: [PATCH 042/185] Add retries to mpool push message from lotus miner --- go.mod | 2 +- lib/retry/retry.go | 25 +++++++++++++++++++++++++ node/modules/storageminer.go | 3 ++- 3 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 lib/retry/retry.go diff --git a/go.mod b/go.mod index bcf24788e..2d4e3c0b4 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/filecoin-project/lotus -go 1.17 +go 1.18 retract v1.14.0 // Accidentally force-pushed tag, use v1.14.1+ instead. diff --git a/lib/retry/retry.go b/lib/retry/retry.go new file mode 100644 index 000000000..c7d269a22 --- /dev/null +++ b/lib/retry/retry.go @@ -0,0 +1,25 @@ +package retry + +import ( + "time" + + logging "github.com/ipfs/go-log/v2" +) + +var log = logging.Logger("retry") + +func Retry[T any](attempts int, sleep int, f func() (T, error)) (result T, err error) { + for i := 0; i < attempts; i++ { + if i > 0 { + log.Info("Retrying after error:", err) + time.Sleep(time.Duration(sleep) * time.Second) + sleep *= 2 + } + result, err = f() + if err == nil { + return result, nil + } + } + log.Errorf("Failed after %d attempts, last error: %s", attempts, err) + return result, err +} diff --git a/node/modules/storageminer.go b/node/modules/storageminer.go index 4bb373e75..0875d3935 100644 --- a/node/modules/storageminer.go +++ b/node/modules/storageminer.go @@ -56,6 +56,7 @@ import ( "github.com/filecoin-project/lotus/chain/gen/slashfilter" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/journal" + "github.com/filecoin-project/lotus/lib/retry" "github.com/filecoin-project/lotus/markets" "github.com/filecoin-project/lotus/markets/dagstore" "github.com/filecoin-project/lotus/markets/idxprov" @@ -89,7 +90,7 @@ func (a *UuidWrapper) MpoolPushMessage(ctx context.Context, msg *types.Message, spec = new(api.MessageSendSpec) } spec.MsgUuid = uuid.New() - return a.FullNode.MpoolPushMessage(ctx, msg, spec) + return retry.Retry(5, 1, func() (*types.SignedMessage, error) { return a.FullNode.MpoolPushMessage(ctx, msg, spec) }) } func MakeUuidWrapper(a v1api.RawFullNodeAPI) v1api.FullNode { From f5ba7b958ed17d8fd94ee0cb6f0316a912747a31 Mon Sep 17 00:00:00 2001 From: Shrenuj Bansal Date: Wed, 17 Aug 2022 14:48:44 -0400 Subject: [PATCH 043/185] Add stateWaitMsg before checking last balance --- itests/dup_mpool_messages_test.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/itests/dup_mpool_messages_test.go b/itests/dup_mpool_messages_test.go index 0798af70f..afafec3ee 100644 --- a/itests/dup_mpool_messages_test.go +++ b/itests/dup_mpool_messages_test.go @@ -48,9 +48,13 @@ func TestDuplicateMpoolMessages(t *testing.T) { msg2, err := client.MpoolPushMessage(ctx, msgBal, msgSpec) require.NoError(t, err) + require.Equal(t, msg, msg2) + + _, err = client.StateWaitMsg(ctx, msg2.Cid(), 3, api.LookbackNoLimit, true) + require.NoError(t, err) + currBal, err := client.WalletBalance(ctx, client.DefaultKey.Address) require.NoError(t, err) - require.Equal(t, msg, msg2) require.Equal(t, remBal, currBal) } From 942c3a879c358020ee56eef765dadc73b116d2ca Mon Sep 17 00:00:00 2001 From: Shrenuj Bansal Date: Wed, 17 Aug 2022 15:21:03 -0400 Subject: [PATCH 044/185] Change go version for circleci --- .circleci/config.yml | 4 ++-- .circleci/template.yml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index c438612ad..cb250cad9 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -5,7 +5,7 @@ orbs: executors: golang: docker: - - image: cimg/go:1.17.9 + - image: cimg/go:1.18.1 resource_class: 2xlarge ubuntu: docker: @@ -52,7 +52,7 @@ commands: - run: name: Install Go command: | - curl https://dl.google.com/go/go1.17.9.darwin-amd64.pkg -o /tmp/go.pkg && \ + curl https://dl.google.com/go/go1.18.1.darwin-amd64.pkg -o /tmp/go.pkg && \ sudo installer -pkg /tmp/go.pkg -target / - run: name: Export Go diff --git a/.circleci/template.yml b/.circleci/template.yml index c4b28dbf2..9843463df 100644 --- a/.circleci/template.yml +++ b/.circleci/template.yml @@ -5,7 +5,7 @@ orbs: executors: golang: docker: - - image: cimg/go:1.17.9 + - image: cimg/go:1.18.1 resource_class: 2xlarge ubuntu: docker: @@ -52,7 +52,7 @@ commands: - run: name: Install Go command: | - curl https://dl.google.com/go/go1.17.9.darwin-amd64.pkg -o /tmp/go.pkg && \ + curl https://dl.google.com/go/go1.18.1.darwin-amd64.pkg -o /tmp/go.pkg && \ sudo installer -pkg /tmp/go.pkg -target / - run: name: Export Go From 66891b6c53dafc90a271e67161a8a3b2e1a43209 Mon Sep 17 00:00:00 2001 From: Shrenuj Bansal Date: Wed, 17 Aug 2022 15:28:38 -0400 Subject: [PATCH 045/185] mod tidy --- go.sum | 295 --------------------------------------------------------- 1 file changed, 295 deletions(-) diff --git a/go.sum b/go.sum index 8f08f96c2..7b5dd31ac 100644 --- a/go.sum +++ b/go.sum @@ -1,4 +1,3 @@ -bazil.org/fuse v0.0.0-20200117225306-7b5117fecadc/go.mod h1:FbcW6z/2VytnFDhZfumh8Ss8zxHE6qpMP5sHTRe0EaM= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.31.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= @@ -50,7 +49,6 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/BurntSushi/toml v1.1.0 h1:ksErzDEI1khOiGPgpwuI7x2ebx/uXQNw7xJpn9Eq1+I= github.com/BurntSushi/toml v1.1.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/DataDog/zstd v1.4.1 h1:3oxKN3wbHibqx897utPC2LTQU4J+IHWWJO+glkAkpFM= github.com/DataDog/zstd v1.4.1/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= github.com/GeertJohan/go.incremental v1.0.0 h1:7AH+pY1XUgQE4Y1HcXYaMqAI0m9yrFqo/jt0CW30vsg= @@ -59,8 +57,6 @@ github.com/GeertJohan/go.rice v1.0.2 h1:PtRw+Tg3oa3HYwiDBZyvOJ8LdIyf6lAovJJtr7YO github.com/GeertJohan/go.rice v1.0.2/go.mod h1:af5vUNlDNkCjOZeSGFgIJxDje9qdjsO6hshx0gTmZt4= github.com/Gurpartap/async v0.0.0-20180927173644-4f7f499dd9ee h1:8doiS7ib3zi6/K172oDhSKU0dJ/miJramo9NITOMyZQ= github.com/Gurpartap/async v0.0.0-20180927173644-4f7f499dd9ee/go.mod h1:W0GbEAA4uFNYOGG2cJpmFJ04E6SD1NLELPYZB57/7AY= -github.com/HdrHistogram/hdrhistogram-go v1.1.0/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= -github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETFUpAzWW2ep1Y= github.com/Kubuxu/imtui v0.0.0-20210401140320-41663d68d0fa h1:1PPxEyGdIGVkX/kqMvLJ95a1dGS1Sz7tpNEgehEYYt0= @@ -85,10 +81,8 @@ github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d h1:licZJFw2RwpH github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d/go.mod h1:asat636LX7Bqt5lYEZ27JNDcqxfjdBQuJ/MM4CN/Lzo= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= -github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= github.com/akavel/rsrc v0.8.0 h1:zjWn7ukO9Kc5Q62DOJCcxGpXC18RawVtYAGdz2aLlfw= github.com/akavel/rsrc v0.8.0/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c= -github.com/akrylysov/pogreb v0.10.1/go.mod h1:pNs6QmpQ1UlTJKDezuRWmaqkgUE2TuU0YTWyqJZ7+lI= github.com/alecthomas/jsonschema v0.0.0-20200530073317-71f438968921 h1:T3+cD5fYvuH36h7EZq+TDpm+d8a6FSD4pQsbmuGGQ8o= github.com/alecthomas/jsonschema v0.0.0-20200530073317-71f438968921/go.mod h1:/n6+1/DWPltRLWL/VKyUxg6tzsl5kHUCcraimt4vr60= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= @@ -98,7 +92,6 @@ github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/alecthomas/units v0.0.0-20210927113745-59d0afb8317a h1:E/8AP5dFtMhl5KPJz66Kt9G0n+7Sn41Fy1wv9/jHOrc= github.com/alecthomas/units v0.0.0-20210927113745-59d0afb8317a/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= -github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5/go.mod h1:Y2QMoi1vgtOIfc+6DhrMOGkLoGzqSV2rKp4Sm+opsyA= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= @@ -106,19 +99,13 @@ github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-metrics v0.3.9/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.32.11/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= -github.com/aws/aws-sdk-go v1.40.45/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= -github.com/aws/aws-sdk-go-v2 v1.9.1/go.mod h1:cK/D0BBs0b/oWPIcX/Z/obahJK1TT7IPVjy53i/mX/4= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.8.1/go.mod h1:CM+19rL1+4dFWnOQKwDc7H1KwXTz+h61oUSHyhV0b3o= -github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= github.com/benbjohnson/clock v1.0.2/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= @@ -133,7 +120,6 @@ github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6r github.com/bep/debounce v1.2.0 h1:wXds8Kq8qRfwAOpAxHrJDbCXgC5aHSzgQb/0gKsHQqo= github.com/bep/debounce v1.2.0/go.mod h1:H8yggRPQKLUhUoqrJC1bO2xNya7vanpDl7xR3ISbCJ0= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= github.com/briandowns/spinner v1.11.1/go.mod h1:QOuQk7x+EaDASo80FEXwlwiA+j/PPIcX3FScO+3/ZPQ= github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= @@ -147,7 +133,6 @@ github.com/btcsuite/btcd v0.22.1 h1:CnwP9LM/M9xuRrGSCGeMVs9iv09uMqwsVX7EeIpgV2c= github.com/btcsuite/btcd v0.22.1/go.mod h1:wqgTSL29+50LRkmOVknEdmt8ZojIzhuWvgu/iptuN7Y= github.com/btcsuite/btcd/btcec/v2 v2.1.3 h1:xM/n3yIhHAhHy04z4i43C8p4ehixJZMsnrVJkgl+MTE= github.com/btcsuite/btcd/btcec/v2 v2.1.3/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= @@ -166,11 +151,8 @@ github.com/buger/goterm v1.0.3 h1:7V/HeAQHrzPk/U4BvyH2g9u+xbUW9nr4yRPyG59W4fM= github.com/buger/goterm v1.0.3/go.mod h1:HiFWV3xnkolgrBV3mY8m0X0Pumt4zg4QhbdOzQtB8tE= github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= -github.com/casbin/casbin/v2 v2.37.0/go.mod h1:vByNa/Fchek0KZUgG5wEsl7iFsiviAYKRtgrQfcJqHg= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= -github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/ceramicnetwork/go-dag-jose v0.1.0/go.mod h1:qYA1nYt0X8u4XoMAVoOV3upUVKtrxy/I670Dg5F0wjI= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= @@ -178,7 +160,6 @@ github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cb github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cheekybits/genny v1.0.0 h1:uGGa4nei+j20rOSeDeP5Of12XVm7TGUd4dJA9RDitfE= github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ= -github.com/cheggaaa/pb v1.0.29/go.mod h1:W40334L7FMC5JKWldsTWbdGjLo0RxUKK73K+TuPxX30= github.com/chzyer/logex v1.1.10 h1:Swpa1K6QvQznwJRcfTfQJmTE72DqScAa40E+fbHEXEE= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e h1:fY5BOSpyZCqRo5OhCuC+XN+r/bBCmeuuJtjz+bCNIf8= @@ -188,9 +169,6 @@ github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMn github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= github.com/cilium/ebpf v0.4.0 h1:QlHdikaxALkqWasW8hAC1mfR0jdmvbfaBdBPFmRSglA= github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= -github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= -github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= -github.com/clbanning/mxj v1.8.4/go.mod h1:BVjHeAH+rl9rs6f+QIpeRl0tfu10SXn1pUSa5PVGJng= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= @@ -215,15 +193,12 @@ github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3Ee github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf h1:iW4rZ826su+pqaw19uhpSCzhj44qo35pNgKFGqzDKkU= github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/corpix/uarand v0.1.1/go.mod h1:SFKZvkcRoLqVRFZ4u25xPmp6m9ktANfbpXZ7SJ0/FNU= -github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= @@ -294,14 +269,12 @@ github.com/elastic/go-windows v1.0.0/go.mod h1:TsU0Nrp7/y3+VwE82FoZF8gC/XFg/Elz6 github.com/elastic/gosigar v0.12.0/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= github.com/elastic/gosigar v0.14.2 h1:Dg80n8cr90OZ7x+bAax/QjoW/XqTI11RmA79ZwIm9/4= github.com/elastic/gosigar v0.14.2/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= -github.com/elgris/jsondiff v0.0.0-20160530203242-765b5c24c302/go.mod h1:qBlWZqWeVx9BjvqBsnC/8RUlAYpIFmPvgROcw0n1scE= github.com/ema/qdisc v0.0.0-20190904071900-b82c76788043/go.mod h1:ix4kG2zvdUd8kEKSW0ZTr1XLks0epFpI4j745DXxlNE= github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= @@ -313,11 +286,8 @@ github.com/facebookgo/atomicfile v0.0.0-20151019160806-2de1f203e7d5 h1:BBso6MBKW github.com/facebookgo/atomicfile v0.0.0-20151019160806-2de1f203e7d5/go.mod h1:JpoxHjuQauoxiFMl1ie8Xc/7TfLuMZ5eOCONd1sUBHg= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.8.0/go.mod h1:3l45GVGkyrnYNl9HoIjnp2NnNWvh6hLAqD8yTfGjnw8= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/filecoin-project/dagstore v0.5.2 h1:Nd6oXdnolbbVhpMpkYT5PJHOjQp4OBSntHpMV5pxj3c= github.com/filecoin-project/dagstore v0.5.2/go.mod h1:mdqKzYrRBHf1pRMthYfMv3n37oOw0Tkx7+TxPt240M0= github.com/filecoin-project/go-address v0.0.3/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= @@ -344,11 +314,8 @@ github.com/filecoin-project/go-commp-utils v0.1.3/go.mod h1:3ENlD1pZySaUout0p9AN github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= github.com/filecoin-project/go-crypto v0.0.1 h1:AcvpSGGCgjaY8y1az6AMfKQWreF/pWO2JJGLl6gCq6o= github.com/filecoin-project/go-crypto v0.0.1/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= -github.com/filecoin-project/go-dagaggregator-unixfs v0.2.0/go.mod h1:WTuJWgBQY0omnQqa8kRPT9O0Uj5wQOgslVMUuTeHdJ8= -github.com/filecoin-project/go-data-transfer v1.15.1/go.mod h1:dXsUoDjR9tKN7aV6R0BBDNNBPzbNvrrNuWt9MUn3yYc= github.com/filecoin-project/go-data-transfer v1.15.2 h1:PzqsFr2Q/onMGKrGh7TtRT0dKsJcVJrioJJnjnKmxlk= github.com/filecoin-project/go-data-transfer v1.15.2/go.mod h1:qXOJ3IF5dEJQHykXXTwcaRxu17bXAxr+LglXzkL6bZQ= -github.com/filecoin-project/go-ds-versioning v0.0.0-20211206185234-508abd7c2aff/go.mod h1:C9/l9PnB1+mwPa26BBVpCjG/XQCB0yj/q5CK2J8X1I4= github.com/filecoin-project/go-ds-versioning v0.1.1 h1:JiyBqaQlwC+UM0WhcBtVEeT3XrX59mQhT8U3p7nu86o= github.com/filecoin-project/go-ds-versioning v0.1.1/go.mod h1:C9/l9PnB1+mwPa26BBVpCjG/XQCB0yj/q5CK2J8X1I4= github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= @@ -365,7 +332,6 @@ github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0/go.mod h1:7aWZdaQ1b16BVoQUYR+ github.com/filecoin-project/go-hamt-ipld/v3 v3.0.1/go.mod h1:gXpNmr3oQx8l3o7qkGyDjJjYSRX7hp/FGOStdqrWyDI= github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0 h1:rVVNq0x6RGQIzCo1iiJlGFm9AGIZzeifggxtKMU7zmI= github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0/go.mod h1:bxmzgT8tmeVQA1/gvBwFmYdT8SOFUwB3ovSUfG1Ux0g= -github.com/filecoin-project/go-indexer-core v0.2.16/go.mod h1:5kCKyhtT9k1vephr9l9SFGX8B/HowXIvOhGCkmbxwbY= github.com/filecoin-project/go-jsonrpc v0.1.5 h1:ckxqZ09ivBAVf5CSmxxrqqNHC7PJm3GYGtYKiNQ+vGk= github.com/filecoin-project/go-jsonrpc v0.1.5/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= github.com/filecoin-project/go-legs v0.4.4 h1:mpMmAOOnamaz0CV9rgeKhEWA8j9kMC+f+UGCGrxKaZo= @@ -379,15 +345,11 @@ github.com/filecoin-project/go-state-types v0.0.0-20200903145444-247639ffa6ad/go github.com/filecoin-project/go-state-types v0.0.0-20200928172055-2df22083d8ab/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.0.0-20201102161440-c8033295a1fc/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.0/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= -github.com/filecoin-project/go-state-types v0.1.1-0.20210810190654-139e0e79e69e/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= -github.com/filecoin-project/go-state-types v0.1.3/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= -github.com/filecoin-project/go-state-types v0.1.5/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q= github.com/filecoin-project/go-state-types v0.1.6/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q= github.com/filecoin-project/go-state-types v0.1.8/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q= github.com/filecoin-project/go-state-types v0.1.10 h1:YrrJWWh2fU4VPhwHyPlDK5I4mB7bqgnRd3HCm9IOwIU= github.com/filecoin-project/go-state-types v0.1.10/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q= github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig= -github.com/filecoin-project/go-statemachine v1.0.2-0.20220322104818-27f8fbb86dfd/go.mod h1:jZdXXiHa61n4NmgWFG4w8tnqgvZVHYbJ3yW7+y8bF54= github.com/filecoin-project/go-statemachine v1.0.2 h1:421SSWBk8GIoCoWYYTE/d+qCWccgmRH0uXotXRDjUbc= github.com/filecoin-project/go-statemachine v1.0.2/go.mod h1:jZdXXiHa61n4NmgWFG4w8tnqgvZVHYbJ3yW7+y8bF54= github.com/filecoin-project/go-statestore v0.1.0/go.mod h1:LFc9hD+fRxPqiHiaqUEZOinUJB4WARkRfNl10O7kTnI= @@ -403,24 +365,16 @@ github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK github.com/filecoin-project/specs-actors v0.9.15-0.20220514164640-94e0d5e123bd/go.mod h1:pjGEe3QlWtK20ju/aFRsiArbMX6Cn8rqEhhsiCM9xYE= github.com/filecoin-project/specs-actors v0.9.15 h1:3VpKP5/KaDUHQKAMOg4s35g/syDaEBueKLws0vbsjMc= github.com/filecoin-project/specs-actors v0.9.15/go.mod h1:pjGEe3QlWtK20ju/aFRsiArbMX6Cn8rqEhhsiCM9xYE= -github.com/filecoin-project/specs-actors/v2 v2.3.5-0.20210114162132-5b58b773f4fb/go.mod h1:LljnY2Mn2homxZsmokJZCpRuhOPxfXhvcek5gWkmqAc= github.com/filecoin-project/specs-actors/v2 v2.3.6 h1:UxnWTfQd7JsOae39/aHCK0m1IBjdcyymCJfqxuSkn+g= github.com/filecoin-project/specs-actors/v2 v2.3.6/go.mod h1:DJMpxVRXvev9t8P0XWA26RmTzN+MHiL9IlItVLT0zUc= -github.com/filecoin-project/specs-actors/v3 v3.1.0/go.mod h1:mpynccOLlIRy0QnR008BwYBwT9fen+sPR13MA1VmMww= github.com/filecoin-project/specs-actors/v3 v3.1.2 h1:Gq3gAbvdGLA/D0GKz1IJfewt9Fh7gA32TPt46Xv+1Cw= github.com/filecoin-project/specs-actors/v3 v3.1.2/go.mod h1:uOJn+m6W8OW/1mdWMEvxeM1cjQPxmps7s1Z4bJ9V4kY= -github.com/filecoin-project/specs-actors/v4 v4.0.0/go.mod h1:TkHXf/l7Wyw4ZejyXIPS2rK8bBO0rdwhTZyQQgaglng= github.com/filecoin-project/specs-actors/v4 v4.0.2 h1:VTsv30kIf1Keo8Jlu6Omco+2Ud0pG4EN5UAzyYCibh8= github.com/filecoin-project/specs-actors/v4 v4.0.2/go.mod h1:zT0GVFxwFS93prGK0b/rMd1sePjRQKfAuodQ9DFAd6Y= -github.com/filecoin-project/specs-actors/v5 v5.0.4/go.mod h1:5BAKRAMsOOlD8+qCw4UvT/lTLInCJ3JwOWZbX8Ipwq4= -github.com/filecoin-project/specs-actors/v5 v5.0.5/go.mod h1:dnfda2U+0ZidVnZJ44fnLMa3Mbyzwx51iW/brSsS+nc= github.com/filecoin-project/specs-actors/v5 v5.0.6 h1:TLtA9hT3pHQF5vB83GmB+m6anw9u6MjdT+VVn/lyC+c= github.com/filecoin-project/specs-actors/v5 v5.0.6/go.mod h1:myb/UGwESp0V1f1BACXSUrFgTWLvGUoG0ZZH7eqriFM= -github.com/filecoin-project/specs-actors/v6 v6.0.0/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= -github.com/filecoin-project/specs-actors/v6 v6.0.1/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= github.com/filecoin-project/specs-actors/v6 v6.0.2 h1:K1xPRJoW5PBvb08QF9+4w1AjcnqwR6BjTmeltQFCvWo= github.com/filecoin-project/specs-actors/v6 v6.0.2/go.mod h1:wnfVvPnYmzPZilNvSqCSSA/ZQX3rdV/U/Vf9EIoQhrI= -github.com/filecoin-project/specs-actors/v7 v7.0.0/go.mod h1:TA5FwCna+Yi36POaT7SLKXsgEDvJwc0V/L6ZsO19B9M= github.com/filecoin-project/specs-actors/v7 v7.0.1 h1:w72xCxijK7xs1qzmJiw+WYJaVt2EPHN8oiwpA1Ay3/4= github.com/filecoin-project/specs-actors/v7 v7.0.1/go.mod h1:tPLEYXoXhcpyLh69Ccq91SOuLXsPWjHiY27CzawjUEk= github.com/filecoin-project/specs-actors/v8 v8.0.1 h1:4u0tIRJeT5G7F05lwLRIsDnsrN+bJ5Ixj6h49Q7uE2Y= @@ -430,27 +384,20 @@ github.com/filecoin-project/storetheindex v0.4.17/go.mod h1:y2dL8C5D3PXi183hdxgG github.com/filecoin-project/test-vectors/schema v0.0.5 h1:w3zHQhzM4pYxJDl21avXjOKBLF8egrvwUwjpT8TquDg= github.com/filecoin-project/test-vectors/schema v0.0.5/go.mod h1:iQ9QXLpYWL3m7warwvK1JC/pTri8mnfEmKygNDqqY6E= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= -github.com/flynn/noise v0.0.0-20180327030543-2492fe189ae6/go.mod h1:1i71OnUq3iUe1ma7Lr6yG6/rjvM3emb6yoL7xLFzcVQ= github.com/flynn/noise v1.0.0 h1:DlTHqmzmvcEiKj+4RYo/imoswx/4r6iBlCMfVtrMXpQ= github.com/flynn/noise v1.0.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag= -github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/francoispqt/gojay v1.2.13 h1:d2m3sFjloqoIUQU3TsHBgj6qg/BVGlTBeHDUmyJnXKk= github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiDsoyrBGkyDY= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= -github.com/franela/goblin v0.0.0-20210519012713-85d372ac71e2/go.mod h1:VzmDKDJVZI3aJmnRI9VjAn9nJ8qPPsN1fqzr9dqInIo= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= github.com/frankban/quicktest v1.14.0/go.mod h1:NeW+ay9A/U67EYXNFA1nPE8e/tnQv/09mUdL/ijj8og= github.com/frankban/quicktest v1.14.2/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= -github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= -github.com/gabriel-vasile/mimetype v1.4.0/go.mod h1:fA8fi6KUiG7MgQQ+mEWotXoEOvmxRtOJlERCzSmRvr8= -github.com/gammazero/keymutex v0.0.2/go.mod h1:qtzWCCLMisQUmVa4dvqHVgwfh4BP2YB7JxNDGXnsKrs= -github.com/gammazero/radixtree v0.2.5/go.mod h1:VPqqCDZ3YZZxAzUUsIF/ytFBigVWV7JIV1Stld8hri0= github.com/gbrlsnchs/jwt/v3 v3.0.1 h1:lbUmgAKpxnClrKloyIwpxm4OuWeDl5wLk52G91ODPw4= github.com/gbrlsnchs/jwt/v3 v3.0.1/go.mod h1:AncDcjXz18xetI3A6STfXq2w+LuTx8pQ8bGEwRN8zVM= github.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdko= @@ -459,7 +406,6 @@ github.com/gdamore/tcell/v2 v2.2.0 h1:vSyEgKwraXPSOkvCk7IwOSyX+Pv3V2cV9CikJMXg4U github.com/gdamore/tcell/v2 v2.2.0/go.mod h1:cTTuF84Dlj/RqmaCIV5p4w8uG1zWdk0SF6oBpwHp4fU= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= -github.com/go-bindata/go-bindata/v3 v3.1.3/go.mod h1:1/zrpXsLD8YDIbhZRqXzm1Ghc7NhEvIN9+Z6R5/xH4I= github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= @@ -506,8 +452,6 @@ github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LB github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/go-zookeeper/zk v1.0.2/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= -github.com/godbus/dbus v0.0.0-20190402143921-271e53dc4968 h1:s+PDl6lozQ+dEUtUtQnO7+A2iPG3sK1pI4liU+jxn90= github.com/godbus/dbus v0.0.0-20190402143921-271e53dc4968/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= @@ -527,8 +471,6 @@ github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69 github.com/gogo/status v1.0.3/go.mod h1:SavQ51ycCLnc7dGyJxp8YAmudx8xqiVrRf+6IXRsugc= github.com/gogo/status v1.1.0 h1:+eIkrewn5q6b30y+g/BJINVVdi2xH7je5MPJ3ZPK3JA= github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= -github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ= github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= @@ -620,7 +562,6 @@ github.com/gopherjs/gopherjs v0.0.0-20190812055157-5d271430af9f h1:KMlcu9X58lhTA github.com/gopherjs/gopherjs v0.0.0-20190812055157-5d271430af9f/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/handlers v1.4.2/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= -github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.4 h1:VuZ8uybHlWmqV03+zRzdwKL4tUnIp1MAQtp1mIFE1bc= @@ -643,7 +584,6 @@ github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw= -github.com/gxed/go-shellwords v1.0.3/go.mod h1:N7paucT91ByIjmVJHhvoarjoQnmsi3Jd3vH7VqgtMxQ= github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= github.com/hako/durafmt v0.0.0-20200710122514-c0fb7b4da026 h1:BpJ2o0OR5FV7vrkDYfXYVJQeMNWa8RhklZOpW2ITAIQ= @@ -653,28 +593,17 @@ github.com/hannahhoward/cbor-gen-for v0.0.0-20200817222906-ea96cece81f1/go.mod h github.com/hannahhoward/go-pubsub v0.0.0-20200423002714-8d62886cc36e h1:3YKHER4nmd7b5qy5t0GWDTwSn4OyRgfAXSmo6VnryBY= github.com/hannahhoward/go-pubsub v0.0.0-20200423002714-8d62886cc36e/go.mod h1:I8h3MITA53gN9OnWGCgaMa0JWVRdXthWw4M3CPM54OY= github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= -github.com/hashicorp/consul/api v1.10.1/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= -github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-hclog v0.16.2/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= -github.com/hashicorp/go-retryablehttp v0.7.1/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= @@ -683,21 +612,16 @@ github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09 github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= github.com/hodgesds/perf-utils v0.0.8/go.mod h1:F6TfvsbtrF88i++hou29dTXlI2sfsJv+gRZDtmTJkAs= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= -github.com/hudl/fargo v1.4.0/go.mod h1:9Ai6uvFy5fQNq6VPKtg+Ceq1+eTY4nKUlR2JElEOcDo= github.com/huin/goupnp v1.0.0/go.mod h1:n9v9KO1tAxYH82qOn+UTIFQDmx5n1Zxd/ClZDMX7Bnc= github.com/huin/goupnp v1.0.2/go.mod h1:0dxJBVBHqTMjIUMkESDTNgOOx/Mw5wYIfyFmdzSamkM= github.com/huin/goupnp v1.0.3 h1:N8No57ls+MnjlB+JPiCVSOyy/ot7MJTqlo7rn+NYSqQ= @@ -724,8 +648,6 @@ github.com/ipfs/go-bitfield v1.0.0/go.mod h1:N/UiujQy+K+ceU1EF5EkVd1TNqevLrCQMIc github.com/ipfs/go-bitswap v0.0.9/go.mod h1:kAPf5qgn2W2DrgAcscZ3HrM9qh4pH+X8Fkk3UPrwvis= github.com/ipfs/go-bitswap v0.1.0/go.mod h1:FFJEf18E9izuCqUtHxbWEvq+reg7o4CW5wSAE1wsxj0= github.com/ipfs/go-bitswap v0.1.2/go.mod h1:qxSWS4NXGs7jQ6zQvoPY3+NmOfHHG47mhkiLzBpJQIs= -github.com/ipfs/go-bitswap v0.1.8/go.mod h1:TOWoxllhccevbWFUR2N7B1MTSVVge1s6XSMiCSA4MzM= -github.com/ipfs/go-bitswap v0.3.4/go.mod h1:4T7fvNv/LmOys+21tnLzGKncMeeXUYUd1nUiJ2teMvI= github.com/ipfs/go-bitswap v0.5.1/go.mod h1:P+ckC87ri1xFLvk74NlXdP0Kj9RmWAh4+H78sC6Qopo= github.com/ipfs/go-bitswap v0.6.0 h1:f2rc6GZtoSFhEIzQmddgGiel9xntj02Dg0ZNf2hSC+w= github.com/ipfs/go-bitswap v0.6.0/go.mod h1:Hj3ZXdOC5wBJvENtdqsixmzzRukqd8EHLxZLZc3mzRA= @@ -735,8 +657,6 @@ github.com/ipfs/go-block-format v0.0.3 h1:r8t66QstRp/pd/or4dpnbVfXT5Gt7lOqRvC+/d github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk= github.com/ipfs/go-blockservice v0.0.7/go.mod h1:EOfb9k/Y878ZTRY/CH0x5+ATtaipfbRhbvNSdgc/7So= github.com/ipfs/go-blockservice v0.1.0/go.mod h1:hzmMScl1kXHg3M2BjTymbVPjv627N7sYcvYaKbop39M= -github.com/ipfs/go-blockservice v0.1.4/go.mod h1:OTZhFpkgY48kNzbgyvcexW9cHrpjBYIjSR0KoDOFOLU= -github.com/ipfs/go-blockservice v0.1.7/go.mod h1:GmS+BAt4hrwBKkzE11AFDQUrnvqjwFatGS2MY7wOjEM= github.com/ipfs/go-blockservice v0.2.1/go.mod h1:k6SiwmgyYgs4M/qt+ww6amPeUH9EISLRBnvUurKJhi8= github.com/ipfs/go-blockservice v0.3.0 h1:cDgcZ+0P0Ih3sl8+qjFr2sVaMdysg/YZpLj5WJ8kiiw= github.com/ipfs/go-blockservice v0.3.0/go.mod h1:P5ppi8IHDC7O+pA0AlGTF09jruB2h+oP3wVVaZl8sfk= @@ -752,7 +672,6 @@ github.com/ipfs/go-cid v0.0.7/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqg github.com/ipfs/go-cid v0.1.0/go.mod h1:rH5/Xv83Rfy8Rw6xG+id3DYAMUVmem1MowoKwdXmN2o= github.com/ipfs/go-cid v0.2.0 h1:01JTiihFq9en9Vz0lc0VDWvZe/uBonGpzo4THP0vcQ0= github.com/ipfs/go-cid v0.2.0/go.mod h1:P+HXFDF4CVhaVayiEb4wkAy7zBHxBwsJyt0Y5U6MLro= -github.com/ipfs/go-cidutil v0.0.2/go.mod h1:ewllrvrxG6AMYStla3GD7Cqn+XYSLqjK0vc+086tB6s= github.com/ipfs/go-cidutil v0.1.0 h1:RW5hO7Vcf16dplUU60Hs0AKDkQAVPVplr7lk97CFL+Q= github.com/ipfs/go-cidutil v0.1.0/go.mod h1:e7OEVBMIv9JaOxt9zaGEmAoSlXW9jdFZ5lP/0PwcfpA= github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= @@ -762,13 +681,11 @@ github.com/ipfs/go-datastore v0.1.1/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRV github.com/ipfs/go-datastore v0.3.1/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRVNdgPHtbHw= github.com/ipfs/go-datastore v0.4.0/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= github.com/ipfs/go-datastore v0.4.1/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= -github.com/ipfs/go-datastore v0.4.2/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= github.com/ipfs/go-datastore v0.4.4/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= github.com/ipfs/go-datastore v0.4.5/go.mod h1:eXTcaaiN6uOlVCLS9GjJUJtlvJfM3xk23w3fyfrmmJs= github.com/ipfs/go-datastore v0.5.0/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= github.com/ipfs/go-datastore v0.5.1 h1:WkRhLuISI+XPD0uk3OskB0fYFSyqK8Ob5ZYew9Qa1nQ= github.com/ipfs/go-datastore v0.5.1/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= -github.com/ipfs/go-delegated-routing v0.2.2/go.mod h1:T8wrRhlXBHLPUR3bZQgArHPfdi7nBfOsZ1m5fr9tAp4= github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk= github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= github.com/ipfs/go-ds-badger v0.0.2/go.mod h1:Y3QpeSFWQf6MopLTiZD+VT6IC1yZqaGmjvRcKeSGij8= @@ -781,7 +698,6 @@ github.com/ipfs/go-ds-badger v0.3.0 h1:xREL3V0EH9S219kFFueOYJJTcjgNSZ2HY1iSvN7U1 github.com/ipfs/go-ds-badger v0.3.0/go.mod h1:1ke6mXNqeV8K3y5Ak2bAA0osoTfmxUdupVCGm4QUIek= github.com/ipfs/go-ds-badger2 v0.1.2 h1:sQc2q1gaXrv8YFNeUtxil0neuyDf9hnVHfLsi7lpXfE= github.com/ipfs/go-ds-badger2 v0.1.2/go.mod h1:3FtQmDv6fMubygEfU43bsFelYpIiXX/XEYA54l9eCwg= -github.com/ipfs/go-ds-flatfs v0.5.1/go.mod h1:RWTV7oZD/yZYBKdbVIFXTX2fdY2Tbvl94NsWqmoyAX4= github.com/ipfs/go-ds-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIykR4L04tMOYc= github.com/ipfs/go-ds-leveldb v0.1.0/go.mod h1:hqAW8y4bwX5LWcCtku2rFNX3vjDZCy5LZCg+cSZvYb8= github.com/ipfs/go-ds-leveldb v0.4.1/go.mod h1:jpbku/YqBSsBc1qgME8BkWS4AxzF2cEu1Ii2r79Hh9s= @@ -790,26 +706,17 @@ github.com/ipfs/go-ds-leveldb v0.5.0 h1:s++MEBbD3ZKc9/8/njrn4flZLnCuY9I79v94gBUN github.com/ipfs/go-ds-leveldb v0.5.0/go.mod h1:d3XG9RUDzQ6V4SHi8+Xgj9j1XuEk1z82lquxrVbml/Q= github.com/ipfs/go-ds-measure v0.2.0 h1:sG4goQe0KDTccHMyT45CY1XyUbxe5VwTKpg2LjApYyQ= github.com/ipfs/go-ds-measure v0.2.0/go.mod h1:SEUD/rE2PwRa4IQEC5FuNAmjJCyYObZr9UvVh8V3JxE= -github.com/ipfs/go-fetcher v1.5.0/go.mod h1:5pDZ0393oRF/fHiLmtFZtpMNBQfHOYNPtryWedVuSWE= github.com/ipfs/go-fetcher v1.6.1/go.mod h1:27d/xMV8bodjVs9pugh/RCjjK2OZ68UgAMspMdingNo= -github.com/ipfs/go-filestore v1.1.0/go.mod h1:6e1/5Y6NvLuCRdmda/KA4GUhXJQ3Uat6vcWm2DJfxc8= github.com/ipfs/go-filestore v1.2.0 h1:O2wg7wdibwxkEDcl7xkuQsPvJFRBVgVSsOJ/GP6z3yU= github.com/ipfs/go-filestore v1.2.0/go.mod h1:HLJrCxRXquTeEEpde4lTLMaE/MYJZD7WHLkp9z6+FF8= github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28L7zESmM= github.com/ipfs/go-fs-lock v0.0.7 h1:6BR3dajORFrFTkb5EpCUFIAypsoxpGpDSVUdFwzgL9U= github.com/ipfs/go-fs-lock v0.0.7/go.mod h1:Js8ka+FNYmgQRLrRXzU3CB/+Csr1BwrRilEcvYrHhhc= -github.com/ipfs/go-graphsync v0.11.0/go.mod h1:wC+c8vGVjAHthsVIl8LKr37cUra2GOaMYcQNNmMxDqE= github.com/ipfs/go-graphsync v0.13.1 h1:lWiP/WLycoPUYyj3IDEi1GJNP30kFuYOvimcfeuZyQs= github.com/ipfs/go-graphsync v0.13.1/go.mod h1:y8e8G6CmZeL9Srvx1l15CtGiRdf3h5JdQuqPz/iYL0A= -github.com/ipfs/go-ipfs v0.12.1/go.mod h1:Sbei4ScHevs2v47nUgONQMtHlUfaJjjTNDbhUU1OzOM= github.com/ipfs/go-ipfs-blockstore v0.0.1/go.mod h1:d3WClOmRQKFnJ0Jz/jj/zmksX0ma1gROTlovZKBmN08= github.com/ipfs/go-ipfs-blockstore v0.1.0/go.mod h1:5aD0AvHPi7mZc6Ci1WCAhiBQu2IsfTduLl+422H6Rqw= -github.com/ipfs/go-ipfs-blockstore v0.1.4/go.mod h1:Jxm3XMVjh6R17WvxFEiyKBLUGr86HgIYJW/D/MwqeYQ= -github.com/ipfs/go-ipfs-blockstore v0.1.6/go.mod h1:Jxm3XMVjh6R17WvxFEiyKBLUGr86HgIYJW/D/MwqeYQ= github.com/ipfs/go-ipfs-blockstore v0.2.1/go.mod h1:jGesd8EtCM3/zPgx+qr0/feTXGUeRai6adgwC+Q+JvE= -github.com/ipfs/go-ipfs-blockstore v1.0.4-0.20210205083733-fb07d7bc5aec/go.mod h1:feuklK+m9POeWJzYQO7l05yNEgUiX5oELBNA8/Be33E= -github.com/ipfs/go-ipfs-blockstore v1.0.4/go.mod h1:uL7/gTJ8QIZ3MtA3dWf+s1a0U3fJy2fcEZAsovpRp+w= -github.com/ipfs/go-ipfs-blockstore v1.1.1/go.mod h1:w51tNR9y5+QXB0wkNcHt4O2aSZjTdqaEWaQdSxEyUOY= github.com/ipfs/go-ipfs-blockstore v1.1.2/go.mod h1:w51tNR9y5+QXB0wkNcHt4O2aSZjTdqaEWaQdSxEyUOY= github.com/ipfs/go-ipfs-blockstore v1.2.0 h1:n3WTeJ4LdICWs/0VSfjHrlqpPpl6MZ+ySd3j8qz0ykw= github.com/ipfs/go-ipfs-blockstore v1.2.0/go.mod h1:eh8eTFLiINYNSNawfZOC7HOxNTxpB1PFuA5E1m/7exE= @@ -818,10 +725,8 @@ github.com/ipfs/go-ipfs-blocksutil v0.0.1/go.mod h1:Yq4M86uIOmxmGPUHv/uI7uKqZNtL github.com/ipfs/go-ipfs-chunker v0.0.1/go.mod h1:tWewYK0we3+rMbOh7pPFGDyypCtvGcBFymgY4rSDLAw= github.com/ipfs/go-ipfs-chunker v0.0.5 h1:ojCf7HV/m+uS2vhUGWcogIIxiO5ubl5O57Q7NapWLY8= github.com/ipfs/go-ipfs-chunker v0.0.5/go.mod h1:jhgdF8vxRHycr00k13FM8Y0E+6BoalYeobXmUyTreP8= -github.com/ipfs/go-ipfs-cmds v0.6.0/go.mod h1:ZgYiWVnCk43ChwoH8hAmI1IRbuVtq3GSTHwtRB/Kqhk= github.com/ipfs/go-ipfs-cmds v0.7.0 h1:0lEldmB7C83RxIOer38Sv1ob6wIoCAIEOaxiYgcv7wA= github.com/ipfs/go-ipfs-cmds v0.7.0/go.mod h1:y0bflH6m4g6ary4HniYt98UqbrVnRxmRarzeMdLIUn0= -github.com/ipfs/go-ipfs-config v0.5.3/go.mod h1:nSLCFtlaL+2rbl3F+9D4gQZQbT1LjRKx7TJg/IHz6oM= github.com/ipfs/go-ipfs-config v0.18.0 h1:Ta1aNGNEq6RIvzbw7dqzCVZJKb7j+Dd35JFnAOCpT8g= github.com/ipfs/go-ipfs-config v0.18.0/go.mod h1:wz2lKzOjgJeYJa6zx8W9VT7mz+iSd0laBMqS/9wmX6A= github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= @@ -829,7 +734,6 @@ github.com/ipfs/go-ipfs-delay v0.0.1 h1:r/UXYyRcddO6thwOnhiznIAiSvxMECGgtv35Xs1I github.com/ipfs/go-ipfs-delay v0.0.1/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= github.com/ipfs/go-ipfs-ds-help v0.0.1/go.mod h1:gtP9xRaZXqIQRh1HRpp595KbBEdgqWFxefeVKOV8sxo= github.com/ipfs/go-ipfs-ds-help v0.1.1/go.mod h1:SbBafGJuGsPI/QL3j9Fc5YPLeAu+SzOkI0gFwAg+mOs= -github.com/ipfs/go-ipfs-ds-help v1.0.0/go.mod h1:ujAbkeIgkKAWtxxNkoZHWLCyk5JpPoKnGyCcsoF6ueE= github.com/ipfs/go-ipfs-ds-help v1.1.0 h1:yLE2w9RAsl31LtfMt91tRZcrx+e61O5mDxFRR994w4Q= github.com/ipfs/go-ipfs-ds-help v1.1.0/go.mod h1:YR5+6EaebOhfcqVCyqemItCLthrpVNot+rsOU/5IatU= github.com/ipfs/go-ipfs-exchange-interface v0.0.1/go.mod h1:c8MwfHjtQjPoDyiy9cFquVtVHkO9b9Ob3FG91qJnWCM= @@ -842,19 +746,15 @@ github.com/ipfs/go-ipfs-exchange-offline v0.2.0/go.mod h1:HjwBeW0dvZvfOMwDP0TSKX github.com/ipfs/go-ipfs-files v0.0.3/go.mod h1:INEFm0LL2LWXBhNJ2PMIIb2w45hpXgPjNoE7yA8Y1d4= github.com/ipfs/go-ipfs-files v0.0.4/go.mod h1:INEFm0LL2LWXBhNJ2PMIIb2w45hpXgPjNoE7yA8Y1d4= github.com/ipfs/go-ipfs-files v0.0.8/go.mod h1:wiN/jSG8FKyk7N0WyctKSvq3ljIa2NNTiZB55kpTdOs= -github.com/ipfs/go-ipfs-files v0.0.9/go.mod h1:aFv2uQ/qxWpL/6lidWvnSQmaVqCrf0TBGoUr+C1Fo84= github.com/ipfs/go-ipfs-files v0.1.1 h1:/MbEowmpLo9PJTEQk16m9rKzUHjeP4KRU9nWJyJO324= github.com/ipfs/go-ipfs-files v0.1.1/go.mod h1:8xkIrMWH+Y5P7HvJ4Yc5XWwIW2e52dyXUiC0tZyjDbM= github.com/ipfs/go-ipfs-http-client v0.4.0 h1:LNuVbFoKfCohCmcNImml3byM3PpTxTT7RPrv/UoDFkI= github.com/ipfs/go-ipfs-http-client v0.4.0/go.mod h1:NXzPUKt/QVCuR74a8angJCGOSLPImNi5LqaTxIep/70= -github.com/ipfs/go-ipfs-keystore v0.0.2/go.mod h1:H49tRmibOEs7gLMgbOsjC4dqh1u5e0R/SWuc2ScfgSo= -github.com/ipfs/go-ipfs-pinner v0.2.1/go.mod h1:l1AtLL5bovb7opnG77sh4Y10waINz3Y1ni6CvTzx7oo= github.com/ipfs/go-ipfs-posinfo v0.0.1 h1:Esoxj+1JgSjX0+ylc0hUmJCOv6V2vFoZiETLR6OtpRs= github.com/ipfs/go-ipfs-posinfo v0.0.1/go.mod h1:SwyeVP+jCwiDu0C313l/8jg6ZxM0qqtlt2a0vILTc1A= github.com/ipfs/go-ipfs-pq v0.0.1/go.mod h1:LWIqQpqfRG3fNc5XsnIhz/wQ2XXGyugQwls7BgUmUfY= github.com/ipfs/go-ipfs-pq v0.0.2 h1:e1vOOW6MuOwG2lqxcLA+wEn93i/9laCY8sXAw76jFOY= github.com/ipfs/go-ipfs-pq v0.0.2/go.mod h1:LWIqQpqfRG3fNc5XsnIhz/wQ2XXGyugQwls7BgUmUfY= -github.com/ipfs/go-ipfs-provider v0.7.1/go.mod h1:QwdDYRYnC5sYGLlOwVDY/0ZB6T3zcMtu+5+GdGeUuw8= github.com/ipfs/go-ipfs-routing v0.0.1/go.mod h1:k76lf20iKFxQTjcJokbPM9iBXVXVZhcOwc360N4nuKs= github.com/ipfs/go-ipfs-routing v0.1.0/go.mod h1:hYoUkJLyAUKhF58tysKpids8RNDPO42BVMgK5dNsoqY= github.com/ipfs/go-ipfs-routing v0.2.1 h1:E+whHWhJkdN9YeoHZNj5itzc+OR292AJ2uE9FFiW0BY= @@ -875,7 +775,6 @@ github.com/ipfs/go-ipld-format v0.2.0/go.mod h1:3l3C1uKoadTPbeNfrDi+xMInYKlx2Cvg github.com/ipfs/go-ipld-format v0.3.0/go.mod h1:co/SdBE8h99968X0hViiw1MNlh6fvxxnHpvVLnH7jSM= github.com/ipfs/go-ipld-format v0.4.0 h1:yqJSaJftjmjc9jEOFYlpkwOLVKv68OD27jFLlSghBlQ= github.com/ipfs/go-ipld-format v0.4.0/go.mod h1:co/SdBE8h99968X0hViiw1MNlh6fvxxnHpvVLnH7jSM= -github.com/ipfs/go-ipld-git v0.1.1/go.mod h1:+VyMqF5lMcJh4rwEppV0e6g4nCCHXThLYYDpKUkJubI= github.com/ipfs/go-ipld-legacy v0.1.0/go.mod h1:86f5P/srAmh9GcIcWQR9lfFLZPrIyyXQeVlOWeeWEuI= github.com/ipfs/go-ipld-legacy v0.1.1 h1:BvD8PEuqwBHLTKqlGFTHSwrwFOMkVESEvwIYwR2cdcc= github.com/ipfs/go-ipld-legacy v0.1.1/go.mod h1:8AyKFCjgRPsQFf15ZQgDB8Din4DML/fOmKZkkFkrIEg= @@ -907,7 +806,6 @@ github.com/ipfs/go-merkledag v0.0.6/go.mod h1:QYPdnlvkOg7GnQRofu9XZimC5ZW5Wi3bKy github.com/ipfs/go-merkledag v0.2.3/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= github.com/ipfs/go-merkledag v0.2.4/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= github.com/ipfs/go-merkledag v0.3.2/go.mod h1:fvkZNNZixVW6cKSZ/JfLlON5OlgTXNdRLz0p6QG/I2M= -github.com/ipfs/go-merkledag v0.4.0/go.mod h1:XshXBkhyeS63YNGisLL1uDSfuTyrQIxVUOg3ojR5MOE= github.com/ipfs/go-merkledag v0.5.1/go.mod h1:cLMZXx8J08idkp5+id62iVftUQV+HlYJ3PIhDfZsjA4= github.com/ipfs/go-merkledag v0.6.0 h1:oV5WT2321tS4YQVOPgIrWHvJ0lJobRTerU+i9nmUCuA= github.com/ipfs/go-merkledag v0.6.0/go.mod h1:9HSEwRd5sV+lbykiYP+2NC/3o6MZbKNaa4hfNcH5iH0= @@ -915,46 +813,29 @@ github.com/ipfs/go-metrics-interface v0.0.1 h1:j+cpbjYvu4R8zbleSs36gvB7jR+wsL2fG github.com/ipfs/go-metrics-interface v0.0.1/go.mod h1:6s6euYU4zowdslK0GKHmqaIZ3j/b/tL7HTWtJ4VPgWY= github.com/ipfs/go-metrics-prometheus v0.0.2 h1:9i2iljLg12S78OhC6UAiXi176xvQGiZaGVF1CUVdE+s= github.com/ipfs/go-metrics-prometheus v0.0.2/go.mod h1:ELLU99AQQNi+zX6GCGm2lAgnzdSH3u5UVlCdqSXnEks= -github.com/ipfs/go-mfs v0.2.1/go.mod h1:Woj80iuw4ajDnIP6+seRaoHpPsc9hmL0pk/nDNDWP88= -github.com/ipfs/go-namesys v0.4.0/go.mod h1:jpJwzodyP8DZdWN6DShRjVZw6gaqMr4nQLBSxU5cR6E= github.com/ipfs/go-path v0.0.7/go.mod h1:6KTKmeRnBXgqrTvzFrPV3CamxcgvXX/4z79tfAd2Sno= -github.com/ipfs/go-path v0.0.9/go.mod h1:VpDkSBKQ9EFQOUgi54Tq/O/tGi8n1RfYNks13M3DEs8= -github.com/ipfs/go-path v0.1.1/go.mod h1:vC8q4AKOtrjJz2NnllIrmr2ZbGlF5fW2OKKyhV9ggb0= -github.com/ipfs/go-path v0.2.1/go.mod h1:NOScsVgxfC/eIw4nz6OiGwK42PjaSJ4Y/ZFPn1Xe07I= github.com/ipfs/go-path v0.3.0 h1:tkjga3MtpXyM5v+3EbRvOHEoo+frwi4oumw5K+KYWyA= github.com/ipfs/go-path v0.3.0/go.mod h1:NOScsVgxfC/eIw4nz6OiGwK42PjaSJ4Y/ZFPn1Xe07I= github.com/ipfs/go-peertaskqueue v0.0.4/go.mod h1:03H8fhyeMfKNFWqzYEVyMbcPUeYrqP1MX6Kd+aN+rMQ= github.com/ipfs/go-peertaskqueue v0.1.0/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U= -github.com/ipfs/go-peertaskqueue v0.1.1/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U= -github.com/ipfs/go-peertaskqueue v0.2.0/go.mod h1:5/eNrBEbtSKWCG+kQK8K8fGNixoYUnr+P7jivavs9lY= github.com/ipfs/go-peertaskqueue v0.7.0/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68ow0Rrb04donIU= github.com/ipfs/go-peertaskqueue v0.7.1 h1:7PLjon3RZwRQMgOTvYccZ+mjzkmds/7YzSWKFlBAypE= github.com/ipfs/go-peertaskqueue v0.7.1/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68ow0Rrb04donIU= -github.com/ipfs/go-pinning-service-http-client v0.1.0/go.mod h1:tcCKmlkWWH9JUUkKs8CrOZBanacNc1dmKLfjlyXAMu4= -github.com/ipfs/go-todocounter v0.0.1/go.mod h1:l5aErvQc8qKE2r7NDMjmq5UNAvuZy0rC8BHOplkWvZ4= github.com/ipfs/go-unixfs v0.2.2-0.20190827150610-868af2e9e5cb/go.mod h1:IwAAgul1UQIcNZzKPYZWOCijryFBeCV79cNubPzol+k= github.com/ipfs/go-unixfs v0.2.4/go.mod h1:SUdisfUjNoSDzzhGVxvCL9QO/nKdwXdr+gbMUdqcbYw= -github.com/ipfs/go-unixfs v0.2.6/go.mod h1:GTTzQvaZsTZARdNkkdjDKFFnBhmO3e5mIM1PkH/x4p0= github.com/ipfs/go-unixfs v0.3.1 h1:LrfED0OGfG98ZEegO4/xiprx2O+yS+krCMQSp7zLVv8= github.com/ipfs/go-unixfs v0.3.1/go.mod h1:h4qfQYzghiIc8ZNFKiLMFWOTzrWIAtzYQ59W/pCFf1o= github.com/ipfs/go-unixfsnode v1.1.2/go.mod h1:5dcE2x03pyjHk4JjamXmunTMzz+VUtqvPwZjIEkfV6s= -github.com/ipfs/go-unixfsnode v1.1.3/go.mod h1:ZZxUM5wXBC+G0Co9FjrYTOm+UlhZTjxLfRYdWY9veZ4= github.com/ipfs/go-unixfsnode v1.4.0 h1:9BUxHBXrbNi8mWHc6j+5C580WJqtVw9uoeEKn4tMhwA= github.com/ipfs/go-unixfsnode v1.4.0/go.mod h1:qc7YFFZ8tABc58p62HnIYbUMwj9chhUuFWmxSokfePo= github.com/ipfs/go-verifcid v0.0.1 h1:m2HI7zIuR5TFyQ1b79Da5N9dnnCP1vcu2QqawmWlK2E= github.com/ipfs/go-verifcid v0.0.1/go.mod h1:5Hrva5KBeIog4A+UpqlaIU+DEstipcJYQQZc0g37pY0= github.com/ipfs/interface-go-ipfs-core v0.4.0/go.mod h1:UJBcU6iNennuI05amq3FQ7g0JHUkibHFAfhfUIy927o= -github.com/ipfs/interface-go-ipfs-core v0.5.2/go.mod h1:lNBJrdXHtWS46evMPBdWtDQMDsrKcGbxCOGoKLkztOE= github.com/ipfs/interface-go-ipfs-core v0.7.0 h1:7tb+2upz8oCcjIyjo1atdMk+P+u7wPmI+GksBlLE8js= github.com/ipfs/interface-go-ipfs-core v0.7.0/go.mod h1:lF27E/nnSPbylPqKVXGZghal2hzifs3MmjyiEjnc9FY= github.com/ipfs/iptb v1.4.0 h1:YFYTrCkLMRwk/35IMyC6+yjoQSHTEcNcefBStLJzgvo= -github.com/ipfs/iptb v1.4.0/go.mod h1:1rzHpCYtNp87/+hTxG5TfCVn/yMY3dKnLn8tBiMfdmg= github.com/ipfs/iptb-plugins v0.3.0 h1:C1rpq1o5lUZtaAOkLIox5akh6ba4uk/3RwWc6ttVxw0= -github.com/ipfs/iptb-plugins v0.3.0/go.mod h1:5QtOvckeIw4bY86gSH4fgh3p3gCSMn3FmIKr4gaBncA= -github.com/ipfs/tar-utils v0.0.2/go.mod h1:4qlnRWgTVljIMhSG2SqRYn66NT+3wrv/kZt9V+eqxDM= -github.com/ipld/edelweiss v0.1.2/go.mod h1:14NnBVHgrPO8cqDnKg7vc69LGI0aCAcax6mj21+99ec= github.com/ipld/go-car v0.1.0/go.mod h1:RCWzaUh2i4mOEkB3W45Vc+9jnS/M6Qay5ooytiBHl3g= -github.com/ipld/go-car v0.3.2/go.mod h1:WEjynkVt04dr0GwJhry0KlaTeSDEiEYyMPOxDBQ17KE= github.com/ipld/go-car v0.4.0 h1:U6W7F1aKF/OJMHovnOVdst2cpQE5GhmHibQkAixgNcQ= github.com/ipld/go-car v0.4.0/go.mod h1:Uslcn4O9cBKK9wqHm/cLTFacg6RAPv6LZx2mxd2Ypl4= github.com/ipld/go-car/v2 v2.1.1/go.mod h1:+2Yvf0Z3wzkv7NeI69i8tuZ+ft7jyjPYIWZzeVNeFcI= @@ -970,11 +851,7 @@ github.com/ipld/go-ipld-prime v0.9.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/j github.com/ipld/go-ipld-prime v0.9.1-0.20210324083106-dc342a9917db/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= github.com/ipld/go-ipld-prime v0.10.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= github.com/ipld/go-ipld-prime v0.11.0/go.mod h1:+WIAkokurHmZ/KwzDOMUuoeJgaRQktHtEaLglS3ZeV8= -github.com/ipld/go-ipld-prime v0.12.3/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= github.com/ipld/go-ipld-prime v0.14.0/go.mod h1:9ASQLwUFLptCov6lIYc70GRB4V7UTyLD0IJtrDJe6ZM= -github.com/ipld/go-ipld-prime v0.14.1/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= -github.com/ipld/go-ipld-prime v0.14.2/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= -github.com/ipld/go-ipld-prime v0.14.4-0.20211217152141-008fd70fc96f/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= github.com/ipld/go-ipld-prime v0.16.0/go.mod h1:axSCuOCBPqrH+gvXr2w9uAOulJqBPhHPT2PjoiiU1qA= github.com/ipld/go-ipld-prime v0.17.0 h1:+U2peiA3aQsE7mrXjD2nYZaZrCcakoz2Wge8K42Ld8g= github.com/ipld/go-ipld-prime v0.17.0/go.mod h1:aYcKm5TIvGfY8P3QBKz/2gKcLxzJ1zDaD+o0bOowhgs= @@ -983,7 +860,6 @@ github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20211210234204-ce2a1c70cd github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20211210234204-ce2a1c70cd73/go.mod h1:2PJ0JgxyB08t0b2WKrcuqI3di0V+5n6RS/LTUJhkoxY= github.com/ipld/go-ipld-selector-text-lite v0.0.1 h1:lNqFsQpBHc3p5xHob2KvEg/iM5dIFn6iw4L/Hh+kS1Y= github.com/ipld/go-ipld-selector-text-lite v0.0.1/go.mod h1:U2CQmFb+uWzfIEF3I1arrDa5rwtj00PrpiwwCO+k1RM= -github.com/ipld/go-storethehash v0.1.7/go.mod h1:O2CgbSwJfXCrYsjA1g1M7zJmVzzg71BM00ds6pyMLAQ= github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52 h1:QG4CGBqCeuBo6aZlGAamSkxWdgWfZGeE49eUOWJPA4c= github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52/go.mod h1:fdg+/X9Gg4AsAIzWpEHwnqd+QY3b7lajxyjE1m4hkq4= github.com/jackpal/gateway v1.0.5/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= @@ -1007,8 +883,6 @@ github.com/jessevdk/go-flags v1.4.0 h1:4IU2WS7AumrZ/40jfhf4QVDMsQwqA7VEHozFRrGAR github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901 h1:rp+c0RAYOWj8l6qbCUTSiRLG/iKnW3K3/QfPPuSsBt4= github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901/go.mod h1:Z86h9688Y0wesXCyonoVr47MasHilkuLMqGhRZ4Hpak= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= @@ -1037,7 +911,6 @@ github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7 github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/kabukky/httpscerts v0.0.0-20150320125433-617593d7dcb3/go.mod h1:BYpt4ufZiIGv2nXn4gMxnfKV306n3mWXgNu/d2TqdTU= github.com/kami-zh/go-capturer v0.0.0-20171211120116-e492ea43421d/go.mod h1:P2viExyCEfeWGU259JnaQ34Inuec4R38JCyBx2edgD0= github.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8= @@ -1052,7 +925,6 @@ github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/compress v1.15.1 h1:y9FcTHGyrebwfP0ZZqFiaxTaiDnUrGkJkI+f583BL1A= github.com/klauspost/compress v1.15.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= @@ -1094,8 +966,6 @@ github.com/libp2p/go-conn-security-multistream v0.1.0/go.mod h1:aw6eD7LOsHEX7+2h github.com/libp2p/go-conn-security-multistream v0.2.0/go.mod h1:hZN4MjlNetKD3Rq5Jb/P5ohUnFLNzEAR4DLSzpn2QLU= github.com/libp2p/go-conn-security-multistream v0.2.1/go.mod h1:cR1d8gA0Hr59Fj6NhaTpFhJZrjSYuNmhpT2r25zYR70= github.com/libp2p/go-conn-security-multistream v0.3.0/go.mod h1:EEP47t4fw/bTelVmEzIDqSe69hO/ip52xBEhZMLWAHM= -github.com/libp2p/go-doh-resolver v0.3.1/go.mod h1:y5go1ZppAq9N2eppbX0xON01CyPBeUg2yS6BTssssog= -github.com/libp2p/go-eventbus v0.0.2/go.mod h1:Hr/yGlwxA/stuLnpMiu82lpNKpvRy3EaJxPu40XYOwk= github.com/libp2p/go-eventbus v0.1.0/go.mod h1:vROgu5cs5T7cv7POWlWxBaVLxfSegC5UGQf8A2eEmx4= github.com/libp2p/go-eventbus v0.2.1 h1:VanAdErQnpTioN2TowqNcOijf6YwhuODe4pPKSDpxGc= github.com/libp2p/go-eventbus v0.2.1/go.mod h1:jc2S4SoEVPP48H9Wpzm5aiGwUCBMfGhVhhBjyhhCJs8= @@ -1106,23 +976,15 @@ github.com/libp2p/go-flow-metrics v0.0.3/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS github.com/libp2p/go-libp2p v0.0.30/go.mod h1:XWT8FGHlhptAv1+3V/+J5mEpzyui/5bvFsNuWYs611A= github.com/libp2p/go-libp2p v0.1.0/go.mod h1:6D/2OBauqLUoqcADOJpn9WbKqvaM07tDw68qHM0BxUM= github.com/libp2p/go-libp2p v0.1.1/go.mod h1:I00BRo1UuUSdpuc8Q2mN7yDF/oTUTRAX6JWpTiK9Rp8= -github.com/libp2p/go-libp2p v0.3.1/go.mod h1:e6bwxbdYH1HqWTz8faTChKGR0BjPc8p+6SyP8GTTR7Y= -github.com/libp2p/go-libp2p v0.4.0/go.mod h1:9EsEIf9p2UDuwtPd0DwJsAl0qXVxgAnuDGRvHbfATfI= github.com/libp2p/go-libp2p v0.6.1/go.mod h1:CTFnWXogryAHjXAKEbOf1OWY+VeAP3lDMZkfEI5sT54= github.com/libp2p/go-libp2p v0.7.0/go.mod h1:hZJf8txWeCduQRDC/WSqBGMxaTHCOYHt2xSU1ivxn0k= 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.12.0/go.mod h1:FpHZrfC1q7nA8jitvdjKBDF31hguaC676g/nT9PgQM0= -github.com/libp2p/go-libp2p v0.13.0/go.mod h1:pM0beYdACRfHO1WcJlp65WXyG2A6NqYM+t2DTVAJxMo= -github.com/libp2p/go-libp2p v0.14.0/go.mod h1:dsQrWLAoIn+GkHPN/U+yypizkHiB9tnv79Os+kSgQ4Q= github.com/libp2p/go-libp2p v0.14.3/go.mod h1:d12V4PdKbpL0T1/gsUNN8DfgMuRPDX8bS2QxCZlwRH0= github.com/libp2p/go-libp2p v0.14.4/go.mod h1:EIRU0Of4J5S8rkockZM7eJp2S0UrCyi55m2kJVru3rM= github.com/libp2p/go-libp2p v0.16.0/go.mod h1:ump42BsirwAWxKzsCiFnTtN1Yc+DuPu76fyMX364/O4= github.com/libp2p/go-libp2p v0.17.0/go.mod h1:Fkin50rsGdv5mm5BshBUtPRZknt9esfmYXBOYcwOTgw= github.com/libp2p/go-libp2p v0.18.0/go.mod h1:+veaZ9z1SZQhmc5PW78jvnnxZ89Mgvmh4cggO11ETmw= -github.com/libp2p/go-libp2p v0.19.4/go.mod h1:MIt8y481VDhUe4ErWi1a4bvt/CjjFfOq6kZTothWIXY= -github.com/libp2p/go-libp2p v0.20.0/go.mod h1:g0C5Fu+aXXbCXkusCzLycuBowEih3ElmDqtbo61Em7k= -github.com/libp2p/go-libp2p v0.20.1/go.mod h1:XgJHsOhEBVBXp/2Sj9bm/yEyD94uunAaP6oaegdcKks= github.com/libp2p/go-libp2p v0.20.3 h1:tjjDNfp7FqdI/7v1rXtB/BtELaPlAThL2uzlj18kcrw= github.com/libp2p/go-libp2p v0.20.3/go.mod h1:I+vndVanE/p/SjFbnA+BEmmfAUEpWxrdXZeyQ1Dus5c= github.com/libp2p/go-libp2p-asn-util v0.0.0-20200825225859-85005c6cf052/go.mod h1:nRMRTab+kZuk0LnKZpxhOVH/ndsdr2Nr//Zltc/vwgo= @@ -1135,28 +997,22 @@ github.com/libp2p/go-libp2p-autonat v0.1.1/go.mod h1:OXqkeGOY2xJVWKAGV2inNF5aKN/ github.com/libp2p/go-libp2p-autonat v0.2.0/go.mod h1:DX+9teU4pEEoZUqR1PiMlqliONQdNbfzE1C718tcViI= github.com/libp2p/go-libp2p-autonat v0.2.1/go.mod h1:MWtAhV5Ko1l6QBsHQNSuM6b1sRkXrpk0/LqCr+vCVxI= github.com/libp2p/go-libp2p-autonat v0.2.2/go.mod h1:HsM62HkqZmHR2k1xgX34WuWDzk/nBwNHoeyyT4IWV6A= -github.com/libp2p/go-libp2p-autonat v0.4.0/go.mod h1:YxaJlpr81FhdOv3W3BTconZPfhaYivRdf53g+S2wobk= github.com/libp2p/go-libp2p-autonat v0.4.2/go.mod h1:YxaJlpr81FhdOv3W3BTconZPfhaYivRdf53g+S2wobk= github.com/libp2p/go-libp2p-autonat v0.6.0/go.mod h1:bFC6kY8jwzNNWoqc8iGE57vsfwyJ/lP4O4DOV1e0B2o= github.com/libp2p/go-libp2p-autonat v0.7.0/go.mod h1:uPvPn6J7cN+LCfFwW5tpOYvAz5NvPTc4iBamTV/WDMg= -github.com/libp2p/go-libp2p-autonat-svc v0.1.0/go.mod h1:fqi8Obl/z3R4PFVLm8xFtZ6PBL9MlV/xumymRFkKq5A= github.com/libp2p/go-libp2p-blankhost v0.0.1/go.mod h1:Ibpbw/7cPPYwFb7PACIWdvxxv0t0XCCI10t7czjAjTc= github.com/libp2p/go-libp2p-blankhost v0.1.1/go.mod h1:pf2fvdLJPsC1FsVrNP3DUUvMzUts2dsLLBEpo1vW1ro= -github.com/libp2p/go-libp2p-blankhost v0.1.3/go.mod h1:KML1//wiKR8vuuJO0y3LUd1uLv+tlkGTAr3jC0S5cLg= github.com/libp2p/go-libp2p-blankhost v0.1.4/go.mod h1:oJF0saYsAXQCSfDq254GMNmLNz6ZTHTOvtF4ZydUvwU= github.com/libp2p/go-libp2p-blankhost v0.2.0/go.mod h1:eduNKXGTioTuQAUcZ5epXi9vMl+t4d8ugUBRQ4SqaNQ= github.com/libp2p/go-libp2p-blankhost v0.3.0 h1:kTnLArltMabZlzY63pgGDA4kkUcLkBFSM98zBssn/IY= github.com/libp2p/go-libp2p-blankhost v0.3.0/go.mod h1:urPC+7U01nCGgJ3ZsV8jdwTp6Ji9ID0dMTvq+aJ+nZU= github.com/libp2p/go-libp2p-circuit v0.0.9/go.mod h1:uU+IBvEQzCu953/ps7bYzC/D/R0Ho2A9LfKVVCatlqU= github.com/libp2p/go-libp2p-circuit v0.1.0/go.mod h1:Ahq4cY3V9VJcHcn1SBXjr78AbFkZeIRmfunbA7pmFh8= -github.com/libp2p/go-libp2p-circuit v0.1.1/go.mod h1:Ahq4cY3V9VJcHcn1SBXjr78AbFkZeIRmfunbA7pmFh8= -github.com/libp2p/go-libp2p-circuit v0.1.3/go.mod h1:Xqh2TjSy8DD5iV2cCOMzdynd6h8OTBGoV1AWbWor3qM= github.com/libp2p/go-libp2p-circuit v0.1.4/go.mod h1:CY67BrEjKNDhdTk8UgBX1Y/H5c3xkAcs3gnksxY7osU= github.com/libp2p/go-libp2p-circuit v0.2.1/go.mod h1:BXPwYDN5A8z4OEY9sOfr2DUQMLQvKt/6oku45YUmjIo= github.com/libp2p/go-libp2p-circuit v0.4.0/go.mod h1:t/ktoFIUzM6uLQ+o1G6NuBl2ANhBKN9Bc8jRIk31MoA= github.com/libp2p/go-libp2p-circuit v0.6.0 h1:rw/HlhmUB3OktS/Ygz6+2XABOmHKzZpPUuMNUMosj8w= github.com/libp2p/go-libp2p-circuit v0.6.0/go.mod h1:kB8hY+zCpMeScyvFrKrGicRdid6vNXbunKE4rXATZ0M= -github.com/libp2p/go-libp2p-connmgr v0.1.1/go.mod h1:wZxh8veAmU5qdrfJ0ZBLcU8oJe9L82ciVP/fl1VHjXk= github.com/libp2p/go-libp2p-connmgr v0.2.4/go.mod h1:YV0b/RIm8NGPnnNWM7hG9Q38OeQiQfKhHCCs1++ufn0= github.com/libp2p/go-libp2p-connmgr v0.3.0/go.mod h1:RVoyPjJm0J9Vd1m6qUN2Tn7kJm4rL1Ml20pFsFgPGik= github.com/libp2p/go-libp2p-connmgr v0.4.0 h1:q/KZUS1iMDIQckMZarMYwhQisJqiFPHAVC1c4DR3hDE= @@ -1165,10 +1021,8 @@ github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGc github.com/libp2p/go-libp2p-core v0.0.2/go.mod h1:9dAcntw/n46XycV4RnlBq3BpgrmyUi9LuoTNdPrbUco= github.com/libp2p/go-libp2p-core v0.0.3/go.mod h1:j+YQMNz9WNSkNezXOsahp9kwZBKBvxLpKD316QWSJXE= github.com/libp2p/go-libp2p-core v0.0.4/go.mod h1:jyuCQP356gzfCFtRKyvAbNkyeuxb7OlyhWZ3nls5d2I= -github.com/libp2p/go-libp2p-core v0.0.6/go.mod h1:0d9xmaYAVY5qmbp/fcgxHT3ZJsLjYeYPMJAUKpaCHrE= github.com/libp2p/go-libp2p-core v0.2.0/go.mod h1:X0eyB0Gy93v0DZtSYbEM7RnMChm9Uv3j7yRXjO77xSI= github.com/libp2p/go-libp2p-core v0.2.2/go.mod h1:8fcwTbsG2B+lTgRJ1ICZtiM5GWCWZVoVrLaDRvIRng0= -github.com/libp2p/go-libp2p-core v0.2.3/go.mod h1:GqhyQqyIAPsxFYXHMjfXgMv03lxsvM0mFzuYA9Ib42A= github.com/libp2p/go-libp2p-core v0.2.4/go.mod h1:STh4fdfa5vDYr0/SzYYeqnt+E6KfEV5VxfIrm0bcI0g= github.com/libp2p/go-libp2p-core v0.2.5/go.mod h1:6+5zJmKhsf7yHn1RbmYDu08qDUpIUxGdqHuEZckmZOA= github.com/libp2p/go-libp2p-core v0.3.0/go.mod h1:ACp3DmS3/N64c2jDzcV429ukDpicbL6+TrrxANBjPGw= @@ -1176,7 +1030,6 @@ github.com/libp2p/go-libp2p-core v0.3.1/go.mod h1:thvWy0hvaSBhnVBaW37BvzgVV68OUh github.com/libp2p/go-libp2p-core v0.4.0/go.mod h1:49XGI+kc38oGVwqSBhDEwytaAxgZasHhFfQKibzTls0= github.com/libp2p/go-libp2p-core v0.5.0/go.mod h1:49XGI+kc38oGVwqSBhDEwytaAxgZasHhFfQKibzTls0= github.com/libp2p/go-libp2p-core v0.5.1/go.mod h1:uN7L2D4EvPCvzSH5SrhR72UWbnSGpt5/a35Sm4upn4Y= -github.com/libp2p/go-libp2p-core v0.5.2/go.mod h1:uN7L2D4EvPCvzSH5SrhR72UWbnSGpt5/a35Sm4upn4Y= github.com/libp2p/go-libp2p-core v0.5.3/go.mod h1:uN7L2D4EvPCvzSH5SrhR72UWbnSGpt5/a35Sm4upn4Y= github.com/libp2p/go-libp2p-core v0.5.4/go.mod h1:uN7L2D4EvPCvzSH5SrhR72UWbnSGpt5/a35Sm4upn4Y= github.com/libp2p/go-libp2p-core v0.5.5/go.mod h1:vj3awlOr9+GMZJFH9s4mpt9RHHgGqeHCopzbYKZdRjM= @@ -1202,7 +1055,6 @@ github.com/libp2p/go-libp2p-core v0.16.1/go.mod h1:O3i/7y+LqUb0N+qhzXjBjjpchgptW github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE= github.com/libp2p/go-libp2p-crypto v0.0.2/go.mod h1:eETI5OUfBnvARGOHrJz2eWNyTUxEGZnBxMcbUjfIj4I= github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI= -github.com/libp2p/go-libp2p-daemon v0.2.2/go.mod h1:kyrpsLB2JeNYR2rvXSVWyY0iZuRIMhqzWR3im9BV6NQ= github.com/libp2p/go-libp2p-discovery v0.0.5/go.mod h1:YtF20GUxjgoKZ4zmXj8j3Nb2TUSBHFlOCetzYdbZL5I= github.com/libp2p/go-libp2p-discovery v0.1.0/go.mod h1:4F/x+aldVHjHDHuX85x1zWoFTGElt8HnoDzwkFZm29g= github.com/libp2p/go-libp2p-discovery v0.2.0/go.mod h1:s4VGaxYMbw4+4+tsoQTqh7wfxg97AEdo4GYBt6BadWg= @@ -1211,21 +1063,16 @@ github.com/libp2p/go-libp2p-discovery v0.5.0/go.mod h1:+srtPIU9gDaBNu//UHvcdliKB github.com/libp2p/go-libp2p-discovery v0.6.0/go.mod h1:/u1voHt0tKIe5oIA1RHBKQLVCWPna2dXmPNHc2zR9S8= github.com/libp2p/go-libp2p-discovery v0.7.0 h1:6Iu3NyningTb/BmUnEhcTwzwbs4zcywwbfTulM9LHuc= github.com/libp2p/go-libp2p-discovery v0.7.0/go.mod h1:zPug0Rxib1aQG9iIdwOpRpBf18cAfZgzicO826UQP4I= -github.com/libp2p/go-libp2p-gostream v0.3.0/go.mod h1:pLBQu8db7vBMNINGsAwLL/ZCE8wng5V1FThoaE5rNjc= -github.com/libp2p/go-libp2p-gostream v0.3.1/go.mod h1:1V3b+u4Zhaq407UUY9JLCpboaeufAeVQbnvAt12LRsI= github.com/libp2p/go-libp2p-gostream v0.4.0 h1:heduMMEB78yBqeEQv+P7Fn5X926MHC2jDIC7/7yLpYA= github.com/libp2p/go-libp2p-gostream v0.4.0/go.mod h1:21DVGBcCQwRfEXZpCnZ2kG24QiEkBpEQvG53gYXE4u0= github.com/libp2p/go-libp2p-host v0.0.1/go.mod h1:qWd+H1yuU0m5CwzAkvbSjqKairayEHdR5MMl7Cwa7Go= github.com/libp2p/go-libp2p-host v0.0.3/go.mod h1:Y/qPyA6C8j2coYyos1dfRm0I8+nvd4TGrDGt4tA7JR8= -github.com/libp2p/go-libp2p-http v0.2.1/go.mod h1:9KdioZ7XqNH0eZkZG9bulZLzHv11A7/12fT97agqWhg= github.com/libp2p/go-libp2p-interface-connmgr v0.0.1/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= github.com/libp2p/go-libp2p-interface-connmgr v0.0.4/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= github.com/libp2p/go-libp2p-interface-connmgr v0.0.5/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= github.com/libp2p/go-libp2p-interface-pnet v0.0.1/go.mod h1:el9jHpQAXK5dnTpKA4yfCNBZXvrzdOU75zz+C6ryp3k= -github.com/libp2p/go-libp2p-kad-dht v0.2.1/go.mod h1:k7ONOlup7HKzQ68dE6lSnp07cdxdkmnRa+6B4Fh9/w0= github.com/libp2p/go-libp2p-kad-dht v0.15.0 h1:Ke+Oj78gX5UDXnA6HBdrgvi+fStJxgYTDa51U0TsCLo= github.com/libp2p/go-libp2p-kad-dht v0.15.0/go.mod h1:rZtPxYu1TnHHz6n1RggdGrxUX/tA1C2/Wiw3ZMUDrU0= -github.com/libp2p/go-libp2p-kbucket v0.2.1/go.mod h1:/Rtu8tqbJ4WQ2KTCOMJhggMukOLNLNPY1EtEWWLxUvc= github.com/libp2p/go-libp2p-kbucket v0.3.1/go.mod h1:oyjT5O7tS9CQurok++ERgc46YLwEpuGoFq9ubvoUOio= github.com/libp2p/go-libp2p-kbucket v0.4.7 h1:spZAcgxifvFZHBD8tErvppbnNiKA5uokDu3CV7axu70= github.com/libp2p/go-libp2p-kbucket v0.4.7/go.mod h1:XyVo99AfQH0foSf176k4jY1xUJ2+jUJIZCSDm7r2YKk= @@ -1238,7 +1085,6 @@ github.com/libp2p/go-libp2p-mplex v0.2.0/go.mod h1:Ejl9IyjvXJ0T9iqUTE1jpYATQ9NM3 github.com/libp2p/go-libp2p-mplex v0.2.1/go.mod h1:SC99Rxs8Vuzrf/6WhmH41kNn13TiYdAWNYHrwImKLnE= github.com/libp2p/go-libp2p-mplex v0.2.2/go.mod h1:74S9eum0tVQdAfFiKxAyKzNdSuLqw5oadDq7+L/FELo= github.com/libp2p/go-libp2p-mplex v0.2.3/go.mod h1:CK3p2+9qH9x+7ER/gWWDYJ3QW5ZxWDkm+dVvjfuG3ek= -github.com/libp2p/go-libp2p-mplex v0.3.0/go.mod h1:l9QWxRbbb5/hQMECEb908GbS9Sm2UAR2KFZKUJEynEs= github.com/libp2p/go-libp2p-mplex v0.4.0/go.mod h1:yCyWJE2sc6TBTnFpjvLuEJgTSw/u+MamvzILKdX7asw= github.com/libp2p/go-libp2p-mplex v0.4.1/go.mod h1:cmy+3GfqfM1PceHTLL7zQzAAYaryDu6iPSC+CIb094g= github.com/libp2p/go-libp2p-mplex v0.5.0/go.mod h1:eLImPJLkj3iG5t5lq68w3Vm5NAQ5BcKwrrb2VmOYb3M= @@ -1252,10 +1098,8 @@ github.com/libp2p/go-libp2p-net v0.0.2/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8 github.com/libp2p/go-libp2p-netutil v0.0.1/go.mod h1:GdusFvujWZI9Vt0X5BKqwWWmZFxecf9Gt03cKxm2f/Q= github.com/libp2p/go-libp2p-netutil v0.1.0 h1:zscYDNVEcGxyUpMd0JReUZTrpMfia8PmLKcKF72EAMQ= github.com/libp2p/go-libp2p-netutil v0.1.0/go.mod h1:3Qv/aDqtMLTUyQeundkKsA+YCThNdbQD54k3TqjpbFU= -github.com/libp2p/go-libp2p-noise v0.1.1/go.mod h1:QDFLdKX7nluB7DEnlVPbz7xlLHdwHFA9HiohJRr3vwM= github.com/libp2p/go-libp2p-noise v0.2.0/go.mod h1:IEbYhBBzGyvdLBoxxULL/SGbJARhUeqlO8lVSREYu2Q= github.com/libp2p/go-libp2p-noise v0.3.0/go.mod h1:JNjHbociDJKHD64KTkzGnzqJ0FEV5gHJa6AB00kbCNQ= -github.com/libp2p/go-libp2p-noise v0.4.0/go.mod h1:BzzY5pyzCYSyJbQy9oD8z5oP2idsafjt4/X42h9DjZU= github.com/libp2p/go-libp2p-noise v0.5.0 h1:gwJZ/3iH3MRnBrLIyr/YLdCOnmqfJMptlsFFUIc3j0Y= github.com/libp2p/go-libp2p-noise v0.5.0/go.mod h1:CYYpJ+T4pox1d1J/hhUVxuMf6b2s3c41hFUgS8/yFQw= github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo= @@ -1279,13 +1123,9 @@ github.com/libp2p/go-libp2p-peerstore v0.7.0/go.mod h1:cdUWTHro83vpg6unCpGUr8qJo github.com/libp2p/go-libp2p-pnet v0.2.0/go.mod h1:Qqvq6JH/oMZGwqs3N1Fqhv8NVhrdYcO0BW4wssv21LA= github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1VZNHYcK8cLgFJLZ4s= github.com/libp2p/go-libp2p-protocol v0.1.0/go.mod h1:KQPHpAabB57XQxGrXCNvbL6UEXfQqUgC/1adR2Xtflk= -github.com/libp2p/go-libp2p-pubsub v0.1.1/go.mod h1:ZwlKzRSe1eGvSIdU5bD7+8RZN/Uzw0t1Bp9R1znpR/Q= github.com/libp2p/go-libp2p-pubsub v0.6.0/go.mod h1:nJv87QM2cU0w45KPR1rZicq+FmFIOD16zmT+ep1nOmg= -github.com/libp2p/go-libp2p-pubsub v0.7.0/go.mod h1:EuyBJFtF8qF67IEA98biwK8Xnw5MNJpJ/Z+8iWCMFwc= github.com/libp2p/go-libp2p-pubsub v0.7.1 h1:e2CPBP5uxvDkE0FiS0obZGZPzt+xuBOc6PpG+50pIAo= github.com/libp2p/go-libp2p-pubsub v0.7.1/go.mod h1:EuyBJFtF8qF67IEA98biwK8Xnw5MNJpJ/Z+8iWCMFwc= -github.com/libp2p/go-libp2p-pubsub-router v0.5.0/go.mod h1:TRJKskSem3C0aSb3CmRgPwq6IleVFzds6hS09fmZbGM= -github.com/libp2p/go-libp2p-quic-transport v0.1.1/go.mod h1:wqG/jzhF3Pu2NrhJEvE+IE0NTHNXslOPn9JQzyCAxzU= github.com/libp2p/go-libp2p-quic-transport v0.10.0/go.mod h1:RfJbZ8IqXIhxBRm5hqUEJqjiiY8xmEuq3HUDS993MkA= github.com/libp2p/go-libp2p-quic-transport v0.11.2/go.mod h1:wlanzKtIh6pHrq+0U3p3DY9PJfGqxMgPaGKaK5LifwQ= github.com/libp2p/go-libp2p-quic-transport v0.13.0/go.mod h1:39/ZWJ1TW/jx1iFkKzzUg00W6tDJh73FC0xYudjr7Hc= @@ -1296,16 +1136,13 @@ github.com/libp2p/go-libp2p-quic-transport v0.16.1/go.mod h1:1BXjVMzr+w7EkPfiHkK github.com/libp2p/go-libp2p-quic-transport v0.17.0/go.mod h1:x4pw61P3/GRCcSLypcQJE/Q2+E9f4X+5aRcZLXf20LM= github.com/libp2p/go-libp2p-record v0.0.1/go.mod h1:grzqg263Rug/sRex85QrDOLntdFAymLDLm7lxMgU79Q= github.com/libp2p/go-libp2p-record v0.1.0/go.mod h1:ujNc8iuE5dlKWVy6wuL6dd58t0n7xI4hAIl8pE6wu5Q= -github.com/libp2p/go-libp2p-record v0.1.1/go.mod h1:VRgKajOyMVgP/F0L5g3kH7SVskp17vFi2xheb5uMJtg= github.com/libp2p/go-libp2p-record v0.1.2/go.mod h1:pal0eNcT5nqZaTV7UGhqeGqxFgGdsU/9W//C8dqjQDk= github.com/libp2p/go-libp2p-record v0.1.3 h1:R27hoScIhQf/A8XJZ8lYpnqh9LatJ5YbHs28kCIfql0= github.com/libp2p/go-libp2p-record v0.1.3/go.mod h1:yNUff/adKIfPnYQXgp6FQmNu3gLJ6EMg7+/vv2+9pY4= github.com/libp2p/go-libp2p-resource-manager v0.1.5/go.mod h1:wJPNjeE4XQlxeidwqVY5G6DLOKqFK33u2n8blpl0I6Y= -github.com/libp2p/go-libp2p-resource-manager v0.2.1/go.mod h1:K+eCkiapf+ey/LADO4TaMpMTP9/Qde/uLlrnRqV4PLQ= github.com/libp2p/go-libp2p-resource-manager v0.3.0 h1:2+cYxUNi33tcydsVLt6K5Fv2E3OTiVeafltecAj15E0= github.com/libp2p/go-libp2p-resource-manager v0.3.0/go.mod h1:K+eCkiapf+ey/LADO4TaMpMTP9/Qde/uLlrnRqV4PLQ= github.com/libp2p/go-libp2p-routing v0.0.1/go.mod h1:N51q3yTr4Zdr7V8Jt2JIktVU+3xBBylx1MZeVA6t1Ys= -github.com/libp2p/go-libp2p-routing v0.1.0/go.mod h1:zfLhI1RI8RLEzmEaaPwzonRvXeeSHddONWkcTcB54nE= github.com/libp2p/go-libp2p-routing-helpers v0.2.3 h1:xY61alxJ6PurSi+MXbywZpelvuU4U4p/gPTxjqCqTzY= github.com/libp2p/go-libp2p-routing-helpers v0.2.3/go.mod h1:795bh+9YeoFl99rMASoiVgHdi5bjack0N1+AFAdbvBw= github.com/libp2p/go-libp2p-secio v0.0.3/go.mod h1:hS7HQ00MgLhRO/Wyu1bTX6ctJKhVpm+j2/S2A5UqYb0= @@ -1315,13 +1152,10 @@ github.com/libp2p/go-libp2p-secio v0.2.1/go.mod h1:cWtZpILJqkqrSkiYcDBh5lA3wbT2Q github.com/libp2p/go-libp2p-secio v0.2.2/go.mod h1:wP3bS+m5AUnFA+OFO7Er03uO1mncHG0uVwGrwvjYlNY= github.com/libp2p/go-libp2p-swarm v0.0.6/go.mod h1:s5GZvzg9xXe8sbeESuFpjt8CJPTCa8mhEusweJqyFy8= github.com/libp2p/go-libp2p-swarm v0.1.0/go.mod h1:wQVsCdjsuZoc730CgOvh5ox6K8evllckjebkdiY5ta4= -github.com/libp2p/go-libp2p-swarm v0.2.1/go.mod h1:x07b4zkMFo2EvgPV2bMTlNmdQc8i+74Jjio7xGvsTgU= github.com/libp2p/go-libp2p-swarm v0.2.2/go.mod h1:fvmtQ0T1nErXym1/aa1uJEyN7JzaTNyBcHImCxRpPKU= github.com/libp2p/go-libp2p-swarm v0.2.3/go.mod h1:P2VO/EpxRyDxtChXz/VPVXyTnszHvokHKRhfkEgFKNM= github.com/libp2p/go-libp2p-swarm v0.2.8/go.mod h1:JQKMGSth4SMqonruY0a8yjlPVIkb0mdNSwckW7OYziM= github.com/libp2p/go-libp2p-swarm v0.3.0/go.mod h1:hdv95GWCTmzkgeJpP+GK/9D9puJegb7H57B5hWQR5Kk= -github.com/libp2p/go-libp2p-swarm v0.3.1/go.mod h1:hdv95GWCTmzkgeJpP+GK/9D9puJegb7H57B5hWQR5Kk= -github.com/libp2p/go-libp2p-swarm v0.4.0/go.mod h1:XVFcO52VoLoo0eitSxNQWYq4D6sydGOweTOAjJNraCw= github.com/libp2p/go-libp2p-swarm v0.5.0/go.mod h1:sU9i6BoHE0Ve5SKz3y9WfKrh8dUat6JknzUehFx8xW4= github.com/libp2p/go-libp2p-swarm v0.5.3/go.mod h1:NBn7eNW2lu568L7Ns9wdFrOhgRlkRnIDg0FLKbuu3i8= github.com/libp2p/go-libp2p-swarm v0.8.0/go.mod h1:sOMp6dPuqco0r0GHTzfVheVBh6UEL0L1lXUZ5ot2Fvc= @@ -1346,11 +1180,9 @@ github.com/libp2p/go-libp2p-testing v0.7.0/go.mod h1:OLbdn9DbgdMwv00v+tlp1l3oe2C github.com/libp2p/go-libp2p-testing v0.8.0/go.mod h1:gRdsNxQSxAZowTgcLY7CC33xPmleZzoBpqSYbWenqPc= github.com/libp2p/go-libp2p-testing v0.9.0/go.mod h1:Td7kbdkWqYTJYQGTwzlgXwaqldraIanyjuRiAbK/XQU= github.com/libp2p/go-libp2p-testing v0.9.2 h1:dCpODRtRaDZKF8HXT9qqqgON+OMEB423Knrgeod8j84= -github.com/libp2p/go-libp2p-testing v0.9.2/go.mod h1:Td7kbdkWqYTJYQGTwzlgXwaqldraIanyjuRiAbK/XQU= github.com/libp2p/go-libp2p-tls v0.1.3/go.mod h1:wZfuewxOndz5RTnCAxFliGjvYSDA40sKitV4c50uI1M= github.com/libp2p/go-libp2p-tls v0.3.0/go.mod h1:fwF5X6PWGxm6IDRwF3V8AVCCj/hOd5oFlg+wo2FxJDY= github.com/libp2p/go-libp2p-tls v0.3.1/go.mod h1:fwF5X6PWGxm6IDRwF3V8AVCCj/hOd5oFlg+wo2FxJDY= -github.com/libp2p/go-libp2p-tls v0.4.1/go.mod h1:EKCixHEysLNDlLUoKxv+3f/Lp90O2EXNjTr0UQDnrIw= github.com/libp2p/go-libp2p-tls v0.5.0 h1:aRNTeOI8Ljm1r4L2uMGxkMsVnyZoPwaqQqMw23qAsQs= github.com/libp2p/go-libp2p-tls v0.5.0/go.mod h1:1a4tq0xQSZ0kAkDkZVAppuP3SAIUHcnzi2djJ/2EN4I= github.com/libp2p/go-libp2p-transport v0.0.1/go.mod h1:UzbUs9X+PHOSw7S3ZmeOxfnwaQY5vGDzZmKPod3N3tk= @@ -1359,7 +1191,6 @@ github.com/libp2p/go-libp2p-transport-upgrader v0.0.4/go.mod h1:RGq+tupk+oj7PzL2 github.com/libp2p/go-libp2p-transport-upgrader v0.1.1/go.mod h1:IEtA6or8JUbsV07qPW4r01GnTenLW4oi3lOPbUMGJJA= github.com/libp2p/go-libp2p-transport-upgrader v0.2.0/go.mod h1:mQcrHj4asu6ArfSoMuyojOdjx73Q47cYD7s5+gZOlns= github.com/libp2p/go-libp2p-transport-upgrader v0.3.0/go.mod h1:i+SKzbRnvXdVbU3D1dwydnTmKRPXiAR/fyvi1dXuL4o= -github.com/libp2p/go-libp2p-transport-upgrader v0.4.0/go.mod h1:J4ko0ObtZSmgn5BX5AmegP+dK3CSnU2lMCKsSq/EY0s= github.com/libp2p/go-libp2p-transport-upgrader v0.4.2/go.mod h1:NR8ne1VwfreD5VIWIU62Agt/J18ekORFU/j1i2y8zvk= github.com/libp2p/go-libp2p-transport-upgrader v0.4.3/go.mod h1:bpkldbOWXMrXhpZbSV1mQxTrefOg2Fi+k1ClDSA4ppw= github.com/libp2p/go-libp2p-transport-upgrader v0.4.6/go.mod h1:JE0WQuQdy+uLZ5zOaI3Nw9dWGYJIA7mywEtP2lMvnyk= @@ -1378,15 +1209,12 @@ github.com/libp2p/go-libp2p-yamux v0.2.7/go.mod h1:X28ENrBMU/nm4I3Nx4sZ4dgjZ6VhL github.com/libp2p/go-libp2p-yamux v0.2.8/go.mod h1:/t6tDqeuZf0INZMTgd0WxIRbtK2EzI2h7HbFm9eAKI4= github.com/libp2p/go-libp2p-yamux v0.4.0/go.mod h1:+DWDjtFMzoAwYLVkNZftoucn7PelNoy5nm3tZ3/Zw30= github.com/libp2p/go-libp2p-yamux v0.5.0/go.mod h1:AyR8k5EzyM2QN9Bbdg6X1SkVVuqLwTGf0L4DFq9g6po= -github.com/libp2p/go-libp2p-yamux v0.5.1/go.mod h1:dowuvDu8CRWmr0iqySMiSxK+W0iL5cMVO9S94Y6gkv4= -github.com/libp2p/go-libp2p-yamux v0.5.3/go.mod h1:Vy3TMonBAfTMXHWopsMc8iX/XGRYrRlpUaMzaeuHV/s= github.com/libp2p/go-libp2p-yamux v0.5.4/go.mod h1:tfrXbyaTqqSU654GTvK3ocnSZL3BuHoeTSqhcel1wsE= github.com/libp2p/go-libp2p-yamux v0.6.0/go.mod h1:MRhd6mAYnFRnSISp4M8i0ClV/j+mWHo2mYLifWGw33k= github.com/libp2p/go-libp2p-yamux v0.7.0/go.mod h1:fMyA0CsPfHkIuBU0wjRGrCjTBFiXTXxG0k5M4ETv+08= github.com/libp2p/go-libp2p-yamux v0.8.0/go.mod h1:yTkPgN2ib8FHyU1ZcVD7aelzyAqXXwEPbyx+aSKm9h8= github.com/libp2p/go-libp2p-yamux v0.8.1/go.mod h1:rUozF8Jah2dL9LLGyBaBeTQeARdwhefMCTQVQt6QobE= github.com/libp2p/go-libp2p-yamux v0.8.2/go.mod h1:rUozF8Jah2dL9LLGyBaBeTQeARdwhefMCTQVQt6QobE= -github.com/libp2p/go-libp2p-yamux v0.9.1/go.mod h1:wRc6wvyxQINFcKe7daL4BeQ02Iyp+wxyC8WCNfngBrA= github.com/libp2p/go-maddr-filter v0.0.1/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= github.com/libp2p/go-maddr-filter v0.0.4/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= github.com/libp2p/go-maddr-filter v0.0.5/go.mod h1:Jk+36PMfIqCJhAnaASRH83bdAvfDRp/w6ENFaC9bG+M= @@ -1401,7 +1229,6 @@ github.com/libp2p/go-mplex v0.2.0/go.mod h1:0Oy/A9PQlwBytDRp4wSkFnzHYDKcpLot35JQ github.com/libp2p/go-mplex v0.3.0/go.mod h1:0Oy/A9PQlwBytDRp4wSkFnzHYDKcpLot35JQ6msjvYQ= github.com/libp2p/go-mplex v0.4.0/go.mod h1:y26Lx+wNVtMYMaPu300Cbot5LkEZ4tJaNYeHeT9dh6E= github.com/libp2p/go-mplex v0.6.0/go.mod h1:y26Lx+wNVtMYMaPu300Cbot5LkEZ4tJaNYeHeT9dh6E= -github.com/libp2p/go-mplex v0.7.0/go.mod h1:rW8ThnRcYWft/Jb2jeORBmPd6xuG3dGxWN/W168L9EU= github.com/libp2p/go-msgio v0.0.2/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= github.com/libp2p/go-msgio v0.0.3/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= github.com/libp2p/go-msgio v0.0.4/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= @@ -1439,7 +1266,6 @@ github.com/libp2p/go-reuseport-transport v0.1.0/go.mod h1:vev0C0uMkzriDY59yFHD9v github.com/libp2p/go-sockaddr v0.0.2/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= github.com/libp2p/go-sockaddr v0.1.0/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= github.com/libp2p/go-sockaddr v0.1.1/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= -github.com/libp2p/go-socket-activation v0.1.0/go.mod h1:gzda2dNkMG5Ti2OfWNNwW0FDIbj0g/aJJU320FcLfhk= github.com/libp2p/go-stream-muxer v0.0.1/go.mod h1:bAo8x7YkSpadMTbtTaxGVHWUQsR/l5MEaHbKaliuT14= github.com/libp2p/go-stream-muxer v0.1.0/go.mod h1:8JAVsjeRBCWwPoZeH0W1imLOcriqXJyFvB0mR4A04sQ= github.com/libp2p/go-stream-muxer-multistream v0.1.1/go.mod h1:zmGdfkQ1AzOECIAcccoL8L//laqawOsO03zX8Sa+eGw= @@ -1450,7 +1276,6 @@ github.com/libp2p/go-tcp-transport v0.0.4/go.mod h1:+E8HvC8ezEVOxIo3V5vCK9l1y/19 github.com/libp2p/go-tcp-transport v0.1.0/go.mod h1:oJ8I5VXryj493DEJ7OsBieu8fcg2nHGctwtInJVpipc= github.com/libp2p/go-tcp-transport v0.1.1/go.mod h1:3HzGvLbx6etZjnFlERyakbaYPdfjg2pWP97dFZworkY= github.com/libp2p/go-tcp-transport v0.2.0/go.mod h1:vX2U0CnWimU4h0SGSEsg++AzvBcroCGYw28kh94oLe0= -github.com/libp2p/go-tcp-transport v0.2.1/go.mod h1:zskiJ70MEfWz2MKxvFB/Pv+tPIB1PpPUrHIWQ8aFw7M= github.com/libp2p/go-tcp-transport v0.2.3/go.mod h1:9dvr03yqrPyYGIEN6Dy5UvdJZjyPFvl1S/igQ5QD1SU= github.com/libp2p/go-tcp-transport v0.2.4/go.mod h1:9dvr03yqrPyYGIEN6Dy5UvdJZjyPFvl1S/igQ5QD1SU= github.com/libp2p/go-tcp-transport v0.2.7/go.mod h1:lue9p1b3VmZj1MhhEGB/etmvF/nBQ0X9CW2DutBT3MM= @@ -1461,10 +1286,8 @@ github.com/libp2p/go-testutil v0.0.1/go.mod h1:iAcJc/DKJQanJ5ws2V+u5ywdL2n12X1Wb github.com/libp2p/go-testutil v0.1.0/go.mod h1:81b2n5HypcVyrCg/MJx4Wgfp/VHojytjVe/gLzZ2Ehc= github.com/libp2p/go-ws-transport v0.0.5/go.mod h1:Qbl4BxPfXXhhd/o0wcrgoaItHqA9tnZjoFZnxykuaXU= github.com/libp2p/go-ws-transport v0.1.0/go.mod h1:rjw1MG1LU9YDC6gzmwObkPd/Sqwhw7yT74kj3raBFuo= -github.com/libp2p/go-ws-transport v0.1.2/go.mod h1:dsh2Ld8F+XNmzpkaAijmg5Is+e9l6/1tK/6VFOdN69Y= github.com/libp2p/go-ws-transport v0.2.0/go.mod h1:9BHJz/4Q5A9ludYWKoGCFC5gUElzlHoKzu0yY9p/klM= github.com/libp2p/go-ws-transport v0.3.0/go.mod h1:bpgTJmRZAvVHrgHybCVyqoBmyLQ1fiZuEaBYusP5zsk= -github.com/libp2p/go-ws-transport v0.3.1/go.mod h1:bpgTJmRZAvVHrgHybCVyqoBmyLQ1fiZuEaBYusP5zsk= github.com/libp2p/go-ws-transport v0.4.0/go.mod h1:EcIEKqf/7GDjth6ksuS/6p7R49V4CBY6/E7R/iyhYUA= github.com/libp2p/go-ws-transport v0.5.0/go.mod h1:I2juo1dNTbl8BKSBYo98XY85kU2xds1iamArLvl8kNg= github.com/libp2p/go-ws-transport v0.6.0/go.mod h1:dXqtI9e2JV9FtF1NOtWVZSKXh5zXvnuwPXfj8GPBbYU= @@ -1476,21 +1299,16 @@ github.com/libp2p/go-yamux v1.3.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZ github.com/libp2p/go-yamux v1.3.5/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/libp2p/go-yamux v1.3.7/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= github.com/libp2p/go-yamux v1.4.0/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= -github.com/libp2p/go-yamux v1.4.1 h1:P1Fe9vF4th5JOxxgQvfbOHkrGqIZniTLf+ddhZp8YTI= github.com/libp2p/go-yamux v1.4.1/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= -github.com/libp2p/go-yamux/v2 v2.0.0/go.mod h1:NVWira5+sVUIU6tu1JWvaRn1dRnG+cawOJiflsAM+7U= -github.com/libp2p/go-yamux/v2 v2.1.1/go.mod h1:3So6P6TV6r75R9jiBpiIKgU/66lOarCZjqROGxzPpPQ= github.com/libp2p/go-yamux/v2 v2.2.0/go.mod h1:3So6P6TV6r75R9jiBpiIKgU/66lOarCZjqROGxzPpPQ= github.com/libp2p/go-yamux/v2 v2.3.0/go.mod h1:iTU+lOIn/2h0AgKcL49clNTwfEw+WSfDYrXe05EyKIs= github.com/libp2p/go-yamux/v3 v3.0.1/go.mod h1:s2LsDhHbh+RfCsQoICSYt58U2f8ijtPANFD8BmE74Bo= github.com/libp2p/go-yamux/v3 v3.0.2/go.mod h1:s2LsDhHbh+RfCsQoICSYt58U2f8ijtPANFD8BmE74Bo= -github.com/libp2p/go-yamux/v3 v3.1.1/go.mod h1:jeLEQgLXqE2YqX1ilAClIfCMDY+0uXQUKmmb/qp0gT4= github.com/libp2p/go-yamux/v3 v3.1.2 h1:lNEy28MBk1HavUAlzKgShp+F6mn/ea1nDYWftZhFW9Q= github.com/libp2p/go-yamux/v3 v3.1.2/go.mod h1:jeLEQgLXqE2YqX1ilAClIfCMDY+0uXQUKmmb/qp0gT4= github.com/libp2p/zeroconf/v2 v2.1.1/go.mod h1:fuJqLnUwZTshS3U/bMRJ3+ow/v9oid1n0DmyYyNO1Xs= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= -github.com/lucas-clemente/quic-go v0.11.2/go.mod h1:PpMmPfPKO9nKJ/psF49ESTAGQSdfXxlg1otPbEB2nOw= github.com/lucas-clemente/quic-go v0.19.3/go.mod h1:ADXpNbTQjq1hIzCpB+y/k5iz4n4z4IwqoLb94Kh5Hu8= github.com/lucas-clemente/quic-go v0.21.2/go.mod h1:vF5M1XqhBAHgbjKcJOXY3JZz3GP0T3FQhz/uyOUS38Q= github.com/lucas-clemente/quic-go v0.23.0/go.mod h1:paZuzjXCE5mj6sikVLMvqXk8lJV2AsqtJ6bDhjEfxx0= @@ -1515,7 +1333,6 @@ github.com/mailru/easyjson v0.7.1/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7 github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA= github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/marten-seemann/qpack v0.2.1/go.mod h1:F7Gl5L1jIgN1D11ucXefiuJS9UMVP2opoCp2jDKb7wc= -github.com/marten-seemann/qtls v0.2.3/go.mod h1:xzjG7avBwGGbdZ8dTGxlBnLArsVKLvwmjgmPuiQEcYk= github.com/marten-seemann/qtls v0.10.0/go.mod h1:UvMd1oaYDACI99/oZUYLzMCkBXQVT0aGm99sJhbT8hs= github.com/marten-seemann/qtls-go1-15 v0.1.1/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= github.com/marten-seemann/qtls-go1-15 v0.1.4/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= @@ -1536,22 +1353,17 @@ github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaO github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.9 h1:sqDoxXbdeALODt0DAeJCVp38ps9ZogZEAXjus69YV3U= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.10 h1:CoZ3S2P7pvtP45xOtBw+/mDL2z0RKI576gSkzRRpdGg= github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= @@ -1568,9 +1380,7 @@ github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyex github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.12/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= github.com/miekg/dns v1.1.28/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= -github.com/miekg/dns v1.1.31/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= github.com/miekg/dns v1.1.48 h1:Ucfr7IIVyMBz4lRE8qmGUuZ4Wt3/ZGu9hmcMT3Uu4tQ= @@ -1583,8 +1393,6 @@ github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc h1:PTfri+PuQmWDqERdn github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc/go.mod h1:cGKTAVKx4SxOuR/czcZ/E2RSJ3sfHs8FpHhQ5CWMf9s= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= -github.com/minio/highwayhash v1.0.1/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= -github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= github.com/minio/sha256-simd v0.0.0-20190328051042-05b4dd3047e5/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= github.com/minio/sha256-simd v0.1.0/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= @@ -1593,7 +1401,6 @@ github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= @@ -1602,13 +1409,11 @@ github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS4 github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/montanaflynn/stats v0.6.6/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= github.com/mr-tron/base58 v1.1.1/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= @@ -1637,10 +1442,7 @@ github.com/multiformats/go-multiaddr v0.5.0 h1:i/JuOoVg4szYQ4YEzDGtb2h0o8M7CG/Yq github.com/multiformats/go-multiaddr v0.5.0/go.mod h1:3KAxNkUqLTJ20AAwN4XVX4kZar+bR+gh4zgbfr3SNug= github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= github.com/multiformats/go-multiaddr-dns v0.0.2/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= -github.com/multiformats/go-multiaddr-dns v0.0.3/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= -github.com/multiformats/go-multiaddr-dns v0.1.0/go.mod h1:01k2RAqtoXIuPa3DCavAE9/6jc6nM0H3EgZyfUhN2oY= github.com/multiformats/go-multiaddr-dns v0.2.0/go.mod h1:TJ5pr5bBO7Y1B18djPuRsVkduhQH2YqYSbxWJzYGdK0= -github.com/multiformats/go-multiaddr-dns v0.3.0/go.mod h1:mNzQ4eTGDg0ll1N9jKPOUogZPoJ30W8a7zk66FQPpdQ= github.com/multiformats/go-multiaddr-dns v0.3.1 h1:QgQgR+LQVt3NPTjbrLLpsaT2ufAA2y0Mkk+QRVJbW3A= github.com/multiformats/go-multiaddr-dns v0.3.1/go.mod h1:G/245BRQ6FJGmryJCrOuTdB37AMA5AMOVuO6NY3JwTk= github.com/multiformats/go-multiaddr-fmt v0.0.1/go.mod h1:aBYjqL4T/7j4Qx+R73XSv/8JsgnRFlf0w2KGLCmXl3Q= @@ -1673,18 +1475,14 @@ github.com/multiformats/go-multihash v0.0.10/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpK github.com/multiformats/go-multihash v0.0.13/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= github.com/multiformats/go-multihash v0.0.14/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= github.com/multiformats/go-multihash v0.0.15/go.mod h1:D6aZrWNLFTV/ynMpKsNtB40mJzmCl4jb1alC0OvHiHg= -github.com/multiformats/go-multihash v0.0.16/go.mod h1:zhfEIgVnB/rPMfxgFw15ZmGoNaKyNUIE4IWHG/kC+Ag= github.com/multiformats/go-multihash v0.1.0 h1:CgAgwqk3//SVEw3T+6DqI4mWMyRuDwZtOWcJT0q9+EA= github.com/multiformats/go-multihash v0.1.0/go.mod h1:RJlXsxt6vHGaia+S8We0ErjhojtKzPP2AH4+kYM7k84= github.com/multiformats/go-multistream v0.0.1/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= github.com/multiformats/go-multistream v0.0.4/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= github.com/multiformats/go-multistream v0.1.1/go.mod h1:KmHZ40hzVxiaiwlj3MEbYgK9JFk2/9UktWZAF54Du38= -github.com/multiformats/go-multistream v0.2.0/go.mod h1:5GZPQZbkWOLOn3J2y4Y99vVW7vOfsAflxARk3x14o6k= github.com/multiformats/go-multistream v0.2.1/go.mod h1:5GZPQZbkWOLOn3J2y4Y99vVW7vOfsAflxARk3x14o6k= github.com/multiformats/go-multistream v0.2.2/go.mod h1:UIcnm7Zuo8HKG+HkWgfQsGL+/MIEhyTqbODbIUwSXKs= -github.com/multiformats/go-multistream v0.3.0/go.mod h1:ODRoqamLUsETKS9BNcII4gcRsJBU5VAwRIv7O39cEXg= -github.com/multiformats/go-multistream v0.3.1/go.mod h1:ODRoqamLUsETKS9BNcII4gcRsJBU5VAwRIv7O39cEXg= github.com/multiformats/go-multistream v0.3.3 h1:d5PZpjwRgVlbwfdTDjife7XszfZd8KYWfROYFlGcR8o= github.com/multiformats/go-multistream v0.3.3/go.mod h1:ODRoqamLUsETKS9BNcII4gcRsJBU5VAwRIv7O39cEXg= github.com/multiformats/go-varint v0.0.1/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= @@ -1696,21 +1494,14 @@ github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRW github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= -github.com/nats-io/jwt v1.2.2/go.mod h1:/xX356yQA6LuXI9xWW7mZNpxgF2mBmGecH+Fj34sP5Q= -github.com/nats-io/jwt/v2 v2.0.3/go.mod h1:VRP+deawSXyhNjXmxPCHskrR6Mq50BqpEI5SEcNiGlY= github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= -github.com/nats-io/nats-server/v2 v2.5.0/go.mod h1:Kj86UtrXAL6LwYRA6H4RqzkHhK0Vcv2ZnKD5WbQ1t3g= github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= -github.com/nats-io/nats.go v1.12.1/go.mod h1:BPko4oXsySz4aSWeFgOHLZs3G4Jq4ZAyE6/zMCxRT6w= github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nkeys v0.2.0/go.mod h1:XdZpAbhgyyODYqjTawOnIOI7VlbKSarI9Gfy1tqEu/s= -github.com/nats-io/nkeys v0.3.0/go.mod h1:gvUNGjVcM2IPr5rCsRsC6Wb3Hr2CQAm08dsxtV6A5y4= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= github.com/ngdinhtoan/glide-cleanup v0.2.0/go.mod h1:UQzsmiDOb8YV3nOsCxK/c9zPpCZVNoHScRE3EO9pVMM= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nikkolasg/hexjson v0.0.0-20181101101858-78e39397e00c h1:5bFTChQxSKNwy8ALwOebjekYExl9HTT9urdawqC95tA= github.com/nikkolasg/hexjson v0.0.0-20181101101858-78e39397e00c/go.mod h1:7qN3Y0BvzRUf4LofcoJplQL10lsFDb4PYlePTVwrP28= github.com/nkovacs/streamquote v1.0.0 h1:PmVIV08Zlx2lZK5fFZlMZ04eHcDTIFJCv/5/0twVUow= @@ -1761,21 +1552,17 @@ github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTm github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= -github.com/openzipkin/zipkin-go v0.2.5/go.mod h1:KpXfKdgRDnnhsxw4pNIH9Md5lyFqKUa4YDFlwRYAMyE= github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 h1:onHthvaw9LFnH4t2DcNVpwGmV9E1BkGknEliJkfwQj0= github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58/go.mod h1:DXv8WO4yhMYhSNPKjeNKa5WY9YCIEBRbNzFFPJbWO6Y= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= -github.com/performancecopilot/speed/v4 v4.0.0/go.mod h1:qxrSyuDGrTOWfV+uKRFhfxw6h/4HXRGUiZiufxo49BM= github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9 h1:1/WtZae0yGtPq+TI6+Tv1WTxkukpXeMlviSxvL7SRgk= github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9/go.mod h1:x3N5drFsm2uilKKuuYo6LdyD8vZAW55sH/9w+pbo1sw= github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -1790,15 +1577,12 @@ github.com/polydawn/refmt v0.0.0-20190809202753-05966cbd336a/go.mod h1:uIp+gprXx github.com/polydawn/refmt v0.0.0-20201211092308-30ac6d18308e h1:ZOcivgkkFRnjfoTcGsDq3UQYiBmekwLA+qg0OjyB/ls= github.com/polydawn/refmt v0.0.0-20201211092308-30ac6d18308e/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= -github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.4.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.9.0/go.mod h1:FqZLKOZnGdFAhOK4nqGHa7D66IdsO+O441Eve7ptJDU= @@ -1817,7 +1601,6 @@ github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7q github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= @@ -1836,7 +1619,6 @@ github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190425082905-87a4384529e0/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.0.11/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= @@ -1851,7 +1633,6 @@ github.com/raulk/clock v1.1.0/go.mod h1:3MpVxdZ/ODBQDxbN+kzshf5OSZwPjtMDx6BBXBmO github.com/raulk/go-watchdog v1.2.0 h1:konN75pw2BMmZ+AfuAm5rtFsWcJpKF3m02rKituuXNo= github.com/raulk/go-watchdog v1.2.0/go.mod h1:lzSbAl5sh4rtI8tYHU01BWIDzgzqaQLj6RcA1i4mlqI= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rivo/uniseg v0.1.0 h1:+2KBaVoUmb9XzDsrx/Ct0W/EYOSFf/nWTauy++DprtY= github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= @@ -1859,12 +1640,10 @@ github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6L github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.8.1 h1:geMPLpDpQOgVyCg5z5GoRwLHepNdb71NXb67XFkP+Eg= -github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/rs/zerolog v1.21.0/go.mod h1:ZPhntP/xmq1nnND05hhpAh2QMhSsA4UN3MGZ6O2J3hM= -github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= @@ -1941,9 +1720,7 @@ github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DM github.com/src-d/envconfig v1.0.0/go.mod h1:Q9YQZ7BKITldTBnoxsE5gOeB5y66RyPXeue/R4aaNBc= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= -github.com/streadway/amqp v1.0.0/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= -github.com/streadway/handy v0.0.0-20200128134331-0f66f006fb2e/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -1966,10 +1743,7 @@ github.com/tidwall/match v1.0.1 h1:PnKP62LPNxHKTwvHHZZzdOAOCtsJTjo6dZLCwpKm5xc= github.com/tidwall/match v1.0.1/go.mod h1:LujAq0jyVjBy028G1WhWfIzbpQfMO8bBZ6Tyb0+pL9E= github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= -github.com/tj/go-spin v1.1.0/go.mod h1:Mg1mzmePZm4dva8Qz60H2lHwmJ2loum4VIrLgVnKwh4= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= -github.com/tv42/httpunix v0.0.0-20191220191345-2ba4b9c3382c/go.mod h1:hzIxponao9Kjc7aWznkXaL4U4TWaDSs8zcsY4Ka08nM= github.com/uber/jaeger-client-go v2.15.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/uber/jaeger-client-go v2.23.1+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/uber/jaeger-client-go v2.25.0+incompatible h1:IxcNZ7WRY1Y3G4poYlx24szfsn/3LvK9QHCq9oQw8+U= @@ -1980,7 +1754,6 @@ github.com/uber/jaeger-lib v2.2.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6 github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli v1.22.2 h1:gsqYFH8bb9ekPA12kRo0hfjngWQjkJPlN9R0N78BoUo= github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli/v2 v2.0.0/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= github.com/urfave/cli/v2 v2.2.0/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= @@ -1994,9 +1767,7 @@ github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49u github.com/viant/toolbox v0.24.0/go.mod h1:OxMCG57V0PXuIP2HNQrtJf2CjqdmbrOx5EkMILuUhzM= github.com/wangjia184/sortedset v0.0.0-20160527075905-f5d03557ba30/go.mod h1:YkocrP2K2tcw938x9gCOmT5G5eCD6jsTz0SZuyAqwIE= github.com/warpfork/go-testmark v0.3.0/go.mod h1:jhEf8FVxd+F17juRubpmut64NEG6I2rgkUhlcqqXwE0= -github.com/warpfork/go-testmark v0.9.0/go.mod h1:jhEf8FVxd+F17juRubpmut64NEG6I2rgkUhlcqqXwE0= github.com/warpfork/go-testmark v0.10.0 h1:E86YlUMYfwIacEsQGlnTvjk1IgYkyTGjPhF0RnwTCmw= -github.com/warpfork/go-testmark v0.10.0/go.mod h1:jhEf8FVxd+F17juRubpmut64NEG6I2rgkUhlcqqXwE0= github.com/warpfork/go-wish v0.0.0-20180510122957-5ad1f5abf436/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= github.com/warpfork/go-wish v0.0.0-20190328234359-8b3e70f8e830/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= github.com/warpfork/go-wish v0.0.0-20200122115046-b9ea61034e4a h1:G++j5e0OC488te356JvdhaM8YS6nMsjLAYF7JxCv07w= @@ -2005,7 +1776,6 @@ github.com/weaveworks/common v0.0.0-20200512154658-384f10054ec5 h1:EYxr08r8x6r/5 github.com/weaveworks/common v0.0.0-20200512154658-384f10054ec5/go.mod h1:c98fKi5B9u8OsKGiWHLRKus6ToQ1Tubeow44ECO1uxY= github.com/weaveworks/promrus v1.2.0 h1:jOLf6pe6/vss4qGHjXmGz4oDJQA+AOCqEL3FvvZGz7M= github.com/weaveworks/promrus v1.2.0/go.mod h1:SaE82+OJ91yqjrE1rsvBWVzNZKcHYFtMUyS1+Ogs/KA= -github.com/whyrusleeping/base32 v0.0.0-20170828182744-c30ac30633cc/go.mod h1:r45hJU7yEoA81k6MWNhpMj/kms0n14dkzkxYHoB96UM= github.com/whyrusleeping/bencher v0.0.0-20190829221104-bb6607aa8bba h1:X4n8JG2e2biEZZXdBKt9HX7DN3bYGFUqljqqy0DqgnY= github.com/whyrusleeping/bencher v0.0.0-20190829221104-bb6607aa8bba/go.mod h1:CHQnYnQUEPydYCwuy8lmTHfGmdw9TKrhWV0xLx8l0oM= github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11 h1:5HZfQkwe0mIfyDmc1Em5GqlNRzcdtlv4HTNmdpt7XH0= @@ -2022,20 +1792,16 @@ github.com/whyrusleeping/cbor-gen v0.0.0-20200810223238-211df3b9e24c/go.mod h1:f github.com/whyrusleeping/cbor-gen v0.0.0-20200812213548-958ddffe352c/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20200826160007-0b9f6c5fb163/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20210118024343-169e9d70c0c2/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= -github.com/whyrusleeping/cbor-gen v0.0.0-20210219115102-f37d292932f2/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20210303213153-67a261a1d291/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= -github.com/whyrusleeping/cbor-gen v0.0.0-20220302191723-37c43cae8e14/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20220323183124-98fa8256a799 h1:DOOT2B85S0tHoLGTzV+FakaSSihgRCVwZkjqKQP5L/w= github.com/whyrusleeping/cbor-gen v0.0.0-20220323183124-98fa8256a799/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f h1:jQa4QT2UP9WYv2nzyawpKMOCl+Z/jW7djv2/J50lj9E= github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f/go.mod h1:p9UJB6dDgdPgMJZs7UjUOdulKyRr9fqkS+6JKAInPy8= -github.com/whyrusleeping/go-ctrlnet v0.0.0-20180313164037-f564fbbdaa95/go.mod h1:SJqKCCPXRfBFCwXjfNT/skfsceF7+MBFLI2OrvuRA7g= github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 h1:EKhdznlJHPMoKr0XTrX+IlJs1LH3lyx2nfr1dOlZ79k= github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1/go.mod h1:8UvriyWtv5Q5EOgjHaSseUEdkQfvwFv1I/In/O2M9gc= github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM= github.com/whyrusleeping/go-logging v0.0.1/go.mod h1:lDPYj54zutzG1XYfHAhcc7oNXEburHQBn+Iqd4yS4vE= github.com/whyrusleeping/go-notifier v0.0.0-20170827234753-097c5d47330f/go.mod h1:cZNvX9cFybI01GriPRMXDtczuvUhgbcYr9iCGaNlRv8= -github.com/whyrusleeping/go-sysinfo v0.0.0-20190219211824-4a357d4b90b1/go.mod h1:tKH72zYNt/exx6/5IQO6L9LoQ0rEjd5SbbWaDTs9Zso= github.com/whyrusleeping/ledger-filecoin-go v0.9.1-0.20201010031517-c3dcc1bddce4 h1:NwiwjQDB3CzQ5XH0rdMh1oQqzJH7O2PSLWxif/w3zsY= github.com/whyrusleeping/ledger-filecoin-go v0.9.1-0.20201010031517-c3dcc1bddce4/go.mod h1:K+EVq8d5QcQ2At5VECsA+SNZvWefyBXh8TnIsxo1OvQ= github.com/whyrusleeping/mafmt v1.2.8/go.mod h1:faQJFPbLSxzD9xpA02ttW/tS9vZykNvXwGvqIpk20FA= @@ -2047,21 +1813,17 @@ github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee h1:lYbXeSv github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee/go.mod h1:m2aV4LZI4Aez7dP5PMyVKEHhUyEJ/RjmPEDOpDvudHg= github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xlab/c-for-go v0.0.0-20201112171043-ea6dce5809cb/go.mod h1:pbNsDSxn1ICiNn9Ct4ZGNrwzfkkwYbx/lw8VuyutFIg= -github.com/xlab/pkgconfig v0.0.0-20170226114623-cea12a0fd245/go.mod h1:C+diUUz7pxhNY6KAoLgrTYARGWnt82zWTylZlxT92vk= github.com/xorcare/golden v0.6.0/go.mod h1:7T39/ZMvaSEZlBPoYfVFmsBLmUl3uz9IuzWj/U6FtvQ= github.com/xorcare/golden v0.6.1-0.20191112154924-b87f686d7542 h1:oWgZJmC1DorFZDpfMfWg7xk29yEOZiXmo/wZl+utTI8= github.com/xorcare/golden v0.6.1-0.20191112154924-b87f686d7542/go.mod h1:7T39/ZMvaSEZlBPoYfVFmsBLmUl3uz9IuzWj/U6FtvQ= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= -github.com/ybbus/jsonrpc/v2 v2.1.6/go.mod h1:rIuG1+ORoiqocf9xs/v+ecaAVeo3zcZHQgInyKFMeg0= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/zondax/hid v0.9.0 h1:eiT3P6vNxAEVxXMw66eZUAAnU2zD33JBkfG/EnfAKl8= github.com/zondax/hid v0.9.0/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= github.com/zondax/ledger-go v0.12.1 h1:hYRcyznPRJp+5mzF2sazTLP2nGvGjYDD2VzhHhFomLU= @@ -2078,10 +1840,6 @@ go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.4 h1:hi1bXHMVrlQh6WwxAy+qZCV/SYIlqo+Ushwdpa4tAKg= go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= -go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= @@ -2152,7 +1910,6 @@ go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= go.uber.org/zap v1.14.1/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= @@ -2181,15 +1938,12 @@ golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190618222545-ea8f1a30c443/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20190927123631-a832865fa7ad/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200128174031-69ecbb4d6d5d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200423211502-4bdfaf469ed5/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200602180216-279210d13fed/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -2197,24 +1951,15 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= -golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210813211128-0a44fdfbc16e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210915214749-c084706c2272/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211117183948-ae814b36b871/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20211209193657-4570a0811e8b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4 h1:kUhD7nTDoI3fVd9G4ORWrbV5NY0liEs/Jg2pv5f+bBA= golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20181106170214-d68db9428509/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190731235908-ec7cb31e5a56/go.mod h1:JhuoJpWY28nO4Vef9tZUw9qufEGTyX1+7lmHxV5q5G4= @@ -2229,7 +1974,6 @@ golang.org/x/exp v0.0.0-20210615023648-acb5c1269671/go.mod h1:DVyR6MI7P4kEQgvZJS golang.org/x/exp v0.0.0-20210714144626-1041f73d31d8/go.mod h1:DVyR6MI7P4kEQgvZJSj1fQGrWIi2RzIrfYWycwheUAc= golang.org/x/exp v0.0.0-20210715201039-d37aa40e8013 h1:Jp57DBw4K7mimZNA3F9f7CndVcUt4kJjmyJf2rzJHoI= golang.org/x/exp v0.0.0-20210715201039-d37aa40e8013/go.mod h1:DVyR6MI7P4kEQgvZJSj1fQGrWIi2RzIrfYWycwheUAc= -golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -2315,13 +2059,9 @@ golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLd golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210423184538-5f58ad60dda6/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20210505024714-0287a6fb4125/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210917221730-978cfadd31cf/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= @@ -2362,7 +2102,6 @@ golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190124100055-b90733256f2e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190130150945-aca44879d564/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -2384,12 +2123,10 @@ golang.org/x/sys v0.0.0-20190610200419-93c9922d18ae/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190902133755-9109b7679e13/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2400,7 +2137,6 @@ golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191206220618-eeba5f6aabab/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2438,7 +2174,6 @@ golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210317225723-c4fcb01b228e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210331175145-43e1dd70ce54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210426080607-c94f62235c83/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2450,13 +2185,9 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210903071746-97244b99971b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211025112917-711f33c9992c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211209171907-798191bca915/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220422013727-9388b58f7150 h1:xHms4gcpe1YE7A3yIllJXP16CMAGuqwO2lX1mTyyRRc= golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= @@ -2477,18 +2208,15 @@ golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac h1:7zkz7BUtwNFFqcowJ+RIgu2MaV/MapERkDIy+mwPyjs= golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030000716-a0a13e073c7b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181130052023-1c3d964395ce/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -2501,7 +2229,6 @@ golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -2536,7 +2263,6 @@ golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200711155855-7342f9734a7d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= @@ -2544,7 +2270,6 @@ golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.6-0.20210726203631-07bc1bf47fb2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.10 h1:QjFRCZxdOhBJ/UNgnBZLbNV13DlbnK0quyivTnXJM20= @@ -2555,10 +2280,6 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f h1:GGU+dLjvlC3qDwqYgL6UgRmHXhOOgns0bZu2Ty5mm6U= golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= -gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= -gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= -gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.1.0/go.mod h1:UGEZY7KEX120AnNLIHFMKIo4obdJhkp2tPbaPlQx13Y= @@ -2623,7 +2344,6 @@ google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7Fc google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4 h1:ysnBoUyeL/H6RCvNRhWHjKoDEmguI+mPU+qHgK8qv/w= google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= @@ -2651,7 +2371,6 @@ google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.45.0 h1:NEpgUqV3Z+ZjkqMsxMg11IaDrXY4RY6CQukSGK0uI1M= google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= @@ -2674,7 +2393,6 @@ gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLks gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= @@ -2685,7 +2403,6 @@ gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMy gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/src-d/go-cli.v0 v0.0.0-20181105080154-d492247bbc0d/go.mod h1:z+K8VcOYVYcSwSjGebuDL6176A1XskgbtNl64NSg+n8= gopkg.in/src-d/go-log.v1 v1.0.1/go.mod h1:GN34hKP0g305ysm2/hctJ0Y8nWP3zxXXJ8GFabTyABE= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= @@ -2722,22 +2439,10 @@ howett.net/plist v0.0.0-20181124034731-591f970eefbb/go.mod h1:vMygbs4qMhSZSc4lCU lukechampine.com/blake3 v1.1.6/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= lukechampine.com/blake3 v1.1.7 h1:GgRMhmdsuK8+ii6UZFDL8Nb+VyMwadAgcJyfYHxG6n0= lukechampine.com/blake3 v1.1.7/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= -modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= -modernc.org/fileutil v1.0.0/go.mod h1:JHsWpkrk/CnVV1H/eGlFf85BEpfkrp56ro8nojIq9Q8= -modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk= -modernc.org/golex v1.0.1/go.mod h1:QCA53QtsT1NdGkaZZkF5ezFwk4IXh4BGNafAARTC254= -modernc.org/lex v1.0.0/go.mod h1:G6rxMTy3cH2iA0iXL/HRRv4Znu8MK4higxph/lE7ypk= -modernc.org/lexer v1.0.0/go.mod h1:F/Dld0YKYdZCLQ7bD0USbWL4YKCyTDRDHiDTOs0q0vk= -modernc.org/mathutil v1.1.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/strutil v1.1.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs= -modernc.org/xc v1.0.0/go.mod h1:mRNCo0bvLjGhHO9WsyuKVU4q0ceiDDDoEeWDJHrNx8I= -pgregory.net/rapid v0.4.7/go.mod h1:UYpPVyjFHzYBGHIxLFoupi8vwk6rXNzRY9OMvVxFIOU= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= sourcegraph.com/sourcegraph/go-diff v0.5.0/go.mod h1:kuch7UrkMzY0X+p9CRK03kfuPQ2zzQcaEFbx8wA8rck= sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= From 736b492fb035847adec7d44112a0a1c4e2624cdf Mon Sep 17 00:00:00 2001 From: Shrenuj Bansal Date: Wed, 17 Aug 2022 16:09:30 -0400 Subject: [PATCH 046/185] Change go version in dockerfile --- Dockerfile.lotus | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile.lotus b/Dockerfile.lotus index 3e35f1c0c..2f139a3c4 100644 --- a/Dockerfile.lotus +++ b/Dockerfile.lotus @@ -1,4 +1,4 @@ -FROM golang:1.17.9-buster AS builder-deps +FROM golang:1.18.1-buster AS builder-deps MAINTAINER Lotus Development Team RUN apt-get update && apt-get install -y ca-certificates build-essential clang ocl-icd-opencl-dev ocl-icd-libopencl1 jq libhwloc-dev From 52bae8d37d1042a4c8acfdedc1bf495b930b283e Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Thu, 18 Aug 2022 09:31:14 -0400 Subject: [PATCH 047/185] when availabel balance is negative, exclude from spendable amount --- cmd/lotus-miner/info.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/cmd/lotus-miner/info.go b/cmd/lotus-miner/info.go index 2c3e29b29..398d030a5 100644 --- a/cmd/lotus-miner/info.go +++ b/cmd/lotus-miner/info.go @@ -292,7 +292,10 @@ func handleMiningInfo(ctx context.Context, cctx *cli.Context, fullapi v0api.Full if err != nil { return xerrors.Errorf("getting available balance: %w", err) } - spendable = big.Add(spendable, availBalance) + + if availBalance.GreaterThan(big.Zero()) { + spendable = big.Add(spendable, availBalance) + } fmt.Printf("Miner Balance: %s\n", color.YellowString("%s", types.FIL(mact.Balance).Short())) fmt.Printf(" PreCommit: %s\n", types.FIL(lockedFunds.PreCommitDeposits).Short()) From 87b82b95c8fcf88be7b95ced2e72007834e92de3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 18 Aug 2022 11:03:26 -0400 Subject: [PATCH 048/185] feat: sectors renew --only-cc --- cmd/lotus-miner/sectors.go | 8 ++++++++ documentation/en/cli-lotus-miner.md | 1 + 2 files changed, 9 insertions(+) diff --git a/cmd/lotus-miner/sectors.go b/cmd/lotus-miner/sectors.go index be5623c27..e749e5590 100644 --- a/cmd/lotus-miner/sectors.go +++ b/cmd/lotus-miner/sectors.go @@ -796,6 +796,10 @@ var sectorsRenewCmd = &cli.Command{ Name: "new-expiration", Usage: "try to extend selected sectors to this epoch, ignoring extension", }, + &cli.BoolFlag{ + Name: "only-cc", + Usage: "only extend CC sectors (useful for making sector ready for snap upgrade)", + }, &cli.Int64Flag{ Name: "tolerance", Usage: "don't try to extend sectors by fewer than this number of epochs, defaults to 7 days", @@ -931,6 +935,10 @@ var sectorsRenewCmd = &cli.Command{ } for _, si := range activeSet { + if len(si.DealIDs) > 0 && cctx.Bool("only-cc") { + continue + } + if si.Expiration >= from && si.Expiration <= to { if _, exclude := excludeSet[uint64(si.SectorNumber)]; !exclude { sis = append(sis, si) diff --git a/documentation/en/cli-lotus-miner.md b/documentation/en/cli-lotus-miner.md index c23e4bb30..bb1bacf4b 100644 --- a/documentation/en/cli-lotus-miner.md +++ b/documentation/en/cli-lotus-miner.md @@ -1789,6 +1789,7 @@ OPTIONS: --from value only consider sectors whose current expiration epoch is in the range of [from, to], defaults to: now + 120 (1 hour) (default: 0) --max-fee value use up to this amount of FIL for one message. pass this flag to avoid message congestion. (default: "0") --new-expiration value try to extend selected sectors to this epoch, ignoring extension (default: 0) + --only-cc only extend CC sectors (useful for making sector ready for snap upgrade) (default: false) --really-do-it pass this flag to really renew sectors, otherwise will only print out json representation of parameters (default: false) --sector-file value provide a file containing one sector number in each line, ignoring above selecting criteria --to value only consider sectors whose current expiration epoch is in the range of [from, to], defaults to: now + 92160 (32 days) (default: 0) From 00975237b1312eed7a203708e1d938162719eac6 Mon Sep 17 00:00:00 2001 From: Shrenuj Bansal Date: Thu, 18 Aug 2022 15:57:59 -0400 Subject: [PATCH 049/185] Add retries for specific types of errors --- lib/retry/retry.go | 15 +++++++++++++-- node/modules/storageminer.go | 4 +++- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/lib/retry/retry.go b/lib/retry/retry.go index c7d269a22..0f53fe91e 100644 --- a/lib/retry/retry.go +++ b/lib/retry/retry.go @@ -1,6 +1,7 @@ package retry import ( + "errors" "time" logging "github.com/ipfs/go-log/v2" @@ -8,7 +9,17 @@ import ( var log = logging.Logger("retry") -func Retry[T any](attempts int, sleep int, f func() (T, error)) (result T, err error) { +func errorIsIn(err error, errorTypes []error) bool { + for _, etype := range errorTypes { + tmp := etype + if errors.As(err, &tmp) { + return true + } + } + return false +} + +func Retry[T any](attempts int, sleep int, errorTypes []error, f func() (T, error)) (result T, err error) { for i := 0; i < attempts; i++ { if i > 0 { log.Info("Retrying after error:", err) @@ -16,7 +27,7 @@ func Retry[T any](attempts int, sleep int, f func() (T, error)) (result T, err e sleep *= 2 } result, err = f() - if err == nil { + if err == nil || !errorIsIn(err, errorTypes) { return result, nil } } diff --git a/node/modules/storageminer.go b/node/modules/storageminer.go index 0875d3935..36ddeffab 100644 --- a/node/modules/storageminer.go +++ b/node/modules/storageminer.go @@ -5,6 +5,7 @@ import ( "context" "errors" "fmt" + "github.com/filecoin-project/go-jsonrpc" "net/http" "os" "path/filepath" @@ -90,7 +91,8 @@ func (a *UuidWrapper) MpoolPushMessage(ctx context.Context, msg *types.Message, spec = new(api.MessageSendSpec) } spec.MsgUuid = uuid.New() - return retry.Retry(5, 1, func() (*types.SignedMessage, error) { return a.FullNode.MpoolPushMessage(ctx, msg, spec) }) + errorsToRetry := []error{&jsonrpc.RPCConnectionError{}} + return retry.Retry(5, 1, errorsToRetry, func() (*types.SignedMessage, error) { return a.FullNode.MpoolPushMessage(ctx, msg, spec) }) } func MakeUuidWrapper(a v1api.RawFullNodeAPI) v1api.FullNode { From 7c404d8b5e76b0d1816fabcc917c5a458708323f Mon Sep 17 00:00:00 2001 From: Shrenuj Bansal Date: Thu, 18 Aug 2022 17:55:56 -0400 Subject: [PATCH 050/185] fix error type comparison --- lib/retry/retry.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/retry/retry.go b/lib/retry/retry.go index 0f53fe91e..ef54e10b2 100644 --- a/lib/retry/retry.go +++ b/lib/retry/retry.go @@ -2,6 +2,7 @@ package retry import ( "errors" + "reflect" "time" logging "github.com/ipfs/go-log/v2" @@ -11,8 +12,8 @@ var log = logging.Logger("retry") func errorIsIn(err error, errorTypes []error) bool { for _, etype := range errorTypes { - tmp := etype - if errors.As(err, &tmp) { + tmp := reflect.New(reflect.PointerTo(reflect.ValueOf(etype).Elem().Type())).Interface() + if errors.As(err, tmp) { return true } } From 12abc7464012e7db3496ed36ce450a8c3ba94632 Mon Sep 17 00:00:00 2001 From: Shrenuj Bansal Date: Thu, 18 Aug 2022 18:10:57 -0400 Subject: [PATCH 051/185] update jsonrpc deps --- go.mod | 2 +- go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 2d4e3c0b4..4cfc113e6 100644 --- a/go.mod +++ b/go.mod @@ -38,7 +38,7 @@ require ( github.com/filecoin-project/go-fil-commcid v0.1.0 github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 github.com/filecoin-project/go-fil-markets v1.23.1 - github.com/filecoin-project/go-jsonrpc v0.1.5 + github.com/filecoin-project/go-jsonrpc v0.1.7-0.20220818202438-3dabc3d89d31 github.com/filecoin-project/go-legs v0.4.4 github.com/filecoin-project/go-padreader v0.0.1 github.com/filecoin-project/go-paramfetch v0.0.4 diff --git a/go.sum b/go.sum index 7b5dd31ac..2dcbb2276 100644 --- a/go.sum +++ b/go.sum @@ -334,6 +334,8 @@ github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0 h1:rVVNq0x6RGQIzCo1iiJlGFm9AG github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0/go.mod h1:bxmzgT8tmeVQA1/gvBwFmYdT8SOFUwB3ovSUfG1Ux0g= github.com/filecoin-project/go-jsonrpc v0.1.5 h1:ckxqZ09ivBAVf5CSmxxrqqNHC7PJm3GYGtYKiNQ+vGk= github.com/filecoin-project/go-jsonrpc v0.1.5/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= +github.com/filecoin-project/go-jsonrpc v0.1.7-0.20220818202438-3dabc3d89d31 h1:rSi64b/nzAu4vdGVNxzfbWZiXQmeAv8RQJvcEJnuwz4= +github.com/filecoin-project/go-jsonrpc v0.1.7-0.20220818202438-3dabc3d89d31/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= github.com/filecoin-project/go-legs v0.4.4 h1:mpMmAOOnamaz0CV9rgeKhEWA8j9kMC+f+UGCGrxKaZo= github.com/filecoin-project/go-legs v0.4.4/go.mod h1:JQ3hA6xpJdbR8euZ2rO0jkxaMxeidXf0LDnVuqPAe9s= github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20/go.mod h1:mPn+LRRd5gEKNAtc+r3ScpW2JRU/pj4NBKdADYWHiak= From afb4b1b68fa6759ce55f09500d25f57df7c49d03 Mon Sep 17 00:00:00 2001 From: Shrenuj Bansal Date: Thu, 18 Aug 2022 18:23:42 -0400 Subject: [PATCH 052/185] mod tidy and fiximports --- go.sum | 2 -- node/modules/storageminer.go | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/go.sum b/go.sum index 2dcbb2276..bae83c013 100644 --- a/go.sum +++ b/go.sum @@ -332,8 +332,6 @@ github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0/go.mod h1:7aWZdaQ1b16BVoQUYR+ github.com/filecoin-project/go-hamt-ipld/v3 v3.0.1/go.mod h1:gXpNmr3oQx8l3o7qkGyDjJjYSRX7hp/FGOStdqrWyDI= github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0 h1:rVVNq0x6RGQIzCo1iiJlGFm9AGIZzeifggxtKMU7zmI= github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0/go.mod h1:bxmzgT8tmeVQA1/gvBwFmYdT8SOFUwB3ovSUfG1Ux0g= -github.com/filecoin-project/go-jsonrpc v0.1.5 h1:ckxqZ09ivBAVf5CSmxxrqqNHC7PJm3GYGtYKiNQ+vGk= -github.com/filecoin-project/go-jsonrpc v0.1.5/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= github.com/filecoin-project/go-jsonrpc v0.1.7-0.20220818202438-3dabc3d89d31 h1:rSi64b/nzAu4vdGVNxzfbWZiXQmeAv8RQJvcEJnuwz4= github.com/filecoin-project/go-jsonrpc v0.1.7-0.20220818202438-3dabc3d89d31/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= github.com/filecoin-project/go-legs v0.4.4 h1:mpMmAOOnamaz0CV9rgeKhEWA8j9kMC+f+UGCGrxKaZo= diff --git a/node/modules/storageminer.go b/node/modules/storageminer.go index 36ddeffab..2f76a9559 100644 --- a/node/modules/storageminer.go +++ b/node/modules/storageminer.go @@ -5,7 +5,6 @@ import ( "context" "errors" "fmt" - "github.com/filecoin-project/go-jsonrpc" "net/http" "os" "path/filepath" @@ -38,6 +37,7 @@ import ( storageimpl "github.com/filecoin-project/go-fil-markets/storagemarket/impl" "github.com/filecoin-project/go-fil-markets/storagemarket/impl/storedask" smnet "github.com/filecoin-project/go-fil-markets/storagemarket/network" + "github.com/filecoin-project/go-jsonrpc" "github.com/filecoin-project/go-jsonrpc/auth" "github.com/filecoin-project/go-paramfetch" "github.com/filecoin-project/go-state-types/abi" From 656f4d5101c71a7721ae571b0582dee9103de4c2 Mon Sep 17 00:00:00 2001 From: Phi Date: Fri, 19 Aug 2022 12:27:09 +0200 Subject: [PATCH 053/185] Output bytes in `lotus client commP` cmd Adds an additional line that outputs bytes in the `lotus client commP` cmd. Resolves #9188 --- cli/client.go | 1 + 1 file changed, 1 insertion(+) diff --git a/cli/client.go b/cli/client.go index c321bfec5..b4c8f5708 100644 --- a/cli/client.go +++ b/cli/client.go @@ -228,6 +228,7 @@ var clientCommPCmd = &cli.Command{ fmt.Println("CID: ", encoder.Encode(ret.Root)) fmt.Println("Piece size: ", types.SizeStr(types.NewInt(uint64(ret.Size)))) + fmt.Println("Piece size in bytes: ", types.NewInt(uint64(ret.Size))) return nil }, } From 87edaa3f06dc3cdbb7f7dd144ecf4b9fb6980167 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 19 Aug 2022 11:24:51 -0400 Subject: [PATCH 054/185] deps: use tagged markets --- go.mod | 4 +--- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index c70dbcdfb..5afa228cd 100644 --- a/go.mod +++ b/go.mod @@ -37,7 +37,7 @@ require ( github.com/filecoin-project/go-data-transfer v1.15.2 github.com/filecoin-project/go-fil-commcid v0.1.0 github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 - github.com/filecoin-project/go-fil-markets v1.23.1 + github.com/filecoin-project/go-fil-markets v1.24.0 github.com/filecoin-project/go-jsonrpc v0.1.5 github.com/filecoin-project/go-legs v0.4.4 github.com/filecoin-project/go-padreader v0.0.1 @@ -340,6 +340,4 @@ require ( replace github.com/filecoin-project/filecoin-ffi => ./extern/filecoin-ffi -replace github.com/filecoin-project/go-fil-markets => github.com/marcopolo/go-fil-markets v1.23.1-0.20220811180806-b8e84162b48e - replace github.com/filecoin-project/test-vectors => ./extern/test-vectors diff --git a/go.sum b/go.sum index 5bd8e4e12..7394d9913 100644 --- a/go.sum +++ b/go.sum @@ -358,6 +358,8 @@ github.com/filecoin-project/go-fil-commcid v0.1.0 h1:3R4ds1A9r6cr8mvZBfMYxTS88Oq github.com/filecoin-project/go-fil-commcid v0.1.0/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 h1:imrrpZWEHRnNqqv0tN7LXep5bFEVOVmQWHJvl2mgsGo= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0/go.mod h1:73S8WSEWh9vr0fDJVnKADhfIv/d6dCbAGaAGWbdJEI8= +github.com/filecoin-project/go-fil-markets v1.24.0 h1:SgZ9JU3vp7YubyTitEQK8hwEMm1l2Pko01jejviOKMA= +github.com/filecoin-project/go-fil-markets v1.24.0/go.mod h1:ZOPAjEUia7H60F7p0kEupi0FR7Hy4Zfz90BpR1TMBwI= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= @@ -1535,8 +1537,6 @@ github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN github.com/mailru/easyjson v0.7.1/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA= github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/marcopolo/go-fil-markets v1.23.1-0.20220811180806-b8e84162b48e h1:eItqdWJLVVGhsEuAFcYYaOHVsVd2Fdy5D/tn91nHlaE= -github.com/marcopolo/go-fil-markets v1.23.1-0.20220811180806-b8e84162b48e/go.mod h1:ZOPAjEUia7H60F7p0kEupi0FR7Hy4Zfz90BpR1TMBwI= github.com/marten-seemann/qpack v0.2.1/go.mod h1:F7Gl5L1jIgN1D11ucXefiuJS9UMVP2opoCp2jDKb7wc= github.com/marten-seemann/qtls v0.2.3/go.mod h1:xzjG7avBwGGbdZ8dTGxlBnLArsVKLvwmjgmPuiQEcYk= github.com/marten-seemann/qtls v0.10.0/go.mod h1:UvMd1oaYDACI99/oZUYLzMCkBXQVT0aGm99sJhbT8hs= From 9112470785af58be258139e20180ee2005772e68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 19 Aug 2022 11:31:51 -0400 Subject: [PATCH 055/185] deps: use tagged kad-dht --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 5afa228cd..eba6ed097 100644 --- a/go.mod +++ b/go.mod @@ -112,7 +112,7 @@ require ( github.com/libp2p/go-eventbus v0.2.1 github.com/libp2p/go-libp2p v0.21.0 github.com/libp2p/go-libp2p-core v0.19.1 - github.com/libp2p/go-libp2p-kad-dht v0.16.1-0.20220811151450-6a2603e9927e + github.com/libp2p/go-libp2p-kad-dht v0.17.0 github.com/libp2p/go-libp2p-peerstore v0.7.1 github.com/libp2p/go-libp2p-pubsub v0.7.1 github.com/libp2p/go-libp2p-record v0.1.3 diff --git a/go.sum b/go.sum index 7394d9913..f45166152 100644 --- a/go.sum +++ b/go.sum @@ -1240,8 +1240,8 @@ github.com/libp2p/go-libp2p-interface-connmgr v0.0.5/go.mod h1:GarlRLH0LdeWcLnYM github.com/libp2p/go-libp2p-interface-pnet v0.0.1/go.mod h1:el9jHpQAXK5dnTpKA4yfCNBZXvrzdOU75zz+C6ryp3k= github.com/libp2p/go-libp2p-kad-dht v0.2.1/go.mod h1:k7ONOlup7HKzQ68dE6lSnp07cdxdkmnRa+6B4Fh9/w0= github.com/libp2p/go-libp2p-kad-dht v0.15.0/go.mod h1:rZtPxYu1TnHHz6n1RggdGrxUX/tA1C2/Wiw3ZMUDrU0= -github.com/libp2p/go-libp2p-kad-dht v0.16.1-0.20220811151450-6a2603e9927e h1:5zZOxnbjc8RHXIVEC1qsZEgpbVow54zNZrL3zyVCsI4= -github.com/libp2p/go-libp2p-kad-dht v0.16.1-0.20220811151450-6a2603e9927e/go.mod h1:zeE26Xo+PY7sS2AgkBQQcBnJEazMT26KGZLUFttl+rk= +github.com/libp2p/go-libp2p-kad-dht v0.17.0 h1:HWEjqjNVDuf8yuccuswGy1vYGzB0v4Z+yQ4DMDMSIqk= +github.com/libp2p/go-libp2p-kad-dht v0.17.0/go.mod h1:zeE26Xo+PY7sS2AgkBQQcBnJEazMT26KGZLUFttl+rk= github.com/libp2p/go-libp2p-kbucket v0.2.1/go.mod h1:/Rtu8tqbJ4WQ2KTCOMJhggMukOLNLNPY1EtEWWLxUvc= github.com/libp2p/go-libp2p-kbucket v0.3.1/go.mod h1:oyjT5O7tS9CQurok++ERgc46YLwEpuGoFq9ubvoUOio= github.com/libp2p/go-libp2p-kbucket v0.4.7 h1:spZAcgxifvFZHBD8tErvppbnNiKA5uokDu3CV7axu70= From 5a12e58c0cba25c4778169aa007d91a8876f4077 Mon Sep 17 00:00:00 2001 From: Shrenuj Bansal Date: Fri, 19 Aug 2022 11:33:37 -0400 Subject: [PATCH 056/185] Return error for non retryable errors --- lib/retry/retry.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/retry/retry.go b/lib/retry/retry.go index ef54e10b2..a83212665 100644 --- a/lib/retry/retry.go +++ b/lib/retry/retry.go @@ -29,7 +29,7 @@ func Retry[T any](attempts int, sleep int, errorTypes []error, f func() (T, erro } result, err = f() if err == nil || !errorIsIn(err, errorTypes) { - return result, nil + return result, err } } log.Errorf("Failed after %d attempts, last error: %s", attempts, err) From f86ce88d3d059dc754aa46a63a6e0c4a4a65d29f Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Sun, 21 Aug 2022 22:33:24 -0400 Subject: [PATCH 057/185] add cmd for adding signers to vkh to genesis --- cmd/lotus-seed/genesis.go | 87 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) diff --git a/cmd/lotus-seed/genesis.go b/cmd/lotus-seed/genesis.go index 5c3ac5ff1..9f0a8f7dc 100644 --- a/cmd/lotus-seed/genesis.go +++ b/cmd/lotus-seed/genesis.go @@ -42,6 +42,7 @@ var genesisCmd = &cli.Command{ genesisSetRemainderCmd, genesisSetActorVersionCmd, genesisCarCmd, + genesisSetVRKSignersCmd, }, } @@ -581,3 +582,89 @@ var genesisCarCmd = &cli.Command{ return err }, } + +var genesisSetVRKSignersCmd = &cli.Command{ + Name: "set-signers", + Usage: "", + Flags: []cli.Flag{ + &cli.IntFlag{ + Name: "threshold", + Usage: "change the verifreg signer threshold", + }, + &cli.StringSliceFlag{ + Name: "signers", + Usage: "verifreg signers", + }, + }, + Action: func(cctx *cli.Context) error { + if cctx.Args().Len() != 1 { + return fmt.Errorf("must specify template file") + } + + genf, err := homedir.Expand(cctx.Args().First()) + if err != nil { + return err + } + + var template genesis.Template + b, err := ioutil.ReadFile(genf) + if err != nil { + return xerrors.Errorf("read genesis template: %w", err) + } + + if err := json.Unmarshal(b, &template); err != nil { + return xerrors.Errorf("unmarshal genesis template: %w", err) + } + + var signers []address.Address + var rootkeyMultisig genesis.MultisigMeta + if cctx.IsSet("signers") { + for _, s := range cctx.StringSlice("signers") { + signer, err := address.NewFromString(s) + if err != nil { + return err + } + signers = append(signers, signer) + template.Accounts = append(template.Accounts, genesis.Actor{ + Type: genesis.TAccount, + Balance: big.Mul(big.NewInt(50_000), big.NewInt(int64(build.FilecoinPrecision))), + Meta: (&genesis.AccountMeta{Owner: signer}).ActorMeta(), + }) + } + rootkeyMultisig = genesis.MultisigMeta{ + Signers: signers, + Threshold: 1, + VestingDuration: 0, + VestingStart: 0, + } + + } + + if cctx.IsSet("threshold") { + rootkeyMultisig = genesis.MultisigMeta{ + Signers: signers, + Threshold: cctx.Int("threshold"), + VestingDuration: 0, + VestingStart: 0, + } + } + + newVrk := genesis.Actor{ + Type: genesis.TMultisig, + Balance: big.NewInt(0), + Meta: rootkeyMultisig.ActorMeta(), + } + + template.VerifregRootKey = newVrk + + b, err = json.MarshalIndent(&template, "", " ") + if err != nil { + return err + } + + if err := ioutil.WriteFile(genf, b, 0644); err != nil { + return err + } + return nil + }, +} From ca72590e49744a142247356ecc37906b45519c75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 17 Aug 2022 11:53:44 -0400 Subject: [PATCH 058/185] sealing: Use bitfields to manage sector numbers --- cmd/lotus-miner/init.go | 2 +- cmd/lotus-miner/sectors_test.go | 1 + itests/kit/ensemble.go | 2 +- node/builder_miner.go | 1 - node/modules/storageminer.go | 22 +----- storage/pipeline/input.go | 2 +- storage/pipeline/numassign.go | 1 + storage/pipeline/sealing.go | 125 +++++++++++++++++++++++++++++++- storage/pipeline/types.go | 4 - 9 files changed, 129 insertions(+), 31 deletions(-) create mode 100644 cmd/lotus-miner/sectors_test.go create mode 100644 storage/pipeline/numassign.go diff --git a/cmd/lotus-miner/init.go b/cmd/lotus-miner/init.go index fc7dc03f6..72a1e9056 100644 --- a/cmd/lotus-miner/init.go +++ b/cmd/lotus-miner/init.go @@ -387,7 +387,7 @@ func migratePreSealMeta(ctx context.Context, api v1api.FullNode, metadata string buf := make([]byte, binary.MaxVarintLen64) size := binary.PutUvarint(buf, uint64(maxSectorID)) - return mds.Put(ctx, datastore.NewKey(modules.StorageCounterDSPrefix), buf[:size]) + return mds.Put(ctx, datastore.NewKey(pipeline.StorageCounterDSPrefix), buf[:size]) } func findMarketDealID(ctx context.Context, api v1api.FullNode, deal market8.DealProposal) (abi.DealID, error) { diff --git a/cmd/lotus-miner/sectors_test.go b/cmd/lotus-miner/sectors_test.go new file mode 100644 index 000000000..06ab7d0f9 --- /dev/null +++ b/cmd/lotus-miner/sectors_test.go @@ -0,0 +1 @@ +package main diff --git a/itests/kit/ensemble.go b/itests/kit/ensemble.go index 8ad7a2394..2bf6b7ee0 100644 --- a/itests/kit/ensemble.go +++ b/itests/kit/ensemble.go @@ -992,5 +992,5 @@ func importPreSealMeta(ctx context.Context, meta genesis.Miner, mds dtypes.Metad buf := make([]byte, binary.MaxVarintLen64) size := binary.PutUvarint(buf, uint64(maxSectorID)) - return mds.Put(ctx, datastore.NewKey(modules.StorageCounterDSPrefix), buf[:size]) + return mds.Put(ctx, datastore.NewKey(pipeline.StorageCounterDSPrefix), buf[:size]) } diff --git a/node/builder_miner.go b/node/builder_miner.go index be318c447..a3eb9a7ec 100644 --- a/node/builder_miner.go +++ b/node/builder_miner.go @@ -108,7 +108,6 @@ func ConfigStorageMiner(c interface{}) Option { Override(new(storiface.ProverPoSt), From(new(sectorstorage.SectorManager))), // Sealing (todo should be under EnableSealing, but storagefsm is currently bundled with storage.Miner) - Override(new(sealing.SectorIDCounter), modules.SectorIDCounter), Override(GetParamsKey, modules.GetParams), Override(new(dtypes.SetSealingConfigFunc), modules.NewSetSealConfigFunc), diff --git a/node/modules/storageminer.go b/node/modules/storageminer.go index 4bb373e75..f8e170fb0 100644 --- a/node/modules/storageminer.go +++ b/node/modules/storageminer.go @@ -42,7 +42,6 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-statestore" - "github.com/filecoin-project/go-storedcounter" provider "github.com/filecoin-project/index-provider" "github.com/filecoin-project/lotus/api" @@ -76,8 +75,7 @@ import ( ) var ( - StorageCounterDSPrefix = "/storage/nextid" - StagingAreaDirName = "deal-staging" + StagingAreaDirName = "deal-staging" ) type UuidWrapper struct { @@ -155,20 +153,6 @@ func SealProofType(maddr dtypes.MinerAddress, fnapi v1api.FullNode) (abi.Registe return miner.PreferredSealProofTypeFromWindowPoStType(networkVersion, mi.WindowPoStProofType) } -type sidsc struct { - sc *storedcounter.StoredCounter -} - -func (s *sidsc) Next() (abi.SectorNumber, error) { - i, err := s.sc.Next() - return abi.SectorNumber(i), err -} - -func SectorIDCounter(ds dtypes.MetadataDS) sealing.SectorIDCounter { - sc := storedcounter.New(ds, datastore.NewKey(StorageCounterDSPrefix)) - return &sidsc{sc} -} - func AddressSelector(addrConf *config.MinerAddressConfig) func() (*ctladdr.AddressSelector, error) { return func() (*ctladdr.AddressSelector, error) { as := &ctladdr.AddressSelector{} @@ -257,7 +241,6 @@ type SealingPipelineParams struct { API v1api.FullNode MetadataDS dtypes.MetadataDS Sealer sealer.SectorManager - SectorIDCounter sealing.SectorIDCounter Verifier storiface.Verifier Prover storiface.Prover GetSealingConfigFn dtypes.GetSealingConfigFunc @@ -274,7 +257,6 @@ func SealingPipeline(fc config.MinerFeeConfig) func(params SealingPipelineParams lc = params.Lifecycle api = params.API sealer = params.Sealer - sc = params.SectorIDCounter verif = params.Verifier prover = params.Prover gsd = params.GetSealingConfigFn @@ -297,7 +279,7 @@ func SealingPipeline(fc config.MinerFeeConfig) func(params SealingPipelineParams provingBuffer := md.WPoStProvingPeriod * 2 pcp := sealing.NewBasicPreCommitPolicy(api, gsd, provingBuffer) - pipeline := sealing.New(ctx, api, fc, evts, maddr, ds, sealer, sc, verif, prover, &pcp, gsd, j, as) + pipeline := sealing.New(ctx, api, fc, evts, maddr, ds, sealer, verif, prover, &pcp, gsd, j, as) lc.Append(fx.Hook{ OnStart: func(context.Context) error { diff --git a/storage/pipeline/input.go b/storage/pipeline/input.go index a95e9cbf7..c7af7783e 100644 --- a/storage/pipeline/input.go +++ b/storage/pipeline/input.go @@ -626,7 +626,7 @@ func (m *Sealing) maybeUpgradeSector(ctx context.Context, sp abi.RegisteredSealP // call with m.inputLk func (m *Sealing) createSector(ctx context.Context, cfg sealiface.Config, sp abi.RegisteredSealProof) (abi.SectorNumber, error) { - sid, err := m.sc.Next() + sid, err := m.NextSectorNumber(ctx) if err != nil { return 0, xerrors.Errorf("getting sector number: %w", err) } diff --git a/storage/pipeline/numassign.go b/storage/pipeline/numassign.go new file mode 100644 index 000000000..f4f7d74cd --- /dev/null +++ b/storage/pipeline/numassign.go @@ -0,0 +1 @@ +package sealing diff --git a/storage/pipeline/sealing.go b/storage/pipeline/sealing.go index 6bc5f508d..4a514b5d1 100644 --- a/storage/pipeline/sealing.go +++ b/storage/pipeline/sealing.go @@ -1,7 +1,9 @@ package sealing import ( + "bytes" "context" + "encoding/binary" "sync" "time" @@ -12,6 +14,8 @@ import ( "golang.org/x/xerrors" "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-bitfield" + rlepluslazy "github.com/filecoin-project/go-bitfield/rle" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-state-types/builtin/v8/miner" @@ -19,6 +23,7 @@ import ( "github.com/filecoin-project/go-state-types/dline" "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/go-statemachine" + "github.com/filecoin-project/go-storedcounter" "github.com/filecoin-project/lotus/api" lminer "github.com/filecoin-project/lotus/chain/actors/builtin/miner" @@ -35,6 +40,9 @@ import ( const SectorStorePrefix = "/sectors" +var StorageCounterDSPrefix = "/storage/nextid" +var SectorBitfieldsDSPrefix = "/storage/sectors/" + var ErrTooManySectorsSealing = xerrors.New("too many sectors sealing") var log = logging.Logger("sectors") @@ -87,6 +95,8 @@ type Sealing struct { Api SealingAPI DealInfo *CurrentDealInfoManager + ds datastore.Batching + feeCfg config.MinerFeeConfig events Events @@ -96,7 +106,6 @@ type Sealing struct { sealer sealer.SectorManager sectors *statemachine.StateGroup - sc SectorIDCounter verif storiface.Verifier pcp PreCommitPolicy @@ -120,6 +129,9 @@ type Sealing struct { precommiter *PreCommitBatcher commiter *CommitBatcher + sclk sync.Mutex + legacySc *storedcounter.StoredCounter + getConfig dtypes.GetSealingConfigFunc } @@ -161,17 +173,18 @@ type pendingPiece struct { accepted func(abi.SectorNumber, abi.UnpaddedPieceSize, error) } -func New(mctx context.Context, api SealingAPI, fc config.MinerFeeConfig, events Events, maddr address.Address, ds datastore.Batching, sealer sealer.SectorManager, sc SectorIDCounter, verif storiface.Verifier, prov storiface.Prover, pcp PreCommitPolicy, gc dtypes.GetSealingConfigFunc, journal journal.Journal, addrSel AddressSelector) *Sealing { +func New(mctx context.Context, api SealingAPI, fc config.MinerFeeConfig, events Events, maddr address.Address, ds datastore.Batching, sealer sealer.SectorManager, verif storiface.Verifier, prov storiface.Prover, pcp PreCommitPolicy, gc dtypes.GetSealingConfigFunc, journal journal.Journal, addrSel AddressSelector) *Sealing { s := &Sealing{ Api: api, DealInfo: &CurrentDealInfoManager{api}, + ds: ds, + feeCfg: fc, events: events, maddr: maddr, sealer: sealer, - sc: sc, verif: verif, pcp: pcp, @@ -193,6 +206,8 @@ func New(mctx context.Context, api SealingAPI, fc config.MinerFeeConfig, events getConfig: gc, + legacySc: storedcounter.New(ds, datastore.NewKey(StorageCounterDSPrefix)), + stats: SectorStats{ bySector: map[abi.SectorID]SectorState{}, byState: map[SectorState]int64{}, @@ -314,3 +329,107 @@ func getDealPerSectorLimit(size abi.SectorSize) (int, error) { } return 512, nil } + +func (m *Sealing) loadBitField(ctx context.Context, name string) (*bitfield.BitField, error) { + raw, err := m.ds.Get(ctx, datastore.NewKey(SectorBitfieldsDSPrefix+name)) + if err == datastore.ErrNotFound { + return nil, nil + } + if err != nil { + return nil, err + } + var bf bitfield.BitField + + if err := bf.UnmarshalCBOR(bytes.NewBuffer(raw)); err != nil { + return nil, err + } + return &bf, nil +} + +func (m *Sealing) saveBitField(ctx context.Context, name string, bf *bitfield.BitField) error { + var bb bytes.Buffer + err := bf.MarshalCBOR(&bb) + if err != nil { + return err + } + return m.ds.Put(ctx, datastore.NewKey(SectorBitfieldsDSPrefix+name), bb.Bytes()) +} + +func (m *Sealing) NextSectorNumber(ctx context.Context) (abi.SectorNumber, error) { + m.sclk.Lock() + defer m.sclk.Unlock() + + reserved, err := m.loadBitField(ctx, "reserved") + if err != nil { + return 0, err + } + allocated, err := m.loadBitField(ctx, "allocated") + if err != nil { + return 0, err + } + + if allocated == nil { + i, err := m.legacySc.Next() + if err != nil { + return 0, err + } + + rl := &rlepluslazy.RunSliceIterator{Runs: []rlepluslazy.Run{ + { + Val: true, + Len: i, + }, + }} + + bf, err := bitfield.NewFromIter(rl) + if err != nil { + return 0, err + } + allocated = &bf + } + + if reserved == nil { + reserved = allocated + } + + // todo union with miner allocated nums + inuse, err := bitfield.MergeBitFields(*reserved, *allocated) + if err != nil { + return 0, err + } + + iri, err := inuse.RunIterator() + if err != nil { + return 0, err + } + + var firstFree abi.SectorNumber + for iri.HasNext() { + r, err := iri.NextRun() + if err != nil { + return 0, err + } + if !r.Val { + break + } + firstFree += abi.SectorNumber(r.Len) + } + + allocated.Set(uint64(firstFree)) + + if err := m.saveBitField(ctx, "allocated", allocated); err != nil { + return 0, err + } + + // save legacy counter so that in case of a miner downgrade things keep working + { + buf := make([]byte, binary.MaxVarintLen64) + size := binary.PutUvarint(buf, uint64(firstFree)) + + if err := m.ds.Put(ctx, datastore.NewKey(StorageCounterDSPrefix), buf[:size]); err != nil { + return 0, err + } + } + + return firstFree, nil +} diff --git a/storage/pipeline/types.go b/storage/pipeline/types.go index 69045bdfb..5889588bd 100644 --- a/storage/pipeline/types.go +++ b/storage/pipeline/types.go @@ -190,10 +190,6 @@ func (t *SectorInfo) keepUnsealedRanges(pieces []Piece, invert, alwaysKeep bool) return out } -type SectorIDCounter interface { - Next() (abi.SectorNumber, error) -} - // SealingStateEvt is a journal event that records a sector state transition. type SealingStateEvt struct { SectorNumber abi.SectorNumber From ef2080a800c72cb5c07db443611fefd614b3131c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 18 Aug 2022 10:37:22 -0400 Subject: [PATCH 059/185] cli for managing sector reservations --- api/api_storage.go | 14 + api/docgen/docgen.go | 3 + api/proxy_gen.go | 52 ++++ build/openrpc/full.json.gz | Bin 28226 -> 28171 bytes build/openrpc/gateway.json.gz | Bin 4941 -> 4893 bytes build/openrpc/miner.json.gz | Bin 14637 -> 14967 bytes build/openrpc/worker.json.gz | Bin 5036 -> 5033 bytes cmd/lotus-miner/sectors.go | 228 ++++++++++++++++ cmd/lotus-miner/sectors_test.go | 56 ++++ documentation/en/api-v0-methods-miner.md | 79 ++++++ documentation/en/cli-lotus-miner.md | 73 +++++ node/impl/storminer.go | 17 ++ storage/pipeline/numassign.go | 330 +++++++++++++++++++++++ storage/pipeline/sealing.go | 111 -------- 14 files changed, 852 insertions(+), 111 deletions(-) diff --git a/api/api_storage.go b/api/api_storage.go index ca3905c95..def7a4232 100644 --- a/api/api_storage.go +++ b/api/api_storage.go @@ -10,6 +10,7 @@ import ( "github.com/libp2p/go-libp2p-core/peer" "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-bitfield" datatransfer "github.com/filecoin-project/go-data-transfer" "github.com/filecoin-project/go-fil-markets/piecestore" "github.com/filecoin-project/go-fil-markets/retrievalmarket" @@ -123,6 +124,12 @@ type StorageMiner interface { // SectorAbortUpgrade can be called on sectors that are in the process of being upgraded to abort it SectorAbortUpgrade(context.Context, abi.SectorNumber) error //perm:admin + // SectorNumAssignerMeta returns sector number assigner metadata - reserved/allocated + SectorNumAssignerMeta(ctx context.Context) (NumAssignerMeta, error) + SectorNumReservations(ctx context.Context) (map[string]bitfield.BitField, error) + SectorNumReserve(ctx context.Context, name string, field bitfield.BitField, force bool) error + SectorNumFree(ctx context.Context, name string) error + // WorkerConnect tells the node to connect to workers RPC WorkerConnect(context.Context, string) error //perm:admin retry:true WorkerStats(context.Context) (map[uuid.UUID]storiface.WorkerStats, error) //perm:admin @@ -468,3 +475,10 @@ type DagstoreInitializeAllEvent struct { Total int Current int } + +type NumAssignerMeta struct { + Reserved bitfield.BitField + Allocated bitfield.BitField + + Next abi.SectorNumber +} diff --git a/api/docgen/docgen.go b/api/docgen/docgen.go index b2a96f8b7..019a3e76e 100644 --- a/api/docgen/docgen.go +++ b/api/docgen/docgen.go @@ -336,6 +336,9 @@ func init() { Conns: 4, FD: 5, }) + addExample(map[string]bitfield.BitField{ + "": bitfield.NewFromSet([]uint64{5, 6, 7, 10}), + }) } diff --git a/api/proxy_gen.go b/api/proxy_gen.go index 64855ab0f..ba975ac57 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -824,6 +824,14 @@ type StorageMinerStruct struct { SectorMatchPendingPiecesToOpenSectors func(p0 context.Context) error `perm:"admin"` + SectorNumAssignerMeta func(p0 context.Context) (NumAssignerMeta, error) `` + + SectorNumFree func(p0 context.Context, p1 string) error `` + + SectorNumReservations func(p0 context.Context) (map[string]bitfield.BitField, error) `` + + SectorNumReserve func(p0 context.Context, p1 string, p2 bitfield.BitField, p3 bool) error `` + SectorPreCommitFlush func(p0 context.Context) ([]sealiface.PreCommitBatchRes, error) `perm:"admin"` SectorPreCommitPending func(p0 context.Context) ([]abi.SectorID, error) `perm:"admin"` @@ -4900,6 +4908,50 @@ func (s *StorageMinerStub) SectorMatchPendingPiecesToOpenSectors(p0 context.Cont return ErrNotSupported } +func (s *StorageMinerStruct) SectorNumAssignerMeta(p0 context.Context) (NumAssignerMeta, error) { + if s.Internal.SectorNumAssignerMeta == nil { + return *new(NumAssignerMeta), ErrNotSupported + } + return s.Internal.SectorNumAssignerMeta(p0) +} + +func (s *StorageMinerStub) SectorNumAssignerMeta(p0 context.Context) (NumAssignerMeta, error) { + return *new(NumAssignerMeta), ErrNotSupported +} + +func (s *StorageMinerStruct) SectorNumFree(p0 context.Context, p1 string) error { + if s.Internal.SectorNumFree == nil { + return ErrNotSupported + } + return s.Internal.SectorNumFree(p0, p1) +} + +func (s *StorageMinerStub) SectorNumFree(p0 context.Context, p1 string) error { + return ErrNotSupported +} + +func (s *StorageMinerStruct) SectorNumReservations(p0 context.Context) (map[string]bitfield.BitField, error) { + if s.Internal.SectorNumReservations == nil { + return *new(map[string]bitfield.BitField), ErrNotSupported + } + return s.Internal.SectorNumReservations(p0) +} + +func (s *StorageMinerStub) SectorNumReservations(p0 context.Context) (map[string]bitfield.BitField, error) { + return *new(map[string]bitfield.BitField), ErrNotSupported +} + +func (s *StorageMinerStruct) SectorNumReserve(p0 context.Context, p1 string, p2 bitfield.BitField, p3 bool) error { + if s.Internal.SectorNumReserve == nil { + return ErrNotSupported + } + return s.Internal.SectorNumReserve(p0, p1, p2, p3) +} + +func (s *StorageMinerStub) SectorNumReserve(p0 context.Context, p1 string, p2 bitfield.BitField, p3 bool) error { + return ErrNotSupported +} + func (s *StorageMinerStruct) SectorPreCommitFlush(p0 context.Context) ([]sealiface.PreCommitBatchRes, error) { if s.Internal.SectorPreCommitFlush == nil { return *new([]sealiface.PreCommitBatchRes), ErrNotSupported diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index aeb7555df172b85e06b52cb2eea9773c42ccd9c5..70fd42ff57642e6586a8811a3c97475e33793c6c 100644 GIT binary patch delta 25661 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 delta 25721 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 P00960YX!u^ZSepAmh^LS literal 4941 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 B4*dWC literal 14637 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 diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index c2201b2dfea8f6fcb7aced4f3f6f314f971a82be..7ae0d14ca915fe2116a17a79913a5ec4394d23d9 100644 GIT binary patch delta 3830 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 Q00960SO;E4CM+lc042;s#Q*>R diff --git a/cmd/lotus-miner/sectors.go b/cmd/lotus-miner/sectors.go index e749e5590..84f48b3cc 100644 --- a/cmd/lotus-miner/sectors.go +++ b/cmd/lotus-miner/sectors.go @@ -18,6 +18,7 @@ import ( "golang.org/x/xerrors" "github.com/filecoin-project/go-bitfield" + rlepluslazy "github.com/filecoin-project/go-bitfield/rle" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-state-types/builtin" @@ -45,6 +46,7 @@ var sectorsCmd = &cli.Command{ sectorsRefsCmd, sectorsUpdateCmd, sectorsPledgeCmd, + sectorsNumbersCmd, sectorPreCommitsCmd, sectorsCheckExpireCmd, sectorsExpiredCmd, @@ -2201,3 +2203,229 @@ var sectorsCompactPartitionsCmd = &cli.Command{ return nil }, } + +var sectorsNumbersCmd = &cli.Command{ + Name: "numbers", + Usage: "manage sector number assignments", + Subcommands: []*cli.Command{ + sectorsNumbersInfoCmd, + sectorsNumbersReservationsCmd, + sectorsNumbersReserveCmd, + sectorsNumbersFreeCmd, + }, +} + +var sectorsNumbersInfoCmd = &cli.Command{ + Name: "info", + Usage: "view sector assigner state", + Action: func(cctx *cli.Context) error { + api, closer, err := lcli.GetStorageMinerAPI(cctx) + if err != nil { + return err + } + defer closer() + ctx := lcli.ReqContext(cctx) + + am, err := api.SectorNumAssignerMeta(ctx) + if err != nil { + return err + } + + alloc, err := bitfieldToHumanRanges(am.Allocated) + if err != nil { + return err + } + + reserved, err := bitfieldToHumanRanges(am.Reserved) + if err != nil { + return err + } + + fmt.Printf("Next free: %s\n", am.Next) + fmt.Printf("Allocated: %s\n", alloc) + fmt.Printf("Reserved: %s\n", reserved) + + return nil + }, +} + +var sectorsNumbersReservationsCmd = &cli.Command{ + Name: "reservations", + Usage: "list sector number reservations", + Action: func(cctx *cli.Context) error { + api, closer, err := lcli.GetStorageMinerAPI(cctx) + if err != nil { + return err + } + defer closer() + ctx := lcli.ReqContext(cctx) + + rs, err := api.SectorNumReservations(ctx) + if err != nil { + return err + } + + var out []string + + for name, field := range rs { + hr, err := bitfieldToHumanRanges(field) + if err != nil { + return err + } + count, err := field.Count() + if err != nil { + return err + } + + out = append(out, fmt.Sprintf("%s: count=%d %s", name, count, hr)) + } + + fmt.Printf("reservations: %d\n", len(out)) + + sort.Strings(out) + + for _, s := range out { + fmt.Println(s) + } + + return nil + }, +} + +var sectorsNumbersReserveCmd = &cli.Command{ + Name: "reserve", + Usage: "create sector number reservations", + Flags: []cli.Flag{ + &cli.BoolFlag{ + Name: "force", + Usage: "skip duplicate reservation checks (note: can lead to damaging other reservations on free)", + }, + }, + ArgsUsage: "[reservation name] [reserved ranges]", + Action: func(cctx *cli.Context) error { + api, closer, err := lcli.GetStorageMinerAPI(cctx) + if err != nil { + return err + } + defer closer() + ctx := lcli.ReqContext(cctx) + + if cctx.Args().Len() != 2 { + return xerrors.Errorf("expected 2 arguments: [reservation name] [reserved ranges]") + } + + bf, err := humanRangesToBitField(cctx.Args().Get(1)) + if err != nil { + return xerrors.Errorf("parsing ranges: %w", err) + } + + return api.SectorNumReserve(ctx, cctx.Args().First(), bf, cctx.Bool("force")) + }, +} + +var sectorsNumbersFreeCmd = &cli.Command{ + Name: "free", + Usage: "remove sector number reservations", + ArgsUsage: "[reservation name]", + Action: func(cctx *cli.Context) error { + api, closer, err := lcli.GetStorageMinerAPI(cctx) + if err != nil { + return err + } + defer closer() + ctx := lcli.ReqContext(cctx) + + if cctx.Args().Len() != 1 { + return xerrors.Errorf("expected 1 argument: [reservation name]") + } + + return api.SectorNumFree(ctx, cctx.Args().First()) + }, +} + +func humanRangesToBitField(h string) (bitfield.BitField, error) { + var runs []rlepluslazy.Run + var last uint64 + + strRanges := strings.Split(h, ",") + for i, strRange := range strRanges { + lr := strings.Split(strRange, "-") + + var start, end uint64 + var err error + + switch len(lr) { + case 1: // one number + start, err = strconv.ParseUint(lr[0], 10, 64) + if err != nil { + return bitfield.BitField{}, xerrors.Errorf("parsing left side of run %d: %w", i, err) + } + + end = start + case 2: // x-y + start, err = strconv.ParseUint(lr[0], 10, 64) + if err != nil { + return bitfield.BitField{}, xerrors.Errorf("parsing left side of run %d: %w", i, err) + } + end, err = strconv.ParseUint(lr[1], 10, 64) + if err != nil { + return bitfield.BitField{}, xerrors.Errorf("parsing right side of run %d: %w", i, err) + } + } + + if start < last { + return bitfield.BitField{}, xerrors.Errorf("run %d start(%d) was less than last run end(%d)", i, start, last) + } + + if start == last && last > 0 { + return bitfield.BitField{}, xerrors.Errorf("run %d start(%d) was equal to last run end(%d)", i, start, last) + } + + if start > end { + return bitfield.BitField{}, xerrors.Errorf("run start(%d) can't be greater than run end(%d) (run %d)", start, end, i) + } + + if start > last { + runs = append(runs, rlepluslazy.Run{Val: false, Len: start - last}) + } + + runs = append(runs, rlepluslazy.Run{Val: true, Len: end - start + 1}) + last = end + 1 + } + + return bitfield.NewFromIter(&rlepluslazy.RunSliceIterator{Runs: runs}) +} + +func bitfieldToHumanRanges(bf bitfield.BitField) (string, error) { + bj, err := bf.MarshalJSON() + if err != nil { + return "", err + } + + var bints []int64 + if err := json.Unmarshal(bj, &bints); err != nil { + return "", err + } + + var at int64 + var out string + + for i, bi := range bints { + at += bi + + if i%2 == 0 { + if i > 0 { + out += "," + } + out += fmt.Sprint(at) + continue + } + + if bi > 1 { + out += "-" + out += fmt.Sprint(at - 1) + } + } + + return out, err +} diff --git a/cmd/lotus-miner/sectors_test.go b/cmd/lotus-miner/sectors_test.go index 06ab7d0f9..60ffce873 100644 --- a/cmd/lotus-miner/sectors_test.go +++ b/cmd/lotus-miner/sectors_test.go @@ -1 +1,57 @@ package main + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "github.com/filecoin-project/go-bitfield" +) + +func TestHumanBitfield(t *testing.T) { + check := func(ints []uint64, out string) { + bf := bitfield.NewFromSet(ints) + h, err := bitfieldToHumanRanges(bf) + require.NoError(t, err) + require.Equal(t, out, h) + } + + check([]uint64{2, 3, 4}, "2-4") + check([]uint64{2, 3, 4, 8, 9, 10, 11}, "2-4,8-11") + check([]uint64{2}, "2") + check([]uint64{0}, "0") + check([]uint64{0, 1, 2}, "0-2") + check([]uint64{0, 1, 5, 9, 11, 13, 14, 19}, "0-1,5,9,11,13-14,19") +} + +func TestHumanBitfieldRoundtrip(t *testing.T) { + check := func(ints []uint64, out string) { + parsed, err := humanRangesToBitField(out) + require.NoError(t, err) + + h, err := bitfieldToHumanRanges(parsed) + require.NoError(t, err) + require.Equal(t, out, h) + + bf := bitfield.NewFromSet(ints) + ins, err := bitfield.IntersectBitField(bf, parsed) + require.NoError(t, err) + + // if intersected bitfield has the same length as both bitfields they are the same + ic, err := ins.Count() + require.NoError(t, err) + + pc, err := parsed.Count() + require.NoError(t, err) + + require.Equal(t, uint64(len(ints)), ic) + require.Equal(t, ic, pc) + } + + check([]uint64{2, 3, 4}, "2-4") + check([]uint64{2, 3, 4, 8, 9, 10, 11}, "2-4,8-11") + check([]uint64{2}, "2") + check([]uint64{0}, "0") + check([]uint64{0, 1, 2}, "0-2") + check([]uint64{0, 1, 5, 9, 11, 13, 14, 19}, "0-1,5,9,11,13-14,19") +} diff --git a/documentation/en/api-v0-methods-miner.md b/documentation/en/api-v0-methods-miner.md index 7a1d4ad9b..34872c970 100644 --- a/documentation/en/api-v0-methods-miner.md +++ b/documentation/en/api-v0-methods-miner.md @@ -139,6 +139,10 @@ * [SectorGetSealDelay](#SectorGetSealDelay) * [SectorMarkForUpgrade](#SectorMarkForUpgrade) * [SectorMatchPendingPiecesToOpenSectors](#SectorMatchPendingPiecesToOpenSectors) + * [SectorNumAssignerMeta](#SectorNumAssignerMeta) + * [SectorNumFree](#SectorNumFree) + * [SectorNumReservations](#SectorNumReservations) + * [SectorNumReserve](#SectorNumReserve) * [SectorPreCommitFlush](#SectorPreCommitFlush) * [SectorPreCommitPending](#SectorPreCommitPending) * [SectorRemove](#SectorRemove) @@ -2938,6 +2942,81 @@ Inputs: `null` Response: `{}` +### SectorNumAssignerMeta +SectorNumAssignerMeta returns sector number assigner metadata - reserved/allocated + + +Perms: + +Inputs: `null` + +Response: +```json +{ + "Reserved": [ + 5, + 1 + ], + "Allocated": [ + 5, + 1 + ], + "Next": 9 +} +``` + +### SectorNumFree +There are not yet any comments for this method. + +Perms: + +Inputs: +```json +[ + "string value" +] +``` + +Response: `{}` + +### SectorNumReservations +There are not yet any comments for this method. + +Perms: + +Inputs: `null` + +Response: +```json +{ + "": [ + 5, + 3, + 2, + 1 + ] +} +``` + +### SectorNumReserve +There are not yet any comments for this method. + +Perms: + +Inputs: +```json +[ + "string value", + [ + 5, + 1 + ], + true +] +``` + +Response: `{}` + ### SectorPreCommitFlush SectorPreCommitFlush immediately sends a PreCommit message with sectors batched for PreCommit. Returns null if message wasn't sent diff --git a/documentation/en/cli-lotus-miner.md b/documentation/en/cli-lotus-miner.md index bb1bacf4b..88c4d4141 100644 --- a/documentation/en/cli-lotus-miner.md +++ b/documentation/en/cli-lotus-miner.md @@ -1637,6 +1637,7 @@ COMMANDS: refs List References to sectors update-state ADVANCED: manually update the state of a sector, this may aid in error recovery pledge store random data in a sector + numbers manage sector number assignments precommits Print on-chain precommit info check-expire Inspect expiring sectors expired Get or cleanup expired sectors @@ -1734,6 +1735,78 @@ OPTIONS: ``` +### lotus-miner sectors numbers +``` +NAME: + lotus-miner sectors numbers - manage sector number assignments + +USAGE: + lotus-miner sectors numbers command [command options] [arguments...] + +COMMANDS: + info view sector assigner state + reservations list sector number reservations + reserve create sector number reservations + free remove sector number reservations + help, h Shows a list of commands or help for one command + +OPTIONS: + --help, -h show help (default: false) + +``` + +#### lotus-miner sectors numbers info +``` +NAME: + lotus-miner sectors numbers info - view sector assigner state + +USAGE: + lotus-miner sectors numbers info [command options] [arguments...] + +OPTIONS: + --help, -h show help (default: false) + +``` + +#### lotus-miner sectors numbers reservations +``` +NAME: + lotus-miner sectors numbers reservations - list sector number reservations + +USAGE: + lotus-miner sectors numbers reservations [command options] [arguments...] + +OPTIONS: + --help, -h show help (default: false) + +``` + +#### lotus-miner sectors numbers reserve +``` +NAME: + lotus-miner sectors numbers reserve - create sector number reservations + +USAGE: + lotus-miner sectors numbers reserve [command options] [reservation name] [reserved ranges] + +OPTIONS: + --force skip duplicate reservation checks (note: can lead to damaging other reservations on free) (default: false) + +``` + +#### lotus-miner sectors numbers free +``` +NAME: + lotus-miner sectors numbers free - remove sector number reservations + +USAGE: + lotus-miner sectors numbers free [command options] [reservation name] + +OPTIONS: + --help, -h show help (default: false) + +``` + ### lotus-miner sectors precommits ``` NAME: diff --git a/node/impl/storminer.go b/node/impl/storminer.go index 4d1659dbd..25c1d99b7 100644 --- a/node/impl/storminer.go +++ b/node/impl/storminer.go @@ -24,6 +24,7 @@ import ( "github.com/filecoin-project/dagstore" "github.com/filecoin-project/dagstore/shard" "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-bitfield" datatransfer "github.com/filecoin-project/go-data-transfer" gst "github.com/filecoin-project/go-data-transfer/transport/graphsync" "github.com/filecoin-project/go-fil-markets/piecestore" @@ -427,6 +428,22 @@ func (sm *StorageMinerAPI) SectorMatchPendingPiecesToOpenSectors(ctx context.Con return sm.Miner.SectorMatchPendingPiecesToOpenSectors(ctx) } +func (sm *StorageMinerAPI) SectorNumAssignerMeta(ctx context.Context) (api.NumAssignerMeta, error) { + return sm.Miner.NumAssignerMeta(ctx) +} + +func (sm *StorageMinerAPI) SectorNumReservations(ctx context.Context) (map[string]bitfield.BitField, error) { + return sm.Miner.NumReservations(ctx) +} + +func (sm *StorageMinerAPI) SectorNumReserve(ctx context.Context, name string, field bitfield.BitField, force bool) error { + return sm.Miner.NumReserve(ctx, name, field, force) +} + +func (sm *StorageMinerAPI) SectorNumFree(ctx context.Context, name string) error { + return sm.Miner.NumFree(ctx, name) +} + func (sm *StorageMinerAPI) ComputeWindowPoSt(ctx context.Context, dlIdx uint64, tsk types.TipSetKey) ([]minertypes.SubmitWindowedPoStParams, error) { var ts *types.TipSet var err error diff --git a/storage/pipeline/numassign.go b/storage/pipeline/numassign.go index f4f7d74cd..549d43d40 100644 --- a/storage/pipeline/numassign.go +++ b/storage/pipeline/numassign.go @@ -1 +1,331 @@ package sealing + +import ( + "bytes" + "context" + "encoding/binary" + "regexp" + + "github.com/ipfs/go-datastore" + dsq "github.com/ipfs/go-datastore/query" + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-bitfield" + rlepluslazy "github.com/filecoin-project/go-bitfield/rle" + "github.com/filecoin-project/go-state-types/abi" + + "github.com/filecoin-project/lotus/api" +) + +var StorageCounterDSPrefix = "/storage/nextid" +var SectorBitfieldsDSPrefix = "/storage/sectorsids/" +var SectorReservationsDSPrefix = "/storage/sectorsids/reserved/" + +var allocatedSectorsKey = datastore.NewKey(SectorBitfieldsDSPrefix + "allocated") +var reservedSectorsKey = datastore.NewKey(SectorBitfieldsDSPrefix + "reserved") + +func (m *Sealing) loadBitField(ctx context.Context, name datastore.Key) (*bitfield.BitField, error) { + raw, err := m.ds.Get(ctx, name) + if err == datastore.ErrNotFound { + return nil, nil + } + if err != nil { + return nil, err + } + var bf bitfield.BitField + + if err := bf.UnmarshalCBOR(bytes.NewBuffer(raw)); err != nil { + return nil, err + } + return &bf, nil +} + +func (m *Sealing) saveBitField(ctx context.Context, name datastore.Key, bf bitfield.BitField) error { + var bb bytes.Buffer + err := bf.MarshalCBOR(&bb) + if err != nil { + return err + } + return m.ds.Put(ctx, name, bb.Bytes()) +} + +func (m *Sealing) NextSectorNumber(ctx context.Context) (abi.SectorNumber, error) { + m.sclk.Lock() + defer m.sclk.Unlock() + + am, err := m.numAssignerMetaLocked(ctx) + if err != nil { + return 0, err + } + + allocated := am.Allocated + + allocated.Set(uint64(am.Next)) + + if err := m.saveBitField(ctx, allocatedSectorsKey, allocated); err != nil { + return 0, err + } + + // save legacy counter so that in case of a miner downgrade things keep working + { + buf := make([]byte, binary.MaxVarintLen64) + size := binary.PutUvarint(buf, uint64(am.Next)) + + if err := m.ds.Put(ctx, datastore.NewKey(StorageCounterDSPrefix), buf[:size]); err != nil { + return 0, err + } + } + + return am.Next, nil +} + +func (m *Sealing) NumAssignerMeta(ctx context.Context) (api.NumAssignerMeta, error) { + m.sclk.Lock() + defer m.sclk.Unlock() + + return m.numAssignerMetaLocked(ctx) +} + +func (m *Sealing) numAssignerMetaLocked(ctx context.Context) (api.NumAssignerMeta, error) { + // load user-reserved and allocated bitfields + reserved, err := m.loadBitField(ctx, reservedSectorsKey) + if err != nil { + return api.NumAssignerMeta{}, xerrors.Errorf("loading reserved sectors bitfield: %w", err) + } + allocated, err := m.loadBitField(ctx, allocatedSectorsKey) + if err != nil { + return api.NumAssignerMeta{}, xerrors.Errorf("loading allocated sectors bitfield: %w", err) + } + + // if the allocated bitfield doesn't exist, crate it from the legacy sector counter + if allocated == nil { + var i uint64 + { + curBytes, err := m.ds.Get(ctx, datastore.NewKey(StorageCounterDSPrefix)) + if err != nil { + return api.NumAssignerMeta{}, err + } + cur, _ := binary.Uvarint(curBytes) + i = cur + 1 + } + + rl := &rlepluslazy.RunSliceIterator{Runs: []rlepluslazy.Run{ + { + Val: true, + Len: i, + }, + }} + + bf, err := bitfield.NewFromIter(rl) + if err != nil { + return api.NumAssignerMeta{}, xerrors.Errorf("bitfield from iter: %w", err) + } + allocated = &bf + } + + // if there are no user reservations, use an empty bitfield + if reserved == nil { + emptyBf := bitfield.New() + reserved = &emptyBf + } + + // todo union with miner allocated nums + inuse, err := bitfield.MergeBitFields(*reserved, *allocated) + if err != nil { + return api.NumAssignerMeta{}, xerrors.Errorf("merge reserved/allocated: %w", err) + } + + // find first available sector number + iri, err := inuse.RunIterator() + if err != nil { + return api.NumAssignerMeta{}, xerrors.Errorf("inuse run iter: %w", err) + } + + var firstFree abi.SectorNumber + for iri.HasNext() { + r, err := iri.NextRun() + if err != nil { + return api.NumAssignerMeta{}, xerrors.Errorf("next run: %w", err) + } + if !r.Val { + break + } + firstFree += abi.SectorNumber(r.Len) + } + + return api.NumAssignerMeta{ + Reserved: *reserved, + Allocated: *allocated, + Next: firstFree, + }, nil +} + +func (m *Sealing) NumReservations(ctx context.Context) (map[string]bitfield.BitField, error) { + res, err := m.ds.Query(ctx, dsq.Query{Prefix: SectorReservationsDSPrefix}) + if err != nil { + return nil, xerrors.Errorf("query reservations: %w", err) + } + defer res.Close() //nolint:errcheck + + out := map[string]bitfield.BitField{} + + for { + res, ok := res.NextSync() + if !ok { + break + } + + if res.Error != nil { + return nil, xerrors.Errorf("res error: %w", err) + } + + b := bitfield.New() + if err := b.UnmarshalCBOR(bytes.NewReader(res.Value)); err != nil { + return nil, err + } + + out[datastore.NewKey(res.Key).BaseNamespace()] = b + } + + return out, nil +} + +func (m *Sealing) NumReserve(ctx context.Context, name string, reserving bitfield.BitField, force bool) error { + m.sclk.Lock() + defer m.sclk.Unlock() + + rk, err := reservationKey(name) + if err != nil { + return err + } + + // check if there's an existing reservation with this name + cur := bitfield.New() + + curRes, err := m.ds.Get(ctx, rk) + if err == nil { + log.Warnw("reservation with this name already exists", "name", name) + if !force { + return xerrors.Errorf("reservation with this name already exists") + } + + if err := cur.UnmarshalCBOR(bytes.NewReader(curRes)); err != nil { + return xerrors.Errorf("unmarshaling existing reservation: %w", err) + } + } else if err == datastore.ErrNotFound { + return xerrors.Errorf("checking if reservation exists: %w", err) + } + + // load the global reserved bitfield and subtract current reservation if we're overwriting + + nm, err := m.numAssignerMetaLocked(ctx) + if err != nil { + return err + } + allReserved := nm.Reserved + + allReserved, err = bitfield.SubtractBitField(allReserved, cur) + if err != nil { + return xerrors.Errorf("allReserved - cur: %w", err) + } + + // check if the reservation is colliding with any other reservation + coliding, err := bitfield.IntersectBitField(allReserved, reserving) + if err != nil { + return xerrors.Errorf("intersect all / reserving: %w", err) + } + + empty, err := coliding.IsEmpty() + if err != nil { + return xerrors.Errorf("colliding.empty: %w", err) + } + if !empty { + log.Warnw("new reservation is colliding with another existing reservation", "name", name) + if !force { + return xerrors.Errorf("new reservation is colliding with another existing reservation") + } + } + + // check if the reservation is colliding with allocated sectors + coliding, err = bitfield.IntersectBitField(nm.Allocated, reserving) + if err != nil { + return xerrors.Errorf("intersect all / reserving: %w", err) + } + + empty, err = coliding.IsEmpty() + if err != nil { + return xerrors.Errorf("colliding.empty: %w", err) + } + if !empty { + log.Warnw("new reservation is colliding with allocated sector numbers", "name", name) + if !force { + return xerrors.Errorf("new reservation is colliding with allocated sector numbers") + } + } + + // write the reservation + newReserved, err := bitfield.MergeBitFields(allReserved, reserving) + if err != nil { + return xerrors.Errorf("merge allReserved+reserving: %w", err) + } + + if err := m.saveBitField(ctx, rk, reserving); err != nil { + return xerrors.Errorf("saving reservation: %w", err) + } + + if err := m.saveBitField(ctx, reservedSectorsKey, newReserved); err != nil { + return xerrors.Errorf("save reserved nums: %w", err) + } + + return nil +} + +func (m *Sealing) NumFree(ctx context.Context, name string) error { + rk, err := reservationKey(name) + if err != nil { + return err + } + + res, err := m.loadBitField(ctx, rk) + if err != nil { + return xerrors.Errorf("loading reservation: %w", err) + } + if res == nil { + return xerrors.Errorf("reservation with this name doesn't exist") + } + + allRes, err := m.loadBitField(ctx, reservedSectorsKey) + if err != nil { + return xerrors.Errorf("leading all reservations: %w", err) + } + if allRes == nil { + return xerrors.Errorf("all reservations bitfield not found") + } + + newAll, err := bitfield.SubtractBitField(*allRes, *res) + if err != nil { + return xerrors.Errorf("allRes-res: %w", err) + } + + if err := m.saveBitField(ctx, reservedSectorsKey, newAll); err != nil { + return xerrors.Errorf("saving reservations bitfield: %w", err) + } + + if err := m.ds.Delete(ctx, rk); err != nil { + return xerrors.Errorf("deleting reservation: %w", err) + } + + return nil +} + +func reservationKey(name string) (datastore.Key, error) { + ok, err := regexp.Match("[a-zA-Z0-9_\\-]+]", []byte(name)) + if err != nil { + return datastore.Key{}, err + } + if !ok { + return datastore.Key{}, xerrors.Errorf("reservation name contained disallowed characters (allowed: a-z, A-Z, 0-9, '-', '_')") + } + + return datastore.KeyWithNamespaces([]string{SectorReservationsDSPrefix, name}), nil +} diff --git a/storage/pipeline/sealing.go b/storage/pipeline/sealing.go index 4a514b5d1..03fa2e527 100644 --- a/storage/pipeline/sealing.go +++ b/storage/pipeline/sealing.go @@ -1,9 +1,7 @@ package sealing import ( - "bytes" "context" - "encoding/binary" "sync" "time" @@ -14,8 +12,6 @@ import ( "golang.org/x/xerrors" "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-bitfield" - rlepluslazy "github.com/filecoin-project/go-bitfield/rle" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-state-types/builtin/v8/miner" @@ -40,9 +36,6 @@ import ( const SectorStorePrefix = "/sectors" -var StorageCounterDSPrefix = "/storage/nextid" -var SectorBitfieldsDSPrefix = "/storage/sectors/" - var ErrTooManySectorsSealing = xerrors.New("too many sectors sealing") var log = logging.Logger("sectors") @@ -329,107 +322,3 @@ func getDealPerSectorLimit(size abi.SectorSize) (int, error) { } return 512, nil } - -func (m *Sealing) loadBitField(ctx context.Context, name string) (*bitfield.BitField, error) { - raw, err := m.ds.Get(ctx, datastore.NewKey(SectorBitfieldsDSPrefix+name)) - if err == datastore.ErrNotFound { - return nil, nil - } - if err != nil { - return nil, err - } - var bf bitfield.BitField - - if err := bf.UnmarshalCBOR(bytes.NewBuffer(raw)); err != nil { - return nil, err - } - return &bf, nil -} - -func (m *Sealing) saveBitField(ctx context.Context, name string, bf *bitfield.BitField) error { - var bb bytes.Buffer - err := bf.MarshalCBOR(&bb) - if err != nil { - return err - } - return m.ds.Put(ctx, datastore.NewKey(SectorBitfieldsDSPrefix+name), bb.Bytes()) -} - -func (m *Sealing) NextSectorNumber(ctx context.Context) (abi.SectorNumber, error) { - m.sclk.Lock() - defer m.sclk.Unlock() - - reserved, err := m.loadBitField(ctx, "reserved") - if err != nil { - return 0, err - } - allocated, err := m.loadBitField(ctx, "allocated") - if err != nil { - return 0, err - } - - if allocated == nil { - i, err := m.legacySc.Next() - if err != nil { - return 0, err - } - - rl := &rlepluslazy.RunSliceIterator{Runs: []rlepluslazy.Run{ - { - Val: true, - Len: i, - }, - }} - - bf, err := bitfield.NewFromIter(rl) - if err != nil { - return 0, err - } - allocated = &bf - } - - if reserved == nil { - reserved = allocated - } - - // todo union with miner allocated nums - inuse, err := bitfield.MergeBitFields(*reserved, *allocated) - if err != nil { - return 0, err - } - - iri, err := inuse.RunIterator() - if err != nil { - return 0, err - } - - var firstFree abi.SectorNumber - for iri.HasNext() { - r, err := iri.NextRun() - if err != nil { - return 0, err - } - if !r.Val { - break - } - firstFree += abi.SectorNumber(r.Len) - } - - allocated.Set(uint64(firstFree)) - - if err := m.saveBitField(ctx, "allocated", allocated); err != nil { - return 0, err - } - - // save legacy counter so that in case of a miner downgrade things keep working - { - buf := make([]byte, binary.MaxVarintLen64) - size := binary.PutUvarint(buf, uint64(firstFree)) - - if err := m.ds.Put(ctx, datastore.NewKey(StorageCounterDSPrefix), buf[:size]); err != nil { - return 0, err - } - } - - return firstFree, nil -} From 00bef607ca60fce474b1a56cb02cd9ff59f86725 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 22 Aug 2022 14:41:56 -0400 Subject: [PATCH 060/185] sealing: numassign: take on-chain allocated numbers into account --- api/api_full.go | 2 ++ api/mocks/mock_full.go | 15 ++++++++++ api/proxy_gen.go | 13 +++++++++ build/openrpc/full.json.gz | Bin 28171 -> 28241 bytes build/openrpc/gateway.json.gz | Bin 4893 -> 4893 bytes build/openrpc/miner.json.gz | Bin 14967 -> 14968 bytes build/openrpc/worker.json.gz | Bin 5033 -> 5034 bytes documentation/en/api-v1-unstable-methods.md | 29 ++++++++++++++++++++ node/impl/full/state.go | 12 ++++++++ storage/pipeline/mocks/api.go | 16 +++++++++++ storage/pipeline/numassign.go | 13 +++++++++ storage/pipeline/sealing.go | 2 ++ 12 files changed, 102 insertions(+) diff --git a/api/api_full.go b/api/api_full.go index bfd5e4f6b..5d35a395c 100644 --- a/api/api_full.go +++ b/api/api_full.go @@ -540,6 +540,8 @@ type FullNode interface { StateChangedActors(context.Context, cid.Cid, cid.Cid) (map[string]types.Actor, error) //perm:read // StateMinerSectorCount returns the number of sectors in a miner's sector set and proving set StateMinerSectorCount(context.Context, address.Address, types.TipSetKey) (MinerSectors, error) //perm:read + // StateMinerAllocated returns a bitfield containing all sector numbers marked as allocated in miner state + StateMinerAllocated(context.Context, address.Address, types.TipSetKey) (*bitfield.BitField, error) // StateCompute is a flexible command that applies the given messages on the given tipset. // The messages are run as though the VM were at the provided height. // diff --git a/api/mocks/mock_full.go b/api/mocks/mock_full.go index 5aa152c85..a00c6b99d 100644 --- a/api/mocks/mock_full.go +++ b/api/mocks/mock_full.go @@ -2662,6 +2662,21 @@ func (mr *MockFullNodeMockRecorder) StateMinerActiveSectors(arg0, arg1, arg2 int return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMinerActiveSectors", reflect.TypeOf((*MockFullNode)(nil).StateMinerActiveSectors), arg0, arg1, arg2) } +// StateMinerAllocated mocks base method. +func (m *MockFullNode) StateMinerAllocated(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (*bitfield.BitField, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateMinerAllocated", arg0, arg1, arg2) + ret0, _ := ret[0].(*bitfield.BitField) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateMinerAllocated indicates an expected call of StateMinerAllocated. +func (mr *MockFullNodeMockRecorder) StateMinerAllocated(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMinerAllocated", reflect.TypeOf((*MockFullNode)(nil).StateMinerAllocated), arg0, arg1, arg2) +} + // StateMinerAvailableBalance mocks base method. func (m *MockFullNode) StateMinerAvailableBalance(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (big.Int, error) { m.ctrl.T.Helper() diff --git a/api/proxy_gen.go b/api/proxy_gen.go index ba975ac57..188ef24ce 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -391,6 +391,8 @@ type FullNodeStruct struct { StateMinerActiveSectors func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]*miner.SectorOnChainInfo, error) `perm:"read"` + StateMinerAllocated func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*bitfield.BitField, error) `` + StateMinerAvailableBalance func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (types.BigInt, error) `perm:"read"` StateMinerDeadlines func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]Deadline, error) `perm:"read"` @@ -2719,6 +2721,17 @@ func (s *FullNodeStub) StateMinerActiveSectors(p0 context.Context, p1 address.Ad return *new([]*miner.SectorOnChainInfo), ErrNotSupported } +func (s *FullNodeStruct) StateMinerAllocated(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*bitfield.BitField, error) { + if s.Internal.StateMinerAllocated == nil { + return nil, ErrNotSupported + } + return s.Internal.StateMinerAllocated(p0, p1, p2) +} + +func (s *FullNodeStub) StateMinerAllocated(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*bitfield.BitField, error) { + return nil, ErrNotSupported +} + func (s *FullNodeStruct) StateMinerAvailableBalance(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (types.BigInt, error) { if s.Internal.StateMinerAvailableBalance == nil { return *new(types.BigInt), ErrNotSupported diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 70fd42ff57642e6586a8811a3c97475e33793c6c..6f69a08b3da7719248fcd7e31939c9028637e6b2 100644 GIT binary patch delta 20368 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 delta 20335 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 R{{jF2|NrocrSnO71ptc}z!v}j diff --git a/build/openrpc/gateway.json.gz b/build/openrpc/gateway.json.gz index 3b5fd9de6a42e18e92f9fe332f36ca5c399de6ac..940db18790cd0a87210943219186216dbc49c2b1 100644 GIT binary patch literal 4893 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 P00960YX!u^ZSepAmh^LS diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index fa386a960087e0d822e2b9bc566155b36cbcf459..6be3c12a896be6c17fa606f1a60ee53436e6ab7c 100644 GIT binary patch delta 11901 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 DH}}oo delta 11900 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 delta 4080 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 Date: Mon, 22 Aug 2022 16:20:40 -0400 Subject: [PATCH 061/185] sealing: numassign: itests/bug fixes --- .circleci/config.yml | 5 ++ build/openrpc/full.json.gz | Bin 28241 -> 28298 bytes build/openrpc/gateway.json.gz | Bin 4893 -> 4940 bytes itests/sector_numassign_test.go | 130 ++++++++++++++++++++++++++++++++ storage/pipeline/numassign.go | 4 +- 5 files changed, 137 insertions(+), 2 deletions(-) create mode 100644 itests/sector_numassign_test.go diff --git a/.circleci/config.yml b/.circleci/config.yml index c438612ad..1febab370 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -979,6 +979,11 @@ workflows: suite: itest-sector_miner_collateral target: "./itests/sector_miner_collateral_test.go" + - test: + name: test-itest-sector_numassign + suite: itest-sector_numassign + target: "./itests/sector_numassign_test.go" + - test: name: test-itest-sector_pledge suite: itest-sector_pledge diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 6f69a08b3da7719248fcd7e31939c9028637e6b2..1054f09168ba0dc32c9e453b503deb0fec2eba1b 100644 GIT binary patch delta 24613 zcmV)WK(4>h+yRQ+0e>Hh2mk;800030?7e$)+qjYk`c+W6e@v26JbuMVeCyOLKl1R7 zlXz`svb%A12O=Q}#}vRJK--#BzWXgaNP9&SAtF)e z4fY3H8`~RugW&*^F&*rGA8^bAG}s@UQXVsKes%;7&Q1oy!G8^k7^Xzl*m}9K{oF@4 zgCE1e4Dl)T*04GfpFPBDxq3e8jv6hg`Mx*I$24 z=oJ~q!~;(lc=k39f{)Zk7d(nR{uETS@g&>?9wi*z@r@((?^Ez(2E(t6N0>~$VZu=~ zh93I9lQ9fCJe z^pWz5I1FjTkuPfg5dYDYn>&0GZa%#tKd#7MfBiKW4p=;!!Dv3%A5;;iT4aFH83H57 zum{9vi)K(vCV(RvbHJwvjM92nWH20rFoH8Rp>ZU>(0^$DJfsZEPoQ6mFZgXZh!Bed zE*66RnAO8Bea6~i*@(msZ;ED6w2toJEDVrZH*n+)_P4foetZ+ea4}nF5e-qqu_*C< zu<=a%7y7;=83yKC9>r)l;PX&WOGp1k9v}Spkv#dDJo@%S4DRn3N61eq`6!H#2f27M zh53z41JZsG#fjK}8fB0U?US=3oF4@C33s@um?aG-gl1 z6v2Q`fhTGJO5~>TL>s>|4tah9iJ>O+g3(--jfsz zeM0>(+ds+bCgR2YUfVBs8rJqP3J^!1M*r@U-~xaFsgq#?H-9eX4UXsAqko`>;La`c zr+f1qxUWzu*xvmiKV4H^w{7ch*p z?*uHSco47w+kaob4~$>0h6DN6;hc*`s~b3j zkywg-erVO?7lbEMKG+{@4u*sG`p4Gh*5+1H;zHokb4umx_R)9J@CU>goS<{$Aslkn zU-P=*9$P#-y*QXmA~b;P=CTaTUVoA;r<8T(L`gf*0r|NWR&wU?Yj%Ms*`!M|_ ze%XTPjGJ~OJmbyXh%fA+#f@Yv(59@(XByE(X@6i^el3{I(s&9Cpj-6{w%d;Q3bD|o zfiLMycNs;V72Hqw)^65{oFs!hKW|G`Z8Ag7*=(9T6zay#a}6x+(u7yN4Lkoi9+=s8 zdvni10Z#efQi^cWiiJX)D{rj~Cl&fviVe~&mE)9_L`j|{52Vf42UwYe4UJh;+qfcE z|2==ZZV&NfZig;0he6xX*w8> z5{7*giH|5KM|a4J#j=z$`04V^KDc~;asfWPxqScW7+k#n^!fA{eEN9$-{9~K__952oAu-*_)%2w z*X-pd(Slj~==AgPn`70?<;mH_o69TmnW1zm#Bl(!XQT4bnp(c zQ#`}UjPee$w+J16`hUR(d3Hb8S4IZ8D9cLlaBy^TT-M=7qtHi_n`j5` zdX%ACKAp44i@WQ)@b59%z8!o2?9Fbrr!#uZZ%6*!HN4wpgCAmQFOU~r=fc26^ke8zOZ}1Ss0EJOZPOV{+HF<0RhQqYIVrgQM%c$^ zeb{>0Y<+l#2x7Rq-9gu{cIVWGl9xEV5L)zNBZF?OSMx$fVY5*o>DxSWpXg^wQD5FK zEH@!_XSnHG8}&oUMiK{sK7SBNeME)k$p=c>RIqPr;L~-+$T*?zEeR8%Sxp z?JpfwkH=c9XVeuA%+z_AJd*O_NFF~ayxW`bE=;eLH0Vj>4NH7G++kB5k=>o^my?~C zM9BZ=<@k>5PX7I3XUE^6yF2`EvK?;Y@a}FJ-FVX*H2CptB^bI&uBHp5G>hgNtN9an zsc%ofM`GWXA6#45zJIo|Z0JdE>BQ8@F1KV?P4*FEAse7k*+}lU?0K=-EPI3)=`3%= zvpN~0K7mjSPr|_eB&XL#xQI4;RS7kb^@5`(uCLde4YSf^!Hwh*y{akMWS4c6+&fEa zOMe{o)9BxF7q(LgI&FH@)g!)qyS=y7yzTQ&Bb^yQzL~{FqJLH}GvD~iKxSzSiy>x# zvIdW=5E=jz(6O=`m3_3F+2~=KjU2pn@YccG)ycV+O+hA7PMzLZSWeC*&DhAfyg^vk zw3m8GSB+AyvX3QXpfNsM8JN_1I!XDju0{o zP=cOw`kWG^Jb!wnP@Uz)aUyj*7zBXR8px8?SKh^vh$HMfiTr>ia^<$Ekk57Htfcju zJIuwL4)!;PgLAnetL5A~$UZYc^6TzWD(lSh7(?}FQ#c`gx!W%fR{*_giUcFs4WBL{ zcKFoNhCc-1cBNha*?R>2qbVe|N*A9t3!SXJj-p16Nq>w%(7Z^<@M$Vq1izCyRD^C& z#D9lj7|em#2l5^R0|X%-`GVO`5SPdFS47B&?A{3^luuDK1nPo^+_3wy`zr#}|2R$m z1pj+Q&=KRl3y4-T&g_}}NxpFey4{C{;t{VzX1*DZgcap3D=fWN*f z@}Ka-gMX((AP4b;9~>HgA3Xi`mphDD@nJ-^XTxnbY0C-Jj3rcw(cD|BdAu~mh_;eS zl~e0U3thmvi_+BDvZ!h4-rF2{KLYXhdO^6O8rMHt0jR3mA7i)nz*HrBJ#R>9UaUju z-c1)wEvstc9;IXLPeF04uC)`G^JiTdL)qDUVSmF=4#pfsdWM$cEk;XqYzB_7>i$hg zy=e{5?#OwJ?pMHs@`JO3+-14~O0O9hLGN0^=JXzSaxFV$RY=Uw#udq3G$%B<172Nz zXk6JQlsp$xkaYk-06B_O(JPYN)lN)2{jtIPM_z2MNj2tTXhZQBV4?;=gKjYp+)&0#!~L!P6%&8o>zy9t{HIarXZL8K^JIPlLx`PJiPo zB9xAp3Gt(}jR5oZ`JkFaXgZg+vEu0sCX;tZ$x=N>9AYBF*GhMdR*vjhW9i{i!t{R> znqJ)vNtdGIbZh5jlW+W4%sazfRkv;@D^RFX7A)M%vZa1@b3)Xj?X0>CV+jZqzEx`r zV8W@HlcU#7X-Gm4^l0-x8 z9g;Fi7i^D&1Qjds}g||SE&z!dSV6{cHKr7s1^ka)l zgC*zDuJo-dLweohOL>8KcMVckwss_Gmd?7hUc_@o*#ZWXbULPyhsJRrAb&LCEY&F$ z>=v5k2KdahW4s4t1Z(Fl@+&OYj}1`lZZ@88t%-ESkv&~NfgD_}H( zBGSu3nW)q2F{1r6`aJ|b9)FLo$O!RUq)YN!s#O4oOdbX@X*`v5UuMlPqh>p$$<3bI zSg|hfKl;w@DJIuU{MpiUrR&*T7gC))x)5KxTTO0@3NC$F!qdfU!QLBMJvqda6S7ze znq4%ALbJ{G@~|+D1&}vKl1FD@EcW@W`aPymLEG*Uwbo(Xez2~&EPrYyGJR>G>TV7m z)5+5AcAc|afDz$GFz}A(YoOZj;ge&jlZOaJ8}jcRFrqYQGO*QjyR@;b zemIG0F34+UIVGYz`AFy3jouj4CPmZM$A}=A!S?P@@)lC1&oMU%Z;uxzJ ziXCg++CJX-gVHbW{<-_-kN^4a8}$Cac=&GbfJLAGP%-Evmh({RRz~C6c^6a!>e7TnDIA4?$n!)HA z@eNV-rj{@^owWMSq=RoLpGq)16`Dp(FVLyKF|YiN#I@LP8&%91CQ)SdTHAZZLZoZML&| zRMEerZX*zcgc}V1gAzB=oYR3b)<0B}u(1wH6P$l%qxqe|c|f7Bbg0+Efn1}B0=KiR zA5=zS>^2oGRl*#7R_QPddfVxd#?T+1GWn{`BQoV)m46G)o_UMvc8uGeYm1T#IQA0k zT2s7;Ri}g)oH{}YI!d{;W5^GgA=h%_{#fx(VVsYZ{k^Vpgq2(T&7EKy9hsl1T*vy< z+jBIQRx;7=IT|li996A;bj6gu1^y{!$4LGoHnW&-BiOl&)k-}W$QR1bl~ci3=8U6R zzef0U?tgxXmHYVMooZHYa}*$t(`c}-j>>=E-unGLWYgc(uib6=YcSL_e?ZZ7fX*UH z$J%B6n+mmkD(3F!;Jh6AOsl{9FIw^eMP|3;$@!60L`16?P5EkzO~UJBbT*7CKTj1@ zbvZ`p%+Q)_nR+{0^M5`qfAYtaDwKjPorf zzDxn#O^77bZQLK9nU^d6Ge*(;(|C-c#gIDbr16qP)?f!%Z4ARk+N1=fpp(fX69)Jc zaxjHA2teSWh(k=IY#HWmRb;d>@PrZsLVf1))HyRg2sqxzeV;w@Pa}A0zxP+N{Zw&_ zC4cwQEXNYjg z(QaU%8Y($` zwPVPkkkb3#2Z=XrbykuUsH}1UD6KVj47j~J9Gt^j87e1HXMgnXq+#mHi6)>T?J8Y3 z`?R7&dNi@Sv#mcarlk49{fQ!ptdgCU%<$0^5`y$uzzM+|Lv^guQ7t}4EPtd#ec6sp z2wHZ2sP&Ng(i@9HzE|5UW-_ViA!Pl2jT2@}g_^Jvc7fEm)bBrO>`hUHL8W%jf8x_b zzwSCU$rMPIDV9QCJY?NCMC+X8xlQnWppb!b(nrs^cv_(V8yu(2Nq@>PR_gIoWIR?i zI@tm8+_qjDF$@mHz1d>=jDOAAj?CPqtkR~kEn4-~ND*9W+Sr;EZ?jF-VwhQ_E+@gc z{n*wTl-ubQ<563*8)0%+SG1Yi*c~lI4d>O0rTy%Ft4btd$7Va4601%5$Tn4IDunDd zZHq(yJV1RI>%I(>-R9_bbL3`r;Tmh=$V<2t=kasfMO07;+xDHPHGgfpwU_bM5o>Ee zejCfBC9|lK%Z7VUrV?1OsZ3RA@NIe+evmJA8p9B11DF;$OBo1N8+9ha7!$s?`xHD; z-^JQIs9LQy5MB+g2AwU0DY=$5LQRMn$17&q8VG?${rpBLj&qyH~H z3s~3vx7&E9|2<^V@qe-7)=R4Qkc}nRUSA1WibO8jYia+Part(NVN0o_E5dcQ;x+sZwgbI zR$Z0J^r2}XuNyC;o?^yLdv8}wq|{Dzf~l|H%tBgqUChNwtv7nrS9HPi&d;WD$}N#fr)OfD;m+XEK}WGl<(&&&o}1wh(3@;OgF=gH?h`J5-8QxVpWLoA^qIHx}6)aTSW zr_MQb&N=ltr#|P@=bZW;k5k_Rvr=s}2CF*7OrM1>V}Ga8E!0`6)N4CCm2RrhQl-jt zv{PlYF0xc5qy(68rdjWv%$<}n3g+Q*#rsf9C--eBz89W=nP{2tw1*7 z$tC455KlB|&Y?xdlTZ$qbU1lg%AC|K+M;O?s^SCopFTq#ZE3ilRv;HgvPrMoX^a&o!?QL- z1h!M`3a!-LB+)mXHgs%P8DTPudA?)DJZ}^6ywH1t3b<6*^YS2V6V4V1OmsnL#5OO6 ztAF&sOw^LbsD9&C7QTYreNF9!vzlz~O#vp|)x7nH%wA5G>msxF8=1X<3%88Q?t-$f zHYj_mi(@Vldrtt{MPk1%k=XAuT;6Srogx|W0lV&qlauOo09mKam%z9H)1HDS&n`HP z-~=78>&2ir>8i&Y*ar1BvDs4!GPuj|gnu9(Wa9wih|UW4vL){A5ANzYwS&2xB*aSc z-mD!;ue|An-(u#fVMBka&5R&xG_WCOQ59@5;}LK;aV45aVzbiV|C! zThiAH3(EA*3-tF#s{Qz7zVC=~>d~MgY)#uFe)-l6D`<&z7mbj{)I2zj`=T*g&VMcnhh~y6)=0c64H`bX=%E|&$z1ZwC zFx6vA1hKdGs(J4)4x?N!fzDf~)Kc9}@*#&wh=Gml7(!y24Bza45v75}UMuz6*Osdq zkgY+liY&-EnuVMJPC=yJ1E?~GCx6ocZZV%qw4-9krO!`}rLBR=s8?c=dfUP^Ut?wa zd8g}kZUjU30>hOpWIrchm1BgbTYE2GH#0)%+*D5PZp-~t^*WZ9`c8d{d=v>yO)v=c z$SPP?(m{{PnnCkoJfVBX>R1k`=rO5ZnhYS5BxYrXrlwPcQ!(oP6t?_q{(q7}ban>^LGD%m{mhY>U(zO_HeqTJ=q7JC0|p{urL>Ydm26a4}sXr)ah zCp*e!mEvm~?wCdd=wPw1^XYhKMv2#r(KZu_c^S>MDsVzrJRW0DCOnUc-_=FlqGe0( z3Jcw8VOM?WS~g>{MJY|>R)6VWjKd&6zUgL9Nt)CzRQwNk%H!#Zs8eDXA;5U-T?0Qx zqBU&v1;(PYhwG2w6pGWWmz#~zE0e|e1>){j$*hUGEuF5}8H}zG-%$M6dS{EK``yBt zSlhiS3AlxrOWzDbqu>;b5b&s2&%D1V`qlHbI^(6YT`sZ1wi;usU4KXe8|oY;KdoQ4 zx1OaX&g9Y(YJ2L8xJY47>-MOzn-nkFU|Ij6yo4^@nSAkEniyf z*Y!m}gl64Z#t0~!K+0xVKKNGR#(hMC0CE(iHUJ$aBjP&RfIe<~3yo`n>0Kv%;wjgE zmjK|&#JgBU?P3)bzJHMoapuBkt8x}Te&yYv@-nl!9nsA$Qnh;9wvk`FRbxuF+b>kI zGv8I`)Y_L*>$(Ds?Zz+}GDu2*7+Vf(WNoYpaAZC73p#R?TL2G(jxmnVb4dK>V;W5m zf1ZI60_b=gV4?!P3cRl|i3BJ#=77Z`hW?J_!i=DIjmgB}6@Q0U9A0sF#o-l)R~|85 z*{O@fBX8y(Lhm{b+XEG&avefZv)5!^G#Xjju$U*P0eG05dh!PYg!%}K)H7O<+)KJc ziV55Rms4~_W{6LzSlx0_Fuo7Y!X26GNMu}LyQA~(f>WQn?6*>KM`T64i4iAq0 z_NX=4+eqgF*i=kBn8^TVg#A0+Z#ao>A5oKH8-4@Fk%~S`hyf-4xzRx3vDVEg+%m94Z;hM(yl7l`;5A@XVr_{Ex5qAnw-7gwXYp|-N! z8#LwBW_d29E*QjwA)czm(zuUN(BoYlrw==Q*y+RTtPg(|*`nnh{Q&RYqSRH6O+Lpe zbIVKhf6puall3>-f%F(#Q4Q?fyjFJV(w&P zDL=5H{Bh#Ri6$^$ziK#87mD%FD@48W=5D$E&eElqq$wiUXOdanw7h zmr0r+uHxvy8I1`Cbeu5%DdaN1j2A}{B0QLbD5-yxBmvTM^KgZNvsU-Lqqk}T)~JK2-++(a9Qmxpt;cT38hEPKPGlI&(DtqLL{^&^39=~f-h(|M6k-ahQ0P!>)o zYp^-pEtAu&SKBp#b;`@NGbhNJ_*KfDNyAFiy}}@E6}}u@npq^gL;6|B3-OPXPpmVw zPTPNT+TKIe_I7F_peUC01@oyN!P}0~AgTVVBtg>uN~C}>I9myj(sQf-U?3&|l}lO6 zfh6gbGXSnNwN4~Bk?>GO!fs8F2^ok*hawP6tG!StG*Ii(Cf{D7Sr|Z$GEX)6_ye0X zGX6pzy?Cir5MFQZ>&u@kHwm`BD#ch&XE1*fyRo;m-j`d%aBzveYZW=?&-1ru5vAj* z!+sf+NWJ_%_=3q1jfrw5SWxQ_L5~u76r7|1iHWZq6jVs5ifZ461MMK8r&D`N>^}-u zh~eM@PY6^?_WM8un`)Y_-aRq$@x+XLjAAaoU>Sbpj9zg4;lF+#7{6Z0m``+kIOl(; za<+c7&B~ZxLxyivhwx>cydU(MZQ+n$_%r1Fv(m}63j~&IxfUbMHe|=qX4|{lfU~XJ z?Nb@M-MIugm!OU=K}Pi)JN;QaBaIQ*nqV6y(lr=g0z=wX%uvG5<3v^SV8|kyC0>?Q z-B?nt0gIhw$iLo(-jAPegUf0H>+64fR*m;I82CMczFMOd8J=x1XMj9G#94Rf`G)Wa zx5J)aFj)rO^pEz_Cchv&nQ{$H-|HV5rl}G#`ftzSZ)L+;DxV_{;ZU)VewsJoLO(4Y zo?aYGCJ~wlh0PK{7eKBKCp)pN{+349Qp^N$XRB0!V%iQNL&>!TL0Z6anoWOCtK$NB z;dTEFx5eq^;A*cx+!y;)yU@Tz0iAKbHWOG_xa*HqN?i87YiH)hzYo)2l92aFQ!H>z z8)%gXJ*$Y-1~Y26o0o#uDa-Fxy+Y8o44z&F0$m#TlFoEz9ph0;fcvX5J!EysGz;WG z)1zLl59}t@s~0t4oF!v_ha`WGJ|Sb;?d;5Gpp{F-2yYxsAturUTo(=E116YElJ*y# zu^F`VcgB_<;9|Fm%PESG^q41;!*{6D&@9en1-6tD0;ddF=n0@F-@yOI*b2c7BF&JMC=6R&H}pw&w1P zHe0*53ZD_D^%#vK5A~RN$_aEQ(49bc0^JF8XAXDf@U;MEuj_Ib2taT&MPBA=-3gcF znrMJzy2x2XIaMFy$=7dRzv;)al?x7e%oc*PT#t>otg4emCm?@xQAs!EC;M7cil`m%Cmt7r0=szd0Oy z`Xd?Zn@zRGtw7!KZJbvF`@yutp~_Kwhoa+|)>_SZvc=VPfzwhB5FMaC+~T1W;H zLN27%S&pWSXZ4fhClr6#KT^?uhKS%nJ)o*WOZM47mH}3UPJb4@Dv#9$W)+F8Lt8R@ zco2Y4l~3`OGKfJi!8eFJ&eS1}%{w;l*nE-AZ`Y-SNm{NeShj|?4`8k+pr!M)G z6vF|6Gs+w!qHJ$)Ld=8}ZxQRt zSbE8-b!pzLSNd*UQXla_-ywcP$rzX8ty-=2w0gyg&r&t0WhTolgzIUG{lt+e64|g1 zvYu5t3_O9rqv0SN(D75b1#}`-wH3s0$9U3eM>NE}HRh-;^liR~jW76<7AZ`BVqVwO z_X=#7AFOStf|8WXJBpV^Y9rz+X03wY!Y8l_jgb37-Js=t=4CJHveD=btW=4vtW4In zH$2Cf@V#9djwTzfW@wvT*jYm80?D5CEOSf~bjJaazmxRQEJU6_v_4>n_$b=AA|J)q zlc}eTSXp2O=Q60)2m#3H40{`Y;4?#N;>@dVm@tl@-=B}=y|5~)g;1hBeY~0&Tf5tx z18lA7?%u15mnWB*LZ;m|x2{~bw|OZ5UdKzSx}TqLH#Hm40w$1Wbu$)Jz8T5j%*IU=CujyKbk5 zfK;;mo{1hX#whR^fDs~pzwykTd_}Iv7f~r|jUg@|+vc!rHNM3`046bF48Txu%m_n{ zz!;$`A{e3%C`k|ByeY&)d~C&a`*UFK;NSKrpk6zyXZh3lxZ@*aRmgZ#})fLHrn&_; z@$ylCW9NA3aI(XH$?hfol!yVY16GC=c~ivmKD!ybX6NUcab#wx>gHJShbUif&YZb42&!<&$MBD=Dkj z2?rcrBgNXsGzjRe(3cfQ-UnCl=H`wkZ9)uB(ioBADH`gx>Z)*)xhyGMJ!ZA@1u4nK z(^VK?QyK?87$Ja(7a_=yuiAOISCkud?scYi=N?_5&ZsV5{9fldesQm;-CLu;K~*^h zs{Pa2Wg&QcW}@~m6UeiAFz20-$-5K`)pCuiq+@+%NC}W0TD=Is$%slL;}I0iTnj zF<1c{ll(Dbf1jnl#j$p`(2rZ5nHBqLtG<|I*=Sfrnpc-{bY11a%Z6a-%S1}=DNK67 zhpIZZQ|g?xx5T}Wz9XpDhfiPZN>z@bzM5MfE4k27j=Jt{bh!BIYl+bxPQ;=6;4D~n zq;hv7oYRzZnsQE4&S|PAH2vOm>3we`W*gl>W%1t2g*w7_5B?q#QLV zfESQeeEJ(0D65VRYBP@LESC;Rol!u~Lm_9mHv$CD;5Aa05vGt#5TImeqTvjSb9zMt zJXbB~@T8(MRX!^QMw&3>4|U8|y*sW5CO-C{v`8h1k!S=6<+2Si0_mhMjS!pCz&Fw& z1@sn0f5-=;IiLhx5g1U>2h=WIPUFgEs1~!eyc-2%EFJ}zO+T;+8|-gw?+gns z4g>04t5-jU0~yCUYeT&}L(wG;8RDmq@vY5GQFvo#SoQWTCNRK!u8RC*d8mRf(%)MS5OxUyf1M zbhEvviDs%+UJ|DGZA|?3h^(Rw`wjQ(XbK5ILB9Ut4VWw5i|ws?7;YO%dqm||DjOy0 zirGLpU3aiQ&=KKgA)hNVV1-2@e{ZiiqGXJt8S)QiTw5D-K-uiUM@r5SL(xrDsf6It zn=cUa3q&}Uq>(rXhJ*i%QEWEyCyl)+ip~-85i*Eq5AxImv{gy-qiJfgOT=f-7ubI)*+9On zBkY4nP{ZVD3j_=WLU+4 zxt(Hf3Uok_EFhsL-aZeZca8kC7cqBFbu5t&qSO?!=|)lX#Bt|7qIm6g1z3C1aR zmOwJy_=u?4XCO`k_Meb3UC3@k|NTLGJ(|Ti1hT#-h%-PVBR6pff9Er?Ry{QgFhcwm zA(Fa(g%C#@SLAYv01J^Pc8Z^*9+3HVMly;GlHn|qfIOlhK8lV&0(|G}}eOsKME}EvLPAlQCBWG|HGrYq(N^#0+hK z6X}?&ylu#D93Ud)4WZ9C#~D*^ke_Tww^`mx;K|-UyxXD;80YS3cJ9!*umHTrKbtuT8pzbJWXR{`lS+X_6 zT%9B6&pX4Rw1qlcl$g}OlM)(Q3~tia8*Fw(dtevbV~%3w20Uj2`-L{JDu!AXzUwZW z*Oc9C)kIa1+w2sxj#`(fS;1ap9__YFMYPqJL3?R-f1;^fnuSy+Enc)%t4dg;3`>`* zeQx2>%6(Y5Z+Et9?nldy{1M%rDLuE_lFsTcYft$4O&?BPgvfgeo;=g-TGxR6X&JR;9dIc111-UOZ20k zyt(6%e{B80<1{jL6ys9rG32o7O6rd#a;0nX+iD*vy>0qZLu=cW8g<8em-e?ot8UyF z-^u3gOzu;+s(?FZC+sMVDiv;nrIr=${L3{`xKp>4T(5%V&P4vYuli>7sj&@MOv}rh%e~f1cTjM#LArz!L(MZ23O8l&fO9k!$=c zTSfMPz9($zr*NsXq=#`w+Z)5p=7K*wXGU&Olo6zRp z(VQdcNLKJw&O4ed;1(HG4d^4+L2Cw*e;c@+m)S#QD2=w^s!!d{u;ffU7ABrnywurQ zoSntlSstC8rQbs|A*k(SPl;c3R;il&BiF`@vkG4qh+9+2*A>COY>KU+F~!jodDj;q zB0d~-HH1|*)i8qxIF(#;zf%ccjqq3Q0vFKBMd(sAN$_}fM<`NJy8HS7C z=3u3Rl@3-qSm|Kpy@!>R$wlIz44L#p!vRNkN5qT!4TxShg}q83fDEg#92k;Kv;ji- zljAfI`BU)ZS+31<`3bEpaw!NrtDd<=u2OAuhAa>rX7Z2_o5$_^B@y}Q{IaZj_z?lB;Y z2J9WCzkaJeU$z6R3qwUz8VtMQSUoc5U5%t2zs9y#H1~Hl0XiFCD;wa?f4)ZVK#l`B z4&>Zhkn>=p0_|=!Mbt~eq{O2cUJmD|CRXN2XL}(vN6jkkr51XeO>fXZS_prRldwH41eH+wW|QGPfCBZ~lVd*J0XLIDKS%*jlZrox0Z)?? zKspc4Onl+jifJ8DCL2hkQ*V=fTo->bkF)VYBGofQV8G|*qf4Aj{y7@QBx(7Qau}#l z3^tXw1M*_g=4AvGt8`1keo4F$NHdiK;6{#qI5>_~zU{&O-e&qgwScBDb*cHNSVW<2 zKt1_ZVC(YRQ%ulce`|YZICvWq9YQ)^Na`FDIq9DIhpB&V^wS&t_(nhHyg+{^x*P0& zmx$vc9(gbbQr_bhhFchgg+byV`0=gfkXxeJtPL9^rwRF925Dtx_X~(HKXx~tDz!c; zn)W7k#L4ei)1yK+CD18XUpI2qf~_DoTc{N;)q?KF8;n`b3%4z2spj0+evlhm3UBO4 zv~rPCeLAJmDU}_SN^|~FdD(x)Ae)L-%g?Lit4-lVPC7y zO-=*oux*l=YP$E`i-EFF{w5?gC7PW07(U02JGgPUL=LGrvBiyt-myhpIdLnFhidk6z4e+)L&8FhnOXDjtbH{1H= zX90=W0iR@g+SOX(!s0`NBCl!^;wX`cBQFjh$7CWTbI|dUP^pTeHHoI>zbqrY8TR37j>z7SB^a8*}Fi9+o~RNvPULlrG7uKZSr zA?Qt2$wYs0WhF$J11S(qw^rS(F3m#Z3E=0a6>eeV>lP!Ve$3^%NJ!96C9(CRNG_cv z%R$bN`0^*?e8;&jGsTlB5)~mS*B;6bHy58l^h*#D3ncfISn^Hv(nuyC-(xx*`NC=^ zrQ}FKjW~(`L!5~%lrEH%9^wNJ5->svMQ{ojo(X?6VmKUUwJ-rb9*>b6QsEvR+o+$J zD7HZ(P|b{X${vrA$J6GnNX5r^t}s}YxAtF>#J|M%5`0k5 zq33^8^0f%uLc*E;N@7`f1{ab<4YN66%04whvN=w#$in%SBmYoCR5pTH%s80B8_h3i z6d{iTBD5@~*3<;DDy7M&ijAPd4HXj#N+YNcFy~5Vf5*|-_m_Qk*DpB z*HWI=#pm4J7;rZR+>HTuW5B7O7ta6zkf5e$o#ZFFb9j7i zpSa%>6s*?XZ)Y45C;3^P^w?C#P0yE%WUhi_+P%UiC{xn?UC)=Fv!0CNN1@Zcd;IH=WY(i>An2RPo2@ zYXhoqEizc}4n6@v#riyzmw&k8rFlbp@*@~-sQuJsW>S230=tgx%1>c~Os@<#V2XzT zj{CWWV8(T`r*XsC@cZ>rGw$fDq3t4@0HM~34C79FCcG8N?2e;#2i3YRX?+bgmr^`U zWReoV6jYO~YEyHv{^FG5@E2THluE!5RJN^pQ#2&FB0n93$jWpSsvqN1R$#3@^=;k$ zER&^kLoD$DGICH^}3}_1~qc#R6*CB)>?Q~yP%~ORfD|;|3 zdRiYxBfw{awIgGX9pl5FMI{Qk>if^;d88*_s%EQ)a!GO7y=C->U2xiu1jOAXD7CFG z?l*H|GW6uRer`9M?Bow$vgf06%!botS2C8s%CY}IpVQ9VHi%}z$J*@=E6;|J-=TEV zPV8pEm@v8Wt07^5d7y&|&k7jG!MQ-(wkRc<3z@nsquCaMX5^T;k?lYEFke7MFtcV8 zeM04-l$22@v?8llu`e{^7KEO7ZXg{tMfKNX%=Y-4ZzF@14l~ZK(seRzfP=M;?BE26 zq1ysv0@H1KN@r6RuZZojX(j@TG5Jestcwe076|VyOTe?wgEBN>fCT0-S5>}Xd6;5J z7|Gs41PdEo;Qg%j@2iP?f%Pj&N$l;syg!T!11qrIV{9F;pK7#1~^(b^|)9RtW+} zaGeU&x&>ed7%|Xwf>y1gi=E|8-AO!9;W8JEt^{>$?@N5`xq8^AvKoKrZgR>qMq?y! zbj)#PD8(-X;tMwA4Lm;=cA6YL9#F|&L$S377zZe3?l`DV!nOF%oPHXr4rTg(1`R-x zy}`Uk2s&TWS>ji+Opi`^ObrPVpe}-JdFqY|;4DcO5HRHOBxi~n3V(C_k+PvjQ4UAK z<_c_kSadcVaVK4Q6EJuHsMCa?b96`xw_|KZZ69Un#4j9W>5W>tmJ;*Z)f)J|>yhNc zT285#*)2OW=pGXv0sd*Ne^aXDSv~=&z%TvbnM-ANn^awDG|!LsXEVv4BJO-#J~EN0 zG4Ov;s@Y=ehflItCzGf7DstwPsb3`D%uWJ{rXxR()YvWMMF-lb+;`g{s#8L!DS z)X&w|(b7>y7+|d~{2+PW+rS$|pvcZj2p9zsw^AOMIp!Z8j1M=Z;p=>Qwnche+coCLDP`sM$ZOh- z?WJYCUK>i2nwxAU2@QHR^TDM*n|Y&fnd|L|kC>V}ZnfJf1!)Ml?;U;EIT7`Yb0Im` zL|B)tyd`zx8k$9GYzTduC%#XG)1$*Qeb#Qhi%Mn)WBKo$5M)<=k{p6O1S#9th}zaF zNmI@N)a``19(O6fDM3fc{b~R(G{@^%^EQ#|{YdmK2&erAPIHMP2MNM7`+w*c+)o!fZ1Zd`zQ=`EhR=GQH z33Mno5m7)y>%mBH_YNMT3-Fak{smD5={+l|VgY>i1wp zjmlk`g}Rb`fkm0qaeTu-e%-GbKNWbt?KL9vyS1;%_BdQ>drg4&a9XlVHC3%iL*7<` z+v%g0AB-!FN3U@cnPA6ezaQXDjQIJx;_pci=%`-C#LvXX5~x22rf23@V_yeurR=iZr&S5W(4TCg(dZaTX}#6$6jNWJrw&6uCF_9Zw!}pI zsiW%E$Q3s|ZDJ4}#|Nbz^}>zi$-2~TjJp*aIEqYPN5j7Jrw*rKHb+`9sgC?Zll@<} zLGa++)6#a0$3UbVu*M8xqVr6+T3?JEoF$RY5Q+_>@uM4NKw({ntA7#UmQy;Y*E#Y@ z|8E3sl|sk$9EL7Q8n20hwJbGk;5Qu?8wxruBry!DiwaOCCp0&KAvL)ep@A4*FgC}U z<05th899>=%XML6RAW`-P^?2OLswr`TREd)ba6Rr2EOo>@@eMr-_I3&>68c}p~V;=W(z$Vz%#a9_60 zm1U-!jq*-4tTj%=a&S9oW(j301m>rW9v3BFEI0#3aPhO4lX_!FbWb0V9w{pxA{Bwu9w>3_fS@O%O3xyNY1Cjp3Z=L-AIJhLSdfUW=V zhQ%#=7pj8}GyG(1L(V#a=F-U7ento21}>FP0c)&k9Z%jWhIqw47l9+|kyJ(NC>5096}Lef-qQsLdDm8@|UR zWkrLEU%Kck_I=~8bq!tXwi1tsiAQFX!8F$c2>gt>4k8zNl6kMwY4Z91;0jBx^{A`FoaZEYiW4^MevN`RN> zGG(uGwY9-(J*hI?!Zty^dw}VNJWIaMVmez(dg6Iat+{H|d7SBft60AE-KCE6CIPgU z5KbMoo7sudQEAtJy2F`UF)x*ibQLPpom01n(Y|h;_MF*(61olS@ct95Nr*8n(KjJS zD-FP-QvNI^9&^dP_?1Nd^cd1Lizv!A3d1*^3Ggi%bJgiOP`x?&>9nF@*hdY%#t0}T?L(yy(_*R`%4pZ;j!UMYIJ|E=Yo{|z8wH7xhS z=wN%VJ|}q=<$?!W9@uWanjbQ2^d_dVV9mz&sg@|9`RZTx$c1V7cO$*HT9vTjQ#F_>^z4m>0HhE|w zL!$HmEhX1vJ(4xQyaAHqwCv#7+pja+Kd_Uu2_RRJ3AGg=wUaHiGa-?aA$5R|?8$OE zmY1P0!R zai4;pG)R?A%k+sFf-RibL=b~9123ZMS8p-Q_xTZy7z(Tl%P>@oS$m8ir3qPyjDK0PTdJD+GkH z*+(I*P#eyiglq04Q2-$($r0V|K!*TvsE$*49oi;`Jkecw@{U;Sd{DUU|BIh)-b%2G zDijMHRTK6LOr$TdaxNCwY-c|5o+rY%I#qN0+E3qX0zoT?080o5Dm?hFtEL4FURe3Y zY@iOuR&xug6P50KhBWs<$Q+4S;yOrx0>fzlT6s|#h|y`V?%db#KNcQ+o9=u}Ms;}> z?ZoVz`e+%kcWFcZ%=Qw779u06h{kZrQ@U2aHx2VSIxxTldrqflO5QSE-lojYi+E0# zjU6TxLJj9ty&gZ#@$>l;ZJ9BF{p&O64>&;xUz=z`m~s+cKodQp6X#pLx(dj0|$`#lvJUjA)ce=T|`I9O0DJOT!FZWYG9m z%BLo5D)$)`$AJdZT%`XZ4mwv$l^NUUcXA@3hmY~iKK)pP${MgLdbp7pqC#?qJ{to| zs510^O*Lh2ZS@Qf0dxN4p&r9cdbOpZ-%|hJxSNR!@F^zWJ~__8KS=>&mD+e?CV*fR zL02^>su@WOALtppBQ8*KN!z~5yhMk{dqpI+N)&y_DsYvZrMbE$X{slF1gPw@TU z*|~JBUOn!C1#-*YVdeM0{3?ELKm@LZ0Q+WZ&f(S>@dmn!x%_S%Y1EhGqBZYqbjCGb z{e{B*9U+aS-~kHc8UBtR;It)_TFRC9L_DOJH+>y&>z5vn@PrI(Gf) za)oBSfZsFA-V0dbTh@C&;W7}rViD86Xleo^ZLPjn@bLtqZO~;_wsulz+O88m-|7L+ z9n`~0-5cAGS}MA=bLan8-aVx56tuX=aL%99A&%0!+KZU_MZP`;+S5{B+(m|=c4S(W zD<2$c_KCO!c;6w${|WDkrYL4d6>mfS^k}#&M6+|$d`KgZmC4kZo`w8);4OYzV&Qzr zk+evGNipK)2>#6*DcQ$}0Hdx!c|PAPa3-Y)TR$<)6gTRwLpSk&fwoktttv}?u%)CL znshsP@b4tr;739}h;91<+S^Rmn?r*?K?7d*@OG3LO8gmd-el+yFMs0LdMpk->{fh# z=QNrmmjqfQOp2V5D8kl9I^eecBU_M(h$t@aTp%$n+8s{wiMdGOG|G`xj_2V(JnDB` zDk9?Q5YdQi_6%g7x*3Y1TF+s#KRDL85zl+Yo$tza)JG3fF9k^u^pP3l#_c^nvVNp_#a$Pd(vbtclVl4Y#3f|gRHEYkE z#OkWU>)S0$5UFD)qepuOhxMlUWyRT{zOJ}Qhh>nr%-8dA3CKz96LoZ!xOJ{BKvbDj zxw`5E<%)@}ch%XBv|6ut(X_c@!CCOan@!N;?Um}H-2)e16}wePtjG^};R!RYt{_#8 zYr0E!&7Ufp9Sbt}zNdFe>XX)Yh})D#gry~66!VJJAPFS*xULlHYDdhJIB@E#Yz1ds zPigHd*Xn!`&o|;7gB4n53j2i~Z``Y0*#!!TmAAbN^`^i9!W{XL4@{`p+dTvq zn)OtHuTuMV2xj3`rtmvB3K+`FMwltx$wf^!PW{hm`s2Bav>- zc{bTjAm_Xb1W)HYvIIjbFr%|Lr}-h4m9YJ{L#;yfvz7+L($KrOkts~D!~r3|T){7m zuI%Njg7K*NgfJawkuiw0*lKLD;ElQ9QAdUW-g|z z8F^`~r&FG~sZdita(;R}JKDwVo~-~Wc~%JsI%MFElQ|`pKcB;uos!{CR6+|q=a2q!vP^s+6# zT#sa~J9E?^@eUe%PUX(h)ERBA*+B@O9rVjnXbGscn%OVf{7C|2>XMIOp-|%bIRfM& zvVV~yPe%lEZnVgJ&%IO~1KY1{DK~(cT3S?6d%S)8zx*|LQSF4%Yu^5?qz-P@`qs_m zF{#YywWbV6W!CUUZZRAj+B#COG{i~kF2j)k1@I62z=!9uu7f!07w+HL!buN@yQG#* z&(f)g;Bni);P22V_a8ku`pXtcz9r?JWt3TQ;_3N3Zwb}aT}@}wSml-Mw^arDWNv9o zouTP4irpMRMkW%`6Pz+raqfDBL*Ti^7Dm8aMIf#EE?#riRu4wr6Erj{Fx5h($gi68 zf%zZRjk4!P4_VPfOw8VeW2pz4^2--HzZesfTB6T3(HMhnosqlK6=lV+Vx4eIq}sf2JSX$Dm*$fw$4Zatlmky$ zqw!*Tkcgg}`j=v7sZ#7|4a;DsBS@goEj+nW>*bCZ9i7y_v;yIaVI%)ovjwQ>yLfDPA9)Kmxd&K+w{2J0BN{g+Zg>2?v0t%5;>2}j2%XJPFy z=d3)-RIG|W$n|g5BtHF9>zl7`Dr`0*ZNP?#!liG$SshaOz^cHKX-5>Pl<~k#wA+tp z1zuXyrmF!fMeq6ZGASOPHJPskeJAOAy;gux_Orkzs)&1%b$#>YvsokZ9Cu6CpNuOL z_>tbnUJ4y9r0i2v?Dn9L|L&_B#u#*4?x0v6V)+;d1w>rKL3aC-W~OJR1q_qg`9Tg0 z?D!A^2|NP8BOE7n8WxR61_iDn&}D^XDnn+B;3d)v;gR8B0Tut}*pQ7&L)NmeRx+|s zGnr|`c%R}}U8;cBr9<7X!3kJ-m;NM!dK!F|F-@A#5 zF0nTsq`ZomjS6+bOU-i)?U0}1%%x1qrXh@*7kUz!aDVuxk~1H?$i+ovsVhU~(6C=p z<(LU6M;T6Mx(+bbvJPt(P;rjG_}iI&j2%Lq#o~PiTrL)eEaY2tft-w%Z%r2bjU9JS zxg95oj)Z<8jn5R zK(G_qFlH{~WbVpV9S1fjHlz{1I>4&_RD%~W*tciU^PI|PD(V4JI`?mAZ6}5j&z1ES zkepbsxZInM-Y^Z^D20qF9*e=@1=TNaM*>3ceMj= zC$+BODTWl>%Lk<&K(jV9nve!ik&e`zfQ+4hvMDU%I8!_kurOBGQN=&_@sCRw!Jv~A@sat`=aH34;I_@?h2#*h52o&y5fmM59{w_~ z2fcuuV^5PvZ%%j=@!nHp)c1cit+009u=19^)5i)M-5^RL9qumg_vJdnb-#PCF=?+9 zLn?5D5e#o0E!Av?Jo-0AKE0l!#>{ZIBtM!fEQl5SV-0c+Q#kh%!&$2BJa39HprvLq z*?zr{?d`sN*a2BGN865Ab30HEmJY7=N#jxyRNE<*&hS&Id4d=QQ4Yl;$99gsoO}^d<(_in54m6h=x%6tr>07>kICZ$TZSPwH@wigPaaO?yw}0aZuF2Z9DFvH^0sR!tKmobf@xt&nvBp{D!A8Gp53Rn*}cCaKs*|Q zRCT*n59e!=-1nNQis=ViA*wAww(O7wnJU4CwY`QI9o+ny(nZA2+Y?R!Es_5bs|oSL zapPQLqkGY#8R-|(eCUeavh9a7KS8me5gDiW_rj)-M6-$0#5!1u&+;k>PGPqN@*!s; zk-_@1loM3>%He8iYy#Q>os$-$u-8i+zKWlvRa|*RCnX#+p@m1AZCx{tJywb0(bHYBimmU^!Hu+FxW83xFAMAuUA;J>&SpPAW4)yIRQQP56W67`!W~` z5I>LKwa#M)40ohW2M7P5yTVjX!~G?UdWAVOjUpL>5LMW!g2A4bJFZ_fF2~GvPE#5; zR3DMphk*8YaRC9U1|Ha8-zEjxXTujnI&@mGY+xi4*TJSf--z-n&a>Okq&GBY~ zGGj7do%i9Jn=-Tw8VKZ#Oy-S*g97Yq(8xi=a8TgDnT}skbfw>Edi#NQ$+ZWe2Dm|gf zSl}u}tmp*|#~_pk#SGXz1vSyvkqP=vuMI`&uEIX)#`i?WEvj=XSZ_?4 zoVXQ|3UH7xxK#1iB;2$G7VPZFCglB4zx?sWBw$$jSOal(qNA2=;@*1yc(0dgBi| z)iFV@%iZh`rNl7r%cePg;J%pN%(o43Sd5>Il zlI-Z?1rt48bn_!$>S542W%9&j@9X63Am-_tjgSi7?+*L#CI5cI$qzj&Tny!aW?PlV zd%CAxe_7ZrJx2NSEK$q8@L~R2@zIsONGNY1D%zrzt={{6rpUU{c?}`-;2XA9vNo^} zIxUH6=FLSp`<7UUlEj?-eI3+V_HJumCMs;BP&17b)H+d9E2c^c^?08FgUp2PwbDqh54 z5{n5+)xJvo^vl|JzHh2mk;800030?7ew&+qkj^`c+VRe@v26Jl^6Yes$`Vmn^>H zB)+z1a?go#??5CZVN3xW0<^73<-5PaLK0jBQdA<_ICW}bkysia(EaO1qx;){hKNL= zH`pI+ZESDs4Tb|u#&od%ZNM=P&|rUXN_ot{`PmUTI6D~(2Y)vxVwe(HW9#L{_H!TI z489KsGsLIVXM_DO-v$KEMAf%AKpw?p<7f&oISiJ@=+Ke4|4Hj z3aEmrvy`c7*kvt60zwpt&A|X9;0a`N;!Pt;Xw061 zDS`o?0#DQcl*movi8g*^9P<1I5<^Ys1*5qv8xtQz!5otbz+xTG5aDtYZY;gwKE^>% z`h@ynwtte;La`c zr+f1qxUejPo!v3siRXK9jCQwgb_YVDC0kXAN6XFX zIK%1I)~nqH&hQR#$?Ll@hNSjFzVPIkm{7JMOTS0ZN6|t|nKWL_EC>!-gGPhg1q>tY zI{}L+9t12zo`2X-WuDPaYB{EHkC;Yz`IhFnvWN|C|9}aK2K$5Y=GOMk?qE2$#NIWM zz5j9k_AH`wJlG%nn*^Kxxj3A9x>c`WyX}at5DQ%z z_?*skmr>+d!Tp49?PjgWNixXuFIv*TCW~O?cJYu=Ahefth`` zH}@=B{FLmS}p6cI(*6ow%pYn1PajYJ4G!Oc-!I-A zgSVf~!Mit?mnR?Jfe&vkE)L$kxd100!2!59dvkR1_T&g0o_;#|O|*FY34Hu?DSzta zn!WraS}?el-%fRcGZ-YOQGj^e7UQ*Mt@;0I~^Y=%wbydMXU=Sm1I(P@! zDV||vMtKL>TZE2an7urU&-;TY1_GUNR(;2;hcLSbkCA8I8jJ43As$NqzK-XMkZGU@8)}u{7 zdIMNtZ@sp=nl5Pjk?1|yx>~{j`Z4sVrT)lu)B?xtw&@He?Y64hs>^THoD^JtBkbd| zK5V^gwm!T=1Toy*?x5>eyL0M8$x9qw2rYWCkwLfCt9c=#u-T}P^lhHGPxLdTs4wpq zmYa~eGu-s8jryTvBZ-4RAAg9XzY_EN=0a@upcef0tL6oth`_E3Ue~wwInm{9R=+OV z>*~+QU2IlM`i~IwCB{jA7ai3yo7&OIacZNwBGUcRaJ+OrDG%3{l3U(&yexZd!^|Fm z;h>$K?U1)a-qFJYr8}>!WHdV=mlAj_E3DIo>ZG;_ynaLTr{Kw#uYc_YciK(E4WzW) z_Lq*T$73zlGwKQlX6n359!Ys|B#)mI-tA3z7pB)r8uTRch9$lo?yxD3$nMVd%gIhm zBIN(`a(qX2Cx5-z+3|Pi?hgN(Y=_%8yt|u5H{SFH4ZeR}35KqctLXwM&7%3nYW@UX z>f00Wk=Xa;2iF$1FMq8p8+y`PIx%&!%PrYelYPWk$OdRsHj?`-dtPid%N`*{I?EgJ ztWL(LPaqV-lQ8f<$?3HbE~3p|RYFZ+3aV!>n{!a3gs{uWCv**<~Fi_s-JV z(jQ0tH2O>K!geY_r%kWAdc>D+xA(T1w|(Aeq%#A^H?!DC)PD+Q<{Mub$SjRvF~lrT z*5Hv9LIYp|I#zb0vX7QC8$C?3k%PAm-a2@@Iyv{UDab_1snZ(^%gMQ<85=p5Hwf#R z_EInDs!{4y_OXNvG{$Eu15-K^85kuG#x%+VVud8UB30hX;BtzxHndA~fLUV25kiIm zO3-sopHqUAM}Myrs3D# z9X_?R;SWK$U1`^U_8vk1XbOp~(#5CELMLmlqo|Q%5`SY5G%pe|e42_D!SAFF6`>mx z@n2yW26G_xfxO4S071w{zF_tf#N{#l6%jHbyLSQ!<5fx6%!H|)Ob{)zzgKTgv> z!T(+ndDssCKR6JN|2KKe4-aJFgTpHV{`dLw=g*!$|6g5E|I5$Mb<3Y=9Qb+|;Lk6L z{3rbI;D6~5$U!{e2ZzSr2T#BL=?)`Sd>E1K*>KxU+HwLlV+mDaH22nO9xqKXqOGJ- z<^qBM23ENWW1_cn*#k3jsrUJ&l6#`Vuu0IKTt$JnhsFjdK3&l^&j7wb^E zchdz^%c`2VN9kDmQ&1eMYwZN){8?AVPuo}uMb6%zBaaYb?$%?VBJfLE6v z8dtUnCC|kaWF0^dK#n3+^ok^RwG$Ihe{3-Skr$h5QjNJ7+E6?OSZFJ05o5>8_*e!8 z(0^qdWOaP}Ve#>;1z|wc>>kd0Vd6_QmS$EzT+D_l2rpu`B5%fE<5d{4{Zd{9Y z`h#hjswTc6`ZJAt$$gWlc%hsD6~}N_t?$9=-fgqa(enS|=ps%TFO^i_(3_ zg1w~rNa$H06;+3!_^(>s+Ur$`K$Vk5@bn3cMsR|FM}q))oc+H*2I|Z5)8H|f(|`Di z2&E%tLi{LgBfz|UKBy)Un$D$dtay5Z$>iNpvQ*CzhnUFlwbEUql_PuBSbDgWF#Yd^ zrdM}E(xvD)-P(ECtsP04rL%6W7xA1?wtxX8osMbbp>Z4t2!D+@OLa;G zyM<=C0e)xNG2VkRg0=G&`5Bh$#|9{NH=CTngl^LrQ0U4F0EIl*%fQ8_(O;t8LUf@U zZ$KBirS|Y5qub&DFQFq%nam-_jAM@(X_6-q45tOq@e3XO^@}>b`(*?f`bC~;1&n4; zM0!~$6Loq$Mzo(szlXrb`)LKaIw zvx^2%Xtvp29u~&20P^NY^5`s##Xi4PzsEExXxm+));g@)57sr8MSsmirY|j2-Oa&c zI$7G?u5*?PFe3a22Hp{!&Cc5Mj(q*ap_*i|^94t#`9}LWP%RPKz#0nudob|gKtce) z57a~D@0Rff@nL#n4C@i;Dfw3A!(QW!4M6BOL$5*rTbtXvEm20djF68NaO~9iZ0X%W zJQN&54lg4}*ti0r+kf(oVncOI#D^SmU1lRGd~z&x@(`hDL;k%3MwA9k2DX}Rmo~Q5 z4<}L01$oUZr$m$|9|_$<3?C%p&!S4GbF}pN$+1*Ip!fg7!*_cJEc*Sw4!zHJ?|%>9UTnW-Z|J+ryXeE| z&2Rt1$K7q_8QD8O$?MD67*Dr$ck5itj4gVOc!bdn42}^j&rTc0musnx^F>La8H}zG z-waD+zGbPk@>00b*xXl zJx60{B@_Lgqwzw;QPt{4S4`s!-dfV(yL(&dZ_CwEDaMq9q?tWOhrQoF7?5M6`<0l&`kfB)m>WXTzxS^Hf1q zmt%y^46VtQskgH=|L4>4cRyirn8_k(@%41gs(-sis;kn}xjRMOMaYZII@e{%INxI8 z%M{Svgh*1|#{Kb`dAZ`hV-(FljmIcj45^b&8ZTL74R(Ol#xQK8O-fJ-I+;8&VSrB| z2UB>100bV2IK)KCmSOHzMMf(FPbfhk)MqYFoipQufa8ta_t_)=G=iu0dw(U{PZhUV za(^%F0;ES#S>E*v(xg(8Tw2fEAU|Mo7Gd#5<|Fx?FeC(O_C)@DhN8ncPanbg3=u9l z+6@d;LxqPY#ETGQSuZFulc&fBX9!6!b)XiC`CcHPZfBaN-AfF1iSW1bt5l$>Y|dII zzE$(ksai5yEe4QIY}*bs0IjqOcCaW`;eX!JBC^ZyTeHZl)%p&`(A)-SJCmz*MuM7QcL;Yd*R4v{0+)fq@tu0x?(-;pRZ@hDti$xsdUW64N~v%!|S;|U@t(&F~$ z;9S`=%8te2aetWcvFL@3@N6wyC?B1cx?OimL2n9qoN+?Nv@?T9TUdPB^DHU4SbsM) z+U?QZI8W`OlOB@>Gp3U~^Wgv!f$wD^5`9}Q38LX67&wjdL1>(ne%Q5p#(ZPN>LVIb z27_J`J?fA`QX@%n1y)&?FStwuyZ>#F{PpGA;G-I1sd$-_r!U{!g~;Q`KaN#ao^pw! z2#Gnp#Io(p&CRXn^8c5coBQ(r|9=rmS?Dh=bV?_R&Qm%m_hZq-_pjf-O1MjJu%Fk~ zjv=nLI%o7A3f*dX@vr8aGW+L{VBs(smD{1@mSU9 zWCzG|+j?!pFgO(VW{c@FHh*h7GIN`ytTyE%+f<>c5VG5} zEe`$j0QF(4`!Y~=o1@>&k(=3tYpjVQFX2|4$IopSQ9&ha+jpYYw14f^UdCHTtgQk0 zZ7i3T%%Vyz8}31wN?^sNGF7F)x9MT{LB7~&3`3v|U|QrXWgt{-)R_olO!(gJQ}9H6 z7i;sNYPH%xcr~~hbhZ$txu%nY>vACsE zaxmAf%FY=7V2$xECrgQ`yxMGHDkrlgE;p#k3;Y3|f+x>Z!E?kGvlUge$5XzP$VCiA z_l#%ic7yZMnl z{fJJ19<1~A-hXD}O>!xr5e$~XETVobRl`7NG zPLV3mliiBOY~SMgGges$_iGG&j^iPeCG0KWS)+~2CD(FC9+RVg5t}jSs<(@+t@XN;Iy`1~Z#sTJC6N6C|*61S0@;Ws zmz2XmJkg{%gQ_#AuCqaPICyh|2$!LWJG)=xc7K75m@aH3D|3UhC*EJXiZhu!PJ5!} zEmjr+ONtv!LOER0;pAm0b5gfxi>5)SiVxU-`V4urrQv>Bfm|HPCcSQ_F;<)m&)N_X z*iNx4v{HAIMBjMY(6L=*gvl)C`HmU$yiLUOLhlVK;8J1F%Y(E{I9ntz(FLIq+q@XA z(tiUpQA--5`i)yz_zHISHMJMcYO=XE1(jB>#QI&Yy;OLaTRha4s$1~#%|2#IMje6s^alm-@it<-N{TdrzA zwg$Z_vLNSZ7IFqS1(A9WpvoMcOn(Qs#e6E!j*20dK0i5@wgxJrUWrNSZ41|Yjg{@^ zovz!t5e(f63|F?0{g{ANjuD=2?Y(^6%m}4(Q#rZ2E%#H^>sVguJM}5@Q6w}q!64Kl zt6*742R$ll2F;7{gzg=yV>zUv$E1E~GJs5yn3Wltnobo?#i;vJ*z&XaQ-9(_JidWb?cqM$m-#*8U`ma+f<>=>4;WuG*TZcV631^b?Grl{S@} z>?oU6imz?BV;T{lgT=zmr{kd+C0;j1+e{?pWi;2SzzJdTc#J)n@H{4dR~LDUmMy(2 zEOe`dUG=4F*^J2+r8JRSrGJAl4ub&srkgz_X;QyX@ju`xkEbi5PKjZJ0OPTD4g461 z*09kR7>mvxu0MuTC{DLtZZ<}*Ocvv3h`U=QvnJ}cbh>6|FuF#3L-Awloh_Q~cMEG` zZTG4q;1*&oeKQP=f>SU;z@uV4^ZugfSI^h#jF--Kxx^0JYK*aVA%6{QsB@V7w0_;* zdX|%31jMm3N2A%gpL_L^r!g)#`2AMt<>DjVak~KT*lf zd{>=QYhO;S>k2fs8^dJCASnT2Y&o!zwXrI|k@e6o=*UrS0Xz&k#yCRHA@QG&X*5Cn zc?L!ZpyP3Xi3<2C@V>?*5}?qS0~U`M`a6~jGlJeVCKHEO9DiPMc*WrrhgTe4dBk{S zr!EqYyqSLpz3Vt^4^)iGbqGbxUXyvzXk=-_VxFJ|;9+*^$sY_5>LV~x&uB$*FX;{` zCU65>PSF*aAwH#Ib<0J;0G~px!|d>w0Ux3nC1UwTF(G29C$3soy&|GxPUHN<8fo^oQJ%3a`I| z>=e&1AMC%DKlDOMU!Fy1hT~bH4M=_{gE?spX@Br<5^VnG;&AGb|C*xz{@1?-!$D<` zr_m_%(SPJ7+QGXXW$2bq=WO!g?)onLdrY=($KF4CvzzVdj9&BGk$-m$?{?Xst;diW zbz3ZFjJrcsJ%2WM)tu1Q&PRIgZTit4+s>6oeaCNu8S=4QVk1moG=D=p>I+USJ|aVV zyT%O@L;au~ptD+k9S}FO)C@ZNl{C2%uQu2A>wg|xpv%6*1=egEp|2MkMTr4~J8a4$ zvb%HraJiK9N&@M$zLyacKjW>yTkt`+u=42@9w72jW@l~QAB@?vw|sLY9=y$ zX@P$>R}}VQO+m_wnj5f&98G!U5-=rcqXkeY!xIf%tZ+%vVKp+@>u2w%iZmj+*DmVXYNL&a$Q+pMst~6 zJAvmE;U6REUe*LxFqo}YjNZZa_kAi`X`u{1(?2c{@h?K;)fn)LHLXNlMo=%VMt^lf zZDqSRXv(Y2@?1(?Fo+35JXMROaUY|g$GbXCA9nh%(}&ktA1<;*%RTx5-n~U?yR}@* zNzES=Hqo6C^yE=h`2Habp!no%b%J68Z4xO| zS-^7EDDcGMwn34C22)p(tf7r2P=7JN#Y#YlCg}T2UBU;Ps^cYS|~xv%w4&PB1F!r;|rO{5sbwca6qju?t=P&P$G#~YfUq<$pOE#0c4c{(rh z$=in=Udh6pV+}T^yRUJ&^=i8&L``|QcIE_G6F*DYGig|fx>p#at-_b1OEZgvcSw%~ zdA0nJ@`-h()@gfA+k2?m-hWO_ED^=BK4U)hBY4|U8YIAX|)#$g$8P!!{pmbGz$aB zQRed{AAewzM#f+0qZfa#3c~B{eSLXm!TPo=?q32=S2A?rGqA^j<1Pf{%BIr>fkAjng8Zq&egMtdqR8j5gaG)I| z^mJ-(iTy|63Naj9;0b|h$$lHCuuVc*0C4Or|fL;m$P^!yU&H3(oH*4O#08t-i|@PB&*eYHj_awXeh&H#CW zh_mj{^9|tQ93Y#T@E`VGem~~=X{Vk2IrI-oi&Q?kH#IzkkhSCcFqFt8L zYM(uX)XVjO-K2W;q9!1+WbE&d;wpT= z1d~b9{=zdhgO>iz*zyBh>{f9(MG=x7^MrCRM;t&h2Ogcx4l5 z{>p;mNNa$L6#KJpf#-K|MKpopd+TH6GkPnnX`6%L;3ML19BEF1ZPumF{W7Jynzek4?D3DO<`GV2VD9LRAXrzYNCSE=%d zW4%_RqZ$R%>7h;!bu8MkXs3rhAl>CvO=Jd&Jc|CE@F-@yON7Ddc7BAJIPGl3_F{8T zwua-3Hd_m_3Pcg7^%#vK5A~Q0$q95P(49bc0^JF8XIOTI<+T83uj{e^2taT&MPBB# z+zFTEnrMJzy2x2XIaMFy$(OHRzUq@`Coq2$+5Lr+t(b6!!m3f&A27haCSSSgIb`IJ z(OMuQb7__xCRYwbs@P`*r>QAs!EC;K6ELB?m%Coo7Pw%rzd0Oy`Yjpjn@zRJNk z7!KZJb;}Tryutp~_Kwhoa+|)>_SZvc=dGwnwhG@9MaC+~T1W;HLN27%S&pWSXZ4d8 zC=`ErG*Z!jhKS%nJ)o*WOZIs+mH}3UPJa}>Dv#9$W)+F8Lt8QscMyP3l~3`OGKfJi z!8eFJ&LkX;%{w;l*nE-AZ`UPPNm{NeShj|?4`7xMhr!I|@6vF|6GsIr`HRh-;h-|)yjaT)PNhwT!-Cftzw+d{SAFS=A|B{r{ z57O)Kg^}8b_=;JpAh_@etbz>WzR;t~^8flpU0xTxft4!Jm6gfb_J-#e6TY`=!_j2J z)eLR33p+~)T_D-ho@KUXg6=pV@^_MmnT5y`h}H)T5g$bxSLCDkdNPT#5p@d8;9Q2M z8X*8Vondc(1N_dAnmF^)7$%G(==bMic`vNWY9W+pPam%)TGj4$=TKE^y1V!4BG1WX zrjTj3&8;if?QLEPCD-w~r|#zm-15vuw15dDBqg9GL--2DBuKx%JuIBFUm;rEJHU$*x9!sn#j9AU>Fx$If3!;aAb-oK`7dA}x{v%_Bb(XSD$o}X= zi%zmS$?7C)XUXc)aJw|zE5|#pn&Nyd9pcL(x|dySuWqKEMM1r~996Xr+htOrEVD2O z<^VDQmZarSuA|RD)zhx{MT4RU{$hJ8wTa9mV5P(UH7y~dA95cd@BQQqjiU@}214`1v zH*X3t5g%J|-ToYyJNUOf3aHl(YdO^9P}4F8k1n=Ym3Kh1b=YaGPHT1i*YRJcwXU-= z^tvfY+`3lxZ@*a>RmhU!4-QCHd@B?;3S)P!!W=~Z)kh7)aGE@T_1JVM}N%qQFrhDbbE8BE~*y8lLOyB2*ZfpbZ~vjRkysY zDmB>hvmKD!VGVaHUcab#wx@$wJSl|e6kK>?|o+jbOF&1u4nK(^VK?QyK?87$Ja( z7a_=yuiAOImwg*`?scYi=N?@~&ZsV5p^1i(hW~v=_%G@rYm;#;MFN5_lejHX0@z-Y3@%v<4mgwjmv`hn>=GA~a4s4G zc;;HB$F~A%E-L{&c|_SIH>G0C#gu!=OVF6HRD%7d2;!P1wBl-^UA^nwpn zb!?~9Icsl;dm(*CP_GZ4zSxzj97BCIw?0;Kp`#pi-QDPL@z>W9qd%O8L-)a1u&A(_KUfN)jW{2oTC;8)5{~NnsixHl=}Yq(uto zEsB4T4@Pr93A!RMprR4Xr@8L+j67DG);d#r-!EXhv`G$2IxOk1q{EV3vE=K9=>HeD zFkB{el2L!f8RV<(-1ZQ!(HKB)kTX9i?XAWpO_eeIGoz^}svznL({I*>qF~b`ba> zLg1~2i1`9wE#n4l)L(_mL{G@KZ{O$qsO^0xOj=Uc33dy^P$1ZCjTKqq1Dr)qSQ&rj zEju$iO#1*a?K)F?53sC5hYlS&bm-9GLqvz$HQ~k;(t|u^t$|@ywGI<%SJfcab%`QB0t6?$(`vyRYj zWggr}b*X$6bIZ?j3o5H;-b!#(e9Uf~Ilq+JOtD^SHso4guP#&g&}74IO^koqGdTCA z2SGpu#ix+8w;hyPu(TdL1y7R0vU-70YP?!*Y_<^;RRq_|i-)QbSILU>yyU(dqpay> zdr=e3RIR)uO!3>8`0Wu{MH}`T?%B~45`uz!{lyzFSG*V7TlFy9Hk9^=%CA&5O4Jpz zfpWU;V1J+^!p%ZHS7yKpi$s6kUU5Xp7)LYYAI!M6Ht2w|*@KUioFj&!o2pU?!KF8! zA?6o|a4bn9aS#j#{~e>)Y~&9bds7shBjh7w5YZmwsR?MSlIBO>wstpTMR7LU);B*- z*Sfin*0GWN_st}SV-urgb_Zi6wC%r>$)akZEgx?5J_~=gy_(pf72N!A zE|&Tw?L)vNZ7p#w)tB%~NLiH-G=|z7qwS#z#QSwr?E&sWqVE3!~Vt*_7_TD-EhNkfo`eQSwVqjr*;au^+cA4&z>)^|5UPpd|OA@ z2a%wL$H* zWV-PYQM1oLoCfSaA!E9b-H87CgZ6qfi*pEMeNPZ)fJR1c;t+q%XJV~-Y8YUI_$@*t zb^i(>jyA5yTU(ReZilsxyQ5EGfaSRR0m zW5Mb`%$!Tu`cb>aQ7W6XA+h~xbs+t+o#vA&G(}k22fzMN>c}#X`k}$o*EJ#GBzJs= zIzrQT$QG8`hjxEX8vYb=)>g#4Lp5l&i-b{wvvXTcd+#P=t_Wz9F_G4Ar38r?+5jig zF1SaQFv)-1xY5b^ew)PD*~Q_&r?JI4LRHR zG#*PA4uKWr9#9@VGL*BlhC^u!b+{-osevaYG_)Apq^&pD?27ilF1W`W#mWtM&Ia}qZD3UlwJdzsT{y2P zyVW|By~sS;ZJCN_t1*N2((HdkQ@b<^sZLtFXsuS2ut*t}E?4{9 z!ljk_uyWt-Y}ee6mLK^ex;;~RZnq_!)nC@0@a3yMoV*B;_Y^#NrrWi$A7o_oXGX{k zZLzu9se5ZiZCTyREipTO@@;S+Ejrp!;}Xx%DfO;DV3H=zOP|5J^w|eYE)bXKM?ZOU z$0L8)`hmx3Wa=o!rPO1{Vbzt??@Q!L*W|a=K2mzy^reQ@wktL2j`uF@Z-Z9dxG}zy z&E1*Yr*2gNcg{}OQ5sb$+y+Z6E8O{)You_eZY#N71MH7ELvlWeqFM5F|1S;9`ZEz`9#dagt_))fs z>;rvE*whcp0Q%lK)StaYQ+b6W|$NEx!)o}C!#R|VyY^I*W0+{Tggq)S^+`q1zn)FfrHgU7hta)8KY$Vi-s@MdO!F+MBA|zk{M`cNPALDaFn`(Yb#o zuBmBuUD?Qsrt9t1&A+2L zN79k3;H#W>G+V$eGO8NTN3Mg`3?zRya62!vhssbIZNpWcx}9OknRqNrJgs=Cv$Hrm zi?g#lIy+0hhiF1j+sU31zv`?~HTg%bjTdJXzAg~Arj)NMf_>Q(TSH@tqbc&PFG56o zIO=K$t8A)oT&w4$~`j_!_#7xx1G7l|TR)R%1CZB%5dhgz_iH zX(IBc;K{RGo9FTqT3h5~o&J9uQi{WKSB)w`()!rS?`3xFO5dM~T~G$6)rD-pX#!>U z9Zqe5Q-_0#DUJ9T20@n~z((bcw>a7YP=}NqQg%rBu_5J$8W4JSvnk@9W|7@vKo||! zJ4}E1T7AB32Ur(|il{UgcEz!JWX`)9NjrXxZLetV?`#5eHo#Ukz#o5ojoyJA2XY+9 zxwjza!A1qz-D--cmxM`)M>D(}&QVRQ%#+UcLTZkhRoqK04%a!+xzkQ}+UekpgEtP| z+zWW)oak2PMCYP3xF`+QzEvb zQ2^}n=$icui&Uu=naoU35yqncd*B+)(_9}^<*u0E8$`g#ar%5rBfyXs%9TC}7=Wrt z_DIt|6jq9@1+$kZfyHJ<;SQVfi0tlMzntvEBtrf_FUNOeckyw#2-2oSqcRxr050k(@hyf3iNkBS(-6V23l6WJKW-153jU4@Oa2%_A+k^eR&Gdh20Zn1*Qu9%~20)YJF5R?M>{6 zli#tXM}=-mpi{2CZse*3TS0ENP%B=l1>KK-HyE>=7j9e5Qq8%s{UA5C6yDg8XyqcO z`gBUAQz|_78qFENgmDCa{r|7G(>CYp|1*94n@(BWm-&fbW`RGX!E~B@ zBJ;&;j(7Ox*7nZcK&BV;dpurvk6@37Muu7U5C%~G7;LID>IS#YR_c##w)M@=0ur$U zKFRd7tF^?1#fJt(UezSTQ6dvZUK~J<$wWxzpyMT>QZsdsq~c!C2ya}{Yedw4h2q6H zq}Wx{^`Ly)9Y9FMxE8p)m+3Rz-q9WOIPkJEfT==s43aMcATN1+Zd{Q|fjYD&P%Oj% zB=g%TicsqK6H!h*8UW0N3>iu;jv1gNm`jKHWHE{_!{V9z!u>f1IoE?07kTmvv(h&= z|K26~D)P10HAxlJE~K+C?hrkH*sR>bll{xrk}Kp+l`EufS@!ZN=3#8X?^Kl@og&lG zEe;!;qd>ZNj{|gvM*#vJoy`P;kxuNUe`C&hQgEMYW@b1p!U%yVCIE^CXgrz98h?BM zw}QKAZWu=N2K&edQyDctI#_<5A_6=Z1jrxeJ{`ElL9l;Co`X{g{d|3YMZ*x#NU%}) z&Wj`Id+CX<3Z@A90FNc3O=^jzlD0FiO|2qoN6bPGa^y5j-x}_nR|J6P;0d9!H90`c z0OKfBKByx!rV#=+Gc{H@^V;`QdyS&xwDhTJOP!u-y%xmbB!WH?gMehNrcv+=KMsW4 zP!o#O>ZOs8A0!R}(GmcEqkwwX42T_%d?BE+;i|5V5{24}sJ^cyhALWET=}gKL(rS5 zl8NNXN{BKCQXract-4uVnuW*{z|T)B+``D$Ek;QFn9FsMkf5JRV(UkdTsljZgPbAp zj&omTiYHSfDne4OJ(M4AEhBy;jC|xKiJ;VndBw&OTir^G5JQHZda5&CtVFG+S9wRxV!aY2;Q9m*SbeT^sA7kUK`2tCS9CTp$qtf}FBU;EeODywaHQrqW+;-} z=)opqd%&lsz6JkEhLDk&2J;Tw$;(Z|y%NiGPakCHSDAL(i$? zYZ17Ggfsn>#Io=VE+mN>W^=-neQJbcbDUn0h4U>({-K7bYy`8IaWI89nqSf=LLLW1 zXjx3HsR?9PL^_r*(5ut=y}zea1P8Xr_z^gBb-pj;PT1Uk30u!m7n>p#Io-B}TYXu{ zDSOvfma(zIo>R*EvzBUKL+8BjocEpc{yHs*$K#{zocGrTcy&Pum@@r97>R z&$+uX;BE}K8w2jffK#E@N`-be2HcGScVoca7;wyZ?U=Em)ql?JhF#|S->OL(EM>{DVud%@N6`@t z0?1JWgF_k3K)@3cURb!R8 z>SH`BW{@q*IxOVK7<%a2cMB1hk<{N^j>14^TPUkJdLZX$7AiMmU%tp+Xix%T2u6@) zj@A+KaEK++l-~16f-5Q9cnFz#gq>A4LqqngMqoh~TOC6hShn zq53F*agm^8s8P&nhVzksMz?5E+u>y#jcN#eKMzslNBE|Wo+J z2}X;H-o`t-Zd0_y@|C-w4ehl{#by*Wi@!zH{B~?nF~4@(R4lHCHg(Ol-J)K3jkc&< zl3T2t;YE{tW%~UvOoXkkz=r-Ul;|b4_}%$0~Ww zQhg!Jd~NZO4{z0nU5}ITb(M{;o6k9}~i> z1*E!d>g1!7k4`>1`RL?hUOw(^Hl-6e#f&eLt}&}`pBU+X%h!^})&fbE_0s6zTWGeu z_{xoD!5O(hlX*U#_`5Pd#{k`+Xs&OOU}B~>aH)xYI0GuJkE(D79lYK$w>SHk@1;RK zFrKs36wyWOoFp+rcdnDPP{((k=>i`h*SU-en?>U7lGo0cueLE;Od=ZDQs1&PIl88h0WW}9tm%;6 zqEvN|jw|3mrFwG;gi|0MumZ8u6i4Hf((5?v8VoY2z1(%O*6d05+GKoRnl)u3v$$iH zQWPN`VRWNoFr6Hy0WWlBJ%#o4LwCW<@ySJ&-UVE8{l5H~GQr)Zm65 z;D@62hA7FHicyb}Q6Ti(hu^gw(HMNk>=1Mnk*j%~x z{Ixhf3(lISOxdjCP_oW9%!}x)w8@-OX{^zIp$@9yX`(A%=$NCbWyd}p`&__2n>Tjx ztMu5jqIsr-p<~RcrJ!Q84Tp#7UlW|Fe2PM zGftwLo6k<+2nA|X7aT@hoew5ATHg>q|3I%~c~k8SMf#=W{N>o``h_B-@c8>sZ7DG+ z7s%r@s_6a{GX8t$i*H*XBY%J$$Yntol}~g zwk>2|$>x@t{^D&rF;{WBfIY@)wMq+?uF}>dR;<9bZJ4Xj>ds%~hUk!B%-Fx_y~HGF zeRT%JWc##OqvZ`{HOA8Zw5nz7(Jq%Y8=gE6%=W4&=82L%XE5T}!yzPHuX2=s+v$Yh zx@h2Lr*=@T7md6yRx3=GBh|EZHml_d>V;WlhxpbJ@iptb4Fy}GzFJMVKXCGswB!fN zgI_mYI9JO-@8wE;p#=*znrRBHm!?^)jP2T5k2ZSkFEmxvfUK>bCPnp1bUqHOP^Nng zgSRNv-;#ciGCSZZ?zTAr&?0PqV1u6DUb%M~{g2k@+nJA@*6y@+r?sz-*8VW?;mggY zpbOIF`M~4&2C3QZs-u_MS?;*}%hzYpr)ER7_KC==A17o?7o)}!DUDv{b^UbE-K*xn z22_>_Hc_R9lT5#oj^|Jxr7K@_0peu!V6HONkcrDK;Lzn_C;7UyU*Ro(-%!+QhE+wS zbqw}j3+A3ATHk-Aej&eCK&liZLzj_TEFbgr&0UBKVPHkI&pJY%go>t&%)K}vm}3~6 z1<0Qu{p`(Mh&+z`V>mxYw=nVx&l9n2);ULE06pZZDLR;-l$PX8u{BllH#C|j&@)z z-Oskg(+%Ga*XLJ%x7rCKvLUsK0W9yT^RR9Kz1(UFU7`?95Ku+-5(qPCW61`q4c&tTjF1f2;z#h7 z02%=nBH|p}9cx{G#9GaTUo(;EON(#5`KT@hz1(REkRiABF@k=8N!O58`8Jldb0!Vh zvCp*IMw@0*sw3Al$7aheGs4WkRcY>QG68;CBA<&+vQNhq9amgvu1wZgg?Z9=Wi^9m zl<|vrG{cNxN~Do+xb<~7IL0iDxe)u(mT^R5!Uy}i+uiMdYt=1U9Y_{wbVi2)tKV%3 zJtEoCTNnqO{Z6w6mSgfAtqrQ{21Z|Mwk1Q^z15k z4b<^{$MB)q_>T%1zi0|lA~$yB;h#OT6xEl!CZ9B8$09|^rt9%ZnU0K6 zkH?lRN@^;9j_&iGppNf3zGrpKy>>&IZ)_YtKi!hNgXL!$UFV;CM7QOKV*5rkI7lMi zre>8<;g7Th_X9z_n{$PKwwSBzv8>OG${d4!vZ~yuC4SN4SJbbrzz@p#(>(Kjr z_x|wh#rAvlhQ7PJi$0v*{PsV5JQxmSJWsK(Yx6^Ye8$A5w`cT%r-|yc8-er~lRket zyE`vlzubAXv-c`j0Y+SYy~N)spO05Un>PUrnfN-&kF%W{XH8R<2~Z0YZXB|=JH;)Y zrkitWG}0_@w6pVFU{5-mwJU&Nr#+XB zUwYiF)S`|Z80>ORSe ze9(-Q_Cws(?5CoK)Dz__3QhrY$FM&Jp}lMj=Ov_4y1AFJ&u5La!C^5bd~de~bba}n zHfo2tG8!6BWz%9EQC4oKZGe?QpLsYNW{;DMXDN0{4r?DNYEtWCWtXdW`?y-|nEP^n zr^y+%C?6-A@2uwVAP7>cfj&x>=AU`-={fS~4HB53_~z8OgO@zZ-^^1_m%QqM4C_Wa z!-F}-wsi}W(K`0WGIUo=xjRWONbA>)ft;iep|=&Bu7#i$^_O(p&l<86%rXs6zrOm( zIBXAv6b*UjQSn5dg}ZYhC%M`N1*zX2j`?>s_8p_b{Hp2g#C>x@)`4~I-bHzw=|-BTA)EpERFC46Bwif z&EQ;o5(Fav*%e{2=OM<%aS+T?Leq&Jg4-$frm~XwVj#fR2teS|cod-LEJVbYYxAIb z=|SU5@u{eY$72);ZhUldEI$1l&@p%ie;K%eL5!GO4Ob*9#_)td0f2^J6m#875CF=j zC{o`Eag`R9dsET<6Gr36L%;fnaZIGqba+JwB_0~83Ty}v_coq7C2qyQr4j9E4!>9{ ztCZjQw#1eZtO7A4b|?f41>@(c%t$N>Pq(1~v0%DsYa8H1vZOJMX2=JlIe;Lwe{(<} z;DiUBsEv>ycDc0UfMZX*eI7zjaI>TrFEJOX=YH)>M$Hso;r?3p^qjv(GK4AC_}e=I%ks? zch`5}-(#|UJNEwBo84?rXY`uij{Li8c(=CT%Bv(lCuZf&=PyNHxKR5d6 zjedNipL1TIQ{GCHs^vvIe-bb)Go4GM1N86qfe<5SjkCtjyxAC>W z>X=qbNY}O_(So*hwM43STU?pEY_Xm)(Q5g5f49z?mI&%j6JIsJOyFfqu(YYFDjHft zD?`1Z0d&|l$xOA~1*uxo&d{INLRxp5DlDy&#Z{<9?Y-)he$=*}p-L?u+0`*)$Bg@A z#@a~Kau+{rCjQV)e-^izq7Gjm7PfKomD4Y)(2Txbz=;RpiDJ1$x(KuYwGxCdv{a@5k(a>o0 zT+e}QRID?o%3l#>N>6-iQKGpg4@&fItn6rU7Bg-hEtaRG_GD3xdIk^gpeR`d2v7XY|Y+`(g2dQ!8mrA<>hh$YPf1mF@f9rVLO|i?>g-PQcYe!Wt-^vOC z(>)8!JL*|i77Ad#LZ5nIY1EeCElM;cI-QDI4!H))%2QPbH_c zA9s(UX1kZMP<=rgWb}z#;#n4x;SG#}c{gdVt6GKP)}21O*h{Z>nqp3?Pxub;$|xl* z1d(oHe-%=wYviRIVSS6BY`m@HPeP4(^(}Sfm%)}6r6Jn@=ejP5g8*QXdG~9fC7Z$K z-2`QVOr8Hlfek|v&fr`+{*MrVo)<@uBhjwR=^+|tLl84m4Lbm*V1jsB@rt1AofNH3 za5};Hzy+sm)TgClKDm%jD-Ze9K1QUA^Hke}e~a^EN4Sgg^myz-yG@A;iWw`HK;vm6 zE4K=rQm>6oC?%|KJZ_G-6(Y|l8e`(KG%?+;VfsQITjnwOqfQCzpzY&;U8I^NMl-nmuZjoWQRc_#iCW&4&rCq4b_T60?nGLPlLX>va-c*#Mvv&bin1psh ze=0|rX*^2bSXz&+NNPU9fpl^pRL8l%Z<;&l})Uxw%0(4#)w*(kCdZoQPP}I0LsRLcpW55DM*LnEK!4X}E=z zxrG2GfJVM@*NTuIdk8T6PZ|U=EqFzee@Nv?kZ$P*RvfYD#+)1F-=v(#^iwdEPHCaw z505pBl|u@T2PrIK!p+vOni@9vK^EQrR^V?}!&7v)~%KvLmdI%ENHl36`QlF?|}SNgb2xQ*GaJu2&Lk4nC6%kF-Nf1RzZ zg{t(;)9bT|=i2w$70{yn_I8@OrL`jKm9b-fh{4N#Dym$e%3G-I8ZPcOXFBVmumLOrCR+lIi=r8@0HMmLXlLHy_@s?+q! zL`A>5)0aLI;O%8K0h3k5o8;?Of5n^LxFS+_z)AsrDala6`)+g1_Qpu!5{M4j7BbRaqs~X^XFk45uW`#rQWsq z+UPiYc#ar~ZqPAiqc}?9JhenWS=VjlMvt0lf6RC^Kc`eL%q3WFp|KWeX^Q;VlFt@8Y|2ZM@1cWoQ9H&( zibV~rCi~UYCHh2C1tfKTVIZPZ2IO{_|7T>XDG8f(7e;H!lU_F^qS4Df>H!5tKNbH) zD?)xz2h0~awCB*?8naf1_WIzgJDXcgxn4d)%sa z`(vcpSXu;NN~q`>erZFeRnb?Oh5&Pw9)^LKa2(_kvcM?9H;5UrlpyiJ1gU63lDlSU z#ym>K*hj=ez(*mUZn#)YE>@F^)wJfZnq1hS^$0su25w4zt<1q|cY7rsUM^UY3zp=9 zCAnZpE?CmfQ@^(Be*)spiFYKB*&+1Xt6xUt1?tyR@I-yyMxDxNuUeMAHNga%KnAopWTFD4OMoE9>C5On?EO(u5pg6bbV+;FF zE*DT|w7911W~VMTTe8hUib*-^pEbjg)veF()YY3Nh9ldne`Yxym`y^R1-nrl3)aFC zX2S%F@zR&bAId8{X?k42aVYtP19XETu@kQWyoGZxj_3?v?!4}PhMD+d9F)Ca^+SVA zr>aR1-18m2TNm+aPP`8=>Wn9J-Gy+XaZl?;`q9V|)C0c0M!J|1~bK=Ph zY`-&YTS9j{e?l@elr$GQDDhyS#G~UJdv&*>=fsoe8J+lstXaV|o`NUO()Wv$4_T<6 z(;S1OdZwZJGmpN#I8uh<|DV0%>TO%+{uRMb-&Z(+-RpgzQ4^6b3;tMOX$_N)5RhT2uW#|PAKh@ zS;NR|e={}fJh3KTgw+DFCmz6X4+jx!GA5Z?tZIp27$}!#VrQi~!vaV2wxPgFJ8dEb zT-deZ7Kek^vRpC3JeJcaz?5jsn0YZ?rU<@bw-fr#H{@?n2nB#Pl*01-+7(0b(=Lde zDRh=Z6T*pu=pzR>Fh0xo+Q|wABO?vtem?NkUj7mutkWY^YN+gr_d)V%DZ2^3FWJ8hfYv3 zf(V0X!Ict%>*K&z9e$Ri+D8U%>Zlo-0jlf04dhKDy7`ltOeZZRfOKEY^ z%>U*+jyB4%=Uo zkQ$RNHL?&o9DnwIOe$Ci<34lToNI{{tw(Rn8H1?%0D@{9%uBO(9&SHIje>iv} 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 KR$iwg@&Evgn!eHi literal 4893 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 0 { + runs = append(runs, rlepluslazy.Run{ + Val: false, + Len: from, + }) + } + runs = append(runs, rlepluslazy.Run{ + Val: true, + Len: to - from + 1, + }) + + r, err := bitfield.NewFromIter(&rlepluslazy.RunSliceIterator{Runs: runs}) + if err != nil { + panic(err) + } + return r +} + +func TestAssignReservation(t *testing.T) { + kit.QuietMiningLogs() + + ctx := context.Background() + blockTime := 1 * time.Millisecond + + _, miner, ens := kit.EnsembleMinimal(t, kit.ThroughRPC(), kit.MockProofs()) + ens.InterconnectAll().BeginMiningMustPost(blockTime) + + err := miner.SectorNumReserve(ctx, "test-reservation", rangeBitField(3, 10), false) + require.NoError(t, err) + + // colliding name fails + err = miner.SectorNumReserve(ctx, "test-reservation", rangeBitField(30, 33), false) + require.Error(t, err) + + // colliding range + err = miner.SectorNumReserve(ctx, "test-reservation2", rangeBitField(7, 12), false) + require.Error(t, err) + + // illegal characters in the name + err = miner.SectorNumReserve(ctx, "test/reservation", rangeBitField(99, 100), false) + require.Error(t, err) + + nSectors := 2 + + { + nam, err := miner.SectorNumAssignerMeta(ctx) + require.NoError(t, err) + + // reservation to 10, so we expect 11 to be first free + require.Equal(t, abi.SectorNumber(11), nam.Next) + } + + miner.PledgeSectors(ctx, nSectors, 0, nil) + + sl, err := miner.SectorsListNonGenesis(ctx) + require.NoError(t, err) + + require.Len(t, sl, nSectors) + require.Equal(t, abi.SectorNumber(11), sl[0]) + require.Equal(t, abi.SectorNumber(12), sl[1]) + + // drop the reservation and see if we use the unused numbers + err = miner.SectorNumFree(ctx, "test-reservation") + require.NoError(t, err) + + { + nam, err := miner.SectorNumAssignerMeta(ctx) + require.NoError(t, err) + + // first post-genesis sector is 3 + require.Equal(t, abi.SectorNumber(3), nam.Next) + } + + miner.PledgeSectors(ctx, 1, nSectors, nil) + + sl, err = miner.SectorsListNonGenesis(ctx) + require.NoError(t, err) + + require.Len(t, sl, nSectors+1) + require.Equal(t, abi.SectorNumber(3), sl[0]) + require.Equal(t, abi.SectorNumber(11), sl[1]) + require.Equal(t, abi.SectorNumber(12), sl[2]) +} diff --git a/storage/pipeline/numassign.go b/storage/pipeline/numassign.go index 5ec2ec037..3b017213c 100644 --- a/storage/pipeline/numassign.go +++ b/storage/pipeline/numassign.go @@ -224,7 +224,7 @@ func (m *Sealing) NumReserve(ctx context.Context, name string, reserving bitfiel if err := cur.UnmarshalCBOR(bytes.NewReader(curRes)); err != nil { return xerrors.Errorf("unmarshaling existing reservation: %w", err) } - } else if err == datastore.ErrNotFound { + } else if err != datastore.ErrNotFound { return xerrors.Errorf("checking if reservation exists: %w", err) } @@ -332,7 +332,7 @@ func (m *Sealing) NumFree(ctx context.Context, name string) error { } func reservationKey(name string) (datastore.Key, error) { - ok, err := regexp.Match("[a-zA-Z0-9_\\-]+]", []byte(name)) + ok, err := regexp.Match("^[a-zA-Z0-9_\\-]+$", []byte(name)) if err != nil { return datastore.Key{}, err } From 7d07ddd837c3306c329cec783f9e7a692a3aee44 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Mon, 22 Aug 2022 17:10:03 -0400 Subject: [PATCH 062/185] Reintroduce StateActorManifestCID --- api/api_full.go | 2 ++ api/mocks/mock_full.go | 15 ++++++++++++++ api/proxy_gen.go | 13 ++++++++++++ api/v0api/full.go | 2 ++ api/v0api/proxy_gen.go | 13 ++++++++++++ api/v0api/v0mocks/mock_full.go | 15 ++++++++++++++ build/openrpc/full.json.gz | Bin 28226 -> 28280 bytes build/openrpc/gateway.json.gz | Bin 4941 -> 4940 bytes build/openrpc/miner.json.gz | Bin 14637 -> 14637 bytes build/openrpc/worker.json.gz | Bin 5036 -> 5034 bytes documentation/en/api-v0-methods.md | 21 ++++++++++++++++++++ documentation/en/api-v1-unstable-methods.md | 21 ++++++++++++++++++++ node/impl/full/state.go | 14 +++++++++++++ 13 files changed, 116 insertions(+) diff --git a/api/api_full.go b/api/api_full.go index bfd5e4f6b..c00daa000 100644 --- a/api/api_full.go +++ b/api/api_full.go @@ -597,6 +597,8 @@ type FullNode interface { StateNetworkVersion(context.Context, types.TipSetKey) (apitypes.NetworkVersion, error) //perm:read // StateActorCodeCIDs returns the CIDs of all the builtin actors for the given network version StateActorCodeCIDs(context.Context, abinetwork.Version) (map[string]cid.Cid, error) //perm:read + // StateActorManifestCID returns the CID of the builtin actors manifest for the given network version + StateActorManifestCID(context.Context, abinetwork.Version) (cid.Cid, error) //perm:read // StateGetRandomnessFromTickets is used to sample the chain for randomness. StateGetRandomnessFromTickets(ctx context.Context, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte, tsk types.TipSetKey) (abi.Randomness, error) //perm:read diff --git a/api/mocks/mock_full.go b/api/mocks/mock_full.go index 5aa152c85..7b7459d5f 100644 --- a/api/mocks/mock_full.go +++ b/api/mocks/mock_full.go @@ -2302,6 +2302,21 @@ func (mr *MockFullNodeMockRecorder) StateActorCodeCIDs(arg0, arg1 interface{}) * return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateActorCodeCIDs", reflect.TypeOf((*MockFullNode)(nil).StateActorCodeCIDs), arg0, arg1) } +// StateActorManifestCID mocks base method. +func (m *MockFullNode) StateActorManifestCID(arg0 context.Context, arg1 network.Version) (cid.Cid, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateActorManifestCID", arg0, arg1) + ret0, _ := ret[0].(cid.Cid) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateActorManifestCID indicates an expected call of StateActorManifestCID. +func (mr *MockFullNodeMockRecorder) StateActorManifestCID(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateActorManifestCID", reflect.TypeOf((*MockFullNode)(nil).StateActorManifestCID), arg0, arg1) +} + // StateAllMinerFaults mocks base method. func (m *MockFullNode) StateAllMinerFaults(arg0 context.Context, arg1 abi.ChainEpoch, arg2 types.TipSetKey) ([]*api.Fault, error) { m.ctrl.T.Helper() diff --git a/api/proxy_gen.go b/api/proxy_gen.go index 64855ab0f..a45b96b28 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -343,6 +343,8 @@ type FullNodeStruct struct { StateActorCodeCIDs func(p0 context.Context, p1 abinetwork.Version) (map[string]cid.Cid, error) `perm:"read"` + StateActorManifestCID func(p0 context.Context, p1 abinetwork.Version) (cid.Cid, error) `perm:"read"` + StateAllMinerFaults func(p0 context.Context, p1 abi.ChainEpoch, p2 types.TipSetKey) ([]*Fault, error) `perm:"read"` StateCall func(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*InvocResult, error) `perm:"read"` @@ -2447,6 +2449,17 @@ func (s *FullNodeStub) StateActorCodeCIDs(p0 context.Context, p1 abinetwork.Vers return *new(map[string]cid.Cid), ErrNotSupported } +func (s *FullNodeStruct) StateActorManifestCID(p0 context.Context, p1 abinetwork.Version) (cid.Cid, error) { + if s.Internal.StateActorManifestCID == nil { + return *new(cid.Cid), ErrNotSupported + } + return s.Internal.StateActorManifestCID(p0, p1) +} + +func (s *FullNodeStub) StateActorManifestCID(p0 context.Context, p1 abinetwork.Version) (cid.Cid, error) { + return *new(cid.Cid), ErrNotSupported +} + func (s *FullNodeStruct) StateAllMinerFaults(p0 context.Context, p1 abi.ChainEpoch, p2 types.TipSetKey) ([]*Fault, error) { if s.Internal.StateAllMinerFaults == nil { return *new([]*Fault), ErrNotSupported diff --git a/api/v0api/full.go b/api/v0api/full.go index 15da14411..b9e92224c 100644 --- a/api/v0api/full.go +++ b/api/v0api/full.go @@ -607,6 +607,8 @@ type FullNode interface { StateNetworkVersion(context.Context, types.TipSetKey) (apitypes.NetworkVersion, error) //perm:read // StateActorCodeCIDs returns the CIDs of all the builtin actors for the given network version StateActorCodeCIDs(context.Context, abinetwork.Version) (map[string]cid.Cid, error) //perm:read + // StateActorManifestCID returns the CID of the builtin actors manifest for the given network version + StateActorManifestCID(context.Context, abinetwork.Version) (cid.Cid, error) //perm:read // StateGetRandomnessFromTickets is used to sample the chain for randomness. StateGetRandomnessFromTickets(ctx context.Context, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte, tsk types.TipSetKey) (abi.Randomness, error) //perm:read diff --git a/api/v0api/proxy_gen.go b/api/v0api/proxy_gen.go index 3e11f6b0d..9f5645f61 100644 --- a/api/v0api/proxy_gen.go +++ b/api/v0api/proxy_gen.go @@ -259,6 +259,8 @@ type FullNodeStruct struct { StateActorCodeCIDs func(p0 context.Context, p1 abinetwork.Version) (map[string]cid.Cid, error) `perm:"read"` + StateActorManifestCID func(p0 context.Context, p1 abinetwork.Version) (cid.Cid, error) `perm:"read"` + StateAllMinerFaults func(p0 context.Context, p1 abi.ChainEpoch, p2 types.TipSetKey) ([]*api.Fault, error) `perm:"read"` StateCall func(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*api.InvocResult, error) `perm:"read"` @@ -1692,6 +1694,17 @@ func (s *FullNodeStub) StateActorCodeCIDs(p0 context.Context, p1 abinetwork.Vers return *new(map[string]cid.Cid), ErrNotSupported } +func (s *FullNodeStruct) StateActorManifestCID(p0 context.Context, p1 abinetwork.Version) (cid.Cid, error) { + if s.Internal.StateActorManifestCID == nil { + return *new(cid.Cid), ErrNotSupported + } + return s.Internal.StateActorManifestCID(p0, p1) +} + +func (s *FullNodeStub) StateActorManifestCID(p0 context.Context, p1 abinetwork.Version) (cid.Cid, error) { + return *new(cid.Cid), ErrNotSupported +} + func (s *FullNodeStruct) StateAllMinerFaults(p0 context.Context, p1 abi.ChainEpoch, p2 types.TipSetKey) ([]*api.Fault, error) { if s.Internal.StateAllMinerFaults == nil { return *new([]*api.Fault), ErrNotSupported diff --git a/api/v0api/v0mocks/mock_full.go b/api/v0api/v0mocks/mock_full.go index c6bc4111e..ce5e1f59c 100644 --- a/api/v0api/v0mocks/mock_full.go +++ b/api/v0api/v0mocks/mock_full.go @@ -2187,6 +2187,21 @@ func (mr *MockFullNodeMockRecorder) StateActorCodeCIDs(arg0, arg1 interface{}) * return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateActorCodeCIDs", reflect.TypeOf((*MockFullNode)(nil).StateActorCodeCIDs), arg0, arg1) } +// StateActorManifestCID mocks base method. +func (m *MockFullNode) StateActorManifestCID(arg0 context.Context, arg1 network.Version) (cid.Cid, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateActorManifestCID", arg0, arg1) + ret0, _ := ret[0].(cid.Cid) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateActorManifestCID indicates an expected call of StateActorManifestCID. +func (mr *MockFullNodeMockRecorder) StateActorManifestCID(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateActorManifestCID", reflect.TypeOf((*MockFullNode)(nil).StateActorManifestCID), arg0, arg1) +} + // StateAllMinerFaults mocks base method. func (m *MockFullNode) StateAllMinerFaults(arg0 context.Context, arg1 abi.ChainEpoch, arg2 types.TipSetKey) ([]*api.Fault, error) { m.ctrl.T.Helper() diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index aeb7555df172b85e06b52cb2eea9773c42ccd9c5..b1c063ed7996a8ef69fa934d7efb136c12c5d639 100644 GIT binary patch delta 19703 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 K+tNl=fCT{Gvq$v+ delta 19634 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 diff --git a/build/openrpc/gateway.json.gz b/build/openrpc/gateway.json.gz index 22c4f769f922a04f2f3a62e29b4d3a8cedbc8ae6..ab7a63f0ad73ba51047cac0c3a0f9ff8642fb7d0 100644 GIT binary patch delta 3884 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 delta 3885 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 diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index c2201b2dfea8f6fcb7aced4f3f6f314f971a82be..a42d5c73ae32a6f2f3bf8907995642ff94371575 100644 GIT binary patch delta 4235 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 delta 4242 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 Date: Mon, 22 Aug 2022 17:32:43 -0400 Subject: [PATCH 063/185] Address comments --- .circleci/config.yml | 5 +++++ go.mod | 2 +- go.sum | 4 ++-- itests/retry_test.go | 22 ++++++++++++++++++++++ lib/retry/retry.go | 10 +++++----- node/modules/storageminer.go | 6 +++++- 6 files changed, 40 insertions(+), 9 deletions(-) create mode 100644 itests/retry_test.go diff --git a/.circleci/config.yml b/.circleci/config.yml index cb250cad9..b4fcddbca 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -959,6 +959,11 @@ workflows: suite: itest-paych_cli target: "./itests/paych_cli_test.go" + - test: + name: test-itest-retry + suite: itest-retry + target: "./itests/retry_test.go" + - test: name: test-itest-sdr_upgrade suite: itest-sdr_upgrade diff --git a/go.mod b/go.mod index 5c236cc3f..5ce844cb9 100644 --- a/go.mod +++ b/go.mod @@ -38,7 +38,7 @@ require ( github.com/filecoin-project/go-fil-commcid v0.1.0 github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 github.com/filecoin-project/go-fil-markets v1.24.0 - github.com/filecoin-project/go-jsonrpc v0.1.7-0.20220818202438-3dabc3d89d31 + github.com/filecoin-project/go-jsonrpc v0.1.7 github.com/filecoin-project/go-legs v0.4.4 github.com/filecoin-project/go-padreader v0.0.1 github.com/filecoin-project/go-paramfetch v0.0.4 diff --git a/go.sum b/go.sum index f4426a17a..184b7950b 100644 --- a/go.sum +++ b/go.sum @@ -330,8 +330,8 @@ github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0/go.mod h1:7aWZdaQ1b16BVoQUYR+ github.com/filecoin-project/go-hamt-ipld/v3 v3.0.1/go.mod h1:gXpNmr3oQx8l3o7qkGyDjJjYSRX7hp/FGOStdqrWyDI= github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0 h1:rVVNq0x6RGQIzCo1iiJlGFm9AGIZzeifggxtKMU7zmI= github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0/go.mod h1:bxmzgT8tmeVQA1/gvBwFmYdT8SOFUwB3ovSUfG1Ux0g= -github.com/filecoin-project/go-jsonrpc v0.1.7-0.20220818202438-3dabc3d89d31 h1:rSi64b/nzAu4vdGVNxzfbWZiXQmeAv8RQJvcEJnuwz4= -github.com/filecoin-project/go-jsonrpc v0.1.7-0.20220818202438-3dabc3d89d31/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= +github.com/filecoin-project/go-jsonrpc v0.1.7 h1:Ti/QkQLI31v+6hvidA+i9Wv/NrS4CfHk0yXLntHX3Uk= +github.com/filecoin-project/go-jsonrpc v0.1.7/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= github.com/filecoin-project/go-legs v0.4.4 h1:mpMmAOOnamaz0CV9rgeKhEWA8j9kMC+f+UGCGrxKaZo= github.com/filecoin-project/go-legs v0.4.4/go.mod h1:JQ3hA6xpJdbR8euZ2rO0jkxaMxeidXf0LDnVuqPAe9s= github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20/go.mod h1:mPn+LRRd5gEKNAtc+r3ScpW2JRU/pj4NBKdADYWHiak= diff --git a/itests/retry_test.go b/itests/retry_test.go new file mode 100644 index 000000000..53ec90b56 --- /dev/null +++ b/itests/retry_test.go @@ -0,0 +1,22 @@ +package itests + +import ( + "testing" + + "github.com/stretchr/testify/require" + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-jsonrpc" + + "github.com/filecoin-project/lotus/lib/retry" +) + +func TestRetryErrorIsInTrue(t *testing.T) { + errorsToRetry := []error{&jsonrpc.RPCConnectionError{}} + require.True(t, retry.ErrorIsIn(&jsonrpc.RPCConnectionError{}, errorsToRetry)) +} + +func TestRetryErrorIsInFalse(t *testing.T) { + errorsToRetry := []error{&jsonrpc.RPCConnectionError{}} + require.False(t, retry.ErrorIsIn(xerrors.Errorf("random error"), errorsToRetry)) +} diff --git a/lib/retry/retry.go b/lib/retry/retry.go index a83212665..0b53c0fa3 100644 --- a/lib/retry/retry.go +++ b/lib/retry/retry.go @@ -10,7 +10,7 @@ import ( var log = logging.Logger("retry") -func errorIsIn(err error, errorTypes []error) bool { +func ErrorIsIn(err error, errorTypes []error) bool { for _, etype := range errorTypes { tmp := reflect.New(reflect.PointerTo(reflect.ValueOf(etype).Elem().Type())).Interface() if errors.As(err, tmp) { @@ -20,15 +20,15 @@ func errorIsIn(err error, errorTypes []error) bool { return false } -func Retry[T any](attempts int, sleep int, errorTypes []error, f func() (T, error)) (result T, err error) { +func Retry[T any](attempts int, initialBackoff time.Duration, errorTypes []error, f func() (T, error)) (result T, err error) { for i := 0; i < attempts; i++ { if i > 0 { log.Info("Retrying after error:", err) - time.Sleep(time.Duration(sleep) * time.Second) - sleep *= 2 + time.Sleep(initialBackoff) + initialBackoff *= 2 } result, err = f() - if err == nil || !errorIsIn(err, errorTypes) { + if err == nil || !ErrorIsIn(err, errorTypes) { return result, err } } diff --git a/node/modules/storageminer.go b/node/modules/storageminer.go index 2f76a9559..b38c340be 100644 --- a/node/modules/storageminer.go +++ b/node/modules/storageminer.go @@ -92,7 +92,11 @@ func (a *UuidWrapper) MpoolPushMessage(ctx context.Context, msg *types.Message, } spec.MsgUuid = uuid.New() errorsToRetry := []error{&jsonrpc.RPCConnectionError{}} - return retry.Retry(5, 1, errorsToRetry, func() (*types.SignedMessage, error) { return a.FullNode.MpoolPushMessage(ctx, msg, spec) }) + initialBackoff, err := time.ParseDuration("1s") + if err != nil { + return nil, err + } + return retry.Retry(5, initialBackoff, errorsToRetry, func() (*types.SignedMessage, error) { return a.FullNode.MpoolPushMessage(ctx, msg, spec) }) } func MakeUuidWrapper(a v1api.RawFullNodeAPI) v1api.FullNode { From 64290b69c992331037db454d7fe03f6bddb2f137 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 22 Aug 2022 17:36:24 -0400 Subject: [PATCH 064/185] numassigner: Fix missing api perms --- api/api_full.go | 2 +- api/api_storage.go | 8 ++++---- api/proxy_gen.go | 10 +++++----- build/openrpc/miner.json.gz | Bin 14968 -> 14931 bytes documentation/en/api-v0-methods-miner.md | 14 +++++++------- documentation/en/api-v1-unstable-methods.md | 2 +- testplans/lotus-soup/testkit/role_miner.go | 4 ++-- 7 files changed, 20 insertions(+), 20 deletions(-) diff --git a/api/api_full.go b/api/api_full.go index 5d35a395c..0df3fa7fc 100644 --- a/api/api_full.go +++ b/api/api_full.go @@ -541,7 +541,7 @@ type FullNode interface { // StateMinerSectorCount returns the number of sectors in a miner's sector set and proving set StateMinerSectorCount(context.Context, address.Address, types.TipSetKey) (MinerSectors, error) //perm:read // StateMinerAllocated returns a bitfield containing all sector numbers marked as allocated in miner state - StateMinerAllocated(context.Context, address.Address, types.TipSetKey) (*bitfield.BitField, error) + StateMinerAllocated(context.Context, address.Address, types.TipSetKey) (*bitfield.BitField, error) //perm:read // StateCompute is a flexible command that applies the given messages on the given tipset. // The messages are run as though the VM were at the provided height. // diff --git a/api/api_storage.go b/api/api_storage.go index def7a4232..8ecf752e2 100644 --- a/api/api_storage.go +++ b/api/api_storage.go @@ -125,10 +125,10 @@ type StorageMiner interface { SectorAbortUpgrade(context.Context, abi.SectorNumber) error //perm:admin // SectorNumAssignerMeta returns sector number assigner metadata - reserved/allocated - SectorNumAssignerMeta(ctx context.Context) (NumAssignerMeta, error) - SectorNumReservations(ctx context.Context) (map[string]bitfield.BitField, error) - SectorNumReserve(ctx context.Context, name string, field bitfield.BitField, force bool) error - SectorNumFree(ctx context.Context, name string) error + SectorNumAssignerMeta(ctx context.Context) (NumAssignerMeta, error) //perm:read + SectorNumReservations(ctx context.Context) (map[string]bitfield.BitField, error) //perm:read + SectorNumReserve(ctx context.Context, name string, field bitfield.BitField, force bool) error //perm:admin + SectorNumFree(ctx context.Context, name string) error //perm:admin // WorkerConnect tells the node to connect to workers RPC WorkerConnect(context.Context, string) error //perm:admin retry:true diff --git a/api/proxy_gen.go b/api/proxy_gen.go index 188ef24ce..8b403fb1e 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -391,7 +391,7 @@ type FullNodeStruct struct { StateMinerActiveSectors func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]*miner.SectorOnChainInfo, error) `perm:"read"` - StateMinerAllocated func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*bitfield.BitField, error) `` + StateMinerAllocated func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*bitfield.BitField, error) `perm:"read"` StateMinerAvailableBalance func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (types.BigInt, error) `perm:"read"` @@ -826,13 +826,13 @@ type StorageMinerStruct struct { SectorMatchPendingPiecesToOpenSectors func(p0 context.Context) error `perm:"admin"` - SectorNumAssignerMeta func(p0 context.Context) (NumAssignerMeta, error) `` + SectorNumAssignerMeta func(p0 context.Context) (NumAssignerMeta, error) `perm:"read"` - SectorNumFree func(p0 context.Context, p1 string) error `` + SectorNumFree func(p0 context.Context, p1 string) error `perm:"admin"` - SectorNumReservations func(p0 context.Context) (map[string]bitfield.BitField, error) `` + SectorNumReservations func(p0 context.Context) (map[string]bitfield.BitField, error) `perm:"read"` - SectorNumReserve func(p0 context.Context, p1 string, p2 bitfield.BitField, p3 bool) error `` + SectorNumReserve func(p0 context.Context, p1 string, p2 bitfield.BitField, p3 bool) error `perm:"admin"` SectorPreCommitFlush func(p0 context.Context) ([]sealiface.PreCommitBatchRes, error) `perm:"admin"` diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index 6be3c12a896be6c17fa606f1a60ee53436e6ab7c..4c902067a9abfe908eb100b2d8f8bd2101674ae3 100644 GIT binary patch literal 14931 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 RUjP6A|No|R=O@DC0sx!JG`;`; literal 14968 zcmV-;I)}v{iwFP!00000|LnbcbK5r7IQ&&GeCM4_ICC~Ja#7uNyxUE@pu0X0Nx3b;6=7#bGOr4BzSNDoEr|#Iry$wHX@F#Ye!nYJLpcd zj)uv?(vH4s6jKvvN7|W1H!iq1KL+p5PqmJAha4AMgn!XL><$hLbf-Obv^AnD%W$=$ zZ{IZn*X+|z*hIR8N%y@@E$6*qILLLij%FZNcd$(bnE(9eKTGSHEH*?3Z(Q)xCAA#5 zL|-sL&Lwp=I(-YG0N&U=pj(8Z2iiRr|9uPIK=HEcHR=H5IF|Dke7`2w6fc0=JtY)5 z1e!5yz|TJef=$uvnmUMX90GnK=spSYZ3ldGoZl>Zxv_1_p~zsLJhFdzUuAUh#_qkn zCXd(TKmYlU*3sO}dJUbecBE+?&4vzKi$QK2Hf8hefo-{%PmTAQP3cWXbCA0+DO(wD zb`$ue<~993*0rmz&>Av$=mD;66S01@MXx^?j{hSxij(eAssY0clQp-YkT z4%+yg?N|@ne=iZ~F0KFXY&bidYLAbde5yUR$O12G)2;v`r{GuJ?X*svamybp4W=9@BnC zngcGKn(uzQxn-FMl1R(sM9G?_m$@-~(}d6v=*Jf(J*TrA>3NCxzwzIwy66mHNaSV* z*nN=H)Zh)A<8Js}p)d`b=Gg-=nB_%jY#a>l+Ojm5bi2R*+FxqI#HKVohUDvvA^4^$ z*{tWtNrCx|KL*$Z5Clyk!yb-?z!ohhhe`Mwy^?JP==KK@WmEpkq572}} zufd@SK$&bh$K5OI7LoUBYeSgHqhq6cjEzG6OmvXLq#nfb+?gIjHj5_Ffu?EQyMS8Y z-g^V)-m8UUt-+ej7=WxB*2uc&KLul6lS>=vc(DbL&kBGpxYl~tS`6G`W12q9F1T7@ z7l{295W``ly+*DJmk1o6o?H`13}9Hu1;nD@9%2d>mJ>8V4@lpzRlX)oiJSP^s)?K4 z(@7eSE>d`h&kJM=CuBmwseuT^3oMZ{$CxdL?I0Hs%2vch=HfuKnPajPOu?2|EIl#+ z4xn|xDPD!7^HfYl7W)Y{q|iuJz>u{ zU1~@DUa!~jMxhIT7FQhQ>Eq2!$KUpRE7skN5+8W@NG9CdKY70&Lu`xN zK1#M@k@1xP5Ya)A6%~8B(hE9FEhyt&rS)UbBMA7L;p&<(hoe(i=C@UG%=8CCrgb6t z2L({)_yPw(1DKY6%QcA&DU%WBG2-a{6mbA}9lo%g^r$x&WT+i$ZEq+#ffUM27$vs(xf~I2`7RL*HzxEDSk-EK&IFX1>8D#iaZ3fg)lcL+Csq?(6}V zmCSm)fW)xYgdaKDL;m=91u^+(Tl%U4>=AoJ5WTmY+pf2vdkfx#@FVtpp%mrqa%89k zY86T9&rH-PXG7VkJk6VNRm=7gaZa=r+R?P5MXeO=Xy!lo6>YU6vN6pLZ;y;dg+f(( zIfA;12^_<`q&x{{q1vYv%cjodKWniStD>e;N_iI>gt%bYp`Fq1 z^&2oWMzR4U#Nh4*F{wHNnOPzcsyV_-!J`nDS>XpvX7Rs1Y$FnQ^s$tZHjnYTBq$`*TSpNvMi z_Q{`^7}h*$^D*uF&cSG47320we~UT)@VOa(B{>&11l zg3S?PkZXA4_fy3Ri4FZpwsc}DcP5rbgPrW)605E%cbYJFI!Q2dd+4sHLq@~f!{u;8 z9Ax}`xOgC=<$uS+p)s^ZL;4pP*aK`oJgl5MeRYR~RC}6Zpdvbz2=>AclxF(`LBqrZ zX-6Zr7ljVxqZJf+N(}TM-dx^d+h$|BIg;g@>{e>?VT_kgG zCr9m5P_;2Uo8?d{g6f6Y7UOY-ZQ&qD(FdsCZtQAiMFc>WMd2Oi3DZDo8AO1{je-)& zK8{d!&_%3Mo&RtFu?z&};+aJZ%q+ z`3^dmAD_C20%`%*S|eaXy6W&#c-Gf7VV$vO5hU+dhyWd$ChIXaOzd(DFyS~dmf_zv z7PV30=*DXc?x49rTGbPOnNI#~W113Mia(6lUV+_Ynm;&mPbPBaK7mV@S`PYrT#2>A z&*kyu-){UCmn-NP7knM^HUJ^OT+3eqwUoIZ!&}b#5loy7alsNgbGSr6w@ef1Y>t2> zc;w{$XMR|Px}}&zZYxSgCNU7@t(2@n?u66ka0w>}j$8!)Li(EieTd=haA>#-cZDZ| zLpc9?gh!Lf*jQ}-c7}f~+|hgujfwFv#CU1^rFFE+jjkg%RN)`lqH0Il^`_Sw>U@d$ zpQwh7=fO-J!*(>^mzZ)F`dFo7w_kw{KRnE5^HYK;h9>@7P);qLPr$0I*)!nPRr1+r zX6ySbRB-Uy1(1LZ2_G21Wlg%*x{TWj?2CW6ze1;d61JE6Ewrq0$+8|(Kr1QAajxdN! z`1kfYoc93k#_b3YE`Sc=p{LQs!E3%9pvc@ZOyQk{jcaoHJAgXHcbIND@`wh8m+e@0 zm@K>Cl(-Z@!-LL&M*v?FZb2=u<5B>*$U#OtN_Jtf>5I;YPZ-uB825a8O~mI615Ej9 zMv-=qiJ2BQx36$0^PXXJza+OWk*tUYV!Q4|Wv2DzMY z0*Y9nbwCs5Rz?jAh)oyZMM&EWMX?fqGtec&Soef6JC_lmwF-VG<`%#^h)uqQvK)f6ug zKv`CWCKr^37Vz zX;E!6$0?e@$=J|&9d5&|95`J>o^mWYY{Tp85^kLGX>NCYKQ;poGjd8oDiz+JCO9|( zsR0&_Kx>YN<0z^yaTJZTt85L)2Abwp_^S->EAdO1S+*DV-}2E9%}1k*WP}q0P50O$ zE;f+!`(j~Yf-Zd59)DSlsS3f$y(@FeGIMu0g>dD(CKjR$%c%@tC&i?^Ov>j-uiRJS z9cM(U$`;9^#%4)33bZ-GjY8ca*(Q*0iS}uTc9IbS6<;E<6M-v%+6383!0v=@<>%M7wiQD?_~{*ry@bX;z?0bcMc>JLK?q#b$|C4z~fql>^=d z@n#O8CE%wa;8{ii-`Fbsu@mx@L2ZC|Wngzfx*6!Vg!?3fJLqM_WUzHOU9+|Hs&Z5$ z(-20%VX0T;rN}!MhgsV%mqPJL()`-P%IB>4mtTyg^=&@A6dGg&Z!q>e!)~<%=HTnB zIIy3-@Ng#9u23&BIJuD+5n$zFFd|s)MC-*+lN`av->Ov%a4g$$p_wcz)JR6J7S^)z z3MctC0!Ps!?qd@pLbW5mVl>bDyJHqb^w}AlBU6m!l0qkug!+*f@dq9iojX`Z=g9G1 zYP|^bW6R{B(+m^-LLicO96hu5>PM%$KZ7p)Y8#9h6KI&wT}2<&sOl13sxs-c-t?BO zG@qW0vJk>WQAzgn7PxFD)oWozh*L2c)g#K%C`t&fEQ~18DWw2Q>A!5RadyqgyoqBf zxTOS*ruj#$Zc&mQmA;CwWR;?yFF#UeFwBb7VG2$#95z0fmVRs2(&#BrS?XP(w!0i) zuAZ+_-#ruW9Vz^*TI10-PgbJiMq1wL1?_B7cK-`w>`_((52NZ!M0XT?Py{*4pCHPR z=X(%}U^n7dP#D0@FJXDUs?M)&6Fbfe&`HxmGhX0)xXrRiu`9SXgCvk|+2iG~$0RQV zC`t*922>OPZi+#a<0@)!h#dWvMP3ez9OeZarAVQ91)>tYQJp<@sy<|>x2*AUSYw(O z(i9dJ>~+~krW3k^{v#Ep~~bG$-Byk-bAO;L>v0fV)# zUts9fQR*-wnkum((r};(RLbBK7Q#`bRtBtLO7-x|)?qRfd@7AoC@*9K0YUeiIKe%1 zfrE5}?~u{CCN3|kwFNpPz_9L#X+Z;E>iQKJ+vw3BKYFy4FlVFTC?nKEL=qlDq9gMJ zQh4P+;w~g)ry^#ufMv-V15!x6HeJ8*=?RZ3w-Iu>{O@7WmNTo{x>6};IK@{_XCkHZ zM~ta>`B;DaLD_h(21M}u^n`PlMOVn-v(lJU%9#G0-DNY}$yGKUp{NCb_Xj7#UoGp; z&woGs{p-K}?+*R)ztsLbdG9)3|M@}x^Wm2dpDqW#xF4<0R}apYv%6pamo6#?itp*= z&96@OjWeQQyeR4jbDm(hB$i9DUTrs!3o%OydIbCyy!lD;RbDJyZg+C&N3dBY46bNE z*(O>(ZhqNf7Z_;1SuS~f%ygEC4Oht!#S!mHU1QEO6Av%QMmN(q4oay_Fel;P-mk1 z6G_Ha@KW4fV_aeWWv|!kAMk&!dc7n5&%d;e=0%O?H#)PH0*fjueg_~nQC{=#W<$SeS0Tr`6Lm_lhk{S@K<)t*J##N zf{98X9O0^RiBK`_NhkS4c}ey*U?9oxBRnK8hU;-dnaj%;FCMZK1@pG0_)U{?w!e83|XyS@;>z_wH>C z$EyG!PcHt+yN*xXht$2qOA-VOzIShn-K+w5gI?7D+nuBo7mPRUDlBZT;x%L~c?k=w zBd^+qADkI|_63tv$&fGbA^nW4akM%JlZ!5eYdfq6@?c|zlwXJg{q>v0_TWsk;U$4$ z=DurJoR0<_jTgs~U4CD3=jsi$%q=1wsw$E&J{wA3#O74-i)v*q_(GPhY#~-gNpFO! ztfV#K6jonr#t5gx0t?crbc21zBhaQQRs6_WVw#au6^P9srLMNRh(gNH8^NWUo@7*2 z7E#d6YK;WayHOvKVW)M5ypf8c@C(*_*iv69d?hYoOctt%bGTh2Lir5bK~uO^6Aw>` z?jYzQF7wMt@DzBZ@<3VLtJM~Yj=HP_jZIKRDfco&#Hg2%F(Y`yD-VgFS-BFX3{WHG zFlB(72~7k8nVa&agO#O^RCBdU-*p0=+)Cn_6!OFfoIc(&4Jc=!t6!d~i zO;cTzDz}wAq8-)Sk{~R->r&QADcz|(6@Nvi;+1QCwucAp;X!+N@MMPvFSeBDXpoWX z7*VX1a~u;eYS!jXK-)=$?li`2o$j_ycUz~st<&As>2B+E|8UBEl#w1Ds<~65TTF}4 z8byIJp=Bxj_=z!xrLO!FedL+}868zL3DTq6k#UfLw!~1#ZrK_Q4H*sMdC8D~PB68{ z*l2D>-y6oK4KZ8}lx$41qn&T&CU#emCw}ZhMdwSfAQiv&)CNCsV+3#xDVzH)mso3t z+q;EJ*LHs}nh=wJmvJcUztL}AP{Nc+R?0|oszk=A;$6hi{uhjH^XDhRMzIqSQVMeEVSEGP$aTt z|D#5dbXMN622E98PJ+v2)0<%Jve-l^OR_?F{?54Uk~Q$-q~u$c%pd>J zz^CJsEUevld4wEbd$0IrRHz&Fd)Co@Uo2cieLv6{B1^gwzaDQQ$HBdhm)Bn_dc>m8 zyyTWJTN!VEASyTdX(U;G0x!KQP8Vlr3H9x{V^K@DysdZjZRZb`-xxi?oVp$ubpHm_n`OO{yE=6KGPUokJ+zRhl=P`|!f-{Yh?x!*fy6p{}JL z1tYidBQ2PmDz@jNAagAF1l$T%djj{J*y{-_Q!|}@uaYPg+GXu2-;PfCm^ASGSm(&W zmcg;kK6#0?)s7~;;D03(&}wPsAN0_nb&9u6@x6D7D_N0oDWEj@5+UsW5)Xy|&T;p61u@}!y$-NP{Lwiy3}gg*-43wFvgd`8l3Gr{K>#Xp4&bA|0oM01a`13=A``i$bWoBE#7k)@?d;;o7}ImU+ThidZJ z`QXjdLQLc zbh3j+=vsnx>vDN*E*A+QrUj6+jglB@JSc_>volNQxsv`(f2JS6$n2q5u5YLD;GEKz zs#OmpNRG8yXiCY{sp`QGk#%SyH1vg?vX93ZbwdI%9EKFv(m?^3a#|?(Oi2#~t((Cg8;n(|MQ^3SWM!5H z1^A29NEBFZ=BTf*%Bz$FzB|ec4HZc;|FclV#Irmb5y-I|x)-RzQtIYqrH_mcGtx&w ziWYy>WMlDHBTOv*+93-ExV8-3GVtCr@H8Ww`rJgu5()dK8uLZ~$Qc*Tao0Dna(Oob zDTi;P;L5RX98)>lUZJ%Opp6;L0g7CT$+A=!sf?MUC`%8vBQI5U3|_gZey`W-XhHF` zl16)2v#QWMRxc&<(hS&HMs)ZEr>^&g2u7&HIB^hJei62%#0#jS?lCk?F94j!LWHgn zdkB7txBDoVEc1jr-gn)j?bJw$1Hc>dmLz9Kk$*0OtmzC+5~T^W-l6#af#hHQ|Fx2A zCpLw_Mp+>+rI`yw{8k5Mc(i0-=Ga|@=)DvO9qU|TgTJzee)kS+I%-u`* z%&wae_<191Wq&LCTiM^r{(X}DlZ^a0A%QCBLvY^jq^jCBUt=4L_*4}8Xr@67GpQ=VqEWm0eLit0H6H{`-d3**!F# zY>|~@(e5HzasTY%KAVRWspU6xe<_T*#_H|d$d-c zE9mnJ+*4J*h|%7 z!`$5eP*B&2(TG5)sKsiAV?+>WT7k9U7p(%@Qw7#WT(r9DMeD9nZY_gLe$y>#W)l_y zs;t3KQ(LhRRCCHKHojJ$wfbx?^%-jSWUXF%`Fd@fThk#XuIp~gLO>Punvh4w*r<{J z6-Q(TO0C_bwMuPIm0HL@igeQSSst7HXFMCMdNA0Y3bwj?A9eR(ZcPqBwRQ6VB2ac8 zu^H*C8O)L5*>AG zUvQZia%$1i?^S9pe8GfqnlPXJznIJnYi@mk&Ml&DvKqs4dZ6}{<7OEZ1H8F?KerrO ziP@q6RBfdklPC(Vt~HcEjiJ&SL9G$AYa^)D@MoiGFC$mm&c$uQhi(q!x~~2CircY-}SF6V%w< zf5BX-o&P8arJZQ!Vlh)rbGK}JHk$S`(qf~8d4l1x4$B5Wve{{t1~WEd>h$|# zo^76lDrZ`P%`%3#1XVSz zv=jn5Bw)_|W17eS76C4A6WRCj?JfegW9i6sfwcg0#JF)IAQ*sJ0P^hyrj4;=a#piB zpo%(-aLw#Sq8(dxr^toFj0_`>&bzY-f71`@3=@!u#B3UC4` zXz_O9g z&|Pr40K^K|`ySI3K*ZWCSHQKQjySKg4?5QbVY)&N;}~@BeF5&VX>v*7AV!59U^&7K z#zcqr*0l6nuptziU~M_*n)to>Qbv4R&S6$0CQ^&OGg;B^4MtVPh2mkmck@YYZD0Sy zIL0E1o|yB^+{Etc7#rFVlWrZ2131x+#-rgt{9>3|E;O~oCDP4A3WP-9U6cI>a_|Bp zgLUoC#IcDHq1utQ==BG~k=D`99qSGo$ca8XgL7nx;a*bc(2usIuNc^Vuiw!=5+nY= z6JO^J*3mg~yq8)p0{z%BO-PZ$FySu*B8kV3VxBHNW0!{@6!!nv(SAk94r2~D5tQ>~ z`D>-(7fP;VnZqM*_6t5rIFn?PRTe@xXDUPV*1v2g)h|Ym(5?!8Ag^9Ot~qMp&Do5^zb?{3Hvl*MKU`#YS^R{N8)7} z5B{v9dEasAT~dDepDL|Y;5S!Zrx&tu9%ZCcdSQM%8ugR8ajRW^pMoMkI{tRUeL9gW z<`0nSs|%ESikt$TV|!=!P{9(9k0)<$9YqeW*T}$-B6AB|L=0wDiuYhG!Xktf?ih(;*uo)H$~S2SEd{O$HAwahJZ8DMDdVF)cB-c^R=Uz@}}opDoJd-pe}EpN=!K^P;SLj));*C+Z19 z4^Eai4E*NT*D8L-Sndo+0rpM~cVQ4vLlytjbi$88$udlRX} zPxWdub!_CR^-R9qjazWi3;tKxJGiH8HOf z=x;&2R9|@;AMV6=udLr~MEsq49bV3bEY+5U?3)X+DSj@(yEbFDba^(K^)sV{J*oEI zb@7rQ=L_QJ%2nww0ZDG9B^njmX^9VVOtnPI3dUM`1bOya5;NbM;q6|83$`;Q$}M2xfG2IST@Q)Gc* zZY1z;o3)S?eA`;b7E3^q>%cX%zlkNhnPa-Z$TYeiF#W{-P*RA|E^-uNUO&~eV`6Mi z%~vu~&KqQEAqyI-s6?*#hMhsD&;8>$XM3+%<&1J;egjIXsdYRc`HDw4Ez*2u57k^5 zVLy$jrV#JqaNSp;rShE^m3WmKs6}RJ^Hr2ukIR!unQ?BIQcyRqZlqEiP;szQ&|W=W zDc*%*$Wp4G3Q9dSw!9s00!vx!QqV*mzBFf;da+AE(`N`@N=;pE1e2_F$$10_v(CMwA5AOe9ef>MnzcBqLCgNW~#Vp=2tED&jJ#jVNj(ii#QgFgKz| z6ql&M&H_MVNyT2Vi$-=a0cu5w#EA+Uyl|Fqkc$!cfT$4EhhDAKvLiBUxf7AuMOUCk$7<|{{17y!ke1{?lj;0B8xN#8( zxrIp#XfoDlHV1LPPm$XV#o1^!%ME3^Y&=3R17a4($AgiI*gXSyGyI>8d67WKLd)Gz zL|`6U{xIQ6Eq9)cd%fJ)sLN&o4KMQp4Xg2CL8M^?=8NK}z;Pi0?mh$-wmkV#c(R`x z^u)7W!^)zSc`^c~F>5#qv>~>Pqglw7Q3Nte>|g>uu5G#nmIMBTn4WMhAO58fNht}#erxu=hlS>0~&^dTo)Mt2hh0d4RbqxjSMi~0to&hI; zp7Qx9H^?j?<@(1wNl?uk^CY3}@|Z_50wpm}e9Yr}ib7Uz4|>{zp1Q0(&W&et&v4}e z>%sTMOzbD&6)`dgr^vmYtzMpkeVpZN%Q1ka$u_FXz@_9i%4EOEZCPm(1!nUjG}>EE z3V30X8+FC$;*?x+2Sr_;@Zn_bIltWmt`v&uaEss3lWeAE;2TWiq{75>VV8(i*rlTnyX0pE$8ni=O5l*6VLcMAv=N=U&=c04W*8DY^~QPe&jd%apC_scPwk69clkZ%-+8)Kdf}}&lUQgpMTawU1A1( zJQ@yeyz0+h8Fha9^3iuKTFAWVTIpV8WIhQ;ZRz%XE8WgW`U>l}LRbF5(+7^U5BHpO z5}#ipkqDpPDhQH}WGSQ`Tp;RjO+6ZPv@6T6M&!-@1+q=7!>_ghDGILk6nTYDW_I`}^evI~hjP`yEX@7wsUSdwF(|2_ThKhKN zn}4NwPgq#rH6EnF{+MF|o$W`WTl~bE?EqXf8AZAdzn0sLWpM~>Q#IdFU>5Gc)r1r( zPbFAIoliV7{)tj^<1&k8nF0Pzi)saL@J~dcOcB3kz6_#?H?rLy(>$q}wQ6?dLhWj{1XM z!LdLCtozcqrk|VMAR{g9X9jxr9uqJl-O zW*PT>?@zo(IK*)qDc)eDc$mNsv(p3R_#zTtt=G1FBr0^oJi<$X@Od{)k-d*|zD}|sUAcY= z5!-n*7C$DPmJ<6>?QpW_&!*G)0a^@u2P5MU9n6PFKbXPE;BYaT!!ev{9qsGInUtS= zx9Mom(Z0Y34+-)67?R6qa1SKxbr5dy*|9dZ6zF@?wC=C0>{nY`&fO=7Y%^X~xaNYR z5OG?k{N~9+m?&~(z6&Nw=A;g%P4+f2;xaw@b6@5g@AxDYUl3V!6@P-Dq%s|cuK8zi zAjIU0B5NH(8|s*Dc|_s+JBUp)uzP?l&zz)JB(0g@`M zV|c54z{gVdwigBZan)K@rG-}6pN;$Dtb}M!?QQ6aAD&e_3Q9sLGG^a=yMY_J>YgKK zja|3sn$RTp{M@iO;Bx0el7YMq^EWkbvYf6|3zY=5dk0grqx7_WWw%LIlCq$$56Gqb z-mN;^764H_JYrZd(}Ek>p*zGo8X890pF_I3;ts(#-)=Gt^+I+H@XN2EFN0o%XQR_m ze3wTGN570gP{e>)_~4#j`QcZ|#U|njBs`tOMmmo*;GR>zXjpKITnAW=fgItRwH>rT z4k9}0UXybH7}J%g<#*4GA?|tQzyE*M!@@zV3#g0xMg#x{8Qp90n?=zPxC$>C35xYD zut|~QVLpehs9qM@ue6FNx9<~r6=3{bJf zbb6AolK6vRo=r6>yu?g`NkeYSc%fbKsCyeZ4|>xrt?8RE5XI10mrf%*gOPKn%_Ana7NI3Q;ZQEPO-1_ z73!>ZoA7eB39Xns8xICq8BIbWe8R-2FD64M#SzGXt)A&m8K%#ud>2dn+{lZJEps*% zVyb#LmF%R-5mjt{)Lb-aeDe;f;s;Z)V=MH4UD~}S*W`4;kE!lIA*!z!zqyEZ65y!i z-SHT?iNibMS|CxypI_JrO_vw+7D(~)sRQ7haPjX~@GfzFW?JG#jyHxy{y~AqQUWYD z6gl8I;us-A-0D#RF8`cZl;g@z#E=o5h7}!)#d}F27vPo#EQJS77b4}tHqkW!98-Q? z=<;K|V5vF)v7IPCN%XtWE#hKvgoufO@3669Mf;Uw#hJC0xrmz%r6%#lzf}IrTmLgiHh5c4428(DLR+-hZN&xf+L&hRJ`tj&n zuhZ-FJH1ZtrlVaTXlO^@2Av^$(COVgmd$4Hkf>HqPjugO@t!q&I28cL9c_(C_#-Jb z!g<>p6E9NWz+15Anx0oz?tC!H&#{ymL?vV<`(DLs8yBFZya}wCn((aWKk$a~1Sc7L z<*6-@^EqVFCeyXabZs=@3$4;M80RN2SHB4^{66mvoKQyIMEB<>NH-O9M#05!gj4H#T^ZHa+l7NnXoV0UYz8oGS-f1$%4Vwp1F9pn9B05HurL}hkr0|^$=}IeL*Mt^*X)JM= zpKf?&>9;jG;Q{1D)vfF#eSS&v@tPfc_BCDph zMG=RTB}sou#Sp6H6UCu7BqLKOKS@~oPvt#N{o!l|VQ+LWm<+}TqtU#7Fo(wIU~cpd z=i}LYFwjT4i4klwOrDHWXZaZ>7l@JdF9@2nR-Q=|PKj(2|AF{W08wGvu(QUPHimzj ziIRzHbg5MDl%$aJU{jT#I-2DAy^&K_$Yr2dm-13C9AoQ)YkhF74=z-Ko=@R991Z&_a)%k2YkykKEpm=6 zLKp*7k+?AkmDAT_Q0i{vlPF~yhVgDGGEJ8!YZ1#pfLd%U;*ACFc~ci$oF6w>_peQM ze|laRWrUauV)&;uuNGY%ex7~oz1d)+`}J!gOe6R*&y)zk7aV{W^igVq6&usej=~Et zmL7{2f1_fZpvBaf&EVi*GM$VMM*ZpRV7geqgV_QtdW&gqf)I*aQdbnK-s^cWY}(=28jdqE0fcP4q>$FpZ~S`|1(y`c{KH}e$D1i@IB6#pG@L)GCs1)xlnYc` z);GW|59p(Hxm>5^Cuxh&=hOeL?H<)z-y2G_|9_;b?kzIO|Pj zqfv*w5}vL>e{?vS4kx22e|UKhZSAN(m`+EtUVl2B_JYUh_Q&U6UF~Qx>S&+&U*9zN z`TQ&B4~K`^O#&C&aw$`k_m~*gz3pF!-}A)R7qqt6qz!r;5%>^)@cI1fSBg#iHxz5p z=WWiR15Fc|*j-B=eLnxn74Qe>B3Tc|7ST73g9y{pj~%U_KxI0dPA9!MHo>z75sLPc z#A%Sgsoy&s9*+9c!6=4Sf70(w`h&yaq*2Vm-g;8(h6(J3gF$~V7>^DIy*PTkVefD@ z=#TrokrILjattRa3?pguQVd543@4+}U^MQ{Mxz9VF@kRr!^!lpKN}rR_}WM?9PbYU zO!klg4)>Y?rhCr-vpr{k$4*o;5KNY>YN)0fc0WC3)j<}oMjk(>E_h<}T1C*PB6xms zPYVA%Blo1_-z#!|>;#@OXc#s|I;tV^d;2ExYarCbZXjn#Yhae>tw{Qh2D8y@ayXbx zV#q}wKOJ&O**_gmXS3mGJR8IpH1hcAkgF*9cR}^FB>#@6UUdubEL5LV0((XENfoe1 zR3A|Q-nmJ?Sp|@K^xO(S6``kB0IHakQ~-O0Tm#1c?vQIv0o11YrWHUFRKFVq(9qg7 zunX87at-VOc7_>}+i6JYdip_4>WpXfmF(=K=e~059Y`;Mo{J z^*rFY7$Bk+3`n7ljn*&J`h{A*Q0o_J{X(zIFT}4VkxBo4Z!{erP7Ur z1@OGsq(%R8Vv}|OJtsD4pU-n*la%Jqi%n9XKQA_EQU09Rq+L4CiA~yv^L*Guq;r_? z(6HnFRaofL-gwxX_?xtyn<^p26iMt!uRoZLM}z(-Zbij*ZO!ARD8L83!Fbl2jt0}j z#0?Ke!|7~1933`otK^{9+UKS0^Sz<@qbuIw&*HYuGDT(od7+SdBe@Lj0Oj1@+0lX^|Wz4ZCpjb(Z~JR0=HzLkY?s`?pp+ zMo|Br{?IS_+E{(>WT{vgLb2CnW`q}hRhf^^Udy0vcnZ;Eo$pxrTBR$Y{Q9*e8mr#- z6e*djcN?o7>i2?F~P8kmvWUsA}LhLf5WAY(r0C+N2RWNwI^{Q zR)Xxf3{+_!6@R(()j-{T+4wwpuFmMqT}ipG)!!#0?eX#E@&5$?0RR7Z!N3|% Date: Mon, 22 Aug 2022 17:49:58 -0400 Subject: [PATCH 065/185] numassigner: Don't error on fresh non-genesis miners --- storage/pipeline/numassign.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/storage/pipeline/numassign.go b/storage/pipeline/numassign.go index 3b017213c..551d7a85e 100644 --- a/storage/pipeline/numassign.go +++ b/storage/pipeline/numassign.go @@ -103,11 +103,13 @@ func (m *Sealing) numAssignerMetaLocked(ctx context.Context) (api.NumAssignerMet var i uint64 { curBytes, err := m.ds.Get(ctx, datastore.NewKey(StorageCounterDSPrefix)) - if err != nil { + if err != nil && err != datastore.ErrNotFound { return api.NumAssignerMeta{}, err } - cur, _ := binary.Uvarint(curBytes) - i = cur + 1 + if err == nil { + cur, _ := binary.Uvarint(curBytes) + i = cur + 1 + } } rl := &rlepluslazy.RunSliceIterator{Runs: []rlepluslazy.Run{ From 76f6eb3edfcc53db54e375a904fece58dbb45b2f Mon Sep 17 00:00:00 2001 From: nujz Date: Tue, 23 Aug 2022 17:37:47 +0800 Subject: [PATCH 066/185] cgroupV1: memory.memsw.usage_in_bytes: no such file or directory --- storage/sealer/cgroups_linux.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/storage/sealer/cgroups_linux.go b/storage/sealer/cgroups_linux.go index 8bee54f78..0edcc9ead 100644 --- a/storage/sealer/cgroups_linux.go +++ b/storage/sealer/cgroups_linux.go @@ -40,7 +40,7 @@ func cgroupV1Mem() (memoryMax, memoryUsed, swapMax, swapUsed uint64, err error) if err != nil { return 0, 0, 0, 0, err } - stats, err := c.Stat() + stats, err := c.Stat(cgroups.IgnoreNotExist) if err != nil { return 0, 0, 0, 0, err } From 9812792d46e7e87acbd23c3d09c5d647ca28c1ef Mon Sep 17 00:00:00 2001 From: Aayush Date: Tue, 23 Aug 2022 15:02:55 -0400 Subject: [PATCH 067/185] fix: verifreg: serialize RmDcProposalID as int, not tuple --- chain/vm/runtime.go | 2 +- cli/filplus.go | 2 +- go.mod | 2 +- go.sum | 3 +- itests/verifreg_test.go | 232 +++++++++++++++++++++++++++++++++++- testplans/lotus-soup/go.mod | 16 +-- testplans/lotus-soup/go.sum | 24 ++-- 7 files changed, 256 insertions(+), 25 deletions(-) diff --git a/chain/vm/runtime.go b/chain/vm/runtime.go index 0b921772d..ce9349a1d 100644 --- a/chain/vm/runtime.go +++ b/chain/vm/runtime.go @@ -173,7 +173,7 @@ func (rt *Runtime) shimCall(f func() interface{}) (rval []byte, aerr aerrors.Act if rt.NetworkVersion() <= network.Version3 { aerr = aerrors.Newf(1, "spec actors failure: %s", r) } else { - aerr = aerrors.Newf(exitcode.SysErrReserved1, "spec actors failure: %s", r) + aerr = aerrors.Newf(exitcode.SysErrIllegalInstruction, "spec actors failure: %s", r) } } }() diff --git a/cli/filplus.go b/cli/filplus.go index b3ebce6e9..5374a9f40 100644 --- a/cli/filplus.go +++ b/cli/filplus.go @@ -360,7 +360,7 @@ var filplusSignRemoveDataCapProposal = &cli.Command{ } params := verifregtypes.RemoveDataCapProposal{ - RemovalProposalID: verifregtypes.RmDcProposalID{ProposalID: id}, + RemovalProposalID: id, DataCapAmount: allowanceToRemove, VerifiedClient: clientIdAddr, } diff --git a/go.mod b/go.mod index eba6ed097..915976a5d 100644 --- a/go.mod +++ b/go.mod @@ -42,7 +42,7 @@ require ( github.com/filecoin-project/go-legs v0.4.4 github.com/filecoin-project/go-padreader v0.0.1 github.com/filecoin-project/go-paramfetch v0.0.4 - github.com/filecoin-project/go-state-types v0.1.10 + github.com/filecoin-project/go-state-types v0.1.11-0.20220823184028-73c63d4127a4 github.com/filecoin-project/go-statemachine v1.0.2 github.com/filecoin-project/go-statestore v0.2.0 github.com/filecoin-project/go-storedcounter v0.1.0 diff --git a/go.sum b/go.sum index f45166152..f2cd9c72c 100644 --- a/go.sum +++ b/go.sum @@ -386,8 +386,9 @@ github.com/filecoin-project/go-state-types v0.1.3/go.mod h1:ezYnPf0bNkTsDibL/psS github.com/filecoin-project/go-state-types v0.1.5/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q= github.com/filecoin-project/go-state-types v0.1.6/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q= github.com/filecoin-project/go-state-types v0.1.8/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q= -github.com/filecoin-project/go-state-types v0.1.10 h1:YrrJWWh2fU4VPhwHyPlDK5I4mB7bqgnRd3HCm9IOwIU= github.com/filecoin-project/go-state-types v0.1.10/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q= +github.com/filecoin-project/go-state-types v0.1.11-0.20220823184028-73c63d4127a4 h1:ptwW6pe1SDnDGpKzxoLGfwPFsJ3remMP5KKfjbkGFBU= +github.com/filecoin-project/go-state-types v0.1.11-0.20220823184028-73c63d4127a4/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q= github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig= github.com/filecoin-project/go-statemachine v1.0.2-0.20220322104818-27f8fbb86dfd/go.mod h1:jZdXXiHa61n4NmgWFG4w8tnqgvZVHYbJ3yW7+y8bF54= github.com/filecoin-project/go-statemachine v1.0.2 h1:421SSWBk8GIoCoWYYTE/d+qCWccgmRH0uXotXRDjUbc= diff --git a/itests/verifreg_test.go b/itests/verifreg_test.go index b235c45da..7afcd3a3b 100644 --- a/itests/verifreg_test.go +++ b/itests/verifreg_test.go @@ -2,6 +2,7 @@ package itests import ( + "bytes" "context" "fmt" "strings" @@ -10,10 +11,11 @@ import ( "github.com/stretchr/testify/require" + "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" + verifregst "github.com/filecoin-project/go-state-types/builtin/v8/verifreg" "github.com/filecoin-project/go-state-types/network" - verifreg4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/verifreg" lapi "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/chain/actors" @@ -76,7 +78,7 @@ func TestVerifiedClientTopUp(t *testing.T) { verifiedClientAddr, err := api.WalletImport(ctx, &verifiedClientKey.KeyInfo) require.NoError(t, err) - params, err := actors.SerializeParams(&verifreg4.AddVerifierParams{Address: verifierAddr, Allowance: big.NewInt(100000000000)}) + params, err := actors.SerializeParams(&verifregst.AddVerifierParams{Address: verifierAddr, Allowance: big.NewInt(100000000000)}) require.NoError(t, err) msg := &types.Message{ @@ -98,7 +100,7 @@ func TestVerifiedClientTopUp(t *testing.T) { // assign datacap to a client datacap := big.NewInt(10000) - params, err = actors.SerializeParams(&verifreg4.AddVerifiedClientParams{Address: verifiedClientAddr, Allowance: datacap}) + params, err = actors.SerializeParams(&verifregst.AddVerifiedClientParams{Address: verifiedClientAddr, Allowance: datacap}) require.NoError(t, err) msg = &types.Message{ @@ -127,7 +129,7 @@ func TestVerifiedClientTopUp(t *testing.T) { } // try to assign datacap to the same client should fail for actor v4 and below - params, err = actors.SerializeParams(&verifreg4.AddVerifiedClientParams{Address: verifiedClientAddr, Allowance: datacap}) + params, err = actors.SerializeParams(&verifregst.AddVerifiedClientParams{Address: verifiedClientAddr, Allowance: datacap}) if err != nil { t.Fatal(err) } @@ -154,3 +156,225 @@ func TestVerifiedClientTopUp(t *testing.T) { t.Run("nv12", test(network.Version12, false)) t.Run("nv13", test(network.Version13, true)) } + +func TestRemoveDataCap(t *testing.T) { + //stm: @CHAIN_SYNCER_LOAD_GENESIS_001, @CHAIN_SYNCER_FETCH_TIPSET_001, + //stm: @CHAIN_SYNCER_START_001, @CHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_VALUES_01 + //stm: @CHAIN_SYNCER_COLLECT_CHAIN_001, @CHAIN_SYNCER_COLLECT_HEADERS_001, @CHAIN_SYNCER_VALIDATE_TIPSET_001 + //stm: @CHAIN_SYNCER_NEW_PEER_HEAD_001, @CHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @CHAIN_SYNCER_STOP_001 + + //stm: @CHAIN_INCOMING_HANDLE_INCOMING_BLOCKS_001, @CHAIN_INCOMING_VALIDATE_BLOCK_PUBSUB_001, @CHAIN_INCOMING_VALIDATE_MESSAGE_PUBSUB_001 + blockTime := 100 * time.Millisecond + + rootKey, err := key.GenerateKey(types.KTSecp256k1) + require.NoError(t, err) + + verifier1Key, err := key.GenerateKey(types.KTSecp256k1) + require.NoError(t, err) + + verifier2Key, err := key.GenerateKey(types.KTSecp256k1) + require.NoError(t, err) + + verifiedClientKey, err := key.GenerateKey(types.KTBLS) + require.NoError(t, err) + + bal, err := types.ParseFIL("100fil") + require.NoError(t, err) + + node, _, ens := kit.EnsembleMinimal(t, kit.MockProofs(), + kit.RootVerifier(rootKey, abi.NewTokenAmount(bal.Int64())), + kit.Account(verifier1Key, abi.NewTokenAmount(bal.Int64())), + kit.Account(verifier2Key, abi.NewTokenAmount(bal.Int64())), + kit.Account(verifiedClientKey, abi.NewTokenAmount(bal.Int64())), + ) + + ens.InterconnectAll().BeginMining(blockTime) + + api := node.FullNode.(*impl.FullNodeAPI) + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + // get VRH + //stm: @CHAIN_STATE_VERIFIED_REGISTRY_ROOT_KEY_001 + vrh, err := api.StateVerifiedRegistryRootKey(ctx, types.TipSetKey{}) + fmt.Println(vrh.String()) + require.NoError(t, err) + + // import the root key. + rootAddr, err := api.WalletImport(ctx, &rootKey.KeyInfo) + require.NoError(t, err) + + // import the verifiers' keys. + verifier1Addr, err := api.WalletImport(ctx, &verifier1Key.KeyInfo) + require.NoError(t, err) + + verifier2Addr, err := api.WalletImport(ctx, &verifier2Key.KeyInfo) + require.NoError(t, err) + + // import the verified client's key. + verifiedClientAddr, err := api.WalletImport(ctx, &verifiedClientKey.KeyInfo) + require.NoError(t, err) + + // resolve all keys + + verifier1ID, err := api.StateLookupID(ctx, verifier1Addr, types.EmptyTSK) + require.NoError(t, err) + + verifier2ID, err := api.StateLookupID(ctx, verifier2Addr, types.EmptyTSK) + require.NoError(t, err) + + verifiedClientID, err := api.StateLookupID(ctx, verifiedClientAddr, types.EmptyTSK) + require.NoError(t, err) + + // make the 2 verifiers + + makeVerifier := func(addr address.Address) error { + params, aerr := actors.SerializeParams(&verifregst.AddVerifierParams{Address: addr, Allowance: big.NewInt(100000000000)}) + require.NoError(t, aerr) + + msg := &types.Message{ + From: rootAddr, + To: verifreg.Address, + Method: verifreg.Methods.AddVerifier, + Params: params, + Value: big.Zero(), + } + + sm, err := api.MpoolPushMessage(ctx, msg, nil) + require.NoError(t, err, "AddVerifier failed") + + //stm: @CHAIN_STATE_WAIT_MSG_001 + res, err := api.StateWaitMsg(ctx, sm.Cid(), 1, lapi.LookbackNoLimit, true) + require.NoError(t, err) + require.EqualValues(t, 0, res.Receipt.ExitCode) + + return nil + } + + require.NoError(t, makeVerifier(verifier1Addr)) + require.NoError(t, makeVerifier(verifier2Addr)) + + // assign datacap to a client + datacap := big.NewInt(10000) + + params, err := actors.SerializeParams(&verifregst.AddVerifiedClientParams{Address: verifiedClientAddr, Allowance: datacap}) + require.NoError(t, err) + + msg := &types.Message{ + From: verifier1Addr, + To: verifreg.Address, + Method: verifreg.Methods.AddVerifiedClient, + Params: params, + Value: big.Zero(), + } + + sm, err := api.MpoolPushMessage(ctx, msg, nil) + require.NoError(t, err) + + //stm: @CHAIN_STATE_WAIT_MSG_001 + res, err := api.StateWaitMsg(ctx, sm.Cid(), 1, lapi.LookbackNoLimit, true) + require.NoError(t, err) + require.EqualValues(t, 0, res.Receipt.ExitCode) + + // check datacap balance + //stm: @CHAIN_STATE_VERIFIED_CLIENT_STATUS_001 + dcap, err := api.StateVerifiedClientStatus(ctx, verifiedClientAddr, types.EmptyTSK) + require.NoError(t, err) + + if !dcap.Equals(datacap) { + t.Fatal("unexpected datacap") + } + + // helper to create removedatacap message + makeRemoveDatacapMsg := func(removeDatacap big.Int, proposalID uint64) *types.Message { + removeProposal := verifregst.RemoveDataCapProposal{ + VerifiedClient: verifiedClientID, + DataCapAmount: removeDatacap, + RemovalProposalID: proposalID, + } + + buf := bytes.Buffer{} + buf.WriteString(verifregst.SignatureDomainSeparation_RemoveDataCap) + require.NoError(t, removeProposal.MarshalCBOR(&buf), "failed to marshal proposal") + + removeProposalSer := buf.Bytes() + + verifier1Sig, err := api.WalletSign(ctx, verifier1Addr, removeProposalSer) + require.NoError(t, err, "failed to sign proposal") + + removeRequest1 := verifregst.RemoveDataCapRequest{ + Verifier: verifier1ID, + VerifierSignature: *verifier1Sig, + } + + verifier2Sig, err := api.WalletSign(ctx, verifier2Addr, removeProposalSer) + require.NoError(t, err, "failed to sign proposal") + + removeRequest2 := verifregst.RemoveDataCapRequest{ + Verifier: verifier2ID, + VerifierSignature: *verifier2Sig, + } + + removeDataCapParams := verifregst.RemoveDataCapParams{ + VerifiedClientToRemove: verifiedClientAddr, + DataCapAmountToRemove: removeDatacap, + VerifierRequest1: removeRequest1, + VerifierRequest2: removeRequest2, + } + + params, aerr := actors.SerializeParams(&removeDataCapParams) + require.NoError(t, aerr) + + msg = &types.Message{ + From: rootAddr, + To: verifreg.Address, + Method: verifreg.Methods.RemoveVerifiedClientDataCap, + Params: params, + Value: big.Zero(), + } + + return msg + } + + // let's take away half the client's datacap now + + removeDatacap := big.Div(datacap, big.NewInt(2)) + // proposal ids are 0 the first time + removeMsg := makeRemoveDatacapMsg(removeDatacap, 0) + + sm, err = api.MpoolPushMessage(ctx, removeMsg, nil) + require.NoError(t, err, "RemoveDataCap failed") + + //stm: @CHAIN_STATE_WAIT_MSG_001 + res, err = api.StateWaitMsg(ctx, sm.Cid(), 1, lapi.LookbackNoLimit, true) + require.NoError(t, err) + require.EqualValues(t, 0, res.Receipt.ExitCode) + + // check datacap balance + //stm: @CHAIN_STATE_VERIFIED_CLIENT_STATUS_001 + dcap, err = api.StateVerifiedClientStatus(ctx, verifiedClientAddr, types.EmptyTSK) + require.NoError(t, err) + + if !dcap.Equals(big.Sub(datacap, removeDatacap)) { + t.Fatal("unexpected datacap") + } + + // now take away the second half! + + // proposal ids are 1 the second time + removeMsg = makeRemoveDatacapMsg(removeDatacap, 1) + + sm, err = api.MpoolPushMessage(ctx, removeMsg, nil) + require.NoError(t, err, "RemoveDataCap failed") + + //stm: @CHAIN_STATE_WAIT_MSG_001 + res, err = api.StateWaitMsg(ctx, sm.Cid(), 1, lapi.LookbackNoLimit, true) + require.NoError(t, err) + require.EqualValues(t, 0, res.Receipt.ExitCode) + + // check datacap balance + //stm: @CHAIN_STATE_VERIFIED_CLIENT_STATUS_001 + dcap, err = api.StateVerifiedClientStatus(ctx, verifiedClientAddr, types.EmptyTSK) + require.NoError(t, err) + require.Nil(t, dcap, "expected datacap to be nil") +} diff --git a/testplans/lotus-soup/go.mod b/testplans/lotus-soup/go.mod index c7c313c6f..70259e4af 100644 --- a/testplans/lotus-soup/go.mod +++ b/testplans/lotus-soup/go.mod @@ -9,9 +9,9 @@ require ( github.com/drand/drand v1.3.0 github.com/filecoin-project/go-address v1.0.0 github.com/filecoin-project/go-data-transfer v1.15.2 - github.com/filecoin-project/go-fil-markets v1.23.1 + github.com/filecoin-project/go-fil-markets v1.24.0 github.com/filecoin-project/go-jsonrpc v0.1.5 - github.com/filecoin-project/go-state-types v0.1.10 + github.com/filecoin-project/go-state-types v0.1.11-0.20220823184028-73c63d4127a4 github.com/filecoin-project/go-storedcounter v0.1.0 github.com/filecoin-project/lotus v0.0.0-00010101000000-000000000000 github.com/filecoin-project/specs-actors v0.9.15 @@ -149,9 +149,9 @@ require ( github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab // indirect github.com/ipfs/bbloom v0.0.4 // indirect github.com/ipfs/go-bitfield v1.0.0 // indirect - github.com/ipfs/go-bitswap v0.7.1-0.20220705171910-84973686518b // indirect + github.com/ipfs/go-bitswap v0.8.0 // indirect github.com/ipfs/go-block-format v0.0.3 // indirect - github.com/ipfs/go-blockservice v0.3.0 // indirect + github.com/ipfs/go-blockservice v0.4.0 // indirect github.com/ipfs/go-cidutil v0.1.0 // indirect github.com/ipfs/go-ds-badger2 v0.1.2 // indirect github.com/ipfs/go-ds-leveldb v0.5.0 // indirect @@ -164,8 +164,8 @@ require ( github.com/ipfs/go-ipfs-cmds v0.7.0 // indirect github.com/ipfs/go-ipfs-delay v0.0.1 // indirect github.com/ipfs/go-ipfs-ds-help v1.1.0 // indirect - github.com/ipfs/go-ipfs-exchange-interface v0.1.0 // indirect - github.com/ipfs/go-ipfs-exchange-offline v0.2.0 // indirect + github.com/ipfs/go-ipfs-exchange-interface v0.2.0 // indirect + github.com/ipfs/go-ipfs-exchange-offline v0.3.0 // indirect github.com/ipfs/go-ipfs-http-client v0.4.0 // indirect github.com/ipfs/go-ipfs-posinfo v0.0.1 // indirect github.com/ipfs/go-ipfs-pq v0.0.2 // indirect @@ -206,14 +206,14 @@ require ( github.com/libp2p/go-libp2p-connmgr v0.4.0 // indirect github.com/libp2p/go-libp2p-discovery v0.7.0 // indirect github.com/libp2p/go-libp2p-gostream v0.4.0 // indirect - github.com/libp2p/go-libp2p-kad-dht v0.15.0 // indirect + github.com/libp2p/go-libp2p-kad-dht v0.17.0 // indirect github.com/libp2p/go-libp2p-kbucket v0.4.7 // indirect github.com/libp2p/go-libp2p-loggables v0.1.0 // indirect github.com/libp2p/go-libp2p-noise v0.5.0 // indirect github.com/libp2p/go-libp2p-peerstore v0.7.1 // indirect github.com/libp2p/go-libp2p-pubsub v0.7.1 // indirect github.com/libp2p/go-libp2p-record v0.1.3 // indirect - github.com/libp2p/go-libp2p-resource-manager v0.5.2 // indirect + github.com/libp2p/go-libp2p-resource-manager v0.5.3 // indirect github.com/libp2p/go-libp2p-routing-helpers v0.2.3 // indirect github.com/libp2p/go-libp2p-tls v0.5.0 // indirect github.com/libp2p/go-maddr-filter v0.1.0 // indirect diff --git a/testplans/lotus-soup/go.sum b/testplans/lotus-soup/go.sum index 48a908640..0fed554a1 100644 --- a/testplans/lotus-soup/go.sum +++ b/testplans/lotus-soup/go.sum @@ -475,8 +475,9 @@ github.com/filecoin-project/go-state-types v0.1.3/go.mod h1:ezYnPf0bNkTsDibL/psS github.com/filecoin-project/go-state-types v0.1.5/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q= github.com/filecoin-project/go-state-types v0.1.6/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q= github.com/filecoin-project/go-state-types v0.1.8/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q= -github.com/filecoin-project/go-state-types v0.1.10 h1:YrrJWWh2fU4VPhwHyPlDK5I4mB7bqgnRd3HCm9IOwIU= github.com/filecoin-project/go-state-types v0.1.10/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q= +github.com/filecoin-project/go-state-types v0.1.11-0.20220823184028-73c63d4127a4 h1:ptwW6pe1SDnDGpKzxoLGfwPFsJ3remMP5KKfjbkGFBU= +github.com/filecoin-project/go-state-types v0.1.11-0.20220823184028-73c63d4127a4/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q= github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig= github.com/filecoin-project/go-statemachine v1.0.2-0.20220322104818-27f8fbb86dfd/go.mod h1:jZdXXiHa61n4NmgWFG4w8tnqgvZVHYbJ3yW7+y8bF54= github.com/filecoin-project/go-statemachine v1.0.2 h1:421SSWBk8GIoCoWYYTE/d+qCWccgmRH0uXotXRDjUbc= @@ -955,8 +956,8 @@ github.com/ipfs/go-bitswap v0.1.8/go.mod h1:TOWoxllhccevbWFUR2N7B1MTSVVge1s6XSMi github.com/ipfs/go-bitswap v0.3.4/go.mod h1:4T7fvNv/LmOys+21tnLzGKncMeeXUYUd1nUiJ2teMvI= github.com/ipfs/go-bitswap v0.5.1/go.mod h1:P+ckC87ri1xFLvk74NlXdP0Kj9RmWAh4+H78sC6Qopo= github.com/ipfs/go-bitswap v0.6.0/go.mod h1:Hj3ZXdOC5wBJvENtdqsixmzzRukqd8EHLxZLZc3mzRA= -github.com/ipfs/go-bitswap v0.7.1-0.20220705171910-84973686518b h1:D0ovjO1DVGRlT+FLDoJeL3GnZ/6qyov5xpqUXt7TEkM= -github.com/ipfs/go-bitswap v0.7.1-0.20220705171910-84973686518b/go.mod h1:EKDX22BNE4CaW8jDn4yjsN8YcqKQZUL4/dXxtKQ6hto= +github.com/ipfs/go-bitswap v0.8.0 h1:UEV7kogQu2iGggkE9GhLykDrRCUpsNnpu2NODww/srw= +github.com/ipfs/go-bitswap v0.8.0/go.mod h1:/h8sBij8UVEaNWl8ABzpLRA5Y1cttdNUnpeGo2AA/LQ= github.com/ipfs/go-block-format v0.0.1/go.mod h1:DK/YYcsSUIVAFNwo/KZCdIIbpN0ROH/baNLgayt4pFc= github.com/ipfs/go-block-format v0.0.2/go.mod h1:AWR46JfpcObNfg3ok2JHDUfdiHRgWhJgCQF+KIgOPJY= github.com/ipfs/go-block-format v0.0.3 h1:r8t66QstRp/pd/or4dpnbVfXT5Gt7lOqRvC+/dDTpMc= @@ -966,8 +967,9 @@ github.com/ipfs/go-blockservice v0.1.0/go.mod h1:hzmMScl1kXHg3M2BjTymbVPjv627N7s github.com/ipfs/go-blockservice v0.1.4/go.mod h1:OTZhFpkgY48kNzbgyvcexW9cHrpjBYIjSR0KoDOFOLU= github.com/ipfs/go-blockservice v0.1.7/go.mod h1:GmS+BAt4hrwBKkzE11AFDQUrnvqjwFatGS2MY7wOjEM= github.com/ipfs/go-blockservice v0.2.1/go.mod h1:k6SiwmgyYgs4M/qt+ww6amPeUH9EISLRBnvUurKJhi8= -github.com/ipfs/go-blockservice v0.3.0 h1:cDgcZ+0P0Ih3sl8+qjFr2sVaMdysg/YZpLj5WJ8kiiw= github.com/ipfs/go-blockservice v0.3.0/go.mod h1:P5ppi8IHDC7O+pA0AlGTF09jruB2h+oP3wVVaZl8sfk= +github.com/ipfs/go-blockservice v0.4.0 h1:7MUijAW5SqdsqEW/EhnNFRJXVF8mGU5aGhZ3CQaCWbY= +github.com/ipfs/go-blockservice v0.4.0/go.mod h1:kRjO3wlGW9mS1aKuiCeGhx9K1DagQ10ACpVO59qgAx4= github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/ipfs/go-cid v0.0.2/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/ipfs/go-cid v0.0.3/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= @@ -1061,12 +1063,14 @@ github.com/ipfs/go-ipfs-ds-help v1.0.0/go.mod h1:ujAbkeIgkKAWtxxNkoZHWLCyk5JpPoK github.com/ipfs/go-ipfs-ds-help v1.1.0 h1:yLE2w9RAsl31LtfMt91tRZcrx+e61O5mDxFRR994w4Q= github.com/ipfs/go-ipfs-ds-help v1.1.0/go.mod h1:YR5+6EaebOhfcqVCyqemItCLthrpVNot+rsOU/5IatU= github.com/ipfs/go-ipfs-exchange-interface v0.0.1/go.mod h1:c8MwfHjtQjPoDyiy9cFquVtVHkO9b9Ob3FG91qJnWCM= -github.com/ipfs/go-ipfs-exchange-interface v0.1.0 h1:TiMekCrOGQuWYtZO3mf4YJXDIdNgnKWZ9IE3fGlnWfo= github.com/ipfs/go-ipfs-exchange-interface v0.1.0/go.mod h1:ych7WPlyHqFvCi/uQI48zLZuAWVP5iTQPXEfVaw5WEI= +github.com/ipfs/go-ipfs-exchange-interface v0.2.0 h1:8lMSJmKogZYNo2jjhUs0izT+dck05pqUw4mWNW9Pw6Y= +github.com/ipfs/go-ipfs-exchange-interface v0.2.0/go.mod h1:z6+RhJuDQbqKguVyslSOuVDhqF9JtTrO3eptSAiW2/Y= github.com/ipfs/go-ipfs-exchange-offline v0.0.1/go.mod h1:WhHSFCVYX36H/anEKQboAzpUws3x7UeEGkzQc3iNkM0= github.com/ipfs/go-ipfs-exchange-offline v0.1.1/go.mod h1:vTiBRIbzSwDD0OWm+i3xeT0mO7jG2cbJYatp3HPk5XY= -github.com/ipfs/go-ipfs-exchange-offline v0.2.0 h1:2PF4o4A7W656rC0RxuhUace997FTcDTcIQ6NoEtyjAI= github.com/ipfs/go-ipfs-exchange-offline v0.2.0/go.mod h1:HjwBeW0dvZvfOMwDP0TSKXIHf2s+ksdP4E3MLDRtLKY= +github.com/ipfs/go-ipfs-exchange-offline v0.3.0 h1:c/Dg8GDPzixGd0MC8Jh6mjOwU57uYokgWRFidfvEkuA= +github.com/ipfs/go-ipfs-exchange-offline v0.3.0/go.mod h1:MOdJ9DChbb5u37M1IcbrRB02e++Z7521fMxqCNRrz9s= github.com/ipfs/go-ipfs-files v0.0.3/go.mod h1:INEFm0LL2LWXBhNJ2PMIIb2w45hpXgPjNoE7yA8Y1d4= github.com/ipfs/go-ipfs-files v0.0.4/go.mod h1:INEFm0LL2LWXBhNJ2PMIIb2w45hpXgPjNoE7yA8Y1d4= github.com/ipfs/go-ipfs-files v0.0.8/go.mod h1:wiN/jSG8FKyk7N0WyctKSvq3ljIa2NNTiZB55kpTdOs= @@ -1480,8 +1484,9 @@ github.com/libp2p/go-libp2p-interface-connmgr v0.0.4/go.mod h1:GarlRLH0LdeWcLnYM github.com/libp2p/go-libp2p-interface-connmgr v0.0.5/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= github.com/libp2p/go-libp2p-interface-pnet v0.0.1/go.mod h1:el9jHpQAXK5dnTpKA4yfCNBZXvrzdOU75zz+C6ryp3k= github.com/libp2p/go-libp2p-kad-dht v0.2.1/go.mod h1:k7ONOlup7HKzQ68dE6lSnp07cdxdkmnRa+6B4Fh9/w0= -github.com/libp2p/go-libp2p-kad-dht v0.15.0 h1:Ke+Oj78gX5UDXnA6HBdrgvi+fStJxgYTDa51U0TsCLo= github.com/libp2p/go-libp2p-kad-dht v0.15.0/go.mod h1:rZtPxYu1TnHHz6n1RggdGrxUX/tA1C2/Wiw3ZMUDrU0= +github.com/libp2p/go-libp2p-kad-dht v0.17.0 h1:HWEjqjNVDuf8yuccuswGy1vYGzB0v4Z+yQ4DMDMSIqk= +github.com/libp2p/go-libp2p-kad-dht v0.17.0/go.mod h1:zeE26Xo+PY7sS2AgkBQQcBnJEazMT26KGZLUFttl+rk= github.com/libp2p/go-libp2p-kbucket v0.2.1/go.mod h1:/Rtu8tqbJ4WQ2KTCOMJhggMukOLNLNPY1EtEWWLxUvc= github.com/libp2p/go-libp2p-kbucket v0.3.1/go.mod h1:oyjT5O7tS9CQurok++ERgc46YLwEpuGoFq9ubvoUOio= github.com/libp2p/go-libp2p-kbucket v0.4.7 h1:spZAcgxifvFZHBD8tErvppbnNiKA5uokDu3CV7axu70= @@ -1568,8 +1573,8 @@ github.com/libp2p/go-libp2p-resource-manager v0.1.5/go.mod h1:wJPNjeE4XQlxeidwqV github.com/libp2p/go-libp2p-resource-manager v0.2.1/go.mod h1:K+eCkiapf+ey/LADO4TaMpMTP9/Qde/uLlrnRqV4PLQ= github.com/libp2p/go-libp2p-resource-manager v0.3.0/go.mod h1:K+eCkiapf+ey/LADO4TaMpMTP9/Qde/uLlrnRqV4PLQ= github.com/libp2p/go-libp2p-resource-manager v0.5.1/go.mod h1:CggtV6EZb+Y0dGh41q5ezO4udcVKyhcEFpydHD8EMe0= -github.com/libp2p/go-libp2p-resource-manager v0.5.2 h1:ngCef92Mg53l/OKwCN+4YwWrr+aPHFgEG2CHfuzW0ys= -github.com/libp2p/go-libp2p-resource-manager v0.5.2/go.mod h1:CggtV6EZb+Y0dGh41q5ezO4udcVKyhcEFpydHD8EMe0= +github.com/libp2p/go-libp2p-resource-manager v0.5.3 h1:W8rG2abNBO52SRQYj24AvKmutTJZfoc1OrgzGQPwcRU= +github.com/libp2p/go-libp2p-resource-manager v0.5.3/go.mod h1:CggtV6EZb+Y0dGh41q5ezO4udcVKyhcEFpydHD8EMe0= github.com/libp2p/go-libp2p-routing v0.0.1/go.mod h1:N51q3yTr4Zdr7V8Jt2JIktVU+3xBBylx1MZeVA6t1Ys= github.com/libp2p/go-libp2p-routing v0.1.0/go.mod h1:zfLhI1RI8RLEzmEaaPwzonRvXeeSHddONWkcTcB54nE= github.com/libp2p/go-libp2p-routing-helpers v0.2.3 h1:xY61alxJ6PurSi+MXbywZpelvuU4U4p/gPTxjqCqTzY= @@ -1637,6 +1642,7 @@ github.com/libp2p/go-libp2p-transport-upgrader v0.6.0/go.mod h1:1e07y1ZSZdHo9HPb github.com/libp2p/go-libp2p-transport-upgrader v0.7.0/go.mod h1:GIR2aTRp1J5yjVlkUoFqMkdobfob6RnAwYg/RZPhrzg= github.com/libp2p/go-libp2p-transport-upgrader v0.7.1/go.mod h1:GIR2aTRp1J5yjVlkUoFqMkdobfob6RnAwYg/RZPhrzg= github.com/libp2p/go-libp2p-xor v0.0.0-20210714161855-5c005aca55db/go.mod h1:LSTM5yRnjGZbWNTA/hRwq2gGFrvRIbQJscoIL/u6InY= +github.com/libp2p/go-libp2p-xor v0.1.0/go.mod h1:LSTM5yRnjGZbWNTA/hRwq2gGFrvRIbQJscoIL/u6InY= github.com/libp2p/go-libp2p-yamux v0.1.2/go.mod h1:xUoV/RmYkg6BW/qGxA9XJyg+HzXFYkeXbnhjmnYzKp8= github.com/libp2p/go-libp2p-yamux v0.1.3/go.mod h1:VGSQVrqkh6y4nm0189qqxMtvyBft44MOYYPpYKXiVt4= github.com/libp2p/go-libp2p-yamux v0.2.0/go.mod h1:Db2gU+XfLpm6E4rG5uGCFX6uXA8MEXOxFcRoXUODaK8= From 5e8027663141b9ccb6c5ccff101a82db53da366f Mon Sep 17 00:00:00 2001 From: Aayush Date: Tue, 23 Aug 2022 17:24:28 -0400 Subject: [PATCH 068/185] fix: mock sealer: grab lock in ReadPiece --- storage/sealer/mock/mock.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/storage/sealer/mock/mock.go b/storage/sealer/mock/mock.go index baa644cc1..5b0afd35c 100644 --- a/storage/sealer/mock/mock.go +++ b/storage/sealer/mock/mock.go @@ -439,6 +439,9 @@ func (mgr *SectorMgr) GenerateWindowPoStWithVanilla(ctx context.Context, proofTy func (mgr *SectorMgr) ReadPiece(ctx context.Context, sector storiface.SectorRef, offset storiface.UnpaddedByteIndex, size abi.UnpaddedPieceSize, ticket abi.SealRandomness, unsealed cid.Cid) (mount.Reader, bool, error) { off := storiface.UnpaddedByteIndex(0) var piece cid.Cid + + mgr.lk.Lock() + for _, c := range mgr.sectors[sector.ID].pieces { piece = c if off >= offset { @@ -451,6 +454,8 @@ func (mgr *SectorMgr) ReadPiece(ctx context.Context, sector storiface.SectorRef, } br := bytes.NewReader(mgr.pieces[piece][:size]) + mgr.lk.Unlock() + return struct { io.ReadCloser io.Seeker From 335f5df3ec3f4cfbfe70ebd67fb796b9a3eeac6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 24 Aug 2022 11:25:37 -0400 Subject: [PATCH 069/185] numassigner: SectorNumReserveCount --- api/api_storage.go | 20 +++- api/proxy_gen.go | 13 +++ build/openrpc/full.json.gz | Bin 28351 -> 28350 bytes build/openrpc/gateway.json.gz | Bin 4942 -> 4943 bytes build/openrpc/miner.json.gz | Bin 14932 -> 15221 bytes build/openrpc/worker.json.gz | Bin 5032 -> 5036 bytes cmd/lotus-miner/sectors.go | 97 +---------------- documentation/en/api-v0-methods-miner.md | 34 ++++++ itests/sector_numassign_test.go | 47 ++++++++ lib/strle/human.go | 100 ++++++++++++++++++ .../strle/human_test.go | 8 +- node/impl/storminer.go | 4 + storage/pipeline/numassign.go | 49 +++++++++ 13 files changed, 272 insertions(+), 100 deletions(-) create mode 100644 lib/strle/human.go rename cmd/lotus-miner/sectors_test.go => lib/strle/human_test.go (90%) diff --git a/api/api_storage.go b/api/api_storage.go index 8ecf752e2..c183d2189 100644 --- a/api/api_storage.go +++ b/api/api_storage.go @@ -125,10 +125,19 @@ type StorageMiner interface { SectorAbortUpgrade(context.Context, abi.SectorNumber) error //perm:admin // SectorNumAssignerMeta returns sector number assigner metadata - reserved/allocated - SectorNumAssignerMeta(ctx context.Context) (NumAssignerMeta, error) //perm:read - SectorNumReservations(ctx context.Context) (map[string]bitfield.BitField, error) //perm:read - SectorNumReserve(ctx context.Context, name string, field bitfield.BitField, force bool) error //perm:admin - SectorNumFree(ctx context.Context, name string) error //perm:admin + SectorNumAssignerMeta(ctx context.Context) (NumAssignerMeta, error) //perm:read + // SectorNumReservations returns a list of sector number reservations + SectorNumReservations(ctx context.Context) (map[string]bitfield.BitField, error) //perm:read + // SectorNumReserve creates a new sector number reservation. Will fail if any other reservation has colliding + // numbers or name. Set force to true to override safety checks. + // Valid characters for name: a-z, A-Z, 0-9, _, - + SectorNumReserve(ctx context.Context, name string, sectors bitfield.BitField, force bool) error //perm:admin + // SectorNumReserveCount creates a new sector number reservation for `count` sector numbers. + // by default lotus will allocate lowest-available sector numbers to the reservation. + // For restrictions on `name` see SectorNumReserve + SectorNumReserveCount(ctx context.Context, name string, count uint64) (bitfield.BitField, error) //perm:admin + // SectorNumFree drops a sector reservation + SectorNumFree(ctx context.Context, name string) error //perm:admin // WorkerConnect tells the node to connect to workers RPC WorkerConnect(context.Context, string) error //perm:admin retry:true @@ -480,5 +489,8 @@ type NumAssignerMeta struct { Reserved bitfield.BitField Allocated bitfield.BitField + // ChainAllocated+Reserved+Allocated + InUse bitfield.BitField + Next abi.SectorNumber } diff --git a/api/proxy_gen.go b/api/proxy_gen.go index 6a55dfd32..769344ce2 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -836,6 +836,8 @@ type StorageMinerStruct struct { SectorNumReserve func(p0 context.Context, p1 string, p2 bitfield.BitField, p3 bool) error `perm:"admin"` + SectorNumReserveCount func(p0 context.Context, p1 string, p2 uint64) (bitfield.BitField, error) `perm:"admin"` + SectorPreCommitFlush func(p0 context.Context) ([]sealiface.PreCommitBatchRes, error) `perm:"admin"` SectorPreCommitPending func(p0 context.Context) ([]abi.SectorID, error) `perm:"admin"` @@ -4978,6 +4980,17 @@ func (s *StorageMinerStub) SectorNumReserve(p0 context.Context, p1 string, p2 bi return ErrNotSupported } +func (s *StorageMinerStruct) SectorNumReserveCount(p0 context.Context, p1 string, p2 uint64) (bitfield.BitField, error) { + if s.Internal.SectorNumReserveCount == nil { + return *new(bitfield.BitField), ErrNotSupported + } + return s.Internal.SectorNumReserveCount(p0, p1, p2) +} + +func (s *StorageMinerStub) SectorNumReserveCount(p0 context.Context, p1 string, p2 uint64) (bitfield.BitField, error) { + return *new(bitfield.BitField), ErrNotSupported +} + func (s *StorageMinerStruct) SectorPreCommitFlush(p0 context.Context) ([]sealiface.PreCommitBatchRes, error) { if s.Internal.SectorPreCommitFlush == nil { return *new([]sealiface.PreCommitBatchRes), ErrNotSupported diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 24e6dc3544a499d008f25bee31c662cbc2b7961e..6beb0d65af84db6fa5835a7d37a4677615412cb0 100644 GIT binary patch delta 16909 zcmV)wK$O3~-2uMc0kBsB0`|m{Sps|kY_rw^3ITtw8aTr{#3irq#u$>?3;Dv6XJSIx zhAjOaK_5j6F=f(tHM1Z%Xbl<-au+a+wC@Bgrg#vr5P4!lm3c-xspXi)Jz^T=a|Nhs% zgw}ufCP1F(U6=Vb_>9RBjR_y@zaB2Ce2Ab&$s58WtO+@%G4TicyW7LTG32na-q)e% zITkWB$i^IA6hl}8R5y45B3L}gW=%4{;{>WwYim) zxDdGXoKiWvee|6)`~firC+Hk`2#1{Y*SvpjxW^U`PcIH8lL$>9N21kBxk;Knx>%Ak z#5kOVYI(>-et{>p)!))c6elnc+fX*4rtJ_i^cErc$;5Z8R!+4n4RhLTaTqPCDoVc% zX2{3#j}ay?n!h0)^(BFW5oBmj&X!h*H3tz>As=Kcn8dS@-0Qle{+%h$sXATSbKidk zn4=l{k<{xw-i>_y07em<%i$Qy;66-$iC?xLI^(7t3D0XmKMM3$!U~@|i|- zQ5u+*UkhflG@b$j=vKXg?Y1MnLM(J?;Bz|DT}F{-1@{xawVSmfC&?hskK2+}o6L}N zHk&37g}SlxTmy@{G~rcm!_I$>2WAEK-QL=?v*8750)M^LY<+l#2x7Rq-9gu{cIVWG zl9xEV5L)zNBZF?OSMx$fVY5*o>DxSWpXg^wQD5FKEH@!_XSnHG8}&oUMiK{sJ`hQN zCFb|dh1l*vE%=@7<^`XKz^)5k*SGdL(dBJczb@MA>d(ksY*tJ9j}Y`F#z}t{9n~_M z+R@2zYJa1;BGUcRaJ+OrDG%3{l3U(&yexZd!^|Fm;h>$K?U1)a-qFJYrMo*;GMb%` zO9{M|71n7(byC{|UcaIFQ}E==*Y<)t?WW-dQrd3&OGnk?u@>tYb%g^nbzUZqq`Wwi z$4?6H_9naw(`zLSdJ=iV65kGY*px?Pcjx-$WPc|n5%T|eIld#ilfPc{4-rY^38*h4p2H(G~1VdNJ)pUWBX3>0OHGcvx_3a7xNbLLagKG=hmsXYyJ?Sl- zm^#_zmh7s@K4L6n12ifd$^Di+FLs+{j}RlB<&Ah&Cu7tn5Q^bR82F#$^x6m)(PpnI zp*1G5UU2lp_4S&wVOF{5rp+8vP}AVLO$e)23HlJ>tu^ z+j}pw{Rs&I0o#)Y42S{klaLHB0co?r49x-oQ-7L?GGyk0dA8S7Epg)G~Vfd z51Dj)?6~!k>OEv*$+g#4LY5+ti}qUDe`Z|1og#U$KJyAYIyn}LTRJ5NbM30^jPVcF z81Hhjl$gq^-6p1TGF#$ugQ~p1AK)o?@=O&xM{F@$QAK+^QYu-#_pKz5gpTY_Ih@wKtJ0W?hJq3kLVQW!8%{> zZ8qK{ml7JmU@6QZ>epfwYmdsbsb*lJ+v|!(G_8wJh$19GAZ1TVfk}K>W(Iwfq*+oo z%{|%5^7%8f!Bzo~HjaGGlh1kbIZr<4$>&sr_2Upr=m^fK&pGuubK<11Le>-@+uTP zu}rER4vr4at6nUjYb6aP zI)myu8&rpbH#dKXa2cAov-?GE7ubmD!d9{}H#mFZ{k5w&lgZ<>Cu-heWg)PnxX~n( z!zCR~UY0T^b&IxW8icC&fc>Y>kVjh@?xz*V#gS~%>vkGr#mVrj4H1Fu6uUwzbvH@$ zji(JA+f_!G%wnGJm@&`WL_9C_-k<_5752P5NZW+7MFM{lT@V_v&5PkGJunlsq%o@B zxRr&kV0T|rd*Q4mn|o7$Nq04GJtDK0ljXX|?EOY&Z{Wf$qq4i8?5hpR-s<9*i^Sd& zz;=?s8q++}z|kPotPfN?};g?rf&_x1;O^_<$l+)ff=C3$bw4y9M#^v=Fy z86M`|S>5%PdcR`CCSpjuJj`c8dKQx$e}H%8XGNfJiD!s$I15FIt<5dz>xBhn`sW4u z`ySz%gC&vquU6{@Flk%cK;GzH*IRYa2Lx;Igqv(xwW|OkAz*H|b`wUF=*b+hPz1(iz zJB-697fhh@7Amz=x08IxVG?3sBRhtWm?pzFJ77dD4mKR@>1WaPmzxzp{WT5p&nTU%St-vQCTx+ zUW_Mn?^qqnAr(C)^-GfhWRk?J%+Sa^5+^EW+iaB?JTrvKW7v8t zXls+F`c@^I=lw8(Cd9Y)Cs~xc+}T3!pDlFN)=a(g+J2&+U<9qSspMow*{o80ZNnYY zhyWcd7Ir=z56vj?x-r^jA~7$cxmE>E2#d#K?8$`ZG4Z>)$Xm2*>0M!=TP^IWFI|7j zW=ysyrHR}s9gJ}p1jskt>?ui;`h|-B0Z(~6T@iIk3?l>>kG*T)$4In>jlRHGboOxl zF`Pniy7h9iF?waP7(YYY-71+iQMaYjH9LdRHR2nJA6xHi(R9CCSQBfzS0w?r5Oe99 zVQ3Vbf)N5973-Pz7e&8%zE)?vbhdxXC3e_WV~n*6X<$R0!{n#+>-N^Ow8WWQT0(74 zoe>u)>}lN|HFlHYMH?*ZKa`iyr8|=^eoGT0?E4V4I9ay16LL7X2l2W-3y9FHTgw;$ zg%e2G49f@KO5C`QXb?b-qSOYU!(>EUM;p+`jc=iGO)$Odq)$BM`tK3|JehxZ7ptgU ztfImYQ5pa%x>y zpt0Q;CPM~E2@qq;fsL$`(W|&9J5Bp(SPFI%FdGw-KG0zdusqX`i4!^gMX7?^FJ4dQ;+=D6#e(V{xt>|4l08@jgzJaEq`r2 zhSaFrVmV{n9jfa2v%#z8gtm4*(sOUqkN((pt~}~HejCh?kL3~@VFIK18{$!4aBA@p z8QR-5ZkQPA2kiiz)%xpzxS6G9(Alq~$(?w$xwc>T-~wItB`&aL+X#KV*eFU2AlzY7 z9+BOh>z9+Am_*3`=jHg0>`wlAu`ILW@6g>H{x{hUw{duPH;rz*>5Yye`eU3GOaW6f zk?Bhd{Ij{Duor6zQudR!A7_7fS#w=GFW(Y|vK&Crt<*t;II&!mqGd>HM)G#IAG=0I z&x&muxq+MZ4KWrQaFLLi!He4|&p5vn#=6k2|T9={}@U4swTLC!ECi+^bWSa?^D@I3uXA3{&9hbe-R?D#(-a}X(j41 zf_iZ^svBx6+r2?kUTv1=QtE<1Oc>&+S}cwG7zI7v)p7c;(}$ftyw3V?ku6&8(GT$M zElOSG*yQ(EWo~(?{_lTz#eb6j8?;>gNms3xRzj5#ILrc&EnZwRcz2>2+}axsW|$bi zcrFlG4`0lkY%JvmR+K+ZJUQ{?#M63-r!`e)Ue|<3`XKMh9{Bzt450YrZ8e!<18vej zRN3uvHZ<_W;*La-f(8R!l47Eb{!%f(#i~n*Cg}T2g$@9mszZN1Sp-0j)BYm9t+NH{ zzT3;z#$-~34eDIPAGwG4PtKsRp2FbOW=(t>#kJlcevTN5ZcuqS*+~PV1?zY<)`v2s zE>>|MQ#FoyC-pK(6U0>a}Xt!k|aQSZXT{saMtR+ zcl1_Gz#6qO&ryGXAVb|kQbS?wWijI1Sb+6sz}(a2{IuAvFK0)f@!rE3WWx0UE1W^OEe1u z$Wi90CLe!blSam0=%W`ewF<)P?R|auljSDC)>ow%>*)+eVmJ1-*86gc7!EG6cda7l z{Bi#FETVsOTy@wlqY|l?-v*yCIifL9&IAi;9U|yaB9DTTG$1kYm4ku`DOFMJ>u{hQ zB=mG@Z;Aa!;R-PvT;K_TYRP^Zs9;k~)785tMn0aHk&jW#JYxHllOyOvn_ud5)6Naynj|YxpslTk}cO_q}hh- zINEG`cN=iFb-R5kW4Ak(AmJo@1v!if5!T0$USo!$i6U<4a&j+lm=V_;H-5 zY90((WV6J}vZ@1_QrG&{u1;BEz#S<_wT0 zh&X@i4n5xx9^rP_^D`#Ppqu{De%j<`geOz3q3L`5L&G#xLPr1XIsC0`SWD$|4l3k!Gsu}X={-goWH-1zrl z`b!e>K52>tu4x0U5}{`mvD#op?RN80@H%Dr-Ktjz+Lpo7%Rrz@1E15G?yO@xY6)=XY^M420r)>tp3JdMmAIn}gxtBjUF-x;7tO$V~jI{DsVx zp4hF_8?}C<{Y*U&pHe3_66KL!d6<9L?Yl{98jY@z>Ls%Ps;*VOo}JyD7q4ILyxQ55 z#x-=4sg!d;h>g{532Wb*08j8JKyPWJK1!$bNDoX6u9%dXR6^;3Y^x{a*KYf?LZx+b zFDBYt_%_%$-Ok-sl)(Y)dNUY6J3MJHlWtWL#?;ROHn`4@$qBWtNcd$2I1i_-wR0aX4x!=hXr7Xh z_zQ$Fn@U}c$-x05IOhz_M2-GJZB|dDEd+D^Q$Nyw>gzCJ)nA<7i}QPNelKnPUJS`= zD6&elcUQ?$AyL6x7y94#uhM_!*~A0%?=Sh{cl?&?3ann$L|M;cg}OL!?eLXuWg*OJ ziask*R~3q|hhVxwBND3weBEJLHu42w0V)YC0JWI>NT}8lq&)&;))^W(kmEp3O}xLZ zQpH86y=M_>t1(@TTI{rEr#(Bt;slG+o*$6L^|~h8M;`nCPIweE-X(u7Vs$$|!nmDw zwqh%{IVf9mcSf77-CKpvh|_wE#*v45%sk};x)bP5pgV!?1iCYaJ9GFtfV0<|b-4=! zAUK*LFLSl-gv)YGG(a+4!Gysu~Z~m1s#eaV-;jAB!hnmAs15XEJxGEv-(A= zCa4bG8p}}3X6NPiz~IzYUG|Su^q(Ojcu)_hs?d^sHjrh2RiV=#g|EtEwSiehV(ZYB z3?Ci@AXMd3yrm3c5KQn5B9Ak5h-34P%{w+Uy2RpdF`t4+H84YjJBKpoQ0A23d!h_G)z)Dihk1Ss=Gm!B zekH|lfMEHM#}4F(s&%MF%z0C4yR?C&Q`(uNEW#YJLr?sd)#!{e2Z<=#8=Md`VZ~d- zx-yntvT9wLH|v$YTbI;Fe9(7@A5k*K<#?-Bt39n=vEqNTR1IpG$#M(fdfH+?ab$`_ zHtd6}XVne^PayDUI0tn6RBi#Ch*fO`G2AhpwAv93ac_+|stbLaFJj{heimUGVLm_b z{itAXxxoJ*i3Q)|$y5qY_)sM6;ayWmB&^hFoisu_U!@*e;6Ldsr;L}?&*x%bs z|ChncPd9%kLX6`XR09z;Te_InHTA6m8|DXV8>*lrCG(ErrIFf*_=;JpAh_@etU@E? zzEC%4d7pXNi@IzydIKv}qAM$twe1bhF(!O(*M_6XhN~IcW*2sr5V}CJr#;IY(*)gd zK;-WveKZS^ClIX<7$QE3Hm=A=@%3ctX(Lt^n8AO!45~Fk0CGCR-Uj%cAvJO4RX0o+ zN6_!j$MRlSmDNHh(VjkDO^mJG?al$V)^vC8)y2z`%S<8DZkt|D*=-7y2;ylM)A);$7R zQ}BPYn%iNvcf%IMJnMWH%r4lO?EObZIO{BBosj*}=^>qDb&}Od*3OdEB@cJW!&i=X zUN=Q2TRJeAMNBfgh-BSNJ&Qt-bvdeP9c;{`LRn^E5X=E&0xU_(pgZhXaL`g6QvDjU=Q$#>2*?xb`L=PBa6!;9l2$5fSW>3B%SLCy(l(ohX z7m#gpShgD9;vfK%7%>K5C^%+>AxB`0&=nC3(Fc^Ihi~2#Vj@1a;=27gFn928dlXQw z9oBNF$)ToY4jx@Zv~OMkysSWE+f9MYE|$9kd(m(Q zHs^$pUEf@E2mGS>5^QT^l@YkWGL?1A5NFxFZ++Pna9X+)%i=H$u+kga-iNh0j(3+{ z-KEzbbLrJZ3pm~0+^LHN#_;68_YcA_qBk8JwsO@i@7PKWw)|`dBsXuv-HLzLFDjnx z>ChWbN`ayq72q7v{djp5=ONK{#kjn-Ig3G)AO&iiY~Fx+YWLPCa8Ol_folJ>c3B7> zpP8tfgutC^I(yB}v)8oGJaC^8{)@VJU#xcN?*8LWzcwOpH{3R_*m3C9YWsY+WJB)g%}&*P&R4 zV%M75GJ17*(BVOc2OWPNba=2U9(-9BY*+x6WxO2PyEvrg&JqCZg!}q-SE%$=Xh3^S z&I!*mTVev;5~Jd14tN9!gPxdeaB|!W22A@av@HuII8i~+T>VFi+3tfa?;c<`2b>&m za=^&}r-ulfUe^UN&Sd}P9eEGCL^Ccm(GQHOJxNwR=7)H4Lb!i)6D=2dnYH^0eEB+> zbF>61)5Gc;oMp3B=T9m|B8IRKwrbNX&79OCXLS zreX~$L*NxrJ;7iDTpEdJ=vWg5<-s`^Aytc0fC!5t1m-kWkqh+zt_Zq=9uMZSH4rphS}0PS5GUaz=J`M zSYeApD9|q_L)4KsYkkyQ%^_)rq*r7GU1w^`XZWVDu_JZ!Cpg%y^PIlCm%Hp$#jSDy zBkZQOq)l~=mf>_#r;|FJ)aj%TP$%8mtP3>H@MH;x=JtQy%>A13d-hhYbXBfb2pjy9 z>-9iqw0Ek;JykUvKym=d0VD^I9wI>6ste$&iKG_2n4mm#@!6bC=nvqXpa4JvXPSD>U1MXJ#X`VwDM535QHl)EP&r zDoveWofCY6h!F%y*+@3PC&4!>Yr+VDaU6eS_nrKqXlV{^aS#APK|sj_MOOrdA%YQ@ zB6-ir@mR-W7v;w*?3JqAc;zBiGb$9a*F_c4)B`OwJAGx*H&<2nJaAcSy`|Ann&)C| zrHvAFUo@MCpH^(^#a^Q*{R4H&i*MFmLXgT6h^4g=MaBwskaV1OUg;T0rp^IpG$wyC z1?=0CQ>9_ts8X1ihYs?WhawI!0U?So_4~Q?%Q%cUKq2*}`4@=z=3^&%o#?eaW^j|{ zbiyAa$o3j?LTHAI$>hSDB0ml~Th$89ETfe)IK$$cUJ(J$RSP;ispw3V z&x(POCJgyQ9kW&Mjw^zRk3C8#EmBEhBpLxixoks>KsqT*BgCdO@Qt)c0lh^L^1)~h zC_z^Q22?bH`83zPo{`6D(^_Y0@B0O8mo~{^NrxpJmULLMBbMCWY?Hq;Tm*s0%DZP%vuE8La+RI%hYt5c?uT94HrCC!pGK)KADMbBwt zKXez&9G_fd>0Q7j*YC@(DHGglirJvH?>QaCjMvR{3x1eu=x4CT909B6lEv{_Gt4}l zCaeqNQGh*gjpo%H)ZnaR8UaGdbLfA0G&a;52A)XmgyG3hVL}EF_ntbg>$tAtx<7{N zzHEwQ@Bv2Gh$k0Yy5)Cc5&4jybAYcI?x!&jswWd1Dvf+8j)%m8);xskPfB_&|TsOxt6L zq{l}ck8|%;Q*Z$FRgV!2Iznfo0ejQt42EBn9r^3CtN}~zE&FQV-PMhEW#Y-m7MM9r z(h@+7$(Tke-w}W#8gp&vlp&s1%cLFKvuAtN>!mcMwZ&{0A>Z8I+u7R@&&5zEgMs`T zBM(*PVC@?1C5zv^zqPruEfaqf$q3?-SUoRC0Y-$IXU0i%bMx6L9HBss>Vm_FtMkF+ zM(Z2m=O5^mEN`lvp-8`!oWC49UB6I-6dr#csx2iZ9C*~?{7qG`z ztyXEl(pB1;#EKQzwheO?THX1p+z=fSj2Zhky_c8-t*_32m~5XGYqY$ftj1W{pH{Vu zJ=*26X2X*Qg4td-#XM2c=L|+1dpLxo>s5|&JDm_*7Y*F()DFt^qLCNIYK7@?q?)$Q zX0=>Fy)din5Z^i?zGi=&x1nH5)K{ws_XkdXl9v2XdGO24rVHn4Iq1DysV}r(!A3Jp zq4m-wx*%Pi4?KU4Z;+bpt~z?Do#l?p zzkGcreQGvTYoCa``f)39zHQM&R) z7a&en59TUU4Vk#?0uEg+c9O4K`xV~u4MnYHSXES7$6)`pVD3qx_5D}s7xH@rq)I_D zbQ!tD@-biE+=YL*5C&FM`>Z4MNvLSb$lQw)f;oo4S%CZr($C)9g~;Q`KZf&jbPFTD z@H`RQW}R~s2GB#knxcaVN@+>n6kAgze?xOQVI&TM?=3DQmXaoz~Tc1(97+n&?O4t1OZiKFM%+VHkM2RAtKJf-Lck1tkqojH4~Y> zwD{(mkLps;%NI=nGUV1iM$iv1=^D~1-^Q|b&ZK`KJNB7&+i25FN_FI#=Gbi6Wk#48 zxGK$^O(wukOXPFWN%rZuqT`AS&6UX-t1wR*udHV9j52-^k7k%LOo=oS4!6Dz2gjI& zF&AQA+A@x4O!#1bce}fNt-3|41IZ$d&gf8J^?OaBM{z5I*>pWVDbtZL>hajJMM+J?(S6<%)bTyX_pGkD z*KSDjjg8~yr(2SDu>4G;>->|C=(hY&Y~LD)1_w#RoBYyI<&UP2Oiz6yPcJ^N7D!_=# zub22c<@51MX!9n3AroIm`Ej;$ES|Px z>ZRG*<5I7%iu{M>60n)`rj^mMezp{?Dt4T*ihq6g=#s6!eAO8FNAX9)k;3rIT?XA$ zw%7*nm`+q_qD}>O!ku2uS89k{?J-OJ%vc7(ZzSD3c)_X+2xTGQWu+3MA`6ix-8Is4 z8Kr$bQp8oe;w-U4(M_+yi?3(DJ<;SjEMD>`dGl4c?rG1ZBN##t^La93`mv%tH55v* zpMQIm^8bo=>5yB3fgk2A*VfOhG*@Nk|Js>r(SCbxtGZ9JA|EtkrTq}MHT$XPA@xK# zi-J?Y+%fErL1?cV!+8m*ly2^2?DJV8ZE#qO3E$hT0bO6drj6QRu8fApQ`xjwN0gNt zY8zl>&}SabhS}pJ<5`NGlEd0Zikj5=Sby2&>fJuBRy*dt+-Y)#Ey~Bq<~yr7JP3l+ zYM_sjrTJ%Ge0q*NdV>TeD84y0?%*ZQ@;CF;(&-g#6!(SK** z?p(-8uC_rz>bGP5osE6RsIdQSa1L(|=N#$Z@~+{3$1uQre&GL=J(Z~xISe|~dk@(M zO!Ol$?3MUDWMSegnS}qaXTF&GqVc9TM#VNkOBY9wF53jZw18&LXml#@)k>uNN z>GI;Urpfg>eW;^ywZ{()bJO?vgMV0$vMb=LzTCNkJ9lvB4({B+ojW+wlsk7=19Y~% zFx=Idx{y?Ro1_gW%eAzmbwjqXVekA}=)G?{M`>)<7LNj59t^xVkQu!NP)d##0OWwt z83IVKL5ZVadRZ()5vKkXfyB?@ucY$x2nEt=k~EGfVJ_&EW3CIWC)qA5TYpb-?`%-& zQ5;2x@S^*xSi3T8VfyTZ_~=gIyH6p?pyN?MSr+f5hDVWw3{EroQ}uov(M7m zPS)^3Pm3#kJ6N@@GbX|d+zDW%sV=w0WDI7VIo71GPm)7CpS8={p*tePLI zqPcHjQzJLI))guy!Y;6rTz>&JMb!$ix*}*UH7lpnnlIhHZnA`|YnE25ea-xeestch zuXYv&S4z&fmb%lPHS$yLJ7(SgfIE-5vDzXVgTlpkAEWfx(cOP^h{fH1{P}EjcVVC< z9rLhOQtjt^OwR2Yc*&=|_^2H_naPh2(o{UeJ*xBzlFW*~}>Q`-l5#6ZDtvU!O_JrZnEZtNCFRT|_87i0Z%M)6kxBrz0Zx=TWQ+rjBEyct)Tvb# zxtakOA%KY&#Qx(2{OcA@*`a%vhsEV#ad}u=9+s**M=lSG%fs>$AoHuH7=IrTzopUj zNAa!`Vm2D60L)Lp6JH5_qufG&q-&II0J`Od+XLJ@^$nQTBq?Xw5D)Yr9#Lh~-_%Ef z&$2o3kPkR*g;1+7L3y~P4^~;k0>8?2G%%LE-jnxx-M?-M2&L!f4-~Pg`@U_KzHXyV zT`cQ>FvPhJr5mu_7P@%D&Zz02^Y+L_C`Pn+mn0PCHj3UHH~Jkk^+1k)!#=HjPSvni zHEPyMSuw6Hx0)lSt-a1?OzX*yUT-#qKRHLxS80?xv7)s4k`BiQI=wPqETq#e`|~n3 zM`3a1kWrA22bWx*hGH%%uziN7P3>-b~XO z*T1(sj!0>0t9mBnx76r=niIpTZ}YJ42EX2FilZSl`gvELFX~#tPRZ~+>~9=lUoiR; zaznjyxdALVz38YBygjQLa@PhqB8 z8c{wi&>$w3MtFh=3{rw-a4tRxf)Rl1im=%85M$#w2<9n&q3J{q!R-`#Q&~xTF%aNu z1R(HfJPOcr79!%ywRupz^q}#j_*7KH<1vZ^H$FN!7N33&=oq|%4BWsVMog}TE0Pss zctW56KtnK!xo##10OeB@sqciiN(;-qsp$R*qjBV+Uwyl!UIp#Mo195T-tHKu_xX>51}WxS<;J`tf!hK%h2^x$fg^4 zrLmvS-_;OS2`LReRK}F~msY`fBrEF=NPb`w(O9BJ%}ZyOOKPTkcpK4KE-wU?08$kE zL$DW(Z{I<7if5S16U29ry+!BSi z9xQ(nR(@cUb5DMpH+PsTM7ud0oJ&zwO~5V7REP`VCfk1lbT9%7DTlC&%%2&qx1=u2;;c*2xi zMo=jRZb{fLi8lh*r7Dk-w}au}I8F{0_cnji|EUEuh0#Rs<&TO*6zT@llW&EhP=0$V z!(MD{?+gcTW8!H>k}D+n*F;Xbr~YB;pBw%3MnAsM&p9v9DQ_i8)$$@937D4h9=9;u z!YC{Z<>SzD$ZccS#BC1hH6az5V9LzyClFzNY};f$c}mp!sA$@o*b%3$9k(#b=+%GM zja;>0E6B|jYQ@V_%K$%Baq@}|E6j3UxNSMhyVWS?+Ejm46%DPSm7(6y06J`&WTx8gf>f<(XXwvsA+5Vj z6_(b?;wsdl_Fi>LKWbagP^FfS?CO}YW5#_lV{IgAxr-k*6MtwYi`z|6hc6I}ys2O- zoeme%>K)D(<<%!R!W;4`f{ea21mP|iQ5wjY{cLhd>2(|~Jb6s1=I za1NPK5>R^0zzBNRAPxbiAP`JZg{(`{=BN`j6~Hb#t283lVVNx7LpW5IUPUE+kas&p z5lYT8lhdOsaz#FVx_q+_)Fat!zs5`Cm-9IojZ`Ne<3{x9mNXlOKguIE5DD%KfP<*$e`r6<0%DAC-L2PJwp zR(7;Fiy1eM7Rysod$K4;Jp}r8vmDo-FbL>v;>!PLcHAZ^OXjix%14oE^~jUDLIYPs zHcf$KU+&1#9a*{~OLt`1$BoUr2w$D2@8;I#Ru2JXc7IYllavR-0p`Ps^Bs5lnq2Nyx!JwU#x66c(1R7b%{#)KD|!1SWoF}HZi`$gVeb4OQqd` zL$a!tzt4A{b-bOX*yZZNq;Ze6qpFv0Wd(uho(1L|^{guk1u$QsPd%_SYRm8zC7KeQ zPDL$;T!Urhsj7n;N&SBYi8_xpfvO8m_p=4!kGn@vv)#*BsJ@^LGWtX=@hpqU@CHV~ zyqmPwRjopC>rNkC?4{ScO);m{Cwzx^Wt5T@f=D;93Mtez@=}hlzC}eEs&pIpeNm4|$4A0yJm zd8%!~#d)$L+{Jl%Ja(ZMO^FMN87r4S<7p!+w+fw7uZ>M8C9H2eZjQJWBF`uqW8$+k zG2O3W`a&LC<}rWyqfQCzpzY&;U8I^NMl-nmuZjoWQRc_#iCW&4) zrCq4b_T60?nGLPlLX>va-c*#Mvv&bin1pshDo2@VJWAhKT92+sYCgh&baEh6$GO1c zoE1qLkkT~yDnHK^`6$+88VVzy)@KIi(uR~~0J@#xz#xC|L>Z<;&l})Uxw%0(4#)w* z(kCdZoQPP}I0LsRLcpW55DM*LnEK!4X}E=zxrG2GfJVM@*NTuIdk8T6PZ|U=EqFze zNaab8Zs`YB9I@!eoEzoeq@2j~Q!tfIX`$c`k2Q>yLkf=vDJ){b&DOA*8aDVr7Ty0= zvW8U{%X)t{j}`L&8`iI!(X7HkrfmgBFoYiF^JJ>^V?}!&7v)~%KvLmdI%ENHl36`Q zlF?|}SNgb2xQ*GaJu2&Lk4nC6%kF-Novp2fs`Sm%>$8dH+V|QO(4zhJcAC1SwIb`4 zv15LS!OMOss$8MUTd3_CF77sGI_sjaylP4z^v8dPBOG~gAd~hAU>?j94Bky~X=u#Jh9)Jj`ae|S)A`%mhX9!?H#~6A@;C`rpy+{2XL;V@P*qP~hnnSC>(EH@H6ORod)<@-B*6$r0Y-$2M{&pec~vbf8IoLT{`v%% z-lAx+=&PWiKO0=l2rWX{R?=l!;C#p-@L+#-CsPTlWS;T{H)UgsbTC?g2#@B;UCXo~ z4o3k>n!6%dOOMiqXm5>Kt3!MJaMtan zTrZy?=AGj)>B@DyG>g2n4Ps3A-fn+Em~_|uG16=-EdnqlRCEo$w4u|g=&MXafVoN! z!$3?p4sr=uU=-mS#Ee)?7hK;G>XFH(abH7puv|YFhJH zO)l)vdW0P+12-kVR_5TfyS)+*FBdGy1xs?ll3cJP7cA-Lsb4#F0deQVI}*t35c=)a zFQf7T_3J5kqCRhlqz*elCX>gr7s!;$S(vz!jhCZW!P-KdTQYhekqVS>eY=}Y7fEX0x_j^nrJe}CYRlBk0cMKjG|0Rh@X;%Iox!8!d`PT|M0 zidUP^zC^LMKEcPfsuPVg&4HL8=p3JBYEC~{C1ubS8Yp_l_Y%Ou0++DJh9o%X#t&*OOY-F|JW{bNL6s&J}H%;RX~&Y3qgj2v^-vP)~J$o0Qqp2LfWW4$v_q|!%G53qI~#wFa^HawCVIn2ACu$SaN@*gr4<@=c*1rk7D|Ih%Y}Ks9rc&OH{@#+0UZFk#L9a zh@(wdHcHsY%^HOdFITaP!PCW!7dEozcxVM^LFs?TORQx?h&S`0L=4!mlZeIlLy5-+ zFIo|QQw*`$+Qhwc=k!39QJwAAc87FpzibA^+)-8W&E}t7g);wa?Mals3~cy`BgqJvr@)i&JT*Hi18gW{x=@jQ7CMX z7Gg|eK;{@ZSqaCvQH|rp)hnnYOmU+m94>!**eBeVY4}Kz@xjjKC;S7g{6tnTMvat< zKGcOWj7>OvhaR~a=dizlEKIrW>f9QV=GZoVMQ<6Kw&ehjo3xUiAw}e}BW~_6sWALB! zK9^0QjQ}|=F}5)jGecIUSESAj+g~~GM3CJ)=^q9Y3)%tlN?E4qvzL8+72IdzGUJgX zwSy7Qg-3LG3>{i;Cc3@v%upz>26j?`sKHP;zD=wIu<$*SKqE}i9E7)$-gSQmyfUTA zHq^bL;Q7f;`TZ~rlDbt23lt8#AZuC7(d(vx14+ye+x08F)+B)|yl(b?{*5fr7A%#Cu+*md%WmHBohiM-glgFN@iXjwwAZ%Dp4q>I}`MV=e#(vRncUAidT-p@7(6|V2>c(Y8R{Yigbk+)5}(pL={ zlsW3ntrCPU6VDArf}#^4){3yQGSwytZf;BE9a|v$FF%q{hHsB z;{0M$+un#;aMTzfMYl99jiJxiID{_jjoXd*$lPs4!C{C0S&h@BMd8gdynIfod@seL z%>L3+>^%dlvmEB9PlW-Z0bTxorSKSUme)Rw#8M9DaTJKZUqzwKyXD_NQ5;sQ;4efj zyuf318~#G%9OI8@nLoUaap0{2{)bEG<^WZDuK5nbqR{>62P`c$5~MN zz>_)-s*`CmB$lyD(=hXYa2b^P4OoRnURuq;cI2=aY-Fvm@9*(kMm`B+w}M|@>bW};*!^QV+={{g?!=3GcloT zLzaGzppT-3m@;X+npqGWv<8g^xeFLZ+IIpLQ#=S*h&-{O$~>c;)N)MY9x;vb@-5AC zWf2?P{s9vd4fY4)&8_X7-NA5hiM?wid;jD7?O8{Uk?{mK19%? zaz-z>Zu`r(f${6ra3KFWoO97=bpvNG5=*hq53QQ~jPPX22m6D~!Eo?i|Jd5x+T2P? zTnJoxPN|&TKKf1?{(u;R6LgL|ghS5yYhHgh++&M}rxyp4NrWblBhl)m+$2pOT`b8N zVjRvwwLIh^zrYjQ>ThWziW3-!Z77>i({>0MdW(?!Wa2wkE2mnPhB zGvs6W#|RS`&EF7@`jWuG2r{%MXG^QZnuCa`kPk8zOyb!{?sZ*K|IU=>RGlvExo>|1 z%+ZYfNb2<-??%3U0HX-b<#3E;a37|>#4lSAopIBSglD|D8}Wrbw78Ls1=^G~`Aj3a zC=E=@uLZMN8c%@%bgN#$cH0qOAr`tc@Hw67E~Ch^g8K>I+Ra*#lVp(R$8E`~O=ieB zn@y94LfzPTu7Sl}n((T(Vdp=`12YBtZg0M_v*8750)O?o+4}Gf5yWtJyMwM@?arwW zB`ZG;_ynaLTr{Kw#uk8hQ+D*d^q_o}kmyW8(V=dM*>Iw&D>by)INqKQ3 zkDnCY?M-+Wrq@au^d$0zCB7Z*uqlto?#}hg$&+3aV!>n{!a3gs{uWCv**<~Fi_s-JV z(jQ0tG!ptt?!tB|L8ncxx_ZQyZ@2e$v;7GP0s-2S2MmY-t&@-pFad6}!3@m;0bP@i z4_yJNv+WNn1_4f!85U4~b{p^XzlTgZK6c!CN%bDGvEBBlERbTs8z6*yszTzYw;Y^vKrfkp-qK}KK1wrR{rKA+ zs&{$Hu{h^VVM^1gt1_8BG%e(H<7L!S%(!Xq?W&2C+Nn-3_2sKsNUN@kxmc<7Mz8vc zE;_i^SBrrNAVM>*U&^Ts;$O>9g=<>{PmiI!l#$ zZD*&_O*LAoRGE%;s*Kh}ma2r505i_CtAGv=z@)PbpCTNAh*A!YPL5d*W~mwv4daEC zN$NK=AMC%_95%(>(SdSk9C;Oro>(T;4hKgE=T$G3(6y2Vt3+%~gqn=JikEWqt5a{1 zDSM12@9oBacq3xdq&X#);U`%mbu1+m6!*o;9}y;VHQ3e}m# zdtg7gu~%@R;(I&$xC&3)uWjvku>YbM39B-eS2^HUqH%3DnAr@|az`thAc37D58<1{ z&L$t7LF~U3$VNQ5q#Op~i6+e%RGmR}oeiqP!J8X@M7Ru1+}Zsiw+n22*7evEpQS)`p0{c8Xo0mAacG`o`0Sj_oQVOlC39cg&dQZ6cl*dT&qxmkN7c9;9u; z*&=~|i7p6@*yhD>l^&RhTGANRZ`{hlSFpRUsl9Mklg+&;z@)pHw;qw%%gJ(GWcGd| zvo~$Le2 z7#CpLQ}E>31*Z|5paXWj7!)U6^>_o@px!2bHhW4z26q{r5afew9AF&LS>ax`#J&B& zT|K9EFt?M0SV`WSwL|HZH@&kjS%!zXcUE`3rQWX?v56QGFAwvXkefVrz3t`g&nOnf`f!{{Bd{AHU4^9Z^m_8dQX>X`93^-mUo=L`IY%>kgO&_u#p`@NKBLAn;kHs zG_crfrGER`a#aJeHRx551vy8vkTbx4DTvg209EGjWIDht=2MAwR1CTF`N^@gHBcG# zN=#C3Te#+HtZYB;bluL4VCY_8xUz-p#{{f$jPP`8@6}c_Bb3ff<>cG zC590KjK|(J@M9!e!$x0VEINC*{uoZ7INf@=*%-YtS&W|{?rxRLnyA~->6)Fv=o;}2 z#gDCbwrINFEv$*P-K&y-TZp;z%`h|yPQeHPkBaro`-`GqJzuLcUOL-<Gf^M^S16&|xwnuA>d;>Lyo*)TE>=l-W@70GppMX-RvS&tG8_% z`Ndl`rewSQL?t`(U3E^aeL1zRE6~_(43i;)qy&hu<-kVP#;O2E)iEeD&VWY`x=u-fI?#qSUh6r?^rH>%m{kdm`ogAad^ey z6^B_v(Ef)m?d)u27~%r!Fgimrzt~U* z6NCJUh~8w*v5d;wDI&mwK_Gg}jT19Tf%dQ%L8j{V29SPuu1;t2Jl%S^TXPrt9b|79 z$1}*$TZE2a`|Vw7p;ikK)5$h;^aSaZDO1l%pG@`c5{DOmi2sJ>Pr(!QV^A&G{lULUu=$^h!>LF9 zYl{B+U;i2g3d`EUCf4!5-Jro&6M-lxo z&I+c0shP<1r3L=kTv6DIH3cazleQmcf7q+JuAP@}2}4;9Am~==AVQp2E=tidq%|XX zyW5XlBco@LQ4MbG z4F@w!j9)w#h^&V%=1w-2@&hZ%A19uicyi)ty~NX+sxz-^LL_~VcV!QJ{}2XHeDb!M zOtFDB=^v`>b~zgwcw%u!qDVo5fi6ig(MEr%7~o>nr9>0-eWpSO08Z5*f1fM@pvP%{ z5#QF?0(IZ*Wou(Hslo zyc+96nNk<4IFP9tN4=AJnWPEgDvlnU(U@>R#|iVFLM{W$cySaV!h<=8l1fPuAU!t^ zS134Zb>BOBt0rKLTAAl4e?X9-ZlS5lO|*e{c{o>lx1`+3vNudB$!>Pisvsg#KN9Gc zZq?B|ofrA!?ZXZVW#NRf2Ak8}GCAFPwOtcfr@UM{bAqgipQY@XG^|A3D-6qLSR2@h2y?A8RCkbziqC<4K>+6#q31GO$~ z^6e#>g#qL!^Hh_MKd?z7<1h5lidt2*$xkU^I zm)N^jk#qhye|r{De>$!@?3YoA)XQ&!&zKz1m?&q01+@+l^eB->!ATmBnE1*;L4}m6 zsP=U@&<+xMI<>dN{-bb(7!EG*gg~`qzYSEdsix`b-4i1pPt3^2DCY7rmf=^<=mpmw z{>!(4@#~e0`9#NubB-!!>wDX*jQKTW_*QiYU)IU{L9f{se+~(TKSSO>E1g`sKw!z1 zYcbMnLv|c(w!OOzINQ42K9#ZColB5&3F_z)WK_?w(;vk%(inlQ3ASM(U4!u@Fr;n8 z3?=+HPE<7yhAgsK;$>OYjV0w8u-I9K{OfJ#{rLGdxU43yzRqXWcyEJ&-y`U&HCmD3 z*%osK$P+}Ie|3kRZwQZYJM8%xlV#9N|7bsL@-xDdDc8{Sz5bzLnkpfq|MndIRyM4q z@;UMl4iyXOr+E`D^wZ+u>BYfh5}}Du*enrr0p#j%vJ>0tZ)tQb#Y`Y~wn`N!rtJ_i zlw4a7qy;Re+4QtJE|3>q_up_^oNf-T_6o#(u}`%Ne+^s|&>8n@Gl7MLyZ%_E#AWZh zc4lt;`!M|_33;D1#RAu~fmVsovx-=4Fr#+6c`10EvixqsGeWW$O#kc+0x4`qexFQBZ@xAr2@)^CA*0jyRaPSfFTN+)Pk1k{; zepUWLW=l`(R_cvfKhl1t9*9q=6B~*0$gez1f9&?%q&1C3*GTn}SpZenDqqje?#_$X zFLz$;>`CJqy2(_^xgf;GYPW>7?@fRwcod+wG*Ta>Q+lKarUq9`N=+)EbV0V&6Y^`f zeOjT?I=L4UZ7zHpY@BZAZY#>*0Cv3@44@sJG?+=ZstIH2X8{{r=f~uPT2~~zR}(Az ze?v%Va0t0KJ&W12Jr2%QuS3CKzUs513p^pn*UHvY@Z`%^8|UF%9}UjKX>0A=hl@jK zxI3DsWF-CqVa%pdS7UN;zzEJcLo-pMzfhai6KM;onQ|Jf4~#38K49}joWCNj=aAhxD^xbP*^nz`vV5p*W@b) zLx+qUGFl5{WG>CJo9D`bNEQ36;50SGESSxgZvrNi_j1<@<^mTC_BV%vProH&eG^6L z$5;6-2gAX8tnNm_kvG`i+TIb`P;S$A+WvYd?R+d1$yPy!qR3bUSqsTve?rKG)H=)2 zwDGKd(W(imL$}5<6tmfR`8_Z=wN;n>BNhE;hzK6k1F9;tWSV@>p$P zR*~2`v?arb2LT9G`4n#{gBS!8e1pj2OdaCbykql@%@^7Hc3n!Cl=YmWFn}KFfz20M zvUMg~lFt`<{ZV|rJXjk(e_tfFL8~sY_*=}UAW{v?5aG_D%sG@fW%!;b!%nqzn8#tB zAA@;z>XKhcF&rRRKIE|jIihMEsu6SEl-e$BVCj^0CMkMs?};wt5>Y}e=JplT4u7`Lb#r` z*iRgpB9RUIAnRGR!@v^=JQ~gc9Y2*@Kqq2VTR{wWj3=#jL_^$LV~*-V-{yjQ>}kD`q$@=<&}nR?oYl?7&Se=dV+jSzsG&ak%uerHHc zoO#s^6UGtr`}4897glAp5K6SCk5?08Yj?YIfUPy%-FtQM^5im8$h6z$)|Kn_HZKLh z>v&03_wxhpre-5rzyuPK5>S&Nd1OIasme{_0CCt00jb&|ESWOd2I zUGngis#*sdGpSIPSr`O!0GR+w(sC%+_fTRd zHk6Av#ZwwcU6CA;n#rI(Vh2$Y%t0)6*X{+e>2eo#ux=Y129757oORZugDeo zEGlKKF~kLA+Z>jy#F78DYo~7$bB=1Vi)zCF$XtH-(spkFB_Fe-6wY z{M#M{)N6;e9BOi?X_Do?eIH}=u?e$gRwl_DM!kzUH>C7s~ zSr0~Rf1B85OIfp91U1Xkvj&mOoG5mp*ok5%ik&ESW^ZTqUK%rPHANx2K!I3_oxqZ+ zYw5)(t=;2*LcX`#-J?-;`2!pp)3I4ty){vZOCtmUW*pFQ#q}i`0ZhCg78?OzBHf;) zC-f+w-nH|2T(Qq%qdiYAPOHh<+TPgd>hJ6ve=i>eIChSg4ktUD>>MvE5ZQK9AhV0* z?!aC&+=0zGA!OG#7u^BBXubs78d+roF0f2x9W%sPcJEtXb_JZ4F2%Aq3Nj{Vu3L{Iq?01FpTI;2Zya(b;~=pQiCl&+X2bV+io0tc+w`s@Fa~9DW0OCeygqu zC+~#TE!xtgfEkK5i=Nc!+y1*65f0c-;yCdjUos2~J=eJYDr%2snRy$vil59L( zg#k9Dao~dy0+@Iaf(-eporilxxl!j{XKHuu(G}{9>hi_!b)MrF_lnxRH3}S5m1CgV zKdoIBg2!hjDkmXu=bFx5^YiRA?K2PDXN3QvE*_Y|mPe3ysI2o?0(@0_#rS>+e=M)) z>l4bSBd$X7jVNBz;>my30mCawx5Abo`(-N9Z5dmZd`u-C!fuCRBnE_9>< zV`mEEbj7{8`m(^c{A_m_w5zG=6YgdME#loqtea4xp(GO{6`)mny+?^_RsvgBh;lUv z2F!IR)}h$7rnZb;9UgRe(BVOce+L~N?1~3p)&(0DfMppkhxRTGskyTR06XEnzTFin zeH9weUXyde^URi*K)1xGIGO_&ma=_^!0;gAXL5wrme|bmV!!FT`OHK3xqiRo*m5=!$o}3Uaf89jOgNXDtDGO=N{^v>1O z$|>+*5F}RE;t&e-%gGRRU)KeiXLz!NLvwp?f98Ho`8|6pSGp?K zD})XH$@O}mGuk^<b|CV;%yHRXy^a>(`yLSDKCIia-P&1zor2>O z9H-zo1*azkXS*)uf4TtB5rVv%H@B)P_u+8naL* zbw-lipB|IULi=cSni5a`lO`Mx8pkaR0>mx#l=QM)cK=Q(4h3yPIl9Q3g*r(>p+HOm z>Rkgrj$}~H1oEqwm|%`!07ftn`iE7_3^l%zqB4ODgc0`oe^x5)1KcSq7p2`{7ePHm zmG+^%OH8e6B;!V{Be$(r_A$0Lw>Gy{68yp`BK<2OYcr<~<~x}0V7`O-4-w|?)CKZq zc=8VMgByqgI113ALU5fhe?>cO&NO&F70^@gBoFzUk$Xkw4at{sdO}-NUp>wR>6dCq zOj0pPvpS9Be?b8q8*u*@mY{0Dr;sPk`?r`+{RrL?KqJ6HMED~$zjK#B${NfRkk*>Q zuytjjyA2Wk-ywdcQmA$1oVxmQ4D-v^XQH{w?9|bMZR(zzQ`Hrk?ZPv&5n8dzgsg-^ zCMoKSBUP2APO#1izCpwYf~0ID8{m`Ro0Tco&2uzW@=j3>-n+K3`!g*r$&PCKvkj3iU% zfHN8sf0+XI?a8UqFm6;SOw2Z}B7W#3^GqYk}ZPgc(EE^50Nb~Aaj;^abc-asveVItBeZREo(?klt)yozfqfboB<`3xl;!fs~^r1@Hp0 zicfz717+3GL2bqno#oOYsWS@bc_`#8_eOx=8N5d7GQt#+2?CT1O*EWgaZay@faj_O z9iCKlrpjlt4^uW3_3mGqv~q0=7$=0#tgj!s3ucZ_F0%A4;F9b2<=2!6?lr}1P}}#Mj$+2^X1WDG%r*2gSYwWW)pN<> zc&!;`o=y|ih4CoB9=JyHY7S~})-jC$q2xLAe>@r+>J0-=q;|saWT-G91BiQ19oKbS z*Kyq+!*yRaMKbsRqie*I3&EZEZLW#sIBl+}g?u(wx`D&y%C+aO#qn8i);wj(W*vu; zb-rODcE2_Sw9#i*IcXCe+H+x9`;2?Gk(- ze`%)eu|(42qmIY9_o^v4fcmP(2nHRYv(bRPX>$g{FUpSm^;y<{CHIznHSq50#=A1{ zWMm7>oF-`rAjV`&BbDz6z!8nPHgw7m&#Pt9j_ujAz3TN+n$p^0HjI#OZtv~v?TF`M zD3rlK{*94`Ds!-QjrNko@7~|q+}V~1e~M%TaY?M6m!kk9!p$?|B)Ylz>=cerphk7U zVZ_z>U~;4N4e|32^h%aD)y`0)UrNqjj-9SwC_)O4zYo=x5|eU)JWivE?oT1(zlXl~ zwgoZ*$fo9_@A8Ii2)WqXXF0jD@vP+qR`c7nsFuuk>)1J^>1o?S_LXdIsp&7?f3_2I z6}Jo6W2{!Iv|#BfZB1gu3T)ekxeBfB{8es<4hhDL{hQuPOoG-|XFyE0Pm48L-cVL! zEbULLTE-sja#^$C$pgV`ubX0?DCu(sBaS^BLeljrN4cF&2(F6;Zgy%1<$BS`3uCpy zbU9K@TW7OcuAp9+Rd$GP9T8u%f6m)buqEoN)r9*4CqGF`eyBY7H3eOeF3$%Zf5$gS&30EE zz0}Tf$K_wXK9fE*8>+QWL|*+kA!E82HI_(e^fIsOr-SZZH3v4JvP`gvDm9#B`jvD% zhx#a8`JxLDC#wf@m8phITy_D6E*Cq=*RA~uZ~2CzRx_+BDy?I%|5`BjB+>f*EAlAzw|=!33qWByWnXsgl2;xtuT(2f_Ci7ZUQK*_;&{@tRKS zYQqBNKSXO}TK)`On<#v-4$a^;(PImXs%>`_E2e7`#&Wa+Yw3Qre=VMF_;$EHzxun? zP8g95sZ|VMc~_l>bqna_c2npQg>Zs^DzcYAm`NK;CYTywKE^2UHx4m>EB>%Vl}YzK z8X}9svIdMPEor0xkPJ&s4a7u70SE$(9W^s%U5LM7W!|{&CSNU zYUAb6TJzT;p}G4*G?FJhbPS;4o4>H+SY2u89wcCdWWW|bg0}?F2(Smt@_ zF8rE_OkY}j^UX(fDd^>HQ-BP)wT}_>15CPxw92=!terDyf5?t~rrkE$G?P*txu!Wb zTXvZdW(KZGb7zwY@Y53cTy&CsIrqCmjExm8SEYQ%EK#?+JN^ zP;}xC_6J+r$2-4K`uW{IcmMqMpMT$=_y5DgcY6mc`u)ESz0Y^=58qyFzh`ggyUV-i z!|Ba$|HH?F;Xuao6brjHKg4HDe0qCEFL;`$PP-9Ek1^@A8&3J|8LKs$FrG*rDjASK-Civ)`U*@*EZ~d6c~QDqQ!p=h6`jp@;cAnKAuX(ViL# zrP$BCO8I}qyL8Ac!N3pmmTT*0R+_7_^MCEkwP?S+w^iLIS&SF0U!U+y$H!xrV^Wb>WX93BKg zYBkVD$;oqHkr;MMgG#P`mCYhQpcXBc2yQKBa+9!Zn5yCw-`|luu(O9(Ta5v?1-%F$!@aBrax;pM6rcbfqbR3edV-R^YWC^>k;&>^F$mYFMtZ^<>+ba9h(i&$|F|I zk5$p!x3H;^n_TM(6%%0>*h#Jco1$ukSX~h`mztH+Y0Z~zUpHAo)-_8j*1l$bML#-k z*H=3WgDWLxTua?)&l>qDfA<};?tj3Y$J|(Lk&Qv&;=7MgdhF=#KRU$X?mzx~HoCho z(2|aM*h8ecLQ8EJDjeYr(`Zv;ogYzZkwT+_mTK;*K2s-NS{`c~vwM*`Z;HHY2Jjfb zeBe5OD?`^kR;{nNOjhQt_S!kC{cI6HY5C%kez7%LjIC+<`R1hUzxY0VDLyK0NVg3${aGr0Y{NxM`7yJ zDvMmr0E`g8#0z5o@dEyJ3#aVRz01Sm^02r(EG`dA)tw`khsEV#`3aEuRa1<=kBHyW z==!60*9kEj4O9T;r{IaN1iw*kA%D^}$~FMqa>MNbZl3xEOly*qGi`_m`Vfz(GU{*Y zBf)3coOs9woVG%!RhXbW+|mcDEMkFQ!bMyy_Sk-;sHcMZ( zQKv4JbwC*6+=tQ)*lr75ykTe5bkKQwWFr(KTD(gV3UeDpZ;l)N4w`x($A4j;);_0d z*sB^fYo)9h*Opt&5!2RQ=QF1D@C445f7#TQduMZ!kYwgkhJhpMqaJUj z>5S{&TOLQGG__Sd6Y^VXbbrl>;nlZ!*mr|pZ#BiykQ)8GE6*2oEn%l*_#XB*j<7En z{Rz3D-nrZW7Mxym)F+$Qgj?}=*>@!WVOf@Q#2B2QA%Kj#>Uontws=O=WTMSPEA?Jn_tfL4YD~3khd{Q-BDIBb_S`-9e8BbKTY7 zF=8?viZKv$hrF00UrqZQeE9w1QaOsL7Aok%44}Vb7>Lf&G*n`(9ASUsihRa=s*a~H z(=ClCpB88k6H6mJ!2|{=K{GfPp9H}OKz2n~?0JZ>aU2Bmlz-54qKDviioL0f-D&p}NMS>e2og9l#KL>OS-a!U#U=SlFSHl&_ ziZMJPPynDI7{y#S69js0LR_VV<=#|u|Af&v^3bn7VjL4`G#y?MLWzflssbAV z#J!EDPKjGFaDQn;dz!;9*2*g7cfKvLWdy5042c~I0Yky~xhgXfi^9`wXh1BOZra)g zIFT%AOrsg{!DtR3NbMXD2sq(^Cu$=kh+Qu2IN;b5Z=Z+I6WlE6MNHOH&5~v4`YB}7 zjl9y>&*$%I2&;sY1|KS8%KS^K;5?F*^#>$Bu!(3a(SPQpv&$tlQ$D z3jQJ3i^jL_AUnk~%;gE~9SRXPOz5vpNh1m8XuQ zQRt(|O|*k|J<8B6pU&Cj#ohH?`1hD>-;TY1_GUNR(;2OFa2> zgQ7Q#HpLMn!;$J_wq-@B7X{X1M11QLQyEcJ(XcEwzhYMgSRp9 zG$Y9slKg8TC*4#3F!j%ketM%H-{|L@7wD9?5~XT+5sw5+OL>o57;a${7KZY1XgTDz zv1{Ts2lbkeicBzNX7>|_Fh90!GM_vpYJF5R?M>{6Q`e4L7-jV8>qf3xuodKH3$^0q zsefgFpQ<={MTZq;IWOF{oaNo>8`}?ZV@u(U9f>xRqS<+y4=LGuThpPz;5$^+g2HBQ zOv%xtt~iYEgTy zI;9`At!JoG%SU!~%-AvGKAEvL61CjL51WZUw3Ef{rl`Xg2u9viu$4}Si)r-^=Zo^{ z6CB|Uc@;rMUmAjN7mO$kWXygxIi>VE4i}z0rd0HI_-GEyyw4;kY&eI^C;JrD=22iJA&vmz`A_k?XKbmhT}Ps!Ok;l0L}0ouUXO=b6dr(G|HO zA3t5b*$48(vhrZ4a2}}+vdZU?R|JCe6Qse4%Pl^a&(o3{9}4G##=+ASIXXE8d1M48eP-&&Mt?#Y7^y&Ee#TAamrWU2^fqzj|1&#o6O|=%*#PCENVR(8NnN3VD!wpsN z790HXOXySHikPC4HY>CtIwibT*q9U*bV(T=}Ka?!X~gRmLWh_)*&;}WOBA0lU#bkH`qhQ`m+Uu%Tp}2LY zk1qDo>)oc9)9MqxL%cFdNee-wn^=Vu>Kb_|M_At?C>w7p`IAs%UVTel`DL)BMQO-3 zz`3qV;vfK+WZwN+Xvt=sgfD0?SGs}r0~a6WLsX&d!vshCeLEb-qHsRtt*%9vI zJUt$}(2J(T1;vb&OQ7+zk(FD8PN~<%CX^D^Hy$@f+zOFr6pb>5PKousTosh~=W*U#uHVWc$W@YK%8V&kC9|F+V+(`E)#BJ zwrh{dI@_a?Z`-oFA7W=~YoRKA^Yr>`;<@&{b_KL(zrCHNZfUK^dS&dGA7b#bpNcA1 zsPYzSyM~Lq&6&=+C@e3VQV9L=;Rr`w9LS`-0+5fQ(PJvw2v5FYGR=t($H-~ z;OJ7F_93I2$GaeYbQ9HSdS#-b-`(j;p9%2xvYLR&s^U%Zb*th{Z(I?nJ7A>%$(sit zLTa2~q_2p?gyR_kSkN(s9ul}8Dq!zXzsI<;4kOxQ#L_aUxC&4%VS@qR;@}T?ZAK%P zw>bEKiGTU?Fpdb%ex6eA+I($voIN~83`IBS7_(6vC2^iwqMxkmwsNCLRfqb?C_7Zu z)7PP9dDc2Kl6=j_E%aVDB>_n=!cl+`;o?!;F@IiFOG}0%mzuvm0j9SoS}gi1Xz0%d zS2IG3P_~tHnHD%7atJ(_-N{tKDw(Ie!A;rNB7Yr>79hf-d2-h>ZHU8BfRg5}NY>J$ zv>`bG+rkJ_+;(N7OGOEbufMsX55JatcV~06DG5!&5zf&BGak*)Db)*e3D#R^tVLRy zB0sj|vxN?u^3vpc=%8HGj&YGN8K9N)bNu6I9h$xi-xgF;J8JTKI!e-rt z(SMrqq^+hzGUO$|5yD8VpXNY;{cucx- z9WTuyFKvSu6TY|GUl1nUb$^UB8%v7-ObHcT!!K>?BRNOIRK&6r2Y82gBL2!Hq}bW3ZAIX z+o)3+?N#ekSA(lTE2Sz=VS_2$>{>!q2Jkq|lbQE;A3;A!BdLSY4io#8N-G&5$bTs5 z&%ERi*_!39(+w2oHhpYi|HWmiGl-=ys#b!&kSx7M{XZ^EgII_C+`JK9Y)5LIO zd(|wb1G7n}vtT!>W5HTj!fcpeF<$x-`9pbyCrytlI1VMhaDZ-5BzEF8fVXfC#u1$X z%$?WW&oC2zjDxZltbS;)=~Oid{(pb=j%>GWUHL15pUx?qAaR!V_AP0f)1pZb)NTsg zBoDO2%7V4{igFy^qW^xtAtg}@C5mR6#R3AfiNw)JoQ<>kFPy`VWF4>8p?!g3ZF_>R zZ8awvd71+;!O%HA&D@+mvdYR}Ei`cObZwD!XhQ+pcfx&3_#ufgw1xtAVSjH*yjoLY z>m~3MB{yJYjnw$t`s+=0z3uP;H<^j%2q?*g278_u`nH!ba}=|vIFAy* zhXpBNku^zh&`loHdY0s$yKqUxvjkn5FkQud{}IJ=9Dn)93g=D{0T;su&*3vMhl5j) zj_Gfyk7SP?*HP@U8G zkeAHjXz9*aG&PJIbKSB_-%?TPf5ymRC7&>)P#kVO@$5Nc(Ccq!ymGY~4WNR_$1vtL zt8V?_g&(42$mUIP9BW1L3!K z!vXy7be-VZaoQBX6{1Sos6EL*7AnI_3XR65)2~xB#@NJD(H&pl9@y zq^zFVx)JtVs++OdM8|%&?ap#4N>=_@t+aXKN{S3ayVk2c`7~EKqA97kPb5wvWla z8p$z|)jh96`%W-^9%&yz1H`<;Pct-JDj9uK>d4Nn3rNA4AM>B&knGx7x=VX^7%tW%VXKFN@GN zJua6pYg1hOp$`1R+6r?DhZ+N2ihl75Y3q)K$C4y}Mkb#gDB)?c30tgg1@auFuXx=y zY=20EZzPwugm4@8@F$B3Vi9}yD8beoLxTu`p*BzuFP@!>TPn*+%P*@WrA_#-2cN(Q z4*2Z!04z!5>Jsx3fNh!wAc=0h66N|GY2R|MV7i~eCTv0xk^@04YlKYQKRcfox+Df1smX$NDTbC2lC7`n9H zO>}eDS)fp04dSE%QA40`e49iGVBvctfkBv}I|y&2z3T|P@=BF$sJlZU@{>{d-G4Am zlDbh!3ls=m(6ub*=tc9uXkU`^!*=}=uQXZU60e%$pI`BM0zvccD)thu9#y|G+}o5Z z#e$VG5mwq%f7s0@zB8kjcrJbK-P`cw9(g`AY^LXB_$u$MsZWL$!S-TwbUfb|{=4I2 z$Hnn&$ln86friTf$DWP+bosuuBY&&UL?`(IPb{Yre5i-1|7;A^?&A33Br?! z=Y}Ff(H9}slCZWi)gcM5m7y9ti#C2{yHy9iT&}kRztMAAchMA|!pfqm4IyCauY7T$4BZuW+BWs0ye}~sH@|Q4nD){5A-g__qBXaa{V?H>H zD(yadT3p=SM+s93D?TFS%r^E|qseXAn~1Xs8=08lkf3=Xi+pGyaS$5RRYw744o#k8 zQ=1)^Ez0U9cW=XqP=Mh?n7|;z8M;pkxVI&P?)kYz8;64R-p@WO(v%hSetS%hWWWCn P00960%dsUnkc9;R00ZK= diff --git a/build/openrpc/gateway.json.gz b/build/openrpc/gateway.json.gz index e01a54b8e46cd858bf0b93686368e5adfa75ca23..583f188390e8d332771655a1083519bf234fe090 100644 GIT binary patch delta 3816 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 delta 3815 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 diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index 0b753c4361704cf393c1cbd2c82bdef30fc22768..963c86454542e43c1d5091da7c4ff8be747c277e 100644 GIT binary patch literal 15221 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 literal 14932 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 diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index ed6e2ec1403839b0f3b6077bc5f1b3870916250e..c15d91e4418ea352f2d3a843d9500d791a971d7e 100644 GIT binary patch delta 3679 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 diff --git a/cmd/lotus-miner/sectors.go b/cmd/lotus-miner/sectors.go index 84f48b3cc..84c2d8e95 100644 --- a/cmd/lotus-miner/sectors.go +++ b/cmd/lotus-miner/sectors.go @@ -18,7 +18,6 @@ import ( "golang.org/x/xerrors" "github.com/filecoin-project/go-bitfield" - rlepluslazy "github.com/filecoin-project/go-bitfield/rle" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-state-types/builtin" @@ -33,6 +32,7 @@ import ( "github.com/filecoin-project/lotus/chain/actors/policy" "github.com/filecoin-project/lotus/chain/types" lcli "github.com/filecoin-project/lotus/cli" + "github.com/filecoin-project/lotus/lib/strle" "github.com/filecoin-project/lotus/lib/tablewriter" sealing "github.com/filecoin-project/lotus/storage/pipeline" ) @@ -2231,12 +2231,12 @@ var sectorsNumbersInfoCmd = &cli.Command{ return err } - alloc, err := bitfieldToHumanRanges(am.Allocated) + alloc, err := strle.BitfieldToHumanRanges(am.Allocated) if err != nil { return err } - reserved, err := bitfieldToHumanRanges(am.Reserved) + reserved, err := strle.BitfieldToHumanRanges(am.Reserved) if err != nil { return err } @@ -2268,7 +2268,7 @@ var sectorsNumbersReservationsCmd = &cli.Command{ var out []string for name, field := range rs { - hr, err := bitfieldToHumanRanges(field) + hr, err := strle.BitfieldToHumanRanges(field) if err != nil { return err } @@ -2314,7 +2314,7 @@ var sectorsNumbersReserveCmd = &cli.Command{ return xerrors.Errorf("expected 2 arguments: [reservation name] [reserved ranges]") } - bf, err := humanRangesToBitField(cctx.Args().Get(1)) + bf, err := strle.HumanRangesToBitField(cctx.Args().Get(1)) if err != nil { return xerrors.Errorf("parsing ranges: %w", err) } @@ -2342,90 +2342,3 @@ var sectorsNumbersFreeCmd = &cli.Command{ return api.SectorNumFree(ctx, cctx.Args().First()) }, } - -func humanRangesToBitField(h string) (bitfield.BitField, error) { - var runs []rlepluslazy.Run - var last uint64 - - strRanges := strings.Split(h, ",") - for i, strRange := range strRanges { - lr := strings.Split(strRange, "-") - - var start, end uint64 - var err error - - switch len(lr) { - case 1: // one number - start, err = strconv.ParseUint(lr[0], 10, 64) - if err != nil { - return bitfield.BitField{}, xerrors.Errorf("parsing left side of run %d: %w", i, err) - } - - end = start - case 2: // x-y - start, err = strconv.ParseUint(lr[0], 10, 64) - if err != nil { - return bitfield.BitField{}, xerrors.Errorf("parsing left side of run %d: %w", i, err) - } - end, err = strconv.ParseUint(lr[1], 10, 64) - if err != nil { - return bitfield.BitField{}, xerrors.Errorf("parsing right side of run %d: %w", i, err) - } - } - - if start < last { - return bitfield.BitField{}, xerrors.Errorf("run %d start(%d) was less than last run end(%d)", i, start, last) - } - - if start == last && last > 0 { - return bitfield.BitField{}, xerrors.Errorf("run %d start(%d) was equal to last run end(%d)", i, start, last) - } - - if start > end { - return bitfield.BitField{}, xerrors.Errorf("run start(%d) can't be greater than run end(%d) (run %d)", start, end, i) - } - - if start > last { - runs = append(runs, rlepluslazy.Run{Val: false, Len: start - last}) - } - - runs = append(runs, rlepluslazy.Run{Val: true, Len: end - start + 1}) - last = end + 1 - } - - return bitfield.NewFromIter(&rlepluslazy.RunSliceIterator{Runs: runs}) -} - -func bitfieldToHumanRanges(bf bitfield.BitField) (string, error) { - bj, err := bf.MarshalJSON() - if err != nil { - return "", err - } - - var bints []int64 - if err := json.Unmarshal(bj, &bints); err != nil { - return "", err - } - - var at int64 - var out string - - for i, bi := range bints { - at += bi - - if i%2 == 0 { - if i > 0 { - out += "," - } - out += fmt.Sprint(at) - continue - } - - if bi > 1 { - out += "-" - out += fmt.Sprint(at - 1) - } - } - - return out, err -} diff --git a/documentation/en/api-v0-methods-miner.md b/documentation/en/api-v0-methods-miner.md index 9515771a9..379fa22dd 100644 --- a/documentation/en/api-v0-methods-miner.md +++ b/documentation/en/api-v0-methods-miner.md @@ -143,6 +143,7 @@ * [SectorNumFree](#SectorNumFree) * [SectorNumReservations](#SectorNumReservations) * [SectorNumReserve](#SectorNumReserve) + * [SectorNumReserveCount](#SectorNumReserveCount) * [SectorPreCommitFlush](#SectorPreCommitFlush) * [SectorPreCommitPending](#SectorPreCommitPending) * [SectorRemove](#SectorRemove) @@ -2961,11 +2962,16 @@ Response: 5, 1 ], + "InUse": [ + 5, + 1 + ], "Next": 9 } ``` ### SectorNumFree +SectorNumFree drops a sector reservation Perms: admin @@ -2980,6 +2986,7 @@ Inputs: Response: `{}` ### SectorNumReservations +SectorNumReservations returns a list of sector number reservations Perms: read @@ -2999,6 +3006,9 @@ Response: ``` ### SectorNumReserve +SectorNumReserve creates a new sector number reservation. Will fail if any other reservation has colliding +numbers or name. Set force to true to override safety checks. +Valid characters for name: a-z, A-Z, 0-9, _, - Perms: admin @@ -3017,6 +3027,30 @@ Inputs: Response: `{}` +### SectorNumReserveCount +SectorNumReserveCount creates a new sector number reservation for `count` sector numbers. +by default lotus will allocate lowest-available sector numbers to the reservation. +For restrictions on `name` see SectorNumReserve + + +Perms: admin + +Inputs: +```json +[ + "string value", + 42 +] +``` + +Response: +```json +[ + 5, + 1 +] +``` + ### SectorPreCommitFlush SectorPreCommitFlush immediately sends a PreCommit message with sectors batched for PreCommit. Returns null if message wasn't sent diff --git a/itests/sector_numassign_test.go b/itests/sector_numassign_test.go index 85f8c657e..af667aa92 100644 --- a/itests/sector_numassign_test.go +++ b/itests/sector_numassign_test.go @@ -12,6 +12,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/lotus/itests/kit" + "github.com/filecoin-project/lotus/lib/strle" ) func TestAssignBasic(t *testing.T) { @@ -128,3 +129,49 @@ func TestAssignReservation(t *testing.T) { require.Equal(t, abi.SectorNumber(11), sl[1]) require.Equal(t, abi.SectorNumber(12), sl[2]) } + +func TestReserveCount(t *testing.T) { + kit.QuietMiningLogs() + + ctx := context.Background() + + _, miner, _ := kit.EnsembleMinimal(t, kit.ThroughRPC(), kit.MockProofs()) + + // with no reservations higher + r1, err := miner.SectorNumReserveCount(ctx, "r1", 2) + require.NoError(t, err) + requireBitField(t, "3-4", r1) + + // reserve some higher numbers + err = miner.SectorNumReserve(ctx, "test-reservation", rangeBitField(10, 15), false) + require.NoError(t, err) + + // reserve a few below an existing reservation + r2, err := miner.SectorNumReserveCount(ctx, "r2", 2) + require.NoError(t, err) + requireBitField(t, "5-6", r2) + + // reserve a few through an existing reservation + r3, err := miner.SectorNumReserveCount(ctx, "r3", 6) + require.NoError(t, err) + requireBitField(t, "7-9,16-18", r3) + + // do one more + r4, err := miner.SectorNumReserveCount(ctx, "r4", 4) + require.NoError(t, err) + requireBitField(t, "19-22", r4) + + resvs, err := miner.SectorNumReservations(ctx) + require.NoError(t, err) + + requireBitField(t, "3-4", resvs["r1"]) + requireBitField(t, "5-6", resvs["r2"]) + requireBitField(t, "7-9,16-18", resvs["r3"]) + requireBitField(t, "19-22", resvs["r4"]) +} + +func requireBitField(t *testing.T, expect string, bf bitfield.BitField) { + s, err := strle.BitfieldToHumanRanges(bf) + require.NoError(t, err) + require.Equal(t, expect, s) +} diff --git a/lib/strle/human.go b/lib/strle/human.go new file mode 100644 index 000000000..f381f83fc --- /dev/null +++ b/lib/strle/human.go @@ -0,0 +1,100 @@ +package strle + +import ( + "encoding/json" + "fmt" + "strconv" + "strings" + + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-bitfield" + rlepluslazy "github.com/filecoin-project/go-bitfield/rle" +) + +func HumanRangesToBitField(h string) (bitfield.BitField, error) { + var runs []rlepluslazy.Run + var last uint64 + + strRanges := strings.Split(h, ",") + for i, strRange := range strRanges { + lr := strings.Split(strRange, "-") + + var start, end uint64 + var err error + + switch len(lr) { + case 1: // one number + start, err = strconv.ParseUint(lr[0], 10, 64) + if err != nil { + return bitfield.BitField{}, xerrors.Errorf("parsing left side of run %d: %w", i, err) + } + + end = start + case 2: // x-y + start, err = strconv.ParseUint(lr[0], 10, 64) + if err != nil { + return bitfield.BitField{}, xerrors.Errorf("parsing left side of run %d: %w", i, err) + } + end, err = strconv.ParseUint(lr[1], 10, 64) + if err != nil { + return bitfield.BitField{}, xerrors.Errorf("parsing right side of run %d: %w", i, err) + } + } + + if start < last { + return bitfield.BitField{}, xerrors.Errorf("run %d start(%d) was less than last run end(%d)", i, start, last) + } + + if start == last && last > 0 { + return bitfield.BitField{}, xerrors.Errorf("run %d start(%d) was equal to last run end(%d)", i, start, last) + } + + if start > end { + return bitfield.BitField{}, xerrors.Errorf("run start(%d) can't be greater than run end(%d) (run %d)", start, end, i) + } + + if start > last { + runs = append(runs, rlepluslazy.Run{Val: false, Len: start - last}) + } + + runs = append(runs, rlepluslazy.Run{Val: true, Len: end - start + 1}) + last = end + 1 + } + + return bitfield.NewFromIter(&rlepluslazy.RunSliceIterator{Runs: runs}) +} + +func BitfieldToHumanRanges(bf bitfield.BitField) (string, error) { + bj, err := bf.MarshalJSON() + if err != nil { + return "", err + } + + var bints []int64 + if err := json.Unmarshal(bj, &bints); err != nil { + return "", err + } + + var at int64 + var out string + + for i, bi := range bints { + at += bi + + if i%2 == 0 { + if i > 0 { + out += "," + } + out += fmt.Sprint(at) + continue + } + + if bi > 1 { + out += "-" + out += fmt.Sprint(at - 1) + } + } + + return out, err +} diff --git a/cmd/lotus-miner/sectors_test.go b/lib/strle/human_test.go similarity index 90% rename from cmd/lotus-miner/sectors_test.go rename to lib/strle/human_test.go index 60ffce873..744024b29 100644 --- a/cmd/lotus-miner/sectors_test.go +++ b/lib/strle/human_test.go @@ -1,4 +1,4 @@ -package main +package strle import ( "testing" @@ -11,7 +11,7 @@ import ( func TestHumanBitfield(t *testing.T) { check := func(ints []uint64, out string) { bf := bitfield.NewFromSet(ints) - h, err := bitfieldToHumanRanges(bf) + h, err := BitfieldToHumanRanges(bf) require.NoError(t, err) require.Equal(t, out, h) } @@ -26,10 +26,10 @@ func TestHumanBitfield(t *testing.T) { func TestHumanBitfieldRoundtrip(t *testing.T) { check := func(ints []uint64, out string) { - parsed, err := humanRangesToBitField(out) + parsed, err := HumanRangesToBitField(out) require.NoError(t, err) - h, err := bitfieldToHumanRanges(parsed) + h, err := BitfieldToHumanRanges(parsed) require.NoError(t, err) require.Equal(t, out, h) diff --git a/node/impl/storminer.go b/node/impl/storminer.go index 25c1d99b7..2039429c2 100644 --- a/node/impl/storminer.go +++ b/node/impl/storminer.go @@ -440,6 +440,10 @@ func (sm *StorageMinerAPI) SectorNumReserve(ctx context.Context, name string, fi return sm.Miner.NumReserve(ctx, name, field, force) } +func (sm *StorageMinerAPI) SectorNumReserveCount(ctx context.Context, name string, count uint64) (bitfield.BitField, error) { + return sm.Miner.NumReserveCount(ctx, name, count) +} + func (sm *StorageMinerAPI) SectorNumFree(ctx context.Context, name string) error { return sm.Miner.NumFree(ctx, name) } diff --git a/storage/pipeline/numassign.go b/storage/pipeline/numassign.go index 551d7a85e..18c154b6a 100644 --- a/storage/pipeline/numassign.go +++ b/storage/pipeline/numassign.go @@ -168,6 +168,7 @@ func (m *Sealing) numAssignerMetaLocked(ctx context.Context) (api.NumAssignerMet return api.NumAssignerMeta{ Reserved: *reserved, Allocated: *allocated, + InUse: inuse, Next: firstFree, }, nil } @@ -208,6 +209,11 @@ func (m *Sealing) NumReserve(ctx context.Context, name string, reserving bitfiel m.sclk.Lock() defer m.sclk.Unlock() + return m.numReserveLocked(ctx, name, reserving, force) +} + +// NumReserve creates a new sector reservation +func (m *Sealing) numReserveLocked(ctx context.Context, name string, reserving bitfield.BitField, force bool) error { rk, err := reservationKey(name) if err != nil { return err @@ -294,6 +300,49 @@ func (m *Sealing) NumReserve(ctx context.Context, name string, reserving bitfiel return nil } +func (m *Sealing) NumReserveCount(ctx context.Context, name string, count uint64) (bitfield.BitField, error) { + m.sclk.Lock() + defer m.sclk.Unlock() + + nm, err := m.numAssignerMetaLocked(ctx) + if err != nil { + return bitfield.BitField{}, err + } + + // figure out `count` unused sectors at lowest possible numbers + + usedCount, err := nm.InUse.Count() + if err != nil { + return bitfield.BitField{}, err + } + + // get a bitfield mask which has at least `count` bits more set than the nm.InUse field + mask, err := bitfield.NewFromIter(&rlepluslazy.RunSliceIterator{Runs: []rlepluslazy.Run{ + { + Val: true, + Len: count + usedCount, + }, + }}) + + free, err := bitfield.SubtractBitField(mask, nm.InUse) + if err != nil { + return bitfield.BitField{}, err + } + + // free now has at least 'count' bits set - it's possible that InUse had some bits set outside the count+usedCount range + + free, err = free.Slice(0, count) + if err != nil { + return bitfield.BitField{}, err + } + + if err := m.numReserveLocked(ctx, name, free, false); err != nil { + return bitfield.BitField{}, err + } + + return free, nil +} + // NumFree removes a named sector reservation func (m *Sealing) NumFree(ctx context.Context, name string) error { rk, err := reservationKey(name) From b8a8648f4a343e8209322c8064cfcb3fec83a609 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 24 Aug 2022 11:38:29 -0400 Subject: [PATCH 070/185] numassigner: fix lint --- storage/pipeline/numassign.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/storage/pipeline/numassign.go b/storage/pipeline/numassign.go index 18c154b6a..bd5872eb9 100644 --- a/storage/pipeline/numassign.go +++ b/storage/pipeline/numassign.go @@ -323,6 +323,9 @@ func (m *Sealing) NumReserveCount(ctx context.Context, name string, count uint64 Len: count + usedCount, }, }}) + if err != nil { + return bitfield.BitField{}, err + } free, err := bitfield.SubtractBitField(mask, nm.InUse) if err != nil { From ebeb16eda507aeeb9f997c5c51c2502898a3eafe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 25 Aug 2022 01:05:56 +0200 Subject: [PATCH 071/185] feat: shed: add a --max-size flag to vlog2car --- cmd/lotus-shed/datastore-vlog.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cmd/lotus-shed/datastore-vlog.go b/cmd/lotus-shed/datastore-vlog.go index bc4ba9f77..36abaf995 100644 --- a/cmd/lotus-shed/datastore-vlog.go +++ b/cmd/lotus-shed/datastore-vlog.go @@ -34,12 +34,13 @@ var datastoreVlog2CarCmd = &cli.Command{ Usage: "datastore prefix", Value: "/blocks/", }, + &cli.Uint64Flag{Name: "max-size", Value: 32000}, }, ArgsUsage: "[vlog...]", Action: func(cctx *cli.Context) error { ctx := cctx.Context - maxSz := uint64(31 << 30) + maxSz := uint64(cctx.Uint64("max-size") << 20) carb := &rawCarb{ max: maxSz, From 2f7062d642cbe643a5c6477879fb3c350dcc014f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 25 Aug 2022 10:08:12 -0400 Subject: [PATCH 072/185] vlog2car: add max-size flag usage, fix lint --- cmd/lotus-shed/datastore-vlog.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/cmd/lotus-shed/datastore-vlog.go b/cmd/lotus-shed/datastore-vlog.go index 36abaf995..936d33849 100644 --- a/cmd/lotus-shed/datastore-vlog.go +++ b/cmd/lotus-shed/datastore-vlog.go @@ -34,13 +34,17 @@ var datastoreVlog2CarCmd = &cli.Command{ Usage: "datastore prefix", Value: "/blocks/", }, - &cli.Uint64Flag{Name: "max-size", Value: 32000}, + &cli.Uint64Flag{ + Name: "max-size", + Value: 32000, + Usage: "max single car size in MiB", + }, }, ArgsUsage: "[vlog...]", Action: func(cctx *cli.Context) error { ctx := cctx.Context - maxSz := uint64(cctx.Uint64("max-size") << 20) + maxSz := cctx.Uint64("max-size") << 20 carb := &rawCarb{ max: maxSz, From 70f0edd0419df668ce32cc68943d9e8408b1bb86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 25 Aug 2022 10:19:39 -0400 Subject: [PATCH 073/185] strle, sealing: address review --- lib/strle/human.go | 6 +----- storage/pipeline/numassign.go | 10 +++++----- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/lib/strle/human.go b/lib/strle/human.go index f381f83fc..4ffd69821 100644 --- a/lib/strle/human.go +++ b/lib/strle/human.go @@ -42,11 +42,7 @@ func HumanRangesToBitField(h string) (bitfield.BitField, error) { } } - if start < last { - return bitfield.BitField{}, xerrors.Errorf("run %d start(%d) was less than last run end(%d)", i, start, last) - } - - if start == last && last > 0 { + if start <= last && last > 0 { return bitfield.BitField{}, xerrors.Errorf("run %d start(%d) was equal to last run end(%d)", i, start, last) } diff --git a/storage/pipeline/numassign.go b/storage/pipeline/numassign.go index bd5872eb9..60dddec98 100644 --- a/storage/pipeline/numassign.go +++ b/storage/pipeline/numassign.go @@ -98,7 +98,7 @@ func (m *Sealing) numAssignerMetaLocked(ctx context.Context) (api.NumAssignerMet return api.NumAssignerMeta{}, xerrors.Errorf("loading allocated sectors bitfield: %w", err) } - // if the allocated bitfield doesn't exist, crate it from the legacy sector counter + // if the allocated bitfield doesn't exist, create it from the legacy sector counter if allocated == nil { var i uint64 { @@ -250,12 +250,12 @@ func (m *Sealing) numReserveLocked(ctx context.Context, name string, reserving b } // check if the reservation is colliding with any other reservation - coliding, err := bitfield.IntersectBitField(allReserved, reserving) + colliding, err := bitfield.IntersectBitField(allReserved, reserving) if err != nil { return xerrors.Errorf("intersect all / reserving: %w", err) } - empty, err := coliding.IsEmpty() + empty, err := colliding.IsEmpty() if err != nil { return xerrors.Errorf("colliding.empty: %w", err) } @@ -267,12 +267,12 @@ func (m *Sealing) numReserveLocked(ctx context.Context, name string, reserving b } // check if the reservation is colliding with allocated sectors - coliding, err = bitfield.IntersectBitField(nm.Allocated, reserving) + colliding, err = bitfield.IntersectBitField(nm.Allocated, reserving) if err != nil { return xerrors.Errorf("intersect all / reserving: %w", err) } - empty, err = coliding.IsEmpty() + empty, err = colliding.IsEmpty() if err != nil { return xerrors.Errorf("colliding.empty: %w", err) } From ebd8c0c50ac1e23080cf7f06d8f28023d5dbcc47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 25 Aug 2022 14:06:21 -0400 Subject: [PATCH 074/185] gomod: Update libp2p to v0.22.0 --- go.mod | 45 +++++++++++++++++++++++---------------------- go.sum | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+), 22 deletions(-) diff --git a/go.mod b/go.mod index eba6ed097..6c80bcaed 100644 --- a/go.mod +++ b/go.mod @@ -109,24 +109,24 @@ 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-eventbus v0.2.1 - github.com/libp2p/go-libp2p v0.21.0 - github.com/libp2p/go-libp2p-core v0.19.1 + github.com/libp2p/go-eventbus v0.3.0 + github.com/libp2p/go-libp2p v0.22.0 + github.com/libp2p/go-libp2p-core v0.20.0 github.com/libp2p/go-libp2p-kad-dht v0.17.0 github.com/libp2p/go-libp2p-peerstore v0.7.1 github.com/libp2p/go-libp2p-pubsub v0.7.1 github.com/libp2p/go-libp2p-record v0.1.3 - github.com/libp2p/go-libp2p-resource-manager v0.5.3 + github.com/libp2p/go-libp2p-resource-manager v0.6.0 github.com/libp2p/go-libp2p-routing-helpers v0.2.3 github.com/libp2p/go-maddr-filter v0.1.0 - github.com/mattn/go-isatty v0.0.14 + github.com/mattn/go-isatty v0.0.16 github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 github.com/mitchellh/go-homedir v1.1.0 github.com/multiformats/go-base32 v0.0.4 github.com/multiformats/go-multiaddr v0.6.0 github.com/multiformats/go-multiaddr-dns v0.3.1 github.com/multiformats/go-multibase v0.1.1 - github.com/multiformats/go-multihash v0.2.0 + github.com/multiformats/go-multihash v0.2.1 github.com/multiformats/go-varint v0.0.6 github.com/open-rpc/meta-schema v0.0.0-20201029221707-1b72ef2ea333 github.com/opentracing/opentracing-go v1.2.0 @@ -149,12 +149,12 @@ require ( go.opentelemetry.io/otel/sdk v1.2.0 go.uber.org/fx v1.15.0 go.uber.org/multierr v1.8.0 - go.uber.org/zap v1.21.0 - golang.org/x/net v0.0.0-20220630215102-69896b714898 - golang.org/x/sync v0.0.0-20210220032951-036812b2e83c - golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a + go.uber.org/zap v1.22.0 + golang.org/x/net v0.0.0-20220812174116-3211cb980234 + golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 + golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac - golang.org/x/tools v0.1.11 + golang.org/x/tools v0.1.12 golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f gopkg.in/cheggaaa/pb.v1 v1.0.28 gotest.tools v2.2.0+incompatible @@ -182,7 +182,7 @@ require ( github.com/daaku/go.zipexe v1.0.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c // indirect - github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect github.com/dgraph-io/ristretto v0.1.0 // indirect github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 // indirect github.com/drand/kyber-bls12381 v0.2.1 // indirect @@ -230,7 +230,7 @@ require ( github.com/ipfs/go-ipfs-posinfo v0.0.1 // indirect github.com/ipfs/go-ipfs-pq v0.0.2 // indirect github.com/ipfs/go-ipld-legacy v0.1.1 // indirect - github.com/ipfs/go-ipns v0.1.2 // indirect + github.com/ipfs/go-ipns v0.1.3-0.20220819140646-0d8e99ba180a // indirect github.com/ipfs/go-log v1.0.5 // indirect github.com/ipfs/go-path v0.3.0 // indirect github.com/ipfs/go-peertaskqueue v0.7.1 // indirect @@ -247,10 +247,10 @@ require ( github.com/jpillora/backoff v1.0.0 // indirect github.com/kilic/bls12-381 v0.0.0-20200820230200-6b2c19996391 // indirect github.com/klauspost/compress v1.15.1 // indirect - github.com/klauspost/cpuid/v2 v2.0.14 // indirect + github.com/klauspost/cpuid/v2 v2.1.0 // indirect github.com/koron/go-ssdp v0.0.3 // indirect github.com/libp2p/go-cidranger v1.1.0 // indirect - github.com/libp2p/go-flow-metrics v0.0.3 // indirect + github.com/libp2p/go-flow-metrics v0.1.0 // indirect github.com/libp2p/go-libp2p-asn-util v0.2.0 // indirect github.com/libp2p/go-libp2p-connmgr v0.4.0 // indirect github.com/libp2p/go-libp2p-discovery v0.7.0 // indirect @@ -263,19 +263,20 @@ require ( github.com/libp2p/go-msgio v0.2.0 // indirect github.com/libp2p/go-nat v0.1.0 // indirect github.com/libp2p/go-netroute v0.2.0 // indirect - github.com/libp2p/go-openssl v0.0.7 // indirect + github.com/libp2p/go-openssl v0.1.0 // indirect github.com/libp2p/go-reuseport v0.2.0 // indirect github.com/libp2p/go-yamux/v3 v3.1.2 // indirect - github.com/lucas-clemente/quic-go v0.28.0 // indirect + github.com/lucas-clemente/quic-go v0.28.1 // indirect github.com/lucasb-eyer/go-colorful v1.0.3 // indirect github.com/magefile/mage v1.9.0 // indirect github.com/mailru/easyjson v0.7.6 // indirect github.com/marten-seemann/qtls-go1-16 v0.1.5 // indirect github.com/marten-seemann/qtls-go1-17 v0.1.2 // indirect github.com/marten-seemann/qtls-go1-18 v0.1.2 // indirect - github.com/marten-seemann/qtls-go1-19 v0.1.0-beta.1 // indirect + github.com/marten-seemann/qtls-go1-19 v0.1.0 // indirect github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd // indirect github.com/mattn/go-colorable v0.1.9 // indirect + github.com/mattn/go-pointer v0.0.1 // indirect github.com/mattn/go-runewidth v0.0.10 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect github.com/miekg/dns v1.1.50 // indirect @@ -297,8 +298,8 @@ require ( github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/prometheus/client_model v0.2.0 // indirect - github.com/prometheus/common v0.35.0 // indirect - github.com/prometheus/procfs v0.7.3 // indirect + github.com/prometheus/common v0.37.0 // indirect + github.com/prometheus/procfs v0.8.0 // indirect github.com/prometheus/statsd_exporter v0.21.0 // indirect github.com/rivo/uniseg v0.1.0 // indirect github.com/rs/cors v1.7.0 // indirect @@ -320,7 +321,7 @@ require ( go.opentelemetry.io/otel/metric v0.25.0 // indirect go.opentelemetry.io/otel/sdk/export/metric v0.25.0 // indirect go.opentelemetry.io/otel/trace v1.7.0 // indirect - go.uber.org/atomic v1.9.0 // indirect + go.uber.org/atomic v1.10.0 // indirect go.uber.org/dig v1.12.0 // indirect go4.org v0.0.0-20200411211856-f5505b9728dd // indirect golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e // indirect @@ -330,7 +331,7 @@ require ( golang.org/x/text v0.3.7 // indirect google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4 // indirect google.golang.org/grpc v1.45.0 // indirect - google.golang.org/protobuf v1.28.0 // indirect + google.golang.org/protobuf v1.28.1 // indirect gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index f45166152..cb87feeb9 100644 --- a/go.sum +++ b/go.sum @@ -250,6 +250,8 @@ github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= github.com/detailyang/go-fallocate v0.0.0-20180908115635-432fa640bd2e h1:lj77EKYUpYXTd8CD/+QMIf8b6OIOTsfEBSXiAzuEHTU= github.com/detailyang/go-fallocate v0.0.0-20180908115635-432fa640bd2e/go.mod h1:3ZQK6DMPSz/QZ73jlWxBtUhNA8xZx7LzUFSq/OfP8vk= @@ -893,6 +895,8 @@ github.com/ipfs/go-ipld-legacy v0.1.1 h1:BvD8PEuqwBHLTKqlGFTHSwrwFOMkVESEvwIYwR2 github.com/ipfs/go-ipld-legacy v0.1.1/go.mod h1:8AyKFCjgRPsQFf15ZQgDB8Din4DML/fOmKZkkFkrIEg= github.com/ipfs/go-ipns v0.1.2 h1:O/s/0ht+4Jl9+VoxoUo0zaHjnZUS+aBQIKTuzdZ/ucI= github.com/ipfs/go-ipns v0.1.2/go.mod h1:ioQ0j02o6jdIVW+bmi18f4k2gRf0AV3kZ9KeHYHICnQ= +github.com/ipfs/go-ipns v0.1.3-0.20220819140646-0d8e99ba180a h1:5UPw4plVUYhbZjY9ZWSLVEWUyYWQIM3WYumZQfBlPXI= +github.com/ipfs/go-ipns v0.1.3-0.20220819140646-0d8e99ba180a/go.mod h1:VHLj6/KLxdj+a5BTwpKRoHhtw+TP+hcb0ZUpQSqW4fI= github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= github.com/ipfs/go-log v1.0.0/go.mod h1:JO7RzlMK6rA+CIxFMLOuB6Wf5b81GDiKElL7UPSIKjA= github.com/ipfs/go-log v1.0.1/go.mod h1:HuWlQttfN6FWNHRhlY5yMk/lW7evQC0HHGOxEwMRR8I= @@ -1074,6 +1078,8 @@ github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa02 github.com/klauspost/cpuid/v2 v2.0.12/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c= github.com/klauspost/cpuid/v2 v2.0.14 h1:QRqdp6bb9M9S5yyKeYteXKuoKE4p0tGlra81fKOpWH8= github.com/klauspost/cpuid/v2 v2.0.14/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c= +github.com/klauspost/cpuid/v2 v2.1.0 h1:eyi1Ad2aNJMW95zcSbmGg7Cg6cq3ADwLpMAP96d8rF0= +github.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= github.com/koalacxr/quantile v0.0.1 h1:wAW+SQ286Erny9wOjVww96t8ws+x5Zj6AKHDULUK+o0= github.com/koalacxr/quantile v0.0.1/go.mod h1:bGN/mCZLZ4lrSDHRQ6Lglj9chowGux8sGUIND+DQeD0= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -1114,10 +1120,14 @@ github.com/libp2p/go-eventbus v0.0.2/go.mod h1:Hr/yGlwxA/stuLnpMiu82lpNKpvRy3EaJ github.com/libp2p/go-eventbus v0.1.0/go.mod h1:vROgu5cs5T7cv7POWlWxBaVLxfSegC5UGQf8A2eEmx4= github.com/libp2p/go-eventbus v0.2.1 h1:VanAdErQnpTioN2TowqNcOijf6YwhuODe4pPKSDpxGc= github.com/libp2p/go-eventbus v0.2.1/go.mod h1:jc2S4SoEVPP48H9Wpzm5aiGwUCBMfGhVhhBjyhhCJs8= +github.com/libp2p/go-eventbus v0.3.0 h1:FCHfSpM469NSXipOoX3npAP7bJHSAmUIxj1qe8AtT5k= +github.com/libp2p/go-eventbus v0.3.0/go.mod h1:d+p2Q4lgRHTBLwOXdzX0hOl8D4hiHHNgcoy1MuomBHU= github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8= github.com/libp2p/go-flow-metrics v0.0.2/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS27omG0uWU5slZs= github.com/libp2p/go-flow-metrics v0.0.3 h1:8tAs/hSdNvUiLgtlSy3mxwxWP4I9y/jlkPFT7epKdeM= github.com/libp2p/go-flow-metrics v0.0.3/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS27omG0uWU5slZs= +github.com/libp2p/go-flow-metrics v0.1.0 h1:0iPhMI8PskQwzh57jB9WxIuIOQ0r+15PChFGkx3Q3WM= +github.com/libp2p/go-flow-metrics v0.1.0/go.mod h1:4Xi8MX8wj5aWNDAZttg6UPmc0ZrnFNsMtpsYUClFtro= github.com/libp2p/go-libp2p v0.0.30/go.mod h1:XWT8FGHlhptAv1+3V/+J5mEpzyui/5bvFsNuWYs611A= github.com/libp2p/go-libp2p v0.1.0/go.mod h1:6D/2OBauqLUoqcADOJpn9WbKqvaM07tDw68qHM0BxUM= github.com/libp2p/go-libp2p v0.1.1/go.mod h1:I00BRo1UuUSdpuc8Q2mN7yDF/oTUTRAX6JWpTiK9Rp8= @@ -1140,6 +1150,8 @@ github.com/libp2p/go-libp2p v0.20.0/go.mod h1:g0C5Fu+aXXbCXkusCzLycuBowEih3ElmDq github.com/libp2p/go-libp2p v0.20.1/go.mod h1:XgJHsOhEBVBXp/2Sj9bm/yEyD94uunAaP6oaegdcKks= github.com/libp2p/go-libp2p v0.21.0 h1:s9yYScuIFY33FOOzwTXbc8QqbvsRyKIWFf0FCSJKrfM= github.com/libp2p/go-libp2p v0.21.0/go.mod h1:zvcA6/C4mr5/XQarRICh+L1SN9dAHHlSWDq4x5VYxg4= +github.com/libp2p/go-libp2p v0.22.0 h1:2Tce0kHOp5zASFKJbNzRElvh0iZwdtG5uZheNW8chIw= +github.com/libp2p/go-libp2p v0.22.0/go.mod h1:UDolmweypBSjQb2f7xutPnwZ/fxioLbMBxSjRksxxU4= github.com/libp2p/go-libp2p-asn-util v0.0.0-20200825225859-85005c6cf052/go.mod h1:nRMRTab+kZuk0LnKZpxhOVH/ndsdr2Nr//Zltc/vwgo= github.com/libp2p/go-libp2p-asn-util v0.1.0/go.mod h1:wu+AnM9Ii2KgO5jMmS1rz9dvzTdj8BXqsPR9HR0XB7I= github.com/libp2p/go-libp2p-asn-util v0.2.0 h1:rg3+Os8jbnO5DxkC7K/Utdi+DkY3q/d1/1q+8WeNAsw= @@ -1215,6 +1227,8 @@ github.com/libp2p/go-libp2p-core v0.16.1/go.mod h1:O3i/7y+LqUb0N+qhzXjBjjpchgptW github.com/libp2p/go-libp2p-core v0.19.0/go.mod h1:AkA+FUKQfYt1FLNef5fOPlo/naAWjKy/RCjkcPjqzYg= github.com/libp2p/go-libp2p-core v0.19.1 h1:zaZQQCeCrFMtxFa1wHy6AhsVynyNmZAvwgWqSSPT3WE= github.com/libp2p/go-libp2p-core v0.19.1/go.mod h1:2uLhmmqDiFY+dw+70KkBLeKvvsJHGWUINRDdeV1ip7k= +github.com/libp2p/go-libp2p-core v0.20.0 h1:PGKM74+T+O/FaZNARNW32i90RMBHCcgd/hkum2UQ5eY= +github.com/libp2p/go-libp2p-core v0.20.0/go.mod h1:6zR8H7CvQWgYLsbG4on6oLNSGcyKaYFSEYyDt51+bIY= github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE= github.com/libp2p/go-libp2p-crypto v0.0.2/go.mod h1:eETI5OUfBnvARGOHrJz2eWNyTUxEGZnBxMcbUjfIj4I= github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI= @@ -1324,6 +1338,8 @@ github.com/libp2p/go-libp2p-resource-manager v0.3.0/go.mod h1:K+eCkiapf+ey/LADO4 github.com/libp2p/go-libp2p-resource-manager v0.5.1/go.mod h1:CggtV6EZb+Y0dGh41q5ezO4udcVKyhcEFpydHD8EMe0= github.com/libp2p/go-libp2p-resource-manager v0.5.3 h1:W8rG2abNBO52SRQYj24AvKmutTJZfoc1OrgzGQPwcRU= github.com/libp2p/go-libp2p-resource-manager v0.5.3/go.mod h1:CggtV6EZb+Y0dGh41q5ezO4udcVKyhcEFpydHD8EMe0= +github.com/libp2p/go-libp2p-resource-manager v0.6.0 h1:ocVD0DPRn8C6TVopES9RZMUDHBQZMG1HHw/E3rK8zF0= +github.com/libp2p/go-libp2p-resource-manager v0.6.0/go.mod h1:hf9InNLc60KiBjM4j3eSmYjkGwC++c9rle3bk+0jHQY= github.com/libp2p/go-libp2p-routing v0.0.1/go.mod h1:N51q3yTr4Zdr7V8Jt2JIktVU+3xBBylx1MZeVA6t1Ys= github.com/libp2p/go-libp2p-routing v0.1.0/go.mod h1:zfLhI1RI8RLEzmEaaPwzonRvXeeSHddONWkcTcB54nE= github.com/libp2p/go-libp2p-routing-helpers v0.2.3 h1:xY61alxJ6PurSi+MXbywZpelvuU4U4p/gPTxjqCqTzY= @@ -1448,6 +1464,8 @@ github.com/libp2p/go-openssl v0.0.4/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO github.com/libp2p/go-openssl v0.0.5/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= github.com/libp2p/go-openssl v0.0.7 h1:eCAzdLejcNVBzP/iZM9vqHnQm+XyCEbSSIheIPRGNsw= github.com/libp2p/go-openssl v0.0.7/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= +github.com/libp2p/go-openssl v0.1.0 h1:LBkKEcUv6vtZIQLVTegAil8jbNpJErQ9AnT+bWV+Ooo= +github.com/libp2p/go-openssl v0.1.0/go.mod h1:OiOxwPpL3n4xlenjx2h7AwSGaFSC/KZvf6gNdOBQMtc= github.com/libp2p/go-reuseport v0.0.1/go.mod h1:jn6RmB1ufnQwl0Q1f+YxAj8isJgDCQzaaxIFYDhcYEA= github.com/libp2p/go-reuseport v0.0.2/go.mod h1:SPD+5RwGC7rcnzngoYC86GjPzjSywuQyMVAheVBD9nQ= github.com/libp2p/go-reuseport v0.1.0/go.mod h1:bQVn9hmfcTaoo0c9v5pBhOarsU1eNOBZdaAd2hzXRKU= @@ -1522,6 +1540,8 @@ github.com/lucas-clemente/quic-go v0.27.0/go.mod h1:AzgQoPda7N+3IqMMMkywBKggIFo2 github.com/lucas-clemente/quic-go v0.27.1/go.mod h1:AzgQoPda7N+3IqMMMkywBKggIFo2KT6pfnlrQ2QieeI= github.com/lucas-clemente/quic-go v0.28.0 h1:9eXVRgIkMQQyiyorz/dAaOYIx3TFzXsIFkNFz4cxuJM= github.com/lucas-clemente/quic-go v0.28.0/go.mod h1:oGz5DKK41cJt5+773+BSO9BXDsREY4HLf7+0odGAPO0= +github.com/lucas-clemente/quic-go v0.28.1 h1:Uo0lvVxWg5la9gflIF9lwa39ONq85Xq2D91YNEIslzU= +github.com/lucas-clemente/quic-go v0.28.1/go.mod h1:oGz5DKK41cJt5+773+BSO9BXDsREY4HLf7+0odGAPO0= github.com/lucasb-eyer/go-colorful v1.0.3 h1:QIbQXiugsb+q10B+MI+7DI1oQLdmnep86tWFlaaUAac= github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/lufia/iostat v1.1.0/go.mod h1:rEPNA0xXgjHQjuI5Cy05sLlS2oRcSlWHRLrvh/AQ+Pg= @@ -1557,6 +1577,8 @@ github.com/marten-seemann/qtls-go1-18 v0.1.2 h1:JH6jmzbduz0ITVQ7ShevK10Av5+jBEKA github.com/marten-seemann/qtls-go1-18 v0.1.2/go.mod h1:mJttiymBAByA49mhlNZZGrH5u1uXYZJ+RW28Py7f4m4= github.com/marten-seemann/qtls-go1-19 v0.1.0-beta.1 h1:7m/WlWcSROrcK5NxuXaxYD32BZqe/LEEnBrWcH/cOqQ= github.com/marten-seemann/qtls-go1-19 v0.1.0-beta.1/go.mod h1:5HTDWtVudo/WFsHKRNuOhWlbdjrfs5JHrYb0wIJqGpI= +github.com/marten-seemann/qtls-go1-19 v0.1.0 h1:rLFKD/9mp/uq1SYGYuVZhm83wkmU95pK5df3GufyYYU= +github.com/marten-seemann/qtls-go1-19 v0.1.0/go.mod h1:5HTDWtVudo/WFsHKRNuOhWlbdjrfs5JHrYb0wIJqGpI= github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd h1:br0buuQ854V8u83wA0rVZ8ttrq5CpaPZdvrK0LP2lOk= github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd/go.mod h1:QuCEs1Nt24+FYQEqAAncTDPJIuGs+LxK1MCiFL25pMU= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= @@ -1577,6 +1599,10 @@ github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Ky github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-pointer v0.0.1 h1:n+XhsuGeVO6MEAp7xyEukFINEa+Quek5psIR/ylA6o0= +github.com/mattn/go-pointer v0.0.1/go.mod h1:2zXcozF6qYGgmsG+SeTZz3oAbFLdD3OWqnUbNvJZAlc= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= @@ -1706,6 +1732,8 @@ github.com/multiformats/go-multihash v0.0.16/go.mod h1:zhfEIgVnB/rPMfxgFw15ZmGoN github.com/multiformats/go-multihash v0.1.0/go.mod h1:RJlXsxt6vHGaia+S8We0ErjhojtKzPP2AH4+kYM7k84= github.com/multiformats/go-multihash v0.2.0 h1:oytJb9ZA1OUW0r0f9ea18GiaPOo4SXyc7p2movyUuo4= github.com/multiformats/go-multihash v0.2.0/go.mod h1:WxoMcYG85AZVQUyRyo9s4wULvW5qrI9vb2Lt6evduFc= +github.com/multiformats/go-multihash v0.2.1 h1:aem8ZT0VA2nCHHk7bPJ1BjUbHNciqZC/d16Vve9l108= +github.com/multiformats/go-multihash v0.2.1/go.mod h1:WxoMcYG85AZVQUyRyo9s4wULvW5qrI9vb2Lt6evduFc= github.com/multiformats/go-multistream v0.0.1/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= github.com/multiformats/go-multistream v0.0.4/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= @@ -1860,6 +1888,8 @@ github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+ github.com/prometheus/common v0.33.0/go.mod h1:gB3sOl7P0TvJabZpLY5uQMpUqRCPPCyRLCZYc7JZTNE= github.com/prometheus/common v0.35.0 h1:Eyr+Pw2VymWejHqCugNaQXkAi6KayVNxaHeu6khmFBE= github.com/prometheus/common v0.35.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= +github.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE= +github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= github.com/prometheus/node_exporter v1.0.0-rc.0.0.20200428091818-01054558c289/go.mod h1:FGbBv5OPKjch+jNUJmEQpMZytIdyW0NdBtWFcfSKusc= github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= @@ -1875,6 +1905,8 @@ github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4O github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo= +github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= github.com/prometheus/statsd_exporter v0.21.0 h1:hA05Q5RFeIjgwKIYEdFd59xu5Wwaznf33yKI+pyX6T8= github.com/prometheus/statsd_exporter v0.21.0/go.mod h1:rbT83sZq2V+p73lHhPZfMc3MLCHmSHelCh9hSGYNLTQ= github.com/raulk/clock v1.1.0 h1:dpb29+UKMbLqiU/jqIJptgLR1nn23HLgMY0sTCDza5Y= @@ -2165,6 +2197,8 @@ go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= +go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/dig v1.12.0 h1:l1GQeZpEbss0/M4l/ZotuBndCrkMdjnygzgcuOjAdaY= go.uber.org/dig v1.12.0/go.mod h1:X34SnWGr8Fyla9zQNO2GSO2D+TIuqB14OS8JhYocIyw= go.uber.org/fx v1.15.0 h1:kcfBpAm98n0ksanyyZLFE/Q3T7yPi13Ge2liu3TxR+A= @@ -2195,6 +2229,8 @@ go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= go.uber.org/zap v1.21.0 h1:WefMeulhovoZ2sYXz7st6K0sLj7bBhpiFaud4r4zST8= go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= +go.uber.org/zap v1.22.0 h1:Zcye5DUgBloQ9BaT4qc9BnjOFog5TvBSAGkJ3Nf70c0= +go.uber.org/zap v1.22.0/go.mod h1:H4siCOZOrAolnUPJEkfaSjDqyP+BDS0DdDWzwcgt3+U= go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= go4.org v0.0.0-20200411211856-f5505b9728dd h1:BNJlw5kRTzdmyfh5U8F93HA2OwkP7ZGwA51eJ/0wKOU= go4.org v0.0.0-20200411211856-f5505b9728dd/go.mod h1:CIiUVy99QCPfoE13bO4EZaz5GZMZXMSBGhxRdsvzbkg= @@ -2372,6 +2408,8 @@ golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220630215102-69896b714898 h1:K7wO6V1IrczY9QOQ2WkVpw4JQSwCd52UsxVEirZUfiw= golang.org/x/net v0.0.0-20220630215102-69896b714898/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220812174116-3211cb980234 h1:RDqmgfe7SvlMWoqC3xwQ2blLO3fcWcxMa3eBLRdRW7E= +golang.org/x/net v0.0.0-20220812174116-3211cb980234/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -2394,6 +2432,8 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 h1:uVc8UZUe6tr40fFVnUP5Oj+veunVezqYl9z7DYw9xzw= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180202135801-37707fdb30a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180810173357-98c5dad5d1a0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -2506,6 +2546,9 @@ golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a h1:dGzPydgVsqGcTRVwiLJ1jVbufYwmzD3LfVPLKsKg+0k= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab h1:2QkjZIsXupsJbJIdSjjUOgWK3aEtzyuh2mPt3l/CkeU= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -2598,6 +2641,8 @@ golang.org/x/tools v0.1.8-0.20211029000441-d6a9af8af023/go.mod h1:nABZi5QlRsZVlz golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/tools v0.1.11 h1:loJ25fNOEhSXfHrpoGj91eCUThwdNX6u24rO1xnNteY= golang.org/x/tools v0.1.11/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4= +golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -2720,6 +2765,8 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= From 2086b219d2828cc2bd4c943b0b792e61ab6321f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 25 Aug 2022 14:20:41 -0400 Subject: [PATCH 075/185] Don't use go-libp2p-core --- api/api_full.go | 2 +- api/api_net.go | 8 ++++---- api/api_storage.go | 2 +- api/docgen/docgen.go | 8 ++++---- api/mocks/mock_full.go | 8 ++++---- api/proxy_gen.go | 8 ++++---- api/types.go | 4 ++-- api/v0api/full.go | 2 +- api/v0api/proxy_gen.go | 2 +- api/v0api/v0mocks/mock_full.go | 8 ++++---- api/v0api/v1_wrapper.go | 2 +- build/bootstrap.go | 2 +- build/params_shared_funcs.go | 2 +- chain/block_receipt_tracker.go | 2 +- chain/exchange/client.go | 8 ++++---- chain/exchange/interfaces.go | 4 ++-- chain/exchange/peer_tracker.go | 4 ++-- chain/exchange/server.go | 2 +- chain/sub/incoming.go | 4 ++-- chain/sub/incoming_test.go | 2 +- chain/sync.go | 4 ++-- chain/sync_manager.go | 2 +- chain/sync_test.go | 2 +- cli/client.go | 2 +- cli/net.go | 6 +++--- cmd/lotus-miner/actor.go | 2 +- cmd/lotus-miner/init.go | 4 ++-- cmd/lotus-miner/init_restore.go | 2 +- cmd/lotus-miner/init_service.go | 2 +- cmd/lotus-miner/market.go | 2 +- cmd/lotus-seed/seed/seed.go | 4 ++-- cmd/lotus-shed/consensus.go | 2 +- cmd/lotus-shed/hello.go | 2 +- cmd/lotus-shed/keyinfo.go | 4 ++-- cmd/lotus-shed/miner-peerid.go | 2 +- genesis/types.go | 2 +- itests/api_test.go | 2 +- itests/kit/ensemble.go | 4 ++-- itests/kit/node_miner.go | 4 ++-- itests/net_test.go | 4 ++-- lib/addrutil/parse.go | 2 +- lib/peermgr/peermgr.go | 8 ++++---- markets/dagstore/wrapper.go | 2 +- markets/idxprov/mesh.go | 4 ++-- markets/utils/converters.go | 2 +- node/builder.go | 12 ++++++------ node/health.go | 2 +- node/hello/hello.go | 8 ++++---- node/impl/client/client.go | 4 ++-- node/impl/full.go | 2 +- node/impl/full/state.go | 2 +- node/impl/net/net.go | 10 +++++----- node/impl/net/protect.go | 2 +- node/impl/net/rcmgr.go | 6 +++--- node/impl/storminer.go | 4 ++-- node/modules/chain.go | 4 ++-- node/modules/client.go | 2 +- node/modules/core.go | 4 ++-- node/modules/dtypes/bootstrap.go | 2 +- node/modules/dtypes/scorekeeper.go | 2 +- node/modules/graphsync.go | 4 ++-- node/modules/lp2p/addrs.go | 2 +- node/modules/lp2p/discovery.go | 4 ++-- node/modules/lp2p/host.go | 6 +++--- node/modules/lp2p/libp2p.go | 6 +++--- node/modules/lp2p/nat.go | 2 +- node/modules/lp2p/pubsub.go | 4 ++-- node/modules/lp2p/rcmgr.go | 6 +++--- node/modules/lp2p/relay.go | 4 ++-- node/modules/lp2p/routing.go | 2 +- node/modules/lp2p/transport.go | 2 +- node/modules/services.go | 6 +++--- node/modules/storageminer.go | 2 +- node/modules/storageminer_dagstore.go | 2 +- node/modules/storageminer_idxprov.go | 2 +- node/modules/storageminer_idxprov_test.go | 2 +- testplans/lotus-soup/deals_e2e.go | 2 +- testplans/lotus-soup/testkit/lotus_opts.go | 2 +- testplans/lotus-soup/testkit/role_bootstrapper.go | 2 +- testplans/lotus-soup/testkit/role_drand.go | 2 +- testplans/lotus-soup/testkit/role_miner.go | 4 ++-- testplans/lotus-soup/testkit/role_pubsub_tracer.go | 4 ++-- testplans/lotus-soup/testkit/sync.go | 2 +- 83 files changed, 150 insertions(+), 150 deletions(-) diff --git a/api/api_full.go b/api/api_full.go index c00daa000..987f3ce7d 100644 --- a/api/api_full.go +++ b/api/api_full.go @@ -8,7 +8,7 @@ import ( blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/peer" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-bitfield" diff --git a/api/api_net.go b/api/api_net.go index 32c280828..404c707b4 100644 --- a/api/api_net.go +++ b/api/api_net.go @@ -4,10 +4,10 @@ import ( "context" "time" - "github.com/libp2p/go-libp2p-core/metrics" - "github.com/libp2p/go-libp2p-core/network" - "github.com/libp2p/go-libp2p-core/peer" - "github.com/libp2p/go-libp2p-core/protocol" + "github.com/libp2p/go-libp2p/core/metrics" + "github.com/libp2p/go-libp2p/core/network" + "github.com/libp2p/go-libp2p/core/peer" + "github.com/libp2p/go-libp2p/core/protocol" ) // MODIFYING THE API INTERFACE diff --git a/api/api_storage.go b/api/api_storage.go index ca3905c95..4c6d6e941 100644 --- a/api/api_storage.go +++ b/api/api_storage.go @@ -7,7 +7,7 @@ import ( "github.com/google/uuid" "github.com/ipfs/go-cid" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/peer" "github.com/filecoin-project/go-address" datatransfer "github.com/filecoin-project/go-data-transfer" diff --git a/api/docgen/docgen.go b/api/docgen/docgen.go index b2a96f8b7..c0db309ce 100644 --- a/api/docgen/docgen.go +++ b/api/docgen/docgen.go @@ -17,11 +17,11 @@ import ( "github.com/ipfs/go-cid" "github.com/ipfs/go-graphsync" textselector "github.com/ipld/go-ipld-selector-text-lite" - "github.com/libp2p/go-libp2p-core/metrics" - "github.com/libp2p/go-libp2p-core/network" - "github.com/libp2p/go-libp2p-core/peer" - "github.com/libp2p/go-libp2p-core/protocol" pubsub "github.com/libp2p/go-libp2p-pubsub" + "github.com/libp2p/go-libp2p/core/metrics" + "github.com/libp2p/go-libp2p/core/network" + "github.com/libp2p/go-libp2p/core/peer" + "github.com/libp2p/go-libp2p/core/protocol" "github.com/multiformats/go-multiaddr" "github.com/filecoin-project/go-address" diff --git a/api/mocks/mock_full.go b/api/mocks/mock_full.go index 7b7459d5f..23e1ed424 100644 --- a/api/mocks/mock_full.go +++ b/api/mocks/mock_full.go @@ -14,10 +14,10 @@ import ( uuid "github.com/google/uuid" blocks "github.com/ipfs/go-block-format" cid "github.com/ipfs/go-cid" - metrics "github.com/libp2p/go-libp2p-core/metrics" - network0 "github.com/libp2p/go-libp2p-core/network" - peer "github.com/libp2p/go-libp2p-core/peer" - protocol "github.com/libp2p/go-libp2p-core/protocol" + metrics "github.com/libp2p/go-libp2p/core/metrics" + network0 "github.com/libp2p/go-libp2p/core/network" + peer "github.com/libp2p/go-libp2p/core/peer" + protocol "github.com/libp2p/go-libp2p/core/protocol" address "github.com/filecoin-project/go-address" bitfield "github.com/filecoin-project/go-bitfield" diff --git a/api/proxy_gen.go b/api/proxy_gen.go index a45b96b28..ece923eb6 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -10,10 +10,10 @@ import ( "github.com/google/uuid" blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" - "github.com/libp2p/go-libp2p-core/metrics" - "github.com/libp2p/go-libp2p-core/network" - "github.com/libp2p/go-libp2p-core/peer" - "github.com/libp2p/go-libp2p-core/protocol" + "github.com/libp2p/go-libp2p/core/metrics" + "github.com/libp2p/go-libp2p/core/network" + "github.com/libp2p/go-libp2p/core/peer" + "github.com/libp2p/go-libp2p/core/protocol" "golang.org/x/xerrors" "github.com/filecoin-project/go-address" diff --git a/api/types.go b/api/types.go index 07c222416..683589ce1 100644 --- a/api/types.go +++ b/api/types.go @@ -8,9 +8,9 @@ import ( "github.com/google/uuid" "github.com/ipfs/go-cid" "github.com/ipfs/go-graphsync" - "github.com/libp2p/go-libp2p-core/network" - "github.com/libp2p/go-libp2p-core/peer" pubsub "github.com/libp2p/go-libp2p-pubsub" + "github.com/libp2p/go-libp2p/core/network" + "github.com/libp2p/go-libp2p/core/peer" ma "github.com/multiformats/go-multiaddr" "github.com/filecoin-project/go-address" diff --git a/api/v0api/full.go b/api/v0api/full.go index b9e92224c..cca358ada 100644 --- a/api/v0api/full.go +++ b/api/v0api/full.go @@ -6,7 +6,7 @@ import ( blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" textselector "github.com/ipld/go-ipld-selector-text-lite" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/peer" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-bitfield" diff --git a/api/v0api/proxy_gen.go b/api/v0api/proxy_gen.go index 9f5645f61..b568fe156 100644 --- a/api/v0api/proxy_gen.go +++ b/api/v0api/proxy_gen.go @@ -7,7 +7,7 @@ import ( blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/peer" "golang.org/x/xerrors" "github.com/filecoin-project/go-address" diff --git a/api/v0api/v0mocks/mock_full.go b/api/v0api/v0mocks/mock_full.go index ce5e1f59c..7dc9c0d63 100644 --- a/api/v0api/v0mocks/mock_full.go +++ b/api/v0api/v0mocks/mock_full.go @@ -13,10 +13,10 @@ import ( uuid "github.com/google/uuid" blocks "github.com/ipfs/go-block-format" cid "github.com/ipfs/go-cid" - metrics "github.com/libp2p/go-libp2p-core/metrics" - network0 "github.com/libp2p/go-libp2p-core/network" - peer "github.com/libp2p/go-libp2p-core/peer" - protocol "github.com/libp2p/go-libp2p-core/protocol" + metrics "github.com/libp2p/go-libp2p/core/metrics" + network0 "github.com/libp2p/go-libp2p/core/network" + peer "github.com/libp2p/go-libp2p/core/peer" + protocol "github.com/libp2p/go-libp2p/core/protocol" address "github.com/filecoin-project/go-address" bitfield "github.com/filecoin-project/go-bitfield" diff --git a/api/v0api/v1_wrapper.go b/api/v0api/v1_wrapper.go index 03757045e..d2b58ccb8 100644 --- a/api/v0api/v1_wrapper.go +++ b/api/v0api/v1_wrapper.go @@ -4,7 +4,7 @@ import ( "context" "github.com/ipfs/go-cid" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/peer" "golang.org/x/xerrors" "github.com/filecoin-project/go-address" diff --git a/build/bootstrap.go b/build/bootstrap.go index 244c378b3..d86115398 100644 --- a/build/bootstrap.go +++ b/build/bootstrap.go @@ -6,7 +6,7 @@ import ( "path" "strings" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/peer" "github.com/filecoin-project/lotus/lib/addrutil" ) diff --git a/build/params_shared_funcs.go b/build/params_shared_funcs.go index bbeecacfc..d117264ab 100644 --- a/build/params_shared_funcs.go +++ b/build/params_shared_funcs.go @@ -2,7 +2,7 @@ package build import ( "github.com/ipfs/go-cid" - "github.com/libp2p/go-libp2p-core/protocol" + "github.com/libp2p/go-libp2p/core/protocol" "github.com/filecoin-project/go-address" diff --git a/chain/block_receipt_tracker.go b/chain/block_receipt_tracker.go index 2cdb5f184..58de71e19 100644 --- a/chain/block_receipt_tracker.go +++ b/chain/block_receipt_tracker.go @@ -6,7 +6,7 @@ import ( "time" lru "github.com/hashicorp/golang-lru" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/peer" "github.com/filecoin-project/lotus/build" "github.com/filecoin-project/lotus/chain/types" diff --git a/chain/exchange/client.go b/chain/exchange/client.go index 88c36aba3..7c3ea4f7e 100644 --- a/chain/exchange/client.go +++ b/chain/exchange/client.go @@ -7,9 +7,9 @@ import ( "math/rand" "time" - "github.com/libp2p/go-libp2p-core/host" - "github.com/libp2p/go-libp2p-core/network" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/host" + "github.com/libp2p/go-libp2p/core/network" + "github.com/libp2p/go-libp2p/core/peer" "go.opencensus.io/trace" "go.uber.org/fx" "golang.org/x/xerrors" @@ -429,7 +429,7 @@ func (c *client) sendRequestToPeer(ctx context.Context, peer peer.ID, req *Reque return nil, err } _ = stream.SetWriteDeadline(time.Time{}) // clear deadline // FIXME: Needs - // its own API (https://github.com/libp2p/go-libp2p-core/issues/162). + // its own API (https://github.com/libp2p/go-libp2p/core/issues/162). // Read response. var res Response diff --git a/chain/exchange/interfaces.go b/chain/exchange/interfaces.go index acc0854da..c95127929 100644 --- a/chain/exchange/interfaces.go +++ b/chain/exchange/interfaces.go @@ -3,8 +3,8 @@ package exchange import ( "context" - "github.com/libp2p/go-libp2p-core/network" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/network" + "github.com/libp2p/go-libp2p/core/peer" "github.com/filecoin-project/lotus/chain/store" "github.com/filecoin-project/lotus/chain/types" diff --git a/chain/exchange/peer_tracker.go b/chain/exchange/peer_tracker.go index 489408624..00b919d23 100644 --- a/chain/exchange/peer_tracker.go +++ b/chain/exchange/peer_tracker.go @@ -8,8 +8,8 @@ import ( "sync" "time" - "github.com/libp2p/go-libp2p-core/host" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/host" + "github.com/libp2p/go-libp2p/core/peer" "go.uber.org/fx" "github.com/filecoin-project/lotus/build" diff --git a/chain/exchange/server.go b/chain/exchange/server.go index c1acb3f61..03dcf0ed7 100644 --- a/chain/exchange/server.go +++ b/chain/exchange/server.go @@ -7,7 +7,7 @@ import ( "time" "github.com/ipfs/go-cid" - inet "github.com/libp2p/go-libp2p-core/network" + inet "github.com/libp2p/go-libp2p/core/network" "go.opencensus.io/trace" "golang.org/x/xerrors" diff --git a/chain/sub/incoming.go b/chain/sub/incoming.go index 41a10042f..bd073e789 100644 --- a/chain/sub/incoming.go +++ b/chain/sub/incoming.go @@ -12,9 +12,9 @@ import ( bserv "github.com/ipfs/go-blockservice" "github.com/ipfs/go-cid" logging "github.com/ipfs/go-log/v2" - "github.com/libp2p/go-libp2p-core/connmgr" - "github.com/libp2p/go-libp2p-core/peer" pubsub "github.com/libp2p/go-libp2p-pubsub" + "github.com/libp2p/go-libp2p/core/connmgr" + "github.com/libp2p/go-libp2p/core/peer" "go.opencensus.io/stats" "go.opencensus.io/tag" "golang.org/x/xerrors" diff --git a/chain/sub/incoming_test.go b/chain/sub/incoming_test.go index 7bd98d20d..fbe73d460 100644 --- a/chain/sub/incoming_test.go +++ b/chain/sub/incoming_test.go @@ -9,9 +9,9 @@ import ( "github.com/golang/mock/gomock" blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" - "github.com/libp2p/go-libp2p-core/peer" pubsub "github.com/libp2p/go-libp2p-pubsub" pb "github.com/libp2p/go-libp2p-pubsub/pb" + "github.com/libp2p/go-libp2p/core/peer" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-legs/dtsync" diff --git a/chain/sync.go b/chain/sync.go index cafbd4815..41775705e 100644 --- a/chain/sync.go +++ b/chain/sync.go @@ -16,8 +16,8 @@ import ( cbor "github.com/ipfs/go-ipld-cbor" ipld "github.com/ipfs/go-ipld-format" logging "github.com/ipfs/go-log/v2" - "github.com/libp2p/go-libp2p-core/connmgr" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/connmgr" + "github.com/libp2p/go-libp2p/core/peer" cbg "github.com/whyrusleeping/cbor-gen" "go.opencensus.io/stats" "go.opencensus.io/trace" diff --git a/chain/sync_manager.go b/chain/sync_manager.go index a472bafb5..94017c276 100644 --- a/chain/sync_manager.go +++ b/chain/sync_manager.go @@ -9,7 +9,7 @@ import ( "sync" "time" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/peer" "github.com/filecoin-project/go-address" diff --git a/chain/sync_test.go b/chain/sync_test.go index 01fcf0441..ee1fd91ec 100644 --- a/chain/sync_test.go +++ b/chain/sync_test.go @@ -11,7 +11,7 @@ import ( "github.com/ipfs/go-cid" ds "github.com/ipfs/go-datastore" logging "github.com/ipfs/go-log/v2" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/peer" mocknet "github.com/libp2p/go-libp2p/p2p/net/mock" "github.com/stretchr/testify/require" diff --git a/cli/client.go b/cli/client.go index b4c8f5708..5f2342b2b 100644 --- a/cli/client.go +++ b/cli/client.go @@ -25,7 +25,7 @@ import ( "github.com/fatih/color" "github.com/ipfs/go-cid" "github.com/ipfs/go-cidutil/cidenc" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/peer" "github.com/multiformats/go-multibase" "github.com/urfave/cli/v2" "golang.org/x/xerrors" diff --git a/cli/net.go b/cli/net.go index b86d72c38..5a141e52d 100644 --- a/cli/net.go +++ b/cli/net.go @@ -13,9 +13,9 @@ import ( "github.com/dustin/go-humanize" "github.com/fatih/color" - "github.com/libp2p/go-libp2p-core/network" - "github.com/libp2p/go-libp2p-core/peer" - "github.com/libp2p/go-libp2p-core/protocol" + "github.com/libp2p/go-libp2p/core/network" + "github.com/libp2p/go-libp2p/core/peer" + "github.com/libp2p/go-libp2p/core/protocol" "github.com/multiformats/go-multiaddr" "github.com/urfave/cli/v2" "golang.org/x/xerrors" diff --git a/cmd/lotus-miner/actor.go b/cmd/lotus-miner/actor.go index 15167fc2e..ba7c944d7 100644 --- a/cmd/lotus-miner/actor.go +++ b/cmd/lotus-miner/actor.go @@ -8,7 +8,7 @@ import ( "github.com/fatih/color" cbor "github.com/ipfs/go-ipld-cbor" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/peer" ma "github.com/multiformats/go-multiaddr" "github.com/urfave/cli/v2" "golang.org/x/xerrors" diff --git a/cmd/lotus-miner/init.go b/cmd/lotus-miner/init.go index fc7dc03f6..556a7f49f 100644 --- a/cmd/lotus-miner/init.go +++ b/cmd/lotus-miner/init.go @@ -17,8 +17,8 @@ import ( "github.com/google/uuid" "github.com/ipfs/go-datastore" "github.com/ipfs/go-datastore/namespace" - "github.com/libp2p/go-libp2p-core/crypto" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/crypto" + "github.com/libp2p/go-libp2p/core/peer" "github.com/mitchellh/go-homedir" "github.com/urfave/cli/v2" "golang.org/x/xerrors" diff --git a/cmd/lotus-miner/init_restore.go b/cmd/lotus-miner/init_restore.go index 483c081c3..a54146fb2 100644 --- a/cmd/lotus-miner/init_restore.go +++ b/cmd/lotus-miner/init_restore.go @@ -8,7 +8,7 @@ import ( "github.com/docker/go-units" "github.com/ipfs/go-datastore" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/peer" "github.com/mitchellh/go-homedir" "github.com/urfave/cli/v2" "golang.org/x/xerrors" diff --git a/cmd/lotus-miner/init_service.go b/cmd/lotus-miner/init_service.go index 9bbfd18ed..41838965a 100644 --- a/cmd/lotus-miner/init_service.go +++ b/cmd/lotus-miner/init_service.go @@ -4,7 +4,7 @@ import ( "context" "strings" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/peer" "github.com/urfave/cli/v2" "golang.org/x/xerrors" diff --git a/cmd/lotus-miner/market.go b/cmd/lotus-miner/market.go index 2974078d6..37d252efa 100644 --- a/cmd/lotus-miner/market.go +++ b/cmd/lotus-miner/market.go @@ -19,7 +19,7 @@ import ( "github.com/fatih/color" "github.com/ipfs/go-cid" "github.com/ipfs/go-cidutil/cidenc" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/peer" "github.com/multiformats/go-multibase" "github.com/urfave/cli/v2" "golang.org/x/xerrors" diff --git a/cmd/lotus-seed/seed/seed.go b/cmd/lotus-seed/seed/seed.go index 2816d398e..3b305e3a6 100644 --- a/cmd/lotus-seed/seed/seed.go +++ b/cmd/lotus-seed/seed/seed.go @@ -12,8 +12,8 @@ import ( "github.com/google/uuid" logging "github.com/ipfs/go-log/v2" - ic "github.com/libp2p/go-libp2p-core/crypto" - "github.com/libp2p/go-libp2p-core/peer" + ic "github.com/libp2p/go-libp2p/core/crypto" + "github.com/libp2p/go-libp2p/core/peer" "github.com/minio/blake2b-simd" "golang.org/x/xerrors" diff --git a/cmd/lotus-shed/consensus.go b/cmd/lotus-shed/consensus.go index f235606e0..f6bd7688f 100644 --- a/cmd/lotus-shed/consensus.go +++ b/cmd/lotus-shed/consensus.go @@ -9,7 +9,7 @@ import ( "strings" "time" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/peer" "github.com/multiformats/go-multiaddr" "github.com/urfave/cli/v2" diff --git a/cmd/lotus-shed/hello.go b/cmd/lotus-shed/hello.go index 23a11f118..d16f93735 100644 --- a/cmd/lotus-shed/hello.go +++ b/cmd/lotus-shed/hello.go @@ -7,7 +7,7 @@ import ( "time" "github.com/libp2p/go-libp2p" - inet "github.com/libp2p/go-libp2p-core/network" + inet "github.com/libp2p/go-libp2p/core/network" "github.com/urfave/cli/v2" cborutil "github.com/filecoin-project/go-cbor-util" diff --git a/cmd/lotus-shed/keyinfo.go b/cmd/lotus-shed/keyinfo.go index 683084711..135b5bc9d 100644 --- a/cmd/lotus-shed/keyinfo.go +++ b/cmd/lotus-shed/keyinfo.go @@ -13,8 +13,8 @@ import ( "strings" "text/template" - "github.com/libp2p/go-libp2p-core/crypto" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/crypto" + "github.com/libp2p/go-libp2p/core/peer" "github.com/multiformats/go-base32" "github.com/urfave/cli/v2" "golang.org/x/xerrors" diff --git a/cmd/lotus-shed/miner-peerid.go b/cmd/lotus-shed/miner-peerid.go index 3d5911a4c..85f720a10 100644 --- a/cmd/lotus-shed/miner-peerid.go +++ b/cmd/lotus-shed/miner-peerid.go @@ -7,7 +7,7 @@ import ( "github.com/ipfs/go-cid" cbor "github.com/ipfs/go-ipld-cbor" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/peer" "github.com/urfave/cli/v2" "golang.org/x/xerrors" diff --git a/genesis/types.go b/genesis/types.go index 021cdd287..822357dd1 100644 --- a/genesis/types.go +++ b/genesis/types.go @@ -4,7 +4,7 @@ import ( "encoding/json" "github.com/ipfs/go-cid" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/peer" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" diff --git a/itests/api_test.go b/itests/api_test.go index 310160230..ac204dc1b 100644 --- a/itests/api_test.go +++ b/itests/api_test.go @@ -8,7 +8,7 @@ import ( "time" logging "github.com/ipfs/go-log/v2" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/peer" "github.com/stretchr/testify/require" "github.com/filecoin-project/go-address" diff --git a/itests/kit/ensemble.go b/itests/kit/ensemble.go index 8ad7a2394..79f4a8743 100644 --- a/itests/kit/ensemble.go +++ b/itests/kit/ensemble.go @@ -15,8 +15,8 @@ import ( "github.com/ipfs/go-datastore" "github.com/ipfs/go-datastore/namespace" - libp2pcrypto "github.com/libp2p/go-libp2p-core/crypto" - "github.com/libp2p/go-libp2p-core/peer" + libp2pcrypto "github.com/libp2p/go-libp2p/core/crypto" + "github.com/libp2p/go-libp2p/core/peer" mocknet "github.com/libp2p/go-libp2p/p2p/net/mock" "github.com/stretchr/testify/require" diff --git a/itests/kit/node_miner.go b/itests/kit/node_miner.go index c48a09c17..8805ac36c 100644 --- a/itests/kit/node_miner.go +++ b/itests/kit/node_miner.go @@ -14,8 +14,8 @@ import ( "time" "github.com/google/uuid" - libp2pcrypto "github.com/libp2p/go-libp2p-core/crypto" - "github.com/libp2p/go-libp2p-core/peer" + libp2pcrypto "github.com/libp2p/go-libp2p/core/crypto" + "github.com/libp2p/go-libp2p/core/peer" "github.com/multiformats/go-multiaddr" "github.com/stretchr/testify/require" diff --git a/itests/net_test.go b/itests/net_test.go index 3501e35c3..e29911aa5 100644 --- a/itests/net_test.go +++ b/itests/net_test.go @@ -6,8 +6,8 @@ import ( "fmt" "testing" - "github.com/libp2p/go-libp2p-core/network" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/network" + "github.com/libp2p/go-libp2p/core/peer" manet "github.com/multiformats/go-multiaddr/net" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/lib/addrutil/parse.go b/lib/addrutil/parse.go index f9ee04c3f..fdeae424a 100644 --- a/lib/addrutil/parse.go +++ b/lib/addrutil/parse.go @@ -6,7 +6,7 @@ import ( "sync" "time" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/peer" ma "github.com/multiformats/go-multiaddr" madns "github.com/multiformats/go-multiaddr-dns" ) diff --git a/lib/peermgr/peermgr.go b/lib/peermgr/peermgr.go index 1ab81aff2..b6e6e31c0 100644 --- a/lib/peermgr/peermgr.go +++ b/lib/peermgr/peermgr.go @@ -6,11 +6,11 @@ import ( "time" logging "github.com/ipfs/go-log/v2" - "github.com/libp2p/go-libp2p-core/event" - "github.com/libp2p/go-libp2p-core/host" - net "github.com/libp2p/go-libp2p-core/network" - "github.com/libp2p/go-libp2p-core/peer" dht "github.com/libp2p/go-libp2p-kad-dht" + "github.com/libp2p/go-libp2p/core/event" + "github.com/libp2p/go-libp2p/core/host" + net "github.com/libp2p/go-libp2p/core/network" + "github.com/libp2p/go-libp2p/core/peer" "go.opencensus.io/stats" "go.uber.org/fx" "go.uber.org/multierr" diff --git a/markets/dagstore/wrapper.go b/markets/dagstore/wrapper.go index cb20dccde..b5813dc5e 100644 --- a/markets/dagstore/wrapper.go +++ b/markets/dagstore/wrapper.go @@ -16,7 +16,7 @@ import ( measure "github.com/ipfs/go-ds-measure" logging "github.com/ipfs/go-log/v2" carindex "github.com/ipld/go-car/v2/index" - "github.com/libp2p/go-libp2p-core/host" + "github.com/libp2p/go-libp2p/core/host" ldbopts "github.com/syndtr/goleveldb/leveldb/opt" "golang.org/x/xerrors" diff --git a/markets/idxprov/mesh.go b/markets/idxprov/mesh.go index 6c94fe9f3..706115a25 100644 --- a/markets/idxprov/mesh.go +++ b/markets/idxprov/mesh.go @@ -5,8 +5,8 @@ import ( "fmt" logging "github.com/ipfs/go-log/v2" - "github.com/libp2p/go-libp2p-core/host" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/host" + "github.com/libp2p/go-libp2p/core/peer" "github.com/filecoin-project/lotus/api/v1api" ) diff --git a/markets/utils/converters.go b/markets/utils/converters.go index f77297070..9562de695 100644 --- a/markets/utils/converters.go +++ b/markets/utils/converters.go @@ -1,7 +1,7 @@ package utils import ( - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/peer" "github.com/multiformats/go-multiaddr" "github.com/filecoin-project/go-address" diff --git a/node/builder.go b/node/builder.go index a36c8e66d..f25e5f862 100644 --- a/node/builder.go +++ b/node/builder.go @@ -7,15 +7,15 @@ import ( logging "github.com/ipfs/go-log/v2" metricsi "github.com/ipfs/go-metrics-interface" - ci "github.com/libp2p/go-libp2p-core/crypto" - "github.com/libp2p/go-libp2p-core/host" - "github.com/libp2p/go-libp2p-core/network" - "github.com/libp2p/go-libp2p-core/peer" - "github.com/libp2p/go-libp2p-core/peerstore" - "github.com/libp2p/go-libp2p-core/routing" dht "github.com/libp2p/go-libp2p-kad-dht" pubsub "github.com/libp2p/go-libp2p-pubsub" record "github.com/libp2p/go-libp2p-record" + ci "github.com/libp2p/go-libp2p/core/crypto" + "github.com/libp2p/go-libp2p/core/host" + "github.com/libp2p/go-libp2p/core/network" + "github.com/libp2p/go-libp2p/core/peer" + "github.com/libp2p/go-libp2p/core/peerstore" + "github.com/libp2p/go-libp2p/core/routing" "github.com/libp2p/go-libp2p/p2p/net/conngater" "github.com/multiformats/go-multiaddr" "go.uber.org/fx" diff --git a/node/health.go b/node/health.go index 5c8bde26a..1be11921c 100644 --- a/node/health.go +++ b/node/health.go @@ -7,7 +7,7 @@ import ( "time" logging "github.com/ipfs/go-log/v2" - "github.com/libp2p/go-libp2p-core/network" + "github.com/libp2p/go-libp2p/core/network" lapi "github.com/filecoin-project/lotus/api" ) diff --git a/node/hello/hello.go b/node/hello/hello.go index f59a5bc8d..651716da9 100644 --- a/node/hello/hello.go +++ b/node/hello/hello.go @@ -6,10 +6,10 @@ import ( "github.com/ipfs/go-cid" logging "github.com/ipfs/go-log/v2" - "github.com/libp2p/go-libp2p-core/host" - inet "github.com/libp2p/go-libp2p-core/network" - "github.com/libp2p/go-libp2p-core/peer" - "github.com/libp2p/go-libp2p-core/protocol" + "github.com/libp2p/go-libp2p/core/host" + inet "github.com/libp2p/go-libp2p/core/network" + "github.com/libp2p/go-libp2p/core/peer" + "github.com/libp2p/go-libp2p/core/protocol" "golang.org/x/xerrors" cborutil "github.com/filecoin-project/go-cbor-util" diff --git a/node/impl/client/client.go b/node/impl/client/client.go index b92c7f4ad..cefdfbc82 100644 --- a/node/impl/client/client.go +++ b/node/impl/client/client.go @@ -34,8 +34,8 @@ import ( "github.com/ipld/go-ipld-prime/traversal/selector/builder" selectorparse "github.com/ipld/go-ipld-prime/traversal/selector/parse" textselector "github.com/ipld/go-ipld-selector-text-lite" - "github.com/libp2p/go-libp2p-core/host" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/host" + "github.com/libp2p/go-libp2p/core/peer" "github.com/multiformats/go-multibase" "go.uber.org/fx" "golang.org/x/xerrors" diff --git a/node/impl/full.go b/node/impl/full.go index 0eb5eb109..e1e7ac7a0 100644 --- a/node/impl/full.go +++ b/node/impl/full.go @@ -5,7 +5,7 @@ import ( "time" logging "github.com/ipfs/go-log/v2" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/peer" "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/build" diff --git a/node/impl/full/state.go b/node/impl/full/state.go index d9d4f8644..d52093bff 100644 --- a/node/impl/full/state.go +++ b/node/impl/full/state.go @@ -8,7 +8,7 @@ import ( "strconv" "github.com/ipfs/go-cid" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/peer" cbg "github.com/whyrusleeping/cbor-gen" "go.uber.org/fx" "golang.org/x/xerrors" diff --git a/node/impl/net/net.go b/node/impl/net/net.go index 6e4e61ccf..c2ccbac0a 100644 --- a/node/impl/net/net.go +++ b/node/impl/net/net.go @@ -6,11 +6,11 @@ import ( "strings" "time" - "github.com/libp2p/go-libp2p-core/host" - "github.com/libp2p/go-libp2p-core/metrics" - "github.com/libp2p/go-libp2p-core/network" - "github.com/libp2p/go-libp2p-core/peer" - "github.com/libp2p/go-libp2p-core/protocol" + "github.com/libp2p/go-libp2p/core/host" + "github.com/libp2p/go-libp2p/core/metrics" + "github.com/libp2p/go-libp2p/core/network" + "github.com/libp2p/go-libp2p/core/peer" + "github.com/libp2p/go-libp2p/core/protocol" basichost "github.com/libp2p/go-libp2p/p2p/host/basic" "github.com/libp2p/go-libp2p/p2p/net/conngater" "github.com/libp2p/go-libp2p/p2p/net/swarm" diff --git a/node/impl/net/protect.go b/node/impl/net/protect.go index 172898504..c6c864a68 100644 --- a/node/impl/net/protect.go +++ b/node/impl/net/protect.go @@ -3,7 +3,7 @@ package net import ( "context" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/peer" ) const apiProtectTag = "api" diff --git a/node/impl/net/rcmgr.go b/node/impl/net/rcmgr.go index 9fe4fcdc1..f1fd68694 100644 --- a/node/impl/net/rcmgr.go +++ b/node/impl/net/rcmgr.go @@ -4,10 +4,10 @@ import ( "context" "strings" - "github.com/libp2p/go-libp2p-core/network" - "github.com/libp2p/go-libp2p-core/peer" - "github.com/libp2p/go-libp2p-core/protocol" rcmgr "github.com/libp2p/go-libp2p-resource-manager" + "github.com/libp2p/go-libp2p/core/network" + "github.com/libp2p/go-libp2p/core/peer" + "github.com/libp2p/go-libp2p/core/protocol" "golang.org/x/xerrors" "github.com/filecoin-project/lotus/api" diff --git a/node/impl/storminer.go b/node/impl/storminer.go index 4d1659dbd..a33b943ec 100644 --- a/node/impl/storminer.go +++ b/node/impl/storminer.go @@ -16,8 +16,8 @@ import ( "github.com/ipfs/go-graphsync" gsimpl "github.com/ipfs/go-graphsync/impl" "github.com/ipfs/go-graphsync/peerstate" - "github.com/libp2p/go-libp2p-core/host" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/host" + "github.com/libp2p/go-libp2p/core/peer" "go.uber.org/fx" "golang.org/x/xerrors" diff --git a/node/modules/chain.go b/node/modules/chain.go index a01feddb2..22a1d618a 100644 --- a/node/modules/chain.go +++ b/node/modules/chain.go @@ -7,8 +7,8 @@ import ( "github.com/ipfs/go-bitswap" "github.com/ipfs/go-bitswap/network" "github.com/ipfs/go-blockservice" - "github.com/libp2p/go-libp2p-core/host" - "github.com/libp2p/go-libp2p-core/routing" + "github.com/libp2p/go-libp2p/core/host" + "github.com/libp2p/go-libp2p/core/routing" "go.uber.org/fx" "golang.org/x/xerrors" diff --git a/node/modules/client.go b/node/modules/client.go index f1262983d..22fcbb00d 100644 --- a/node/modules/client.go +++ b/node/modules/client.go @@ -9,7 +9,7 @@ import ( "github.com/ipfs/go-datastore" "github.com/ipfs/go-datastore/namespace" - "github.com/libp2p/go-libp2p-core/host" + "github.com/libp2p/go-libp2p/core/host" "go.uber.org/fx" "golang.org/x/xerrors" diff --git a/node/modules/core.go b/node/modules/core.go index e089333e7..c74cc2143 100644 --- a/node/modules/core.go +++ b/node/modules/core.go @@ -12,9 +12,9 @@ import ( "github.com/gbrlsnchs/jwt/v3" logging "github.com/ipfs/go-log/v2" - "github.com/libp2p/go-libp2p-core/peer" - "github.com/libp2p/go-libp2p-core/peerstore" record "github.com/libp2p/go-libp2p-record" + "github.com/libp2p/go-libp2p/core/peer" + "github.com/libp2p/go-libp2p/core/peerstore" "github.com/raulk/go-watchdog" "go.uber.org/fx" "golang.org/x/xerrors" diff --git a/node/modules/dtypes/bootstrap.go b/node/modules/dtypes/bootstrap.go index 96cd2f673..bc19f741d 100644 --- a/node/modules/dtypes/bootstrap.go +++ b/node/modules/dtypes/bootstrap.go @@ -1,6 +1,6 @@ package dtypes -import "github.com/libp2p/go-libp2p-core/peer" +import "github.com/libp2p/go-libp2p/core/peer" type BootstrapPeers []peer.AddrInfo type DrandBootstrap []peer.AddrInfo diff --git a/node/modules/dtypes/scorekeeper.go b/node/modules/dtypes/scorekeeper.go index 7154bbe8b..343b787b7 100644 --- a/node/modules/dtypes/scorekeeper.go +++ b/node/modules/dtypes/scorekeeper.go @@ -3,8 +3,8 @@ package dtypes import ( "sync" - "github.com/libp2p/go-libp2p-core/peer" pubsub "github.com/libp2p/go-libp2p-pubsub" + "github.com/libp2p/go-libp2p/core/peer" ) type ScoreKeeper struct { diff --git a/node/modules/graphsync.go b/node/modules/graphsync.go index 724c57ef0..ca69cd2d2 100644 --- a/node/modules/graphsync.go +++ b/node/modules/graphsync.go @@ -8,8 +8,8 @@ import ( graphsyncimpl "github.com/ipfs/go-graphsync/impl" gsnet "github.com/ipfs/go-graphsync/network" "github.com/ipfs/go-graphsync/storeutil" - "github.com/libp2p/go-libp2p-core/host" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/host" + "github.com/libp2p/go-libp2p/core/peer" "go.opencensus.io/stats" "go.uber.org/fx" diff --git a/node/modules/lp2p/addrs.go b/node/modules/lp2p/addrs.go index d092ff0ab..52ee8c852 100644 --- a/node/modules/lp2p/addrs.go +++ b/node/modules/lp2p/addrs.go @@ -4,7 +4,7 @@ import ( "fmt" "github.com/libp2p/go-libp2p" - "github.com/libp2p/go-libp2p-core/host" + "github.com/libp2p/go-libp2p/core/host" p2pbhost "github.com/libp2p/go-libp2p/p2p/host/basic" mafilter "github.com/libp2p/go-maddr-filter" ma "github.com/multiformats/go-multiaddr" diff --git a/node/modules/lp2p/discovery.go b/node/modules/lp2p/discovery.go index f281c66c7..ca68a7b9c 100644 --- a/node/modules/lp2p/discovery.go +++ b/node/modules/lp2p/discovery.go @@ -4,8 +4,8 @@ import ( "context" "time" - "github.com/libp2p/go-libp2p-core/host" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/host" + "github.com/libp2p/go-libp2p/core/peer" "go.uber.org/fx" "github.com/filecoin-project/lotus/node/modules/helpers" diff --git a/node/modules/lp2p/host.go b/node/modules/lp2p/host.go index 982d9f4cd..6ba9cdb79 100644 --- a/node/modules/lp2p/host.go +++ b/node/modules/lp2p/host.go @@ -6,12 +6,12 @@ import ( nilrouting "github.com/ipfs/go-ipfs-routing/none" "github.com/libp2p/go-libp2p" - "github.com/libp2p/go-libp2p-core/host" - "github.com/libp2p/go-libp2p-core/peer" - "github.com/libp2p/go-libp2p-core/peerstore" dht "github.com/libp2p/go-libp2p-kad-dht" "github.com/libp2p/go-libp2p-peerstore/pstoremem" record "github.com/libp2p/go-libp2p-record" + "github.com/libp2p/go-libp2p/core/host" + "github.com/libp2p/go-libp2p/core/peer" + "github.com/libp2p/go-libp2p/core/peerstore" routedhost "github.com/libp2p/go-libp2p/p2p/host/routed" mocknet "github.com/libp2p/go-libp2p/p2p/net/mock" "go.uber.org/fx" diff --git a/node/modules/lp2p/libp2p.go b/node/modules/lp2p/libp2p.go index 87a5cdaf0..9d42b3996 100644 --- a/node/modules/lp2p/libp2p.go +++ b/node/modules/lp2p/libp2p.go @@ -6,9 +6,9 @@ import ( logging "github.com/ipfs/go-log/v2" "github.com/libp2p/go-libp2p" - "github.com/libp2p/go-libp2p-core/crypto" - "github.com/libp2p/go-libp2p-core/peer" - "github.com/libp2p/go-libp2p-core/peerstore" + "github.com/libp2p/go-libp2p/core/crypto" + "github.com/libp2p/go-libp2p/core/peer" + "github.com/libp2p/go-libp2p/core/peerstore" "github.com/libp2p/go-libp2p/p2p/net/connmgr" "go.uber.org/fx" "golang.org/x/xerrors" diff --git a/node/modules/lp2p/nat.go b/node/modules/lp2p/nat.go index f5ff142b7..b0c40d254 100644 --- a/node/modules/lp2p/nat.go +++ b/node/modules/lp2p/nat.go @@ -7,7 +7,7 @@ import ( /*import ( "github.com/libp2p/go-libp2p" autonat "github.com/libp2p/go-libp2p-autonat-svc" - host "github.com/libp2p/go-libp2p-core/host" + host "github.com/libp2p/go-libp2p/core/host" libp2pquic "github.com/libp2p/go-libp2p/p2p/transport/quic" "go.uber.org/fx" "github.com/ipfs/go-ipfs/repo" diff --git a/node/modules/lp2p/pubsub.go b/node/modules/lp2p/pubsub.go index 33f17a5c1..9f1b58c2b 100644 --- a/node/modules/lp2p/pubsub.go +++ b/node/modules/lp2p/pubsub.go @@ -6,10 +6,10 @@ import ( "net" "time" - "github.com/libp2p/go-libp2p-core/host" - "github.com/libp2p/go-libp2p-core/peer" pubsub "github.com/libp2p/go-libp2p-pubsub" pubsub_pb "github.com/libp2p/go-libp2p-pubsub/pb" + "github.com/libp2p/go-libp2p/core/host" + "github.com/libp2p/go-libp2p/core/peer" "github.com/minio/blake2b-simd" ma "github.com/multiformats/go-multiaddr" "go.opencensus.io/stats" diff --git a/node/modules/lp2p/rcmgr.go b/node/modules/lp2p/rcmgr.go index bd4ff75ab..01ecaae72 100644 --- a/node/modules/lp2p/rcmgr.go +++ b/node/modules/lp2p/rcmgr.go @@ -10,12 +10,12 @@ import ( logging "github.com/ipfs/go-log/v2" "github.com/libp2p/go-libp2p" - "github.com/libp2p/go-libp2p-core/network" - "github.com/libp2p/go-libp2p-core/peer" - "github.com/libp2p/go-libp2p-core/protocol" rcmgr "github.com/libp2p/go-libp2p-resource-manager" "github.com/libp2p/go-libp2p-resource-manager/obs" rcmgrObs "github.com/libp2p/go-libp2p-resource-manager/obs" + "github.com/libp2p/go-libp2p/core/network" + "github.com/libp2p/go-libp2p/core/peer" + "github.com/libp2p/go-libp2p/core/protocol" "go.opencensus.io/stats" "go.opencensus.io/stats/view" "go.opencensus.io/tag" diff --git a/node/modules/lp2p/relay.go b/node/modules/lp2p/relay.go index ec0e39ad2..87a4983f6 100644 --- a/node/modules/lp2p/relay.go +++ b/node/modules/lp2p/relay.go @@ -4,8 +4,8 @@ import ( "fmt" "github.com/libp2p/go-libp2p" - coredisc "github.com/libp2p/go-libp2p-core/discovery" - "github.com/libp2p/go-libp2p-core/routing" + coredisc "github.com/libp2p/go-libp2p/core/discovery" + "github.com/libp2p/go-libp2p/core/routing" routingdisc "github.com/libp2p/go-libp2p/p2p/discovery/routing" ) diff --git a/node/modules/lp2p/routing.go b/node/modules/lp2p/routing.go index 8cc06a6f6..816cbe2ea 100644 --- a/node/modules/lp2p/routing.go +++ b/node/modules/lp2p/routing.go @@ -4,10 +4,10 @@ import ( "context" "sort" - "github.com/libp2p/go-libp2p-core/routing" dht "github.com/libp2p/go-libp2p-kad-dht" record "github.com/libp2p/go-libp2p-record" routinghelpers "github.com/libp2p/go-libp2p-routing-helpers" + "github.com/libp2p/go-libp2p/core/routing" "go.uber.org/fx" ) diff --git a/node/modules/lp2p/transport.go b/node/modules/lp2p/transport.go index 302304632..536f612b1 100644 --- a/node/modules/lp2p/transport.go +++ b/node/modules/lp2p/transport.go @@ -2,7 +2,7 @@ package lp2p import ( "github.com/libp2p/go-libp2p" - "github.com/libp2p/go-libp2p-core/metrics" + "github.com/libp2p/go-libp2p/core/metrics" noise "github.com/libp2p/go-libp2p/p2p/security/noise" tls "github.com/libp2p/go-libp2p/p2p/security/tls" libp2pquic "github.com/libp2p/go-libp2p/p2p/transport/quic" diff --git a/node/modules/services.go b/node/modules/services.go index 150154435..72bc88959 100644 --- a/node/modules/services.go +++ b/node/modules/services.go @@ -9,10 +9,10 @@ import ( "github.com/ipfs/go-datastore" "github.com/ipfs/go-datastore/namespace" "github.com/libp2p/go-eventbus" - "github.com/libp2p/go-libp2p-core/event" - "github.com/libp2p/go-libp2p-core/host" - "github.com/libp2p/go-libp2p-core/peer" pubsub "github.com/libp2p/go-libp2p-pubsub" + "github.com/libp2p/go-libp2p/core/event" + "github.com/libp2p/go-libp2p/core/host" + "github.com/libp2p/go-libp2p/core/peer" "go.uber.org/fx" "golang.org/x/xerrors" diff --git a/node/modules/storageminer.go b/node/modules/storageminer.go index 4bb373e75..3fbe3d097 100644 --- a/node/modules/storageminer.go +++ b/node/modules/storageminer.go @@ -18,7 +18,7 @@ import ( graphsync "github.com/ipfs/go-graphsync/impl" gsnet "github.com/ipfs/go-graphsync/network" "github.com/ipfs/go-graphsync/storeutil" - "github.com/libp2p/go-libp2p-core/host" + "github.com/libp2p/go-libp2p/core/host" "go.uber.org/fx" "go.uber.org/multierr" "golang.org/x/xerrors" diff --git a/node/modules/storageminer_dagstore.go b/node/modules/storageminer_dagstore.go index 987da5a7e..620e69090 100644 --- a/node/modules/storageminer_dagstore.go +++ b/node/modules/storageminer_dagstore.go @@ -7,7 +7,7 @@ import ( "path/filepath" "strconv" - "github.com/libp2p/go-libp2p-core/host" + "github.com/libp2p/go-libp2p/core/host" "go.uber.org/fx" "golang.org/x/xerrors" diff --git a/node/modules/storageminer_idxprov.go b/node/modules/storageminer_idxprov.go index 0937786a1..5f6cf69f0 100644 --- a/node/modules/storageminer_idxprov.go +++ b/node/modules/storageminer_idxprov.go @@ -5,8 +5,8 @@ import ( "github.com/ipfs/go-datastore" "github.com/ipfs/go-datastore/namespace" - "github.com/libp2p/go-libp2p-core/host" pubsub "github.com/libp2p/go-libp2p-pubsub" + "github.com/libp2p/go-libp2p/core/host" "go.uber.org/fx" "golang.org/x/xerrors" diff --git a/node/modules/storageminer_idxprov_test.go b/node/modules/storageminer_idxprov_test.go index 6e66e3aa0..125d5b82c 100644 --- a/node/modules/storageminer_idxprov_test.go +++ b/node/modules/storageminer_idxprov_test.go @@ -8,8 +8,8 @@ import ( "github.com/ipfs/go-datastore" "github.com/libp2p/go-libp2p" - "github.com/libp2p/go-libp2p-core/host" pubsub "github.com/libp2p/go-libp2p-pubsub" + "github.com/libp2p/go-libp2p/core/host" "github.com/stretchr/testify/require" "go.uber.org/fx" diff --git a/testplans/lotus-soup/deals_e2e.go b/testplans/lotus-soup/deals_e2e.go index c4c855cd2..d650bb444 100644 --- a/testplans/lotus-soup/deals_e2e.go +++ b/testplans/lotus-soup/deals_e2e.go @@ -9,7 +9,7 @@ import ( "os" "time" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/peer" "github.com/testground/sdk-go/sync" "github.com/filecoin-project/go-address" diff --git a/testplans/lotus-soup/testkit/lotus_opts.go b/testplans/lotus-soup/testkit/lotus_opts.go index a1b23f59e..768c6d0d3 100644 --- a/testplans/lotus-soup/testkit/lotus_opts.go +++ b/testplans/lotus-soup/testkit/lotus_opts.go @@ -3,7 +3,7 @@ package testkit import ( "fmt" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/peer" ma "github.com/multiformats/go-multiaddr" "github.com/filecoin-project/lotus/node" diff --git a/testplans/lotus-soup/testkit/role_bootstrapper.go b/testplans/lotus-soup/testkit/role_bootstrapper.go index 2e2c7c82b..6c19f26f1 100644 --- a/testplans/lotus-soup/testkit/role_bootstrapper.go +++ b/testplans/lotus-soup/testkit/role_bootstrapper.go @@ -8,7 +8,7 @@ import ( "time" "github.com/google/uuid" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/peer" ma "github.com/multiformats/go-multiaddr" "github.com/filecoin-project/go-state-types/big" diff --git a/testplans/lotus-soup/testkit/role_drand.go b/testplans/lotus-soup/testkit/role_drand.go index 7e565aa8a..bae36bd61 100644 --- a/testplans/lotus-soup/testkit/role_drand.go +++ b/testplans/lotus-soup/testkit/role_drand.go @@ -21,7 +21,7 @@ import ( dnet "github.com/drand/drand/net" "github.com/drand/drand/protobuf/drand" dtest "github.com/drand/drand/test" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/peer" ma "github.com/multiformats/go-multiaddr" "github.com/testground/sdk-go/sync" diff --git a/testplans/lotus-soup/testkit/role_miner.go b/testplans/lotus-soup/testkit/role_miner.go index 59cb9dc71..a438bb6d8 100644 --- a/testplans/lotus-soup/testkit/role_miner.go +++ b/testplans/lotus-soup/testkit/role_miner.go @@ -15,8 +15,8 @@ import ( "github.com/gorilla/mux" "github.com/hashicorp/go-multierror" "github.com/ipfs/go-datastore" - libp2pcrypto "github.com/libp2p/go-libp2p-core/crypto" - "github.com/libp2p/go-libp2p-core/peer" + libp2pcrypto "github.com/libp2p/go-libp2p/core/crypto" + "github.com/libp2p/go-libp2p/core/peer" "github.com/testground/sdk-go/sync" "github.com/filecoin-project/go-address" diff --git a/testplans/lotus-soup/testkit/role_pubsub_tracer.go b/testplans/lotus-soup/testkit/role_pubsub_tracer.go index e5da62f7e..8d89f23d7 100644 --- a/testplans/lotus-soup/testkit/role_pubsub_tracer.go +++ b/testplans/lotus-soup/testkit/role_pubsub_tracer.go @@ -6,9 +6,9 @@ import ( "fmt" "github.com/libp2p/go-libp2p" - "github.com/libp2p/go-libp2p-core/crypto" - "github.com/libp2p/go-libp2p-core/host" "github.com/libp2p/go-libp2p-pubsub-tracer/traced" + "github.com/libp2p/go-libp2p/core/crypto" + "github.com/libp2p/go-libp2p/core/host" ma "github.com/multiformats/go-multiaddr" ) diff --git a/testplans/lotus-soup/testkit/sync.go b/testplans/lotus-soup/testkit/sync.go index 35b38170f..cab08594c 100644 --- a/testplans/lotus-soup/testkit/sync.go +++ b/testplans/lotus-soup/testkit/sync.go @@ -1,7 +1,7 @@ package testkit import ( - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/peer" "github.com/testground/sdk-go/sync" "github.com/filecoin-project/go-address" From dd144eaab91fd431df7f16653576e11cdf393e28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 25 Aug 2022 14:23:25 -0400 Subject: [PATCH 076/185] Update other deprecated libp2p imports --- node/impl/net/rcmgr.go | 2 +- node/modules/lp2p/rcmgr.go | 6 +++--- node/modules/services.go | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/node/impl/net/rcmgr.go b/node/impl/net/rcmgr.go index f1fd68694..872554755 100644 --- a/node/impl/net/rcmgr.go +++ b/node/impl/net/rcmgr.go @@ -4,10 +4,10 @@ import ( "context" "strings" - rcmgr "github.com/libp2p/go-libp2p-resource-manager" "github.com/libp2p/go-libp2p/core/network" "github.com/libp2p/go-libp2p/core/peer" "github.com/libp2p/go-libp2p/core/protocol" + rcmgr "github.com/libp2p/go-libp2p/p2p/host/resource-manager" "golang.org/x/xerrors" "github.com/filecoin-project/lotus/api" diff --git a/node/modules/lp2p/rcmgr.go b/node/modules/lp2p/rcmgr.go index 01ecaae72..fd904ad5e 100644 --- a/node/modules/lp2p/rcmgr.go +++ b/node/modules/lp2p/rcmgr.go @@ -10,12 +10,12 @@ import ( logging "github.com/ipfs/go-log/v2" "github.com/libp2p/go-libp2p" - rcmgr "github.com/libp2p/go-libp2p-resource-manager" - "github.com/libp2p/go-libp2p-resource-manager/obs" - rcmgrObs "github.com/libp2p/go-libp2p-resource-manager/obs" "github.com/libp2p/go-libp2p/core/network" "github.com/libp2p/go-libp2p/core/peer" "github.com/libp2p/go-libp2p/core/protocol" + rcmgr "github.com/libp2p/go-libp2p/p2p/host/resource-manager" + "github.com/libp2p/go-libp2p/p2p/host/resource-manager/obs" + rcmgrObs "github.com/libp2p/go-libp2p/p2p/host/resource-manager/obs" "go.opencensus.io/stats" "go.opencensus.io/stats/view" "go.opencensus.io/tag" diff --git a/node/modules/services.go b/node/modules/services.go index 72bc88959..18c0116aa 100644 --- a/node/modules/services.go +++ b/node/modules/services.go @@ -8,11 +8,11 @@ import ( "github.com/ipfs/go-datastore" "github.com/ipfs/go-datastore/namespace" - "github.com/libp2p/go-eventbus" pubsub "github.com/libp2p/go-libp2p-pubsub" "github.com/libp2p/go-libp2p/core/event" "github.com/libp2p/go-libp2p/core/host" "github.com/libp2p/go-libp2p/core/peer" + "github.com/libp2p/go-libp2p/p2p/host/eventbus" "go.uber.org/fx" "golang.org/x/xerrors" From 5d9315938fd0a9d5a934df5a641ed689618f63d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 25 Aug 2022 14:28:06 -0400 Subject: [PATCH 077/185] Make mod tidy happy --- go.mod | 8 ++++---- go.sum | 41 +++++++++++------------------------------ 2 files changed, 15 insertions(+), 34 deletions(-) diff --git a/go.mod b/go.mod index 6c80bcaed..91d325d27 100644 --- a/go.mod +++ b/go.mod @@ -109,14 +109,11 @@ 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-eventbus v0.3.0 github.com/libp2p/go-libp2p v0.22.0 - github.com/libp2p/go-libp2p-core v0.20.0 github.com/libp2p/go-libp2p-kad-dht v0.17.0 github.com/libp2p/go-libp2p-peerstore v0.7.1 github.com/libp2p/go-libp2p-pubsub v0.7.1 github.com/libp2p/go-libp2p-record v0.1.3 - github.com/libp2p/go-libp2p-resource-manager v0.6.0 github.com/libp2p/go-libp2p-routing-helpers v0.2.3 github.com/libp2p/go-maddr-filter v0.1.0 github.com/mattn/go-isatty v0.0.16 @@ -171,7 +168,6 @@ require ( github.com/benbjohnson/clock v1.3.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bep/debounce v1.2.0 // indirect - github.com/btcsuite/btcd/btcec/v2 v2.2.0 // indirect github.com/cespare/xxhash v1.1.0 // indirect github.com/cespare/xxhash/v2 v2.1.2 // indirect github.com/cheekybits/genny v1.0.0 // indirect @@ -250,15 +246,19 @@ require ( github.com/klauspost/cpuid/v2 v2.1.0 // indirect github.com/koron/go-ssdp v0.0.3 // indirect github.com/libp2p/go-cidranger v1.1.0 // indirect + github.com/libp2p/go-eventbus v0.3.0 // indirect github.com/libp2p/go-flow-metrics v0.1.0 // indirect github.com/libp2p/go-libp2p-asn-util v0.2.0 // indirect github.com/libp2p/go-libp2p-connmgr v0.4.0 // indirect + github.com/libp2p/go-libp2p-core v0.20.0 // indirect github.com/libp2p/go-libp2p-discovery v0.7.0 // indirect github.com/libp2p/go-libp2p-gostream v0.4.0 // indirect github.com/libp2p/go-libp2p-kbucket v0.4.7 // indirect github.com/libp2p/go-libp2p-loggables v0.1.0 // indirect + github.com/libp2p/go-libp2p-netutil v0.2.0 // indirect github.com/libp2p/go-libp2p-noise v0.5.0 // indirect github.com/libp2p/go-libp2p-swarm v0.11.0 // indirect + github.com/libp2p/go-libp2p-testing v0.12.0 // indirect github.com/libp2p/go-libp2p-tls v0.5.0 // indirect github.com/libp2p/go-msgio v0.2.0 // indirect github.com/libp2p/go-nat v0.1.0 // indirect diff --git a/go.sum b/go.sum index cb87feeb9..ccf914908 100644 --- a/go.sum +++ b/go.sum @@ -146,10 +146,8 @@ github.com/btcsuite/btcd v0.22.0-beta/go.mod h1:9n5ntfhhHQBIhUvlhDvD3Qg6fRUj4jkN github.com/btcsuite/btcd v0.22.1 h1:CnwP9LM/M9xuRrGSCGeMVs9iv09uMqwsVX7EeIpgV2c= github.com/btcsuite/btcd v0.22.1/go.mod h1:wqgTSL29+50LRkmOVknEdmt8ZojIzhuWvgu/iptuN7Y= github.com/btcsuite/btcd/btcec/v2 v2.1.3/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE= -github.com/btcsuite/btcd/btcec/v2 v2.2.0 h1:fzn1qaOt32TuLjFlkzYSsBC35Q3KUjT1SwPxiMSCF5k= github.com/btcsuite/btcd/btcec/v2 v2.2.0/go.mod h1:U7MHm051Al6XmscBQ0BoNydpOTsFAn707034b5nY8zU= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= github.com/btcsuite/btcutil v0.0.0-20190207003914-4c204d697803/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= @@ -212,7 +210,6 @@ github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.2.1-0.20180108230905-e214231b295a/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= @@ -248,7 +245,6 @@ github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c h1:pFUpOrbxDR github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c/go.mod h1:6UhI8N9EjYm1c2odKpFpAYeR8dsBeM7PtzQhRgxRr9U= github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= @@ -893,7 +889,6 @@ github.com/ipfs/go-ipld-git v0.1.1/go.mod h1:+VyMqF5lMcJh4rwEppV0e6g4nCCHXThLYYD github.com/ipfs/go-ipld-legacy v0.1.0/go.mod h1:86f5P/srAmh9GcIcWQR9lfFLZPrIyyXQeVlOWeeWEuI= github.com/ipfs/go-ipld-legacy v0.1.1 h1:BvD8PEuqwBHLTKqlGFTHSwrwFOMkVESEvwIYwR2cdcc= github.com/ipfs/go-ipld-legacy v0.1.1/go.mod h1:8AyKFCjgRPsQFf15ZQgDB8Din4DML/fOmKZkkFkrIEg= -github.com/ipfs/go-ipns v0.1.2 h1:O/s/0ht+4Jl9+VoxoUo0zaHjnZUS+aBQIKTuzdZ/ucI= github.com/ipfs/go-ipns v0.1.2/go.mod h1:ioQ0j02o6jdIVW+bmi18f4k2gRf0AV3kZ9KeHYHICnQ= github.com/ipfs/go-ipns v0.1.3-0.20220819140646-0d8e99ba180a h1:5UPw4plVUYhbZjY9ZWSLVEWUyYWQIM3WYumZQfBlPXI= github.com/ipfs/go-ipns v0.1.3-0.20220819140646-0d8e99ba180a/go.mod h1:VHLj6/KLxdj+a5BTwpKRoHhtw+TP+hcb0ZUpQSqW4fI= @@ -1076,7 +1071,6 @@ github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa02 github.com/klauspost/cpuid/v2 v2.0.6/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.12/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c= -github.com/klauspost/cpuid/v2 v2.0.14 h1:QRqdp6bb9M9S5yyKeYteXKuoKE4p0tGlra81fKOpWH8= github.com/klauspost/cpuid/v2 v2.0.14/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c= github.com/klauspost/cpuid/v2 v2.1.0 h1:eyi1Ad2aNJMW95zcSbmGg7Cg6cq3ADwLpMAP96d8rF0= github.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= @@ -1118,13 +1112,11 @@ github.com/libp2p/go-conn-security-multistream v0.3.0/go.mod h1:EEP47t4fw/bTelVm github.com/libp2p/go-doh-resolver v0.3.1/go.mod h1:y5go1ZppAq9N2eppbX0xON01CyPBeUg2yS6BTssssog= github.com/libp2p/go-eventbus v0.0.2/go.mod h1:Hr/yGlwxA/stuLnpMiu82lpNKpvRy3EaJxPu40XYOwk= github.com/libp2p/go-eventbus v0.1.0/go.mod h1:vROgu5cs5T7cv7POWlWxBaVLxfSegC5UGQf8A2eEmx4= -github.com/libp2p/go-eventbus v0.2.1 h1:VanAdErQnpTioN2TowqNcOijf6YwhuODe4pPKSDpxGc= github.com/libp2p/go-eventbus v0.2.1/go.mod h1:jc2S4SoEVPP48H9Wpzm5aiGwUCBMfGhVhhBjyhhCJs8= github.com/libp2p/go-eventbus v0.3.0 h1:FCHfSpM469NSXipOoX3npAP7bJHSAmUIxj1qe8AtT5k= github.com/libp2p/go-eventbus v0.3.0/go.mod h1:d+p2Q4lgRHTBLwOXdzX0hOl8D4hiHHNgcoy1MuomBHU= github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8= github.com/libp2p/go-flow-metrics v0.0.2/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS27omG0uWU5slZs= -github.com/libp2p/go-flow-metrics v0.0.3 h1:8tAs/hSdNvUiLgtlSy3mxwxWP4I9y/jlkPFT7epKdeM= github.com/libp2p/go-flow-metrics v0.0.3/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS27omG0uWU5slZs= github.com/libp2p/go-flow-metrics v0.1.0 h1:0iPhMI8PskQwzh57jB9WxIuIOQ0r+15PChFGkx3Q3WM= github.com/libp2p/go-flow-metrics v0.1.0/go.mod h1:4Xi8MX8wj5aWNDAZttg6UPmc0ZrnFNsMtpsYUClFtro= @@ -1148,7 +1140,6 @@ github.com/libp2p/go-libp2p v0.18.0/go.mod h1:+veaZ9z1SZQhmc5PW78jvnnxZ89Mgvmh4c github.com/libp2p/go-libp2p v0.19.4/go.mod h1:MIt8y481VDhUe4ErWi1a4bvt/CjjFfOq6kZTothWIXY= github.com/libp2p/go-libp2p v0.20.0/go.mod h1:g0C5Fu+aXXbCXkusCzLycuBowEih3ElmDqtbo61Em7k= github.com/libp2p/go-libp2p v0.20.1/go.mod h1:XgJHsOhEBVBXp/2Sj9bm/yEyD94uunAaP6oaegdcKks= -github.com/libp2p/go-libp2p v0.21.0 h1:s9yYScuIFY33FOOzwTXbc8QqbvsRyKIWFf0FCSJKrfM= github.com/libp2p/go-libp2p v0.21.0/go.mod h1:zvcA6/C4mr5/XQarRICh+L1SN9dAHHlSWDq4x5VYxg4= github.com/libp2p/go-libp2p v0.22.0 h1:2Tce0kHOp5zASFKJbNzRElvh0iZwdtG5uZheNW8chIw= github.com/libp2p/go-libp2p v0.22.0/go.mod h1:UDolmweypBSjQb2f7xutPnwZ/fxioLbMBxSjRksxxU4= @@ -1225,7 +1216,6 @@ github.com/libp2p/go-libp2p-core v0.14.0/go.mod h1:tLasfcVdTXnixsLB0QYaT1syJOhsb github.com/libp2p/go-libp2p-core v0.15.1/go.mod h1:agSaboYM4hzB1cWekgVReqV5M4g5M+2eNNejV+1EEhs= github.com/libp2p/go-libp2p-core v0.16.1/go.mod h1:O3i/7y+LqUb0N+qhzXjBjjpchgptWAVMG1Voegk7b4c= github.com/libp2p/go-libp2p-core v0.19.0/go.mod h1:AkA+FUKQfYt1FLNef5fOPlo/naAWjKy/RCjkcPjqzYg= -github.com/libp2p/go-libp2p-core v0.19.1 h1:zaZQQCeCrFMtxFa1wHy6AhsVynyNmZAvwgWqSSPT3WE= github.com/libp2p/go-libp2p-core v0.19.1/go.mod h1:2uLhmmqDiFY+dw+70KkBLeKvvsJHGWUINRDdeV1ip7k= github.com/libp2p/go-libp2p-core v0.20.0 h1:PGKM74+T+O/FaZNARNW32i90RMBHCcgd/hkum2UQ5eY= github.com/libp2p/go-libp2p-core v0.20.0/go.mod h1:6zR8H7CvQWgYLsbG4on6oLNSGcyKaYFSEYyDt51+bIY= @@ -1281,8 +1271,9 @@ github.com/libp2p/go-libp2p-nat v0.1.0/go.mod h1:DQzAG+QbDYjN1/C3B6vXucLtz3u9rEo github.com/libp2p/go-libp2p-net v0.0.1/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8EgNU9DrCcR8c= github.com/libp2p/go-libp2p-net v0.0.2/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8EgNU9DrCcR8c= github.com/libp2p/go-libp2p-netutil v0.0.1/go.mod h1:GdusFvujWZI9Vt0X5BKqwWWmZFxecf9Gt03cKxm2f/Q= -github.com/libp2p/go-libp2p-netutil v0.1.0 h1:zscYDNVEcGxyUpMd0JReUZTrpMfia8PmLKcKF72EAMQ= github.com/libp2p/go-libp2p-netutil v0.1.0/go.mod h1:3Qv/aDqtMLTUyQeundkKsA+YCThNdbQD54k3TqjpbFU= +github.com/libp2p/go-libp2p-netutil v0.2.0 h1:DecSQ5nRnE5RfOmlNx+qubPL+rX8NSC6vyPRCiJXzg4= +github.com/libp2p/go-libp2p-netutil v0.2.0/go.mod h1:5ny0YEgWwWLxPwRJn5gGYr5bh9msiDI1CStSesvqYRM= github.com/libp2p/go-libp2p-noise v0.1.1/go.mod h1:QDFLdKX7nluB7DEnlVPbz7xlLHdwHFA9HiohJRr3vwM= github.com/libp2p/go-libp2p-noise v0.2.0/go.mod h1:IEbYhBBzGyvdLBoxxULL/SGbJARhUeqlO8lVSREYu2Q= github.com/libp2p/go-libp2p-noise v0.3.0/go.mod h1:JNjHbociDJKHD64KTkzGnzqJ0FEV5gHJa6AB00kbCNQ= @@ -1336,10 +1327,6 @@ github.com/libp2p/go-libp2p-resource-manager v0.1.5/go.mod h1:wJPNjeE4XQlxeidwqV github.com/libp2p/go-libp2p-resource-manager v0.2.1/go.mod h1:K+eCkiapf+ey/LADO4TaMpMTP9/Qde/uLlrnRqV4PLQ= github.com/libp2p/go-libp2p-resource-manager v0.3.0/go.mod h1:K+eCkiapf+ey/LADO4TaMpMTP9/Qde/uLlrnRqV4PLQ= github.com/libp2p/go-libp2p-resource-manager v0.5.1/go.mod h1:CggtV6EZb+Y0dGh41q5ezO4udcVKyhcEFpydHD8EMe0= -github.com/libp2p/go-libp2p-resource-manager v0.5.3 h1:W8rG2abNBO52SRQYj24AvKmutTJZfoc1OrgzGQPwcRU= -github.com/libp2p/go-libp2p-resource-manager v0.5.3/go.mod h1:CggtV6EZb+Y0dGh41q5ezO4udcVKyhcEFpydHD8EMe0= -github.com/libp2p/go-libp2p-resource-manager v0.6.0 h1:ocVD0DPRn8C6TVopES9RZMUDHBQZMG1HHw/E3rK8zF0= -github.com/libp2p/go-libp2p-resource-manager v0.6.0/go.mod h1:hf9InNLc60KiBjM4j3eSmYjkGwC++c9rle3bk+0jHQY= github.com/libp2p/go-libp2p-routing v0.0.1/go.mod h1:N51q3yTr4Zdr7V8Jt2JIktVU+3xBBylx1MZeVA6t1Ys= github.com/libp2p/go-libp2p-routing v0.1.0/go.mod h1:zfLhI1RI8RLEzmEaaPwzonRvXeeSHddONWkcTcB54nE= github.com/libp2p/go-libp2p-routing-helpers v0.2.3 h1:xY61alxJ6PurSi+MXbywZpelvuU4U4p/gPTxjqCqTzY= @@ -1378,12 +1365,14 @@ github.com/libp2p/go-libp2p-testing v0.4.0/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotl github.com/libp2p/go-libp2p-testing v0.4.2/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotlKsNSbKQ/lImlOWF0= github.com/libp2p/go-libp2p-testing v0.5.0/go.mod h1:QBk8fqIL1XNcno/l3/hhaIEn4aLRijpYOR+zVjjlh+A= github.com/libp2p/go-libp2p-testing v0.6.0/go.mod h1:QBk8fqIL1XNcno/l3/hhaIEn4aLRijpYOR+zVjjlh+A= +github.com/libp2p/go-libp2p-testing v0.6.1-0.20211213091545-6aa944478bd3/go.mod h1:KB5rnDAM6eNBajC8qYV6hUvBaqIH0w0plTDA5yV9QlA= github.com/libp2p/go-libp2p-testing v0.7.0/go.mod h1:OLbdn9DbgdMwv00v+tlp1l3oe2Cl+FAjoWIA2pa0X6E= github.com/libp2p/go-libp2p-testing v0.8.0/go.mod h1:gRdsNxQSxAZowTgcLY7CC33xPmleZzoBpqSYbWenqPc= github.com/libp2p/go-libp2p-testing v0.9.0/go.mod h1:Td7kbdkWqYTJYQGTwzlgXwaqldraIanyjuRiAbK/XQU= github.com/libp2p/go-libp2p-testing v0.9.2/go.mod h1:Td7kbdkWqYTJYQGTwzlgXwaqldraIanyjuRiAbK/XQU= -github.com/libp2p/go-libp2p-testing v0.11.0 h1:+R7FRl/U3Y00neyBSM2qgDzqz3HkWH24U9nMlascHL4= github.com/libp2p/go-libp2p-testing v0.11.0/go.mod h1:qG4sF27dfKFoK9KlVzK2y52LQKhp0VEmLjV5aDqr1Hg= +github.com/libp2p/go-libp2p-testing v0.12.0 h1:EPvBb4kKMWO29qP4mZGyhVzUyR25dvfUIK5WDu6iPUA= +github.com/libp2p/go-libp2p-testing v0.12.0/go.mod h1:KcGDRXyN7sQCllucn1cOOS+Dmm7ujhfEyXQL5lvkcPg= github.com/libp2p/go-libp2p-tls v0.1.3/go.mod h1:wZfuewxOndz5RTnCAxFliGjvYSDA40sKitV4c50uI1M= github.com/libp2p/go-libp2p-tls v0.3.0/go.mod h1:fwF5X6PWGxm6IDRwF3V8AVCCj/hOd5oFlg+wo2FxJDY= github.com/libp2p/go-libp2p-tls v0.3.1/go.mod h1:fwF5X6PWGxm6IDRwF3V8AVCCj/hOd5oFlg+wo2FxJDY= @@ -1462,7 +1451,6 @@ github.com/libp2p/go-openssl v0.0.2/go.mod h1:v8Zw2ijCSWBQi8Pq5GAixw6DbFfa9u6VIY github.com/libp2p/go-openssl v0.0.3/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= github.com/libp2p/go-openssl v0.0.4/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= github.com/libp2p/go-openssl v0.0.5/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= -github.com/libp2p/go-openssl v0.0.7 h1:eCAzdLejcNVBzP/iZM9vqHnQm+XyCEbSSIheIPRGNsw= github.com/libp2p/go-openssl v0.0.7/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= github.com/libp2p/go-openssl v0.1.0 h1:LBkKEcUv6vtZIQLVTegAil8jbNpJErQ9AnT+bWV+Ooo= github.com/libp2p/go-openssl v0.1.0/go.mod h1:OiOxwPpL3n4xlenjx2h7AwSGaFSC/KZvf6gNdOBQMtc= @@ -1528,6 +1516,7 @@ github.com/libp2p/go-yamux/v3 v3.1.1/go.mod h1:jeLEQgLXqE2YqX1ilAClIfCMDY+0uXQUK github.com/libp2p/go-yamux/v3 v3.1.2 h1:lNEy28MBk1HavUAlzKgShp+F6mn/ea1nDYWftZhFW9Q= github.com/libp2p/go-yamux/v3 v3.1.2/go.mod h1:jeLEQgLXqE2YqX1ilAClIfCMDY+0uXQUKmmb/qp0gT4= github.com/libp2p/zeroconf/v2 v2.1.1/go.mod h1:fuJqLnUwZTshS3U/bMRJ3+ow/v9oid1n0DmyYyNO1Xs= +github.com/libp2p/zeroconf/v2 v2.2.0/go.mod h1:fuJqLnUwZTshS3U/bMRJ3+ow/v9oid1n0DmyYyNO1Xs= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= github.com/lucas-clemente/quic-go v0.11.2/go.mod h1:PpMmPfPKO9nKJ/psF49ESTAGQSdfXxlg1otPbEB2nOw= @@ -1538,7 +1527,6 @@ github.com/lucas-clemente/quic-go v0.24.0/go.mod h1:paZuzjXCE5mj6sikVLMvqXk8lJV2 github.com/lucas-clemente/quic-go v0.25.0/go.mod h1:YtzP8bxRVCBlO77yRanE264+fY/T2U9ZlW1AaHOsMOg= github.com/lucas-clemente/quic-go v0.27.0/go.mod h1:AzgQoPda7N+3IqMMMkywBKggIFo2KT6pfnlrQ2QieeI= github.com/lucas-clemente/quic-go v0.27.1/go.mod h1:AzgQoPda7N+3IqMMMkywBKggIFo2KT6pfnlrQ2QieeI= -github.com/lucas-clemente/quic-go v0.28.0 h1:9eXVRgIkMQQyiyorz/dAaOYIx3TFzXsIFkNFz4cxuJM= github.com/lucas-clemente/quic-go v0.28.0/go.mod h1:oGz5DKK41cJt5+773+BSO9BXDsREY4HLf7+0odGAPO0= github.com/lucas-clemente/quic-go v0.28.1 h1:Uo0lvVxWg5la9gflIF9lwa39ONq85Xq2D91YNEIslzU= github.com/lucas-clemente/quic-go v0.28.1/go.mod h1:oGz5DKK41cJt5+773+BSO9BXDsREY4HLf7+0odGAPO0= @@ -1575,7 +1563,6 @@ github.com/marten-seemann/qtls-go1-18 v0.1.0-beta.1/go.mod h1:PUhIQk19LoFt2174H4 github.com/marten-seemann/qtls-go1-18 v0.1.1/go.mod h1:mJttiymBAByA49mhlNZZGrH5u1uXYZJ+RW28Py7f4m4= github.com/marten-seemann/qtls-go1-18 v0.1.2 h1:JH6jmzbduz0ITVQ7ShevK10Av5+jBEKAHMntXmIV7kM= github.com/marten-seemann/qtls-go1-18 v0.1.2/go.mod h1:mJttiymBAByA49mhlNZZGrH5u1uXYZJ+RW28Py7f4m4= -github.com/marten-seemann/qtls-go1-19 v0.1.0-beta.1 h1:7m/WlWcSROrcK5NxuXaxYD32BZqe/LEEnBrWcH/cOqQ= github.com/marten-seemann/qtls-go1-19 v0.1.0-beta.1/go.mod h1:5HTDWtVudo/WFsHKRNuOhWlbdjrfs5JHrYb0wIJqGpI= github.com/marten-seemann/qtls-go1-19 v0.1.0 h1:rLFKD/9mp/uq1SYGYuVZhm83wkmU95pK5df3GufyYYU= github.com/marten-seemann/qtls-go1-19 v0.1.0/go.mod h1:5HTDWtVudo/WFsHKRNuOhWlbdjrfs5JHrYb0wIJqGpI= @@ -1597,7 +1584,6 @@ github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcME github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= @@ -1730,7 +1716,6 @@ github.com/multiformats/go-multihash v0.0.14/go.mod h1:VdAWLKTwram9oKAatUcLxBNUj github.com/multiformats/go-multihash v0.0.15/go.mod h1:D6aZrWNLFTV/ynMpKsNtB40mJzmCl4jb1alC0OvHiHg= github.com/multiformats/go-multihash v0.0.16/go.mod h1:zhfEIgVnB/rPMfxgFw15ZmGoNaKyNUIE4IWHG/kC+Ag= github.com/multiformats/go-multihash v0.1.0/go.mod h1:RJlXsxt6vHGaia+S8We0ErjhojtKzPP2AH4+kYM7k84= -github.com/multiformats/go-multihash v0.2.0 h1:oytJb9ZA1OUW0r0f9ea18GiaPOo4SXyc7p2movyUuo4= github.com/multiformats/go-multihash v0.2.0/go.mod h1:WxoMcYG85AZVQUyRyo9s4wULvW5qrI9vb2Lt6evduFc= github.com/multiformats/go-multihash v0.2.1 h1:aem8ZT0VA2nCHHk7bPJ1BjUbHNciqZC/d16Vve9l108= github.com/multiformats/go-multihash v0.2.1/go.mod h1:WxoMcYG85AZVQUyRyo9s4wULvW5qrI9vb2Lt6evduFc= @@ -1886,7 +1871,6 @@ github.com/prometheus/common v0.28.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+ github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/common v0.33.0/go.mod h1:gB3sOl7P0TvJabZpLY5uQMpUqRCPPCyRLCZYc7JZTNE= -github.com/prometheus/common v0.35.0 h1:Eyr+Pw2VymWejHqCugNaQXkAi6KayVNxaHeu6khmFBE= github.com/prometheus/common v0.35.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= github.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE= github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= @@ -1903,7 +1887,6 @@ github.com/prometheus/procfs v0.0.11/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4 github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo= github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= @@ -2129,6 +2112,7 @@ github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/zondax/hid v0.9.0 h1:eiT3P6vNxAEVxXMw66eZUAAnU2zD33JBkfG/EnfAKl8= github.com/zondax/hid v0.9.0/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= github.com/zondax/ledger-go v0.12.1 h1:hYRcyznPRJp+5mzF2sazTLP2nGvGjYDD2VzhHhFomLU= @@ -2195,7 +2179,6 @@ go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.5.1/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= @@ -2227,7 +2210,6 @@ go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= -go.uber.org/zap v1.21.0 h1:WefMeulhovoZ2sYXz7st6K0sLj7bBhpiFaud4r4zST8= go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= go.uber.org/zap v1.22.0 h1:Zcye5DUgBloQ9BaT4qc9BnjOFog5TvBSAGkJ3Nf70c0= go.uber.org/zap v1.22.0/go.mod h1:H4siCOZOrAolnUPJEkfaSjDqyP+BDS0DdDWzwcgt3+U= @@ -2406,8 +2388,8 @@ golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su golang.org/x/net v0.0.0-20220418201149-a630d4f3e7a2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220630215102-69896b714898 h1:K7wO6V1IrczY9QOQ2WkVpw4JQSwCd52UsxVEirZUfiw= golang.org/x/net v0.0.0-20220630215102-69896b714898/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220812174116-3211cb980234 h1:RDqmgfe7SvlMWoqC3xwQ2blLO3fcWcxMa3eBLRdRW7E= golang.org/x/net v0.0.0-20220812174116-3211cb980234/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -2430,8 +2412,8 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 h1:uVc8UZUe6tr40fFVnUP5Oj+veunVezqYl9z7DYw9xzw= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180202135801-37707fdb30a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -2544,9 +2526,10 @@ golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a h1:dGzPydgVsqGcTRVwiLJ1jVbufYwmzD3LfVPLKsKg+0k= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab h1:2QkjZIsXupsJbJIdSjjUOgWK3aEtzyuh2mPt3l/CkeU= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= @@ -2639,7 +2622,6 @@ golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.6-0.20210726203631-07bc1bf47fb2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.8-0.20211029000441-d6a9af8af023/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= -golang.org/x/tools v0.1.11 h1:loJ25fNOEhSXfHrpoGj91eCUThwdNX6u24rO1xnNteY= golang.org/x/tools v0.1.11/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4= golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= @@ -2763,7 +2745,6 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= From 217cc846c337a819dbba436192a0adb8d1ffbcd6 Mon Sep 17 00:00:00 2001 From: Shrenuj Bansal Date: Fri, 26 Aug 2022 11:55:20 -0400 Subject: [PATCH 078/185] Address more comments --- .circleci/config.yml | 5 ---- .github/workflows/codeql-analysis.yml | 2 +- go.sum | 2 +- itests/retry_test.go | 22 ---------------- lib/retry/retry_test.go | 25 +++++++++++++++++++ testplans/composer/Dockerfile | 2 +- .../docker-images/Dockerfile.oni-buildbase | 2 +- .../docker-images/Dockerfile.oni-runtime | 2 +- .../Dockerfile.oni-runtime-debug | 2 +- testplans/lotus-soup/go.mod | 2 +- testplans/lotus-soup/go.sum | 2 +- 11 files changed, 33 insertions(+), 35 deletions(-) delete mode 100644 itests/retry_test.go create mode 100644 lib/retry/retry_test.go diff --git a/.circleci/config.yml b/.circleci/config.yml index b4fcddbca..cb250cad9 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -959,11 +959,6 @@ workflows: suite: itest-paych_cli target: "./itests/paych_cli_test.go" - - test: - name: test-itest-retry - suite: itest-retry - target: "./itests/retry_test.go" - - test: name: test-itest-sdr_upgrade suite: itest-sdr_upgrade diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index a86b077b8..70d15c60c 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -37,7 +37,7 @@ jobs: - uses: actions/setup-go@v1 with: - go-version: '1.17.9' + go-version: '1.18.1' # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL diff --git a/go.sum b/go.sum index 184b7950b..54ba802f7 100644 --- a/go.sum +++ b/go.sum @@ -1525,7 +1525,7 @@ github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoT github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.13.0 h1:7lLHu94wT9Ij0o6EWWclhu0aOh32VxhkwEJvzuWPeak= github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY= -github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= +github.com/Op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/open-rpc/meta-schema v0.0.0-20201029221707-1b72ef2ea333 h1:CznVS40zms0Dj5he4ERo+fRPtO0qxUk8lA8Xu3ddet0= github.com/open-rpc/meta-schema v0.0.0-20201029221707-1b72ef2ea333/go.mod h1:Ag6rSXkHIckQmjFBCweJEEt1mrTPBv8b9W4aU/NQWfI= github.com/opencontainers/runtime-spec v1.0.2 h1:UfAcuLBJB9Coz72x1hgl8O5RVzTdNiaglX6v2DM6FI0= diff --git a/itests/retry_test.go b/itests/retry_test.go deleted file mode 100644 index 53ec90b56..000000000 --- a/itests/retry_test.go +++ /dev/null @@ -1,22 +0,0 @@ -package itests - -import ( - "testing" - - "github.com/stretchr/testify/require" - "golang.org/x/xerrors" - - "github.com/filecoin-project/go-jsonrpc" - - "github.com/filecoin-project/lotus/lib/retry" -) - -func TestRetryErrorIsInTrue(t *testing.T) { - errorsToRetry := []error{&jsonrpc.RPCConnectionError{}} - require.True(t, retry.ErrorIsIn(&jsonrpc.RPCConnectionError{}, errorsToRetry)) -} - -func TestRetryErrorIsInFalse(t *testing.T) { - errorsToRetry := []error{&jsonrpc.RPCConnectionError{}} - require.False(t, retry.ErrorIsIn(xerrors.Errorf("random error"), errorsToRetry)) -} diff --git a/lib/retry/retry_test.go b/lib/retry/retry_test.go new file mode 100644 index 000000000..a60d47db2 --- /dev/null +++ b/lib/retry/retry_test.go @@ -0,0 +1,25 @@ +package retry + +import ( + "testing" + + "github.com/stretchr/testify/require" + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-jsonrpc" +) + +func TestRetryErrorIsInTrue(t *testing.T) { + errorsToRetry := []error{&jsonrpc.RPCConnectionError{}} + require.True(t, ErrorIsIn(&jsonrpc.RPCConnectionError{}, errorsToRetry)) +} + +func TestRetryErrorIsInFalse(t *testing.T) { + errorsToRetry := []error{&jsonrpc.RPCConnectionError{}} + require.False(t, ErrorIsIn(xerrors.Errorf("random error"), errorsToRetry)) +} + +func TestRetryWrappedErrorIsInTrue(t *testing.T) { + errorsToRetry := []error{&jsonrpc.RPCConnectionError{}} + require.True(t, ErrorIsIn(xerrors.Errorf("wrapped: %w", &jsonrpc.RPCConnectionError{}), errorsToRetry)) +} diff --git a/testplans/composer/Dockerfile b/testplans/composer/Dockerfile index fc8ee0158..d53bef7e4 100644 --- a/testplans/composer/Dockerfile +++ b/testplans/composer/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.17.9-buster as tg-build +FROM golang:1.18.1-buster as tg-build ARG TESTGROUND_REF="oni" WORKDIR /usr/src diff --git a/testplans/docker-images/Dockerfile.oni-buildbase b/testplans/docker-images/Dockerfile.oni-buildbase index fd5f98a67..33420f4a6 100644 --- a/testplans/docker-images/Dockerfile.oni-buildbase +++ b/testplans/docker-images/Dockerfile.oni-buildbase @@ -1,4 +1,4 @@ -ARG GO_VERSION=1.17.9 +ARG GO_VERSION=1.18.1 FROM golang:${GO_VERSION}-buster diff --git a/testplans/docker-images/Dockerfile.oni-runtime b/testplans/docker-images/Dockerfile.oni-runtime index e2327f2af..e18ca3bbc 100644 --- a/testplans/docker-images/Dockerfile.oni-runtime +++ b/testplans/docker-images/Dockerfile.oni-runtime @@ -1,4 +1,4 @@ -ARG GO_VERSION=1.17.9 +ARG GO_VERSION=1.18.1 FROM golang:${GO_VERSION}-buster as downloader diff --git a/testplans/docker-images/Dockerfile.oni-runtime-debug b/testplans/docker-images/Dockerfile.oni-runtime-debug index 8d1e411a1..33954c92f 100644 --- a/testplans/docker-images/Dockerfile.oni-runtime-debug +++ b/testplans/docker-images/Dockerfile.oni-runtime-debug @@ -1,4 +1,4 @@ -ARG GO_VERSION=1.17.9 +ARG GO_VERSION=1.18.1 FROM golang:${GO_VERSION}-buster as downloader diff --git a/testplans/lotus-soup/go.mod b/testplans/lotus-soup/go.mod index c7c313c6f..040360d13 100644 --- a/testplans/lotus-soup/go.mod +++ b/testplans/lotus-soup/go.mod @@ -1,6 +1,6 @@ module github.com/filecoin-project/lotus/testplans/lotus-soup -go 1.17 +go 1.18 require ( contrib.go.opencensus.io/exporter/prometheus v0.4.0 diff --git a/testplans/lotus-soup/go.sum b/testplans/lotus-soup/go.sum index 48a908640..66c9ea416 100644 --- a/testplans/lotus-soup/go.sum +++ b/testplans/lotus-soup/go.sum @@ -2049,7 +2049,7 @@ github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoT github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.13.0 h1:7lLHu94wT9Ij0o6EWWclhu0aOh32VxhkwEJvzuWPeak= github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY= -github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= +github.com/Op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/open-rpc/meta-schema v0.0.0-20201029221707-1b72ef2ea333/go.mod h1:Ag6rSXkHIckQmjFBCweJEEt1mrTPBv8b9W4aU/NQWfI= github.com/opencontainers/runtime-spec v1.0.2 h1:UfAcuLBJB9Coz72x1hgl8O5RVzTdNiaglX6v2DM6FI0= github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= From 0ebe1a6631b620bb31e8a04b3672481403e2d8a0 Mon Sep 17 00:00:00 2001 From: Shrenuj Bansal Date: Fri, 26 Aug 2022 12:02:00 -0400 Subject: [PATCH 079/185] go mod tidy --- go.sum | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.sum b/go.sum index 54ba802f7..184b7950b 100644 --- a/go.sum +++ b/go.sum @@ -1525,7 +1525,7 @@ github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoT github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.13.0 h1:7lLHu94wT9Ij0o6EWWclhu0aOh32VxhkwEJvzuWPeak= github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY= -github.com/Op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= +github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/open-rpc/meta-schema v0.0.0-20201029221707-1b72ef2ea333 h1:CznVS40zms0Dj5he4ERo+fRPtO0qxUk8lA8Xu3ddet0= github.com/open-rpc/meta-schema v0.0.0-20201029221707-1b72ef2ea333/go.mod h1:Ag6rSXkHIckQmjFBCweJEEt1mrTPBv8b9W4aU/NQWfI= github.com/opencontainers/runtime-spec v1.0.2 h1:UfAcuLBJB9Coz72x1hgl8O5RVzTdNiaglX6v2DM6FI0= From 6291799cfae8ca9648ce2b8fbbbfc513a07d8342 Mon Sep 17 00:00:00 2001 From: Shrenuj Bansal Date: Fri, 26 Aug 2022 14:19:17 -0400 Subject: [PATCH 080/185] Change go version to 1.18.1 in more readmes --- CHANGELOG.md | 2 +- Makefile | 2 +- README.md | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cfdab9572..235763772 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -368,7 +368,7 @@ This is an optional release of lotus that include new APIs, some improvements an This is a highly recommended feature lotus release v1.15.2. This feature release introduces many new features and for SPs, including PoSt workers, sealing scheduler, snap deal queue and so on. -Note: You need to be using go v1.17.9&up from this release onwards. +Note: You need to be using go v1.18.1&up from this release onwards. ## Highlights ### ❣️❣️❣️ PoSt Workers ❣️❣️❣️ diff --git a/Makefile b/Makefile index 16f78342e..7dbb26945 100644 --- a/Makefile +++ b/Makefile @@ -10,7 +10,7 @@ GOCC?=go GOVERSION:=$(shell $(GOCC) version | tr ' ' '\n' | grep go1 | sed 's/^go//' | awk -F. '{printf "%d%03d%03d", $$1, $$2, $$3}') ifeq ($(shell expr $(GOVERSION) \< 1016000), 1) $(warning Your Golang version is go$(shell expr $(GOVERSION) / 1000000).$(shell expr $(GOVERSION) % 1000000 / 1000).$(shell expr $(GOVERSION) % 1000)) -$(error Update Golang to version to at least 1.17.9) +$(error Update Golang to version to at least 1.18.1) endif # git modules that need to be loaded diff --git a/README.md b/README.md index 6097343eb..0b3062520 100644 --- a/README.md +++ b/README.md @@ -71,10 +71,10 @@ For other distributions you can find the required dependencies [here.](https://d #### Go -To build Lotus, you need a working installation of [Go 1.17.9 or higher](https://golang.org/dl/): +To build Lotus, you need a working installation of [Go 1.18.1 or higher](https://golang.org/dl/): ```bash -wget -c https://golang.org/dl/go1.17.9.linux-amd64.tar.gz -O - | sudo tar -xz -C /usr/local +wget -c https://golang.org/dl/go1.18.1.linux-amd64.tar.gz -O - | sudo tar -xz -C /usr/local ``` **TIP:** From d8578190ff149397e0ee5424f3288791a05b33b6 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Fri, 26 Aug 2022 14:43:53 -0400 Subject: [PATCH 081/185] update go state type to v0.1.11 --- go.mod | 2 +- go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 915976a5d..336d79793 100644 --- a/go.mod +++ b/go.mod @@ -42,7 +42,7 @@ require ( github.com/filecoin-project/go-legs v0.4.4 github.com/filecoin-project/go-padreader v0.0.1 github.com/filecoin-project/go-paramfetch v0.0.4 - github.com/filecoin-project/go-state-types v0.1.11-0.20220823184028-73c63d4127a4 + github.com/filecoin-project/go-state-types v0.1.11 github.com/filecoin-project/go-statemachine v1.0.2 github.com/filecoin-project/go-statestore v0.2.0 github.com/filecoin-project/go-storedcounter v0.1.0 diff --git a/go.sum b/go.sum index f2cd9c72c..f375b5aa7 100644 --- a/go.sum +++ b/go.sum @@ -389,6 +389,8 @@ github.com/filecoin-project/go-state-types v0.1.8/go.mod h1:UwGVoMsULoCK+bWjEdd/ github.com/filecoin-project/go-state-types v0.1.10/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q= github.com/filecoin-project/go-state-types v0.1.11-0.20220823184028-73c63d4127a4 h1:ptwW6pe1SDnDGpKzxoLGfwPFsJ3remMP5KKfjbkGFBU= github.com/filecoin-project/go-state-types v0.1.11-0.20220823184028-73c63d4127a4/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q= +github.com/filecoin-project/go-state-types v0.1.11 h1:QzKUILRGa9gjJKPCiFlvCfcDGK2IqtJ6CpRQULvZZpA= +github.com/filecoin-project/go-state-types v0.1.11/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q= github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig= github.com/filecoin-project/go-statemachine v1.0.2-0.20220322104818-27f8fbb86dfd/go.mod h1:jZdXXiHa61n4NmgWFG4w8tnqgvZVHYbJ3yW7+y8bF54= github.com/filecoin-project/go-statemachine v1.0.2 h1:421SSWBk8GIoCoWYYTE/d+qCWccgmRH0uXotXRDjUbc= From 343d0920445c7cb0ec6d975cbc9bf74ab1564e3b Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Fri, 26 Aug 2022 15:33:26 -0400 Subject: [PATCH 082/185] mod tidy --- go.sum | 2 -- 1 file changed, 2 deletions(-) diff --git a/go.sum b/go.sum index f375b5aa7..13316e51d 100644 --- a/go.sum +++ b/go.sum @@ -387,8 +387,6 @@ github.com/filecoin-project/go-state-types v0.1.5/go.mod h1:UwGVoMsULoCK+bWjEdd/ github.com/filecoin-project/go-state-types v0.1.6/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q= github.com/filecoin-project/go-state-types v0.1.8/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q= github.com/filecoin-project/go-state-types v0.1.10/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q= -github.com/filecoin-project/go-state-types v0.1.11-0.20220823184028-73c63d4127a4 h1:ptwW6pe1SDnDGpKzxoLGfwPFsJ3remMP5KKfjbkGFBU= -github.com/filecoin-project/go-state-types v0.1.11-0.20220823184028-73c63d4127a4/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q= github.com/filecoin-project/go-state-types v0.1.11 h1:QzKUILRGa9gjJKPCiFlvCfcDGK2IqtJ6CpRQULvZZpA= github.com/filecoin-project/go-state-types v0.1.11/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q= github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig= From 99c2ad4ad502d4d8d35dbd77427da1f5327f882d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 29 Aug 2022 09:06:19 +0200 Subject: [PATCH 083/185] make: fix go version check --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 7dbb26945..cee3e8d36 100644 --- a/Makefile +++ b/Makefile @@ -8,7 +8,7 @@ unexport GOFLAGS GOCC?=go GOVERSION:=$(shell $(GOCC) version | tr ' ' '\n' | grep go1 | sed 's/^go//' | awk -F. '{printf "%d%03d%03d", $$1, $$2, $$3}') -ifeq ($(shell expr $(GOVERSION) \< 1016000), 1) +ifeq ($(shell expr $(GOVERSION) \< 1018001), 1) $(warning Your Golang version is go$(shell expr $(GOVERSION) / 1000000).$(shell expr $(GOVERSION) % 1000000 / 1000).$(shell expr $(GOVERSION) % 1000)) $(error Update Golang to version to at least 1.18.1) endif From efc8c75e7ddcd805ef897185bbfe11c91242e9d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 29 Aug 2022 10:05:14 +0200 Subject: [PATCH 084/185] deps: go-libp2p-pubsub v0.8.0 --- go.mod | 5 +---- go.sum | 49 ++----------------------------------------------- 2 files changed, 3 insertions(+), 51 deletions(-) diff --git a/go.mod b/go.mod index f096c77f3..9b89fba0f 100644 --- a/go.mod +++ b/go.mod @@ -112,7 +112,7 @@ require ( github.com/libp2p/go-libp2p v0.22.0 github.com/libp2p/go-libp2p-kad-dht v0.17.0 github.com/libp2p/go-libp2p-peerstore v0.7.1 - github.com/libp2p/go-libp2p-pubsub v0.7.1 + github.com/libp2p/go-libp2p-pubsub v0.8.0 github.com/libp2p/go-libp2p-record v0.1.3 github.com/libp2p/go-libp2p-routing-helpers v0.2.3 github.com/libp2p/go-maddr-filter v0.1.0 @@ -251,14 +251,11 @@ require ( github.com/libp2p/go-libp2p-asn-util v0.2.0 // indirect github.com/libp2p/go-libp2p-connmgr v0.4.0 // indirect github.com/libp2p/go-libp2p-core v0.20.0 // indirect - github.com/libp2p/go-libp2p-discovery v0.7.0 // indirect github.com/libp2p/go-libp2p-gostream v0.4.0 // indirect github.com/libp2p/go-libp2p-kbucket v0.4.7 // indirect github.com/libp2p/go-libp2p-loggables v0.1.0 // indirect github.com/libp2p/go-libp2p-netutil v0.2.0 // indirect github.com/libp2p/go-libp2p-noise v0.5.0 // indirect - github.com/libp2p/go-libp2p-swarm v0.11.0 // indirect - github.com/libp2p/go-libp2p-testing v0.12.0 // indirect github.com/libp2p/go-libp2p-tls v0.5.0 // indirect github.com/libp2p/go-msgio v0.2.0 // indirect github.com/libp2p/go-nat v0.1.0 // indirect diff --git a/go.sum b/go.sum index db7c42195..79f7c7319 100644 --- a/go.sum +++ b/go.sum @@ -340,7 +340,6 @@ github.com/filecoin-project/go-state-types v0.0.0-20201102161440-c8033295a1fc/go github.com/filecoin-project/go-state-types v0.1.0/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.6/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q= github.com/filecoin-project/go-state-types v0.1.8/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q= -github.com/filecoin-project/go-state-types v0.1.10/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q= github.com/filecoin-project/go-state-types v0.1.11 h1:QzKUILRGa9gjJKPCiFlvCfcDGK2IqtJ6CpRQULvZZpA= github.com/filecoin-project/go-state-types v0.1.11/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q= github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig= @@ -795,7 +794,6 @@ github.com/ipfs/go-log/v2 v2.1.2/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHn github.com/ipfs/go-log/v2 v2.1.3/go.mod h1:/8d0SH3Su5Ooc31QlL1WysJhvyOTDCjcCZ9Axpmri6g= github.com/ipfs/go-log/v2 v2.3.0/go.mod h1:QqGoj30OTpnKaG/LKTGTxoP2mmQtjVMEnK72gynbe/g= github.com/ipfs/go-log/v2 v2.4.0/go.mod h1:nPZnh7Cj7lwS3LpRU5Mwr2ol1c2gXIEXuF6aywqrtmo= -github.com/ipfs/go-log/v2 v2.5.0/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI= github.com/ipfs/go-log/v2 v2.5.1 h1:1XdUzF7048prq4aBjDQQ4SL5RxftpRGdXhNRwKSAlcY= github.com/ipfs/go-log/v2 v2.5.1/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI= github.com/ipfs/go-merkledag v0.0.6/go.mod h1:QYPdnlvkOg7GnQRofu9XZimC5ZW5Wi3bKys/4GQQfto= @@ -921,7 +919,6 @@ github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/compress v1.15.1 h1:y9FcTHGyrebwfP0ZZqFiaxTaiDnUrGkJkI+f583BL1A= github.com/klauspost/compress v1.15.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= @@ -983,7 +980,6 @@ github.com/libp2p/go-libp2p v0.8.1/go.mod h1:QRNH9pwdbEBpx5DTJYg+qxcVaDMAz3Ee/qD github.com/libp2p/go-libp2p v0.14.3/go.mod h1:d12V4PdKbpL0T1/gsUNN8DfgMuRPDX8bS2QxCZlwRH0= github.com/libp2p/go-libp2p v0.16.0/go.mod h1:ump42BsirwAWxKzsCiFnTtN1Yc+DuPu76fyMX364/O4= github.com/libp2p/go-libp2p v0.17.0/go.mod h1:Fkin50rsGdv5mm5BshBUtPRZknt9esfmYXBOYcwOTgw= -github.com/libp2p/go-libp2p v0.18.0/go.mod h1:+veaZ9z1SZQhmc5PW78jvnnxZ89Mgvmh4cggO11ETmw= github.com/libp2p/go-libp2p v0.22.0 h1:2Tce0kHOp5zASFKJbNzRElvh0iZwdtG5uZheNW8chIw= github.com/libp2p/go-libp2p v0.22.0/go.mod h1:UDolmweypBSjQb2f7xutPnwZ/fxioLbMBxSjRksxxU4= github.com/libp2p/go-libp2p-asn-util v0.0.0-20200825225859-85005c6cf052/go.mod h1:nRMRTab+kZuk0LnKZpxhOVH/ndsdr2Nr//Zltc/vwgo= @@ -1003,14 +999,12 @@ github.com/libp2p/go-libp2p-blankhost v0.0.1/go.mod h1:Ibpbw/7cPPYwFb7PACIWdvxxv github.com/libp2p/go-libp2p-blankhost v0.1.1/go.mod h1:pf2fvdLJPsC1FsVrNP3DUUvMzUts2dsLLBEpo1vW1ro= github.com/libp2p/go-libp2p-blankhost v0.1.4/go.mod h1:oJF0saYsAXQCSfDq254GMNmLNz6ZTHTOvtF4ZydUvwU= github.com/libp2p/go-libp2p-blankhost v0.2.0/go.mod h1:eduNKXGTioTuQAUcZ5epXi9vMl+t4d8ugUBRQ4SqaNQ= -github.com/libp2p/go-libp2p-blankhost v0.3.0 h1:kTnLArltMabZlzY63pgGDA4kkUcLkBFSM98zBssn/IY= github.com/libp2p/go-libp2p-blankhost v0.3.0/go.mod h1:urPC+7U01nCGgJ3ZsV8jdwTp6Ji9ID0dMTvq+aJ+nZU= github.com/libp2p/go-libp2p-circuit v0.0.9/go.mod h1:uU+IBvEQzCu953/ps7bYzC/D/R0Ho2A9LfKVVCatlqU= github.com/libp2p/go-libp2p-circuit v0.1.0/go.mod h1:Ahq4cY3V9VJcHcn1SBXjr78AbFkZeIRmfunbA7pmFh8= github.com/libp2p/go-libp2p-circuit v0.1.4/go.mod h1:CY67BrEjKNDhdTk8UgBX1Y/H5c3xkAcs3gnksxY7osU= github.com/libp2p/go-libp2p-circuit v0.2.1/go.mod h1:BXPwYDN5A8z4OEY9sOfr2DUQMLQvKt/6oku45YUmjIo= github.com/libp2p/go-libp2p-circuit v0.4.0/go.mod h1:t/ktoFIUzM6uLQ+o1G6NuBl2ANhBKN9Bc8jRIk31MoA= -github.com/libp2p/go-libp2p-circuit v0.6.0/go.mod h1:kB8hY+zCpMeScyvFrKrGicRdid6vNXbunKE4rXATZ0M= github.com/libp2p/go-libp2p-connmgr v0.2.4/go.mod h1:YV0b/RIm8NGPnnNWM7hG9Q38OeQiQfKhHCCs1++ufn0= github.com/libp2p/go-libp2p-connmgr v0.3.0/go.mod h1:RVoyPjJm0J9Vd1m6qUN2Tn7kJm4rL1Ml20pFsFgPGik= github.com/libp2p/go-libp2p-connmgr v0.4.0 h1:q/KZUS1iMDIQckMZarMYwhQisJqiFPHAVC1c4DR3hDE= @@ -1046,8 +1040,6 @@ github.com/libp2p/go-libp2p-core v0.10.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQR github.com/libp2p/go-libp2p-core v0.11.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= github.com/libp2p/go-libp2p-core v0.12.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= github.com/libp2p/go-libp2p-core v0.13.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= -github.com/libp2p/go-libp2p-core v0.14.0/go.mod h1:tLasfcVdTXnixsLB0QYaT1syJOhsbrhG7q6pGrHtBg8= -github.com/libp2p/go-libp2p-core v0.15.1/go.mod h1:agSaboYM4hzB1cWekgVReqV5M4g5M+2eNNejV+1EEhs= github.com/libp2p/go-libp2p-core v0.20.0 h1:PGKM74+T+O/FaZNARNW32i90RMBHCcgd/hkum2UQ5eY= github.com/libp2p/go-libp2p-core v0.20.0/go.mod h1:6zR8H7CvQWgYLsbG4on6oLNSGcyKaYFSEYyDt51+bIY= github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE= @@ -1059,8 +1051,6 @@ github.com/libp2p/go-libp2p-discovery v0.2.0/go.mod h1:s4VGaxYMbw4+4+tsoQTqh7wfx github.com/libp2p/go-libp2p-discovery v0.3.0/go.mod h1:o03drFnz9BVAZdzC/QUQ+NeQOu38Fu7LJGEOK2gQltw= github.com/libp2p/go-libp2p-discovery v0.5.0/go.mod h1:+srtPIU9gDaBNu//UHvcdliKBIcr4SfDcm0/PfPJLug= github.com/libp2p/go-libp2p-discovery v0.6.0/go.mod h1:/u1voHt0tKIe5oIA1RHBKQLVCWPna2dXmPNHc2zR9S8= -github.com/libp2p/go-libp2p-discovery v0.7.0 h1:6Iu3NyningTb/BmUnEhcTwzwbs4zcywwbfTulM9LHuc= -github.com/libp2p/go-libp2p-discovery v0.7.0/go.mod h1:zPug0Rxib1aQG9iIdwOpRpBf18cAfZgzicO826UQP4I= github.com/libp2p/go-libp2p-gostream v0.4.0 h1:heduMMEB78yBqeEQv+P7Fn5X926MHC2jDIC7/7yLpYA= github.com/libp2p/go-libp2p-gostream v0.4.0/go.mod h1:21DVGBcCQwRfEXZpCnZ2kG24QiEkBpEQvG53gYXE4u0= github.com/libp2p/go-libp2p-host v0.0.1/go.mod h1:qWd+H1yuU0m5CwzAkvbSjqKairayEHdR5MMl7Cwa7Go= @@ -1084,8 +1074,6 @@ github.com/libp2p/go-libp2p-mplex v0.2.2/go.mod h1:74S9eum0tVQdAfFiKxAyKzNdSuLqw github.com/libp2p/go-libp2p-mplex v0.2.3/go.mod h1:CK3p2+9qH9x+7ER/gWWDYJ3QW5ZxWDkm+dVvjfuG3ek= github.com/libp2p/go-libp2p-mplex v0.4.0/go.mod h1:yCyWJE2sc6TBTnFpjvLuEJgTSw/u+MamvzILKdX7asw= github.com/libp2p/go-libp2p-mplex v0.4.1/go.mod h1:cmy+3GfqfM1PceHTLL7zQzAAYaryDu6iPSC+CIb094g= -github.com/libp2p/go-libp2p-mplex v0.5.0/go.mod h1:eLImPJLkj3iG5t5lq68w3Vm5NAQ5BcKwrrb2VmOYb3M= -github.com/libp2p/go-libp2p-mplex v0.6.0/go.mod h1:i3usuPrBbh9FD2fLZjGpotyNkwr42KStYZQY7BeTiu4= github.com/libp2p/go-libp2p-nat v0.0.4/go.mod h1:N9Js/zVtAXqaeT99cXgTV9e75KpnWCvVOiGzlcHmBbY= github.com/libp2p/go-libp2p-nat v0.0.5/go.mod h1:1qubaE5bTZMJE+E/uu2URroMbzdubFz1ChgiN79yKPE= github.com/libp2p/go-libp2p-nat v0.0.6/go.mod h1:iV59LVhB3IkFvS6S6sauVTSOrNEANnINbI/fkaLimiw= @@ -1120,21 +1108,17 @@ github.com/libp2p/go-libp2p-pnet v0.2.0/go.mod h1:Qqvq6JH/oMZGwqs3N1Fqhv8NVhrdYc github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1VZNHYcK8cLgFJLZ4s= github.com/libp2p/go-libp2p-protocol v0.1.0/go.mod h1:KQPHpAabB57XQxGrXCNvbL6UEXfQqUgC/1adR2Xtflk= github.com/libp2p/go-libp2p-pubsub v0.6.0/go.mod h1:nJv87QM2cU0w45KPR1rZicq+FmFIOD16zmT+ep1nOmg= -github.com/libp2p/go-libp2p-pubsub v0.7.1 h1:e2CPBP5uxvDkE0FiS0obZGZPzt+xuBOc6PpG+50pIAo= -github.com/libp2p/go-libp2p-pubsub v0.7.1/go.mod h1:EuyBJFtF8qF67IEA98biwK8Xnw5MNJpJ/Z+8iWCMFwc= +github.com/libp2p/go-libp2p-pubsub v0.8.0 h1:KygfDpaa9AeUPGCVcpVenpXNFauDn+5kBYu3EjcL3Tg= +github.com/libp2p/go-libp2p-pubsub v0.8.0/go.mod h1:e4kT+DYjzPUYGZeWk4I+oxCSYTXizzXii5LDRRhjKSw= github.com/libp2p/go-libp2p-quic-transport v0.10.0/go.mod h1:RfJbZ8IqXIhxBRm5hqUEJqjiiY8xmEuq3HUDS993MkA= github.com/libp2p/go-libp2p-quic-transport v0.13.0/go.mod h1:39/ZWJ1TW/jx1iFkKzzUg00W6tDJh73FC0xYudjr7Hc= github.com/libp2p/go-libp2p-quic-transport v0.15.0/go.mod h1:wv4uGwjcqe8Mhjj7N/Ic0aKjA+/10UnMlSzLO0yRpYQ= github.com/libp2p/go-libp2p-quic-transport v0.15.2/go.mod h1:wv4uGwjcqe8Mhjj7N/Ic0aKjA+/10UnMlSzLO0yRpYQ= -github.com/libp2p/go-libp2p-quic-transport v0.16.0/go.mod h1:1BXjVMzr+w7EkPfiHkKnwsWjPjtfaNT0q8RS3tGDvEQ= -github.com/libp2p/go-libp2p-quic-transport v0.16.1/go.mod h1:1BXjVMzr+w7EkPfiHkKnwsWjPjtfaNT0q8RS3tGDvEQ= -github.com/libp2p/go-libp2p-quic-transport v0.17.0/go.mod h1:x4pw61P3/GRCcSLypcQJE/Q2+E9f4X+5aRcZLXf20LM= github.com/libp2p/go-libp2p-record v0.0.1/go.mod h1:grzqg263Rug/sRex85QrDOLntdFAymLDLm7lxMgU79Q= github.com/libp2p/go-libp2p-record v0.1.0/go.mod h1:ujNc8iuE5dlKWVy6wuL6dd58t0n7xI4hAIl8pE6wu5Q= github.com/libp2p/go-libp2p-record v0.1.2/go.mod h1:pal0eNcT5nqZaTV7UGhqeGqxFgGdsU/9W//C8dqjQDk= github.com/libp2p/go-libp2p-record v0.1.3 h1:R27hoScIhQf/A8XJZ8lYpnqh9LatJ5YbHs28kCIfql0= github.com/libp2p/go-libp2p-record v0.1.3/go.mod h1:yNUff/adKIfPnYQXgp6FQmNu3gLJ6EMg7+/vv2+9pY4= -github.com/libp2p/go-libp2p-resource-manager v0.1.5/go.mod h1:wJPNjeE4XQlxeidwqVY5G6DLOKqFK33u2n8blpl0I6Y= github.com/libp2p/go-libp2p-routing v0.0.1/go.mod h1:N51q3yTr4Zdr7V8Jt2JIktVU+3xBBylx1MZeVA6t1Ys= github.com/libp2p/go-libp2p-routing-helpers v0.2.3 h1:xY61alxJ6PurSi+MXbywZpelvuU4U4p/gPTxjqCqTzY= github.com/libp2p/go-libp2p-routing-helpers v0.2.3/go.mod h1:795bh+9YeoFl99rMASoiVgHdi5bjack0N1+AFAdbvBw= @@ -1152,10 +1136,6 @@ github.com/libp2p/go-libp2p-swarm v0.3.0/go.mod h1:hdv95GWCTmzkgeJpP+GK/9D9puJeg github.com/libp2p/go-libp2p-swarm v0.5.0/go.mod h1:sU9i6BoHE0Ve5SKz3y9WfKrh8dUat6JknzUehFx8xW4= github.com/libp2p/go-libp2p-swarm v0.8.0/go.mod h1:sOMp6dPuqco0r0GHTzfVheVBh6UEL0L1lXUZ5ot2Fvc= github.com/libp2p/go-libp2p-swarm v0.9.0/go.mod h1:2f8d8uxTJmpeqHF/1ujjdXZp+98nNIbujVOMEZxCbZ8= -github.com/libp2p/go-libp2p-swarm v0.10.0/go.mod h1:71ceMcV6Rg/0rIQ97rsZWMzto1l9LnNquef+efcRbmA= -github.com/libp2p/go-libp2p-swarm v0.10.2/go.mod h1:Pdkq0QU5a+qu+oyqIV3bknMsnzk9lnNyKvB9acJ5aZs= -github.com/libp2p/go-libp2p-swarm v0.11.0 h1:ITgsTEY2tA4OxFJGcWeugiMh2x5+VOEnI2JStT1EWxI= -github.com/libp2p/go-libp2p-swarm v0.11.0/go.mod h1:sumjVYrC84gPSZOFKL8hNcnN6HZvJSwJ8ymaXeko4Lk= github.com/libp2p/go-libp2p-testing v0.0.1/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= github.com/libp2p/go-libp2p-testing v0.0.2/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= github.com/libp2p/go-libp2p-testing v0.0.3/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= @@ -1169,11 +1149,7 @@ github.com/libp2p/go-libp2p-testing v0.4.2/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotl github.com/libp2p/go-libp2p-testing v0.5.0/go.mod h1:QBk8fqIL1XNcno/l3/hhaIEn4aLRijpYOR+zVjjlh+A= github.com/libp2p/go-libp2p-testing v0.6.0/go.mod h1:QBk8fqIL1XNcno/l3/hhaIEn4aLRijpYOR+zVjjlh+A= github.com/libp2p/go-libp2p-testing v0.6.1-0.20211213091545-6aa944478bd3/go.mod h1:KB5rnDAM6eNBajC8qYV6hUvBaqIH0w0plTDA5yV9QlA= -github.com/libp2p/go-libp2p-testing v0.7.0/go.mod h1:OLbdn9DbgdMwv00v+tlp1l3oe2Cl+FAjoWIA2pa0X6E= -github.com/libp2p/go-libp2p-testing v0.8.0/go.mod h1:gRdsNxQSxAZowTgcLY7CC33xPmleZzoBpqSYbWenqPc= -github.com/libp2p/go-libp2p-testing v0.9.0/go.mod h1:Td7kbdkWqYTJYQGTwzlgXwaqldraIanyjuRiAbK/XQU= github.com/libp2p/go-libp2p-testing v0.12.0 h1:EPvBb4kKMWO29qP4mZGyhVzUyR25dvfUIK5WDu6iPUA= -github.com/libp2p/go-libp2p-testing v0.12.0/go.mod h1:KcGDRXyN7sQCllucn1cOOS+Dmm7ujhfEyXQL5lvkcPg= github.com/libp2p/go-libp2p-tls v0.1.3/go.mod h1:wZfuewxOndz5RTnCAxFliGjvYSDA40sKitV4c50uI1M= github.com/libp2p/go-libp2p-tls v0.3.0/go.mod h1:fwF5X6PWGxm6IDRwF3V8AVCCj/hOd5oFlg+wo2FxJDY= github.com/libp2p/go-libp2p-tls v0.3.1/go.mod h1:fwF5X6PWGxm6IDRwF3V8AVCCj/hOd5oFlg+wo2FxJDY= @@ -1189,8 +1165,6 @@ github.com/libp2p/go-libp2p-transport-upgrader v0.4.2/go.mod h1:NR8ne1VwfreD5VIW github.com/libp2p/go-libp2p-transport-upgrader v0.4.3/go.mod h1:bpkldbOWXMrXhpZbSV1mQxTrefOg2Fi+k1ClDSA4ppw= github.com/libp2p/go-libp2p-transport-upgrader v0.5.0/go.mod h1:Rc+XODlB3yce7dvFV4q/RmyJGsFcCZRkeZMu/Zdg0mo= github.com/libp2p/go-libp2p-transport-upgrader v0.6.0/go.mod h1:1e07y1ZSZdHo9HPbuU8IztM1Cj+DR5twgycb4pnRzRo= -github.com/libp2p/go-libp2p-transport-upgrader v0.7.0/go.mod h1:GIR2aTRp1J5yjVlkUoFqMkdobfob6RnAwYg/RZPhrzg= -github.com/libp2p/go-libp2p-transport-upgrader v0.7.1/go.mod h1:GIR2aTRp1J5yjVlkUoFqMkdobfob6RnAwYg/RZPhrzg= github.com/libp2p/go-libp2p-yamux v0.1.2/go.mod h1:xUoV/RmYkg6BW/qGxA9XJyg+HzXFYkeXbnhjmnYzKp8= github.com/libp2p/go-libp2p-yamux v0.1.3/go.mod h1:VGSQVrqkh6y4nm0189qqxMtvyBft44MOYYPpYKXiVt4= github.com/libp2p/go-libp2p-yamux v0.2.0/go.mod h1:Db2gU+XfLpm6E4rG5uGCFX6uXA8MEXOxFcRoXUODaK8= @@ -1204,9 +1178,6 @@ github.com/libp2p/go-libp2p-yamux v0.5.0/go.mod h1:AyR8k5EzyM2QN9Bbdg6X1SkVVuqLw github.com/libp2p/go-libp2p-yamux v0.5.4/go.mod h1:tfrXbyaTqqSU654GTvK3ocnSZL3BuHoeTSqhcel1wsE= github.com/libp2p/go-libp2p-yamux v0.6.0/go.mod h1:MRhd6mAYnFRnSISp4M8i0ClV/j+mWHo2mYLifWGw33k= github.com/libp2p/go-libp2p-yamux v0.7.0/go.mod h1:fMyA0CsPfHkIuBU0wjRGrCjTBFiXTXxG0k5M4ETv+08= -github.com/libp2p/go-libp2p-yamux v0.8.0/go.mod h1:yTkPgN2ib8FHyU1ZcVD7aelzyAqXXwEPbyx+aSKm9h8= -github.com/libp2p/go-libp2p-yamux v0.8.1/go.mod h1:rUozF8Jah2dL9LLGyBaBeTQeARdwhefMCTQVQt6QobE= -github.com/libp2p/go-libp2p-yamux v0.8.2/go.mod h1:rUozF8Jah2dL9LLGyBaBeTQeARdwhefMCTQVQt6QobE= github.com/libp2p/go-maddr-filter v0.0.1/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= github.com/libp2p/go-maddr-filter v0.0.4/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= github.com/libp2p/go-maddr-filter v0.0.5/go.mod h1:Jk+36PMfIqCJhAnaASRH83bdAvfDRp/w6ENFaC9bG+M= @@ -1219,8 +1190,6 @@ github.com/libp2p/go-mplex v0.1.1/go.mod h1:Xgz2RDCi3co0LeZfgjm4OgUF15+sVR8SRcu3 github.com/libp2p/go-mplex v0.1.2/go.mod h1:Xgz2RDCi3co0LeZfgjm4OgUF15+sVR8SRcu3SFXI1lk= github.com/libp2p/go-mplex v0.2.0/go.mod h1:0Oy/A9PQlwBytDRp4wSkFnzHYDKcpLot35JQ6msjvYQ= github.com/libp2p/go-mplex v0.3.0/go.mod h1:0Oy/A9PQlwBytDRp4wSkFnzHYDKcpLot35JQ6msjvYQ= -github.com/libp2p/go-mplex v0.4.0/go.mod h1:y26Lx+wNVtMYMaPu300Cbot5LkEZ4tJaNYeHeT9dh6E= -github.com/libp2p/go-mplex v0.6.0/go.mod h1:y26Lx+wNVtMYMaPu300Cbot5LkEZ4tJaNYeHeT9dh6E= github.com/libp2p/go-msgio v0.0.2/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= github.com/libp2p/go-msgio v0.0.3/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= github.com/libp2p/go-msgio v0.0.4/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= @@ -1263,15 +1232,12 @@ github.com/libp2p/go-stream-muxer v0.1.0/go.mod h1:8JAVsjeRBCWwPoZeH0W1imLOcriqX github.com/libp2p/go-stream-muxer-multistream v0.1.1/go.mod h1:zmGdfkQ1AzOECIAcccoL8L//laqawOsO03zX8Sa+eGw= github.com/libp2p/go-stream-muxer-multistream v0.2.0/go.mod h1:j9eyPol/LLRqT+GPLSxvimPhNph4sfYfMoDPd7HkzIc= github.com/libp2p/go-stream-muxer-multistream v0.3.0/go.mod h1:yDh8abSIzmZtqtOt64gFJUXEryejzNb0lisTt+fAMJA= -github.com/libp2p/go-stream-muxer-multistream v0.4.0/go.mod h1:nb+dGViZleRP4XcyHuZSVrJCBl55nRBOMmiSL/dyziw= github.com/libp2p/go-tcp-transport v0.0.4/go.mod h1:+E8HvC8ezEVOxIo3V5vCK9l1y/19K427vCzQ+xHKH/o= github.com/libp2p/go-tcp-transport v0.1.0/go.mod h1:oJ8I5VXryj493DEJ7OsBieu8fcg2nHGctwtInJVpipc= github.com/libp2p/go-tcp-transport v0.1.1/go.mod h1:3HzGvLbx6etZjnFlERyakbaYPdfjg2pWP97dFZworkY= github.com/libp2p/go-tcp-transport v0.2.0/go.mod h1:vX2U0CnWimU4h0SGSEsg++AzvBcroCGYw28kh94oLe0= github.com/libp2p/go-tcp-transport v0.2.3/go.mod h1:9dvr03yqrPyYGIEN6Dy5UvdJZjyPFvl1S/igQ5QD1SU= github.com/libp2p/go-tcp-transport v0.4.0/go.mod h1:0y52Rwrn4076xdJYu/51/qJIdxz+EWDAOG2S45sV3VI= -github.com/libp2p/go-tcp-transport v0.5.0/go.mod h1:UPPL0DIjQqiWRwVAb+CEQlaAG0rp/mCqJfIhFcLHc4Y= -github.com/libp2p/go-tcp-transport v0.5.1/go.mod h1:UPPL0DIjQqiWRwVAb+CEQlaAG0rp/mCqJfIhFcLHc4Y= github.com/libp2p/go-testutil v0.0.1/go.mod h1:iAcJc/DKJQanJ5ws2V+u5ywdL2n12X1WbbEG+Jjy69I= github.com/libp2p/go-testutil v0.1.0/go.mod h1:81b2n5HypcVyrCg/MJx4Wgfp/VHojytjVe/gLzZ2Ehc= github.com/libp2p/go-ws-transport v0.0.5/go.mod h1:Qbl4BxPfXXhhd/o0wcrgoaItHqA9tnZjoFZnxykuaXU= @@ -1280,7 +1246,6 @@ github.com/libp2p/go-ws-transport v0.2.0/go.mod h1:9BHJz/4Q5A9ludYWKoGCFC5gUElzl github.com/libp2p/go-ws-transport v0.3.0/go.mod h1:bpgTJmRZAvVHrgHybCVyqoBmyLQ1fiZuEaBYusP5zsk= github.com/libp2p/go-ws-transport v0.4.0/go.mod h1:EcIEKqf/7GDjth6ksuS/6p7R49V4CBY6/E7R/iyhYUA= github.com/libp2p/go-ws-transport v0.5.0/go.mod h1:I2juo1dNTbl8BKSBYo98XY85kU2xds1iamArLvl8kNg= -github.com/libp2p/go-ws-transport v0.6.0/go.mod h1:dXqtI9e2JV9FtF1NOtWVZSKXh5zXvnuwPXfj8GPBbYU= github.com/libp2p/go-yamux v1.2.1/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/libp2p/go-yamux v1.2.2/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/libp2p/go-yamux v1.2.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= @@ -1292,8 +1257,6 @@ github.com/libp2p/go-yamux v1.4.0/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/h github.com/libp2p/go-yamux v1.4.1/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= github.com/libp2p/go-yamux/v2 v2.2.0/go.mod h1:3So6P6TV6r75R9jiBpiIKgU/66lOarCZjqROGxzPpPQ= github.com/libp2p/go-yamux/v2 v2.3.0/go.mod h1:iTU+lOIn/2h0AgKcL49clNTwfEw+WSfDYrXe05EyKIs= -github.com/libp2p/go-yamux/v3 v3.0.1/go.mod h1:s2LsDhHbh+RfCsQoICSYt58U2f8ijtPANFD8BmE74Bo= -github.com/libp2p/go-yamux/v3 v3.0.2/go.mod h1:s2LsDhHbh+RfCsQoICSYt58U2f8ijtPANFD8BmE74Bo= github.com/libp2p/go-yamux/v3 v3.1.2 h1:lNEy28MBk1HavUAlzKgShp+F6mn/ea1nDYWftZhFW9Q= github.com/libp2p/go-yamux/v3 v3.1.2/go.mod h1:jeLEQgLXqE2YqX1ilAClIfCMDY+0uXQUKmmb/qp0gT4= github.com/libp2p/zeroconf/v2 v2.1.1/go.mod h1:fuJqLnUwZTshS3U/bMRJ3+ow/v9oid1n0DmyYyNO1Xs= @@ -1302,8 +1265,6 @@ github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0U github.com/lucas-clemente/quic-go v0.19.3/go.mod h1:ADXpNbTQjq1hIzCpB+y/k5iz4n4z4IwqoLb94Kh5Hu8= github.com/lucas-clemente/quic-go v0.23.0/go.mod h1:paZuzjXCE5mj6sikVLMvqXk8lJV2AsqtJ6bDhjEfxx0= github.com/lucas-clemente/quic-go v0.24.0/go.mod h1:paZuzjXCE5mj6sikVLMvqXk8lJV2AsqtJ6bDhjEfxx0= -github.com/lucas-clemente/quic-go v0.25.0/go.mod h1:YtzP8bxRVCBlO77yRanE264+fY/T2U9ZlW1AaHOsMOg= -github.com/lucas-clemente/quic-go v0.27.0/go.mod h1:AzgQoPda7N+3IqMMMkywBKggIFo2KT6pfnlrQ2QieeI= github.com/lucas-clemente/quic-go v0.28.1 h1:Uo0lvVxWg5la9gflIF9lwa39ONq85Xq2D91YNEIslzU= github.com/lucas-clemente/quic-go v0.28.1/go.mod h1:oGz5DKK41cJt5+773+BSO9BXDsREY4HLf7+0odGAPO0= github.com/lucasb-eyer/go-colorful v1.0.3 h1:QIbQXiugsb+q10B+MI+7DI1oQLdmnep86tWFlaaUAac= @@ -1329,11 +1290,8 @@ github.com/marten-seemann/qtls-go1-16 v0.1.4/go.mod h1:gNpI2Ol+lRS3WwSOtIUUtRwZE github.com/marten-seemann/qtls-go1-16 v0.1.5 h1:o9JrYPPco/Nukd/HpOHMHZoBDXQqoNtUCmny98/1uqQ= github.com/marten-seemann/qtls-go1-16 v0.1.5/go.mod h1:gNpI2Ol+lRS3WwSOtIUUtRwZEQMXjYK+dQSBFbethAk= github.com/marten-seemann/qtls-go1-17 v0.1.0/go.mod h1:fz4HIxByo+LlWcreM4CZOYNuz3taBQ8rN2X6FqvaWo8= -github.com/marten-seemann/qtls-go1-17 v0.1.1/go.mod h1:C2ekUKcDdz9SDWxec1N/MvcXBpaX9l3Nx67XaR84L5s= github.com/marten-seemann/qtls-go1-17 v0.1.2 h1:JADBlm0LYiVbuSySCHeY863dNkcpMmDR7s0bLKJeYlQ= github.com/marten-seemann/qtls-go1-17 v0.1.2/go.mod h1:C2ekUKcDdz9SDWxec1N/MvcXBpaX9l3Nx67XaR84L5s= -github.com/marten-seemann/qtls-go1-18 v0.1.0-beta.1/go.mod h1:PUhIQk19LoFt2174H4+an8TYvWOGjb/hHwphBeaDHwI= -github.com/marten-seemann/qtls-go1-18 v0.1.1/go.mod h1:mJttiymBAByA49mhlNZZGrH5u1uXYZJ+RW28Py7f4m4= github.com/marten-seemann/qtls-go1-18 v0.1.2 h1:JH6jmzbduz0ITVQ7ShevK10Av5+jBEKAHMntXmIV7kM= github.com/marten-seemann/qtls-go1-18 v0.1.2/go.mod h1:mJttiymBAByA49mhlNZZGrH5u1uXYZJ+RW28Py7f4m4= github.com/marten-seemann/qtls-go1-19 v0.1.0-beta.1/go.mod h1:5HTDWtVudo/WFsHKRNuOhWlbdjrfs5JHrYb0wIJqGpI= @@ -1432,8 +1390,6 @@ github.com/multiformats/go-multiaddr v0.3.0/go.mod h1:dF9kph9wfJ+3VLAaeBqo9Of8x4 github.com/multiformats/go-multiaddr v0.3.1/go.mod h1:uPbspcUPd5AfaP6ql3ujFY+QWzmBD8uLLL4bXW0XfGc= github.com/multiformats/go-multiaddr v0.3.3/go.mod h1:lCKNGP1EQ1eZ35Za2wlqnabm9xQkib3fyB+nZXHLag0= github.com/multiformats/go-multiaddr v0.4.0/go.mod h1:YcpyLH8ZPudLxQlemYBPhSm0/oCXAT8Z4mzFpyoPyRc= -github.com/multiformats/go-multiaddr v0.4.1/go.mod h1:3afI9HfVW8csiF8UZqtpYRiDyew8pRX7qLIGHu9FLuM= -github.com/multiformats/go-multiaddr v0.5.0/go.mod h1:3KAxNkUqLTJ20AAwN4XVX4kZar+bR+gh4zgbfr3SNug= github.com/multiformats/go-multiaddr v0.6.0 h1:qMnoOPj2s8xxPU5kZ57Cqdr0hHhARz7mFsPMIiYNqzg= github.com/multiformats/go-multiaddr v0.6.0/go.mod h1:F4IpaKZuPP360tOMn2Tpyu0At8w23aRyVqeK0DbFeGM= github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= @@ -1459,7 +1415,6 @@ github.com/multiformats/go-multibase v0.1.1/go.mod h1:ZEjHE+IsUrgp5mhlEAYjMtZwK1 github.com/multiformats/go-multicodec v0.3.0/go.mod h1:qGGaQmioCDh+TeFOnxrbU0DaIPw8yFgAZgFG0V7p1qQ= github.com/multiformats/go-multicodec v0.3.1-0.20210902112759-1539a079fd61/go.mod h1:1Hj/eHRaVWSXiSNNfcEPcwZleTmdNP81xlxDLnWU9GQ= github.com/multiformats/go-multicodec v0.3.1-0.20211210143421-a526f306ed2c/go.mod h1:1Hj/eHRaVWSXiSNNfcEPcwZleTmdNP81xlxDLnWU9GQ= -github.com/multiformats/go-multicodec v0.4.1/go.mod h1:1Hj/eHRaVWSXiSNNfcEPcwZleTmdNP81xlxDLnWU9GQ= github.com/multiformats/go-multicodec v0.5.0 h1:EgU6cBe/D7WRwQb1KmnBvU7lrcFGMggZVTPtOW9dDHs= github.com/multiformats/go-multicodec v0.5.0/go.mod h1:DiY2HFaEp5EhEXb/iYzVAunmyX/aSFMxq2KMKfWEues= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= From 964bbca79284aee07cd09d192872ab0c24e4ef36 Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Mon, 29 Aug 2022 10:22:37 +0200 Subject: [PATCH 085/185] fix: DataCid - ensure reader is closed --- go.sum | 1 - storage/sealer/ffiwrapper/sealer_cgo.go | 10 ++++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/go.sum b/go.sum index db7c42195..a73d561e1 100644 --- a/go.sum +++ b/go.sum @@ -340,7 +340,6 @@ github.com/filecoin-project/go-state-types v0.0.0-20201102161440-c8033295a1fc/go github.com/filecoin-project/go-state-types v0.1.0/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.6/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q= github.com/filecoin-project/go-state-types v0.1.8/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q= -github.com/filecoin-project/go-state-types v0.1.10/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q= github.com/filecoin-project/go-state-types v0.1.11 h1:QzKUILRGa9gjJKPCiFlvCfcDGK2IqtJ6CpRQULvZZpA= github.com/filecoin-project/go-state-types v0.1.11/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q= github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig= diff --git a/storage/sealer/ffiwrapper/sealer_cgo.go b/storage/sealer/ffiwrapper/sealer_cgo.go index 4ed77375a..cf4eddff0 100644 --- a/storage/sealer/ffiwrapper/sealer_cgo.go +++ b/storage/sealer/ffiwrapper/sealer_cgo.go @@ -53,6 +53,16 @@ func (sb *Sealer) NewSector(ctx context.Context, sector storiface.SectorRef) err } func (sb *Sealer) DataCid(ctx context.Context, pieceSize abi.UnpaddedPieceSize, pieceData storiface.Data) (abi.PieceInfo, error) { + origPieceData := pieceData + defer func() { + closer, ok := origPieceData.(io.Closer) + if !ok { + log.Warnf("DataCid: cannot close pieceData reader %T because it is not an io.Closer", origPieceData) + return + } + closer.Close() //nolint:errcheck + }() + pieceData = io.LimitReader(io.MultiReader( pieceData, nullreader.Reader{}, From e4ed3f8cf868afd50eb09e17943022af262e335f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 29 Aug 2022 15:57:58 +0200 Subject: [PATCH 086/185] sealing: fix: Make DataCid resource env vars make more sense --- storage/sealer/sealtasks/task.go | 5 +++ storage/sealer/storiface/resources.go | 50 +++++++++++++--------- storage/sealer/storiface/resources_test.go | 46 +++++++++++++++++++- 3 files changed, 80 insertions(+), 21 deletions(-) diff --git a/storage/sealer/sealtasks/task.go b/storage/sealer/sealtasks/task.go index 061e84c7f..53aa1cbc7 100644 --- a/storage/sealer/sealtasks/task.go +++ b/storage/sealer/sealtasks/task.go @@ -96,6 +96,11 @@ func (a TaskType) WorkerType() string { } } +// SectorSized returns true if the task operates on a specific sector size +func (a TaskType) SectorSized() bool { + return a != TTDataCid +} + func (a TaskType) MuchLess(b TaskType) (bool, bool) { oa, ob := order[a], order[b] oneNegative := oa^ob < 0 diff --git a/storage/sealer/storiface/resources.go b/storage/sealer/storiface/resources.go index f3a658e34..98becd93a 100644 --- a/storage/sealer/storiface/resources.go +++ b/storage/sealer/storiface/resources.go @@ -6,6 +6,7 @@ import ( "strconv" "strings" + logging "github.com/ipfs/go-log/v2" "golang.org/x/xerrors" "github.com/filecoin-project/go-state-types/abi" @@ -13,6 +14,8 @@ import ( "github.com/filecoin-project/lotus/storage/sealer/sealtasks" ) +var log = logging.Logger("resources") + type Resources struct { MinMemory uint64 `envname:"MIN_MEMORY"` // What Must be in RAM for decent perf MaxMemory uint64 `envname:"MAX_MEMORY"` // Memory required (swap + ram; peak memory usage during task execution) @@ -32,16 +35,14 @@ type Resources struct { } /* +Percent of threads to allocate to parallel tasks - Percent of threads to allocate to parallel tasks - - 12 * 0.92 = 11 - 16 * 0.92 = 14 - 24 * 0.92 = 22 - 32 * 0.92 = 29 - 64 * 0.92 = 58 - 128 * 0.92 = 117 - +12 * 0.92 = 11 +16 * 0.92 = 14 +24 * 0.92 = 22 +32 * 0.92 = 29 +64 * 0.92 = 58 +128 * 0.92 = 117 */ var ParallelNum uint64 = 92 var ParallelDenom uint64 = 100 @@ -610,20 +611,29 @@ func ParseResourceEnv(lookup func(key, def string) (string, bool)) (map[sealtask envval, found := lookup(taskType.Short()+"_"+shortSize+"_"+envname, fmt.Sprint(rr.Elem().Field(i).Interface())) if !found { - // special multicore SDR handling - if (taskType == sealtasks.TTPreCommit1 || taskType == sealtasks.TTUnseal) && envname == "MAX_PARALLELISM" { - v, ok := rr.Elem().Field(i).Addr().Interface().(*int) - if !ok { - // can't happen, but let's not panic - return nil, xerrors.Errorf("res.MAX_PARALLELISM is not int (!?): %w", err) - } - *v, err = getSDRThreads(lookup) - if err != nil { - return nil, err + // see if a non-size-specific envvar is set + envval, found = lookup(taskType.Short()+"_"+envname, fmt.Sprint(rr.Elem().Field(i).Interface())) + if !found { + // special multicore SDR handling + if (taskType == sealtasks.TTPreCommit1 || taskType == sealtasks.TTUnseal) && envname == "MAX_PARALLELISM" { + v, ok := rr.Elem().Field(i).Addr().Interface().(*int) + if !ok { + // can't happen, but let's not panic + return nil, xerrors.Errorf("res.MAX_PARALLELISM is not int (!?): %w", err) + } + *v, err = getSDRThreads(lookup) + if err != nil { + return nil, err + } } + + continue } - continue + } else { + if !taskType.SectorSized() { + log.Errorw("sector-size independent task resource var specified with sector-sized envvar", "env", taskType.Short()+"_"+shortSize+"_"+envname, "use", taskType.Short()+"_"+envname) + } } v := rr.Elem().Field(i).Addr().Interface() diff --git a/storage/sealer/storiface/resources_test.go b/storage/sealer/storiface/resources_test.go index 1040ef96e..e360b8d14 100644 --- a/storage/sealer/storiface/resources_test.go +++ b/storage/sealer/storiface/resources_test.go @@ -12,9 +12,12 @@ import ( ) func TestListResourceVars(t *testing.T) { + seen := map[string]struct{}{} _, err := ParseResourceEnv(func(key, def string) (string, bool) { - if def != "" { + _, s := seen[key] + if !s && def != "" { fmt.Printf("%s=%s\n", key, def) + seen[key] = struct{}{} } return "", false @@ -75,3 +78,44 @@ func TestListResourceSDRMulticoreOverride(t *testing.T) { require.Equal(t, 9001, rt[sealtasks.TTPreCommit1][stabi.RegisteredSealProof_StackedDrg2KiBV1_1].MaxParallelism) require.Equal(t, 9001, rt[sealtasks.TTUnseal][stabi.RegisteredSealProof_StackedDrg2KiBV1_1].MaxParallelism) } + +func TestUnsizedSetAll(t *testing.T) { + rt, err := ParseResourceEnv(func(key, def string) (string, bool) { + if key == "UNS_MAX_PARALLELISM" { + return "2", true + } + + return "", false + }) + + require.NoError(t, err) + require.Equal(t, 2, rt[sealtasks.TTUnseal][stabi.RegisteredSealProof_StackedDrg2KiBV1_1].MaxParallelism) + require.Equal(t, 2, rt[sealtasks.TTUnseal][stabi.RegisteredSealProof_StackedDrg32GiBV1].MaxParallelism) + require.Equal(t, 2, rt[sealtasks.TTUnseal][stabi.RegisteredSealProof_StackedDrg8MiBV1].MaxParallelism) + + // check that defaults don't get mutated + require.Equal(t, 1, ResourceTable[sealtasks.TTUnseal][stabi.RegisteredSealProof_StackedDrg2KiBV1_1].MaxParallelism) +} + +func TestUnsizedNotPreferred(t *testing.T) { + rt, err := ParseResourceEnv(func(key, def string) (string, bool) { + if key == "DC_MAX_PARALLELISM" { + return "2", true + } + + // test should also print a warning for DataCid as it's not sector-size dependent + if key == "DC_64G_MAX_PARALLELISM" { + return "1", true + } + + return "", false + }) + + require.NoError(t, err) + require.Equal(t, 2, rt[sealtasks.TTDataCid][stabi.RegisteredSealProof_StackedDrg2KiBV1_1].MaxParallelism) + require.Equal(t, 2, rt[sealtasks.TTDataCid][stabi.RegisteredSealProof_StackedDrg32GiBV1].MaxParallelism) + require.Equal(t, 1, rt[sealtasks.TTDataCid][stabi.RegisteredSealProof_StackedDrg64GiBV1_1].MaxParallelism) + + // check that defaults don't get mutated + require.Equal(t, 1, ResourceTable[sealtasks.TTUnseal][stabi.RegisteredSealProof_StackedDrg2KiBV1_1].MaxParallelism) +} From c51283223d29dc85d847abc8935946194487c110 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 29 Aug 2022 16:03:03 +0200 Subject: [PATCH 087/185] mod tidy --- go.sum | 1 - 1 file changed, 1 deletion(-) diff --git a/go.sum b/go.sum index db7c42195..a73d561e1 100644 --- a/go.sum +++ b/go.sum @@ -340,7 +340,6 @@ github.com/filecoin-project/go-state-types v0.0.0-20201102161440-c8033295a1fc/go github.com/filecoin-project/go-state-types v0.1.0/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.6/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q= github.com/filecoin-project/go-state-types v0.1.8/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q= -github.com/filecoin-project/go-state-types v0.1.10/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q= github.com/filecoin-project/go-state-types v0.1.11 h1:QzKUILRGa9gjJKPCiFlvCfcDGK2IqtJ6CpRQULvZZpA= github.com/filecoin-project/go-state-types v0.1.11/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q= github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig= From d00e1e78bb5180a1ad44d821ba860459edc874cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 29 Aug 2022 16:12:02 +0200 Subject: [PATCH 088/185] resources: Use 32G AP resources for DC --- storage/sealer/storiface/resources.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/storage/sealer/storiface/resources.go b/storage/sealer/storiface/resources.go index 98becd93a..0ac089c23 100644 --- a/storage/sealer/storiface/resources.go +++ b/storage/sealer/storiface/resources.go @@ -573,7 +573,11 @@ var ResourceTable = map[sealtasks.TaskType]map[abi.RegisteredSealProof]Resources func init() { ResourceTable[sealtasks.TTUnseal] = ResourceTable[sealtasks.TTPreCommit1] // TODO: measure accurately ResourceTable[sealtasks.TTRegenSectorKey] = ResourceTable[sealtasks.TTReplicaUpdate] - ResourceTable[sealtasks.TTDataCid] = ResourceTable[sealtasks.TTAddPiece] + + // DataCid doesn't care about sector proof type; Use 32G AddPiece resource definition + for proof := range ResourceTable[sealtasks.TTAddPiece] { + ResourceTable[sealtasks.TTDataCid][proof] = ResourceTable[sealtasks.TTAddPiece][abi.RegisteredSealProof_StackedDrg32GiBV1] + } // V1_1 is the same as V1 for _, m := range ResourceTable { From 08b22edd89ea8365d8126b004b8ab7999f868a6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 29 Aug 2022 16:25:30 +0200 Subject: [PATCH 089/185] fix make gen --- api/api_test.go | 2 +- api/proxy_util_test.go | 2 +- blockstore/badger/blockstore_test.go | 2 +- blockstore/badger/blockstore_test_suite.go | 2 +- blockstore/splitstore/markset_test.go | 2 +- blockstore/splitstore/splitstore_compact.go | 1 + blockstore/splitstore/splitstore_test.go | 2 +- blockstore/timed_test.go | 2 +- blockstore/union.go | 7 +- blockstore/union_test.go | 2 +- build/openrpc/miner.json.gz | Bin 15221 -> 15263 bytes build/openrpc/worker.json.gz | Bin 5036 -> 5077 bytes build/openrpc_test.go | 2 +- build/params_testground.go | 1 - chain/actors/adt/diff_adt.go | 2 +- chain/actors/adt/diff_adt_test.go | 2 +- chain/actors/aerrors/error_test.go | 2 +- chain/actors/policy/policy_test.go | 2 +- chain/beacon/drand/drand_test.go | 4 +- chain/events/events_called.go | 83 +++++++++--------- chain/events/events_test.go | 2 +- chain/events/state/predicates_test.go | 2 +- chain/events/tscache_test.go | 2 +- chain/exchange/doc.go | 4 +- chain/exchange/protocol.go | 18 ++-- chain/gen/gen_test.go | 2 +- chain/market/fundmanager_test.go | 2 +- chain/messagepool/block_proba_test.go | 2 +- chain/messagepool/check_test.go | 2 +- chain/messagepool/messagepool.go | 6 +- chain/messagepool/messagepool_test.go | 2 +- chain/messagepool/repub_test.go | 2 +- chain/messagepool/selection_test.go | 2 +- chain/messagesigner/messagesigner_test.go | 2 +- chain/rand/rand_test.go | 2 +- chain/state/statetree_test.go | 2 +- chain/stmgr/call.go | 6 +- chain/stmgr/forks.go | 12 +-- chain/stmgr/forks_test.go | 2 +- chain/stmgr/searchwait_test.go | 2 +- chain/store/checkpoint_test.go | 2 +- chain/store/coalescer.go | 13 ++- chain/store/coalescer_test.go | 2 +- chain/store/index_test.go | 2 +- chain/store/store.go | 9 +- chain/store/store_test.go | 2 +- chain/sub/incoming.go | 7 +- chain/sub/incoming_test.go | 2 +- chain/sync.go | 28 +++--- chain/sync_manager_test.go | 2 +- chain/sync_test.go | 2 +- chain/types/bigint_test.go | 2 +- chain/types/blockheader_test.go | 2 +- chain/types/electionproof_test.go | 2 +- chain/types/fil_test.go | 2 +- chain/types/message_test.go | 2 +- chain/types/signature_test.go | 2 +- chain/types/tipset.go | 10 +-- chain/types/tipset_key_test.go | 2 +- chain/types/types_test.go | 2 +- chain/types_test.go | 2 +- chain/vectors/vectors_test.go | 2 +- chain/vm/burn_test.go | 2 +- chain/vm/gas_v0_test.go | 2 +- chain/vm/invoker_test.go | 2 +- chain/vm/runtime_test.go | 2 +- chain/wallet/multi_test.go | 2 +- chain/wallet/wallet_test.go | 2 +- cli/chain_test.go | 2 +- cli/mpool_test.go | 2 +- cli/send_test.go | 4 +- cli/services_send_test.go | 4 +- cli/sync_test.go | 2 +- cli/wallet_test.go | 2 +- cmd/lotus-bench/stats_test.go | 2 +- cmd/lotus-fountain/rate_limiter_test.go | 2 +- cmd/lotus-health/main_test.go | 2 +- cmd/lotus-miner/actor_test.go | 2 +- cmd/lotus-miner/allinfo_test.go | 2 +- .../simulation/stages/commit_queue_test.go | 2 +- .../simulation/stages/funding_stage.go | 8 +- cmd/lotus-sim/simulation/step.go | 8 +- cmd/tvx/codenames_test.go | 2 +- conformance/chaos/actor.go | 8 +- conformance/chaos/actor_test.go | 2 +- conformance/corpus_test.go | 2 +- conformance/driver.go | 3 +- documentation/en/api-v0-methods-miner.md | 40 ++++----- documentation/en/api-v0-methods-worker.md | 40 ++++----- gateway/node_test.go | 2 +- itests/api_test.go | 2 +- itests/batch_deal_test.go | 2 +- itests/ccupgrade_test.go | 2 +- itests/cli_test.go | 2 +- itests/deadlines_test.go | 2 +- itests/deals_512mb_test.go | 2 +- itests/deals_concurrent_test.go | 2 +- itests/deals_max_staging_deals_test.go | 2 +- itests/deals_offline_test.go | 2 +- itests/deals_padding_test.go | 2 +- .../deals_partial_retrieval_dm-level_test.go | 2 +- itests/deals_partial_retrieval_test.go | 2 +- itests/deals_power_test.go | 2 +- itests/deals_pricing_test.go | 2 +- itests/deals_publish_test.go | 2 +- itests/deals_retry_deal_no_funds_test.go | 2 +- itests/deals_test.go | 2 +- itests/gateway_test.go | 2 +- itests/get_messages_in_ts_test.go | 2 +- itests/kit/circuit.go | 6 +- itests/kit/ensemble.go | 21 +++-- itests/mempool_test.go | 2 +- itests/multisig_test.go | 2 +- itests/net_test.go | 2 +- itests/nonce_test.go | 2 +- itests/paych_api_test.go | 2 +- itests/paych_cli_test.go | 2 +- itests/sdr_upgrade_test.go | 2 +- itests/sector_finalize_early_test.go | 2 +- itests/sector_miner_collateral_test.go | 2 +- itests/sector_pledge_test.go | 2 +- itests/sector_terminate_test.go | 2 +- itests/self_sent_txn_test.go | 2 +- itests/splitstore_test.go | 2 +- itests/tape_test.go | 2 +- itests/verifreg_test.go | 2 +- itests/wdpost_dispute_test.go | 2 +- itests/wdpost_test.go | 2 +- journal/alerting/alerts_test.go | 2 +- journal/registry_test.go | 2 +- lib/backupds/backupds_test.go | 2 +- lib/oldpath/oldresolver/resolver.go | 3 +- lib/oldpath/path.go | 8 +- lib/rpcenc/reader_test.go | 2 +- lib/sigs/bls/bls_bench_test.go | 2 +- lib/sigs/bls/bls_test.go | 2 +- lib/stati/stats_test.go | 2 +- lib/tablewriter/tablewiter_test.go | 2 +- lib/tablewriter/tablewriter.go | 3 +- lib/unixfs/filestore_test.go | 2 +- markets/dagstore/miner_api_test.go | 2 +- markets/dagstore/mount_test.go | 2 +- markets/dagstore/wrapper_migration_test.go | 2 +- markets/dagstore/wrapper_test.go | 2 +- markets/retrievaladapter/provider_test.go | 2 +- markets/storageadapter/dealpublisher_test.go | 2 +- .../storageadapter/dealstatematcher_test.go | 2 +- .../ondealsectorcommitted_test.go | 2 +- miner/miner.go | 42 ++++----- node/builder.go | 4 +- node/config/def_test.go | 2 +- node/config/load_test.go | 2 +- node/impl/client/client_test.go | 2 +- node/impl/full/gas_test.go | 2 +- node/repo/fsrepo_test.go | 2 +- node/repo/memrepo_test.go | 2 +- node/repo/repo_test.go | 2 +- node/shutdown_test.go | 2 +- paychmgr/paych_test.go | 2 +- paychmgr/paychget_test.go | 2 +- paychmgr/settle_test.go | 2 +- paychmgr/store_test.go | 2 +- storage/paths/remote_test.go | 2 +- storage/pipeline/checks.go | 6 +- storage/pipeline/commit_batch_test.go | 2 +- storage/pipeline/precommit_batch_test.go | 2 +- storage/pipeline/states_failed_test.go | 2 +- storage/sealer/ffiwrapper/sealer_test.go | 1 - storage/sealer/ffiwrapper/unseal_ranges.go | 3 +- storage/sealer/manager_test.go | 2 +- storage/sealer/sched_test.go | 2 +- storage/sealer/storiface/index.go | 3 +- storage/sealer/storiface/resources.go | 1 + storage/wdpost/wdpost_changehandler_test.go | 2 +- storage/wdpost/wdpost_nextdl_test.go | 2 +- storage/wdpost/wdpost_run_faults.go | 10 ++- storage/wdpost/wdpost_run_test.go | 2 +- testplans/lotus-soup/paych/stress.go | 3 +- tools/stats/headbuffer/head_buffer_test.go | 2 +- 179 files changed, 371 insertions(+), 347 deletions(-) diff --git a/api/api_test.go b/api/api_test.go index 15f59a486..c03216365 100644 --- a/api/api_test.go +++ b/api/api_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package api import ( diff --git a/api/proxy_util_test.go b/api/proxy_util_test.go index 57162acd8..adc78a7d1 100644 --- a/api/proxy_util_test.go +++ b/api/proxy_util_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package api import ( diff --git a/blockstore/badger/blockstore_test.go b/blockstore/badger/blockstore_test.go index 8d1465a79..a14515796 100644 --- a/blockstore/badger/blockstore_test.go +++ b/blockstore/badger/blockstore_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package badgerbs import ( diff --git a/blockstore/badger/blockstore_test_suite.go b/blockstore/badger/blockstore_test_suite.go index 8ca2a76cc..7db155901 100644 --- a/blockstore/badger/blockstore_test_suite.go +++ b/blockstore/badger/blockstore_test_suite.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package badgerbs import ( diff --git a/blockstore/splitstore/markset_test.go b/blockstore/splitstore/markset_test.go index bcfb9454b..6cc481852 100644 --- a/blockstore/splitstore/markset_test.go +++ b/blockstore/splitstore/markset_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package splitstore import ( diff --git a/blockstore/splitstore/splitstore_compact.go b/blockstore/splitstore/splitstore_compact.go index 0301f90d7..272d0afab 100644 --- a/blockstore/splitstore/splitstore_compact.go +++ b/blockstore/splitstore/splitstore_compact.go @@ -519,6 +519,7 @@ func (s *SplitStore) applyProtectors() error { // - At this point we are ready to begin purging: // - We sort cold objects heaviest first, so as to never delete the consituents of a DAG before the DAG itself (which would leave dangling references) // - We delete in small batches taking a lock; each batch is checked again for marks, from the concurrent transactional mark, so as to never delete anything live +// // - We then end the transaction and compact/gc the hotstore. func (s *SplitStore) compact(curTs *types.TipSet) { log.Info("waiting for active views to complete") diff --git a/blockstore/splitstore/splitstore_test.go b/blockstore/splitstore/splitstore_test.go index bb8db193a..d23a78cf0 100644 --- a/blockstore/splitstore/splitstore_test.go +++ b/blockstore/splitstore/splitstore_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package splitstore import ( diff --git a/blockstore/timed_test.go b/blockstore/timed_test.go index bfd6e8140..931f14507 100644 --- a/blockstore/timed_test.go +++ b/blockstore/timed_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package blockstore import ( diff --git a/blockstore/union.go b/blockstore/union.go index c0ad91262..71e785f1a 100644 --- a/blockstore/union.go +++ b/blockstore/union.go @@ -12,10 +12,9 @@ type unionBlockstore []Blockstore // Union returns an unioned blockstore. // -// * Reads return from the first blockstore that has the value, querying in the -// supplied order. -// * Writes (puts and deletes) are broadcast to all stores. -// +// - Reads return from the first blockstore that has the value, querying in the +// supplied order. +// - Writes (puts and deletes) are broadcast to all stores. func Union(stores ...Blockstore) Blockstore { return unionBlockstore(stores) } diff --git a/blockstore/union_test.go b/blockstore/union_test.go index 46433979a..a3ca117b2 100644 --- a/blockstore/union_test.go +++ b/blockstore/union_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package blockstore import ( diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index 963c86454542e43c1d5091da7c4ff8be747c277e..87bc9ed714588e336d3136e71cfaf935caf69022 100644 GIT binary patch delta 667 zcmV;M0%ZO5cAs~!5jlTI(+YdF%ZlrXy+SUoF!l<$@5*JgSIEV+#9kp6*Bg6{H|H))TM3uz5;p-Gy~==Vm`@!=%4@o}Fuxa&!`4B|@SWwA+aBVH1lq~qu%u}ON0 zUJ{$Qpnq9x;*$Mku}SU)UJ{$6Bj_cuNqT->4x5m44$>qVcK3h(5a+$q-gwxXcw4)Q z-aB=L8&FJ<#Gdr}gV}gA=#Qe?@W@`TdE68Q_@Fl!&wA6*U>cja;o)dFosEa1!=_KZ za?oo}drLWZ_J-!;@_nypJ|XV+iRM$~e;sds3Yr=2rx#QJ${6j~-(Lr{vM0WQTQdW_ zhJA@8T{v0p*vNnLXT+~LRZyS&o7M%5kbeW-{vDEk!s6dE@{cQp{UZN}R-pIDMwW?n zxUme#P#X=@pmJ!Vf!b)G{ZI;RG|)>T_kBbIr6_|oGU!=$3Ts6L_wLYstE3$$9G)dH;+ zXtlr(rUf>{aqm!X#eW-3)J7Av!oQ6sdezZHPfu=TVMjY68`JD)9|)YAL0Mq8w&`c= z;^6*-kK*SiYa=U}_Bz^$_*?wR0iMteVJ_6Cf->ACsxy1NsFY{+hvFAa_U^iP3Zecj z`Jq=Twy}Sz;PC>pX$VDLmzfb!E>>keKDjOZYU2q+X`>^=SrLP96{ilu3mFMb=-rPl&`&u)8*3%Q7o^GH1UjP6A|NnBT1+Av*0svtE BQ#t?u delta 624 zcmV-$0+0QlclCC#5jlTo{X(r@sPzlAexcSc^n>|@#MLBe(!bvuO~;3m*ebiv8r;96 z>-e|=cv)kaNxFbu5}TyY=OwX;OY@h-CN9ul7Mr9fe@SeTE}fUeCh5a@Ic!4G zIY@YD*m3_uSm@KR;p8S!gQ71SsHrgcFhKT;(Ah)K^x=qEIWlZ z#%GU19NHM4HpZuo@sTRRMoUB-QS#;vZQFx{7uqSbp+0S>&-Zkcuvb*yhWgarDMU62 ztrlptK&u5>EzoL#A505uh~wUd-irS=ny8H?YK4CrP4s`NqluoL+#11-c0@L&+0i}_ zI5&d=ziyS%&)CJm{Rtn%&rjAy)+Ft9v=i~S_>%)Xp&PJw4q%{l5SJ0RR6R Kd3l*|>jD7DpGi>w diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index c15d91e4418ea352f2d3a843d9500d791a971d7e..020bc9d1b70debe22a19c0b2034b8ecf3b8fd3a8 100644 GIT binary patch literal 5077 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 literal 5036 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 messages references cache. +// 1. a tipset cache +// 2. a block => messages references cache. type ChainStore struct { chainBlockstore bstore.Blockstore stateBlockstore bstore.Blockstore @@ -453,8 +453,9 @@ func (cs *ChainStore) MaybeTakeHeavierTipSet(ctx context.Context, ts *types.TipS // The "fast forward" case is covered in this logic as a valid fork of length 0. // // FIXME: We may want to replace some of the logic in `syncFork()` with this. -// `syncFork()` counts the length on both sides of the fork at the moment (we -// need to settle on that) but here we just enforce it on the `synced` side. +// +// `syncFork()` counts the length on both sides of the fork at the moment (we +// need to settle on that) but here we just enforce it on the `synced` side. func (cs *ChainStore) exceedsForkLength(ctx context.Context, synced, external *types.TipSet) (bool, error) { if synced == nil || external == nil { // FIXME: If `cs.heaviest` is nil we should just bypass the entire diff --git a/chain/store/store_test.go b/chain/store/store_test.go index 95de8401b..af78e3dc0 100644 --- a/chain/store/store_test.go +++ b/chain/store/store_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package store_test import ( diff --git a/chain/sub/incoming.go b/chain/sub/incoming.go index bd073e789..b8427e036 100644 --- a/chain/sub/incoming.go +++ b/chain/sub/incoming.go @@ -159,9 +159,12 @@ func FetchSignedMessagesByCids( } // Fetch `cids` from the block service, apply `cb` on each of them. Used -// by the fetch message functions above. +// +// by the fetch message functions above. +// // We check that each block is received only once and we do not received -// blocks we did not request. +// +// blocks we did not request. func fetchCids( ctx context.Context, bserv bserv.BlockGetter, diff --git a/chain/sub/incoming_test.go b/chain/sub/incoming_test.go index fbe73d460..8566391b9 100644 --- a/chain/sub/incoming_test.go +++ b/chain/sub/incoming_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package sub import ( diff --git a/chain/sync.go b/chain/sync.go index 41775705e..634313855 100644 --- a/chain/sync.go +++ b/chain/sync.go @@ -60,16 +60,16 @@ var ( // Syncer is in charge of running the chain synchronization logic. As such, it // is tasked with these functions, amongst others: // -// * Fast-forwards the chain as it learns of new TipSets from the network via -// the SyncManager. -// * Applies the fork choice rule to select the correct side when confronted -// with a fork in the network. -// * Requests block headers and messages from other peers when not available -// in our BlockStore. -// * Tracks blocks marked as bad in a cache. -// * Keeps the BlockStore and ChainStore consistent with our view of the world, -// the latter of which in turn informs other components when a reorg has been -// committed. +// - Fast-forwards the chain as it learns of new TipSets from the network via +// the SyncManager. +// - Applies the fork choice rule to select the correct side when confronted +// with a fork in the network. +// - Requests block headers and messages from other peers when not available +// in our BlockStore. +// - Tracks blocks marked as bad in a cache. +// - Keeps the BlockStore and ChainStore consistent with our view of the world, +// the latter of which in turn informs other components when a reorg has been +// committed. // // The Syncer does not run workers itself. It's mainly concerned with // ensuring a consistent state of chain consensus. The reactive and network- @@ -671,9 +671,9 @@ func extractSyncState(ctx context.Context) *SyncerState { // 2. Check the consistency of beacon entries in the from tipset. We check // total equality of the BeaconEntries in each block. // 3. Traverse the chain backwards, for each tipset: -// 3a. Load it from the chainstore; if found, it move on to its parent. -// 3b. Query our peers via client in batches, requesting up to a -// maximum of 500 tipsets every time. +// 3a. Load it from the chainstore; if found, it move on to its parent. +// 3b. Query our peers via client in batches, requesting up to a +// maximum of 500 tipsets every time. // // Once we've concluded, if we find a mismatching tipset at the height where the // anchor tipset should be, we are facing a fork, and we invoke Syncer#syncFork @@ -1171,7 +1171,7 @@ func persistMessages(ctx context.Context, bs bstore.Blockstore, bst *exchange.Co // else we must drop part of our chain to connect to the peer's head // (referred to as "forking"). // -// 2. StagePersistHeaders: now that we've collected the missing headers, +// 2. StagePersistHeaders: now that we've collected the missing headers, // augmented by those on the other side of a fork, we persist them to the // BlockStore. // diff --git a/chain/sync_manager_test.go b/chain/sync_manager_test.go index b3069c3fb..737845ae2 100644 --- a/chain/sync_manager_test.go +++ b/chain/sync_manager_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package chain import ( diff --git a/chain/sync_test.go b/chain/sync_test.go index ee1fd91ec..b1be0b590 100644 --- a/chain/sync_test.go +++ b/chain/sync_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package chain_test import ( diff --git a/chain/types/bigint_test.go b/chain/types/bigint_test.go index 595bb8e0b..348724953 100644 --- a/chain/types/bigint_test.go +++ b/chain/types/bigint_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package types import ( diff --git a/chain/types/blockheader_test.go b/chain/types/blockheader_test.go index 248016b28..b7af86d3c 100644 --- a/chain/types/blockheader_test.go +++ b/chain/types/blockheader_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package types import ( diff --git a/chain/types/electionproof_test.go b/chain/types/electionproof_test.go index 1eba21138..3a06460fe 100644 --- a/chain/types/electionproof_test.go +++ b/chain/types/electionproof_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package types import ( diff --git a/chain/types/fil_test.go b/chain/types/fil_test.go index 5cbe22904..85054ed98 100644 --- a/chain/types/fil_test.go +++ b/chain/types/fil_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package types import ( diff --git a/chain/types/message_test.go b/chain/types/message_test.go index 637288374..abb9c946e 100644 --- a/chain/types/message_test.go +++ b/chain/types/message_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package types import ( diff --git a/chain/types/signature_test.go b/chain/types/signature_test.go index 85b27fea9..abc7a369b 100644 --- a/chain/types/signature_test.go +++ b/chain/types/signature_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package types import ( diff --git a/chain/types/tipset.go b/chain/types/tipset.go index 9c2fc4d79..cb981e0f0 100644 --- a/chain/types/tipset.go +++ b/chain/types/tipset.go @@ -99,11 +99,11 @@ func tipsetSortFunc(blks []*BlockHeader) func(i, j int) bool { } // Checks: -// * A tipset is composed of at least one block. (Because of our variable -// number of blocks per tipset, determined by randomness, we do not impose -// an upper limit.) -// * All blocks have the same height. -// * All blocks have the same parents (same number of them and matching CIDs). +// - A tipset is composed of at least one block. (Because of our variable +// number of blocks per tipset, determined by randomness, we do not impose +// an upper limit.) +// - All blocks have the same height. +// - All blocks have the same parents (same number of them and matching CIDs). func NewTipSet(blks []*BlockHeader) (*TipSet, error) { if len(blks) == 0 { return nil, xerrors.Errorf("NewTipSet called with zero length array of blocks") diff --git a/chain/types/tipset_key_test.go b/chain/types/tipset_key_test.go index d809b7cb6..5fbecb3ea 100644 --- a/chain/types/tipset_key_test.go +++ b/chain/types/tipset_key_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package types import ( diff --git a/chain/types/types_test.go b/chain/types/types_test.go index 1083cdc38..4e08a0d88 100644 --- a/chain/types/types_test.go +++ b/chain/types/types_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package types import ( diff --git a/chain/types_test.go b/chain/types_test.go index 53210e180..0fb399214 100644 --- a/chain/types_test.go +++ b/chain/types_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package chain import ( diff --git a/chain/vectors/vectors_test.go b/chain/vectors/vectors_test.go index 248950787..8e73ec012 100644 --- a/chain/vectors/vectors_test.go +++ b/chain/vectors/vectors_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package vectors import ( diff --git a/chain/vm/burn_test.go b/chain/vm/burn_test.go index a9042ca14..46bc7f5de 100644 --- a/chain/vm/burn_test.go +++ b/chain/vm/burn_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package vm import ( diff --git a/chain/vm/gas_v0_test.go b/chain/vm/gas_v0_test.go index 0e657cb2c..bd527a779 100644 --- a/chain/vm/gas_v0_test.go +++ b/chain/vm/gas_v0_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package vm import ( diff --git a/chain/vm/invoker_test.go b/chain/vm/invoker_test.go index 8357da8af..5a4e1b402 100644 --- a/chain/vm/invoker_test.go +++ b/chain/vm/invoker_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package vm import ( diff --git a/chain/vm/runtime_test.go b/chain/vm/runtime_test.go index 0c75cb1dd..88b7366de 100644 --- a/chain/vm/runtime_test.go +++ b/chain/vm/runtime_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package vm import ( diff --git a/chain/wallet/multi_test.go b/chain/wallet/multi_test.go index d6fdf6656..5256ebde9 100644 --- a/chain/wallet/multi_test.go +++ b/chain/wallet/multi_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package wallet import ( diff --git a/chain/wallet/wallet_test.go b/chain/wallet/wallet_test.go index d9dac3356..8937c5eb8 100644 --- a/chain/wallet/wallet_test.go +++ b/chain/wallet/wallet_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package wallet import ( diff --git a/cli/chain_test.go b/cli/chain_test.go index dfef27b11..9fd46724e 100644 --- a/cli/chain_test.go +++ b/cli/chain_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package cli import ( diff --git a/cli/mpool_test.go b/cli/mpool_test.go index 1533ef9e2..01b49d4b3 100644 --- a/cli/mpool_test.go +++ b/cli/mpool_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package cli import ( diff --git a/cli/send_test.go b/cli/send_test.go index 3ee6ad992..ec858774c 100644 --- a/cli/send_test.go +++ b/cli/send_test.go @@ -1,5 +1,5 @@ -//stm: ignore -//stm: #unit +// stm: ignore +// stm: #unit package cli import ( diff --git a/cli/services_send_test.go b/cli/services_send_test.go index fe9bb0e89..a524abe8c 100644 --- a/cli/services_send_test.go +++ b/cli/services_send_test.go @@ -1,5 +1,5 @@ -//stm: ignore -//stm: #unit +// stm: ignore +// stm: #unit package cli import ( diff --git a/cli/sync_test.go b/cli/sync_test.go index 345338f75..456d165f2 100644 --- a/cli/sync_test.go +++ b/cli/sync_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package cli import ( diff --git a/cli/wallet_test.go b/cli/wallet_test.go index 01aa0dd7c..dee26018b 100644 --- a/cli/wallet_test.go +++ b/cli/wallet_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package cli import ( diff --git a/cmd/lotus-bench/stats_test.go b/cmd/lotus-bench/stats_test.go index ff2e3dce8..0ccadb4d4 100644 --- a/cmd/lotus-bench/stats_test.go +++ b/cmd/lotus-bench/stats_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package main import ( diff --git a/cmd/lotus-fountain/rate_limiter_test.go b/cmd/lotus-fountain/rate_limiter_test.go index eefb07c8a..b7af23ebd 100644 --- a/cmd/lotus-fountain/rate_limiter_test.go +++ b/cmd/lotus-fountain/rate_limiter_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package main import ( diff --git a/cmd/lotus-health/main_test.go b/cmd/lotus-health/main_test.go index 40ca9d409..f0107380f 100644 --- a/cmd/lotus-health/main_test.go +++ b/cmd/lotus-health/main_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package main import ( diff --git a/cmd/lotus-miner/actor_test.go b/cmd/lotus-miner/actor_test.go index 2a6700e73..791298ffa 100644 --- a/cmd/lotus-miner/actor_test.go +++ b/cmd/lotus-miner/actor_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package main import ( diff --git a/cmd/lotus-miner/allinfo_test.go b/cmd/lotus-miner/allinfo_test.go index 6d439869a..144bdff70 100644 --- a/cmd/lotus-miner/allinfo_test.go +++ b/cmd/lotus-miner/allinfo_test.go @@ -1,4 +1,4 @@ -//stm: #integration +// stm: #integration package main import ( diff --git a/cmd/lotus-sim/simulation/stages/commit_queue_test.go b/cmd/lotus-sim/simulation/stages/commit_queue_test.go index 1b7f79978..df0de9757 100644 --- a/cmd/lotus-sim/simulation/stages/commit_queue_test.go +++ b/cmd/lotus-sim/simulation/stages/commit_queue_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package stages import ( diff --git a/cmd/lotus-sim/simulation/stages/funding_stage.go b/cmd/lotus-sim/simulation/stages/funding_stage.go index faec6a504..f75a9910d 100644 --- a/cmd/lotus-sim/simulation/stages/funding_stage.go +++ b/cmd/lotus-sim/simulation/stages/funding_stage.go @@ -55,10 +55,10 @@ func (fs *FundingStage) Fund(bb *blockbuilder.BlockBuilder, target address.Addre // sendAndFund "packs" the given message, funding the actor if necessary. It: // -// 1. Tries to send the given message. -// 2. If that fails, it checks to see if the exit code was ErrInsufficientFunds. -// 3. If so, it sends 1K FIL from the "burnt funds actor" (because we need to send it from -// somewhere) and re-tries the message.0 +// 1. Tries to send the given message. +// 2. If that fails, it checks to see if the exit code was ErrInsufficientFunds. +// 3. If so, it sends 1K FIL from the "burnt funds actor" (because we need to send it from +// somewhere) and re-tries the message.0 func (fs *FundingStage) SendAndFund(bb *blockbuilder.BlockBuilder, msg *types.Message) (res *types.MessageReceipt, err error) { for i := 0; i < 10; i++ { res, err = bb.PushMessage(msg) diff --git a/cmd/lotus-sim/simulation/step.go b/cmd/lotus-sim/simulation/step.go index f9d58529e..5226c89b4 100644 --- a/cmd/lotus-sim/simulation/step.go +++ b/cmd/lotus-sim/simulation/step.go @@ -28,10 +28,10 @@ func (sim *Simulation) Step(ctx context.Context) (*types.TipSet, error) { // popNextMessages generates/picks a set of messages to be included in the next block. // -// - This function is destructive and should only be called once per epoch. -// - This function does not store anything in the repo. -// - This function handles all gas estimation. The returned messages should all fit in a single -// block. +// - This function is destructive and should only be called once per epoch. +// - This function does not store anything in the repo. +// - This function handles all gas estimation. The returned messages should all fit in a single +// block. func (sim *Simulation) popNextMessages(ctx context.Context) ([]*types.Message, error) { parentTs := sim.head diff --git a/cmd/tvx/codenames_test.go b/cmd/tvx/codenames_test.go index 9fd6870cb..46d8466ec 100644 --- a/cmd/tvx/codenames_test.go +++ b/cmd/tvx/codenames_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package main import ( diff --git a/conformance/chaos/actor.go b/conformance/chaos/actor.go index 7b28a058d..3a8b2b50a 100644 --- a/conformance/chaos/actor.go +++ b/conformance/chaos/actor.go @@ -146,10 +146,10 @@ type CallerValidationArgs struct { // CallerValidation violates VM call validation constraints. // -// CallerValidationBranchNone performs no validation. -// CallerValidationBranchTwice validates twice. -// CallerValidationBranchIsAddress validates caller against CallerValidationArgs.Addrs. -// CallerValidationBranchIsType validates caller against CallerValidationArgs.Types. +// CallerValidationBranchNone performs no validation. +// CallerValidationBranchTwice validates twice. +// CallerValidationBranchIsAddress validates caller against CallerValidationArgs.Addrs. +// CallerValidationBranchIsType validates caller against CallerValidationArgs.Types. func (a Actor) CallerValidation(rt runtime2.Runtime, args *CallerValidationArgs) *abi.EmptyValue { switch args.Branch { case CallerValidationBranchNone: diff --git a/conformance/chaos/actor_test.go b/conformance/chaos/actor_test.go index 0764463fc..fd45504d2 100644 --- a/conformance/chaos/actor_test.go +++ b/conformance/chaos/actor_test.go @@ -1,4 +1,4 @@ -//stm: #chaos +// stm: #chaos package chaos import ( diff --git a/conformance/corpus_test.go b/conformance/corpus_test.go index 55c1cf08e..adbebbcc7 100644 --- a/conformance/corpus_test.go +++ b/conformance/corpus_test.go @@ -1,4 +1,4 @@ -//stm: ignore +// stm: ignore // This file does not test any behaviors by itself; rather, it runs other test files // Therefore, this file should not be annotated. package conformance diff --git a/conformance/driver.go b/conformance/driver.go index 342d9e9a3..0bb51800e 100644 --- a/conformance/driver.go +++ b/conformance/driver.go @@ -276,7 +276,8 @@ func (d *Driver) ExecuteMessage(bs blockstore.Blockstore, params ExecuteMessageP // messages that originate from secp256k senders, leaving all // others untouched. // TODO: generate a signature in the DSL so that it's encoded in -// the test vector. +// +// the test vector. func toChainMsg(msg *types.Message) (ret types.ChainMsg) { ret = msg if msg.From.Protocol() == address.SECP256K1 { diff --git a/documentation/en/api-v0-methods-miner.md b/documentation/en/api-v0-methods-miner.md index 379fa22dd..6eb1e5121 100644 --- a/documentation/en/api-v0-methods-miner.md +++ b/documentation/en/api-v0-methods-miner.md @@ -4397,26 +4397,26 @@ Response: }, "seal/v0/datacid": { "0": { - "MinMemory": 2048, - "MaxMemory": 2048, + "MinMemory": 4294967296, + "MaxMemory": 4294967296, "GPUUtilization": 0, "MaxParallelism": 1, "MaxParallelismGPU": 0, - "BaseMinMemory": 2048, + "BaseMinMemory": 1073741824, "MaxConcurrent": 0 }, "1": { - "MinMemory": 8388608, - "MaxMemory": 8388608, + "MinMemory": 4294967296, + "MaxMemory": 4294967296, "GPUUtilization": 0, "MaxParallelism": 1, "MaxParallelismGPU": 0, - "BaseMinMemory": 8388608, + "BaseMinMemory": 1073741824, "MaxConcurrent": 0 }, "2": { - "MinMemory": 1073741824, - "MaxMemory": 1073741824, + "MinMemory": 4294967296, + "MaxMemory": 4294967296, "GPUUtilization": 0, "MaxParallelism": 1, "MaxParallelismGPU": 0, @@ -4433,8 +4433,8 @@ Response: "MaxConcurrent": 0 }, "4": { - "MinMemory": 8589934592, - "MaxMemory": 8589934592, + "MinMemory": 4294967296, + "MaxMemory": 4294967296, "GPUUtilization": 0, "MaxParallelism": 1, "MaxParallelismGPU": 0, @@ -4442,26 +4442,26 @@ Response: "MaxConcurrent": 0 }, "5": { - "MinMemory": 2048, - "MaxMemory": 2048, + "MinMemory": 4294967296, + "MaxMemory": 4294967296, "GPUUtilization": 0, "MaxParallelism": 1, "MaxParallelismGPU": 0, - "BaseMinMemory": 2048, + "BaseMinMemory": 1073741824, "MaxConcurrent": 0 }, "6": { - "MinMemory": 8388608, - "MaxMemory": 8388608, + "MinMemory": 4294967296, + "MaxMemory": 4294967296, "GPUUtilization": 0, "MaxParallelism": 1, "MaxParallelismGPU": 0, - "BaseMinMemory": 8388608, + "BaseMinMemory": 1073741824, "MaxConcurrent": 0 }, "7": { - "MinMemory": 1073741824, - "MaxMemory": 1073741824, + "MinMemory": 4294967296, + "MaxMemory": 4294967296, "GPUUtilization": 0, "MaxParallelism": 1, "MaxParallelismGPU": 0, @@ -4478,8 +4478,8 @@ Response: "MaxConcurrent": 0 }, "9": { - "MinMemory": 8589934592, - "MaxMemory": 8589934592, + "MinMemory": 4294967296, + "MaxMemory": 4294967296, "GPUUtilization": 0, "MaxParallelism": 1, "MaxParallelismGPU": 0, diff --git a/documentation/en/api-v0-methods-worker.md b/documentation/en/api-v0-methods-worker.md index 0889a9b3c..554f8666d 100644 --- a/documentation/en/api-v0-methods-worker.md +++ b/documentation/en/api-v0-methods-worker.md @@ -579,26 +579,26 @@ Response: }, "seal/v0/datacid": { "0": { - "MinMemory": 2048, - "MaxMemory": 2048, + "MinMemory": 4294967296, + "MaxMemory": 4294967296, "GPUUtilization": 0, "MaxParallelism": 1, "MaxParallelismGPU": 0, - "BaseMinMemory": 2048, + "BaseMinMemory": 1073741824, "MaxConcurrent": 0 }, "1": { - "MinMemory": 8388608, - "MaxMemory": 8388608, + "MinMemory": 4294967296, + "MaxMemory": 4294967296, "GPUUtilization": 0, "MaxParallelism": 1, "MaxParallelismGPU": 0, - "BaseMinMemory": 8388608, + "BaseMinMemory": 1073741824, "MaxConcurrent": 0 }, "2": { - "MinMemory": 1073741824, - "MaxMemory": 1073741824, + "MinMemory": 4294967296, + "MaxMemory": 4294967296, "GPUUtilization": 0, "MaxParallelism": 1, "MaxParallelismGPU": 0, @@ -615,8 +615,8 @@ Response: "MaxConcurrent": 0 }, "4": { - "MinMemory": 8589934592, - "MaxMemory": 8589934592, + "MinMemory": 4294967296, + "MaxMemory": 4294967296, "GPUUtilization": 0, "MaxParallelism": 1, "MaxParallelismGPU": 0, @@ -624,26 +624,26 @@ Response: "MaxConcurrent": 0 }, "5": { - "MinMemory": 2048, - "MaxMemory": 2048, + "MinMemory": 4294967296, + "MaxMemory": 4294967296, "GPUUtilization": 0, "MaxParallelism": 1, "MaxParallelismGPU": 0, - "BaseMinMemory": 2048, + "BaseMinMemory": 1073741824, "MaxConcurrent": 0 }, "6": { - "MinMemory": 8388608, - "MaxMemory": 8388608, + "MinMemory": 4294967296, + "MaxMemory": 4294967296, "GPUUtilization": 0, "MaxParallelism": 1, "MaxParallelismGPU": 0, - "BaseMinMemory": 8388608, + "BaseMinMemory": 1073741824, "MaxConcurrent": 0 }, "7": { - "MinMemory": 1073741824, - "MaxMemory": 1073741824, + "MinMemory": 4294967296, + "MaxMemory": 4294967296, "GPUUtilization": 0, "MaxParallelism": 1, "MaxParallelismGPU": 0, @@ -660,8 +660,8 @@ Response: "MaxConcurrent": 0 }, "9": { - "MinMemory": 8589934592, - "MaxMemory": 8589934592, + "MinMemory": 4294967296, + "MaxMemory": 4294967296, "GPUUtilization": 0, "MaxParallelism": 1, "MaxParallelismGPU": 0, diff --git a/gateway/node_test.go b/gateway/node_test.go index b077d514a..805767dc6 100644 --- a/gateway/node_test.go +++ b/gateway/node_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package gateway import ( diff --git a/itests/api_test.go b/itests/api_test.go index ac204dc1b..7eac4e8a3 100644 --- a/itests/api_test.go +++ b/itests/api_test.go @@ -1,4 +1,4 @@ -//stm: #integration +// stm: #integration package itests import ( diff --git a/itests/batch_deal_test.go b/itests/batch_deal_test.go index 329a6b3bb..d1bb40531 100644 --- a/itests/batch_deal_test.go +++ b/itests/batch_deal_test.go @@ -1,4 +1,4 @@ -//stm: #integration +// stm: #integration package itests import ( diff --git a/itests/ccupgrade_test.go b/itests/ccupgrade_test.go index aae99c6ba..909b5691e 100644 --- a/itests/ccupgrade_test.go +++ b/itests/ccupgrade_test.go @@ -1,4 +1,4 @@ -//stm: #integration +// stm: #integration package itests import ( diff --git a/itests/cli_test.go b/itests/cli_test.go index ac7e4d488..a323c0863 100644 --- a/itests/cli_test.go +++ b/itests/cli_test.go @@ -1,4 +1,4 @@ -//stm: #integration +// stm: #integration package itests import ( diff --git a/itests/deadlines_test.go b/itests/deadlines_test.go index e76d4dafd..a2b0bde88 100644 --- a/itests/deadlines_test.go +++ b/itests/deadlines_test.go @@ -1,4 +1,4 @@ -//stm: #integration +// stm: #integration package itests import ( diff --git a/itests/deals_512mb_test.go b/itests/deals_512mb_test.go index e3817fae1..7b55204d9 100644 --- a/itests/deals_512mb_test.go +++ b/itests/deals_512mb_test.go @@ -1,4 +1,4 @@ -//stm: #integration +// stm: #integration package itests import ( diff --git a/itests/deals_concurrent_test.go b/itests/deals_concurrent_test.go index 3248a1d20..e36bde773 100644 --- a/itests/deals_concurrent_test.go +++ b/itests/deals_concurrent_test.go @@ -1,4 +1,4 @@ -//stm: #integration +// stm: #integration package itests import ( diff --git a/itests/deals_max_staging_deals_test.go b/itests/deals_max_staging_deals_test.go index 7b71d09be..738a1e2fe 100644 --- a/itests/deals_max_staging_deals_test.go +++ b/itests/deals_max_staging_deals_test.go @@ -1,4 +1,4 @@ -//stm: #integration +// stm: #integration package itests import ( diff --git a/itests/deals_offline_test.go b/itests/deals_offline_test.go index ccd86dff9..9b8354d36 100644 --- a/itests/deals_offline_test.go +++ b/itests/deals_offline_test.go @@ -1,4 +1,4 @@ -//stm: #integration +// stm: #integration package itests import ( diff --git a/itests/deals_padding_test.go b/itests/deals_padding_test.go index 93da33210..3535a1227 100644 --- a/itests/deals_padding_test.go +++ b/itests/deals_padding_test.go @@ -1,4 +1,4 @@ -//stm: #integration +// stm: #integration package itests import ( diff --git a/itests/deals_partial_retrieval_dm-level_test.go b/itests/deals_partial_retrieval_dm-level_test.go index 48fb8d516..f56d64026 100644 --- a/itests/deals_partial_retrieval_dm-level_test.go +++ b/itests/deals_partial_retrieval_dm-level_test.go @@ -1,4 +1,4 @@ -//stm: #integration +// stm: #integration package itests import ( diff --git a/itests/deals_partial_retrieval_test.go b/itests/deals_partial_retrieval_test.go index 604f3cfcb..0bbf23da0 100644 --- a/itests/deals_partial_retrieval_test.go +++ b/itests/deals_partial_retrieval_test.go @@ -1,4 +1,4 @@ -//stm: #integration +// stm: #integration package itests import ( diff --git a/itests/deals_power_test.go b/itests/deals_power_test.go index 27b196109..1ca28c6fd 100644 --- a/itests/deals_power_test.go +++ b/itests/deals_power_test.go @@ -1,4 +1,4 @@ -//stm: #integration +// stm: #integration package itests import ( diff --git a/itests/deals_pricing_test.go b/itests/deals_pricing_test.go index 15482f62b..f2301eee8 100644 --- a/itests/deals_pricing_test.go +++ b/itests/deals_pricing_test.go @@ -1,4 +1,4 @@ -//stm: #integration +// stm: #integration package itests import ( diff --git a/itests/deals_publish_test.go b/itests/deals_publish_test.go index b12fe31b7..43f4eeb05 100644 --- a/itests/deals_publish_test.go +++ b/itests/deals_publish_test.go @@ -1,4 +1,4 @@ -//stm: #integration +// stm: #integration package itests import ( diff --git a/itests/deals_retry_deal_no_funds_test.go b/itests/deals_retry_deal_no_funds_test.go index 98f99a4a2..8d5a02172 100644 --- a/itests/deals_retry_deal_no_funds_test.go +++ b/itests/deals_retry_deal_no_funds_test.go @@ -1,4 +1,4 @@ -//stm: #integration +// stm: #integration package itests import ( diff --git a/itests/deals_test.go b/itests/deals_test.go index 9810d417a..e8296ea87 100644 --- a/itests/deals_test.go +++ b/itests/deals_test.go @@ -1,4 +1,4 @@ -//stm: #integration +// stm: #integration package itests import ( diff --git a/itests/gateway_test.go b/itests/gateway_test.go index 934b88fd2..a7d9d353b 100644 --- a/itests/gateway_test.go +++ b/itests/gateway_test.go @@ -1,4 +1,4 @@ -//stm: #integration +// stm: #integration package itests import ( diff --git a/itests/get_messages_in_ts_test.go b/itests/get_messages_in_ts_test.go index f5efa1bb8..ecc13e3aa 100644 --- a/itests/get_messages_in_ts_test.go +++ b/itests/get_messages_in_ts_test.go @@ -1,4 +1,4 @@ -//stm: #integration +// stm: #integration package itests import ( diff --git a/itests/kit/circuit.go b/itests/kit/circuit.go index d2857010e..50a10fa1c 100644 --- a/itests/kit/circuit.go +++ b/itests/kit/circuit.go @@ -10,9 +10,9 @@ import ( CircuitBreaker implements a simple time-based circuit breaker used for waiting for async operations to finish. This is how it works: - - It runs the `cb` function until it returns true, - - waiting for `throttle` duration between each iteration, - - or at most `timeout` duration until it breaks test execution. + - It runs the `cb` function until it returns true, + - waiting for `throttle` duration between each iteration, + - or at most `timeout` duration until it breaks test execution. You can use it if t.Deadline() is not "granular" enough, and you want to know which specific piece of code timed out, or you need to set different deadlines in the same test. diff --git a/itests/kit/ensemble.go b/itests/kit/ensemble.go index b4f2e6ea9..98d7b178f 100644 --- a/itests/kit/ensemble.go +++ b/itests/kit/ensemble.go @@ -74,14 +74,14 @@ func init() { // // Create a new ensemble with: // -// ens := kit.NewEnsemble() +// ens := kit.NewEnsemble() // // Create full nodes and miners: // -// var full TestFullNode -// var miner TestMiner -// ens.FullNode(&full, opts...) // populates a full node -// ens.Miner(&miner, &full, opts...) // populates a miner, using the full node as its chain daemon +// var full TestFullNode +// var miner TestMiner +// ens.FullNode(&full, opts...) // populates a full node +// ens.Miner(&miner, &full, opts...) // populates a miner, using the full node as its chain daemon // // It is possible to pass functional options to set initial balances, // presealed sectors, owner keys, etc. @@ -93,22 +93,21 @@ func init() { // Nodes also need to be connected with one another, either via `ens.Connect()` // or `ens.InterconnectAll()`. A common inchantation for simple tests is to do: // -// ens.InterconnectAll().BeginMining(blocktime) +// ens.InterconnectAll().BeginMining(blocktime) // // You can continue to add more nodes, but you must always follow with // `ens.Start()` to activate the new nodes. // // The API is chainable, so it's possible to do a lot in a very succinct way: // -// kit.NewEnsemble().FullNode(&full).Miner(&miner, &full).Start().InterconnectAll().BeginMining() +// kit.NewEnsemble().FullNode(&full).Miner(&miner, &full).Start().InterconnectAll().BeginMining() // // You can also find convenient fullnode:miner presets, such as 1:1, 1:2, // and 2:1, e.g.: // -// kit.EnsembleMinimal() -// kit.EnsembleOneTwo() -// kit.EnsembleTwoOne() -// +// kit.EnsembleMinimal() +// kit.EnsembleOneTwo() +// kit.EnsembleTwoOne() type Ensemble struct { t *testing.T bootstrapped bool diff --git a/itests/mempool_test.go b/itests/mempool_test.go index 2a9905e2d..f07b46a73 100644 --- a/itests/mempool_test.go +++ b/itests/mempool_test.go @@ -1,4 +1,4 @@ -//stm: #integration +// stm: #integration package itests import ( diff --git a/itests/multisig_test.go b/itests/multisig_test.go index 8c23a9033..63cc2f511 100644 --- a/itests/multisig_test.go +++ b/itests/multisig_test.go @@ -1,4 +1,4 @@ -//stm: #integration +// stm: #integration package itests import ( diff --git a/itests/net_test.go b/itests/net_test.go index e29911aa5..43524a51b 100644 --- a/itests/net_test.go +++ b/itests/net_test.go @@ -1,4 +1,4 @@ -//stm: #integration +// stm: #integration package itests import ( diff --git a/itests/nonce_test.go b/itests/nonce_test.go index 87ea487ec..cac2413f7 100644 --- a/itests/nonce_test.go +++ b/itests/nonce_test.go @@ -1,4 +1,4 @@ -//stm: #integration +// stm: #integration package itests import ( diff --git a/itests/paych_api_test.go b/itests/paych_api_test.go index 5144221a1..353e22294 100644 --- a/itests/paych_api_test.go +++ b/itests/paych_api_test.go @@ -1,4 +1,4 @@ -//stm: #integration +// stm: #integration package itests import ( diff --git a/itests/paych_cli_test.go b/itests/paych_cli_test.go index 8892d6819..d73f96905 100644 --- a/itests/paych_cli_test.go +++ b/itests/paych_cli_test.go @@ -1,4 +1,4 @@ -//stm: #integration +// stm: #integration package itests import ( diff --git a/itests/sdr_upgrade_test.go b/itests/sdr_upgrade_test.go index 493dc1224..d92d4edc9 100644 --- a/itests/sdr_upgrade_test.go +++ b/itests/sdr_upgrade_test.go @@ -1,4 +1,4 @@ -//stm: #integration +// stm: #integration package itests import ( diff --git a/itests/sector_finalize_early_test.go b/itests/sector_finalize_early_test.go index e0b2cd815..8678e6a28 100644 --- a/itests/sector_finalize_early_test.go +++ b/itests/sector_finalize_early_test.go @@ -1,4 +1,4 @@ -//stm: #integration +// stm: #integration package itests import ( diff --git a/itests/sector_miner_collateral_test.go b/itests/sector_miner_collateral_test.go index b722dae65..8d7abacee 100644 --- a/itests/sector_miner_collateral_test.go +++ b/itests/sector_miner_collateral_test.go @@ -1,4 +1,4 @@ -//stm: #integration +// stm: #integration package itests import ( diff --git a/itests/sector_pledge_test.go b/itests/sector_pledge_test.go index 6f966430d..2ac1298d0 100644 --- a/itests/sector_pledge_test.go +++ b/itests/sector_pledge_test.go @@ -1,4 +1,4 @@ -//stm: #integration +// stm: #integration package itests import ( diff --git a/itests/sector_terminate_test.go b/itests/sector_terminate_test.go index b7004b312..34b325f2a 100644 --- a/itests/sector_terminate_test.go +++ b/itests/sector_terminate_test.go @@ -1,4 +1,4 @@ -//stm: #integration +// stm: #integration package itests import ( diff --git a/itests/self_sent_txn_test.go b/itests/self_sent_txn_test.go index 978778a8b..00ca0e5ae 100644 --- a/itests/self_sent_txn_test.go +++ b/itests/self_sent_txn_test.go @@ -1,4 +1,4 @@ -//stm: #integration +// stm: #integration package itests import ( diff --git a/itests/splitstore_test.go b/itests/splitstore_test.go index 6c57e26a7..db74e86a9 100644 --- a/itests/splitstore_test.go +++ b/itests/splitstore_test.go @@ -1,4 +1,4 @@ -//stm: #integration +// stm: #integration package itests import ( diff --git a/itests/tape_test.go b/itests/tape_test.go index d179951ed..e0db4882c 100644 --- a/itests/tape_test.go +++ b/itests/tape_test.go @@ -1,4 +1,4 @@ -//stm: #integration +// stm: #integration package itests import ( diff --git a/itests/verifreg_test.go b/itests/verifreg_test.go index 7afcd3a3b..9132cf28b 100644 --- a/itests/verifreg_test.go +++ b/itests/verifreg_test.go @@ -1,4 +1,4 @@ -//stm: #integration +// stm: #integration package itests import ( diff --git a/itests/wdpost_dispute_test.go b/itests/wdpost_dispute_test.go index 0982f44c8..eedb3e8f6 100644 --- a/itests/wdpost_dispute_test.go +++ b/itests/wdpost_dispute_test.go @@ -1,4 +1,4 @@ -//stm: #integration +// stm: #integration package itests import ( diff --git a/itests/wdpost_test.go b/itests/wdpost_test.go index 63a599094..a3d157ef0 100644 --- a/itests/wdpost_test.go +++ b/itests/wdpost_test.go @@ -1,4 +1,4 @@ -//stm: #integration +// stm: #integration package itests import ( diff --git a/journal/alerting/alerts_test.go b/journal/alerting/alerts_test.go index 8147ac5e8..5f8c26929 100644 --- a/journal/alerting/alerts_test.go +++ b/journal/alerting/alerts_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package alerting import ( diff --git a/journal/registry_test.go b/journal/registry_test.go index cb83be6e9..65956daf7 100644 --- a/journal/registry_test.go +++ b/journal/registry_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package journal import ( diff --git a/lib/backupds/backupds_test.go b/lib/backupds/backupds_test.go index bbbbdcd2a..48b2a8d25 100644 --- a/lib/backupds/backupds_test.go +++ b/lib/backupds/backupds_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package backupds import ( diff --git a/lib/oldpath/oldresolver/resolver.go b/lib/oldpath/oldresolver/resolver.go index 7c598c66e..1fab6c3d0 100644 --- a/lib/oldpath/oldresolver/resolver.go +++ b/lib/oldpath/oldresolver/resolver.go @@ -39,7 +39,8 @@ type ResolveOnce func(ctx context.Context, ds ipld.NodeGetter, nd ipld.Node, nam // Resolver provides path resolution to IPFS // It has a pointer to a DAGService, which is uses to resolve nodes. // TODO: now that this is more modular, try to unify this code with the -// the resolvers in namesys +// +// the resolvers in namesys type Resolver struct { DAG ipld.NodeGetter diff --git a/lib/oldpath/path.go b/lib/oldpath/path.go index 9cc99ce5c..70303b428 100644 --- a/lib/oldpath/path.go +++ b/lib/oldpath/path.go @@ -27,10 +27,10 @@ func (e *pathError) Path() string { } // A Path represents an ipfs content path: -// * //path/to/file -// * /ipfs/ -// * /ipns//path/to/folder -// * etc +// - //path/to/file +// - /ipfs/ +// - /ipns//path/to/folder +// - etc type Path string // ^^^ diff --git a/lib/rpcenc/reader_test.go b/lib/rpcenc/reader_test.go index ac78d1109..455cc8fcc 100644 --- a/lib/rpcenc/reader_test.go +++ b/lib/rpcenc/reader_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package rpcenc import ( diff --git a/lib/sigs/bls/bls_bench_test.go b/lib/sigs/bls/bls_bench_test.go index 2f1f6ee6f..70e2a45ca 100644 --- a/lib/sigs/bls/bls_bench_test.go +++ b/lib/sigs/bls/bls_bench_test.go @@ -1,4 +1,4 @@ -//stm: ignore +// stm: ignore // Ignored because implementation relies on external (ffi) lib package bls diff --git a/lib/sigs/bls/bls_test.go b/lib/sigs/bls/bls_test.go index 3187fea67..7a290b8b7 100644 --- a/lib/sigs/bls/bls_test.go +++ b/lib/sigs/bls/bls_test.go @@ -1,4 +1,4 @@ -//stm: ignore +// stm: ignore // Ignored because implementation relies on external (ffi) lib package bls_test diff --git a/lib/stati/stats_test.go b/lib/stati/stats_test.go index b6aa7a0a5..c1a7ff66a 100644 --- a/lib/stati/stats_test.go +++ b/lib/stati/stats_test.go @@ -1,4 +1,4 @@ -//stm: ignore +// stm: ignore package stati import ( diff --git a/lib/tablewriter/tablewiter_test.go b/lib/tablewriter/tablewiter_test.go index ce676abdf..8ce8d3253 100644 --- a/lib/tablewriter/tablewiter_test.go +++ b/lib/tablewriter/tablewiter_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package tablewriter import ( diff --git a/lib/tablewriter/tablewriter.go b/lib/tablewriter/tablewriter.go index cd045710e..62fdd469f 100644 --- a/lib/tablewriter/tablewriter.go +++ b/lib/tablewriter/tablewriter.go @@ -35,7 +35,8 @@ func NewLineCol(name string) Column { } // Unlike text/tabwriter, this works with CLI escape codes, and allows for info -// in separate lines +// +// in separate lines func New(cols ...Column) *TableWriter { return &TableWriter{ cols: cols, diff --git a/lib/unixfs/filestore_test.go b/lib/unixfs/filestore_test.go index 3aee5cb24..9fe6c228a 100644 --- a/lib/unixfs/filestore_test.go +++ b/lib/unixfs/filestore_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package unixfs import ( diff --git a/markets/dagstore/miner_api_test.go b/markets/dagstore/miner_api_test.go index b30783c5d..c2618e8a7 100644 --- a/markets/dagstore/miner_api_test.go +++ b/markets/dagstore/miner_api_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package dagstore import ( diff --git a/markets/dagstore/mount_test.go b/markets/dagstore/mount_test.go index bc55f449d..e044603d4 100644 --- a/markets/dagstore/mount_test.go +++ b/markets/dagstore/mount_test.go @@ -1,4 +1,4 @@ -//stm: @unit +// stm: @unit package dagstore import ( diff --git a/markets/dagstore/wrapper_migration_test.go b/markets/dagstore/wrapper_migration_test.go index ce208cc82..9c8e08a8c 100644 --- a/markets/dagstore/wrapper_migration_test.go +++ b/markets/dagstore/wrapper_migration_test.go @@ -1,4 +1,4 @@ -//stm: #integration +// stm: #integration package dagstore import ( diff --git a/markets/dagstore/wrapper_test.go b/markets/dagstore/wrapper_test.go index 1240ce0a3..f3b5e1b52 100644 --- a/markets/dagstore/wrapper_test.go +++ b/markets/dagstore/wrapper_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package dagstore import ( diff --git a/markets/retrievaladapter/provider_test.go b/markets/retrievaladapter/provider_test.go index 0a50a10ac..b7b5039d6 100644 --- a/markets/retrievaladapter/provider_test.go +++ b/markets/retrievaladapter/provider_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package retrievaladapter import ( diff --git a/markets/storageadapter/dealpublisher_test.go b/markets/storageadapter/dealpublisher_test.go index b73c3e2a6..b7280842c 100644 --- a/markets/storageadapter/dealpublisher_test.go +++ b/markets/storageadapter/dealpublisher_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package storageadapter import ( diff --git a/markets/storageadapter/dealstatematcher_test.go b/markets/storageadapter/dealstatematcher_test.go index 6ff000a2a..9a46e4af9 100644 --- a/markets/storageadapter/dealstatematcher_test.go +++ b/markets/storageadapter/dealstatematcher_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package storageadapter import ( diff --git a/markets/storageadapter/ondealsectorcommitted_test.go b/markets/storageadapter/ondealsectorcommitted_test.go index 402b9b922..624cf84ae 100644 --- a/markets/storageadapter/ondealsectorcommitted_test.go +++ b/markets/storageadapter/ondealsectorcommitted_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package storageadapter import ( diff --git a/miner/miner.go b/miner/miner.go index 8f341166e..4952f95fb 100644 --- a/miner/miner.go +++ b/miner/miner.go @@ -179,26 +179,26 @@ func (m *Miner) niceSleep(d time.Duration) bool { // mine runs the mining loop. It performs the following: // -// 1. Queries our current best currently-known mining candidate (tipset to -// build upon). -// 2. Waits until the propagation delay of the network has elapsed (currently -// 6 seconds). The waiting is done relative to the timestamp of the best -// candidate, which means that if it's way in the past, we won't wait at -// all (e.g. in catch-up or rush mining). -// 3. After the wait, we query our best mining candidate. This will be the one -// we'll work with. -// 4. Sanity check that we _actually_ have a new mining base to mine on. If -// not, wait one epoch + propagation delay, and go back to the top. -// 5. We attempt to mine a block, by calling mineOne (refer to godocs). This -// method will either return a block if we were eligible to mine, or nil -// if we weren't. -// 6a. If we mined a block, we update our state and push it out to the network -// via gossipsub. -// 6b. If we didn't mine a block, we consider this to be a nil round on top of -// the mining base we selected. If other miner or miners on the network -// were eligible to mine, we will receive their blocks via gossipsub and -// we will select that tipset on the next iteration of the loop, thus -// discarding our null round. +// 1. Queries our current best currently-known mining candidate (tipset to +// build upon). +// 2. Waits until the propagation delay of the network has elapsed (currently +// 6 seconds). The waiting is done relative to the timestamp of the best +// candidate, which means that if it's way in the past, we won't wait at +// all (e.g. in catch-up or rush mining). +// 3. After the wait, we query our best mining candidate. This will be the one +// we'll work with. +// 4. Sanity check that we _actually_ have a new mining base to mine on. If +// not, wait one epoch + propagation delay, and go back to the top. +// 5. We attempt to mine a block, by calling mineOne (refer to godocs). This +// method will either return a block if we were eligible to mine, or nil +// if we weren't. +// 6a. If we mined a block, we update our state and push it out to the network +// via gossipsub. +// 6b. If we didn't mine a block, we consider this to be a nil round on top of +// the mining base we selected. If other miner or miners on the network +// were eligible to mine, we will receive their blocks via gossipsub and +// we will select that tipset on the next iteration of the loop, thus +// discarding our null round. func (m *Miner) mine(ctx context.Context) { ctx, span := trace.StartSpan(ctx, "/mine") defer span.End() @@ -416,7 +416,7 @@ func (m *Miner) GetBestMiningCandidate(ctx context.Context) (*MiningBase, error) // // This method does the following: // -// 1. +// 1. func (m *Miner) mineOne(ctx context.Context, base *MiningBase) (minedBlock *types.BlockMsg, err error) { log.Debugw("attempting to mine a block", "tipset", types.LogCids(base.TipSet.Cids())) tStart := build.Clock.Now() diff --git a/node/builder.go b/node/builder.go index f25e5f862..ca31a2c91 100644 --- a/node/builder.go +++ b/node/builder.go @@ -49,7 +49,8 @@ import ( var log = logging.Logger("builder") // special is a type used to give keys to modules which -// can't really be identified by the returned type +// +// can't really be identified by the returned type type special struct{ id int } //nolint:golint @@ -73,6 +74,7 @@ var ( type invoke int // Invokes are called in the order they are defined. +// //nolint:golint const ( // InitJournal at position 0 initializes the journal global var as soon as diff --git a/node/config/def_test.go b/node/config/def_test.go index d644ae336..1739339a2 100644 --- a/node/config/def_test.go +++ b/node/config/def_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package config import ( diff --git a/node/config/load_test.go b/node/config/load_test.go index ccc227eb8..17e185be2 100644 --- a/node/config/load_test.go +++ b/node/config/load_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package config import ( diff --git a/node/impl/client/client_test.go b/node/impl/client/client_test.go index 0b3f1c98f..7c96897c5 100644 --- a/node/impl/client/client_test.go +++ b/node/impl/client/client_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package client import ( diff --git a/node/impl/full/gas_test.go b/node/impl/full/gas_test.go index 3b4084d43..8fc585bd5 100644 --- a/node/impl/full/gas_test.go +++ b/node/impl/full/gas_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package full import ( diff --git a/node/repo/fsrepo_test.go b/node/repo/fsrepo_test.go index 9342258c3..943acc582 100644 --- a/node/repo/fsrepo_test.go +++ b/node/repo/fsrepo_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package repo import ( diff --git a/node/repo/memrepo_test.go b/node/repo/memrepo_test.go index 6fc0669da..6b3fc158b 100644 --- a/node/repo/memrepo_test.go +++ b/node/repo/memrepo_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package repo import ( diff --git a/node/repo/repo_test.go b/node/repo/repo_test.go index f2b83ce8e..16c101d44 100644 --- a/node/repo/repo_test.go +++ b/node/repo/repo_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package repo import ( diff --git a/node/shutdown_test.go b/node/shutdown_test.go index b831c6180..6a5088efd 100644 --- a/node/shutdown_test.go +++ b/node/shutdown_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package node import ( diff --git a/paychmgr/paych_test.go b/paychmgr/paych_test.go index 6787e3e0d..7de584784 100644 --- a/paychmgr/paych_test.go +++ b/paychmgr/paych_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package paychmgr import ( diff --git a/paychmgr/paychget_test.go b/paychmgr/paychget_test.go index 5f1876664..fca0022c6 100644 --- a/paychmgr/paychget_test.go +++ b/paychmgr/paychget_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package paychmgr import ( diff --git a/paychmgr/settle_test.go b/paychmgr/settle_test.go index e51c2de47..db1d35da3 100644 --- a/paychmgr/settle_test.go +++ b/paychmgr/settle_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package paychmgr import ( diff --git a/paychmgr/store_test.go b/paychmgr/store_test.go index c5a1875ae..f600b6537 100644 --- a/paychmgr/store_test.go +++ b/paychmgr/store_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package paychmgr import ( diff --git a/storage/paths/remote_test.go b/storage/paths/remote_test.go index ec58fb84d..a7bd6bf40 100644 --- a/storage/paths/remote_test.go +++ b/storage/paths/remote_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package paths_test import ( diff --git a/storage/pipeline/checks.go b/storage/pipeline/checks.go index 757714f1e..2192db5cf 100644 --- a/storage/pipeline/checks.go +++ b/storage/pipeline/checks.go @@ -18,7 +18,8 @@ import ( ) // TODO: For now we handle this by halting state execution, when we get jsonrpc reconnecting -// We should implement some wait-for-api logic +// +// We should implement some wait-for-api logic type ErrApi struct{ error } type ErrNoDeals struct{ error } @@ -91,7 +92,8 @@ func checkPieces(ctx context.Context, maddr address.Address, si SectorInfo, api } // checkPrecommit checks that data commitment generated in the sealing process -// matches pieces, and that the seal ticket isn't expired +// +// matches pieces, and that the seal ticket isn't expired func checkPrecommit(ctx context.Context, maddr address.Address, si SectorInfo, tsk types.TipSetKey, height abi.ChainEpoch, api SealingAPI) (err error) { if err := checkPieces(ctx, maddr, si, api, false); err != nil { return err diff --git a/storage/pipeline/commit_batch_test.go b/storage/pipeline/commit_batch_test.go index b25b78438..cece591d3 100644 --- a/storage/pipeline/commit_batch_test.go +++ b/storage/pipeline/commit_batch_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package sealing_test import ( diff --git a/storage/pipeline/precommit_batch_test.go b/storage/pipeline/precommit_batch_test.go index d380acbeb..735474f07 100644 --- a/storage/pipeline/precommit_batch_test.go +++ b/storage/pipeline/precommit_batch_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package sealing_test import ( diff --git a/storage/pipeline/states_failed_test.go b/storage/pipeline/states_failed_test.go index a313aedbb..0243af126 100644 --- a/storage/pipeline/states_failed_test.go +++ b/storage/pipeline/states_failed_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package sealing_test import ( diff --git a/storage/sealer/ffiwrapper/sealer_test.go b/storage/sealer/ffiwrapper/sealer_test.go index 829190015..fb6a2249c 100644 --- a/storage/sealer/ffiwrapper/sealer_test.go +++ b/storage/sealer/ffiwrapper/sealer_test.go @@ -261,7 +261,6 @@ func getGrothParamFileAndVerifyingKeys(s abi.SectorSize) { // those parameters and keys. To do this, run the following command: // // go test -run=^TestDownloadParams -// func TestDownloadParams(t *testing.T) { // defer requireFDsClosed(t, openFDs(t)) flaky likely cause of how go-embed works with param files diff --git a/storage/sealer/ffiwrapper/unseal_ranges.go b/storage/sealer/ffiwrapper/unseal_ranges.go index 22b41659c..37107aeb0 100644 --- a/storage/sealer/ffiwrapper/unseal_ranges.go +++ b/storage/sealer/ffiwrapper/unseal_ranges.go @@ -11,7 +11,8 @@ import ( ) // merge gaps between ranges which are close to each other -// TODO: more benchmarking to come up with more optimal number +// +// TODO: more benchmarking to come up with more optimal number const mergeGaps = 32 << 20 // TODO const expandRuns = 16 << 20 // unseal more than requested for future requests diff --git a/storage/sealer/manager_test.go b/storage/sealer/manager_test.go index d287462e0..739cfdd24 100644 --- a/storage/sealer/manager_test.go +++ b/storage/sealer/manager_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package sealer import ( diff --git a/storage/sealer/sched_test.go b/storage/sealer/sched_test.go index bca8ace6e..a30a4d261 100644 --- a/storage/sealer/sched_test.go +++ b/storage/sealer/sched_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package sealer import ( diff --git a/storage/sealer/storiface/index.go b/storage/sealer/storiface/index.go index a8f1f2f4a..653bd2fba 100644 --- a/storage/sealer/storiface/index.go +++ b/storage/sealer/storiface/index.go @@ -9,7 +9,8 @@ import ( ) // ID identifies sector storage by UUID. One sector storage should map to one -// filesystem, local or networked / shared by multiple machines +// +// filesystem, local or networked / shared by multiple machines type ID string const IDSep = "." diff --git a/storage/sealer/storiface/resources.go b/storage/sealer/storiface/resources.go index 0ac089c23..be5c34d0f 100644 --- a/storage/sealer/storiface/resources.go +++ b/storage/sealer/storiface/resources.go @@ -575,6 +575,7 @@ func init() { ResourceTable[sealtasks.TTRegenSectorKey] = ResourceTable[sealtasks.TTReplicaUpdate] // DataCid doesn't care about sector proof type; Use 32G AddPiece resource definition + ResourceTable[sealtasks.TTDataCid] = map[abi.RegisteredSealProof]Resources{} for proof := range ResourceTable[sealtasks.TTAddPiece] { ResourceTable[sealtasks.TTDataCid][proof] = ResourceTable[sealtasks.TTAddPiece][abi.RegisteredSealProof_StackedDrg32GiBV1] } diff --git a/storage/wdpost/wdpost_changehandler_test.go b/storage/wdpost/wdpost_changehandler_test.go index fc44091ee..3e7ca3f49 100644 --- a/storage/wdpost/wdpost_changehandler_test.go +++ b/storage/wdpost/wdpost_changehandler_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package wdpost import ( diff --git a/storage/wdpost/wdpost_nextdl_test.go b/storage/wdpost/wdpost_nextdl_test.go index 2902cb4fc..d591c1e88 100644 --- a/storage/wdpost/wdpost_nextdl_test.go +++ b/storage/wdpost/wdpost_nextdl_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package wdpost import ( diff --git a/storage/wdpost/wdpost_run_faults.go b/storage/wdpost/wdpost_run_faults.go index 22186b551..0b7a33238 100644 --- a/storage/wdpost/wdpost_run_faults.go +++ b/storage/wdpost/wdpost_run_faults.go @@ -49,8 +49,9 @@ func init() { // on chain before returning. // // TODO: the waiting should happen in the background. Right now this -// is blocking/delaying the actual generation and submission of WindowPoSts in -// this deadline! +// +// is blocking/delaying the actual generation and submission of WindowPoSts in +// this deadline! func (s *WindowPoStScheduler) declareRecoveries(ctx context.Context, dlIdx uint64, partitions []api.Partition, tsk types.TipSetKey) ([][]miner.RecoveryDeclaration, []*types.SignedMessage, error) { ctx, span := trace.StartSpan(ctx, "storage.declareRecoveries") defer span.End() @@ -205,8 +206,9 @@ func (s *WindowPoStScheduler) declareRecoveries(ctx context.Context, dlIdx uint6 // on chain before returning. // // TODO: the waiting should happen in the background. Right now this -// is blocking/delaying the actual generation and submission of WindowPoSts in -// this deadline! +// +// is blocking/delaying the actual generation and submission of WindowPoSts in +// this deadline! func (s *WindowPoStScheduler) declareFaults(ctx context.Context, dlIdx uint64, partitions []api.Partition, tsk types.TipSetKey) ([]miner.FaultDeclaration, *types.SignedMessage, error) { ctx, span := trace.StartSpan(ctx, "storage.declareFaults") defer span.End() diff --git a/storage/wdpost/wdpost_run_test.go b/storage/wdpost/wdpost_run_test.go index 233e40472..466fd6905 100644 --- a/storage/wdpost/wdpost_run_test.go +++ b/storage/wdpost/wdpost_run_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package wdpost import ( diff --git a/testplans/lotus-soup/paych/stress.go b/testplans/lotus-soup/paych/stress.go index 06c89d4d1..8f0097edf 100644 --- a/testplans/lotus-soup/paych/stress.go +++ b/testplans/lotus-soup/paych/stress.go @@ -44,7 +44,8 @@ func getClientMode(groupSeq int64) ClientMode { } // TODO Stress is currently WIP. We found blockers in Lotus that prevent us from -// making progress. See https://github.com/filecoin-project/lotus/issues/2297. +// +// making progress. See https://github.com/filecoin-project/lotus/issues/2297. func Stress(t *testkit.TestEnvironment) error { // Dispatch/forward non-client roles to defaults. if t.Role != "client" { diff --git a/tools/stats/headbuffer/head_buffer_test.go b/tools/stats/headbuffer/head_buffer_test.go index d68ba8fbc..f9c0385c0 100644 --- a/tools/stats/headbuffer/head_buffer_test.go +++ b/tools/stats/headbuffer/head_buffer_test.go @@ -1,4 +1,4 @@ -//stm: #unit +// stm: #unit package headbuffer import ( From 36ae2086abf14db22ddf83b0630bb200418d4c57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 29 Aug 2022 16:36:05 +0200 Subject: [PATCH 090/185] cli: Don't panic with no providers in client retrieve --- cli/client_retr.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cli/client_retr.go b/cli/client_retr.go index b58da2390..f32e5d4e4 100644 --- a/cli/client_retr.go +++ b/cli/client_retr.go @@ -315,6 +315,9 @@ Examples: if err != nil { return err } + if eref == nil { + return xerrors.Errorf("failed to find providers") + } if s != nil { eref.DAGs = append(eref.DAGs, lapi.DagSpec{DataSelector: s, ExportMerkleProof: cctx.Bool("car-export-merkle-proof")}) From ab61f4bb2c42b5f50057aeaf32226629f41e637c Mon Sep 17 00:00:00 2001 From: Phi Date: Tue, 30 Aug 2022 12:54:59 +0200 Subject: [PATCH 091/185] `lotus info` cmd Adds lotus info command that prints a lot of node information. --- cli/cmd.go | 1 + cli/info.go | 220 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 221 insertions(+) create mode 100644 cli/info.go diff --git a/cli/cmd.go b/cli/cmd.go index 71524d787..79023917b 100644 --- a/cli/cmd.go +++ b/cli/cmd.go @@ -69,6 +69,7 @@ var CommonCommands = []*cli.Command{ var Commands = []*cli.Command{ WithCategory("basic", sendCmd), WithCategory("basic", walletCmd), + WithCategory("basic", infoCmd), WithCategory("basic", clientCmd), WithCategory("basic", multisigCmd), WithCategory("basic", filplusCmd), diff --git a/cli/info.go b/cli/info.go new file mode 100644 index 000000000..b88480a5a --- /dev/null +++ b/cli/info.go @@ -0,0 +1,220 @@ +package cli + +import ( + "fmt" + "math" + "os" + "sort" + "strings" + "text/tabwriter" + "time" + + "github.com/dustin/go-humanize" + "github.com/fatih/color" + "github.com/urfave/cli/v2" + + "github.com/filecoin-project/go-fil-markets/storagemarket" + "github.com/filecoin-project/go-state-types/big" + "github.com/filecoin-project/lotus/build" + "github.com/filecoin-project/lotus/chain/types" +) + +var infoCmd = &cli.Command{ + Name: "info", + Usage: "Print node info", + Action: infoCmdAct, +} + +func infoCmdAct(cctx *cli.Context) error { + fullapi, acloser, err := GetFullNodeAPIV1(cctx) + if err != nil { + return err + } + defer acloser() + ctx := ReqContext(cctx) + + network, err := fullapi.StateGetNetworkParams(ctx) + if err != nil { + return err + } + + fmt.Printf("Network: %s\n", network.NetworkName) + fmt.Print("Chain: ") + head, err := fullapi.ChainHead(ctx) + if err != nil { + return err + } + + switch { + case time.Now().Unix()-int64(head.MinTimestamp()) < int64(build.BlockDelaySecs*3/2): // within 1.5 epochs + fmt.Printf("[%s]", color.GreenString("sync ok")) + case time.Now().Unix()-int64(head.MinTimestamp()) < int64(build.BlockDelaySecs*5): // within 5 epochs + fmt.Printf("[%s]", color.YellowString("sync slow (%s behind)", time.Now().Sub(time.Unix(int64(head.MinTimestamp()), 0)).Truncate(time.Second))) + default: + fmt.Printf("[%s]", color.RedString("sync behind! (%s behind)", time.Now().Sub(time.Unix(int64(head.MinTimestamp()), 0)).Truncate(time.Second))) + } + basefee := head.MinTicketBlock().ParentBaseFee + gasCol := []color.Attribute{color.FgBlue} + switch { + case basefee.GreaterThan(big.NewInt(7000_000_000)): // 7 nFIL + gasCol = []color.Attribute{color.BgRed, color.FgBlack} + case basefee.GreaterThan(big.NewInt(3000_000_000)): // 3 nFIL + gasCol = []color.Attribute{color.FgRed} + case basefee.GreaterThan(big.NewInt(750_000_000)): // 750 uFIL + gasCol = []color.Attribute{color.FgYellow} + case basefee.GreaterThan(big.NewInt(100_000_000)): // 100 uFIL + gasCol = []color.Attribute{color.FgGreen} + } + fmt.Printf(" [basefee %s]", color.New(gasCol...).Sprint(types.FIL(basefee).Short())) + + status, err := fullapi.NodeStatus(ctx, true) + if err != nil { + return err + } + + fmt.Printf(" [epoch %s]\n", color.MagentaString(("%d"), status.SyncStatus.Epoch)) + fmt.Printf("Peers to: [publish messages %d] [publish blocks %d]\n", status.PeerStatus.PeersToPublishMsgs, status.PeerStatus.PeersToPublishBlocks) + + //Chain health calculated as percentage: amount of blocks in last finality / very healthy amount of blocks in a finality (900 epochs * 5 blocks per tipset) + health := (100 * (900 * status.ChainStatus.BlocksPerTipsetLastFinality) / (900 * 5)) + switch { + case health > 85: + fmt.Printf("Chain health: %.f%% [%s]\n", health, color.GreenString("healthy")) + case health < 85: + fmt.Printf("Chain health: %.f%% [%s]\n", health, color.RedString("unhealthy")) + } + + fmt.Println() + + addr, err := fullapi.WalletDefaultAddress(ctx) + if err != nil { + return err + } + + balance, err := fullapi.WalletBalance(ctx, addr) + if err != nil { + return err + } + + fmt.Printf("Default address: \n") + fmt.Printf(" %s [%s]\n", addr.String(), types.FIL(balance).Short()) + fmt.Println() + + addrs, err := fullapi.WalletList(ctx) + if err != nil { + return err + } + + totalBalance := big.Zero() + for _, addr := range addrs { + totbal, err := fullapi.WalletBalance(ctx, addr) + if err != nil { + return err + } + totalBalance = big.Add(totalBalance, totbal) + } + + switch { + case len(addrs) <= 1: + fmt.Printf("Wallet: %v address\n", len(addrs)) + case len(addrs) > 1: + fmt.Printf("Wallet: %v addresses\n", len(addrs)) + } + fmt.Printf(" Total balance: %s\n", types.FIL(totalBalance).Short()) + + mbLockedSum := big.Zero() + mbAvailableSum := big.Zero() + for _, addr := range addrs { + mbal, err := fullapi.StateMarketBalance(ctx, addr, types.EmptyTSK) + if err != nil { + if strings.Contains(err.Error(), "actor not found") { + continue + } else { + return err + } + } + mbLockedSum = big.Add(mbLockedSum, mbal.Locked) + mbAvailableSum = big.Add(mbAvailableSum, mbal.Escrow) + } + + fmt.Printf(" Market locked: %s\n", types.FIL(mbLockedSum).Short()) + fmt.Printf(" Market available: %s\n", types.FIL(mbAvailableSum).Short()) + + fmt.Println() + + chs, err := fullapi.PaychList(ctx) + if err != nil { + return err + } + + switch { + case len(chs) <= 1: + fmt.Printf("Payment Channels: %v channel\n", len(chs)) + case len(chs) > 1: + fmt.Printf("Payment Channels: %v channels\n", len(chs)) + } + fmt.Println() + + localDeals, err := fullapi.ClientListDeals(ctx) + if err != nil { + return err + } + + var totalSize uint64 + byState := map[storagemarket.StorageDealStatus][]uint64{} + for _, deal := range localDeals { + totalSize += deal.Size + byState[deal.State] = append(byState[deal.State], deal.Size) + } + + fmt.Printf("Deals: %d, %s\n", len(localDeals), types.SizeStr(types.NewInt(totalSize))) + + type stateStat struct { + state storagemarket.StorageDealStatus + count int + bytes uint64 + } + + stateStats := make([]stateStat, 0, len(byState)) + for state, deals := range byState { + if state == storagemarket.StorageDealActive { + state = math.MaxUint64 // for sort + } + + st := stateStat{ + state: state, + count: len(deals), + } + for _, b := range deals { + st.bytes += b + } + + stateStats = append(stateStats, st) + } + + sort.Slice(stateStats, func(i, j int) bool { + return int64(stateStats[i].state) < int64(stateStats[j].state) + }) + + for _, st := range stateStats { + if st.state == math.MaxUint64 { + st.state = storagemarket.StorageDealActive + } + fmt.Printf(" %s: %d deals, %s\n", storagemarket.DealStates[st.state], st.count, types.SizeStr(types.NewInt(st.bytes))) + } + + fmt.Println() + + tw := tabwriter.NewWriter(os.Stdout, 6, 6, 2, ' ', 0) + + s, err := fullapi.NetBandwidthStats(ctx) + if err != nil { + return err + } + + fmt.Printf("Bandwidth:\n") + fmt.Fprintf(tw, "\tTotalIn\tTotalOut\tRateIn\tRateOut\n") + fmt.Fprintf(tw, "\t%s\t%s\t%s/s\t%s/s\n", humanize.Bytes(uint64(s.TotalIn)), humanize.Bytes(uint64(s.TotalOut)), humanize.Bytes(uint64(s.RateIn)), humanize.Bytes(uint64(s.RateOut))) + return tw.Flush() + +} From 683900b5a28d9c0303ac50608f9ea1b9bf47d514 Mon Sep 17 00:00:00 2001 From: Phi Date: Tue, 30 Aug 2022 13:29:22 +0200 Subject: [PATCH 092/185] make docsgen-cli make docsgen-cli --- documentation/en/cli-lotus.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/documentation/en/cli-lotus.md b/documentation/en/cli-lotus.md index 5cb6b42aa..15178d8e0 100644 --- a/documentation/en/cli-lotus.md +++ b/documentation/en/cli-lotus.md @@ -18,6 +18,7 @@ COMMANDS: BASIC: send Send funds between accounts wallet Manage wallet + info Print node info client Make deals, store data, retrieve data msig Interact with a multisig wallet filplus Interact with the verified registry actor used by Filplus @@ -398,6 +399,22 @@ OPTIONS: ``` +## lotus info +``` +NAME: + lotus info - Print node info + +USAGE: + lotus info [command options] [arguments...] + +CATEGORY: + BASIC + +OPTIONS: + --help, -h show help (default: false) + +``` + ## lotus client ``` NAME: From 8a45e8c8af836d917759dd1a44701a5361a325ec Mon Sep 17 00:00:00 2001 From: Phi Date: Wed, 31 Aug 2022 10:40:50 +0200 Subject: [PATCH 093/185] Handle "Default address not set" better Only print address and get balance if err == nil, else print that the Default address is not set --- cli/info.go | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/cli/info.go b/cli/info.go index b88480a5a..8def9e177 100644 --- a/cli/info.go +++ b/cli/info.go @@ -87,17 +87,17 @@ func infoCmdAct(cctx *cli.Context) error { fmt.Println() addr, err := fullapi.WalletDefaultAddress(ctx) - if err != nil { - return err + if err == nil { + fmt.Printf("Default address: \n") + balance, err := fullapi.WalletBalance(ctx, addr) + if err != nil { + return err + } + fmt.Printf(" %s [%s]\n", addr.String(), types.FIL(balance).Short()) + fmt.Println() + } else { + fmt.Printf("Default address: address not set\n") } - - balance, err := fullapi.WalletBalance(ctx, addr) - if err != nil { - return err - } - - fmt.Printf("Default address: \n") - fmt.Printf(" %s [%s]\n", addr.String(), types.FIL(balance).Short()) fmt.Println() addrs, err := fullapi.WalletList(ctx) From 870c2f955490826920e2180b22c1eb4fb22d6ba2 Mon Sep 17 00:00:00 2001 From: Phi Date: Wed, 31 Aug 2022 10:44:59 +0200 Subject: [PATCH 094/185] Move newline Move newline --- cli/info.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/info.go b/cli/info.go index 8def9e177..35707be84 100644 --- a/cli/info.go +++ b/cli/info.go @@ -97,8 +97,8 @@ func infoCmdAct(cctx *cli.Context) error { fmt.Println() } else { fmt.Printf("Default address: address not set\n") + fmt.Println() } - fmt.Println() addrs, err := fullapi.WalletList(ctx) if err != nil { From 818153a1e71a14f913572f1b5659fb8ad250b4af Mon Sep 17 00:00:00 2001 From: Phi Date: Wed, 31 Aug 2022 13:15:28 +0200 Subject: [PATCH 095/185] Put SyncBasefeeCheck in function Put SyncBasefeeCheck in function --- cli/info.go | 56 +++++++++++++++++++++++++++++++---------------------- 1 file changed, 33 insertions(+), 23 deletions(-) diff --git a/cli/info.go b/cli/info.go index 35707be84..b23ac9df4 100644 --- a/cli/info.go +++ b/cli/info.go @@ -1,6 +1,7 @@ package cli import ( + "context" "fmt" "math" "os" @@ -15,6 +16,7 @@ import ( "github.com/filecoin-project/go-fil-markets/storagemarket" "github.com/filecoin-project/go-state-types/big" + "github.com/filecoin-project/lotus/api/v1api" "github.com/filecoin-project/lotus/build" "github.com/filecoin-project/lotus/chain/types" ) @@ -40,33 +42,11 @@ func infoCmdAct(cctx *cli.Context) error { fmt.Printf("Network: %s\n", network.NetworkName) fmt.Print("Chain: ") - head, err := fullapi.ChainHead(ctx) + err = SyncBasefeeCheck(ctx, fullapi) if err != nil { return err } - switch { - case time.Now().Unix()-int64(head.MinTimestamp()) < int64(build.BlockDelaySecs*3/2): // within 1.5 epochs - fmt.Printf("[%s]", color.GreenString("sync ok")) - case time.Now().Unix()-int64(head.MinTimestamp()) < int64(build.BlockDelaySecs*5): // within 5 epochs - fmt.Printf("[%s]", color.YellowString("sync slow (%s behind)", time.Now().Sub(time.Unix(int64(head.MinTimestamp()), 0)).Truncate(time.Second))) - default: - fmt.Printf("[%s]", color.RedString("sync behind! (%s behind)", time.Now().Sub(time.Unix(int64(head.MinTimestamp()), 0)).Truncate(time.Second))) - } - basefee := head.MinTicketBlock().ParentBaseFee - gasCol := []color.Attribute{color.FgBlue} - switch { - case basefee.GreaterThan(big.NewInt(7000_000_000)): // 7 nFIL - gasCol = []color.Attribute{color.BgRed, color.FgBlack} - case basefee.GreaterThan(big.NewInt(3000_000_000)): // 3 nFIL - gasCol = []color.Attribute{color.FgRed} - case basefee.GreaterThan(big.NewInt(750_000_000)): // 750 uFIL - gasCol = []color.Attribute{color.FgYellow} - case basefee.GreaterThan(big.NewInt(100_000_000)): // 100 uFIL - gasCol = []color.Attribute{color.FgGreen} - } - fmt.Printf(" [basefee %s]", color.New(gasCol...).Sprint(types.FIL(basefee).Short())) - status, err := fullapi.NodeStatus(ctx, true) if err != nil { return err @@ -218,3 +198,33 @@ func infoCmdAct(cctx *cli.Context) error { return tw.Flush() } + +func SyncBasefeeCheck(ctx context.Context, fullapi v1api.FullNode) error { + head, err := fullapi.ChainHead(ctx) + if err != nil { + return err + } + + switch { + case time.Now().Unix()-int64(head.MinTimestamp()) < int64(build.BlockDelaySecs*3/2): // within 1.5 epochs + fmt.Printf("[%s]", color.GreenString("sync ok")) + case time.Now().Unix()-int64(head.MinTimestamp()) < int64(build.BlockDelaySecs*5): // within 5 epochs + fmt.Printf("[%s]", color.YellowString("sync slow (%s behind)", time.Now().Sub(time.Unix(int64(head.MinTimestamp()), 0)).Truncate(time.Second))) + default: + fmt.Printf("[%s]", color.RedString("sync behind! (%s behind)", time.Now().Sub(time.Unix(int64(head.MinTimestamp()), 0)).Truncate(time.Second))) + } + basefee := head.MinTicketBlock().ParentBaseFee + gasCol := []color.Attribute{color.FgBlue} + switch { + case basefee.GreaterThan(big.NewInt(7000_000_000)): // 7 nFIL + gasCol = []color.Attribute{color.BgRed, color.FgBlack} + case basefee.GreaterThan(big.NewInt(3000_000_000)): // 3 nFIL + gasCol = []color.Attribute{color.FgRed} + case basefee.GreaterThan(big.NewInt(750_000_000)): // 750 uFIL + gasCol = []color.Attribute{color.FgYellow} + case basefee.GreaterThan(big.NewInt(100_000_000)): // 100 uFIL + gasCol = []color.Attribute{color.FgGreen} + } + fmt.Printf(" [basefee %s]", color.New(gasCol...).Sprint(types.FIL(basefee).Short())) + return nil +} From 15ea3953f09311d1587d1c3291013771ca7ba3e7 Mon Sep 17 00:00:00 2001 From: Phi Date: Wed, 31 Aug 2022 18:42:24 +0200 Subject: [PATCH 096/185] Option to specify --from msg sender Adds the option to specify the account to send the message from in the `lotus-miner actor set-addrs` --- cmd/lotus-miner/actor.go | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/cmd/lotus-miner/actor.go b/cmd/lotus-miner/actor.go index ba7c944d7..b3e7df4dc 100644 --- a/cmd/lotus-miner/actor.go +++ b/cmd/lotus-miner/actor.go @@ -55,6 +55,10 @@ var actorSetAddrsCmd = &cli.Command{ Aliases: []string{"set-addrs"}, Usage: "set addresses that your miner can be publicly dialed on", Flags: []cli.Flag{ + &cli.StringFlag{ + Name: "from", + Usage: "optionally specify the account to send the message from", + }, &cli.Int64Flag{ Name: "gas-limit", Usage: "set gas limit", @@ -117,6 +121,25 @@ var actorSetAddrsCmd = &cli.Command{ return err } + fromAddr := minfo.Worker + if from := cctx.String("from"); from != "" { + addr, err := address.NewFromString(from) + if err != nil { + return err + } + + fromAddr = addr + } + + fromId, err := api.StateLookupID(ctx, fromAddr, types.EmptyTSK) + if err != nil { + return err + } + + if !isController(minfo, fromId) { + return xerrors.Errorf("sender isn't a controller of miner: %s", fromId) + } + params, err := actors.SerializeParams(&miner.ChangeMultiaddrsParams{NewMultiaddrs: addrs}) if err != nil { return err @@ -126,7 +149,7 @@ var actorSetAddrsCmd = &cli.Command{ smsg, err := api.MpoolPushMessage(ctx, &types.Message{ To: maddr, - From: minfo.Worker, + From: fromId, Value: types.NewInt(0), GasLimit: gasLimit, Method: builtin.MethodsMiner.ChangeMultiaddrs, From 7c00c1e5d51102e5f96a069c3f7be14d90dcdffd Mon Sep 17 00:00:00 2001 From: Phi Date: Thu, 1 Sep 2022 11:54:10 +0200 Subject: [PATCH 097/185] Tune down slice Tuning down slice to only 6 characters to avoid panics if the multisig-actor is of really low character length. --- cmd/lotus-miner/actor.go | 2 +- cmd/lotus-shed/actor.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/lotus-miner/actor.go b/cmd/lotus-miner/actor.go index ba7c944d7..3210062cd 100644 --- a/cmd/lotus-miner/actor.go +++ b/cmd/lotus-miner/actor.go @@ -513,7 +513,7 @@ var actorControlList = &cli.Command{ } kstr := k.String() if !cctx.Bool("verbose") { - kstr = kstr[:9] + "..." + kstr = kstr[:6] + "..." } bstr := types.FIL(b).String() diff --git a/cmd/lotus-shed/actor.go b/cmd/lotus-shed/actor.go index fa337d3ec..6bb14b49a 100644 --- a/cmd/lotus-shed/actor.go +++ b/cmd/lotus-shed/actor.go @@ -367,7 +367,7 @@ var actorControlList = &cli.Command{ kstr := k.String() if !cctx.Bool("verbose") { - kstr = kstr[:9] + "..." + kstr = kstr[:6] + "..." } bstr := types.FIL(b).String() From 405bfeddac75cccd70808e6e6bcefacfdce5e93d Mon Sep 17 00:00:00 2001 From: Phi Date: Thu, 1 Sep 2022 16:30:36 +0200 Subject: [PATCH 098/185] Better ledger rejection error Print a more understandable error message when a transaction is being rejected on ledger. --- cli/send.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/cli/send.go b/cli/send.go index a5200d3b8..9a8ebc25e 100644 --- a/cli/send.go +++ b/cli/send.go @@ -3,6 +3,7 @@ package cli import ( "encoding/hex" "fmt" + "strings" "github.com/urfave/cli/v2" "golang.org/x/xerrors" @@ -152,7 +153,11 @@ var sendCmd = &cli.Command{ sm, err := InteractiveSend(ctx, cctx, srv, proto) if err != nil { - return err + if strings.Contains(err.Error(), "no current EF") { + return xerrors.Errorf("transaction rejected on ledger: %w", err) + } else { + return err + } } fmt.Fprintf(cctx.App.Writer, "%s\n", sm.Cid()) From a5ea5ba9c1186266eb38dd73b72f88e81bf557f3 Mon Sep 17 00:00:00 2001 From: Phi Date: Thu, 1 Sep 2022 17:01:03 +0200 Subject: [PATCH 099/185] Fix lint Fix lint --- cli/send.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/cli/send.go b/cli/send.go index 9a8ebc25e..b5bfd3eb0 100644 --- a/cli/send.go +++ b/cli/send.go @@ -155,9 +155,8 @@ var sendCmd = &cli.Command{ if err != nil { if strings.Contains(err.Error(), "no current EF") { return xerrors.Errorf("transaction rejected on ledger: %w", err) - } else { - return err } + return err } fmt.Fprintf(cctx.App.Writer, "%s\n", sm.Cid()) From 3e74819519815cba11613146cfa92480a178c90a Mon Sep 17 00:00:00 2001 From: Phi Date: Fri, 2 Sep 2022 10:33:32 +0200 Subject: [PATCH 100/185] Check length of msig address Check the length of multisig address, and print based on that. --- cmd/lotus-miner/actor.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cmd/lotus-miner/actor.go b/cmd/lotus-miner/actor.go index 3210062cd..87b095285 100644 --- a/cmd/lotus-miner/actor.go +++ b/cmd/lotus-miner/actor.go @@ -513,7 +513,9 @@ var actorControlList = &cli.Command{ } kstr := k.String() if !cctx.Bool("verbose") { - kstr = kstr[:6] + "..." + if len(kstr) > 9 { + kstr = kstr[:6] + "..." + } } bstr := types.FIL(b).String() From a31b8a1b58ae65749650ffe1b7f04e9f5c97d894 Mon Sep 17 00:00:00 2001 From: Phi-rjan Date: Fri, 2 Sep 2022 15:12:32 +0200 Subject: [PATCH 101/185] Update cli/info.go MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Łukasz Magiera --- cli/info.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/cli/info.go b/cli/info.go index b23ac9df4..5a3d6da5f 100644 --- a/cli/info.go +++ b/cli/info.go @@ -74,11 +74,10 @@ func infoCmdAct(cctx *cli.Context) error { return err } fmt.Printf(" %s [%s]\n", addr.String(), types.FIL(balance).Short()) - fmt.Println() } else { fmt.Printf("Default address: address not set\n") - fmt.Println() } + fmt.Println() addrs, err := fullapi.WalletList(ctx) if err != nil { From ab0699875a7f51c3fbcd532f812839ee883a0f46 Mon Sep 17 00:00:00 2001 From: Phi Date: Fri, 2 Sep 2022 15:20:36 +0200 Subject: [PATCH 102/185] make gen happy make gen happy not sad --- cli/info.go | 1 + 1 file changed, 1 insertion(+) diff --git a/cli/info.go b/cli/info.go index 5a3d6da5f..0d036875a 100644 --- a/cli/info.go +++ b/cli/info.go @@ -16,6 +16,7 @@ import ( "github.com/filecoin-project/go-fil-markets/storagemarket" "github.com/filecoin-project/go-state-types/big" + "github.com/filecoin-project/lotus/api/v1api" "github.com/filecoin-project/lotus/build" "github.com/filecoin-project/lotus/chain/types" From 9c48922a75e9b7ed681af27db681a44cf98db4e3 Mon Sep 17 00:00:00 2001 From: Phi Date: Mon, 5 Sep 2022 09:58:34 +0200 Subject: [PATCH 103/185] Fix lotus-shed actor cmd Check the length of multisig address in lotus-shed actor cmd as well. --- cmd/lotus-shed/actor.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cmd/lotus-shed/actor.go b/cmd/lotus-shed/actor.go index 6bb14b49a..10a4e1d09 100644 --- a/cmd/lotus-shed/actor.go +++ b/cmd/lotus-shed/actor.go @@ -367,7 +367,9 @@ var actorControlList = &cli.Command{ kstr := k.String() if !cctx.Bool("verbose") { - kstr = kstr[:6] + "..." + if len(kstr) > 9 { + kstr = kstr[:6] + "..." + } } bstr := types.FIL(b).String() From 67d4f905e6b880f044bd45dfadaf48d0fb072e70 Mon Sep 17 00:00:00 2001 From: LexLuthr <88259624+LexLuthr@users.noreply.github.com> Date: Tue, 6 Sep 2022 21:17:30 +0530 Subject: [PATCH 104/185] feat: proving: Introduce manual sector fault recovery (#9144) * rebase * fix lint error * fix errors * add itest * make gen after rebase * apply suggestion from review * make gen after latest rebase * gen after rebase * fix waitgroup * change as per review * refactor Recovery Batches * fix CLI * gen after rebase * close the channel --- api/api_storage.go | 5 + api/proxy_gen.go | 13 ++ build/openrpc/full.json.gz | Bin 28350 -> 28354 bytes build/openrpc/gateway.json.gz | Bin 4943 -> 4942 bytes build/openrpc/miner.json.gz | Bin 15263 -> 15449 bytes build/openrpc/worker.json.gz | Bin 5077 -> 5076 bytes cmd/lotus-miner/proving.go | 83 +++++++++++ documentation/en/api-v0-methods-miner.md | 32 +++++ documentation/en/cli-lotus-miner.md | 30 ++-- extern/filecoin-ffi | 2 +- itests/wdpost_config_test.go | 167 +++++++++++++++++++++++ node/impl/storminer.go | 21 +++ storage/wdpost/wdpost_run.go | 4 + storage/wdpost/wdpost_run_faults.go | 109 +++++++++++++++ storage/wdpost/wdpost_sched.go | 2 + 15 files changed, 459 insertions(+), 9 deletions(-) diff --git a/api/api_storage.go b/api/api_storage.go index 93bb1f869..4d05419d6 100644 --- a/api/api_storage.go +++ b/api/api_storage.go @@ -314,6 +314,11 @@ type StorageMiner interface { CheckProvable(ctx context.Context, pp abi.RegisteredPoStProof, sectors []storiface.SectorRef, expensive bool) (map[abi.SectorNumber]string, error) //perm:admin ComputeProof(ctx context.Context, ssi []builtin.ExtendedSectorInfo, rand abi.PoStRandomness, poStEpoch abi.ChainEpoch, nv abinetwork.Version) ([]builtin.PoStProof, error) //perm:read + + // RecoverFault can be used to declare recoveries manually. It sends messages + // to the miner actor with details of recovered sectors and returns the CID of messages. It honors the + // maxPartitionsPerRecoveryMessage from the config + RecoverFault(ctx context.Context, sectors []abi.SectorNumber) ([]cid.Cid, error) //perm:admin } var _ storiface.WorkerReturn = *new(StorageMiner) diff --git a/api/proxy_gen.go b/api/proxy_gen.go index 274b9ee12..4c428d2b9 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -770,6 +770,8 @@ type StorageMinerStruct struct { PledgeSector func(p0 context.Context) (abi.SectorID, error) `perm:"write"` + RecoverFault func(p0 context.Context, p1 []abi.SectorNumber) ([]cid.Cid, error) `perm:"admin"` + ReturnAddPiece func(p0 context.Context, p1 storiface.CallID, p2 abi.PieceInfo, p3 *storiface.CallError) error `perm:"admin"` ReturnDataCid func(p0 context.Context, p1 storiface.CallID, p2 abi.PieceInfo, p3 *storiface.CallError) error `perm:"admin"` @@ -4617,6 +4619,17 @@ func (s *StorageMinerStub) PledgeSector(p0 context.Context) (abi.SectorID, error return *new(abi.SectorID), ErrNotSupported } +func (s *StorageMinerStruct) RecoverFault(p0 context.Context, p1 []abi.SectorNumber) ([]cid.Cid, error) { + if s.Internal.RecoverFault == nil { + return *new([]cid.Cid), ErrNotSupported + } + return s.Internal.RecoverFault(p0, p1) +} + +func (s *StorageMinerStub) RecoverFault(p0 context.Context, p1 []abi.SectorNumber) ([]cid.Cid, error) { + return *new([]cid.Cid), ErrNotSupported +} + func (s *StorageMinerStruct) ReturnAddPiece(p0 context.Context, p1 storiface.CallID, p2 abi.PieceInfo, p3 *storiface.CallError) error { if s.Internal.ReturnAddPiece == nil { return ErrNotSupported diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 6beb0d65af84db6fa5835a7d37a4677615412cb0..0bf4574e23f3787455bbfbd2f1b9bd81eb109c52 100644 GIT binary patch delta 25681 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

6d-x?07OWQ6O8l~k(h8iLjVgp#?V6o_d^Bj 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 delta 25636 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�f`MM(5mrb!XG^RM3BJcVl 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 diff --git a/build/openrpc/gateway.json.gz b/build/openrpc/gateway.json.gz index 583f188390e8d332771655a1083519bf234fe090..7ca6673b5f7f7679037eabab7c9a315c48033f03 100644 GIT binary patch delta 4355 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

Gas Trace - + {{define "virt" -}} {{- if . -}} +({{.}}) @@ -1243,7 +1244,7 @@ var compStateMsg = ` {{- end}} {{range .GasCharges}} - + {{template "gasC" .}}
NameTotal/Compute/StorageTime TakenLocation
NumTotal/Compute/StorageTime TakenLocation
{{.Name}}{{if .Extra}}:{{.Extra}}{{end}}
{{.Num}}{{if .Extra}}:{{.Extra}}{{end}}{{if PrintTiming}}{{.TimeTaken}}{{end}} @@ -1368,7 +1369,7 @@ func codeStr(c cid.Cid) string { } func getMethod(code cid.Cid, method abi.MethodNum) string { - return filcns.NewActorRegistry().Methods[code][method].Name // todo: use remote + return filcns.NewActorRegistry().Methods[code][method].Num // todo: use remote } func toFil(f types.BigInt) types.FIL { @@ -1904,7 +1905,7 @@ var StateSysActorCIDsCmd = &cli.Command{ fmt.Printf("Network Version: %d\n", nv) - actorVersion, err := actors.VersionForNetwork(nv) + actorVersion, err := actorstypes.VersionForNetwork(nv) if err != nil { return err } diff --git a/cmd/lotus-miner/init.go b/cmd/lotus-miner/init.go index 055df69ef..dd245f038 100644 --- a/cmd/lotus-miner/init.go +++ b/cmd/lotus-miner/init.go @@ -42,7 +42,6 @@ import ( "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/builtin/miner" "github.com/filecoin-project/lotus/chain/actors/builtin/power" - "github.com/filecoin-project/lotus/chain/actors/policy" "github.com/filecoin-project/lotus/chain/gen/slashfilter" "github.com/filecoin-project/lotus/chain/types" lcli "github.com/filecoin-project/lotus/cli" @@ -91,7 +90,7 @@ var initCmd = &cli.Command{ &cli.StringFlag{ Name: "sector-size", Usage: "specify sector size to use", - Value: units.BytesSize(float64(policy.GetDefaultSectorSize())), + Value: units.BytesSize(float64(abi.SectorSize(2048))), }, &cli.StringSliceFlag{ Name: "pre-sealed-sectors", diff --git a/cmd/lotus-miner/precommits-info.go b/cmd/lotus-miner/precommits-info.go index 034378cff..0ce757537 100644 --- a/cmd/lotus-miner/precommits-info.go +++ b/cmd/lotus-miner/precommits-info.go @@ -7,7 +7,7 @@ import ( cbor "github.com/ipfs/go-ipld-cbor" "github.com/urfave/cli/v2" - minertypes "github.com/filecoin-project/go-state-types/builtin/v8/miner" + minertypes "github.com/filecoin-project/go-state-types/builtin/v9/miner" "github.com/filecoin-project/specs-actors/v7/actors/util/adt" "github.com/filecoin-project/lotus/blockstore" diff --git a/cmd/lotus-miner/sectors.go b/cmd/lotus-miner/sectors.go index 84c2d8e95..45a1256aa 100644 --- a/cmd/lotus-miner/sectors.go +++ b/cmd/lotus-miner/sectors.go @@ -21,7 +21,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-state-types/builtin" - "github.com/filecoin-project/go-state-types/builtin/v8/miner" + "github.com/filecoin-project/go-state-types/builtin/v9/miner" "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/lotus/api" diff --git a/cmd/lotus-pcr/main.go b/cmd/lotus-pcr/main.go index 474ed55f7..f491d9a33 100644 --- a/cmd/lotus-pcr/main.go +++ b/cmd/lotus-pcr/main.go @@ -27,7 +27,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-state-types/builtin" - minertypes "github.com/filecoin-project/go-state-types/builtin/v8/miner" + minertypes "github.com/filecoin-project/go-state-types/builtin/v9/miner" "github.com/filecoin-project/go-state-types/exitcode" "github.com/filecoin-project/go-state-types/network" miner2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/miner" diff --git a/cmd/lotus-shed/msg.go b/cmd/lotus-shed/msg.go index bd8bd64f0..49412948c 100644 --- a/cmd/lotus-shed/msg.go +++ b/cmd/lotus-shed/msg.go @@ -141,7 +141,7 @@ func printMessage(cctx *cli.Context, msg *types.Message) error { return nil } - fmt.Println("Method:", filcns.NewActorRegistry().Methods[toact.Code][msg.Method].Name) // todo use remote + fmt.Println("Method:", filcns.NewActorRegistry().Methods[toact.Code][msg.Method].Num) // todo use remote p, err := lcli.JsonParams(toact.Code, msg.Method, msg.Params) if err != nil { return err diff --git a/cmd/lotus-sim/info.go b/cmd/lotus-sim/info.go index 864adb3bc..b92fa4b2f 100644 --- a/cmd/lotus-sim/info.go +++ b/cmd/lotus-sim/info.go @@ -66,7 +66,7 @@ func printInfo(ctx context.Context, sim *simulation.Simulation, out io.Writer) e startTime := time.Unix(int64(start.MinTimestamp()), 0) duration := headTime.Sub(startTime) - fmt.Fprintf(tw, "Name:\t%s\n", sim.Name()) + fmt.Fprintf(tw, "Num:\t%s\n", sim.Name()) fmt.Fprintf(tw, "Head:\t%s\n", head) fmt.Fprintf(tw, "Start Epoch:\t%d\n", firstEpoch) fmt.Fprintf(tw, "End Epoch:\t%d\n", headEpoch) diff --git a/cmd/lotus-sim/simulation/blockbuilder/blockbuilder.go b/cmd/lotus-sim/simulation/blockbuilder/blockbuilder.go index 5e84688ec..d9a32481c 100644 --- a/cmd/lotus-sim/simulation/blockbuilder/blockbuilder.go +++ b/cmd/lotus-sim/simulation/blockbuilder/blockbuilder.go @@ -9,10 +9,10 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" + actorstypes "github.com/filecoin-project/go-state-types/actors" "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/lotus/build" - "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/builtin" "github.com/filecoin-project/lotus/chain/actors/builtin/account" @@ -273,8 +273,8 @@ func (bb *BlockBuilder) StateManager() *stmgr.StateManager { } // ActorsVersion returns the actors version for the target block. -func (bb *BlockBuilder) ActorsVersion() (actors.Version, error) { - return actors.VersionForNetwork(bb.NetworkVersion()) +func (bb *BlockBuilder) ActorsVersion() (actorstypes.Version, error) { + return actorstypes.VersionForNetwork(bb.NetworkVersion()) } func (bb *BlockBuilder) L() *zap.SugaredLogger { diff --git a/cmd/lotus-sim/simulation/node.go b/cmd/lotus-sim/simulation/node.go index b0317c66b..f115ffe19 100644 --- a/cmd/lotus-sim/simulation/node.go +++ b/cmd/lotus-sim/simulation/node.go @@ -115,7 +115,7 @@ func (nd *Node) LoadSim(ctx context.Context, name string) (*Simulation, error) { // Create creates a new simulation. // // - This will fail if a simulation already exists with the given name. -// - Name must not contain a '/'. +// - Num must not contain a '/'. func (nd *Node) CreateSim(ctx context.Context, name string, head *types.TipSet) (*Simulation, error) { if strings.Contains(name, "/") { return nil, xerrors.Errorf("simulation name %q cannot contain a '/'", name) diff --git a/cmd/lotus-sim/simulation/stages/commit_queue.go b/cmd/lotus-sim/simulation/stages/commit_queue.go index ec12c2776..60cbfa4ba 100644 --- a/cmd/lotus-sim/simulation/stages/commit_queue.go +++ b/cmd/lotus-sim/simulation/stages/commit_queue.go @@ -5,7 +5,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - minertypes "github.com/filecoin-project/go-state-types/builtin/v8/miner" + minertypes "github.com/filecoin-project/go-state-types/builtin/v9/miner" "github.com/filecoin-project/lotus/chain/actors/policy" ) diff --git a/cmd/lotus-sim/simulation/stages/commit_queue_test.go b/cmd/lotus-sim/simulation/stages/commit_queue_test.go index df0de9757..0b9a2ebdb 100644 --- a/cmd/lotus-sim/simulation/stages/commit_queue_test.go +++ b/cmd/lotus-sim/simulation/stages/commit_queue_test.go @@ -8,7 +8,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - minertypes "github.com/filecoin-project/go-state-types/builtin/v8/miner" + minertypes "github.com/filecoin-project/go-state-types/builtin/v9/miner" "github.com/filecoin-project/lotus/chain/actors/policy" ) diff --git a/cmd/lotus-sim/simulation/stages/interface.go b/cmd/lotus-sim/simulation/stages/interface.go index d58321d87..fffdbec6b 100644 --- a/cmd/lotus-sim/simulation/stages/interface.go +++ b/cmd/lotus-sim/simulation/stages/interface.go @@ -5,7 +5,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - minertypes "github.com/filecoin-project/go-state-types/builtin/v8/miner" + minertypes "github.com/filecoin-project/go-state-types/builtin/v9/miner" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/cmd/lotus-sim/simulation/blockbuilder" diff --git a/cmd/lotus-sim/simulation/stages/precommit_stage.go b/cmd/lotus-sim/simulation/stages/precommit_stage.go index fc61ff08b..e5f455f74 100644 --- a/cmd/lotus-sim/simulation/stages/precommit_stage.go +++ b/cmd/lotus-sim/simulation/stages/precommit_stage.go @@ -11,7 +11,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-state-types/builtin" - minertypes "github.com/filecoin-project/go-state-types/builtin/v8/miner" + minertypes "github.com/filecoin-project/go-state-types/builtin/v9/miner" "github.com/filecoin-project/go-state-types/network" miner5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/miner" diff --git a/cmd/lotus-sim/simulation/stages/provecommit_stage.go b/cmd/lotus-sim/simulation/stages/provecommit_stage.go index efa14e4e8..d15ea60f0 100644 --- a/cmd/lotus-sim/simulation/stages/provecommit_stage.go +++ b/cmd/lotus-sim/simulation/stages/provecommit_stage.go @@ -8,7 +8,7 @@ import ( "github.com/filecoin-project/go-bitfield" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/builtin" - minertypes "github.com/filecoin-project/go-state-types/builtin/v8/miner" + minertypes "github.com/filecoin-project/go-state-types/builtin/v9/miner" "github.com/filecoin-project/go-state-types/exitcode" "github.com/filecoin-project/go-state-types/network" miner5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/miner" diff --git a/cmd/lotus-wallet/interactive.go b/cmd/lotus-wallet/interactive.go index 40c3f8922..9770961c0 100644 --- a/cmd/lotus-wallet/interactive.go +++ b/cmd/lotus-wallet/interactive.go @@ -103,7 +103,7 @@ func (c *InteractiveWallet) WalletSign(ctx context.Context, k address.Address, m return xerrors.Errorf("looking up dest actor: %w", err) } - fmt.Println("Method:", filcns.NewActorRegistry().Methods[toact.Code][cmsg.Method].Name) + fmt.Println("Method:", filcns.NewActorRegistry().Methods[toact.Code][cmsg.Method].Num) p, err := lcli.JsonParams(toact.Code, cmsg.Method, cmsg.Params) if err != nil { return err @@ -125,7 +125,7 @@ func (c *InteractiveWallet) WalletSign(ctx context.Context, k address.Address, m return xerrors.Errorf("looking up msig dest actor: %w", err) } - fmt.Println("\tMultiSig Proposal Method:", filcns.NewActorRegistry().Methods[toact.Code][mp.Method].Name) // todo use remote + fmt.Println("\tMultiSig Proposal Method:", filcns.NewActorRegistry().Methods[toact.Code][mp.Method].Num) // todo use remote p, err := lcli.JsonParams(toact.Code, mp.Method, mp.Params) if err != nil { return err diff --git a/cmd/tvx/extract_many.go b/cmd/tvx/extract_many.go index bc5ad2a30..07bbc8df4 100644 --- a/cmd/tvx/extract_many.go +++ b/cmd/tvx/extract_many.go @@ -164,7 +164,7 @@ func runExtractMany(c *cli.Context) error { } else if methodnum >= len(m) { return fmt.Errorf("unrecognized method number for actor %s: %d", actorcode, methodnum) } else { - methodname = m[abi.MethodNum(methodnum)].Name + methodname = m[abi.MethodNum(methodnum)].Num } // exitcode string representations are of kind ErrType(0); strip out diff --git a/conformance/chaos/cbor_gen.go b/conformance/chaos/cbor_gen.go index 2deaaa53f..436849cdc 100644 --- a/conformance/chaos/cbor_gen.go +++ b/conformance/chaos/cbor_gen.go @@ -8,13 +8,12 @@ import ( "math" "sort" - cid "github.com/ipfs/go-cid" - cbg "github.com/whyrusleeping/cbor-gen" - xerrors "golang.org/x/xerrors" - address "github.com/filecoin-project/go-address" abi "github.com/filecoin-project/go-state-types/abi" exitcode "github.com/filecoin-project/go-state-types/exitcode" + cid "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + xerrors "golang.org/x/xerrors" ) var _ = xerrors.Errorf diff --git a/conformance/driver.go b/conformance/driver.go index 0bb51800e..2329fe336 100644 --- a/conformance/driver.go +++ b/conformance/driver.go @@ -11,13 +11,13 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" + actorstypes "github.com/filecoin-project/go-state-types/actors" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/test-vectors/schema" "github.com/filecoin-project/lotus/blockstore" - "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/consensus/filcns" "github.com/filecoin-project/lotus/chain/state" "github.com/filecoin-project/lotus/chain/stmgr" @@ -249,7 +249,7 @@ func (d *Driver) ExecuteMessage(bs blockstore.Blockstore, params ExecuteMessageP // register the chaos actor if required by the vector. if chaosOn, ok := d.selector["chaos_actor"]; ok && chaosOn == "true" { - av, _ := actors.VersionForNetwork(params.NetworkVersion) + av, _ := actorstypes.VersionForNetwork(params.NetworkVersion) invoker.Register(av, nil, chaos.Actor{}) } diff --git a/documentation/en/cli-lotus-miner.md b/documentation/en/cli-lotus-miner.md index ec266311b..940d2b7f6 100644 --- a/documentation/en/cli-lotus-miner.md +++ b/documentation/en/cli-lotus-miner.md @@ -71,7 +71,7 @@ OPTIONS: --create-worker-key create separate worker key (default: false) --worker value, -w value worker key to use (overrides --create-worker-key) --owner value, -o value owner key to use - --sector-size value specify sector size to use (default: "32GiB") + --sector-size value specify sector size to use (default: "2KiB") --pre-sealed-sectors value specify set of presealed sectors for starting as a genesis miner (accepts multiple inputs) --pre-sealed-metadata value specify the metadata file for the presealed sectors --nosync don't check full-node sync status (default: false) diff --git a/documentation/en/cli-lotus.md b/documentation/en/cli-lotus.md index 15178d8e0..0a064be76 100644 --- a/documentation/en/cli-lotus.md +++ b/documentation/en/cli-lotus.md @@ -2029,7 +2029,7 @@ USAGE: lotus state actor-cids [command options] [arguments...] OPTIONS: - --network-version value specify network version (default: 16) + --network-version value specify network version (default: 17) ``` diff --git a/gen/api/proxygen.go b/gen/api/proxygen.go index df39132ff..f756c0d0c 100644 --- a/gen/api/proxygen.go +++ b/gen/api/proxygen.go @@ -140,14 +140,14 @@ func generate(path, pkg, outpkg, outfile string) error { ast.Walk(v, ap) type methodInfo struct { - Name string + Num string node ast.Node Tags map[string][]string NamedParams, ParamNames, Results, DefRes string } type strinfo struct { - Name string + Num string Methods map[string]*methodInfo Include []string } @@ -182,7 +182,7 @@ func generate(path, pkg, outpkg, outfile string) error { for ifname, methods := range v.Methods { if _, ok := m.Infos[ifname]; !ok { m.Infos[ifname] = &strinfo{ - Name: ifname, + Num: ifname, Methods: map[string]*methodInfo{}, Include: v.Include[ifname], } @@ -239,7 +239,7 @@ func generate(path, pkg, outpkg, outfile string) error { } info.Methods[mname] = &methodInfo{ - Name: mname, + Num: mname, node: node.node, Tags: map[string][]string{}, NamedParams: strings.Join(params, ", "), @@ -298,18 +298,18 @@ import ( var ErrNotSupported = xerrors.New("method not supported") {{range .Infos}} -type {{.Name}}Struct struct { +type {{.Num}}Struct struct { {{range .Include}} {{.}}Struct {{end}} Internal struct { {{range .Methods}} - {{.Name}} func({{.NamedParams}}) ({{.Results}}) `+"`"+`{{range .Tags}}{{index . 0}}:"{{index . 1}}"{{end}}`+"`"+` + {{.Num}} func({{.NamedParams}}) ({{.Results}}) `+"`"+`{{range .Tags}}{{index . 0}}:"{{index . 1}}"{{end}}`+"`"+` {{end}} } } -type {{.Name}}Stub struct { +type {{.Num}}Stub struct { {{range .Include}} {{.}}Stub {{end}} @@ -317,22 +317,22 @@ type {{.Name}}Stub struct { {{end}} {{range .Infos}} -{{$name := .Name}} +{{$name := .Num}} {{range .Methods}} -func (s *{{$name}}Struct) {{.Name}}({{.NamedParams}}) ({{.Results}}) { - if s.Internal.{{.Name}} == nil { +func (s *{{$name}}Struct) {{.Num}}({{.NamedParams}}) ({{.Results}}) { + if s.Internal.{{.Num}} == nil { return {{.DefRes}}ErrNotSupported } - return s.Internal.{{.Name}}({{.ParamNames}}) + return s.Internal.{{.Num}}({{.ParamNames}}) } -func (s *{{$name}}Stub) {{.Name}}({{.NamedParams}}) ({{.Results}}) { +func (s *{{$name}}Stub) {{.Num}}({{.NamedParams}}) ({{.Results}}) { return {{.DefRes}}ErrNotSupported } {{end}} {{end}} -{{range .Infos}}var _ {{.Name}} = new({{.Name}}Struct) +{{range .Infos}}var _ {{.Num}} = new({{.Num}}Struct) {{end}} `) diff --git a/gen/inlinegen-data.json b/gen/inlinegen-data.json index 8b8081ac4..e767f990a 100644 --- a/gen/inlinegen-data.json +++ b/gen/inlinegen-data.json @@ -1,7 +1,7 @@ { - "actorVersions": [0, 2, 3, 4, 5, 6, 7, 8], - "latestActorsVersion": 8, + "actorVersions": [0, 2, 3, 4, 5, 6, 7, 8, 9], + "latestActorsVersion": 9, - "networkVersions": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], - "latestNetworkVersion": 16 + "networkVersions": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17], + "latestNetworkVersion": 17 } diff --git a/go.mod b/go.mod index 9b89fba0f..fb9e4c589 100644 --- a/go.mod +++ b/go.mod @@ -42,7 +42,7 @@ require ( github.com/filecoin-project/go-legs v0.4.4 github.com/filecoin-project/go-padreader v0.0.1 github.com/filecoin-project/go-paramfetch v0.0.4 - github.com/filecoin-project/go-state-types v0.1.11 + github.com/filecoin-project/go-state-types v0.1.12-0.20220907205406-e8b028ad923f github.com/filecoin-project/go-statemachine v1.0.2 github.com/filecoin-project/go-statestore v0.2.0 github.com/filecoin-project/go-storedcounter v0.1.0 @@ -187,6 +187,7 @@ require ( github.com/filecoin-project/go-amt-ipld/v2 v2.1.0 // indirect github.com/filecoin-project/go-amt-ipld/v3 v3.1.0 // indirect github.com/filecoin-project/go-amt-ipld/v4 v4.0.0 // indirect + github.com/filecoin-project/go-commp-utils/nonffi v0.0.0-20220905160352-62059082a837 // indirect github.com/filecoin-project/go-ds-versioning v0.1.1 // indirect github.com/filecoin-project/go-hamt-ipld v0.1.5 // indirect github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 // indirect diff --git a/go.sum b/go.sum index 79f7c7319..3fd51d139 100644 --- a/go.sum +++ b/go.sum @@ -304,6 +304,8 @@ github.com/filecoin-project/go-cbor-util v0.0.1 h1:E1LYZYTtjfAQwCReho0VXvbu8t3CY github.com/filecoin-project/go-cbor-util v0.0.1/go.mod h1:pqTiPHobNkOVM5thSRsHYjyQfq7O5QSCMhvuu9JoDlg= github.com/filecoin-project/go-commp-utils v0.1.3 h1:rTxbkNXZU7FLgdkBk8RsQIEOuPONHykEoX3xGk41Fkw= github.com/filecoin-project/go-commp-utils v0.1.3/go.mod h1:3ENlD1pZySaUout0p9ANQrY3fDFoXdqyX04J+dWpK30= +github.com/filecoin-project/go-commp-utils/nonffi v0.0.0-20220905160352-62059082a837 h1:4cITW0pwgvqLs86Q9bWQa34+jBfR1V687bDkmv2DgnA= +github.com/filecoin-project/go-commp-utils/nonffi v0.0.0-20220905160352-62059082a837/go.mod h1:e2YBjSblNVoBckkbv3PPqsq71q98oFkFqL7s1etViGo= github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= github.com/filecoin-project/go-crypto v0.0.1 h1:AcvpSGGCgjaY8y1az6AMfKQWreF/pWO2JJGLl6gCq6o= github.com/filecoin-project/go-crypto v0.0.1/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= @@ -340,8 +342,9 @@ github.com/filecoin-project/go-state-types v0.0.0-20201102161440-c8033295a1fc/go github.com/filecoin-project/go-state-types v0.1.0/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.6/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q= github.com/filecoin-project/go-state-types v0.1.8/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q= -github.com/filecoin-project/go-state-types v0.1.11 h1:QzKUILRGa9gjJKPCiFlvCfcDGK2IqtJ6CpRQULvZZpA= -github.com/filecoin-project/go-state-types v0.1.11/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q= +github.com/filecoin-project/go-state-types v0.1.10/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q= +github.com/filecoin-project/go-state-types v0.1.12-0.20220907205406-e8b028ad923f h1:khCYaU4ieUwhWiRncmGBBI21wXhVF1xaGSgw7Pwcvmw= +github.com/filecoin-project/go-state-types v0.1.12-0.20220907205406-e8b028ad923f/go.mod h1:n/kujdC9JphvYTrmaD1+vJpvDPy/DwzckoMzP0nBKWI= github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig= github.com/filecoin-project/go-statemachine v1.0.2 h1:421SSWBk8GIoCoWYYTE/d+qCWccgmRH0uXotXRDjUbc= github.com/filecoin-project/go-statemachine v1.0.2/go.mod h1:jZdXXiHa61n4NmgWFG4w8tnqgvZVHYbJ3yW7+y8bF54= diff --git a/itests/kit/ensemble_opts_nv.go b/itests/kit/ensemble_opts_nv.go index b51b82bd5..64bed559b 100644 --- a/itests/kit/ensemble_opts_nv.go +++ b/itests/kit/ensemble_opts_nv.go @@ -49,12 +49,12 @@ func LatestActorsAt(upgradeHeight abi.ChainEpoch) EnsembleOpt { }) /* inline-gen start */ return UpgradeSchedule(stmgr.Upgrade{ - Network: network.Version15, + Network: network.Version16, Height: -1, }, stmgr.Upgrade{ - Network: network.Version16, + Network: network.Version17, Height: upgradeHeight, - Migration: filcns.UpgradeActorsV8, + Migration: filcns.UpgradeActorsV9, }) /* inline-gen end */ } diff --git a/itests/lite_migration_test.go b/itests/lite_migration_test.go index 972f2df70..704380da3 100644 --- a/itests/lite_migration_test.go +++ b/itests/lite_migration_test.go @@ -11,6 +11,7 @@ import ( "github.com/stretchr/testify/require" "github.com/filecoin-project/go-address" + actorstypes "github.com/filecoin-project/go-state-types/actors" system8 "github.com/filecoin-project/go-state-types/builtin/v8/system" "github.com/filecoin-project/go-state-types/manifest" "github.com/filecoin-project/go-state-types/network" @@ -18,7 +19,6 @@ import ( "github.com/filecoin-project/specs-actors/v8/actors/util/adt" "github.com/filecoin-project/lotus/blockstore" - "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/builtin/system" "github.com/filecoin-project/lotus/chain/consensus/filcns" "github.com/filecoin-project/lotus/chain/state" @@ -59,7 +59,7 @@ func TestLiteMigration(t *testing.T) { // populate the entries field of the manifest require.NoError(t, newManifest.Load(ctx, ctxStore), "error loading new manifest") - newStateRoot, err := filcns.LiteMigration(ctx, bs, newManifestCid, stateRoot, actors.Version8, types.StateTreeVersion4, types.StateTreeVersion4) + newStateRoot, err := filcns.LiteMigration(ctx, bs, newManifestCid, stateRoot, actorstypes.Version8, types.StateTreeVersion4, types.StateTreeVersion4) require.NoError(t, err) newStateTree, err := state.LoadStateTree(ctxStore, newStateRoot) diff --git a/journal/mockjournal/journal.go b/journal/mockjournal/journal.go index 842c252bd..3668923e5 100644 --- a/journal/mockjournal/journal.go +++ b/journal/mockjournal/journal.go @@ -7,9 +7,8 @@ package mockjournal import ( reflect "reflect" - gomock "github.com/golang/mock/gomock" - journal "github.com/filecoin-project/lotus/journal" + gomock "github.com/golang/mock/gomock" ) // MockJournal is a mock of Journal interface. diff --git a/lib/retry/retry.go b/lib/retry/retry.go index 0b53c0fa3..88307a800 100644 --- a/lib/retry/retry.go +++ b/lib/retry/retry.go @@ -2,10 +2,9 @@ package retry import ( "errors" + logging "github.com/ipfs/go-log/v2" "reflect" "time" - - logging "github.com/ipfs/go-log/v2" ) var log = logging.Logger("retry") diff --git a/lotuspond/front/src/chain/methodgen.go b/lotuspond/front/src/chain/methodgen.go index da174bfaa..5fd6cde93 100644 --- a/lotuspond/front/src/chain/methodgen.go +++ b/lotuspond/front/src/chain/methodgen.go @@ -54,7 +54,7 @@ func main() { if !ok { continue } - out[name] = append(out[name], m.Name) + out[name] = append(out[name], m.Num) remaining-- } } diff --git a/markets/dagstore/mocks/mock_lotus_accessor.go b/markets/dagstore/mocks/mock_lotus_accessor.go index 3910512cf..19923cc2a 100644 --- a/markets/dagstore/mocks/mock_lotus_accessor.go +++ b/markets/dagstore/mocks/mock_lotus_accessor.go @@ -8,10 +8,9 @@ import ( context "context" reflect "reflect" + mount "github.com/filecoin-project/dagstore/mount" gomock "github.com/golang/mock/gomock" cid "github.com/ipfs/go-cid" - - mount "github.com/filecoin-project/dagstore/mount" ) // MockMinerAPI is a mock of MinerAPI interface. diff --git a/markets/storageadapter/ondealsectorcommitted_test.go b/markets/storageadapter/ondealsectorcommitted_test.go index 624cf84ae..5cb5230b4 100644 --- a/markets/storageadapter/ondealsectorcommitted_test.go +++ b/markets/storageadapter/ondealsectorcommitted_test.go @@ -19,7 +19,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/builtin" markettypes "github.com/filecoin-project/go-state-types/builtin/v8/market" - minertypes "github.com/filecoin-project/go-state-types/builtin/v8/miner" + minertypes "github.com/filecoin-project/go-state-types/builtin/v9/miner" "github.com/filecoin-project/go-state-types/cbor" tutils "github.com/filecoin-project/specs-actors/v2/support/testing" diff --git a/node/bundle/bundle.go b/node/bundle/bundle.go index cb97838f5..abdb34e69 100644 --- a/node/bundle/bundle.go +++ b/node/bundle/bundle.go @@ -10,6 +10,8 @@ import ( "github.com/ipld/go-car" "golang.org/x/xerrors" + actorstypes "github.com/filecoin-project/go-state-types/actors" + "github.com/filecoin-project/lotus/blockstore" "github.com/filecoin-project/lotus/build" "github.com/filecoin-project/lotus/chain/actors" @@ -39,10 +41,10 @@ func LoadBundle(ctx context.Context, bs blockstore.Blockstore, r io.Reader) (cid // LoadBundles loads the bundles for the specified actor versions into the passed blockstore, if and // only if the bundle's manifest is not already present in the blockstore. -func LoadBundles(ctx context.Context, bs blockstore.Blockstore, versions ...actors.Version) error { +func LoadBundles(ctx context.Context, bs blockstore.Blockstore, versions ...actorstypes.Version) error { for _, av := range versions { // No bundles before version 8. - if av < actors.Version8 { + if av < actorstypes.Version8 { continue } diff --git a/node/config/cfgdocgen/gen.go b/node/config/cfgdocgen/gen.go index 513350152..d14b1aecf 100644 --- a/node/config/cfgdocgen/gen.go +++ b/node/config/cfgdocgen/gen.go @@ -94,7 +94,7 @@ func run() error { package config type DocField struct { - Name string + Num string Type string Comment string } @@ -109,7 +109,7 @@ var Doc = map[string][]DocField{ for _, f := range typ { fmt.Println("\t\t{") - fmt.Printf("\t\t\tName: \"%s\",\n", f.Name) + fmt.Printf("\t\t\tNum: \"%s\",\n", f.Name) fmt.Printf("\t\t\tType: \"%s\",\n\n", f.Type) fmt.Printf("\t\t\tComment: `%s`,\n", f.Comment) fmt.Println("\t\t},") diff --git a/node/hello/cbor_gen.go b/node/hello/cbor_gen.go index 81a1774c1..68c82e2bb 100644 --- a/node/hello/cbor_gen.go +++ b/node/hello/cbor_gen.go @@ -8,11 +8,10 @@ import ( "math" "sort" + abi "github.com/filecoin-project/go-state-types/abi" cid "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" xerrors "golang.org/x/xerrors" - - abi "github.com/filecoin-project/go-state-types/abi" ) var _ = xerrors.Errorf diff --git a/node/impl/full/multisig.go b/node/impl/full/multisig.go index 8438f7419..886d66d5e 100644 --- a/node/impl/full/multisig.go +++ b/node/impl/full/multisig.go @@ -8,6 +8,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" + actorstypes "github.com/filecoin-project/go-state-types/actors" "github.com/filecoin-project/go-state-types/big" multisig2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/multisig" @@ -29,7 +30,7 @@ func (a *MsigAPI) messageBuilder(ctx context.Context, from address.Address) (mul if err != nil { return nil, err } - av, err := actors.VersionForNetwork(nver) + av, err := actorstypes.VersionForNetwork(nver) if err != nil { return nil, err } diff --git a/node/impl/full/state.go b/node/impl/full/state.go index 08800ba10..97308dcc9 100644 --- a/node/impl/full/state.go +++ b/node/impl/full/state.go @@ -16,8 +16,9 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-bitfield" "github.com/filecoin-project/go-state-types/abi" + actorstypes "github.com/filecoin-project/go-state-types/actors" "github.com/filecoin-project/go-state-types/big" - minertypes "github.com/filecoin-project/go-state-types/builtin/v8/miner" + minertypes "github.com/filecoin-project/go-state-types/builtin/v9/miner" "github.com/filecoin-project/go-state-types/cbor" "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/go-state-types/dline" @@ -1536,7 +1537,7 @@ func (m *StateModule) StateNetworkVersion(ctx context.Context, tsk types.TipSetK } func (a *StateAPI) StateActorCodeCIDs(ctx context.Context, nv network.Version) (map[string]cid.Cid, error) { - actorVersion, err := actors.VersionForNetwork(nv) + actorVersion, err := actorstypes.VersionForNetwork(nv) if err != nil { return nil, xerrors.Errorf("invalid network version %d: %w", nv, err) } @@ -1550,7 +1551,7 @@ func (a *StateAPI) StateActorCodeCIDs(ctx context.Context, nv network.Version) ( } func (a *StateAPI) StateActorManifestCID(ctx context.Context, nv network.Version) (cid.Cid, error) { - actorVersion, err := actors.VersionForNetwork(nv) + actorVersion, err := actorstypes.VersionForNetwork(nv) if err != nil { return cid.Undef, xerrors.Errorf("invalid network version") } diff --git a/node/impl/storminer.go b/node/impl/storminer.go index f054f627e..326bcbf00 100644 --- a/node/impl/storminer.go +++ b/node/impl/storminer.go @@ -35,7 +35,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" builtintypes "github.com/filecoin-project/go-state-types/builtin" - minertypes "github.com/filecoin-project/go-state-types/builtin/v8/miner" + minertypes "github.com/filecoin-project/go-state-types/builtin/v9/miner" "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/lotus/api" diff --git a/paychmgr/cbor_gen.go b/paychmgr/cbor_gen.go index 78a55488e..450d526d8 100644 --- a/paychmgr/cbor_gen.go +++ b/paychmgr/cbor_gen.go @@ -8,12 +8,11 @@ import ( "math" "sort" + address "github.com/filecoin-project/go-address" + paych "github.com/filecoin-project/go-state-types/builtin/v8/paych" cid "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" xerrors "golang.org/x/xerrors" - - address "github.com/filecoin-project/go-address" - paych "github.com/filecoin-project/go-state-types/builtin/v8/paych" ) var _ = xerrors.Errorf diff --git a/paychmgr/paych.go b/paychmgr/paych.go index 45703a6c8..c683aaadd 100644 --- a/paychmgr/paych.go +++ b/paychmgr/paych.go @@ -9,11 +9,11 @@ import ( "github.com/filecoin-project/go-address" cborutil "github.com/filecoin-project/go-cbor-util" + actorstypes "github.com/filecoin-project/go-state-types/actors" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-state-types/builtin/v8/paych" "github.com/filecoin-project/lotus/api" - "github.com/filecoin-project/lotus/chain/actors" lpaych "github.com/filecoin-project/lotus/chain/actors/builtin/paych" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/lib/sigs" @@ -89,7 +89,7 @@ func (ca *channelAccessor) messageBuilder(ctx context.Context, from address.Addr return nil, err } - av, err := actors.VersionForNetwork(nwVersion) + av, err := actorstypes.VersionForNetwork(nwVersion) if err != nil { return nil, err } diff --git a/storage/paths/mocks/index.go b/storage/paths/mocks/index.go index 6fdcb03b9..fa2c8c830 100644 --- a/storage/paths/mocks/index.go +++ b/storage/paths/mocks/index.go @@ -8,12 +8,10 @@ import ( context "context" reflect "reflect" - gomock "github.com/golang/mock/gomock" - abi "github.com/filecoin-project/go-state-types/abi" - fsutil "github.com/filecoin-project/lotus/storage/sealer/fsutil" storiface "github.com/filecoin-project/lotus/storage/sealer/storiface" + gomock "github.com/golang/mock/gomock" ) // MockSectorIndex is a mock of SectorIndex interface. diff --git a/storage/paths/mocks/pf.go b/storage/paths/mocks/pf.go index 50b020aaa..7c4836a68 100644 --- a/storage/paths/mocks/pf.go +++ b/storage/paths/mocks/pf.go @@ -8,12 +8,10 @@ import ( os "os" reflect "reflect" - gomock "github.com/golang/mock/gomock" - abi "github.com/filecoin-project/go-state-types/abi" - partialfile "github.com/filecoin-project/lotus/storage/sealer/partialfile" storiface "github.com/filecoin-project/lotus/storage/sealer/storiface" + gomock "github.com/golang/mock/gomock" ) // MockPartialFileHandler is a mock of PartialFileHandler interface. diff --git a/storage/paths/mocks/store.go b/storage/paths/mocks/store.go index 72be48323..16deda2e5 100644 --- a/storage/paths/mocks/store.go +++ b/storage/paths/mocks/store.go @@ -8,12 +8,10 @@ import ( context "context" reflect "reflect" - gomock "github.com/golang/mock/gomock" - abi "github.com/filecoin-project/go-state-types/abi" - fsutil "github.com/filecoin-project/lotus/storage/sealer/fsutil" storiface "github.com/filecoin-project/lotus/storage/sealer/storiface" + gomock "github.com/golang/mock/gomock" ) // MockStore is a mock of Store interface. diff --git a/storage/pipeline/cbor_gen.go b/storage/pipeline/cbor_gen.go index 2fb8c445c..c330392f7 100644 --- a/storage/pipeline/cbor_gen.go +++ b/storage/pipeline/cbor_gen.go @@ -8,14 +8,12 @@ import ( "math" "sort" + abi "github.com/filecoin-project/go-state-types/abi" + miner "github.com/filecoin-project/go-state-types/builtin/v9/miner" + api "github.com/filecoin-project/lotus/api" cid "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" xerrors "golang.org/x/xerrors" - - abi "github.com/filecoin-project/go-state-types/abi" - miner "github.com/filecoin-project/go-state-types/builtin/v8/miner" - - api "github.com/filecoin-project/lotus/api" ) var _ = xerrors.Errorf diff --git a/storage/pipeline/commit_batch.go b/storage/pipeline/commit_batch.go index 2011ad92e..b5651c5fb 100644 --- a/storage/pipeline/commit_batch.go +++ b/storage/pipeline/commit_batch.go @@ -13,15 +13,15 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-bitfield" "github.com/filecoin-project/go-state-types/abi" + actorstypes "github.com/filecoin-project/go-state-types/actors" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-state-types/builtin" - "github.com/filecoin-project/go-state-types/builtin/v8/miner" + "github.com/filecoin-project/go-state-types/builtin/v9/miner" "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/go-state-types/proof" "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/build" - "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/policy" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/node/config" @@ -583,7 +583,7 @@ func (b *CommitBatcher) getCommitCutoff(si SectorInfo) (time.Time, error) { if pci == nil { return time.Now(), xerrors.Errorf("precommit info not found") } - av, err := actors.VersionForNetwork(nv) + av, err := actorstypes.VersionForNetwork(nv) if err != nil { log.Errorf("unsupported network vrsion: %s", err) return time.Now(), err diff --git a/storage/pipeline/commit_batch_test.go b/storage/pipeline/commit_batch_test.go index cece591d3..a8948edcf 100644 --- a/storage/pipeline/commit_batch_test.go +++ b/storage/pipeline/commit_batch_test.go @@ -16,7 +16,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" - minertypes "github.com/filecoin-project/go-state-types/builtin/v8/miner" + minertypes "github.com/filecoin-project/go-state-types/builtin/v9/miner" "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/go-state-types/network" prooftypes "github.com/filecoin-project/go-state-types/proof" diff --git a/storage/pipeline/fsm_events.go b/storage/pipeline/fsm_events.go index eb1087151..8ddd529a6 100644 --- a/storage/pipeline/fsm_events.go +++ b/storage/pipeline/fsm_events.go @@ -8,7 +8,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" - "github.com/filecoin-project/go-state-types/builtin/v8/miner" + "github.com/filecoin-project/go-state-types/builtin/v9/miner" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/storage/sealer/storiface" diff --git a/storage/pipeline/mocks/api.go b/storage/pipeline/mocks/api.go index 4e0813194..015e69c15 100644 --- a/storage/pipeline/mocks/api.go +++ b/storage/pipeline/mocks/api.go @@ -8,21 +8,19 @@ import ( context "context" reflect "reflect" - gomock "github.com/golang/mock/gomock" - cid "github.com/ipfs/go-cid" - address "github.com/filecoin-project/go-address" bitfield "github.com/filecoin-project/go-bitfield" abi "github.com/filecoin-project/go-state-types/abi" big "github.com/filecoin-project/go-state-types/big" - miner "github.com/filecoin-project/go-state-types/builtin/v8/miner" + miner "github.com/filecoin-project/go-state-types/builtin/v9/miner" crypto "github.com/filecoin-project/go-state-types/crypto" dline "github.com/filecoin-project/go-state-types/dline" network "github.com/filecoin-project/go-state-types/network" - api "github.com/filecoin-project/lotus/api" miner0 "github.com/filecoin-project/lotus/chain/actors/builtin/miner" types "github.com/filecoin-project/lotus/chain/types" + gomock "github.com/golang/mock/gomock" + cid "github.com/ipfs/go-cid" ) // MockSealingAPI is a mock of SealingAPI interface. diff --git a/storage/pipeline/mocks/mock_commit_batcher.go b/storage/pipeline/mocks/mock_commit_batcher.go index d61fde912..71c973b2a 100644 --- a/storage/pipeline/mocks/mock_commit_batcher.go +++ b/storage/pipeline/mocks/mock_commit_batcher.go @@ -8,16 +8,14 @@ import ( context "context" reflect "reflect" - gomock "github.com/golang/mock/gomock" - address "github.com/filecoin-project/go-address" abi "github.com/filecoin-project/go-state-types/abi" big "github.com/filecoin-project/go-state-types/big" - miner "github.com/filecoin-project/go-state-types/builtin/v8/miner" + miner "github.com/filecoin-project/go-state-types/builtin/v9/miner" network "github.com/filecoin-project/go-state-types/network" - api "github.com/filecoin-project/lotus/api" types "github.com/filecoin-project/lotus/chain/types" + gomock "github.com/golang/mock/gomock" ) // MockCommitBatcherApi is a mock of CommitBatcherApi interface. diff --git a/storage/pipeline/mocks/mock_precommit_batcher.go b/storage/pipeline/mocks/mock_precommit_batcher.go index 2f65e3e03..e8435276d 100644 --- a/storage/pipeline/mocks/mock_precommit_batcher.go +++ b/storage/pipeline/mocks/mock_precommit_batcher.go @@ -8,14 +8,12 @@ import ( context "context" reflect "reflect" - gomock "github.com/golang/mock/gomock" - address "github.com/filecoin-project/go-address" big "github.com/filecoin-project/go-state-types/big" network "github.com/filecoin-project/go-state-types/network" - api "github.com/filecoin-project/lotus/api" types "github.com/filecoin-project/lotus/chain/types" + gomock "github.com/golang/mock/gomock" ) // MockPreCommitBatcherApi is a mock of PreCommitBatcherApi interface. diff --git a/storage/pipeline/precommit_batch.go b/storage/pipeline/precommit_batch.go index d0de68daa..7f7ea8069 100644 --- a/storage/pipeline/precommit_batch.go +++ b/storage/pipeline/precommit_batch.go @@ -14,7 +14,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-state-types/builtin" - "github.com/filecoin-project/go-state-types/builtin/v8/miner" + "github.com/filecoin-project/go-state-types/builtin/v9/miner" "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/lotus/api" @@ -328,7 +328,14 @@ func (b *PreCommitBatcher) processBatch(cfg sealiface.Config, tsk types.TipSetKe } res.Sectors = append(res.Sectors, p.pci.SectorNumber) - params.Sectors = append(params.Sectors, *p.pci) + params.Sectors = append(params.Sectors, miner.PreCommitSectorParams{ + SealProof: p.pci.SealProof, + SectorNumber: p.pci.SectorNumber, + SealedCID: p.pci.SealedCID, + SealRandEpoch: p.pci.SealRandEpoch, + DealIDs: p.pci.DealIDs, + Expiration: p.pci.Expiration, + }) deposit = big.Add(deposit, p.deposit) } diff --git a/storage/pipeline/precommit_batch_test.go b/storage/pipeline/precommit_batch_test.go index 735474f07..1779128bd 100644 --- a/storage/pipeline/precommit_batch_test.go +++ b/storage/pipeline/precommit_batch_test.go @@ -15,7 +15,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" - minertypes "github.com/filecoin-project/go-state-types/builtin/v8/miner" + minertypes "github.com/filecoin-project/go-state-types/builtin/v9/miner" "github.com/filecoin-project/go-state-types/network" miner6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/miner" diff --git a/storage/pipeline/sealing.go b/storage/pipeline/sealing.go index 8a1540d34..153a4cc32 100644 --- a/storage/pipeline/sealing.go +++ b/storage/pipeline/sealing.go @@ -15,7 +15,7 @@ import ( "github.com/filecoin-project/go-bitfield" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" - "github.com/filecoin-project/go-state-types/builtin/v8/miner" + "github.com/filecoin-project/go-state-types/builtin/v9/miner" "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/go-state-types/dline" "github.com/filecoin-project/go-state-types/network" diff --git a/storage/pipeline/states_failed.go b/storage/pipeline/states_failed.go index c57bef61b..38f030333 100644 --- a/storage/pipeline/states_failed.go +++ b/storage/pipeline/states_failed.go @@ -10,7 +10,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-commp-utils/zerocomm" "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/builtin/v8/miner" + "github.com/filecoin-project/go-state-types/builtin/v9/miner" "github.com/filecoin-project/go-state-types/exitcode" "github.com/filecoin-project/go-statemachine" diff --git a/storage/pipeline/states_replica_update.go b/storage/pipeline/states_replica_update.go index 3392b92e7..ae90d2535 100644 --- a/storage/pipeline/states_replica_update.go +++ b/storage/pipeline/states_replica_update.go @@ -10,7 +10,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-state-types/builtin" - "github.com/filecoin-project/go-state-types/builtin/v8/miner" + "github.com/filecoin-project/go-state-types/builtin/v9/miner" "github.com/filecoin-project/go-state-types/exitcode" "github.com/filecoin-project/go-statemachine" diff --git a/storage/pipeline/states_sealing.go b/storage/pipeline/states_sealing.go index 5ec8f077f..96e1f5a7e 100644 --- a/storage/pipeline/states_sealing.go +++ b/storage/pipeline/states_sealing.go @@ -9,9 +9,10 @@ import ( "github.com/filecoin-project/go-commp-utils/zerocomm" "github.com/filecoin-project/go-state-types/abi" + actorstypes "github.com/filecoin-project/go-state-types/actors" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-state-types/builtin" - "github.com/filecoin-project/go-state-types/builtin/v8/miner" + "github.com/filecoin-project/go-state-types/builtin/v9/miner" "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/go-state-types/exitcode" "github.com/filecoin-project/go-state-types/network" @@ -20,7 +21,6 @@ import ( "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/build" - "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/policy" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/storage/pipeline/lib/nullreader" @@ -153,7 +153,7 @@ func (m *Sealing) getTicket(ctx statemachine.Context, sector SectorInfo) (abi.Se return nil, 0, allocated, xerrors.Errorf("getTicket: StateNetworkVersion: api error, not proceeding: %+v", err) } - av, err := actors.VersionForNetwork(nv) + av, err := actorstypes.VersionForNetwork(nv) if err != nil { return nil, 0, allocated, xerrors.Errorf("getTicket: actor version for network error, not proceeding: %w", err) } @@ -240,7 +240,7 @@ func (m *Sealing) handlePreCommit1(ctx statemachine.Context, sector SectorInfo) return nil } - av, err := actors.VersionForNetwork(nv) + av, err := actorstypes.VersionForNetwork(nv) if err != nil { log.Errorf("handlePreCommit1: VersionForNetwork error, not proceeding: %w", err) return nil @@ -327,7 +327,7 @@ func (m *Sealing) preCommitParams(ctx statemachine.Context, sector SectorInfo) ( return nil, big.Zero(), types.EmptyTSK, ctx.Send(SectorSealPreCommit1Failed{xerrors.Errorf("failed to get network version: %w", err)}) } - av, err := actors.VersionForNetwork(nv) + av, err := actorstypes.VersionForNetwork(nv) if err != nil { return nil, big.Zero(), types.EmptyTSK, ctx.Send(SectorSealPreCommit1Failed{xerrors.Errorf("failed to get actors version: %w", err)}) } diff --git a/storage/pipeline/types.go b/storage/pipeline/types.go index 5889588bd..0419aabc2 100644 --- a/storage/pipeline/types.go +++ b/storage/pipeline/types.go @@ -7,7 +7,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" - "github.com/filecoin-project/go-state-types/builtin/v8/miner" + "github.com/filecoin-project/go-state-types/builtin/v9/miner" "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/chain/types" diff --git a/storage/sealer/cbor_gen.go b/storage/sealer/cbor_gen.go index 48bf0146a..6db7d96a4 100644 --- a/storage/sealer/cbor_gen.go +++ b/storage/sealer/cbor_gen.go @@ -8,11 +8,10 @@ import ( "math" "sort" + sealtasks "github.com/filecoin-project/lotus/storage/sealer/sealtasks" cid "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" xerrors "golang.org/x/xerrors" - - sealtasks "github.com/filecoin-project/lotus/storage/sealer/sealtasks" ) var _ = xerrors.Errorf diff --git a/storage/wdpost/wdpost_changehandler.go b/storage/wdpost/wdpost_changehandler.go index 5778aaf9d..266b8b042 100644 --- a/storage/wdpost/wdpost_changehandler.go +++ b/storage/wdpost/wdpost_changehandler.go @@ -6,7 +6,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/builtin/v8/miner" + "github.com/filecoin-project/go-state-types/builtin/v9/miner" "github.com/filecoin-project/go-state-types/dline" "github.com/filecoin-project/lotus/chain/types" diff --git a/storage/wdpost/wdpost_changehandler_test.go b/storage/wdpost/wdpost_changehandler_test.go index 3e7ca3f49..dac6c4558 100644 --- a/storage/wdpost/wdpost_changehandler_test.go +++ b/storage/wdpost/wdpost_changehandler_test.go @@ -13,7 +13,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - minertypes "github.com/filecoin-project/go-state-types/builtin/v8/miner" + minertypes "github.com/filecoin-project/go-state-types/builtin/v9/miner" "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/go-state-types/dline" tutils "github.com/filecoin-project/specs-actors/support/testing" diff --git a/storage/wdpost/wdpost_journal.go b/storage/wdpost/wdpost_journal.go index b4c790eb0..406628f68 100644 --- a/storage/wdpost/wdpost_journal.go +++ b/storage/wdpost/wdpost_journal.go @@ -4,7 +4,7 @@ import ( "github.com/ipfs/go-cid" "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/builtin/v8/miner" + "github.com/filecoin-project/go-state-types/builtin/v9/miner" "github.com/filecoin-project/go-state-types/dline" ) diff --git a/storage/wdpost/wdpost_run.go b/storage/wdpost/wdpost_run.go index 0501923b0..3640eafe5 100644 --- a/storage/wdpost/wdpost_run.go +++ b/storage/wdpost/wdpost_run.go @@ -14,7 +14,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-state-types/builtin" - "github.com/filecoin-project/go-state-types/builtin/v8/miner" + "github.com/filecoin-project/go-state-types/builtin/v9/miner" "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/go-state-types/dline" "github.com/filecoin-project/go-state-types/network" diff --git a/storage/wdpost/wdpost_run_faults.go b/storage/wdpost/wdpost_run_faults.go index 9e9854a7c..2474ce77b 100644 --- a/storage/wdpost/wdpost_run_faults.go +++ b/storage/wdpost/wdpost_run_faults.go @@ -14,7 +14,7 @@ import ( "github.com/filecoin-project/go-bitfield" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/builtin" - "github.com/filecoin-project/go-state-types/builtin/v8/miner" + "github.com/filecoin-project/go-state-types/builtin/v9/miner" "github.com/filecoin-project/go-state-types/dline" "github.com/filecoin-project/lotus/api" diff --git a/storage/wdpost/wdpost_run_test.go b/storage/wdpost/wdpost_run_test.go index 466fd6905..cb110cc0d 100644 --- a/storage/wdpost/wdpost_run_test.go +++ b/storage/wdpost/wdpost_run_test.go @@ -13,9 +13,10 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-bitfield" "github.com/filecoin-project/go-state-types/abi" + actorstypes "github.com/filecoin-project/go-state-types/actors" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-state-types/builtin" - minertypes "github.com/filecoin-project/go-state-types/builtin/v8/miner" + minertypes "github.com/filecoin-project/go-state-types/builtin/v9/miner" "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/go-state-types/dline" "github.com/filecoin-project/go-state-types/network" @@ -500,7 +501,7 @@ func (m *mockStorageMinerAPI) StateMinerProvingDeadline(ctx context.Context, add } func (m *mockStorageMinerAPI) StateGetActor(ctx context.Context, actor address.Address, ts types.TipSetKey) (*types.Actor, error) { - code, ok := actors.GetActorCodeID(actors.Version7, actors.MinerKey) + code, ok := actors.GetActorCodeID(actorstypes.Version7, actors.MinerKey) if !ok { return nil, xerrors.Errorf("failed to get miner actor code ID for actors version %d", actors.Version7) } diff --git a/storage/wdpost/wdpost_sched.go b/storage/wdpost/wdpost_sched.go index 66722e283..21dfecb60 100644 --- a/storage/wdpost/wdpost_sched.go +++ b/storage/wdpost/wdpost_sched.go @@ -12,7 +12,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-bitfield" "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/builtin/v8/miner" + "github.com/filecoin-project/go-state-types/builtin/v9/miner" "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/go-state-types/dline" "github.com/filecoin-project/go-state-types/network" From 642555d0fb16f142ac6acb7a038424f53e8945ec Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 7 Sep 2022 19:30:55 -0400 Subject: [PATCH 109/185] Fix discrepancies, run fiximports --- api/cbor_gen.go | 7 +- api/mocks/mock_full.go | 18 ++-- api/proxy_gen.go | 18 ++-- api/v0api/proxy_gen.go | 10 ++- api/v0api/v0mocks/mock_full.go | 18 ++-- chain/actors/builtin/account/account.go | 18 ++-- chain/actors/builtin/account/v0.go | 6 +- chain/actors/builtin/account/v2.go | 6 +- chain/actors/builtin/account/v3.go | 6 +- chain/actors/builtin/account/v4.go | 6 +- chain/actors/builtin/account/v5.go | 6 +- chain/actors/builtin/account/v6.go | 6 +- chain/actors/builtin/account/v7.go | 6 +- chain/actors/builtin/account/v8.go | 6 +- chain/actors/builtin/account/v9.go | 6 +- chain/actors/builtin/builtin.go | 30 +++---- chain/actors/builtin/builtin.go.template | 4 +- chain/actors/builtin/cron/cron.go | 28 +++---- chain/actors/builtin/cron/v0.go | 4 +- chain/actors/builtin/cron/v2.go | 4 +- chain/actors/builtin/cron/v3.go | 4 +- chain/actors/builtin/cron/v4.go | 4 +- chain/actors/builtin/cron/v5.go | 4 +- chain/actors/builtin/cron/v6.go | 4 +- chain/actors/builtin/cron/v7.go | 4 +- chain/actors/builtin/cron/v8.go | 4 +- chain/actors/builtin/cron/v9.go | 4 +- chain/actors/builtin/init/init.go | 30 +++---- chain/actors/builtin/init/v0.go | 10 +-- chain/actors/builtin/init/v2.go | 10 +-- chain/actors/builtin/init/v3.go | 11 ++- chain/actors/builtin/init/v4.go | 11 ++- chain/actors/builtin/init/v5.go | 11 ++- chain/actors/builtin/init/v6.go | 11 ++- chain/actors/builtin/init/v7.go | 11 ++- chain/actors/builtin/init/v8.go | 10 +-- chain/actors/builtin/init/v9.go | 10 +-- chain/actors/builtin/market/market.go | 33 +++----- chain/actors/builtin/market/state.go.template | 2 +- chain/actors/builtin/market/v0.go | 10 +-- chain/actors/builtin/market/v2.go | 10 +-- chain/actors/builtin/market/v3.go | 10 +-- chain/actors/builtin/market/v4.go | 10 +-- chain/actors/builtin/market/v5.go | 10 +-- chain/actors/builtin/market/v6.go | 9 +- chain/actors/builtin/market/v7.go | 9 +- chain/actors/builtin/market/v8.go | 11 ++- chain/actors/builtin/market/v9.go | 11 ++- chain/actors/builtin/miner/miner.go | 31 +++---- chain/actors/builtin/miner/v0.go | 15 ++-- chain/actors/builtin/miner/v2.go | 12 +-- chain/actors/builtin/miner/v3.go | 13 ++- chain/actors/builtin/miner/v4.go | 13 ++- chain/actors/builtin/miner/v5.go | 13 ++- chain/actors/builtin/miner/v6.go | 13 ++- chain/actors/builtin/miner/v7.go | 13 ++- chain/actors/builtin/miner/v8.go | 14 ++-- chain/actors/builtin/miner/v9.go | 14 ++-- .../builtin/multisig/message.go.template | 2 +- chain/actors/builtin/multisig/message0.go | 1 - chain/actors/builtin/multisig/message2.go | 1 - chain/actors/builtin/multisig/message3.go | 1 - chain/actors/builtin/multisig/message4.go | 1 - chain/actors/builtin/multisig/message5.go | 1 - chain/actors/builtin/multisig/message6.go | 1 - chain/actors/builtin/multisig/message7.go | 1 - chain/actors/builtin/multisig/message8.go | 1 - chain/actors/builtin/multisig/message9.go | 3 +- chain/actors/builtin/multisig/multisig.go | 29 +++---- chain/actors/builtin/multisig/v0.go | 8 +- chain/actors/builtin/multisig/v2.go | 8 +- chain/actors/builtin/multisig/v3.go | 9 +- chain/actors/builtin/multisig/v4.go | 9 +- chain/actors/builtin/multisig/v5.go | 9 +- chain/actors/builtin/multisig/v6.go | 9 +- chain/actors/builtin/multisig/v7.go | 9 +- chain/actors/builtin/multisig/v8.go | 8 +- chain/actors/builtin/multisig/v9.go | 8 +- chain/actors/builtin/paych/message0.go | 2 - chain/actors/builtin/paych/message2.go | 2 - chain/actors/builtin/paych/message3.go | 2 - chain/actors/builtin/paych/message4.go | 2 - chain/actors/builtin/paych/message5.go | 2 - chain/actors/builtin/paych/message6.go | 2 - chain/actors/builtin/paych/message7.go | 2 - chain/actors/builtin/paych/message8.go | 4 +- chain/actors/builtin/paych/message9.go | 4 +- chain/actors/builtin/paych/paych.go | 16 +--- chain/actors/builtin/paych/v0.go | 5 +- chain/actors/builtin/paych/v2.go | 5 +- chain/actors/builtin/paych/v3.go | 5 +- chain/actors/builtin/paych/v4.go | 5 +- chain/actors/builtin/paych/v5.go | 5 +- chain/actors/builtin/paych/v6.go | 5 +- chain/actors/builtin/paych/v7.go | 5 +- chain/actors/builtin/paych/v8.go | 5 +- chain/actors/builtin/paych/v9.go | 5 +- chain/actors/builtin/power/power.go | 32 +++---- chain/actors/builtin/power/state.go.template | 2 +- chain/actors/builtin/power/v0.go | 10 +-- chain/actors/builtin/power/v2.go | 10 +-- chain/actors/builtin/power/v3.go | 11 ++- chain/actors/builtin/power/v4.go | 11 ++- chain/actors/builtin/power/v5.go | 11 ++- chain/actors/builtin/power/v6.go | 11 ++- chain/actors/builtin/power/v7.go | 11 ++- chain/actors/builtin/power/v8.go | 10 +-- chain/actors/builtin/power/v9.go | 12 +-- chain/actors/builtin/registry.go | 5 +- chain/actors/builtin/reward/reward.go | 18 ++-- chain/actors/builtin/reward/v0.go | 8 +- chain/actors/builtin/reward/v2.go | 8 +- chain/actors/builtin/reward/v3.go | 8 +- chain/actors/builtin/reward/v4.go | 8 +- chain/actors/builtin/reward/v5.go | 8 +- chain/actors/builtin/reward/v6.go | 8 +- chain/actors/builtin/reward/v7.go | 8 +- chain/actors/builtin/reward/v8.go | 8 +- chain/actors/builtin/reward/v9.go | 8 +- chain/actors/builtin/system/system.go | 31 +++---- chain/actors/builtin/system/v0.go | 4 +- chain/actors/builtin/system/v2.go | 4 +- chain/actors/builtin/system/v3.go | 4 +- chain/actors/builtin/system/v4.go | 4 +- chain/actors/builtin/system/v5.go | 4 +- chain/actors/builtin/system/v6.go | 4 +- chain/actors/builtin/system/v7.go | 4 +- chain/actors/builtin/system/v8.go | 4 +- chain/actors/builtin/system/v9.go | 4 +- chain/actors/builtin/verifreg/v0.go | 8 +- chain/actors/builtin/verifreg/v2.go | 8 +- chain/actors/builtin/verifreg/v3.go | 11 ++- chain/actors/builtin/verifreg/v4.go | 11 ++- chain/actors/builtin/verifreg/v5.go | 11 ++- chain/actors/builtin/verifreg/v6.go | 11 ++- chain/actors/builtin/verifreg/v7.go | 11 ++- chain/actors/builtin/verifreg/v8.go | 10 +-- chain/actors/builtin/verifreg/v9.go | 10 +-- chain/actors/builtin/verifreg/verifreg.go | 27 ++---- chain/actors/policy/policy.go | 84 ++++++++----------- chain/exchange/cbor_gen.go | 3 +- chain/types/cbor_gen.go | 7 +- chain/vm/cbor_gen.go | 3 +- cli/servicesmock_test.go | 4 +- conformance/chaos/cbor_gen.go | 7 +- journal/mockjournal/journal.go | 3 +- lib/retry/retry.go | 3 +- markets/dagstore/mocks/mock_lotus_accessor.go | 3 +- node/hello/cbor_gen.go | 3 +- paychmgr/cbor_gen.go | 5 +- storage/paths/mocks/index.go | 4 +- storage/paths/mocks/pf.go | 4 +- storage/paths/mocks/store.go | 4 +- storage/pipeline/cbor_gen.go | 8 +- storage/pipeline/mocks/api.go | 6 +- storage/pipeline/mocks/mock_commit_batcher.go | 4 +- .../pipeline/mocks/mock_precommit_batcher.go | 4 +- storage/sealer/cbor_gen.go | 3 +- 158 files changed, 636 insertions(+), 781 deletions(-) diff --git a/api/cbor_gen.go b/api/cbor_gen.go index 40982779e..66655fd75 100644 --- a/api/cbor_gen.go +++ b/api/cbor_gen.go @@ -8,12 +8,13 @@ import ( "math" "sort" - abi "github.com/filecoin-project/go-state-types/abi" - market "github.com/filecoin-project/go-state-types/builtin/v8/market" - paych "github.com/filecoin-project/go-state-types/builtin/v8/paych" cid "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" xerrors "golang.org/x/xerrors" + + abi "github.com/filecoin-project/go-state-types/abi" + market "github.com/filecoin-project/go-state-types/builtin/v8/market" + paych "github.com/filecoin-project/go-state-types/builtin/v8/paych" ) var _ = xerrors.Errorf diff --git a/api/mocks/mock_full.go b/api/mocks/mock_full.go index fd2d5520c..bfc4fc905 100644 --- a/api/mocks/mock_full.go +++ b/api/mocks/mock_full.go @@ -10,6 +10,15 @@ import ( reflect "reflect" time "time" + gomock "github.com/golang/mock/gomock" + uuid "github.com/google/uuid" + blocks "github.com/ipfs/go-block-format" + cid "github.com/ipfs/go-cid" + metrics "github.com/libp2p/go-libp2p/core/metrics" + network0 "github.com/libp2p/go-libp2p/core/network" + peer "github.com/libp2p/go-libp2p/core/peer" + protocol "github.com/libp2p/go-libp2p/core/protocol" + address "github.com/filecoin-project/go-address" bitfield "github.com/filecoin-project/go-bitfield" datatransfer "github.com/filecoin-project/go-data-transfer" @@ -22,6 +31,7 @@ import ( crypto "github.com/filecoin-project/go-state-types/crypto" dline "github.com/filecoin-project/go-state-types/dline" network "github.com/filecoin-project/go-state-types/network" + api "github.com/filecoin-project/lotus/api" apitypes "github.com/filecoin-project/lotus/api/types" miner0 "github.com/filecoin-project/lotus/chain/actors/builtin/miner" @@ -29,14 +39,6 @@ import ( alerting "github.com/filecoin-project/lotus/journal/alerting" dtypes "github.com/filecoin-project/lotus/node/modules/dtypes" imports "github.com/filecoin-project/lotus/node/repo/imports" - gomock "github.com/golang/mock/gomock" - uuid "github.com/google/uuid" - blocks "github.com/ipfs/go-block-format" - cid "github.com/ipfs/go-cid" - metrics "github.com/libp2p/go-libp2p/core/metrics" - network0 "github.com/libp2p/go-libp2p/core/network" - peer "github.com/libp2p/go-libp2p/core/peer" - protocol "github.com/libp2p/go-libp2p/core/protocol" ) // MockFullNode is a mock of FullNode interface. diff --git a/api/proxy_gen.go b/api/proxy_gen.go index ce8f27b6b..2b162f346 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -7,6 +7,15 @@ import ( "encoding/json" "time" + "github.com/google/uuid" + blocks "github.com/ipfs/go-block-format" + "github.com/ipfs/go-cid" + "github.com/libp2p/go-libp2p/core/metrics" + "github.com/libp2p/go-libp2p/core/network" + "github.com/libp2p/go-libp2p/core/peer" + "github.com/libp2p/go-libp2p/core/protocol" + "golang.org/x/xerrors" + "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-bitfield" datatransfer "github.com/filecoin-project/go-data-transfer" @@ -21,6 +30,7 @@ import ( "github.com/filecoin-project/go-state-types/dline" abinetwork "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/go-state-types/proof" + apitypes "github.com/filecoin-project/lotus/api/types" "github.com/filecoin-project/lotus/chain/actors/builtin" lminer "github.com/filecoin-project/lotus/chain/actors/builtin/miner" @@ -32,14 +42,6 @@ import ( "github.com/filecoin-project/lotus/storage/sealer/fsutil" "github.com/filecoin-project/lotus/storage/sealer/sealtasks" "github.com/filecoin-project/lotus/storage/sealer/storiface" - "github.com/google/uuid" - blocks "github.com/ipfs/go-block-format" - "github.com/ipfs/go-cid" - "github.com/libp2p/go-libp2p/core/metrics" - "github.com/libp2p/go-libp2p/core/network" - "github.com/libp2p/go-libp2p/core/peer" - "github.com/libp2p/go-libp2p/core/protocol" - "golang.org/x/xerrors" ) var ErrNotSupported = xerrors.New("method not supported") diff --git a/api/v0api/proxy_gen.go b/api/v0api/proxy_gen.go index 3d4744fce..57cf730ba 100644 --- a/api/v0api/proxy_gen.go +++ b/api/v0api/proxy_gen.go @@ -5,6 +5,11 @@ package v0api import ( "context" + blocks "github.com/ipfs/go-block-format" + "github.com/ipfs/go-cid" + "github.com/libp2p/go-libp2p/core/peer" + "golang.org/x/xerrors" + "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-bitfield" datatransfer "github.com/filecoin-project/go-data-transfer" @@ -16,6 +21,7 @@ import ( "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/go-state-types/dline" abinetwork "github.com/filecoin-project/go-state-types/network" + "github.com/filecoin-project/lotus/api" apitypes "github.com/filecoin-project/lotus/api/types" lminer "github.com/filecoin-project/lotus/chain/actors/builtin/miner" @@ -23,10 +29,6 @@ import ( marketevents "github.com/filecoin-project/lotus/markets/loggers" "github.com/filecoin-project/lotus/node/modules/dtypes" "github.com/filecoin-project/lotus/node/repo/imports" - blocks "github.com/ipfs/go-block-format" - "github.com/ipfs/go-cid" - "github.com/libp2p/go-libp2p/core/peer" - "golang.org/x/xerrors" ) var ErrNotSupported = xerrors.New("method not supported") diff --git a/api/v0api/v0mocks/mock_full.go b/api/v0api/v0mocks/mock_full.go index 4f65c0672..8df8a89f7 100644 --- a/api/v0api/v0mocks/mock_full.go +++ b/api/v0api/v0mocks/mock_full.go @@ -9,6 +9,15 @@ import ( reflect "reflect" time "time" + gomock "github.com/golang/mock/gomock" + uuid "github.com/google/uuid" + blocks "github.com/ipfs/go-block-format" + cid "github.com/ipfs/go-cid" + metrics "github.com/libp2p/go-libp2p/core/metrics" + network0 "github.com/libp2p/go-libp2p/core/network" + peer "github.com/libp2p/go-libp2p/core/peer" + protocol "github.com/libp2p/go-libp2p/core/protocol" + address "github.com/filecoin-project/go-address" bitfield "github.com/filecoin-project/go-bitfield" datatransfer "github.com/filecoin-project/go-data-transfer" @@ -22,6 +31,7 @@ import ( crypto "github.com/filecoin-project/go-state-types/crypto" dline "github.com/filecoin-project/go-state-types/dline" network "github.com/filecoin-project/go-state-types/network" + api "github.com/filecoin-project/lotus/api" apitypes "github.com/filecoin-project/lotus/api/types" v0api "github.com/filecoin-project/lotus/api/v0api" @@ -31,14 +41,6 @@ import ( marketevents "github.com/filecoin-project/lotus/markets/loggers" dtypes "github.com/filecoin-project/lotus/node/modules/dtypes" imports "github.com/filecoin-project/lotus/node/repo/imports" - gomock "github.com/golang/mock/gomock" - uuid "github.com/google/uuid" - blocks "github.com/ipfs/go-block-format" - cid "github.com/ipfs/go-cid" - metrics "github.com/libp2p/go-libp2p/core/metrics" - network0 "github.com/libp2p/go-libp2p/core/network" - peer "github.com/libp2p/go-libp2p/core/peer" - protocol "github.com/libp2p/go-libp2p/core/protocol" ) // MockFullNode is a mock of FullNode interface. diff --git a/chain/actors/builtin/account/account.go b/chain/actors/builtin/account/account.go index 64aef1588..f8c65a9b9 100644 --- a/chain/actors/builtin/account/account.go +++ b/chain/actors/builtin/account/account.go @@ -1,31 +1,23 @@ package account import ( - actorstypes "github.com/filecoin-project/go-state-types/actors" - "github.com/filecoin-project/lotus/chain/actors" "golang.org/x/xerrors" "github.com/filecoin-project/go-address" + actorstypes "github.com/filecoin-project/go-state-types/actors" + builtin9 "github.com/filecoin-project/go-state-types/builtin" "github.com/filecoin-project/go-state-types/cbor" - - "github.com/filecoin-project/lotus/chain/actors/adt" - "github.com/filecoin-project/lotus/chain/types" - builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" - builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" - builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" - builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" - builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" - builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" - builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" - builtin9 "github.com/filecoin-project/go-state-types/builtin" + "github.com/filecoin-project/lotus/chain/actors" + "github.com/filecoin-project/lotus/chain/actors/adt" + "github.com/filecoin-project/lotus/chain/types" ) var Methods = builtin9.MethodsAccount diff --git a/chain/actors/builtin/account/v0.go b/chain/actors/builtin/account/v0.go index bdfca2fd7..314bd4b29 100644 --- a/chain/actors/builtin/account/v0.go +++ b/chain/actors/builtin/account/v0.go @@ -1,12 +1,12 @@ package account import ( - "github.com/filecoin-project/go-address" "github.com/ipfs/go-cid" - "github.com/filecoin-project/lotus/chain/actors/adt" - + "github.com/filecoin-project/go-address" account0 "github.com/filecoin-project/specs-actors/actors/builtin/account" + + "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state0)(nil) diff --git a/chain/actors/builtin/account/v2.go b/chain/actors/builtin/account/v2.go index 66618e06a..605065424 100644 --- a/chain/actors/builtin/account/v2.go +++ b/chain/actors/builtin/account/v2.go @@ -1,12 +1,12 @@ package account import ( - "github.com/filecoin-project/go-address" "github.com/ipfs/go-cid" - "github.com/filecoin-project/lotus/chain/actors/adt" - + "github.com/filecoin-project/go-address" account2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/account" + + "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state2)(nil) diff --git a/chain/actors/builtin/account/v3.go b/chain/actors/builtin/account/v3.go index dbe100a4f..d070476ea 100644 --- a/chain/actors/builtin/account/v3.go +++ b/chain/actors/builtin/account/v3.go @@ -1,12 +1,12 @@ package account import ( - "github.com/filecoin-project/go-address" "github.com/ipfs/go-cid" - "github.com/filecoin-project/lotus/chain/actors/adt" - + "github.com/filecoin-project/go-address" account3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/account" + + "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state3)(nil) diff --git a/chain/actors/builtin/account/v4.go b/chain/actors/builtin/account/v4.go index 53f71dcc5..f4d9f7a06 100644 --- a/chain/actors/builtin/account/v4.go +++ b/chain/actors/builtin/account/v4.go @@ -1,12 +1,12 @@ package account import ( - "github.com/filecoin-project/go-address" "github.com/ipfs/go-cid" - "github.com/filecoin-project/lotus/chain/actors/adt" - + "github.com/filecoin-project/go-address" account4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/account" + + "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state4)(nil) diff --git a/chain/actors/builtin/account/v5.go b/chain/actors/builtin/account/v5.go index 538f56987..5e01ce152 100644 --- a/chain/actors/builtin/account/v5.go +++ b/chain/actors/builtin/account/v5.go @@ -1,12 +1,12 @@ package account import ( - "github.com/filecoin-project/go-address" "github.com/ipfs/go-cid" - "github.com/filecoin-project/lotus/chain/actors/adt" - + "github.com/filecoin-project/go-address" account5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/account" + + "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state5)(nil) diff --git a/chain/actors/builtin/account/v6.go b/chain/actors/builtin/account/v6.go index a0d157ae5..85135dcda 100644 --- a/chain/actors/builtin/account/v6.go +++ b/chain/actors/builtin/account/v6.go @@ -1,12 +1,12 @@ package account import ( - "github.com/filecoin-project/go-address" "github.com/ipfs/go-cid" - "github.com/filecoin-project/lotus/chain/actors/adt" - + "github.com/filecoin-project/go-address" account6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/account" + + "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state6)(nil) diff --git a/chain/actors/builtin/account/v7.go b/chain/actors/builtin/account/v7.go index 883776cf8..4ae979b82 100644 --- a/chain/actors/builtin/account/v7.go +++ b/chain/actors/builtin/account/v7.go @@ -1,12 +1,12 @@ package account import ( - "github.com/filecoin-project/go-address" "github.com/ipfs/go-cid" - "github.com/filecoin-project/lotus/chain/actors/adt" - + "github.com/filecoin-project/go-address" account7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/account" + + "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state7)(nil) diff --git a/chain/actors/builtin/account/v8.go b/chain/actors/builtin/account/v8.go index d8ef52c00..211deea33 100644 --- a/chain/actors/builtin/account/v8.go +++ b/chain/actors/builtin/account/v8.go @@ -1,12 +1,12 @@ package account import ( - "github.com/filecoin-project/go-address" "github.com/ipfs/go-cid" - "github.com/filecoin-project/lotus/chain/actors/adt" - + "github.com/filecoin-project/go-address" account8 "github.com/filecoin-project/go-state-types/builtin/v8/account" + + "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state8)(nil) diff --git a/chain/actors/builtin/account/v9.go b/chain/actors/builtin/account/v9.go index f44e192b6..7e172b33c 100644 --- a/chain/actors/builtin/account/v9.go +++ b/chain/actors/builtin/account/v9.go @@ -1,12 +1,12 @@ package account import ( - "github.com/filecoin-project/go-address" "github.com/ipfs/go-cid" - "github.com/filecoin-project/lotus/chain/actors/adt" - + "github.com/filecoin-project/go-address" account9 "github.com/filecoin-project/go-state-types/builtin/v9/account" + + "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state9)(nil) diff --git a/chain/actors/builtin/builtin.go b/chain/actors/builtin/builtin.go index c80215c61..82e80365a 100644 --- a/chain/actors/builtin/builtin.go +++ b/chain/actors/builtin/builtin.go @@ -3,31 +3,23 @@ package builtin import ( "fmt" - "github.com/filecoin-project/go-address" "github.com/ipfs/go-cid" - builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" - - builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" - - builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" - - builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" - - builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" - - builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" - - builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" - + "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/builtin" + smoothingtypes "github.com/filecoin-project/go-state-types/builtin/v8/util/smoothing" + minertypes "github.com/filecoin-project/go-state-types/builtin/v9/miner" "github.com/filecoin-project/go-state-types/proof" + builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" + builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" + builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" + builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" + builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" + builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" "github.com/filecoin-project/lotus/chain/actors" - - miner9 "github.com/filecoin-project/go-state-types/builtin/v8/miner" - smoothingtypes "github.com/filecoin-project/go-state-types/builtin/v8/util/smoothing" ) var SystemActorAddr = builtin.SystemActorAddr @@ -60,7 +52,7 @@ type PoStProof = proof.PoStProof type FilterEstimate = smoothingtypes.FilterEstimate func QAPowerForWeight(size abi.SectorSize, duration abi.ChainEpoch, dealWeight, verifiedWeight abi.DealWeight) abi.StoragePower { - return miner9.QAPowerForWeight(size, duration, dealWeight, verifiedWeight) + return minertypes.QAPowerForWeight(size, duration, dealWeight, verifiedWeight) } func ActorNameByCode(c cid.Cid) string { diff --git a/chain/actors/builtin/builtin.go.template b/chain/actors/builtin/builtin.go.template index 5dcdbbafa..825f6cc07 100644 --- a/chain/actors/builtin/builtin.go.template +++ b/chain/actors/builtin/builtin.go.template @@ -18,7 +18,7 @@ import ( "github.com/filecoin-project/lotus/chain/actors" - miner{{.latestVersion}} "github.com/filecoin-project/go-state-types/builtin/v8/miner" + minertypes "github.com/filecoin-project/go-state-types/builtin/v9/miner" smoothingtypes "github.com/filecoin-project/go-state-types/builtin/v8/util/smoothing" ) @@ -52,7 +52,7 @@ type PoStProof = proof.PoStProof type FilterEstimate = smoothingtypes.FilterEstimate func QAPowerForWeight(size abi.SectorSize, duration abi.ChainEpoch, dealWeight, verifiedWeight abi.DealWeight) abi.StoragePower { - return miner{{.latestVersion}}.QAPowerForWeight(size, duration, dealWeight, verifiedWeight) + return minertypes.QAPowerForWeight(size, duration, dealWeight, verifiedWeight) } func ActorNameByCode(c cid.Cid) string { diff --git a/chain/actors/builtin/cron/cron.go b/chain/actors/builtin/cron/cron.go index 165059aa4..29f795476 100644 --- a/chain/actors/builtin/cron/cron.go +++ b/chain/actors/builtin/cron/cron.go @@ -1,27 +1,21 @@ package cron import ( + "golang.org/x/xerrors" + actorstypes "github.com/filecoin-project/go-state-types/actors" + builtin9 "github.com/filecoin-project/go-state-types/builtin" + builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" + builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" + builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" + builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" + builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" + builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/types" - "golang.org/x/xerrors" - - builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" - - builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" - - builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" - - builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" - - builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" - - builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" - - builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" - - builtin9 "github.com/filecoin-project/go-state-types/builtin" ) func Load(store adt.Store, act *types.Actor) (State, error) { diff --git a/chain/actors/builtin/cron/v0.go b/chain/actors/builtin/cron/v0.go index 6147b858c..baa81aac3 100644 --- a/chain/actors/builtin/cron/v0.go +++ b/chain/actors/builtin/cron/v0.go @@ -3,9 +3,9 @@ package cron import ( "github.com/ipfs/go-cid" - "github.com/filecoin-project/lotus/chain/actors/adt" - cron0 "github.com/filecoin-project/specs-actors/actors/builtin/cron" + + "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state0)(nil) diff --git a/chain/actors/builtin/cron/v2.go b/chain/actors/builtin/cron/v2.go index 51ca179d9..d6ee35935 100644 --- a/chain/actors/builtin/cron/v2.go +++ b/chain/actors/builtin/cron/v2.go @@ -3,9 +3,9 @@ package cron import ( "github.com/ipfs/go-cid" - "github.com/filecoin-project/lotus/chain/actors/adt" - cron2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/cron" + + "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state2)(nil) diff --git a/chain/actors/builtin/cron/v3.go b/chain/actors/builtin/cron/v3.go index ff74d511d..356d385cd 100644 --- a/chain/actors/builtin/cron/v3.go +++ b/chain/actors/builtin/cron/v3.go @@ -3,9 +3,9 @@ package cron import ( "github.com/ipfs/go-cid" - "github.com/filecoin-project/lotus/chain/actors/adt" - cron3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/cron" + + "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state3)(nil) diff --git a/chain/actors/builtin/cron/v4.go b/chain/actors/builtin/cron/v4.go index 1cff8cc28..3db3c95aa 100644 --- a/chain/actors/builtin/cron/v4.go +++ b/chain/actors/builtin/cron/v4.go @@ -3,9 +3,9 @@ package cron import ( "github.com/ipfs/go-cid" - "github.com/filecoin-project/lotus/chain/actors/adt" - cron4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/cron" + + "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state4)(nil) diff --git a/chain/actors/builtin/cron/v5.go b/chain/actors/builtin/cron/v5.go index 2bb00dc21..5d99af1fd 100644 --- a/chain/actors/builtin/cron/v5.go +++ b/chain/actors/builtin/cron/v5.go @@ -3,9 +3,9 @@ package cron import ( "github.com/ipfs/go-cid" - "github.com/filecoin-project/lotus/chain/actors/adt" - cron5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/cron" + + "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state5)(nil) diff --git a/chain/actors/builtin/cron/v6.go b/chain/actors/builtin/cron/v6.go index 8bbadd79f..c86cd6c42 100644 --- a/chain/actors/builtin/cron/v6.go +++ b/chain/actors/builtin/cron/v6.go @@ -3,9 +3,9 @@ package cron import ( "github.com/ipfs/go-cid" - "github.com/filecoin-project/lotus/chain/actors/adt" - cron6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/cron" + + "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state6)(nil) diff --git a/chain/actors/builtin/cron/v7.go b/chain/actors/builtin/cron/v7.go index e5538c89f..db9f8f9e2 100644 --- a/chain/actors/builtin/cron/v7.go +++ b/chain/actors/builtin/cron/v7.go @@ -3,9 +3,9 @@ package cron import ( "github.com/ipfs/go-cid" - "github.com/filecoin-project/lotus/chain/actors/adt" - cron7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/cron" + + "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state7)(nil) diff --git a/chain/actors/builtin/cron/v8.go b/chain/actors/builtin/cron/v8.go index 00b22fcbf..00567acf9 100644 --- a/chain/actors/builtin/cron/v8.go +++ b/chain/actors/builtin/cron/v8.go @@ -3,9 +3,9 @@ package cron import ( "github.com/ipfs/go-cid" - "github.com/filecoin-project/lotus/chain/actors/adt" - cron8 "github.com/filecoin-project/go-state-types/builtin/v8/cron" + + "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state8)(nil) diff --git a/chain/actors/builtin/cron/v9.go b/chain/actors/builtin/cron/v9.go index 94530e181..312a33b68 100644 --- a/chain/actors/builtin/cron/v9.go +++ b/chain/actors/builtin/cron/v9.go @@ -3,9 +3,9 @@ package cron import ( "github.com/ipfs/go-cid" - "github.com/filecoin-project/lotus/chain/actors/adt" - cron9 "github.com/filecoin-project/go-state-types/builtin/v9/cron" + + "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state9)(nil) diff --git a/chain/actors/builtin/init/init.go b/chain/actors/builtin/init/init.go index 10cac5e35..8a5550697 100644 --- a/chain/actors/builtin/init/init.go +++ b/chain/actors/builtin/init/init.go @@ -1,34 +1,26 @@ package init import ( - actorstypes "github.com/filecoin-project/go-state-types/actors" - "github.com/filecoin-project/lotus/chain/actors" + "github.com/ipfs/go-cid" "golang.org/x/xerrors" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" + actorstypes "github.com/filecoin-project/go-state-types/actors" + builtin9 "github.com/filecoin-project/go-state-types/builtin" "github.com/filecoin-project/go-state-types/cbor" - "github.com/ipfs/go-cid" + builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" + builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" + builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" + builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" + builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" + builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/node/modules/dtypes" - - builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" - - builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" - - builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" - - builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" - - builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" - - builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" - - builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" - - builtin9 "github.com/filecoin-project/go-state-types/builtin" ) var ( diff --git a/chain/actors/builtin/init/v0.go b/chain/actors/builtin/init/v0.go index ddd2dab94..2f6b213c0 100644 --- a/chain/actors/builtin/init/v0.go +++ b/chain/actors/builtin/init/v0.go @@ -1,17 +1,17 @@ package init import ( - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - "github.com/filecoin-project/lotus/chain/actors/adt" - "github.com/filecoin-project/lotus/node/modules/dtypes" - + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" init0 "github.com/filecoin-project/specs-actors/actors/builtin/init" adt0 "github.com/filecoin-project/specs-actors/actors/util/adt" + + "github.com/filecoin-project/lotus/chain/actors/adt" + "github.com/filecoin-project/lotus/node/modules/dtypes" ) var _ State = (*state0)(nil) diff --git a/chain/actors/builtin/init/v2.go b/chain/actors/builtin/init/v2.go index 72e2d56a5..d780a1fe9 100644 --- a/chain/actors/builtin/init/v2.go +++ b/chain/actors/builtin/init/v2.go @@ -1,17 +1,17 @@ package init import ( - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - "github.com/filecoin-project/lotus/chain/actors/adt" - "github.com/filecoin-project/lotus/node/modules/dtypes" - + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" init2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/init" adt2 "github.com/filecoin-project/specs-actors/v2/actors/util/adt" + + "github.com/filecoin-project/lotus/chain/actors/adt" + "github.com/filecoin-project/lotus/node/modules/dtypes" ) var _ State = (*state2)(nil) diff --git a/chain/actors/builtin/init/v3.go b/chain/actors/builtin/init/v3.go index 4609c94a3..b2f713b1f 100644 --- a/chain/actors/builtin/init/v3.go +++ b/chain/actors/builtin/init/v3.go @@ -1,19 +1,18 @@ package init import ( - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - "github.com/filecoin-project/lotus/chain/actors/adt" - "github.com/filecoin-project/lotus/node/modules/dtypes" - + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" - init3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/init" adt3 "github.com/filecoin-project/specs-actors/v3/actors/util/adt" + + "github.com/filecoin-project/lotus/chain/actors/adt" + "github.com/filecoin-project/lotus/node/modules/dtypes" ) var _ State = (*state3)(nil) diff --git a/chain/actors/builtin/init/v4.go b/chain/actors/builtin/init/v4.go index dc56d1f19..9de02816f 100644 --- a/chain/actors/builtin/init/v4.go +++ b/chain/actors/builtin/init/v4.go @@ -1,19 +1,18 @@ package init import ( - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - "github.com/filecoin-project/lotus/chain/actors/adt" - "github.com/filecoin-project/lotus/node/modules/dtypes" - + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" - init4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/init" adt4 "github.com/filecoin-project/specs-actors/v4/actors/util/adt" + + "github.com/filecoin-project/lotus/chain/actors/adt" + "github.com/filecoin-project/lotus/node/modules/dtypes" ) var _ State = (*state4)(nil) diff --git a/chain/actors/builtin/init/v5.go b/chain/actors/builtin/init/v5.go index 107366de5..f9c59f83a 100644 --- a/chain/actors/builtin/init/v5.go +++ b/chain/actors/builtin/init/v5.go @@ -1,19 +1,18 @@ package init import ( - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - "github.com/filecoin-project/lotus/chain/actors/adt" - "github.com/filecoin-project/lotus/node/modules/dtypes" - + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" - init5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/init" adt5 "github.com/filecoin-project/specs-actors/v5/actors/util/adt" + + "github.com/filecoin-project/lotus/chain/actors/adt" + "github.com/filecoin-project/lotus/node/modules/dtypes" ) var _ State = (*state5)(nil) diff --git a/chain/actors/builtin/init/v6.go b/chain/actors/builtin/init/v6.go index a5bd9edfb..494b6aaa0 100644 --- a/chain/actors/builtin/init/v6.go +++ b/chain/actors/builtin/init/v6.go @@ -1,19 +1,18 @@ package init import ( - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - "github.com/filecoin-project/lotus/chain/actors/adt" - "github.com/filecoin-project/lotus/node/modules/dtypes" - + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" - init6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/init" adt6 "github.com/filecoin-project/specs-actors/v6/actors/util/adt" + + "github.com/filecoin-project/lotus/chain/actors/adt" + "github.com/filecoin-project/lotus/node/modules/dtypes" ) var _ State = (*state6)(nil) diff --git a/chain/actors/builtin/init/v7.go b/chain/actors/builtin/init/v7.go index 341aa52cd..bc378a141 100644 --- a/chain/actors/builtin/init/v7.go +++ b/chain/actors/builtin/init/v7.go @@ -1,19 +1,18 @@ package init import ( - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - "github.com/filecoin-project/lotus/chain/actors/adt" - "github.com/filecoin-project/lotus/node/modules/dtypes" - + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" - init7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/init" adt7 "github.com/filecoin-project/specs-actors/v7/actors/util/adt" + + "github.com/filecoin-project/lotus/chain/actors/adt" + "github.com/filecoin-project/lotus/node/modules/dtypes" ) var _ State = (*state7)(nil) diff --git a/chain/actors/builtin/init/v8.go b/chain/actors/builtin/init/v8.go index 919819549..63b058e57 100644 --- a/chain/actors/builtin/init/v8.go +++ b/chain/actors/builtin/init/v8.go @@ -1,18 +1,18 @@ package init import ( - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - "github.com/filecoin-project/lotus/chain/actors/adt" - "github.com/filecoin-project/lotus/node/modules/dtypes" - + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" builtin8 "github.com/filecoin-project/go-state-types/builtin" init8 "github.com/filecoin-project/go-state-types/builtin/v8/init" adt8 "github.com/filecoin-project/go-state-types/builtin/v8/util/adt" + + "github.com/filecoin-project/lotus/chain/actors/adt" + "github.com/filecoin-project/lotus/node/modules/dtypes" ) var _ State = (*state8)(nil) diff --git a/chain/actors/builtin/init/v9.go b/chain/actors/builtin/init/v9.go index e6406b2dd..6153b4f73 100644 --- a/chain/actors/builtin/init/v9.go +++ b/chain/actors/builtin/init/v9.go @@ -1,18 +1,18 @@ package init import ( - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - "github.com/filecoin-project/lotus/chain/actors/adt" - "github.com/filecoin-project/lotus/node/modules/dtypes" - + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" builtin9 "github.com/filecoin-project/go-state-types/builtin" init9 "github.com/filecoin-project/go-state-types/builtin/v9/init" adt9 "github.com/filecoin-project/go-state-types/builtin/v9/util/adt" + + "github.com/filecoin-project/lotus/chain/actors/adt" + "github.com/filecoin-project/lotus/node/modules/dtypes" ) var _ State = (*state9)(nil) diff --git a/chain/actors/builtin/market/market.go b/chain/actors/builtin/market/market.go index 4c5d67aad..f87c3838e 100644 --- a/chain/actors/builtin/market/market.go +++ b/chain/actors/builtin/market/market.go @@ -1,35 +1,26 @@ package market import ( - actorstypes "github.com/filecoin-project/go-state-types/actors" "unicode/utf8" - "github.com/filecoin-project/go-state-types/network" + cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" + actorstypes "github.com/filecoin-project/go-state-types/actors" "github.com/filecoin-project/go-state-types/big" - "github.com/filecoin-project/go-state-types/cbor" - cbg "github.com/whyrusleeping/cbor-gen" - - markettypes "github.com/filecoin-project/go-state-types/builtin/v8/market" - - builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" - - builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" - - builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" - - builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" - - builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" - - builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" - - builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" - builtintypes "github.com/filecoin-project/go-state-types/builtin" + markettypes "github.com/filecoin-project/go-state-types/builtin/v8/market" + "github.com/filecoin-project/go-state-types/cbor" + "github.com/filecoin-project/go-state-types/network" + builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" + builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" + builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" + builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" + builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" + builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/adt" diff --git a/chain/actors/builtin/market/state.go.template b/chain/actors/builtin/market/state.go.template index 475381e82..844f92f02 100644 --- a/chain/actors/builtin/market/state.go.template +++ b/chain/actors/builtin/market/state.go.template @@ -23,7 +23,7 @@ import ( {{else}} market{{.v}} "github.com/filecoin-project/go-state-types/builtin{{.import}}market" markettypes "github.com/filecoin-project/go-state-types/builtin/v8/market" - adt{{.v}} "github.com/filecoin-project/go-state-types/builtin/v8/util/adt" + adt{{.v}} "github.com/filecoin-project/go-state-types/builtin{{.import}}util/adt" {{end}} ) diff --git a/chain/actors/builtin/market/v0.go b/chain/actors/builtin/market/v0.go index 9ede96cd9..5fb94a700 100644 --- a/chain/actors/builtin/market/v0.go +++ b/chain/actors/builtin/market/v0.go @@ -3,17 +3,17 @@ package market import ( "bytes" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - "github.com/filecoin-project/lotus/chain/actors/adt" - "github.com/filecoin-project/lotus/chain/types" - + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" market0 "github.com/filecoin-project/specs-actors/actors/builtin/market" adt0 "github.com/filecoin-project/specs-actors/actors/util/adt" + + "github.com/filecoin-project/lotus/chain/actors/adt" + "github.com/filecoin-project/lotus/chain/types" ) var _ State = (*state0)(nil) diff --git a/chain/actors/builtin/market/v2.go b/chain/actors/builtin/market/v2.go index 6de3a3a6d..2228e80e9 100644 --- a/chain/actors/builtin/market/v2.go +++ b/chain/actors/builtin/market/v2.go @@ -3,17 +3,17 @@ package market import ( "bytes" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - "github.com/filecoin-project/lotus/chain/actors/adt" - "github.com/filecoin-project/lotus/chain/types" - + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" market2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/market" adt2 "github.com/filecoin-project/specs-actors/v2/actors/util/adt" + + "github.com/filecoin-project/lotus/chain/actors/adt" + "github.com/filecoin-project/lotus/chain/types" ) var _ State = (*state2)(nil) diff --git a/chain/actors/builtin/market/v3.go b/chain/actors/builtin/market/v3.go index bd2ca7b0c..b48aa90b4 100644 --- a/chain/actors/builtin/market/v3.go +++ b/chain/actors/builtin/market/v3.go @@ -3,17 +3,17 @@ package market import ( "bytes" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - "github.com/filecoin-project/lotus/chain/actors/adt" - "github.com/filecoin-project/lotus/chain/types" - + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" market3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/market" adt3 "github.com/filecoin-project/specs-actors/v3/actors/util/adt" + + "github.com/filecoin-project/lotus/chain/actors/adt" + "github.com/filecoin-project/lotus/chain/types" ) var _ State = (*state3)(nil) diff --git a/chain/actors/builtin/market/v4.go b/chain/actors/builtin/market/v4.go index 11f62a5f4..7c8a650ea 100644 --- a/chain/actors/builtin/market/v4.go +++ b/chain/actors/builtin/market/v4.go @@ -3,17 +3,17 @@ package market import ( "bytes" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - "github.com/filecoin-project/lotus/chain/actors/adt" - "github.com/filecoin-project/lotus/chain/types" - + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" market4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/market" adt4 "github.com/filecoin-project/specs-actors/v4/actors/util/adt" + + "github.com/filecoin-project/lotus/chain/actors/adt" + "github.com/filecoin-project/lotus/chain/types" ) var _ State = (*state4)(nil) diff --git a/chain/actors/builtin/market/v5.go b/chain/actors/builtin/market/v5.go index 378bc23bb..18c2f0188 100644 --- a/chain/actors/builtin/market/v5.go +++ b/chain/actors/builtin/market/v5.go @@ -3,17 +3,17 @@ package market import ( "bytes" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - "github.com/filecoin-project/lotus/chain/actors/adt" - "github.com/filecoin-project/lotus/chain/types" - + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" market5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/market" adt5 "github.com/filecoin-project/specs-actors/v5/actors/util/adt" + + "github.com/filecoin-project/lotus/chain/actors/adt" + "github.com/filecoin-project/lotus/chain/types" ) var _ State = (*state5)(nil) diff --git a/chain/actors/builtin/market/v6.go b/chain/actors/builtin/market/v6.go index 6c1b6c497..717858de4 100644 --- a/chain/actors/builtin/market/v6.go +++ b/chain/actors/builtin/market/v6.go @@ -3,20 +3,19 @@ package market import ( "bytes" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" + "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-bitfield" rlepluslazy "github.com/filecoin-project/go-bitfield/rle" + "github.com/filecoin-project/go-state-types/abi" + market6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/market" + adt6 "github.com/filecoin-project/specs-actors/v6/actors/util/adt" "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/types" - - market6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/market" - adt6 "github.com/filecoin-project/specs-actors/v6/actors/util/adt" ) var _ State = (*state6)(nil) diff --git a/chain/actors/builtin/market/v7.go b/chain/actors/builtin/market/v7.go index faf178307..785466e0d 100644 --- a/chain/actors/builtin/market/v7.go +++ b/chain/actors/builtin/market/v7.go @@ -3,20 +3,19 @@ package market import ( "bytes" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" + "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-bitfield" rlepluslazy "github.com/filecoin-project/go-bitfield/rle" + "github.com/filecoin-project/go-state-types/abi" + market7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/market" + adt7 "github.com/filecoin-project/specs-actors/v7/actors/util/adt" "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/types" - - market7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/market" - adt7 "github.com/filecoin-project/specs-actors/v7/actors/util/adt" ) var _ State = (*state7)(nil) diff --git a/chain/actors/builtin/market/v8.go b/chain/actors/builtin/market/v8.go index ea65ec705..c56612c37 100644 --- a/chain/actors/builtin/market/v8.go +++ b/chain/actors/builtin/market/v8.go @@ -3,21 +3,20 @@ package market import ( "bytes" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" + "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-bitfield" rlepluslazy "github.com/filecoin-project/go-bitfield/rle" - - "github.com/filecoin-project/lotus/chain/actors/adt" - "github.com/filecoin-project/lotus/chain/types" - + "github.com/filecoin-project/go-state-types/abi" market8 "github.com/filecoin-project/go-state-types/builtin/v8/market" markettypes "github.com/filecoin-project/go-state-types/builtin/v8/market" adt8 "github.com/filecoin-project/go-state-types/builtin/v8/util/adt" + + "github.com/filecoin-project/lotus/chain/actors/adt" + "github.com/filecoin-project/lotus/chain/types" ) var _ State = (*state8)(nil) diff --git a/chain/actors/builtin/market/v9.go b/chain/actors/builtin/market/v9.go index 8984a1b75..39db2ee12 100644 --- a/chain/actors/builtin/market/v9.go +++ b/chain/actors/builtin/market/v9.go @@ -3,21 +3,20 @@ package market import ( "bytes" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" + "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-bitfield" rlepluslazy "github.com/filecoin-project/go-bitfield/rle" + "github.com/filecoin-project/go-state-types/abi" + markettypes "github.com/filecoin-project/go-state-types/builtin/v8/market" + market9 "github.com/filecoin-project/go-state-types/builtin/v9/market" + adt9 "github.com/filecoin-project/go-state-types/builtin/v9/util/adt" "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/types" - - markettypes "github.com/filecoin-project/go-state-types/builtin/v8/market" - adt9 "github.com/filecoin-project/go-state-types/builtin/v8/util/adt" - market9 "github.com/filecoin-project/go-state-types/builtin/v9/market" ) var _ State = (*state9)(nil) diff --git a/chain/actors/builtin/miner/miner.go b/chain/actors/builtin/miner/miner.go index 2184194ea..c3db4cb0e 100644 --- a/chain/actors/builtin/miner/miner.go +++ b/chain/actors/builtin/miner/miner.go @@ -1,36 +1,29 @@ package miner import ( - actorstypes "github.com/filecoin-project/go-state-types/actors" - "github.com/filecoin-project/go-state-types/big" - "github.com/filecoin-project/go-state-types/network" - "github.com/filecoin-project/lotus/chain/actors" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" "github.com/filecoin-project/go-bitfield" "github.com/filecoin-project/go-state-types/abi" + actorstypes "github.com/filecoin-project/go-state-types/actors" + "github.com/filecoin-project/go-state-types/big" + miner9 "github.com/filecoin-project/go-state-types/builtin/v9/miner" "github.com/filecoin-project/go-state-types/cbor" "github.com/filecoin-project/go-state-types/dline" + "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/go-state-types/proof" + builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" + builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" + builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" + builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" + builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" + builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" - miner9 "github.com/filecoin-project/go-state-types/builtin/v9/miner" + "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/types" - - builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" - - builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" - - builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" - - builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" - - builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" - - builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" - - builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" ) func Load(store adt.Store, act *types.Actor) (State, error) { diff --git a/chain/actors/builtin/miner/v0.go b/chain/actors/builtin/miner/v0.go index d8f450381..e815806bd 100644 --- a/chain/actors/builtin/miner/v0.go +++ b/chain/actors/builtin/miner/v0.go @@ -4,21 +4,20 @@ import ( "bytes" "errors" - "github.com/filecoin-project/go-state-types/big" - - "github.com/filecoin-project/go-bitfield" - rle "github.com/filecoin-project/go-bitfield/rle" - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/dline" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" + "github.com/filecoin-project/go-bitfield" + rle "github.com/filecoin-project/go-bitfield/rle" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/big" minertypes "github.com/filecoin-project/go-state-types/builtin/v9/miner" - "github.com/filecoin-project/lotus/chain/actors/adt" - + "github.com/filecoin-project/go-state-types/dline" miner0 "github.com/filecoin-project/specs-actors/actors/builtin/miner" adt0 "github.com/filecoin-project/specs-actors/actors/util/adt" + + "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state0)(nil) diff --git a/chain/actors/builtin/miner/v2.go b/chain/actors/builtin/miner/v2.go index e5bc784fe..3501e81f1 100644 --- a/chain/actors/builtin/miner/v2.go +++ b/chain/actors/builtin/miner/v2.go @@ -4,19 +4,19 @@ import ( "bytes" "errors" - "github.com/filecoin-project/go-bitfield" - rle "github.com/filecoin-project/go-bitfield/rle" - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/dline" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" + "github.com/filecoin-project/go-bitfield" + rle "github.com/filecoin-project/go-bitfield/rle" + "github.com/filecoin-project/go-state-types/abi" minertypes "github.com/filecoin-project/go-state-types/builtin/v9/miner" - "github.com/filecoin-project/lotus/chain/actors/adt" - + "github.com/filecoin-project/go-state-types/dline" miner2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/miner" adt2 "github.com/filecoin-project/specs-actors/v2/actors/util/adt" + + "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state2)(nil) diff --git a/chain/actors/builtin/miner/v3.go b/chain/actors/builtin/miner/v3.go index 670df7f1b..5d2d3ef61 100644 --- a/chain/actors/builtin/miner/v3.go +++ b/chain/actors/builtin/miner/v3.go @@ -4,21 +4,20 @@ import ( "bytes" "errors" - "github.com/filecoin-project/go-bitfield" - rle "github.com/filecoin-project/go-bitfield/rle" - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/dline" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" + "github.com/filecoin-project/go-bitfield" + rle "github.com/filecoin-project/go-bitfield/rle" + "github.com/filecoin-project/go-state-types/abi" minertypes "github.com/filecoin-project/go-state-types/builtin/v9/miner" - "github.com/filecoin-project/lotus/chain/actors/adt" - + "github.com/filecoin-project/go-state-types/dline" builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" - miner3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/miner" adt3 "github.com/filecoin-project/specs-actors/v3/actors/util/adt" + + "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state3)(nil) diff --git a/chain/actors/builtin/miner/v4.go b/chain/actors/builtin/miner/v4.go index 740e748ba..db36c3875 100644 --- a/chain/actors/builtin/miner/v4.go +++ b/chain/actors/builtin/miner/v4.go @@ -4,21 +4,20 @@ import ( "bytes" "errors" - "github.com/filecoin-project/go-bitfield" - rle "github.com/filecoin-project/go-bitfield/rle" - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/dline" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" + "github.com/filecoin-project/go-bitfield" + rle "github.com/filecoin-project/go-bitfield/rle" + "github.com/filecoin-project/go-state-types/abi" minertypes "github.com/filecoin-project/go-state-types/builtin/v9/miner" - "github.com/filecoin-project/lotus/chain/actors/adt" - + "github.com/filecoin-project/go-state-types/dline" builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" - miner4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/miner" adt4 "github.com/filecoin-project/specs-actors/v4/actors/util/adt" + + "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state4)(nil) diff --git a/chain/actors/builtin/miner/v5.go b/chain/actors/builtin/miner/v5.go index f120e78b6..8ff6432d2 100644 --- a/chain/actors/builtin/miner/v5.go +++ b/chain/actors/builtin/miner/v5.go @@ -4,21 +4,20 @@ import ( "bytes" "errors" - "github.com/filecoin-project/go-bitfield" - rle "github.com/filecoin-project/go-bitfield/rle" - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/dline" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" + "github.com/filecoin-project/go-bitfield" + rle "github.com/filecoin-project/go-bitfield/rle" + "github.com/filecoin-project/go-state-types/abi" minertypes "github.com/filecoin-project/go-state-types/builtin/v9/miner" - "github.com/filecoin-project/lotus/chain/actors/adt" - + "github.com/filecoin-project/go-state-types/dline" builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" - miner5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/miner" adt5 "github.com/filecoin-project/specs-actors/v5/actors/util/adt" + + "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state5)(nil) diff --git a/chain/actors/builtin/miner/v6.go b/chain/actors/builtin/miner/v6.go index d0ea06e80..f11d4d062 100644 --- a/chain/actors/builtin/miner/v6.go +++ b/chain/actors/builtin/miner/v6.go @@ -4,21 +4,20 @@ import ( "bytes" "errors" - "github.com/filecoin-project/go-bitfield" - rle "github.com/filecoin-project/go-bitfield/rle" - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/dline" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" + "github.com/filecoin-project/go-bitfield" + rle "github.com/filecoin-project/go-bitfield/rle" + "github.com/filecoin-project/go-state-types/abi" minertypes "github.com/filecoin-project/go-state-types/builtin/v9/miner" - "github.com/filecoin-project/lotus/chain/actors/adt" - + "github.com/filecoin-project/go-state-types/dline" builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" - miner6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/miner" adt6 "github.com/filecoin-project/specs-actors/v6/actors/util/adt" + + "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state6)(nil) diff --git a/chain/actors/builtin/miner/v7.go b/chain/actors/builtin/miner/v7.go index 19a4eb7af..f7893cef3 100644 --- a/chain/actors/builtin/miner/v7.go +++ b/chain/actors/builtin/miner/v7.go @@ -4,21 +4,20 @@ import ( "bytes" "errors" - "github.com/filecoin-project/go-bitfield" - rle "github.com/filecoin-project/go-bitfield/rle" - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/dline" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" + "github.com/filecoin-project/go-bitfield" + rle "github.com/filecoin-project/go-bitfield/rle" + "github.com/filecoin-project/go-state-types/abi" minertypes "github.com/filecoin-project/go-state-types/builtin/v9/miner" - "github.com/filecoin-project/lotus/chain/actors/adt" - + "github.com/filecoin-project/go-state-types/dline" builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" - miner7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/miner" adt7 "github.com/filecoin-project/specs-actors/v7/actors/util/adt" + + "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state7)(nil) diff --git a/chain/actors/builtin/miner/v8.go b/chain/actors/builtin/miner/v8.go index 52b6b6196..0d53cc664 100644 --- a/chain/actors/builtin/miner/v8.go +++ b/chain/actors/builtin/miner/v8.go @@ -4,20 +4,20 @@ import ( "bytes" "errors" - "github.com/filecoin-project/go-bitfield" - rle "github.com/filecoin-project/go-bitfield/rle" - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/dline" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - minertypes "github.com/filecoin-project/go-state-types/builtin/v9/miner" - "github.com/filecoin-project/lotus/chain/actors/adt" - + "github.com/filecoin-project/go-bitfield" + rle "github.com/filecoin-project/go-bitfield/rle" + "github.com/filecoin-project/go-state-types/abi" builtin8 "github.com/filecoin-project/go-state-types/builtin" miner8 "github.com/filecoin-project/go-state-types/builtin/v8/miner" adt8 "github.com/filecoin-project/go-state-types/builtin/v8/util/adt" + minertypes "github.com/filecoin-project/go-state-types/builtin/v9/miner" + "github.com/filecoin-project/go-state-types/dline" + + "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state8)(nil) diff --git a/chain/actors/builtin/miner/v9.go b/chain/actors/builtin/miner/v9.go index 79872fd8d..fe1f626f5 100644 --- a/chain/actors/builtin/miner/v9.go +++ b/chain/actors/builtin/miner/v9.go @@ -4,20 +4,20 @@ import ( "bytes" "errors" - "github.com/filecoin-project/go-bitfield" - rle "github.com/filecoin-project/go-bitfield/rle" - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/dline" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - minertypes "github.com/filecoin-project/go-state-types/builtin/v9/miner" - "github.com/filecoin-project/lotus/chain/actors/adt" - + "github.com/filecoin-project/go-bitfield" + rle "github.com/filecoin-project/go-bitfield/rle" + "github.com/filecoin-project/go-state-types/abi" builtin9 "github.com/filecoin-project/go-state-types/builtin" miner9 "github.com/filecoin-project/go-state-types/builtin/v9/miner" + minertypes "github.com/filecoin-project/go-state-types/builtin/v9/miner" adt9 "github.com/filecoin-project/go-state-types/builtin/v9/util/adt" + "github.com/filecoin-project/go-state-types/dline" + + "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state9)(nil) diff --git a/chain/actors/builtin/multisig/message.go.template b/chain/actors/builtin/multisig/message.go.template index 499ed7467..84dd308f4 100644 --- a/chain/actors/builtin/multisig/message.go.template +++ b/chain/actors/builtin/multisig/message.go.template @@ -13,7 +13,7 @@ import ( builtin{{.latestVersion}} "github.com/filecoin-project/go-state-types/builtin" {{else}} actorstypes "github.com/filecoin-project/go-state-types/actors" - multisig{{.v}} "github.com/filecoin-project/go-state-types/builtin/v8/multisig" + multisig{{.v}} "github.com/filecoin-project/go-state-types/builtin{{.import}}multisig" init{{.latestVersion}} "github.com/filecoin-project/go-state-types/builtin/v{{.latestVersion}}/init" builtin{{.latestVersion}} "github.com/filecoin-project/go-state-types/builtin" {{end}} diff --git a/chain/actors/builtin/multisig/message0.go b/chain/actors/builtin/multisig/message0.go index 8d7070c8b..1431b0366 100644 --- a/chain/actors/builtin/multisig/message0.go +++ b/chain/actors/builtin/multisig/message0.go @@ -5,7 +5,6 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - builtin9 "github.com/filecoin-project/go-state-types/builtin" builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" init0 "github.com/filecoin-project/specs-actors/actors/builtin/init" diff --git a/chain/actors/builtin/multisig/message2.go b/chain/actors/builtin/multisig/message2.go index af454f298..5120ae0ee 100644 --- a/chain/actors/builtin/multisig/message2.go +++ b/chain/actors/builtin/multisig/message2.go @@ -5,7 +5,6 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - builtin9 "github.com/filecoin-project/go-state-types/builtin" builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" init2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/init" diff --git a/chain/actors/builtin/multisig/message3.go b/chain/actors/builtin/multisig/message3.go index 2317c5133..5194cbcd4 100644 --- a/chain/actors/builtin/multisig/message3.go +++ b/chain/actors/builtin/multisig/message3.go @@ -5,7 +5,6 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - builtin9 "github.com/filecoin-project/go-state-types/builtin" builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" init3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/init" diff --git a/chain/actors/builtin/multisig/message4.go b/chain/actors/builtin/multisig/message4.go index 53f447dcd..cbf3cd841 100644 --- a/chain/actors/builtin/multisig/message4.go +++ b/chain/actors/builtin/multisig/message4.go @@ -5,7 +5,6 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - builtin9 "github.com/filecoin-project/go-state-types/builtin" builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" init4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/init" diff --git a/chain/actors/builtin/multisig/message5.go b/chain/actors/builtin/multisig/message5.go index abca500fd..beca1690d 100644 --- a/chain/actors/builtin/multisig/message5.go +++ b/chain/actors/builtin/multisig/message5.go @@ -5,7 +5,6 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - builtin9 "github.com/filecoin-project/go-state-types/builtin" builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" init5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/init" diff --git a/chain/actors/builtin/multisig/message6.go b/chain/actors/builtin/multisig/message6.go index 84ee57741..39c2dd3b1 100644 --- a/chain/actors/builtin/multisig/message6.go +++ b/chain/actors/builtin/multisig/message6.go @@ -5,7 +5,6 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - builtin9 "github.com/filecoin-project/go-state-types/builtin" builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" init6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/init" diff --git a/chain/actors/builtin/multisig/message7.go b/chain/actors/builtin/multisig/message7.go index aaaabfe57..5f67df4a2 100644 --- a/chain/actors/builtin/multisig/message7.go +++ b/chain/actors/builtin/multisig/message7.go @@ -5,7 +5,6 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - builtin9 "github.com/filecoin-project/go-state-types/builtin" builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" init7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/init" diff --git a/chain/actors/builtin/multisig/message8.go b/chain/actors/builtin/multisig/message8.go index 55d153b76..8d26d0b58 100644 --- a/chain/actors/builtin/multisig/message8.go +++ b/chain/actors/builtin/multisig/message8.go @@ -5,7 +5,6 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - actorstypes "github.com/filecoin-project/go-state-types/actors" builtin9 "github.com/filecoin-project/go-state-types/builtin" multisig8 "github.com/filecoin-project/go-state-types/builtin/v8/multisig" diff --git a/chain/actors/builtin/multisig/message9.go b/chain/actors/builtin/multisig/message9.go index 83a46cb8d..727c6e960 100644 --- a/chain/actors/builtin/multisig/message9.go +++ b/chain/actors/builtin/multisig/message9.go @@ -5,11 +5,10 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - actorstypes "github.com/filecoin-project/go-state-types/actors" builtin9 "github.com/filecoin-project/go-state-types/builtin" - multisig9 "github.com/filecoin-project/go-state-types/builtin/v8/multisig" init9 "github.com/filecoin-project/go-state-types/builtin/v9/init" + multisig9 "github.com/filecoin-project/go-state-types/builtin/v9/multisig" "github.com/filecoin-project/lotus/chain/actors" init_ "github.com/filecoin-project/lotus/chain/actors/builtin/init" diff --git a/chain/actors/builtin/multisig/multisig.go b/chain/actors/builtin/multisig/multisig.go index b29153b70..6c0d449df 100644 --- a/chain/actors/builtin/multisig/multisig.go +++ b/chain/actors/builtin/multisig/multisig.go @@ -2,7 +2,6 @@ package multisig import ( "fmt" - actorstypes "github.com/filecoin-project/go-state-types/actors" "github.com/minio/blake2b-simd" cbg "github.com/whyrusleeping/cbor-gen" @@ -10,25 +9,17 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/cbor" - - msig9 "github.com/filecoin-project/go-state-types/builtin/v9/multisig" - - builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" - - builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" - - builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" - - builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" - - builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" - - builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" - - builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" - + actorstypes "github.com/filecoin-project/go-state-types/actors" builtintypes "github.com/filecoin-project/go-state-types/builtin" + msig9 "github.com/filecoin-project/go-state-types/builtin/v9/multisig" + "github.com/filecoin-project/go-state-types/cbor" + builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" + builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" + builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" + builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" + builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" + builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/adt" diff --git a/chain/actors/builtin/multisig/v0.go b/chain/actors/builtin/multisig/v0.go index ccd9a9e37..9f4d09dc1 100644 --- a/chain/actors/builtin/multisig/v0.go +++ b/chain/actors/builtin/multisig/v0.go @@ -4,16 +4,16 @@ import ( "bytes" "encoding/binary" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - "github.com/filecoin-project/lotus/chain/actors/adt" - + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" msig0 "github.com/filecoin-project/specs-actors/actors/builtin/multisig" adt0 "github.com/filecoin-project/specs-actors/actors/util/adt" + + "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state0)(nil) diff --git a/chain/actors/builtin/multisig/v2.go b/chain/actors/builtin/multisig/v2.go index c3579b3e2..14e895680 100644 --- a/chain/actors/builtin/multisig/v2.go +++ b/chain/actors/builtin/multisig/v2.go @@ -4,16 +4,16 @@ import ( "bytes" "encoding/binary" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - "github.com/filecoin-project/lotus/chain/actors/adt" - + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" msig2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/multisig" adt2 "github.com/filecoin-project/specs-actors/v2/actors/util/adt" + + "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state2)(nil) diff --git a/chain/actors/builtin/multisig/v3.go b/chain/actors/builtin/multisig/v3.go index 80682808e..5cde148c1 100644 --- a/chain/actors/builtin/multisig/v3.go +++ b/chain/actors/builtin/multisig/v3.go @@ -4,18 +4,17 @@ import ( "bytes" "encoding/binary" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - "github.com/filecoin-project/lotus/chain/actors/adt" - + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" - msig3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/multisig" adt3 "github.com/filecoin-project/specs-actors/v3/actors/util/adt" + + "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state3)(nil) diff --git a/chain/actors/builtin/multisig/v4.go b/chain/actors/builtin/multisig/v4.go index f065f9f8c..87936661d 100644 --- a/chain/actors/builtin/multisig/v4.go +++ b/chain/actors/builtin/multisig/v4.go @@ -4,18 +4,17 @@ import ( "bytes" "encoding/binary" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - "github.com/filecoin-project/lotus/chain/actors/adt" - + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" - msig4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/multisig" adt4 "github.com/filecoin-project/specs-actors/v4/actors/util/adt" + + "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state4)(nil) diff --git a/chain/actors/builtin/multisig/v5.go b/chain/actors/builtin/multisig/v5.go index 783e3987f..d50638ca5 100644 --- a/chain/actors/builtin/multisig/v5.go +++ b/chain/actors/builtin/multisig/v5.go @@ -4,18 +4,17 @@ import ( "bytes" "encoding/binary" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - "github.com/filecoin-project/lotus/chain/actors/adt" - + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" - msig5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/multisig" adt5 "github.com/filecoin-project/specs-actors/v5/actors/util/adt" + + "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state5)(nil) diff --git a/chain/actors/builtin/multisig/v6.go b/chain/actors/builtin/multisig/v6.go index 71ea3c00c..9246eeaa9 100644 --- a/chain/actors/builtin/multisig/v6.go +++ b/chain/actors/builtin/multisig/v6.go @@ -4,18 +4,17 @@ import ( "bytes" "encoding/binary" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - "github.com/filecoin-project/lotus/chain/actors/adt" - + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" - msig6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/multisig" adt6 "github.com/filecoin-project/specs-actors/v6/actors/util/adt" + + "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state6)(nil) diff --git a/chain/actors/builtin/multisig/v7.go b/chain/actors/builtin/multisig/v7.go index 8ed1caacd..a6b630179 100644 --- a/chain/actors/builtin/multisig/v7.go +++ b/chain/actors/builtin/multisig/v7.go @@ -4,18 +4,17 @@ import ( "bytes" "encoding/binary" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - "github.com/filecoin-project/lotus/chain/actors/adt" - + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" - msig7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/multisig" adt7 "github.com/filecoin-project/specs-actors/v7/actors/util/adt" + + "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state7)(nil) diff --git a/chain/actors/builtin/multisig/v8.go b/chain/actors/builtin/multisig/v8.go index 5b76f662e..6311583b3 100644 --- a/chain/actors/builtin/multisig/v8.go +++ b/chain/actors/builtin/multisig/v8.go @@ -4,17 +4,17 @@ import ( "bytes" "encoding/binary" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - "github.com/filecoin-project/lotus/chain/actors/adt" - + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" builtin8 "github.com/filecoin-project/go-state-types/builtin" msig8 "github.com/filecoin-project/go-state-types/builtin/v8/multisig" adt8 "github.com/filecoin-project/go-state-types/builtin/v8/util/adt" + + "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state8)(nil) diff --git a/chain/actors/builtin/multisig/v9.go b/chain/actors/builtin/multisig/v9.go index cf6df9316..ef9a48f28 100644 --- a/chain/actors/builtin/multisig/v9.go +++ b/chain/actors/builtin/multisig/v9.go @@ -4,17 +4,17 @@ import ( "bytes" "encoding/binary" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - "github.com/filecoin-project/lotus/chain/actors/adt" - + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" builtin9 "github.com/filecoin-project/go-state-types/builtin" msig9 "github.com/filecoin-project/go-state-types/builtin/v9/multisig" adt9 "github.com/filecoin-project/go-state-types/builtin/v9/util/adt" + + "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state9)(nil) diff --git a/chain/actors/builtin/paych/message0.go b/chain/actors/builtin/paych/message0.go index 2daa0301b..d5a112d43 100644 --- a/chain/actors/builtin/paych/message0.go +++ b/chain/actors/builtin/paych/message0.go @@ -3,9 +3,7 @@ package paych import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - paychtypes "github.com/filecoin-project/go-state-types/builtin/v8/paych" - builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" init0 "github.com/filecoin-project/specs-actors/actors/builtin/init" paych0 "github.com/filecoin-project/specs-actors/actors/builtin/paych" diff --git a/chain/actors/builtin/paych/message2.go b/chain/actors/builtin/paych/message2.go index 925ad0ed9..89a6e74ce 100644 --- a/chain/actors/builtin/paych/message2.go +++ b/chain/actors/builtin/paych/message2.go @@ -3,9 +3,7 @@ package paych import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - paychtypes "github.com/filecoin-project/go-state-types/builtin/v8/paych" - builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" init2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/init" paych2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/paych" diff --git a/chain/actors/builtin/paych/message3.go b/chain/actors/builtin/paych/message3.go index e8ae585fc..47f8e7e9e 100644 --- a/chain/actors/builtin/paych/message3.go +++ b/chain/actors/builtin/paych/message3.go @@ -3,9 +3,7 @@ package paych import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - paychtypes "github.com/filecoin-project/go-state-types/builtin/v8/paych" - builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" init3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/init" paych3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/paych" diff --git a/chain/actors/builtin/paych/message4.go b/chain/actors/builtin/paych/message4.go index b32b0fa57..65e63149d 100644 --- a/chain/actors/builtin/paych/message4.go +++ b/chain/actors/builtin/paych/message4.go @@ -3,9 +3,7 @@ package paych import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - paychtypes "github.com/filecoin-project/go-state-types/builtin/v8/paych" - builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" init4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/init" paych4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/paych" diff --git a/chain/actors/builtin/paych/message5.go b/chain/actors/builtin/paych/message5.go index 897bebe7a..ede1c8ceb 100644 --- a/chain/actors/builtin/paych/message5.go +++ b/chain/actors/builtin/paych/message5.go @@ -3,9 +3,7 @@ package paych import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - paychtypes "github.com/filecoin-project/go-state-types/builtin/v8/paych" - builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" init5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/init" paych5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/paych" diff --git a/chain/actors/builtin/paych/message6.go b/chain/actors/builtin/paych/message6.go index 11bd3a8a5..009e8641f 100644 --- a/chain/actors/builtin/paych/message6.go +++ b/chain/actors/builtin/paych/message6.go @@ -3,9 +3,7 @@ package paych import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - paychtypes "github.com/filecoin-project/go-state-types/builtin/v8/paych" - builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" init6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/init" paych6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/paych" diff --git a/chain/actors/builtin/paych/message7.go b/chain/actors/builtin/paych/message7.go index 446e54ead..430fb9341 100644 --- a/chain/actors/builtin/paych/message7.go +++ b/chain/actors/builtin/paych/message7.go @@ -3,9 +3,7 @@ package paych import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - paychtypes "github.com/filecoin-project/go-state-types/builtin/v8/paych" - builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" init7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/init" paych7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/paych" diff --git a/chain/actors/builtin/paych/message8.go b/chain/actors/builtin/paych/message8.go index 6d9df4f4c..a72c5fbb3 100644 --- a/chain/actors/builtin/paych/message8.go +++ b/chain/actors/builtin/paych/message8.go @@ -5,13 +5,11 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - - paychtypes "github.com/filecoin-project/go-state-types/builtin/v8/paych" - actorstypes "github.com/filecoin-project/go-state-types/actors" builtin8 "github.com/filecoin-project/go-state-types/builtin" init8 "github.com/filecoin-project/go-state-types/builtin/v8/init" paych8 "github.com/filecoin-project/go-state-types/builtin/v8/paych" + paychtypes "github.com/filecoin-project/go-state-types/builtin/v8/paych" "github.com/filecoin-project/lotus/chain/actors" init_ "github.com/filecoin-project/lotus/chain/actors/builtin/init" diff --git a/chain/actors/builtin/paych/message9.go b/chain/actors/builtin/paych/message9.go index c0e68a4c3..350c760ea 100644 --- a/chain/actors/builtin/paych/message9.go +++ b/chain/actors/builtin/paych/message9.go @@ -5,11 +5,9 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - - paychtypes "github.com/filecoin-project/go-state-types/builtin/v8/paych" - actorstypes "github.com/filecoin-project/go-state-types/actors" builtin9 "github.com/filecoin-project/go-state-types/builtin" + paychtypes "github.com/filecoin-project/go-state-types/builtin/v8/paych" init9 "github.com/filecoin-project/go-state-types/builtin/v9/init" paych9 "github.com/filecoin-project/go-state-types/builtin/v9/paych" diff --git a/chain/actors/builtin/paych/paych.go b/chain/actors/builtin/paych/paych.go index 2fc2eca81..e0a13fd21 100644 --- a/chain/actors/builtin/paych/paych.go +++ b/chain/actors/builtin/paych/paych.go @@ -3,31 +3,23 @@ package paych import ( "encoding/base64" "fmt" - actorstypes "github.com/filecoin-project/go-state-types/actors" + ipldcbor "github.com/ipfs/go-ipld-cbor" "golang.org/x/xerrors" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" + actorstypes "github.com/filecoin-project/go-state-types/actors" "github.com/filecoin-project/go-state-types/big" - "github.com/filecoin-project/go-state-types/cbor" - ipldcbor "github.com/ipfs/go-ipld-cbor" - paychtypes "github.com/filecoin-project/go-state-types/builtin/v8/paych" - paych0 "github.com/filecoin-project/specs-actors/actors/builtin/paych" - + "github.com/filecoin-project/go-state-types/cbor" builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" - + paych0 "github.com/filecoin-project/specs-actors/actors/builtin/paych" builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" - builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" - builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" - builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" - builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" - builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" "github.com/filecoin-project/lotus/chain/actors" diff --git a/chain/actors/builtin/paych/v0.go b/chain/actors/builtin/paych/v0.go index e9bc30e3d..727525c50 100644 --- a/chain/actors/builtin/paych/v0.go +++ b/chain/actors/builtin/paych/v0.go @@ -6,11 +6,10 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" - - "github.com/filecoin-project/lotus/chain/actors/adt" - paych0 "github.com/filecoin-project/specs-actors/actors/builtin/paych" adt0 "github.com/filecoin-project/specs-actors/actors/util/adt" + + "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state0)(nil) diff --git a/chain/actors/builtin/paych/v2.go b/chain/actors/builtin/paych/v2.go index 400305e2f..5852c9a64 100644 --- a/chain/actors/builtin/paych/v2.go +++ b/chain/actors/builtin/paych/v2.go @@ -6,11 +6,10 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" - - "github.com/filecoin-project/lotus/chain/actors/adt" - paych2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/paych" adt2 "github.com/filecoin-project/specs-actors/v2/actors/util/adt" + + "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state2)(nil) diff --git a/chain/actors/builtin/paych/v3.go b/chain/actors/builtin/paych/v3.go index 1d7c2f94b..5297e9d10 100644 --- a/chain/actors/builtin/paych/v3.go +++ b/chain/actors/builtin/paych/v3.go @@ -6,11 +6,10 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" - - "github.com/filecoin-project/lotus/chain/actors/adt" - paych3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/paych" adt3 "github.com/filecoin-project/specs-actors/v3/actors/util/adt" + + "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state3)(nil) diff --git a/chain/actors/builtin/paych/v4.go b/chain/actors/builtin/paych/v4.go index b7d1e52a5..be10061bf 100644 --- a/chain/actors/builtin/paych/v4.go +++ b/chain/actors/builtin/paych/v4.go @@ -6,11 +6,10 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" - - "github.com/filecoin-project/lotus/chain/actors/adt" - paych4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/paych" adt4 "github.com/filecoin-project/specs-actors/v4/actors/util/adt" + + "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state4)(nil) diff --git a/chain/actors/builtin/paych/v5.go b/chain/actors/builtin/paych/v5.go index b331a1500..37a917273 100644 --- a/chain/actors/builtin/paych/v5.go +++ b/chain/actors/builtin/paych/v5.go @@ -6,11 +6,10 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" - - "github.com/filecoin-project/lotus/chain/actors/adt" - paych5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/paych" adt5 "github.com/filecoin-project/specs-actors/v5/actors/util/adt" + + "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state5)(nil) diff --git a/chain/actors/builtin/paych/v6.go b/chain/actors/builtin/paych/v6.go index 0d60b1f03..36676d9de 100644 --- a/chain/actors/builtin/paych/v6.go +++ b/chain/actors/builtin/paych/v6.go @@ -6,11 +6,10 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" - - "github.com/filecoin-project/lotus/chain/actors/adt" - paych6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/paych" adt6 "github.com/filecoin-project/specs-actors/v6/actors/util/adt" + + "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state6)(nil) diff --git a/chain/actors/builtin/paych/v7.go b/chain/actors/builtin/paych/v7.go index ce09ea2e4..88b6f2b84 100644 --- a/chain/actors/builtin/paych/v7.go +++ b/chain/actors/builtin/paych/v7.go @@ -6,11 +6,10 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" - - "github.com/filecoin-project/lotus/chain/actors/adt" - paych7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/paych" adt7 "github.com/filecoin-project/specs-actors/v7/actors/util/adt" + + "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state7)(nil) diff --git a/chain/actors/builtin/paych/v8.go b/chain/actors/builtin/paych/v8.go index 7936b76e1..1961e69ec 100644 --- a/chain/actors/builtin/paych/v8.go +++ b/chain/actors/builtin/paych/v8.go @@ -6,11 +6,10 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" - - "github.com/filecoin-project/lotus/chain/actors/adt" - paych8 "github.com/filecoin-project/go-state-types/builtin/v8/paych" adt8 "github.com/filecoin-project/go-state-types/builtin/v8/util/adt" + + "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state8)(nil) diff --git a/chain/actors/builtin/paych/v9.go b/chain/actors/builtin/paych/v9.go index 02493ac99..443fe74ea 100644 --- a/chain/actors/builtin/paych/v9.go +++ b/chain/actors/builtin/paych/v9.go @@ -6,11 +6,10 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" - - "github.com/filecoin-project/lotus/chain/actors/adt" - paych9 "github.com/filecoin-project/go-state-types/builtin/v9/paych" adt9 "github.com/filecoin-project/go-state-types/builtin/v9/util/adt" + + "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state9)(nil) diff --git a/chain/actors/builtin/power/power.go b/chain/actors/builtin/power/power.go index 1d8563d5a..dc008f1f1 100644 --- a/chain/actors/builtin/power/power.go +++ b/chain/actors/builtin/power/power.go @@ -1,35 +1,27 @@ package power import ( - "github.com/filecoin-project/go-address" - actorstypes "github.com/filecoin-project/go-state-types/actors" - "github.com/filecoin-project/go-state-types/big" - "github.com/filecoin-project/lotus/chain/actors" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" + "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" + actorstypes "github.com/filecoin-project/go-state-types/actors" + "github.com/filecoin-project/go-state-types/big" + builtin9 "github.com/filecoin-project/go-state-types/builtin" "github.com/filecoin-project/go-state-types/cbor" + builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" + builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" + builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" + builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" + builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" + builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/builtin" "github.com/filecoin-project/lotus/chain/types" - - builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" - - builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" - - builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" - - builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" - - builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" - - builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" - - builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" - - builtin9 "github.com/filecoin-project/go-state-types/builtin" ) var ( diff --git a/chain/actors/builtin/power/state.go.template b/chain/actors/builtin/power/state.go.template index b53ba68c8..08362d2db 100644 --- a/chain/actors/builtin/power/state.go.template +++ b/chain/actors/builtin/power/state.go.template @@ -20,7 +20,7 @@ import ( {{else}} builtin{{.v}} "github.com/filecoin-project/go-state-types/builtin" power{{.v}} "github.com/filecoin-project/go-state-types/builtin{{.import}}power" - adt{{.v}} "github.com/filecoin-project/go-state-types/builtin/v8/util/adt" + adt{{.v}} "github.com/filecoin-project/go-state-types/builtin{{.import}}util/adt" {{end}} ) diff --git a/chain/actors/builtin/power/v0.go b/chain/actors/builtin/power/v0.go index e114ac219..5ae42b4df 100644 --- a/chain/actors/builtin/power/v0.go +++ b/chain/actors/builtin/power/v0.go @@ -3,16 +3,16 @@ package power import ( "bytes" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" - "github.com/filecoin-project/lotus/chain/actors/adt" - "github.com/filecoin-project/lotus/chain/actors/builtin" - + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" power0 "github.com/filecoin-project/specs-actors/actors/builtin/power" adt0 "github.com/filecoin-project/specs-actors/actors/util/adt" + + "github.com/filecoin-project/lotus/chain/actors/adt" + "github.com/filecoin-project/lotus/chain/actors/builtin" ) var _ State = (*state0)(nil) diff --git a/chain/actors/builtin/power/v2.go b/chain/actors/builtin/power/v2.go index 405bad8ba..485819e3e 100644 --- a/chain/actors/builtin/power/v2.go +++ b/chain/actors/builtin/power/v2.go @@ -3,16 +3,16 @@ package power import ( "bytes" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" - "github.com/filecoin-project/lotus/chain/actors/adt" - "github.com/filecoin-project/lotus/chain/actors/builtin" - + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" power2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/power" adt2 "github.com/filecoin-project/specs-actors/v2/actors/util/adt" + + "github.com/filecoin-project/lotus/chain/actors/adt" + "github.com/filecoin-project/lotus/chain/actors/builtin" ) var _ State = (*state2)(nil) diff --git a/chain/actors/builtin/power/v3.go b/chain/actors/builtin/power/v3.go index 0ff06f617..e33ee2bb5 100644 --- a/chain/actors/builtin/power/v3.go +++ b/chain/actors/builtin/power/v3.go @@ -3,18 +3,17 @@ package power import ( "bytes" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" - "github.com/filecoin-project/lotus/chain/actors/adt" - "github.com/filecoin-project/lotus/chain/actors/builtin" - + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" - power3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/power" adt3 "github.com/filecoin-project/specs-actors/v3/actors/util/adt" + + "github.com/filecoin-project/lotus/chain/actors/adt" + "github.com/filecoin-project/lotus/chain/actors/builtin" ) var _ State = (*state3)(nil) diff --git a/chain/actors/builtin/power/v4.go b/chain/actors/builtin/power/v4.go index f121e3b2f..e5c446f07 100644 --- a/chain/actors/builtin/power/v4.go +++ b/chain/actors/builtin/power/v4.go @@ -3,18 +3,17 @@ package power import ( "bytes" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" - "github.com/filecoin-project/lotus/chain/actors/adt" - "github.com/filecoin-project/lotus/chain/actors/builtin" - + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" - power4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/power" adt4 "github.com/filecoin-project/specs-actors/v4/actors/util/adt" + + "github.com/filecoin-project/lotus/chain/actors/adt" + "github.com/filecoin-project/lotus/chain/actors/builtin" ) var _ State = (*state4)(nil) diff --git a/chain/actors/builtin/power/v5.go b/chain/actors/builtin/power/v5.go index 851522e50..aaf248058 100644 --- a/chain/actors/builtin/power/v5.go +++ b/chain/actors/builtin/power/v5.go @@ -3,18 +3,17 @@ package power import ( "bytes" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" - "github.com/filecoin-project/lotus/chain/actors/adt" - "github.com/filecoin-project/lotus/chain/actors/builtin" - + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" - power5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/power" adt5 "github.com/filecoin-project/specs-actors/v5/actors/util/adt" + + "github.com/filecoin-project/lotus/chain/actors/adt" + "github.com/filecoin-project/lotus/chain/actors/builtin" ) var _ State = (*state5)(nil) diff --git a/chain/actors/builtin/power/v6.go b/chain/actors/builtin/power/v6.go index 083b85f45..072def6e2 100644 --- a/chain/actors/builtin/power/v6.go +++ b/chain/actors/builtin/power/v6.go @@ -3,18 +3,17 @@ package power import ( "bytes" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" - "github.com/filecoin-project/lotus/chain/actors/adt" - "github.com/filecoin-project/lotus/chain/actors/builtin" - + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" - power6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/power" adt6 "github.com/filecoin-project/specs-actors/v6/actors/util/adt" + + "github.com/filecoin-project/lotus/chain/actors/adt" + "github.com/filecoin-project/lotus/chain/actors/builtin" ) var _ State = (*state6)(nil) diff --git a/chain/actors/builtin/power/v7.go b/chain/actors/builtin/power/v7.go index af626cf3a..0c60b03a0 100644 --- a/chain/actors/builtin/power/v7.go +++ b/chain/actors/builtin/power/v7.go @@ -3,18 +3,17 @@ package power import ( "bytes" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" - "github.com/filecoin-project/lotus/chain/actors/adt" - "github.com/filecoin-project/lotus/chain/actors/builtin" - + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" - power7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/power" adt7 "github.com/filecoin-project/specs-actors/v7/actors/util/adt" + + "github.com/filecoin-project/lotus/chain/actors/adt" + "github.com/filecoin-project/lotus/chain/actors/builtin" ) var _ State = (*state7)(nil) diff --git a/chain/actors/builtin/power/v8.go b/chain/actors/builtin/power/v8.go index 177d3bc3d..c23da6904 100644 --- a/chain/actors/builtin/power/v8.go +++ b/chain/actors/builtin/power/v8.go @@ -3,17 +3,17 @@ package power import ( "bytes" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" - "github.com/filecoin-project/lotus/chain/actors/adt" - "github.com/filecoin-project/lotus/chain/actors/builtin" - + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" builtin8 "github.com/filecoin-project/go-state-types/builtin" power8 "github.com/filecoin-project/go-state-types/builtin/v8/power" adt8 "github.com/filecoin-project/go-state-types/builtin/v8/util/adt" + + "github.com/filecoin-project/lotus/chain/actors/adt" + "github.com/filecoin-project/lotus/chain/actors/builtin" ) var _ State = (*state8)(nil) diff --git a/chain/actors/builtin/power/v9.go b/chain/actors/builtin/power/v9.go index 30dbefe7a..7614b7c2e 100644 --- a/chain/actors/builtin/power/v9.go +++ b/chain/actors/builtin/power/v9.go @@ -3,17 +3,17 @@ package power import ( "bytes" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + builtin9 "github.com/filecoin-project/go-state-types/builtin" + power9 "github.com/filecoin-project/go-state-types/builtin/v9/power" + adt9 "github.com/filecoin-project/go-state-types/builtin/v9/util/adt" + "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/builtin" - - builtin9 "github.com/filecoin-project/go-state-types/builtin" - adt9 "github.com/filecoin-project/go-state-types/builtin/v8/util/adt" - power9 "github.com/filecoin-project/go-state-types/builtin/v9/power" ) var _ State = (*state9)(nil) diff --git a/chain/actors/builtin/registry.go b/chain/actors/builtin/registry.go index 20df77678..d2384a1a0 100644 --- a/chain/actors/builtin/registry.go +++ b/chain/actors/builtin/registry.go @@ -1,15 +1,14 @@ package builtin import ( - actorstypes "github.com/filecoin-project/go-state-types/actors" "github.com/ipfs/go-cid" + actorstypes "github.com/filecoin-project/go-state-types/actors" account8 "github.com/filecoin-project/go-state-types/builtin/v8/account" - account9 "github.com/filecoin-project/go-state-types/builtin/v9/account" - "github.com/filecoin-project/go-state-types/cbor" rtt "github.com/filecoin-project/go-state-types/rt" + "github.com/filecoin-project/lotus/chain/actors" ) diff --git a/chain/actors/builtin/reward/reward.go b/chain/actors/builtin/reward/reward.go index 2c4856bc8..6902b258e 100644 --- a/chain/actors/builtin/reward/reward.go +++ b/chain/actors/builtin/reward/reward.go @@ -1,30 +1,22 @@ package reward import ( - "github.com/filecoin-project/go-state-types/abi" - actorstypes "github.com/filecoin-project/go-state-types/actors" - "github.com/filecoin-project/lotus/chain/actors" - reward0 "github.com/filecoin-project/specs-actors/actors/builtin/reward" "golang.org/x/xerrors" + "github.com/filecoin-project/go-state-types/abi" + actorstypes "github.com/filecoin-project/go-state-types/actors" + builtin9 "github.com/filecoin-project/go-state-types/builtin" "github.com/filecoin-project/go-state-types/cbor" - builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" - + reward0 "github.com/filecoin-project/specs-actors/actors/builtin/reward" builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" - builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" - builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" - builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" - builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" - builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" - builtin9 "github.com/filecoin-project/go-state-types/builtin" - + "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/builtin" "github.com/filecoin-project/lotus/chain/types" diff --git a/chain/actors/builtin/reward/v0.go b/chain/actors/builtin/reward/v0.go index 646ab3a9a..12bdee054 100644 --- a/chain/actors/builtin/reward/v0.go +++ b/chain/actors/builtin/reward/v0.go @@ -1,15 +1,15 @@ package reward import ( - "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" - "github.com/filecoin-project/lotus/chain/actors/adt" - "github.com/filecoin-project/lotus/chain/actors/builtin" - + "github.com/filecoin-project/go-state-types/abi" miner0 "github.com/filecoin-project/specs-actors/actors/builtin/miner" reward0 "github.com/filecoin-project/specs-actors/actors/builtin/reward" smoothing0 "github.com/filecoin-project/specs-actors/actors/util/smoothing" + + "github.com/filecoin-project/lotus/chain/actors/adt" + "github.com/filecoin-project/lotus/chain/actors/builtin" ) var _ State = (*state0)(nil) diff --git a/chain/actors/builtin/reward/v2.go b/chain/actors/builtin/reward/v2.go index 08e9a7bc3..ed2481635 100644 --- a/chain/actors/builtin/reward/v2.go +++ b/chain/actors/builtin/reward/v2.go @@ -1,15 +1,15 @@ package reward import ( - "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" - "github.com/filecoin-project/lotus/chain/actors/adt" - "github.com/filecoin-project/lotus/chain/actors/builtin" - + "github.com/filecoin-project/go-state-types/abi" miner2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/miner" reward2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/reward" smoothing2 "github.com/filecoin-project/specs-actors/v2/actors/util/smoothing" + + "github.com/filecoin-project/lotus/chain/actors/adt" + "github.com/filecoin-project/lotus/chain/actors/builtin" ) var _ State = (*state2)(nil) diff --git a/chain/actors/builtin/reward/v3.go b/chain/actors/builtin/reward/v3.go index fd9fa56e2..d9f4bf369 100644 --- a/chain/actors/builtin/reward/v3.go +++ b/chain/actors/builtin/reward/v3.go @@ -1,15 +1,15 @@ package reward import ( - "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" - "github.com/filecoin-project/lotus/chain/actors/adt" - "github.com/filecoin-project/lotus/chain/actors/builtin" - + "github.com/filecoin-project/go-state-types/abi" miner3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/miner" reward3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/reward" smoothing3 "github.com/filecoin-project/specs-actors/v3/actors/util/smoothing" + + "github.com/filecoin-project/lotus/chain/actors/adt" + "github.com/filecoin-project/lotus/chain/actors/builtin" ) var _ State = (*state3)(nil) diff --git a/chain/actors/builtin/reward/v4.go b/chain/actors/builtin/reward/v4.go index 310ca04e8..160c72ce7 100644 --- a/chain/actors/builtin/reward/v4.go +++ b/chain/actors/builtin/reward/v4.go @@ -1,15 +1,15 @@ package reward import ( - "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" - "github.com/filecoin-project/lotus/chain/actors/adt" - "github.com/filecoin-project/lotus/chain/actors/builtin" - + "github.com/filecoin-project/go-state-types/abi" miner4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/miner" reward4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/reward" smoothing4 "github.com/filecoin-project/specs-actors/v4/actors/util/smoothing" + + "github.com/filecoin-project/lotus/chain/actors/adt" + "github.com/filecoin-project/lotus/chain/actors/builtin" ) var _ State = (*state4)(nil) diff --git a/chain/actors/builtin/reward/v5.go b/chain/actors/builtin/reward/v5.go index 7200f7d11..838ec8f21 100644 --- a/chain/actors/builtin/reward/v5.go +++ b/chain/actors/builtin/reward/v5.go @@ -1,15 +1,15 @@ package reward import ( - "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" - "github.com/filecoin-project/lotus/chain/actors/adt" - "github.com/filecoin-project/lotus/chain/actors/builtin" - + "github.com/filecoin-project/go-state-types/abi" miner5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/miner" reward5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/reward" smoothing5 "github.com/filecoin-project/specs-actors/v5/actors/util/smoothing" + + "github.com/filecoin-project/lotus/chain/actors/adt" + "github.com/filecoin-project/lotus/chain/actors/builtin" ) var _ State = (*state5)(nil) diff --git a/chain/actors/builtin/reward/v6.go b/chain/actors/builtin/reward/v6.go index 010a3a870..e056b22f6 100644 --- a/chain/actors/builtin/reward/v6.go +++ b/chain/actors/builtin/reward/v6.go @@ -1,15 +1,15 @@ package reward import ( - "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" - "github.com/filecoin-project/lotus/chain/actors/adt" - "github.com/filecoin-project/lotus/chain/actors/builtin" - + "github.com/filecoin-project/go-state-types/abi" miner6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/miner" reward6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/reward" smoothing6 "github.com/filecoin-project/specs-actors/v6/actors/util/smoothing" + + "github.com/filecoin-project/lotus/chain/actors/adt" + "github.com/filecoin-project/lotus/chain/actors/builtin" ) var _ State = (*state6)(nil) diff --git a/chain/actors/builtin/reward/v7.go b/chain/actors/builtin/reward/v7.go index 368bb3abd..5fedaa43c 100644 --- a/chain/actors/builtin/reward/v7.go +++ b/chain/actors/builtin/reward/v7.go @@ -1,15 +1,15 @@ package reward import ( - "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" - "github.com/filecoin-project/lotus/chain/actors/adt" - "github.com/filecoin-project/lotus/chain/actors/builtin" - + "github.com/filecoin-project/go-state-types/abi" miner7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/miner" reward7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/reward" smoothing7 "github.com/filecoin-project/specs-actors/v7/actors/util/smoothing" + + "github.com/filecoin-project/lotus/chain/actors/adt" + "github.com/filecoin-project/lotus/chain/actors/builtin" ) var _ State = (*state7)(nil) diff --git a/chain/actors/builtin/reward/v8.go b/chain/actors/builtin/reward/v8.go index 3d49063df..ecc5a94ba 100644 --- a/chain/actors/builtin/reward/v8.go +++ b/chain/actors/builtin/reward/v8.go @@ -1,15 +1,15 @@ package reward import ( - "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" - "github.com/filecoin-project/lotus/chain/actors/adt" - "github.com/filecoin-project/lotus/chain/actors/builtin" - + "github.com/filecoin-project/go-state-types/abi" miner8 "github.com/filecoin-project/go-state-types/builtin/v8/miner" reward8 "github.com/filecoin-project/go-state-types/builtin/v8/reward" smoothing8 "github.com/filecoin-project/go-state-types/builtin/v8/util/smoothing" + + "github.com/filecoin-project/lotus/chain/actors/adt" + "github.com/filecoin-project/lotus/chain/actors/builtin" ) var _ State = (*state8)(nil) diff --git a/chain/actors/builtin/reward/v9.go b/chain/actors/builtin/reward/v9.go index 6dbfdd2e6..04da532d2 100644 --- a/chain/actors/builtin/reward/v9.go +++ b/chain/actors/builtin/reward/v9.go @@ -1,15 +1,15 @@ package reward import ( - "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" - "github.com/filecoin-project/lotus/chain/actors/adt" - "github.com/filecoin-project/lotus/chain/actors/builtin" - + "github.com/filecoin-project/go-state-types/abi" miner9 "github.com/filecoin-project/go-state-types/builtin/v9/miner" reward9 "github.com/filecoin-project/go-state-types/builtin/v9/reward" smoothing9 "github.com/filecoin-project/go-state-types/builtin/v9/util/smoothing" + + "github.com/filecoin-project/lotus/chain/actors/adt" + "github.com/filecoin-project/lotus/chain/actors/builtin" ) var _ State = (*state9)(nil) diff --git a/chain/actors/builtin/system/system.go b/chain/actors/builtin/system/system.go index a67374805..5382e53d4 100644 --- a/chain/actors/builtin/system/system.go +++ b/chain/actors/builtin/system/system.go @@ -1,29 +1,22 @@ package system import ( + "github.com/ipfs/go-cid" + "golang.org/x/xerrors" + actorstypes "github.com/filecoin-project/go-state-types/actors" + builtin9 "github.com/filecoin-project/go-state-types/builtin" + builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" + builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" + builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" + builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" + builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" + builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/types" - "github.com/ipfs/go-cid" - - "golang.org/x/xerrors" - - builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" - - builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" - - builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" - - builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" - - builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" - - builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" - - builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" - - builtin9 "github.com/filecoin-project/go-state-types/builtin" ) var ( diff --git a/chain/actors/builtin/system/v0.go b/chain/actors/builtin/system/v0.go index a5aa8e8fa..efa0741ce 100644 --- a/chain/actors/builtin/system/v0.go +++ b/chain/actors/builtin/system/v0.go @@ -3,9 +3,9 @@ package system import ( "github.com/ipfs/go-cid" - "github.com/filecoin-project/lotus/chain/actors/adt" - system0 "github.com/filecoin-project/specs-actors/actors/builtin/system" + + "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state0)(nil) diff --git a/chain/actors/builtin/system/v2.go b/chain/actors/builtin/system/v2.go index aea9eff7b..e4fefd08d 100644 --- a/chain/actors/builtin/system/v2.go +++ b/chain/actors/builtin/system/v2.go @@ -3,9 +3,9 @@ package system import ( "github.com/ipfs/go-cid" - "github.com/filecoin-project/lotus/chain/actors/adt" - system2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/system" + + "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state2)(nil) diff --git a/chain/actors/builtin/system/v3.go b/chain/actors/builtin/system/v3.go index fd5f0cd50..d2b59c8a8 100644 --- a/chain/actors/builtin/system/v3.go +++ b/chain/actors/builtin/system/v3.go @@ -3,9 +3,9 @@ package system import ( "github.com/ipfs/go-cid" - "github.com/filecoin-project/lotus/chain/actors/adt" - system3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/system" + + "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state3)(nil) diff --git a/chain/actors/builtin/system/v4.go b/chain/actors/builtin/system/v4.go index fbdec7e93..9528c1779 100644 --- a/chain/actors/builtin/system/v4.go +++ b/chain/actors/builtin/system/v4.go @@ -3,9 +3,9 @@ package system import ( "github.com/ipfs/go-cid" - "github.com/filecoin-project/lotus/chain/actors/adt" - system4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/system" + + "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state4)(nil) diff --git a/chain/actors/builtin/system/v5.go b/chain/actors/builtin/system/v5.go index 3d3c27a12..adc1d4553 100644 --- a/chain/actors/builtin/system/v5.go +++ b/chain/actors/builtin/system/v5.go @@ -3,9 +3,9 @@ package system import ( "github.com/ipfs/go-cid" - "github.com/filecoin-project/lotus/chain/actors/adt" - system5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/system" + + "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state5)(nil) diff --git a/chain/actors/builtin/system/v6.go b/chain/actors/builtin/system/v6.go index 314308845..0cebadce0 100644 --- a/chain/actors/builtin/system/v6.go +++ b/chain/actors/builtin/system/v6.go @@ -3,9 +3,9 @@ package system import ( "github.com/ipfs/go-cid" - "github.com/filecoin-project/lotus/chain/actors/adt" - system6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/system" + + "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state6)(nil) diff --git a/chain/actors/builtin/system/v7.go b/chain/actors/builtin/system/v7.go index 3987db8dd..0009773da 100644 --- a/chain/actors/builtin/system/v7.go +++ b/chain/actors/builtin/system/v7.go @@ -3,9 +3,9 @@ package system import ( "github.com/ipfs/go-cid" - "github.com/filecoin-project/lotus/chain/actors/adt" - system7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/system" + + "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state7)(nil) diff --git a/chain/actors/builtin/system/v8.go b/chain/actors/builtin/system/v8.go index a30d5fa30..48f150fb9 100644 --- a/chain/actors/builtin/system/v8.go +++ b/chain/actors/builtin/system/v8.go @@ -3,9 +3,9 @@ package system import ( "github.com/ipfs/go-cid" - "github.com/filecoin-project/lotus/chain/actors/adt" - system8 "github.com/filecoin-project/go-state-types/builtin/v8/system" + + "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state8)(nil) diff --git a/chain/actors/builtin/system/v9.go b/chain/actors/builtin/system/v9.go index 6edbd72b9..049d6baf6 100644 --- a/chain/actors/builtin/system/v9.go +++ b/chain/actors/builtin/system/v9.go @@ -3,9 +3,9 @@ package system import ( "github.com/ipfs/go-cid" - "github.com/filecoin-project/lotus/chain/actors/adt" - system9 "github.com/filecoin-project/go-state-types/builtin/v9/system" + + "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state9)(nil) diff --git a/chain/actors/builtin/verifreg/v0.go b/chain/actors/builtin/verifreg/v0.go index dcd34c72a..8eaf83120 100644 --- a/chain/actors/builtin/verifreg/v0.go +++ b/chain/actors/builtin/verifreg/v0.go @@ -1,15 +1,15 @@ package verifreg import ( + "github.com/ipfs/go-cid" + "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - "github.com/ipfs/go-cid" + verifreg0 "github.com/filecoin-project/specs-actors/actors/builtin/verifreg" + adt0 "github.com/filecoin-project/specs-actors/actors/util/adt" "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/adt" - - verifreg0 "github.com/filecoin-project/specs-actors/actors/builtin/verifreg" - adt0 "github.com/filecoin-project/specs-actors/actors/util/adt" ) var _ State = (*state0)(nil) diff --git a/chain/actors/builtin/verifreg/v2.go b/chain/actors/builtin/verifreg/v2.go index dfe25f054..1857a02e4 100644 --- a/chain/actors/builtin/verifreg/v2.go +++ b/chain/actors/builtin/verifreg/v2.go @@ -1,15 +1,15 @@ package verifreg import ( + "github.com/ipfs/go-cid" + "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - "github.com/ipfs/go-cid" + verifreg2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/verifreg" + adt2 "github.com/filecoin-project/specs-actors/v2/actors/util/adt" "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/adt" - - verifreg2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/verifreg" - adt2 "github.com/filecoin-project/specs-actors/v2/actors/util/adt" ) var _ State = (*state2)(nil) diff --git a/chain/actors/builtin/verifreg/v3.go b/chain/actors/builtin/verifreg/v3.go index b7ab18080..98f529a61 100644 --- a/chain/actors/builtin/verifreg/v3.go +++ b/chain/actors/builtin/verifreg/v3.go @@ -1,17 +1,16 @@ package verifreg import ( + "github.com/ipfs/go-cid" + "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - "github.com/ipfs/go-cid" + builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" + verifreg3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/verifreg" + adt3 "github.com/filecoin-project/specs-actors/v3/actors/util/adt" "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/adt" - - builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" - - verifreg3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/verifreg" - adt3 "github.com/filecoin-project/specs-actors/v3/actors/util/adt" ) var _ State = (*state3)(nil) diff --git a/chain/actors/builtin/verifreg/v4.go b/chain/actors/builtin/verifreg/v4.go index aee3fbdca..08aac0c7d 100644 --- a/chain/actors/builtin/verifreg/v4.go +++ b/chain/actors/builtin/verifreg/v4.go @@ -1,17 +1,16 @@ package verifreg import ( + "github.com/ipfs/go-cid" + "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - "github.com/ipfs/go-cid" + builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" + verifreg4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/verifreg" + adt4 "github.com/filecoin-project/specs-actors/v4/actors/util/adt" "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/adt" - - builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" - - verifreg4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/verifreg" - adt4 "github.com/filecoin-project/specs-actors/v4/actors/util/adt" ) var _ State = (*state4)(nil) diff --git a/chain/actors/builtin/verifreg/v5.go b/chain/actors/builtin/verifreg/v5.go index 4a74e1ea8..303b10cd1 100644 --- a/chain/actors/builtin/verifreg/v5.go +++ b/chain/actors/builtin/verifreg/v5.go @@ -1,17 +1,16 @@ package verifreg import ( + "github.com/ipfs/go-cid" + "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - "github.com/ipfs/go-cid" + builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" + verifreg5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/verifreg" + adt5 "github.com/filecoin-project/specs-actors/v5/actors/util/adt" "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/adt" - - builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" - - verifreg5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/verifreg" - adt5 "github.com/filecoin-project/specs-actors/v5/actors/util/adt" ) var _ State = (*state5)(nil) diff --git a/chain/actors/builtin/verifreg/v6.go b/chain/actors/builtin/verifreg/v6.go index a776f1149..c1bcd0071 100644 --- a/chain/actors/builtin/verifreg/v6.go +++ b/chain/actors/builtin/verifreg/v6.go @@ -1,17 +1,16 @@ package verifreg import ( + "github.com/ipfs/go-cid" + "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - "github.com/ipfs/go-cid" + builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + verifreg6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/verifreg" + adt6 "github.com/filecoin-project/specs-actors/v6/actors/util/adt" "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/adt" - - builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" - - verifreg6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/verifreg" - adt6 "github.com/filecoin-project/specs-actors/v6/actors/util/adt" ) var _ State = (*state6)(nil) diff --git a/chain/actors/builtin/verifreg/v7.go b/chain/actors/builtin/verifreg/v7.go index 39d72a15d..edce5f560 100644 --- a/chain/actors/builtin/verifreg/v7.go +++ b/chain/actors/builtin/verifreg/v7.go @@ -1,17 +1,16 @@ package verifreg import ( + "github.com/ipfs/go-cid" + "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - "github.com/ipfs/go-cid" + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + verifreg7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/verifreg" + adt7 "github.com/filecoin-project/specs-actors/v7/actors/util/adt" "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/adt" - - builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" - - verifreg7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/verifreg" - adt7 "github.com/filecoin-project/specs-actors/v7/actors/util/adt" ) var _ State = (*state7)(nil) diff --git a/chain/actors/builtin/verifreg/v8.go b/chain/actors/builtin/verifreg/v8.go index 95fdf2e6d..00e0636ef 100644 --- a/chain/actors/builtin/verifreg/v8.go +++ b/chain/actors/builtin/verifreg/v8.go @@ -1,16 +1,16 @@ package verifreg import ( - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" - "github.com/filecoin-project/lotus/chain/actors" - "github.com/filecoin-project/lotus/chain/actors/adt" - + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" builtin8 "github.com/filecoin-project/go-state-types/builtin" adt8 "github.com/filecoin-project/go-state-types/builtin/v8/util/adt" verifreg8 "github.com/filecoin-project/go-state-types/builtin/v8/verifreg" + + "github.com/filecoin-project/lotus/chain/actors" + "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state8)(nil) diff --git a/chain/actors/builtin/verifreg/v9.go b/chain/actors/builtin/verifreg/v9.go index 0430b0a14..ca96eda05 100644 --- a/chain/actors/builtin/verifreg/v9.go +++ b/chain/actors/builtin/verifreg/v9.go @@ -1,16 +1,16 @@ package verifreg import ( - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" - "github.com/filecoin-project/lotus/chain/actors" - "github.com/filecoin-project/lotus/chain/actors/adt" - + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" builtin9 "github.com/filecoin-project/go-state-types/builtin" adt9 "github.com/filecoin-project/go-state-types/builtin/v9/util/adt" verifreg9 "github.com/filecoin-project/go-state-types/builtin/v9/verifreg" + + "github.com/filecoin-project/lotus/chain/actors" + "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state9)(nil) diff --git a/chain/actors/builtin/verifreg/verifreg.go b/chain/actors/builtin/verifreg/verifreg.go index 41d6d6b49..fa5f53ec7 100644 --- a/chain/actors/builtin/verifreg/verifreg.go +++ b/chain/actors/builtin/verifreg/verifreg.go @@ -1,29 +1,20 @@ package verifreg import ( - actorstypes "github.com/filecoin-project/go-state-types/actors" "golang.org/x/xerrors" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - - "github.com/filecoin-project/go-state-types/cbor" - - builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" - - builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" - - builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" - - builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" - - builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" - - builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" - - builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" - + actorstypes "github.com/filecoin-project/go-state-types/actors" builtin9 "github.com/filecoin-project/go-state-types/builtin" + "github.com/filecoin-project/go-state-types/cbor" + builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" + builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" + builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" + builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" + builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" + builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/adt" diff --git a/chain/actors/policy/policy.go b/chain/actors/policy/policy.go index f65859bb2..eaeb326c7 100644 --- a/chain/actors/policy/policy.go +++ b/chain/actors/policy/policy.go @@ -1,67 +1,49 @@ package policy import ( - actorstypes "github.com/filecoin-project/go-state-types/actors" - - "github.com/filecoin-project/go-state-types/big" "golang.org/x/xerrors" "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/network" - - market0 "github.com/filecoin-project/specs-actors/actors/builtin/market" - miner0 "github.com/filecoin-project/specs-actors/actors/builtin/miner" - verifreg0 "github.com/filecoin-project/specs-actors/actors/builtin/verifreg" - - power0 "github.com/filecoin-project/specs-actors/actors/builtin/power" - - builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" - - market2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/market" - miner2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/miner" - verifreg2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/verifreg" - - builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" - - market3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/market" - miner3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/miner" - verifreg3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/verifreg" - - builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" - - market4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/market" - miner4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/miner" - verifreg4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/verifreg" - - builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" - - market5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/market" - miner5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/miner" - verifreg5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/verifreg" - - builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" - - market6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/market" - miner6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/miner" - verifreg6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/verifreg" - - builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" - - market7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/market" - miner7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/miner" - verifreg7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/verifreg" - + actorstypes "github.com/filecoin-project/go-state-types/actors" + "github.com/filecoin-project/go-state-types/big" builtin8 "github.com/filecoin-project/go-state-types/builtin" + builtin9 "github.com/filecoin-project/go-state-types/builtin" market8 "github.com/filecoin-project/go-state-types/builtin/v8/market" miner8 "github.com/filecoin-project/go-state-types/builtin/v8/miner" verifreg8 "github.com/filecoin-project/go-state-types/builtin/v8/verifreg" - - builtin9 "github.com/filecoin-project/go-state-types/builtin" market9 "github.com/filecoin-project/go-state-types/builtin/v9/market" miner9 "github.com/filecoin-project/go-state-types/builtin/v9/miner" - verifreg9 "github.com/filecoin-project/go-state-types/builtin/v9/verifreg" - paych9 "github.com/filecoin-project/go-state-types/builtin/v9/paych" + verifreg9 "github.com/filecoin-project/go-state-types/builtin/v9/verifreg" + "github.com/filecoin-project/go-state-types/network" + market0 "github.com/filecoin-project/specs-actors/actors/builtin/market" + miner0 "github.com/filecoin-project/specs-actors/actors/builtin/miner" + power0 "github.com/filecoin-project/specs-actors/actors/builtin/power" + verifreg0 "github.com/filecoin-project/specs-actors/actors/builtin/verifreg" + builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" + market2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/market" + miner2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/miner" + verifreg2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/verifreg" + builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" + market3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/market" + miner3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/miner" + verifreg3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/verifreg" + builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" + market4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/market" + miner4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/miner" + verifreg4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/verifreg" + builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" + market5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/market" + miner5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/miner" + verifreg5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/verifreg" + builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + market6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/market" + miner6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/miner" + verifreg6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/verifreg" + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + market7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/market" + miner7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/miner" + verifreg7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/verifreg" ) const ( diff --git a/chain/exchange/cbor_gen.go b/chain/exchange/cbor_gen.go index 9c7f68ab8..d1eb271e9 100644 --- a/chain/exchange/cbor_gen.go +++ b/chain/exchange/cbor_gen.go @@ -8,10 +8,11 @@ import ( "math" "sort" - types "github.com/filecoin-project/lotus/chain/types" cid "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" xerrors "golang.org/x/xerrors" + + types "github.com/filecoin-project/lotus/chain/types" ) var _ = xerrors.Errorf diff --git a/chain/types/cbor_gen.go b/chain/types/cbor_gen.go index 79ff5d19c..78a3449ee 100644 --- a/chain/types/cbor_gen.go +++ b/chain/types/cbor_gen.go @@ -8,13 +8,14 @@ import ( "math" "sort" + cid "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + xerrors "golang.org/x/xerrors" + abi "github.com/filecoin-project/go-state-types/abi" crypto "github.com/filecoin-project/go-state-types/crypto" exitcode "github.com/filecoin-project/go-state-types/exitcode" proof "github.com/filecoin-project/go-state-types/proof" - cid "github.com/ipfs/go-cid" - cbg "github.com/whyrusleeping/cbor-gen" - xerrors "golang.org/x/xerrors" ) var _ = xerrors.Errorf diff --git a/chain/vm/cbor_gen.go b/chain/vm/cbor_gen.go index 0e1677c95..64b623f63 100644 --- a/chain/vm/cbor_gen.go +++ b/chain/vm/cbor_gen.go @@ -8,10 +8,11 @@ import ( "math" "sort" - types "github.com/filecoin-project/lotus/chain/types" cid "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" xerrors "golang.org/x/xerrors" + + types "github.com/filecoin-project/lotus/chain/types" ) var _ = xerrors.Errorf diff --git a/cli/servicesmock_test.go b/cli/servicesmock_test.go index 5bae52a5e..11260ab08 100644 --- a/cli/servicesmock_test.go +++ b/cli/servicesmock_test.go @@ -8,12 +8,14 @@ import ( context "context" reflect "reflect" + gomock "github.com/golang/mock/gomock" + go_address "github.com/filecoin-project/go-address" abi "github.com/filecoin-project/go-state-types/abi" big "github.com/filecoin-project/go-state-types/big" + api "github.com/filecoin-project/lotus/api" types "github.com/filecoin-project/lotus/chain/types" - gomock "github.com/golang/mock/gomock" ) // MockServicesAPI is a mock of ServicesAPI interface. diff --git a/conformance/chaos/cbor_gen.go b/conformance/chaos/cbor_gen.go index 436849cdc..2deaaa53f 100644 --- a/conformance/chaos/cbor_gen.go +++ b/conformance/chaos/cbor_gen.go @@ -8,12 +8,13 @@ import ( "math" "sort" - address "github.com/filecoin-project/go-address" - abi "github.com/filecoin-project/go-state-types/abi" - exitcode "github.com/filecoin-project/go-state-types/exitcode" cid "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" xerrors "golang.org/x/xerrors" + + address "github.com/filecoin-project/go-address" + abi "github.com/filecoin-project/go-state-types/abi" + exitcode "github.com/filecoin-project/go-state-types/exitcode" ) var _ = xerrors.Errorf diff --git a/journal/mockjournal/journal.go b/journal/mockjournal/journal.go index 3668923e5..842c252bd 100644 --- a/journal/mockjournal/journal.go +++ b/journal/mockjournal/journal.go @@ -7,8 +7,9 @@ package mockjournal import ( reflect "reflect" - journal "github.com/filecoin-project/lotus/journal" gomock "github.com/golang/mock/gomock" + + journal "github.com/filecoin-project/lotus/journal" ) // MockJournal is a mock of Journal interface. diff --git a/lib/retry/retry.go b/lib/retry/retry.go index 88307a800..0b53c0fa3 100644 --- a/lib/retry/retry.go +++ b/lib/retry/retry.go @@ -2,9 +2,10 @@ package retry import ( "errors" - logging "github.com/ipfs/go-log/v2" "reflect" "time" + + logging "github.com/ipfs/go-log/v2" ) var log = logging.Logger("retry") diff --git a/markets/dagstore/mocks/mock_lotus_accessor.go b/markets/dagstore/mocks/mock_lotus_accessor.go index 19923cc2a..3910512cf 100644 --- a/markets/dagstore/mocks/mock_lotus_accessor.go +++ b/markets/dagstore/mocks/mock_lotus_accessor.go @@ -8,9 +8,10 @@ import ( context "context" reflect "reflect" - mount "github.com/filecoin-project/dagstore/mount" gomock "github.com/golang/mock/gomock" cid "github.com/ipfs/go-cid" + + mount "github.com/filecoin-project/dagstore/mount" ) // MockMinerAPI is a mock of MinerAPI interface. diff --git a/node/hello/cbor_gen.go b/node/hello/cbor_gen.go index 68c82e2bb..81a1774c1 100644 --- a/node/hello/cbor_gen.go +++ b/node/hello/cbor_gen.go @@ -8,10 +8,11 @@ import ( "math" "sort" - abi "github.com/filecoin-project/go-state-types/abi" cid "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" xerrors "golang.org/x/xerrors" + + abi "github.com/filecoin-project/go-state-types/abi" ) var _ = xerrors.Errorf diff --git a/paychmgr/cbor_gen.go b/paychmgr/cbor_gen.go index 450d526d8..78a55488e 100644 --- a/paychmgr/cbor_gen.go +++ b/paychmgr/cbor_gen.go @@ -8,11 +8,12 @@ import ( "math" "sort" - address "github.com/filecoin-project/go-address" - paych "github.com/filecoin-project/go-state-types/builtin/v8/paych" cid "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" xerrors "golang.org/x/xerrors" + + address "github.com/filecoin-project/go-address" + paych "github.com/filecoin-project/go-state-types/builtin/v8/paych" ) var _ = xerrors.Errorf diff --git a/storage/paths/mocks/index.go b/storage/paths/mocks/index.go index fa2c8c830..6fdcb03b9 100644 --- a/storage/paths/mocks/index.go +++ b/storage/paths/mocks/index.go @@ -8,10 +8,12 @@ import ( context "context" reflect "reflect" + gomock "github.com/golang/mock/gomock" + abi "github.com/filecoin-project/go-state-types/abi" + fsutil "github.com/filecoin-project/lotus/storage/sealer/fsutil" storiface "github.com/filecoin-project/lotus/storage/sealer/storiface" - gomock "github.com/golang/mock/gomock" ) // MockSectorIndex is a mock of SectorIndex interface. diff --git a/storage/paths/mocks/pf.go b/storage/paths/mocks/pf.go index 7c4836a68..50b020aaa 100644 --- a/storage/paths/mocks/pf.go +++ b/storage/paths/mocks/pf.go @@ -8,10 +8,12 @@ import ( os "os" reflect "reflect" + gomock "github.com/golang/mock/gomock" + abi "github.com/filecoin-project/go-state-types/abi" + partialfile "github.com/filecoin-project/lotus/storage/sealer/partialfile" storiface "github.com/filecoin-project/lotus/storage/sealer/storiface" - gomock "github.com/golang/mock/gomock" ) // MockPartialFileHandler is a mock of PartialFileHandler interface. diff --git a/storage/paths/mocks/store.go b/storage/paths/mocks/store.go index 16deda2e5..72be48323 100644 --- a/storage/paths/mocks/store.go +++ b/storage/paths/mocks/store.go @@ -8,10 +8,12 @@ import ( context "context" reflect "reflect" + gomock "github.com/golang/mock/gomock" + abi "github.com/filecoin-project/go-state-types/abi" + fsutil "github.com/filecoin-project/lotus/storage/sealer/fsutil" storiface "github.com/filecoin-project/lotus/storage/sealer/storiface" - gomock "github.com/golang/mock/gomock" ) // MockStore is a mock of Store interface. diff --git a/storage/pipeline/cbor_gen.go b/storage/pipeline/cbor_gen.go index c330392f7..fe7fa2d53 100644 --- a/storage/pipeline/cbor_gen.go +++ b/storage/pipeline/cbor_gen.go @@ -8,12 +8,14 @@ import ( "math" "sort" - abi "github.com/filecoin-project/go-state-types/abi" - miner "github.com/filecoin-project/go-state-types/builtin/v9/miner" - api "github.com/filecoin-project/lotus/api" cid "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" xerrors "golang.org/x/xerrors" + + abi "github.com/filecoin-project/go-state-types/abi" + miner "github.com/filecoin-project/go-state-types/builtin/v9/miner" + + api "github.com/filecoin-project/lotus/api" ) var _ = xerrors.Errorf diff --git a/storage/pipeline/mocks/api.go b/storage/pipeline/mocks/api.go index 015e69c15..b6b6c7022 100644 --- a/storage/pipeline/mocks/api.go +++ b/storage/pipeline/mocks/api.go @@ -8,6 +8,9 @@ import ( context "context" reflect "reflect" + gomock "github.com/golang/mock/gomock" + cid "github.com/ipfs/go-cid" + address "github.com/filecoin-project/go-address" bitfield "github.com/filecoin-project/go-bitfield" abi "github.com/filecoin-project/go-state-types/abi" @@ -16,11 +19,10 @@ import ( crypto "github.com/filecoin-project/go-state-types/crypto" dline "github.com/filecoin-project/go-state-types/dline" network "github.com/filecoin-project/go-state-types/network" + api "github.com/filecoin-project/lotus/api" miner0 "github.com/filecoin-project/lotus/chain/actors/builtin/miner" types "github.com/filecoin-project/lotus/chain/types" - gomock "github.com/golang/mock/gomock" - cid "github.com/ipfs/go-cid" ) // MockSealingAPI is a mock of SealingAPI interface. diff --git a/storage/pipeline/mocks/mock_commit_batcher.go b/storage/pipeline/mocks/mock_commit_batcher.go index 71c973b2a..c4e7e3eef 100644 --- a/storage/pipeline/mocks/mock_commit_batcher.go +++ b/storage/pipeline/mocks/mock_commit_batcher.go @@ -8,14 +8,16 @@ import ( context "context" reflect "reflect" + gomock "github.com/golang/mock/gomock" + address "github.com/filecoin-project/go-address" abi "github.com/filecoin-project/go-state-types/abi" big "github.com/filecoin-project/go-state-types/big" miner "github.com/filecoin-project/go-state-types/builtin/v9/miner" network "github.com/filecoin-project/go-state-types/network" + api "github.com/filecoin-project/lotus/api" types "github.com/filecoin-project/lotus/chain/types" - gomock "github.com/golang/mock/gomock" ) // MockCommitBatcherApi is a mock of CommitBatcherApi interface. diff --git a/storage/pipeline/mocks/mock_precommit_batcher.go b/storage/pipeline/mocks/mock_precommit_batcher.go index e8435276d..2f65e3e03 100644 --- a/storage/pipeline/mocks/mock_precommit_batcher.go +++ b/storage/pipeline/mocks/mock_precommit_batcher.go @@ -8,12 +8,14 @@ import ( context "context" reflect "reflect" + gomock "github.com/golang/mock/gomock" + address "github.com/filecoin-project/go-address" big "github.com/filecoin-project/go-state-types/big" network "github.com/filecoin-project/go-state-types/network" + api "github.com/filecoin-project/lotus/api" types "github.com/filecoin-project/lotus/chain/types" - gomock "github.com/golang/mock/gomock" ) // MockPreCommitBatcherApi is a mock of PreCommitBatcherApi interface. diff --git a/storage/sealer/cbor_gen.go b/storage/sealer/cbor_gen.go index 6db7d96a4..48bf0146a 100644 --- a/storage/sealer/cbor_gen.go +++ b/storage/sealer/cbor_gen.go @@ -8,10 +8,11 @@ import ( "math" "sort" - sealtasks "github.com/filecoin-project/lotus/storage/sealer/sealtasks" cid "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" xerrors "golang.org/x/xerrors" + + sealtasks "github.com/filecoin-project/lotus/storage/sealer/sealtasks" ) var _ = xerrors.Errorf From e9a323529186e1da6f8351fb27a3eb91f20a5799 Mon Sep 17 00:00:00 2001 From: Aayush Date: Wed, 7 Sep 2022 21:25:28 -0400 Subject: [PATCH 110/185] more fixes --- build/actors/v9.tar.zst | Bin 0 -> 875093 bytes build/builtin_actors_gen.go | 119 ++ build/openrpc/full.json.gz | Bin 28354 -> 28281 bytes build/openrpc/gateway.json.gz | Bin 4942 -> 4942 bytes build/openrpc/miner.json.gz | Bin 15449 -> 15449 bytes chain/actors/builtin/system/actor.go.template | 1 + chain/actors/builtin/system/state.go.template | 10 + chain/actors/builtin/system/system.go | 1 + chain/actors/builtin/system/v0.go | 7 + chain/actors/builtin/system/v2.go | 7 + chain/actors/builtin/system/v3.go | 7 + chain/actors/builtin/system/v4.go | 7 + chain/actors/builtin/system/v5.go | 7 + chain/actors/builtin/system/v6.go | 7 + chain/actors/builtin/system/v7.go | 7 + chain/actors/builtin/system/v8.go | 7 + chain/actors/builtin/system/v9.go | 7 + chain/gen/genesis/f00_system.go | 6 +- chain/vm/fvm.go | 2 +- .../simulation/stages/precommit_stage.go | 20 +- documentation/en/api-v0-methods-miner.md | 2 +- documentation/en/api-v0-methods.md | 25 +- documentation/en/api-v1-unstable-methods.md | 25 +- lotuspond/front/src/chain/methods.json | 1269 ++++++++--------- node/config/doc_gen.go | 326 ++--- node/config/doc_util.go | 6 +- 26 files changed, 981 insertions(+), 894 deletions(-) create mode 100644 build/actors/v9.tar.zst diff --git a/build/actors/v9.tar.zst b/build/actors/v9.tar.zst new file mode 100644 index 0000000000000000000000000000000000000000..db85bc587b91581ddfe9d8a54400970f036b744a GIT binary patch literal 875093 zcmV(nK=QvRwJ-eyXk0P^>esnsQV<|4Pde3|4)KK8K9}fTJy*I#r;Q1T742?l*kW>P zi&PuYMglfC#TL;*`0x(^g!k1yOMigb!krzd%T{5R#Hzi*;RMl>J|bijviIIHrIZ4& z1_B291wCi;vNZbs)=wyUd-YGIqieLVnzOdieo9o*g`QfmhKc1>ot{i@MdelP{)G*4 zRZF(zH)5~R&PLR?Z=T(`YvsDP>^pDz_{n6wdraBmv9@gXb)o7;SGR}cw>NY{>l50tb8Yfv#?@i8+qOquwya|pYKy~h zID64kFQPWILE*{7W0$QWsOs)7Zdp4&G`Jh^=DS(luE;0IIHVJ|9|?zSf;@seL+(J5 zA;rixWEshZBqOzuT99T)AV?@=kc>jMK)OIaA*+xtkXA@4BbTwu_{11zbYg@vhK*ZB zE#sLH%;;szVccQ#8g&?t7{SO0jAcf#(ahMx=td+HjSz_t+lV`eVj>uEjCe+jfJjE1 z5>_DG62rnPBARdp(u+`rFa~jqPJo)xBPbHIjH;nP&@lP}#X@DEHBc^^h0Z{$&@1AX zr-G*WD#Rk*ikIRi@Lc=_NH%f{|H9iy8{X=jcpP`a;rN+1;bwk>C*f`!36H|jTnQ?L zx%{om{V~r|2Yi)#EtMM;SfH>U!ZH=0^M>Nyaso{ zuN=#rbem^+kotTG2lkp)(?Rsu$fm)>FiWC(N1TilNzzdoO1IF#ev$$Mh$uCnr?l1z zKu{PWBuIB@9i*rhCQ2IESWgRJLUMu%O(pykZDs&un~nZ~$N~Wb2@Odg_CSV-;a+?j z{fS~|T4Pc6<$f|Z|D`2LLVzeyS~3CzNZC)sX$go@loAmjK%#&|4RK!r4 zeN*qUBXC+eb-&SD_gR)>iR-Y$G463pbz{HT-Vby?@cgDXj=OZT!w`3C_FdncZ@1mf z{YGii2kZ@Z+wCB@aalSJSAGM4`MJFDmyYX@ho5mcrlmhn>U2#@4`<8>OYWW1r_ukV z^YAdsc%Cr>SC+T;k~WuRS?<1c|8Mv5of!bQ+YA5zJ@7N*aks`bKi_bGGv5GB19=fBIOPwYH0~cnX1sV zw1kq(%^s+@|7>S>i2QdQ9)R8`+Ws+y~+JO~9&Lo;(DS)#-h3m7k` z+PHu*0*L}#k%a>|?hZglNl5APL?~rQjvQ_P0i^*#u%LnksHi1JiY!49SvsP^5hcDS zc)cfnLA0q+a)MLY3=YUBK>&4g06v{6O@2bb|Hlr0u(v2gb5NOz8^27=z`02u z7BpcK5LVbQQKp0FhL)x!CnqH%L!z9Pkg%Yn#L2g|fD7gn;X_IaK}0P`AOj#JxRp2^ z^tuq~d5|UyHaHUeRv@#)1f_(;=UZ@*Bjj{pfx-wUVBw$))B$bilC2y57&0tO^_fW`@GX@w+8mWn7X zY4X*9AUH1(oe2C-FD7WzM3K7Ui7HzhVG*W+BFYGf z4cySa1hi97MeUWo7mWCH_~m|}p9=k|a<|Hz2W*B}`aQQetbNl%kd}VIs>JTu@YG0TCD7zyJdx3~pG! z7u+B!x^Y3#1r`uxU}V9K8%0D6r8GnUQAaysNuq`**>E}%)pUf3 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 G2Zr`{AE#ntiAE6AZw#89Rz2 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

Rg}awjWhK zs6zyF%Z(byjX%~$UA~l``~51EwSAsv2)iotRfWp2pXxEGZ&ZdwX0@CC^t|K@cLCq@ zwIYIxSUd5q#24>4L*9+eKYq9N8SNmur=G39-@Zu7S@1+eUu6twQihlOZ zF}IcC4`r(`mK7@EwuuOSFtDG=s8tUA7qY%0{SFVcxhM$)|Fn}XQN~p8=f^^_O>uBO zunx&h+6?N53V8Cf216r@hj~@uO)?pw{5#ISHOVyIqCbTw+0h?&s+(TZYaj(+6nnS& zH00h`s;7Bg-g}w$5kxq2}zauN-n2OS= zd%+aEs+hhcgIw1O&r4^MRcte?nmO}WaIE2FSvQ*52-H61@Q&>JpZB}$h31LUPP1x+ zvd+{}A$Av8m>I{KV(@xdjr(gze(WTw0nrxA<8^Z4c?Nbb>%(5|AajeKQp|35>i4Y1 z-Hxsj!O@PlqsoUBrs(g31BUBByR>0tgw=VYH`#-!AYmu=RS zy9rV2Ab#Y|^4|(;ke9jR9?WjNVwkv-yEGhM+!cV?1RlIwp!swEQZCc&T>eL?xKLl% zm!)`q_rP>^<)Up|REuny{aW@kfr~jddtXJ@CKeSp!ZPVcp5RnmB)WFV$=G>6cM zyRs1BtDf-Eq8S)&uj7v4xP=T6N9{**P*D@G0U+5?vFPGQ>2R>}y;izA39!y|{&L7{ zr;&09o-VS+0a|NhHDIA_S8kRS&IeL80Zd&vaco)ZM?aSKSBXKrD7ez(>7KrS^|y)n zC&qNaE+npKhH6-f0Xc;&HLOQ@Tj&MlZ>0JYEE1RP(SCxZ$go1qq$+L+K*dS6ek5lM zhyouSrr2B`260s2_^=A%q^?aTvS~~)_GwtsEodNGl4neq(Ne?~R&sKqj{-kW3T0i# z+lBbK^_Ng2&~7*JlYA^$cj!7KHLw<(`^rY;Sl=+IP&r|kZt$?TM>~&WFA$b1S{s0qujN z*j`B|Vt(rFHC~#4gRtQEKl7+uhb|)SQNY{U(@9;au8{z6ORCWf6lqv{Effk7f*2*( zBt+ps&h!(Z+@$($Qt1OB;4R5Lq-X`tJU+lzd5mQ-4z_Ct8 zElVJ)E-hzdN|HlXSU5O!i#vqgquY)flY^F%e*#J%I%tnrF$E(mXJ|_bv>@h?3XQM2 zrY3e{qgt#PkugF0F`SkUiB2090`{LXRs2Q&1@6egF{nOqRkX5;AG3j$;NTMa@6WUV z6hB^Nd1ab!Lf=GsU894CQDe6|?Ks_x>G##B9hY57x07}3NE=(X$;yPQik^$SdV?YQXbc6ni=9zGK z3cN%E2E{Q=j(+2Nta8irN!U_beRGTc46;3^mf9{8W~`;&T)QOUiXnJiZ3(%X6iK9% zDajH8(gLdjL{^G8(fO&osuwFnF~(K^*&0NR&~JTO}FV5-TIy!Qx`p=b3%9f%$=bfUo8$B!@>a4>mv z2d+>E5+(K5V}cxAN3L%f!A3{4Z-gGRRKW>6Ss|{_AbJDSY6t+vffWRhlJUkZpU_A) zTt#y*-XvgEihiKluB*^{rA36R9=NnZ9iX>ab%9O^8YvtXJ}(M6;P7MR!g8Cy^A1U8 zFre*6ACZon_vh@X?T6a@p@@igfZqTMAB0SGKJ&s|KC(2y-Z*x*TR1Faw~g9@+bwc~ z5gHnKHAOsv-6&|;TCGBi=9*u3hO#|+ge4i9EP7oL43ESDm#+;rUH65MoSdi=b}U7K z>#EQrLZ+QSu>f(cI}_DFo|Cs9G+@&X!LWgmm{HWzGgfwJ2ZRPBH0$sIN7!N75g{E@ z>2=Btd$>ioWy7t>Lk1@6p)|`bNmX_)E2SRtumjU0M~8_Sk}w^1;A8<4szg>|2K2B2 zwX!Y$(c*-dP@oe_iqjr&XA6DUri4hag-e(1@`i zH#mYJ*&H@Ujtn=jaw5a(6h~DX5)x`oG7Onb>V$M`qOg&{FvO8-;p}j5(!c^jhB1iz zlu&pA0U}61h6w!m6rpHNVE23sLsX62*q+Ru1bGbKDLj}^NZ<-Q$>H)PIrXXVBLUO} zBDheNAemNFP^duyGu$CK5CAXK7;D?$$aV5sd!f|A#}EqLnERuTiqnIDEl((1ZU|H> zV5MDIYGQ(12%=y>w9_*~YU#)2iN1~KN}_=aq{o#}qJh$15DqCvy28P3k0D$oWpo$7 z71D9(IHY+Z<-~^faIFxH&&CaAz{Z7Li4|gs?3kmm7h}TIXfO=PcoD%1AsZ3A7_vbl zsDc-K?69%p1QjNBv=B`&6TIXLJs3~u zt#0jBJ%=u(ll7}!)w4QQ57NE#BQoBzy+~K)uCcAe*`m`3t`M# zFc8YXff@2r1v3{59*{BnQBccWFyx;cbP$6D1QT?@2wW&IW2vEYpuDt!(`M?nST3H6 z;o>^KguV2ef~X{)`}~B7zSDI&l(1vFcM>%na&qhrHNDs5iae ztMlq(KZ3$9ktx&C141w^sDQ2_1y2eue3C$Y06?*(FTt;|FR!oW*NQI#zH+>>URJ!~ zw4ijg&;>#l5B3nd#b&Wh>y#XvtJSsI3Ap084xn|YrKbf&D{U%EgR)4ebfL5$1PhcXQjo|g za)DFdq$o<^VucD7N+muzlIRdAb%<`%P&gxCUt<=_sWp`t>wK|b&q zQVG-oJ`n0kd0;HF8@(1Vwk|~u{Je!I_y7hiH>LXGUQ zFEE9)?qN~tG0|f<`8MJYnYBUA!-a`YE~LM)7E~KSp9P5vFkom|g^+&!t#B#^DpoBa zAU!{JrEf3#gj|CW5p*D_sNy0f>D>2irb<=uPi2Og~*S&y(#=4akVIS@f3z-7LSGJ<;= zB{e~pMr44^Axyek3?ICSFttI`k0lC(nRVV^KFXvI5R)mERK`j)d`$TRc4L*?YSuf+ zUB)!(^0?hS~dnIaLzO78&wol>(m00 zKb?2%J(t^FG%ss1#hgZ(+rEt+<@q1Hd_r|*v-dAZsp`K%DwS~(PQnTJ9Fszn-beYl z^fu$m6l5YOhgJ~obbk-Iw9>70G~bub?N(kS$C7WSUoUEezcKTiN|q0J1;_EF=<;u; zOCKzcTOK+0zF!k8>GMVLU(KB){Vvj`7hDS8e(m2z|Bc1D`4#g^eb=GsS*-2qx_Yjr ztH)}wI;^fz7paNV*Se|B>!n($&Z@EMtJ;b-tkr6!no8@@c=R4^h32F4Xf1RWdJEl0 ze|kxe(PDHMU4)L#hqEEwL_cZf+@*8+rg8d8J8LI;N-NP!bd%UtBTQib4oP0#r~69&-50}gr>hd+H~e?s?pOJT zpWC$ic)xD$TlsR|?ti+^9Q$h@4(j^EWgdAtYjQav{J2zFPrhS6%Ga{7{jqnWBmJY#^r3NO zU&#mZsr)HWZy(8THU*nt&9A0cv+FNROEQ_i)WQXh8{)Ybp5r)<;gA6P4Uw28%bh9ha#Dun?tPErq>tt9<7|@~%ukbQsdwIO z_P+i60KI90ERKF==EqA9V|;HrC94u0jo4VEr8IFy7LOj@v=^;N_btTvXxtWWwiJoA z@#tfSJ%;!2t{6HRX&Q8T?_E7a^--^UhlNO_;$!BUCrPi<6)o} zCDD->OTCZxL~oqz;U~^48t%L26AXzNgvoW+F|lqbM}(jGai-QC2Skra#Mxw8wbLml z5G3n;Yl}yYxJ>Q>h#RQHZL%#50000D^aq1?5D*ZFWl50aNDd;1$q)3R1`3@-#ljIn zNDK)@!6*ztSO9_m2w@lyKp2c+BnKH~wgUpjkWTQ02*6#stJ*_XPb7A$lyxRQ{U6hp zM7aYmj%ehAZ&$PW_C@0yI6k!$fDY}abq=VcRFTPgO@9)xybl3A)v@wO%9W8dfxFCc zi$B2$?PgJ|B5;h1Mm)%Nf{kXa;);d@R4Ald%y~y8#qMs8uo!;Wt%30JOY(}9(hBkJ9l zm}aZlirKOAwe}t{T7=u7PW-RZ3b`-qReIhAKVHXbpl#u97RcsMrTFs1u*hHeD$U!z zJ_V&1Iv?WiyHkcdGkeQ=ei9dV#~^Aj7kmX8)#xd4xe1M5=ocq0ivP9wM_j=CoKn7R zq_?&{eP8bTMt{FQ&LufWdw-chbGl@dPi1~0PA9{;bCg^uoIH+v!V_xSJdndGuL3YK zg<%zUE3308aKei2rDqKI&BmV6@lGft9->{#PC^05p&e+CX>+~62T(5`;!l)&^J}Go zhtsoLu$r^T)<-4!tyfWmBQ>-NOo*-N8bLjKz%k)B3cgQ`1nvkGJza|3%ImN*!@mFuMO2!J&$6SBsym%-Si z?O0HIy1fTdodtB&-FS^^&g~uv4@#A{IkSbRXgg9JxT@yfu0}K znZ$P9{`5Q3$N1$_Wmbb&szsG2)Q>|+4YwUqEdkfc{IX0FjVZ@N<5xg*|Mlj{noh}^ zSh2`F9^gCDC~nQWu!_V${vTt;lU?QJ$JF?6FG5I!VPYGr=W!`g&Wy@wI2G(56N9(Z z9=jS?8wn{Zl0-p?HRYbsfSqB;v$2H0LkvCii>@>o=NpCTRZNU=TzW+`rhhn{q2vw% z39N$gmAIWSrFS5xz{V4pL8A)AgELMNadIxA(du-|Ut%i-gzULs7vRK0qJF0j*N+zn zDMlxO2c`c-JGj0V%QAJc>@IIw9+JpD{mi4r8t&VXywfRP4lhBC1i}nSnU}5<4vtWp zqlu7)x_u`k1nx|6rj9(B*Ho)Yy;4QlRaHZcR9dHz>kZRs6J~#(ffr19t4*q%-JXE* znuWQ7zRL-%6SND4s|VNZnIl))z0B-+K>kvP>vAsLHcL3gKdOb1>0-F`4N!RSR|hIF zCQbjF!;~wU3hn^JtEZsrI3>IEx1kHS+{@>El)#P1`IMm~Ke}pNz*D4Xh z<;rmx?X{9x^;)5>Ko5`sUK|NGl>0fk-^`jy9d1F_I2HF})m z<*D0d@}ZghGF41v^Pnc6>O`{#e?HhuaxmX^%qo5xDH_Ww#}|xb3Wnt%kEUh%MMIcr z)mt#Fc8c3|cTV8Ls!@Nz)h7fX2?eA~v4wmZ@m{4fSugOl7Bd#+qk8J%bL9+| z(v0_=cVm1-0x`|l;srg)3uD)kW)p+`1&__~l&JMJ5GJ8+-&+aJcD)I?R_Oj@!MlI_b1SmfqwXHyFuZ3q9)OFeV~s$1wR3ak_7yDC$2m0fD6%Yc>4mX2pd^no&Oyn!{h1 zTbjj^LSQBj)y0}g8nmFT*hA3VW2P1t+!15V2saB^R>HJh`&5l2wKdm!-PY8e*hOdr zY+-Mna3XTT8Z)B%qbX#?Q_O^$AyR@gxND<>!SpNpq*wGo7$>e+xZqW+R_Liye;kWX zp^ca*lT+_{J2&fF0G>E3Q6g*sE8Ymh#Z3t7m^faitP)n1%lVn*Mfb{Eu}E2%frEO> z^qVU2_wdsIR@rAooH~JR&auIeCol>j%!^3$@0ZkU!?get-2^9im8Z;@yos=O|ctSg8mr-0Fw5ADHfO-Dcx19sSGNa

jXG)zXHglhnkItSaihV9f@YAL5=5 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

?xzKt{{+^y~ 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%0A5*QHBemo9yMeO>zc`nvRW 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 z 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 VATh&mCRl*L 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 ^&<1-1oBQven%B+|8W2+^3v{;@#{v z;BZRLU0-;AcHQ7gTVdP4NjBI{cGX0GL}_5*Zg$gf|4!Q^6uA8!V057WDLcRX zJnv`0TyY#Ie6YW0IC|(J`|A8OI|X!kmQf6<$+UqK^C<$Ql<#KmW|xA>Ky{#cP%Eez zGy-aD0X2Po{8L*%U7&5yPtYc)7qkw7YyouTR8>@GZj_c*boK;{^p}@+J?&=KWR`(S zK~1CmS5;&G{OCY&MR{;jUSnQJ@CIlYbhb4N+DR_I0tMZEcJmQ*ehs<@)q)y8H=Eh( z*=yN>P~!fLUi7NL@ol(HFfVBR3G%4lRUs_!mFDZabXxk2(ys7PrS715Xc`tQiT z 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

ME)k$p=c>RIqPr;L~-`WfA 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 delta 27998 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 delta 872 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 diff --git a/chain/actors/builtin/system/actor.go.template b/chain/actors/builtin/system/actor.go.template index 12ba9935c..0ef41e775 100644 --- a/chain/actors/builtin/system/actor.go.template +++ b/chain/actors/builtin/system/actor.go.template @@ -62,4 +62,5 @@ func MakeState(store adt.Store, av actorstypes.Version, builtinActors cid.Cid) ( type State interface { GetState() interface{} GetBuiltinActors() cid.Cid + SetBuiltinActors(cid.Cid) error } diff --git a/chain/actors/builtin/system/state.go.template b/chain/actors/builtin/system/state.go.template index 21b057ad5..f8d9addf7 100644 --- a/chain/actors/builtin/system/state.go.template +++ b/chain/actors/builtin/system/state.go.template @@ -7,6 +7,7 @@ import ( {{if (le .v 7)}} system{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin/system" + "golang.org/x/xerrors" {{else}} system{{.v}} "github.com/filecoin-project/go-state-types/builtin{{.import}}system" {{end}} @@ -46,4 +47,13 @@ func (s *state{{.v}}) GetBuiltinActors() cid.Cid { {{else}} return s.State.BuiltinActors {{end}} +} + +func (s *state{{.v}}) SetBuiltinActors(c cid.Cid) error { +{{if (le .v 7)}} + return xerrors.New("cannot set manifest cid before v8") +{{else}} + s.State.BuiltinActors = c + return nil +{{end}} } \ No newline at end of file diff --git a/chain/actors/builtin/system/system.go b/chain/actors/builtin/system/system.go index 5382e53d4..4c99d90eb 100644 --- a/chain/actors/builtin/system/system.go +++ b/chain/actors/builtin/system/system.go @@ -105,4 +105,5 @@ func MakeState(store adt.Store, av actorstypes.Version, builtinActors cid.Cid) ( type State interface { GetState() interface{} GetBuiltinActors() cid.Cid + SetBuiltinActors(cid.Cid) error } diff --git a/chain/actors/builtin/system/v0.go b/chain/actors/builtin/system/v0.go index efa0741ce..78e578896 100644 --- a/chain/actors/builtin/system/v0.go +++ b/chain/actors/builtin/system/v0.go @@ -2,6 +2,7 @@ package system import ( "github.com/ipfs/go-cid" + "golang.org/x/xerrors" system0 "github.com/filecoin-project/specs-actors/actors/builtin/system" @@ -39,3 +40,9 @@ func (s *state0) GetBuiltinActors() cid.Cid { return cid.Undef } + +func (s *state0) SetBuiltinActors(c cid.Cid) error { + + return xerrors.New("cannot set manifest cid before v8") + +} diff --git a/chain/actors/builtin/system/v2.go b/chain/actors/builtin/system/v2.go index e4fefd08d..21dfa5c78 100644 --- a/chain/actors/builtin/system/v2.go +++ b/chain/actors/builtin/system/v2.go @@ -2,6 +2,7 @@ package system import ( "github.com/ipfs/go-cid" + "golang.org/x/xerrors" system2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/system" @@ -39,3 +40,9 @@ func (s *state2) GetBuiltinActors() cid.Cid { return cid.Undef } + +func (s *state2) SetBuiltinActors(c cid.Cid) error { + + return xerrors.New("cannot set manifest cid before v8") + +} diff --git a/chain/actors/builtin/system/v3.go b/chain/actors/builtin/system/v3.go index d2b59c8a8..ccf8aa2c3 100644 --- a/chain/actors/builtin/system/v3.go +++ b/chain/actors/builtin/system/v3.go @@ -2,6 +2,7 @@ package system import ( "github.com/ipfs/go-cid" + "golang.org/x/xerrors" system3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/system" @@ -39,3 +40,9 @@ func (s *state3) GetBuiltinActors() cid.Cid { return cid.Undef } + +func (s *state3) SetBuiltinActors(c cid.Cid) error { + + return xerrors.New("cannot set manifest cid before v8") + +} diff --git a/chain/actors/builtin/system/v4.go b/chain/actors/builtin/system/v4.go index 9528c1779..bcb120be2 100644 --- a/chain/actors/builtin/system/v4.go +++ b/chain/actors/builtin/system/v4.go @@ -2,6 +2,7 @@ package system import ( "github.com/ipfs/go-cid" + "golang.org/x/xerrors" system4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/system" @@ -39,3 +40,9 @@ func (s *state4) GetBuiltinActors() cid.Cid { return cid.Undef } + +func (s *state4) SetBuiltinActors(c cid.Cid) error { + + return xerrors.New("cannot set manifest cid before v8") + +} diff --git a/chain/actors/builtin/system/v5.go b/chain/actors/builtin/system/v5.go index adc1d4553..182883398 100644 --- a/chain/actors/builtin/system/v5.go +++ b/chain/actors/builtin/system/v5.go @@ -2,6 +2,7 @@ package system import ( "github.com/ipfs/go-cid" + "golang.org/x/xerrors" system5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/system" @@ -39,3 +40,9 @@ func (s *state5) GetBuiltinActors() cid.Cid { return cid.Undef } + +func (s *state5) SetBuiltinActors(c cid.Cid) error { + + return xerrors.New("cannot set manifest cid before v8") + +} diff --git a/chain/actors/builtin/system/v6.go b/chain/actors/builtin/system/v6.go index 0cebadce0..9860ce373 100644 --- a/chain/actors/builtin/system/v6.go +++ b/chain/actors/builtin/system/v6.go @@ -2,6 +2,7 @@ package system import ( "github.com/ipfs/go-cid" + "golang.org/x/xerrors" system6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/system" @@ -39,3 +40,9 @@ func (s *state6) GetBuiltinActors() cid.Cid { return cid.Undef } + +func (s *state6) SetBuiltinActors(c cid.Cid) error { + + return xerrors.New("cannot set manifest cid before v8") + +} diff --git a/chain/actors/builtin/system/v7.go b/chain/actors/builtin/system/v7.go index 0009773da..5984b0b4d 100644 --- a/chain/actors/builtin/system/v7.go +++ b/chain/actors/builtin/system/v7.go @@ -2,6 +2,7 @@ package system import ( "github.com/ipfs/go-cid" + "golang.org/x/xerrors" system7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/system" @@ -39,3 +40,9 @@ func (s *state7) GetBuiltinActors() cid.Cid { return cid.Undef } + +func (s *state7) SetBuiltinActors(c cid.Cid) error { + + return xerrors.New("cannot set manifest cid before v8") + +} diff --git a/chain/actors/builtin/system/v8.go b/chain/actors/builtin/system/v8.go index 48f150fb9..574df9c44 100644 --- a/chain/actors/builtin/system/v8.go +++ b/chain/actors/builtin/system/v8.go @@ -41,3 +41,10 @@ func (s *state8) GetBuiltinActors() cid.Cid { return s.State.BuiltinActors } + +func (s *state8) SetBuiltinActors(c cid.Cid) error { + + s.State.BuiltinActors = c + return nil + +} diff --git a/chain/actors/builtin/system/v9.go b/chain/actors/builtin/system/v9.go index 049d6baf6..40555a921 100644 --- a/chain/actors/builtin/system/v9.go +++ b/chain/actors/builtin/system/v9.go @@ -41,3 +41,10 @@ func (s *state9) GetBuiltinActors() cid.Cid { return s.State.BuiltinActors } + +func (s *state9) SetBuiltinActors(c cid.Cid) error { + + s.State.BuiltinActors = c + return nil + +} diff --git a/chain/gen/genesis/f00_system.go b/chain/gen/genesis/f00_system.go index 209b6db7d..93849bcc9 100644 --- a/chain/gen/genesis/f00_system.go +++ b/chain/gen/genesis/f00_system.go @@ -9,7 +9,6 @@ import ( actorstypes "github.com/filecoin-project/go-state-types/actors" "github.com/filecoin-project/go-state-types/big" - systemtypes "github.com/filecoin-project/go-state-types/builtin/v8/system" "github.com/filecoin-project/go-state-types/manifest" bstore "github.com/filecoin-project/lotus/blockstore" @@ -39,8 +38,9 @@ func SetupSystemActor(ctx context.Context, bs bstore.Blockstore, av actorstypes. return nil, xerrors.Errorf("loading manifest for actors version %d: %w", av, err) } - st8 := st.GetState().(*systemtypes.State) - st8.BuiltinActors = mf.Data + if err := st.SetBuiltinActors(mf.Data); err != nil { + return nil, xerrors.Errorf("failed to set manifest data: %w", err) + } } statecid, err := cst.Put(ctx, st.GetState()) diff --git a/chain/vm/fvm.go b/chain/vm/fvm.go index b87830a3c..a87aa0a51 100644 --- a/chain/vm/fvm.go +++ b/chain/vm/fvm.go @@ -312,7 +312,7 @@ func NewFVM(ctx context.Context, opts *VMOpts) (*FVM, error) { fvm, err := ffi.CreateFVM(fvmOpts) if err != nil { - return nil, err + return nil, xerrors.Errorf("failed to create FVM: %w", err) } return &FVM{ diff --git a/cmd/lotus-sim/simulation/stages/precommit_stage.go b/cmd/lotus-sim/simulation/stages/precommit_stage.go index e5f455f74..8f82d8988 100644 --- a/cmd/lotus-sim/simulation/stages/precommit_stage.go +++ b/cmd/lotus-sim/simulation/stages/precommit_stage.go @@ -177,9 +177,9 @@ func (stage *PreCommitStage) packMiner( } expiration := epoch + policy.GetMaxSectorExpirationExtension() - infos := make([]minertypes.SectorPreCommitInfo, len(sectorNos)) + infos := make([]minertypes.PreCommitSectorParams, len(sectorNos)) for i, sno := range sectorNos { - infos[i] = minertypes.SectorPreCommitInfo{ + infos[i] = minertypes.PreCommitSectorParams{ SealProof: sealType, SectorNumber: sno, SealedCID: mock.MockCommR(minerAddr, sno), @@ -228,7 +228,7 @@ func (stage *PreCommitStage) packMiner( } for _, info := range batch { - if err := stage.committer.EnqueueProveCommit(minerAddr, epoch, info); err != nil { + if err := stage.committer.EnqueueProveCommit(minerAddr, epoch, toSectorPreCommitInfo(info)); err != nil { return added, false, err } added++ @@ -253,7 +253,7 @@ func (stage *PreCommitStage) packMiner( return added, false, err } - if err := stage.committer.EnqueueProveCommit(minerAddr, epoch, info); err != nil { + if err := stage.committer.EnqueueProveCommit(minerAddr, epoch, toSectorPreCommitInfo(info)); err != nil { return added, false, err } added++ @@ -346,3 +346,15 @@ func (stage *PreCommitStage) load(ctx context.Context, bb *blockbuilder.BlockBui stage.initialized = true return nil } + +func toSectorPreCommitInfo(param minertypes.PreCommitSectorParams) minertypes.SectorPreCommitInfo { + return minertypes.SectorPreCommitInfo{ + SealProof: param.SealProof, + SectorNumber: param.SectorNumber, + SealedCID: param.SealedCID, + SealRandEpoch: param.SealRandEpoch, + DealIDs: param.DealIDs, + Expiration: param.Expiration, + UnsealedCid: nil, + } +} diff --git a/documentation/en/api-v0-methods-miner.md b/documentation/en/api-v0-methods-miner.md index e5147340d..9873d16ef 100644 --- a/documentation/en/api-v0-methods-miner.md +++ b/documentation/en/api-v0-methods-miner.md @@ -442,7 +442,7 @@ Inputs: ], "Bw==", 10101, - 16 + 17 ] ``` diff --git a/documentation/en/api-v0-methods.md b/documentation/en/api-v0-methods.md index 75459001a..bd77fd482 100644 --- a/documentation/en/api-v0-methods.md +++ b/documentation/en/api-v0-methods.md @@ -4653,7 +4653,7 @@ Perms: read Inputs: ```json [ - 16 + 17 ] ``` @@ -4668,7 +4668,7 @@ Perms: read Inputs: ```json [ - 16 + 17 ] ``` @@ -5836,10 +5836,7 @@ Inputs: 5432 ], "Expiration": 10101, - "ReplaceCapacity": true, - "ReplaceSectorDeadline": 42, - "ReplaceSectorPartition": 42, - "ReplaceSectorNumber": 9 + "UnsealedCid": null }, [ { @@ -5961,10 +5958,7 @@ Inputs: 5432 ], "Expiration": 10101, - "ReplaceCapacity": true, - "ReplaceSectorDeadline": 42, - "ReplaceSectorPartition": 42, - "ReplaceSectorNumber": 9 + "UnsealedCid": null }, [ { @@ -6182,7 +6176,7 @@ Inputs: ] ``` -Response: `16` +Response: `17` ### StateReadState StateReadState returns the indicated actor's state. @@ -6640,15 +6634,10 @@ Response: 5432 ], "Expiration": 10101, - "ReplaceCapacity": true, - "ReplaceSectorDeadline": 42, - "ReplaceSectorPartition": 42, - "ReplaceSectorNumber": 9 + "UnsealedCid": null }, "PreCommitDeposit": "0", - "PreCommitEpoch": 10101, - "DealWeight": "0", - "VerifiedDealWeight": "0" + "PreCommitEpoch": 10101 } ``` diff --git a/documentation/en/api-v1-unstable-methods.md b/documentation/en/api-v1-unstable-methods.md index 4e9fe266c..8a92f197e 100644 --- a/documentation/en/api-v1-unstable-methods.md +++ b/documentation/en/api-v1-unstable-methods.md @@ -5085,7 +5085,7 @@ Perms: read Inputs: ```json [ - 16 + 17 ] ``` @@ -5100,7 +5100,7 @@ Perms: read Inputs: ```json [ - 16 + 17 ] ``` @@ -6353,10 +6353,7 @@ Inputs: 5432 ], "Expiration": 10101, - "ReplaceCapacity": true, - "ReplaceSectorDeadline": 42, - "ReplaceSectorPartition": 42, - "ReplaceSectorNumber": 9 + "UnsealedCid": null }, [ { @@ -6478,10 +6475,7 @@ Inputs: 5432 ], "Expiration": 10101, - "ReplaceCapacity": true, - "ReplaceSectorDeadline": 42, - "ReplaceSectorPartition": 42, - "ReplaceSectorNumber": 9 + "UnsealedCid": null }, [ { @@ -6699,7 +6693,7 @@ Inputs: ] ``` -Response: `16` +Response: `17` ### StateReadState StateReadState returns the indicated actor's state. @@ -7119,15 +7113,10 @@ Response: 5432 ], "Expiration": 10101, - "ReplaceCapacity": true, - "ReplaceSectorDeadline": 42, - "ReplaceSectorPartition": 42, - "ReplaceSectorNumber": 9 + "UnsealedCid": null }, "PreCommitDeposit": "0", - "PreCommitEpoch": 10101, - "DealWeight": "0", - "VerifiedDealWeight": "0" + "PreCommitEpoch": 10101 } ``` diff --git a/lotuspond/front/src/chain/methods.json b/lotuspond/front/src/chain/methods.json index 938105528..f8fc1338d 100644 --- a/lotuspond/front/src/chain/methods.json +++ b/lotuspond/front/src/chain/methods.json @@ -1,842 +1,745 @@ { "fil/1/account": [ - "Send", - "Constructor", - "PubkeyAddress" + "0", + "1", + "2" ], "fil/1/cron": [ - "Send", - "Constructor", - "EpochTick" + "0", + "1", + "2" ], "fil/1/init": [ - "Send", - "Constructor", - "Exec" + "0", + "1", + "2" ], "fil/1/multisig": [ - "Send", - "Constructor", - "Propose", - "Approve", - "Cancel", - "AddSigner", - "RemoveSigner", - "SwapSigner", - "ChangeNumApprovalsThreshold", - "LockBalance" + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9" ], "fil/1/paymentchannel": [ - "Send", - "Constructor", - "UpdateChannelState", - "Settle", - "Collect" + "0", + "1", + "2", + "3", + "4" ], "fil/1/reward": [ - "Send", - "Constructor", - "AwardBlockReward", - "ThisEpochReward", - "UpdateNetworkKPI" + "0", + "1", + "2", + "3", + "4" ], "fil/1/storagemarket": [ - "Send", - "Constructor", - "AddBalance", - "WithdrawBalance", - "PublishStorageDeals", - "VerifyDealsForActivation", - "ActivateDeals", - "OnMinerSectorsTerminate", - "ComputeDataCommitment", - "CronTick" + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9" ], "fil/1/storageminer": [ - "Send", - "Constructor", - "ControlAddresses", - "ChangeWorkerAddress", - "ChangePeerID", - "SubmitWindowedPoSt", - "PreCommitSector", - "ProveCommitSector", - "ExtendSectorExpiration", - "TerminateSectors", - "DeclareFaults", - "DeclareFaultsRecovered", - "OnDeferredCronEvent", - "CheckSectorProven", - "AddLockedFund", - "ReportConsensusFault", - "WithdrawBalance", - "ConfirmSectorProofsValid", - "ChangeMultiaddrs", - "CompactPartitions", - "CompactSectorNumbers" + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15", + "16", + "17", + "18", + "19", + "20" ], "fil/1/storagepower": [ - "Send", - "Constructor", - "CreateMiner", - "UpdateClaimedPower", - "EnrollCronEvent", - "OnEpochTickEnd", - "UpdatePledgeTotal", - "OnConsensusFault", - "SubmitPoRepForBulkVerify", - "CurrentTotalPower" + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9" ], "fil/1/system": [ - "Send", - "Constructor" + "0", + "1" ], "fil/1/verifiedregistry": [ - "Send", - "Constructor", - "AddVerifier", - "RemoveVerifier", - "AddVerifiedClient", - "UseBytes", - "RestoreBytes" + "0", + "1", + "2", + "3", + "4", + "5", + "6" ], "fil/2/account": [ - "Send", - "Constructor", - "PubkeyAddress" + "0", + "1", + "2" ], "fil/2/cron": [ - "Send", - "Constructor", - "EpochTick" + "0", + "1", + "2" ], "fil/2/init": [ - "Send", - "Constructor", - "Exec" + "0", + "1", + "2" ], "fil/2/multisig": [ - "Send", - "Constructor", - "Propose", - "Approve", - "Cancel", - "AddSigner", - "RemoveSigner", - "SwapSigner", - "ChangeNumApprovalsThreshold", - "LockBalance" + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9" ], "fil/2/paymentchannel": [ - "Send", - "Constructor", - "UpdateChannelState", - "Settle", - "Collect" + "0", + "1", + "2", + "3", + "4" ], "fil/2/reward": [ - "Send", - "Constructor", - "AwardBlockReward", - "ThisEpochReward", - "UpdateNetworkKPI" + "0", + "1", + "2", + "3", + "4" ], "fil/2/storagemarket": [ - "Send", - "Constructor", - "AddBalance", - "WithdrawBalance", - "PublishStorageDeals", - "VerifyDealsForActivation", - "ActivateDeals", - "OnMinerSectorsTerminate", - "ComputeDataCommitment", - "CronTick" + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9" ], "fil/2/storageminer": [ - "Send", - "Constructor", - "ControlAddresses", - "ChangeWorkerAddress", - "ChangePeerID", - "SubmitWindowedPoSt", - "PreCommitSector", - "ProveCommitSector", - "ExtendSectorExpiration", - "TerminateSectors", - "DeclareFaults", - "DeclareFaultsRecovered", - "OnDeferredCronEvent", - "CheckSectorProven", - "ApplyRewards", - "ReportConsensusFault", - "WithdrawBalance", - "ConfirmSectorProofsValid", - "ChangeMultiaddrs", - "CompactPartitions", - "CompactSectorNumbers", - "ConfirmUpdateWorkerKey", - "RepayDebt", - "ChangeOwnerAddress" + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15", + "16", + "17", + "18", + "19", + "20", + "21", + "22", + "23" ], "fil/2/storagepower": [ - "Send", - "Constructor", - "CreateMiner", - "UpdateClaimedPower", - "EnrollCronEvent", - "OnEpochTickEnd", - "UpdatePledgeTotal", - "SubmitPoRepForBulkVerify", - "CurrentTotalPower" + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "8", + "9" ], "fil/2/system": [ - "Send", - "Constructor" + "0", + "1" ], "fil/2/verifiedregistry": [ - "Send", - "Constructor", - "AddVerifier", - "RemoveVerifier", - "AddVerifiedClient", - "UseBytes", - "RestoreBytes" + "0", + "1", + "2", + "3", + "4", + "5", + "6" ], "fil/3/account": [ - "Send", - "Constructor", - "PubkeyAddress" + "0", + "1", + "2" ], "fil/3/cron": [ - "Send", - "Constructor", - "EpochTick" + "0", + "1", + "2" ], "fil/3/init": [ - "Send", - "Constructor", - "Exec" + "0", + "1", + "2" ], "fil/3/multisig": [ - "Send", - "Constructor", - "Propose", - "Approve", - "Cancel", - "AddSigner", - "RemoveSigner", - "SwapSigner", - "ChangeNumApprovalsThreshold", - "LockBalance" + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9" ], "fil/3/paymentchannel": [ - "Send", - "Constructor", - "UpdateChannelState", - "Settle", - "Collect" + "0", + "1", + "2", + "3", + "4" ], "fil/3/reward": [ - "Send", - "Constructor", - "AwardBlockReward", - "ThisEpochReward", - "UpdateNetworkKPI" + "0", + "1", + "2", + "3", + "4" ], "fil/3/storagemarket": [ - "Send", - "Constructor", - "AddBalance", - "WithdrawBalance", - "PublishStorageDeals", - "VerifyDealsForActivation", - "ActivateDeals", - "OnMinerSectorsTerminate", - "ComputeDataCommitment", - "CronTick" + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9" ], "fil/3/storageminer": [ - "Send", - "Constructor", - "ControlAddresses", - "ChangeWorkerAddress", - "ChangePeerID", - "SubmitWindowedPoSt", - "PreCommitSector", - "ProveCommitSector", - "ExtendSectorExpiration", - "TerminateSectors", - "DeclareFaults", - "DeclareFaultsRecovered", - "OnDeferredCronEvent", - "CheckSectorProven", - "ApplyRewards", - "ReportConsensusFault", - "WithdrawBalance", - "ConfirmSectorProofsValid", - "ChangeMultiaddrs", - "CompactPartitions", - "CompactSectorNumbers", - "ConfirmUpdateWorkerKey", - "RepayDebt", - "ChangeOwnerAddress", - "DisputeWindowedPoSt" + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15", + "16", + "17", + "18", + "19", + "20", + "21", + "22", + "23", + "24" ], "fil/3/storagepower": [ - "Send", - "Constructor", - "CreateMiner", - "UpdateClaimedPower", - "EnrollCronEvent", - "OnEpochTickEnd", - "UpdatePledgeTotal", - "SubmitPoRepForBulkVerify", - "CurrentTotalPower" + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "8", + "9" ], "fil/3/system": [ - "Send", - "Constructor" + "0", + "1" ], "fil/3/verifiedregistry": [ - "Send", - "Constructor", - "AddVerifier", - "RemoveVerifier", - "AddVerifiedClient", - "UseBytes", - "RestoreBytes" + "0", + "1", + "2", + "3", + "4", + "5", + "6" ], "fil/4/account": [ - "Send", - "Constructor", - "PubkeyAddress" + "0", + "1", + "2" ], "fil/4/cron": [ - "Send", - "Constructor", - "EpochTick" + "0", + "1", + "2" ], "fil/4/init": [ - "Send", - "Constructor", - "Exec" + "0", + "1", + "2" ], "fil/4/multisig": [ - "Send", - "Constructor", - "Propose", - "Approve", - "Cancel", - "AddSigner", - "RemoveSigner", - "SwapSigner", - "ChangeNumApprovalsThreshold", - "LockBalance" + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9" ], "fil/4/paymentchannel": [ - "Send", - "Constructor", - "UpdateChannelState", - "Settle", - "Collect" + "0", + "1", + "2", + "3", + "4" ], "fil/4/reward": [ - "Send", - "Constructor", - "AwardBlockReward", - "ThisEpochReward", - "UpdateNetworkKPI" + "0", + "1", + "2", + "3", + "4" ], "fil/4/storagemarket": [ - "Send", - "Constructor", - "AddBalance", - "WithdrawBalance", - "PublishStorageDeals", - "VerifyDealsForActivation", - "ActivateDeals", - "OnMinerSectorsTerminate", - "ComputeDataCommitment", - "CronTick" + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9" ], "fil/4/storageminer": [ - "Send", - "Constructor", - "ControlAddresses", - "ChangeWorkerAddress", - "ChangePeerID", - "SubmitWindowedPoSt", - "PreCommitSector", - "ProveCommitSector", - "ExtendSectorExpiration", - "TerminateSectors", - "DeclareFaults", - "DeclareFaultsRecovered", - "OnDeferredCronEvent", - "CheckSectorProven", - "ApplyRewards", - "ReportConsensusFault", - "WithdrawBalance", - "ConfirmSectorProofsValid", - "ChangeMultiaddrs", - "CompactPartitions", - "CompactSectorNumbers", - "ConfirmUpdateWorkerKey", - "RepayDebt", - "ChangeOwnerAddress", - "DisputeWindowedPoSt" + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15", + "16", + "17", + "18", + "19", + "20", + "21", + "22", + "23", + "24" ], "fil/4/storagepower": [ - "Send", - "Constructor", - "CreateMiner", - "UpdateClaimedPower", - "EnrollCronEvent", - "OnEpochTickEnd", - "UpdatePledgeTotal", - "SubmitPoRepForBulkVerify", - "CurrentTotalPower" + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "8", + "9" ], "fil/4/system": [ - "Send", - "Constructor" + "0", + "1" ], "fil/4/verifiedregistry": [ - "Send", - "Constructor", - "AddVerifier", - "RemoveVerifier", - "AddVerifiedClient", - "UseBytes", - "RestoreBytes" + "0", + "1", + "2", + "3", + "4", + "5", + "6" ], "fil/5/account": [ - "Send", - "Constructor", - "PubkeyAddress" + "0", + "1", + "2" ], "fil/5/cron": [ - "Send", - "Constructor", - "EpochTick" + "0", + "1", + "2" ], "fil/5/init": [ - "Send", - "Constructor", - "Exec" + "0", + "1", + "2" ], "fil/5/multisig": [ - "Send", - "Constructor", - "Propose", - "Approve", - "Cancel", - "AddSigner", - "RemoveSigner", - "SwapSigner", - "ChangeNumApprovalsThreshold", - "LockBalance" + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9" ], "fil/5/paymentchannel": [ - "Send", - "Constructor", - "UpdateChannelState", - "Settle", - "Collect" + "0", + "1", + "2", + "3", + "4" ], "fil/5/reward": [ - "Send", - "Constructor", - "AwardBlockReward", - "ThisEpochReward", - "UpdateNetworkKPI" + "0", + "1", + "2", + "3", + "4" ], "fil/5/storagemarket": [ - "Send", - "Constructor", - "AddBalance", - "WithdrawBalance", - "PublishStorageDeals", - "VerifyDealsForActivation", - "ActivateDeals", - "OnMinerSectorsTerminate", - "ComputeDataCommitment", - "CronTick" + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9" ], "fil/5/storageminer": [ - "Send", - "Constructor", - "ControlAddresses", - "ChangeWorkerAddress", - "ChangePeerID", - "SubmitWindowedPoSt", - "PreCommitSector", - "ProveCommitSector", - "ExtendSectorExpiration", - "TerminateSectors", - "DeclareFaults", - "DeclareFaultsRecovered", - "OnDeferredCronEvent", - "CheckSectorProven", - "ApplyRewards", - "ReportConsensusFault", - "WithdrawBalance", - "ConfirmSectorProofsValid", - "ChangeMultiaddrs", - "CompactPartitions", - "CompactSectorNumbers", - "ConfirmUpdateWorkerKey", - "RepayDebt", - "ChangeOwnerAddress", - "DisputeWindowedPoSt", - "PreCommitSectorBatch", - "ProveCommitAggregate" + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15", + "16", + "17", + "18", + "19", + "20", + "21", + "22", + "23", + "24", + "25", + "26" ], "fil/5/storagepower": [ - "Send", - "Constructor", - "CreateMiner", - "UpdateClaimedPower", - "EnrollCronEvent", - "OnEpochTickEnd", - "UpdatePledgeTotal", - "SubmitPoRepForBulkVerify", - "CurrentTotalPower" + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "8", + "9" ], "fil/5/system": [ - "Send", - "Constructor" + "0", + "1" ], "fil/5/verifiedregistry": [ - "Send", - "Constructor", - "AddVerifier", - "RemoveVerifier", - "AddVerifiedClient", - "UseBytes", - "RestoreBytes" + "0", + "1", + "2", + "3", + "4", + "5", + "6" ], "fil/6/account": [ - "Send", - "Constructor", - "PubkeyAddress" + "0", + "1", + "2" ], "fil/6/cron": [ - "Send", - "Constructor", - "EpochTick" + "0", + "1", + "2" ], "fil/6/init": [ - "Send", - "Constructor", - "Exec" + "0", + "1", + "2" ], "fil/6/multisig": [ - "Send", - "Constructor", - "Propose", - "Approve", - "Cancel", - "AddSigner", - "RemoveSigner", - "SwapSigner", - "ChangeNumApprovalsThreshold", - "LockBalance" + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9" ], "fil/6/paymentchannel": [ - "Send", - "Constructor", - "UpdateChannelState", - "Settle", - "Collect" + "0", + "1", + "2", + "3", + "4" ], "fil/6/reward": [ - "Send", - "Constructor", - "AwardBlockReward", - "ThisEpochReward", - "UpdateNetworkKPI" + "0", + "1", + "2", + "3", + "4" ], "fil/6/storagemarket": [ - "Send", - "Constructor", - "AddBalance", - "WithdrawBalance", - "PublishStorageDeals", - "VerifyDealsForActivation", - "ActivateDeals", - "OnMinerSectorsTerminate", - "ComputeDataCommitment", - "CronTick" + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9" ], "fil/6/storageminer": [ - "Send", - "Constructor", - "ControlAddresses", - "ChangeWorkerAddress", - "ChangePeerID", - "SubmitWindowedPoSt", - "PreCommitSector", - "ProveCommitSector", - "ExtendSectorExpiration", - "TerminateSectors", - "DeclareFaults", - "DeclareFaultsRecovered", - "OnDeferredCronEvent", - "CheckSectorProven", - "ApplyRewards", - "ReportConsensusFault", - "WithdrawBalance", - "ConfirmSectorProofsValid", - "ChangeMultiaddrs", - "CompactPartitions", - "CompactSectorNumbers", - "ConfirmUpdateWorkerKey", - "RepayDebt", - "ChangeOwnerAddress", - "DisputeWindowedPoSt", - "PreCommitSectorBatch", - "ProveCommitAggregate" + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15", + "16", + "17", + "18", + "19", + "20", + "21", + "22", + "23", + "24", + "25", + "26" ], "fil/6/storagepower": [ - "Send", - "Constructor", - "CreateMiner", - "UpdateClaimedPower", - "EnrollCronEvent", - "OnEpochTickEnd", - "UpdatePledgeTotal", - "SubmitPoRepForBulkVerify", - "CurrentTotalPower" + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "8", + "9" ], "fil/6/system": [ - "Send", - "Constructor" + "0", + "1" ], "fil/6/verifiedregistry": [ - "Send", - "Constructor", - "AddVerifier", - "RemoveVerifier", - "AddVerifiedClient", - "UseBytes", - "RestoreBytes" + "0", + "1", + "2", + "3", + "4", + "5", + "6" ], "fil/7/account": [ - "Send", - "Constructor", - "PubkeyAddress" + "0", + "1", + "2" ], "fil/7/cron": [ - "Send", - "Constructor", - "EpochTick" + "0", + "1", + "2" ], "fil/7/init": [ - "Send", - "Constructor", - "Exec" + "0", + "1", + "2" ], "fil/7/multisig": [ - "Send", - "Constructor", - "Propose", - "Approve", - "Cancel", - "AddSigner", - "RemoveSigner", - "SwapSigner", - "ChangeNumApprovalsThreshold", - "LockBalance" + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9" ], "fil/7/paymentchannel": [ - "Send", - "Constructor", - "UpdateChannelState", - "Settle", - "Collect" + "0", + "1", + "2", + "3", + "4" ], "fil/7/reward": [ - "Send", - "Constructor", - "AwardBlockReward", - "ThisEpochReward", - "UpdateNetworkKPI" + "0", + "1", + "2", + "3", + "4" ], "fil/7/storagemarket": [ - "Send", - "Constructor", - "AddBalance", - "WithdrawBalance", - "PublishStorageDeals", - "VerifyDealsForActivation", - "ActivateDeals", - "OnMinerSectorsTerminate", - "ComputeDataCommitment", - "CronTick" + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9" ], "fil/7/storageminer": [ - "Send", - "Constructor", - "ControlAddresses", - "ChangeWorkerAddress", - "ChangePeerID", - "SubmitWindowedPoSt", - "PreCommitSector", - "ProveCommitSector", - "ExtendSectorExpiration", - "TerminateSectors", - "DeclareFaults", - "DeclareFaultsRecovered", - "OnDeferredCronEvent", - "CheckSectorProven", - "ApplyRewards", - "ReportConsensusFault", - "WithdrawBalance", - "ConfirmSectorProofsValid", - "ChangeMultiaddrs", - "CompactPartitions", - "CompactSectorNumbers", - "ConfirmUpdateWorkerKey", - "RepayDebt", - "ChangeOwnerAddress", - "DisputeWindowedPoSt", - "PreCommitSectorBatch", - "ProveCommitAggregate", - "ProveReplicaUpdates" + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15", + "16", + "17", + "18", + "19", + "20", + "21", + "22", + "23", + "24", + "25", + "26", + "27" ], "fil/7/storagepower": [ - "Send", - "Constructor", - "CreateMiner", - "UpdateClaimedPower", - "EnrollCronEvent", - "CronTick", - "UpdatePledgeTotal", - "SubmitPoRepForBulkVerify", - "CurrentTotalPower" + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "8", + "9" ], "fil/7/system": [ - "Send", - "Constructor" + "0", + "1" ], "fil/7/verifiedregistry": [ - "Send", - "Constructor", - "AddVerifier", - "RemoveVerifier", - "AddVerifiedClient", - "UseBytes", - "RestoreBytes", - "RemoveVerifiedClientDataCap" + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7" ], "fil/8/account": [ - "Send", - "Constructor", - "PubkeyAddress" + "0", + "1", + "2" ], - "fil/8/cron": [ - "Send", - "Constructor", - "EpochTick" - ], - "fil/8/init": [ - "Send", - "Constructor", - "Exec" - ], - "fil/8/multisig": [ - "Send", - "Constructor", - "Propose", - "Approve", - "Cancel", - "AddSigner", - "RemoveSigner", - "SwapSigner", - "ChangeNumApprovalsThreshold", - "LockBalance" - ], - "fil/8/paymentchannel": [ - "Send", - "Constructor", - "UpdateChannelState", - "Settle", - "Collect" - ], - "fil/8/reward": [ - "Send", - "Constructor", - "AwardBlockReward", - "ThisEpochReward", - "UpdateNetworkKPI" - ], - "fil/8/storagemarket": [ - "Send", - "Constructor", - "AddBalance", - "WithdrawBalance", - "PublishStorageDeals", - "VerifyDealsForActivation", - "ActivateDeals", - "OnMinerSectorsTerminate", - "ComputeDataCommitment", - "CronTick" - ], - "fil/8/storageminer": [ - "Send", - "Constructor", - "ControlAddresses", - "ChangeWorkerAddress", - "ChangePeerID", - "SubmitWindowedPoSt", - "PreCommitSector", - "ProveCommitSector", - "ExtendSectorExpiration", - "TerminateSectors", - "DeclareFaults", - "DeclareFaultsRecovered", - "OnDeferredCronEvent", - "CheckSectorProven", - "ApplyRewards", - "ReportConsensusFault", - "WithdrawBalance", - "ConfirmSectorProofsValid", - "ChangeMultiaddrs", - "CompactPartitions", - "CompactSectorNumbers", - "ConfirmUpdateWorkerKey", - "RepayDebt", - "ChangeOwnerAddress", - "DisputeWindowedPoSt", - "PreCommitSectorBatch", - "ProveCommitAggregate", - "ProveReplicaUpdates" - ], - "fil/8/storagepower": [ - "Send", - "Constructor", - "CreateMiner", - "UpdateClaimedPower", - "EnrollCronEvent", - "CronTick", - "UpdatePledgeTotal", - "SubmitPoRepForBulkVerify", - "CurrentTotalPower" - ], - "fil/8/system": [ - "Send", - "Constructor" - ], - "fil/8/verifiedregistry": [ - "Send", - "Constructor", - "AddVerifier", - "RemoveVerifier", - "AddVerifiedClient", - "UseBytes", - "RestoreBytes", - "RemoveVerifiedClientDataCap" + "fil/9/account": [ + "0", + "1", + "2", + "3" ] } \ No newline at end of file diff --git a/node/config/doc_gen.go b/node/config/doc_gen.go index 7f08c8cce..68e413ac8 100644 --- a/node/config/doc_gen.go +++ b/node/config/doc_gen.go @@ -3,7 +3,7 @@ package config type DocField struct { - Name string + Num string Type string Comment string } @@ -11,19 +11,19 @@ type DocField struct { var Doc = map[string][]DocField{ "API": []DocField{ { - Name: "ListenAddress", + Num: "ListenAddress", Type: "string", Comment: `Binding address for the Lotus API`, }, { - Name: "RemoteListenAddress", + Num: "RemoteListenAddress", Type: "string", Comment: ``, }, { - Name: "Timeout", + Num: "Timeout", Type: "Duration", Comment: ``, @@ -31,7 +31,7 @@ var Doc = map[string][]DocField{ }, "Backup": []DocField{ { - Name: "DisableMetadataLog", + Num: "DisableMetadataLog", Type: "bool", Comment: `When set to true disables metadata log (.lotus/kvlog). This can save disk @@ -43,13 +43,13 @@ your node if metadata log is disabled`, }, "BatchFeeConfig": []DocField{ { - Name: "Base", + Num: "Base", Type: "types.FIL", Comment: ``, }, { - Name: "PerSector", + Num: "PerSector", Type: "types.FIL", Comment: ``, @@ -57,13 +57,13 @@ your node if metadata log is disabled`, }, "Chainstore": []DocField{ { - Name: "EnableSplitstore", + Num: "EnableSplitstore", Type: "bool", Comment: ``, }, { - Name: "Splitstore", + Num: "Splitstore", Type: "Splitstore", Comment: ``, @@ -71,45 +71,45 @@ your node if metadata log is disabled`, }, "Client": []DocField{ { - Name: "UseIpfs", + Num: "UseIpfs", Type: "bool", Comment: ``, }, { - Name: "IpfsOnlineMode", + Num: "IpfsOnlineMode", Type: "bool", Comment: ``, }, { - Name: "IpfsMAddr", + Num: "IpfsMAddr", Type: "string", Comment: ``, }, { - Name: "IpfsUseForRetrieval", + Num: "IpfsUseForRetrieval", Type: "bool", Comment: ``, }, { - Name: "SimultaneousTransfersForStorage", + Num: "SimultaneousTransfersForStorage", Type: "uint64", Comment: `The maximum number of simultaneous data transfers between the client and storage providers for storage deals`, }, { - Name: "SimultaneousTransfersForRetrieval", + Num: "SimultaneousTransfersForRetrieval", Type: "uint64", Comment: `The maximum number of simultaneous data transfers between the client and storage providers for retrieval deals`, }, { - Name: "OffChainRetrieval", + Num: "OffChainRetrieval", Type: "bool", Comment: `Require that retrievals perform no on-chain operations. Paid retrievals @@ -119,31 +119,31 @@ of automatically performing on-chain operations.`, }, "Common": []DocField{ { - Name: "API", + Num: "API", Type: "API", Comment: ``, }, { - Name: "Backup", + Num: "Backup", Type: "Backup", Comment: ``, }, { - Name: "Logging", + Num: "Logging", Type: "Logging", Comment: ``, }, { - Name: "Libp2p", + Num: "Libp2p", Type: "Libp2p", Comment: ``, }, { - Name: "Pubsub", + Num: "Pubsub", Type: "Pubsub", Comment: ``, @@ -151,7 +151,7 @@ of automatically performing on-chain operations.`, }, "DAGStoreConfig": []DocField{ { - Name: "RootDir", + Num: "RootDir", Type: "string", Comment: `Path to the dagstore root directory. This directory contains three @@ -166,7 +166,7 @@ Default value: /dagstore (split deployment) or /dagstore (monolith deployment)`, }, { - Name: "MaxConcurrentIndex", + Num: "MaxConcurrentIndex", Type: "int", Comment: `The maximum amount of indexing jobs that can run simultaneously. @@ -174,7 +174,7 @@ Default value: /dagstore (split deployment) or Default value: 5.`, }, { - Name: "MaxConcurrentReadyFetches", + Num: "MaxConcurrentReadyFetches", Type: "int", Comment: `The maximum amount of unsealed deals that can be fetched simultaneously @@ -182,7 +182,7 @@ from the storage subsystem. 0 means unlimited. Default value: 0 (unlimited).`, }, { - Name: "MaxConcurrentUnseals", + Num: "MaxConcurrentUnseals", Type: "int", Comment: `The maximum amount of unseals that can be processed simultaneously @@ -190,7 +190,7 @@ from the storage subsystem. 0 means unlimited. Default value: 0 (unlimited).`, }, { - Name: "MaxConcurrencyStorageCalls", + Num: "MaxConcurrencyStorageCalls", Type: "int", Comment: `The maximum number of simultaneous inflight API calls to the storage @@ -198,7 +198,7 @@ subsystem. Default value: 100.`, }, { - Name: "GCInterval", + Num: "GCInterval", Type: "Duration", Comment: `The time between calls to periodic dagstore GC, in time.Duration string @@ -208,49 +208,49 @@ Default value: 1 minute.`, }, "DealmakingConfig": []DocField{ { - Name: "ConsiderOnlineStorageDeals", + Num: "ConsiderOnlineStorageDeals", Type: "bool", Comment: `When enabled, the miner can accept online deals`, }, { - Name: "ConsiderOfflineStorageDeals", + Num: "ConsiderOfflineStorageDeals", Type: "bool", Comment: `When enabled, the miner can accept offline deals`, }, { - Name: "ConsiderOnlineRetrievalDeals", + Num: "ConsiderOnlineRetrievalDeals", Type: "bool", Comment: `When enabled, the miner can accept retrieval deals`, }, { - Name: "ConsiderOfflineRetrievalDeals", + Num: "ConsiderOfflineRetrievalDeals", Type: "bool", Comment: `When enabled, the miner can accept offline retrieval deals`, }, { - Name: "ConsiderVerifiedStorageDeals", + Num: "ConsiderVerifiedStorageDeals", Type: "bool", Comment: `When enabled, the miner can accept verified deals`, }, { - Name: "ConsiderUnverifiedStorageDeals", + Num: "ConsiderUnverifiedStorageDeals", Type: "bool", Comment: `When enabled, the miner can accept unverified deals`, }, { - Name: "PieceCidBlocklist", + Num: "PieceCidBlocklist", Type: "[]cid.Cid", Comment: `A list of Data CIDs to reject when making deals`, }, { - Name: "ExpectedSealDuration", + Num: "ExpectedSealDuration", Type: "Duration", Comment: `Maximum expected amount of time getting the deal into a sealed sector will take @@ -258,47 +258,47 @@ This includes the time the deal will need to get transferred and published before being assigned to a sector`, }, { - Name: "MaxDealStartDelay", + Num: "MaxDealStartDelay", Type: "Duration", Comment: `Maximum amount of time proposed deal StartEpoch can be in future`, }, { - Name: "PublishMsgPeriod", + Num: "PublishMsgPeriod", Type: "Duration", Comment: `When a deal is ready to publish, the amount of time to wait for more deals to be ready to publish before publishing them all as a batch`, }, { - Name: "MaxDealsPerPublishMsg", + Num: "MaxDealsPerPublishMsg", Type: "uint64", Comment: `The maximum number of deals to include in a single PublishStorageDeals message`, }, { - Name: "MaxProviderCollateralMultiplier", + Num: "MaxProviderCollateralMultiplier", Type: "uint64", Comment: `The maximum collateral that the provider will put up against a deal, as a multiplier of the minimum collateral bound`, }, { - Name: "MaxStagingDealsBytes", + Num: "MaxStagingDealsBytes", Type: "int64", Comment: `The maximum allowed disk usage size in bytes of staging deals not yet passed to the sealing node by the markets service. 0 is unlimited.`, }, { - Name: "SimultaneousTransfersForStorage", + Num: "SimultaneousTransfersForStorage", Type: "uint64", Comment: `The maximum number of parallel online data transfers for storage deals`, }, { - Name: "SimultaneousTransfersForStoragePerClient", + Num: "SimultaneousTransfersForStoragePerClient", Type: "uint64", Comment: `The maximum number of simultaneous data transfers from any single client @@ -309,33 +309,33 @@ across all storage clients is bound by SimultaneousTransfersForStorage regardless of this number.`, }, { - Name: "SimultaneousTransfersForRetrieval", + Num: "SimultaneousTransfersForRetrieval", Type: "uint64", Comment: `The maximum number of parallel online data transfers for retrieval deals`, }, { - Name: "StartEpochSealingBuffer", + Num: "StartEpochSealingBuffer", Type: "uint64", Comment: `Minimum start epoch buffer to give time for sealing of sector with deal.`, }, { - Name: "Filter", + Num: "Filter", Type: "string", Comment: `A command used for fine-grained evaluation of storage deals see https://docs.filecoin.io/mine/lotus/miner-configuration/#using-filters-for-fine-grained-storage-and-retrieval-deal-acceptance for more details`, }, { - Name: "RetrievalFilter", + Num: "RetrievalFilter", Type: "string", Comment: `A command used for fine-grained evaluation of retrieval deals see https://docs.filecoin.io/mine/lotus/miner-configuration/#using-filters-for-fine-grained-storage-and-retrieval-deal-acceptance for more details`, }, { - Name: "RetrievalPricing", + Num: "RetrievalPricing", Type: "*RetrievalPricing", Comment: ``, @@ -343,7 +343,7 @@ see https://docs.filecoin.io/mine/lotus/miner-configuration/#using-filters-for-f }, "FeeConfig": []DocField{ { - Name: "DefaultMaxFee", + Num: "DefaultMaxFee", Type: "types.FIL", Comment: ``, @@ -351,25 +351,25 @@ see https://docs.filecoin.io/mine/lotus/miner-configuration/#using-filters-for-f }, "FullNode": []DocField{ { - Name: "Client", + Num: "Client", Type: "Client", Comment: ``, }, { - Name: "Wallet", + Num: "Wallet", Type: "Wallet", Comment: ``, }, { - Name: "Fees", + Num: "Fees", Type: "FeeConfig", Comment: ``, }, { - Name: "Chainstore", + Num: "Chainstore", Type: "Chainstore", Comment: ``, @@ -377,14 +377,14 @@ see https://docs.filecoin.io/mine/lotus/miner-configuration/#using-filters-for-f }, "IndexProviderConfig": []DocField{ { - Name: "Enable", + Num: "Enable", Type: "bool", Comment: `Enable set whether to enable indexing announcement to the network and expose endpoints that allow indexer nodes to process announcements. Enabled by default.`, }, { - Name: "EntriesCacheCapacity", + Num: "EntriesCacheCapacity", Type: "int", Comment: `EntriesCacheCapacity sets the maximum capacity to use for caching the indexing advertisement @@ -395,7 +395,7 @@ with the default EntriesCacheCapacity, and EntriesChunkSize means the cache size 256MiB when full.`, }, { - Name: "EntriesChunkSize", + Num: "EntriesChunkSize", Type: "int", Comment: `EntriesChunkSize sets the maximum number of multihashes to include in a single entries chunk. @@ -403,7 +403,7 @@ Defaults to 16384 if not specified. Note that chunks are chained together for in advertisements that include more multihashes than the configured EntriesChunkSize.`, }, { - Name: "TopicName", + Num: "TopicName", Type: "string", Comment: `TopicName sets the topic name on which the changes to the advertised content are announced. @@ -412,7 +412,7 @@ in following format: '/indexer/ingest/' Defaults to empty, which implies the topic name is inferred from network name.`, }, { - Name: "PurgeCacheOnStart", + Num: "PurgeCacheOnStart", Type: "bool", Comment: `PurgeCacheOnStart sets whether to clear any cached entries chunks when the provider engine @@ -422,14 +422,14 @@ datastore if any is present.`, }, "Libp2p": []DocField{ { - Name: "ListenAddresses", + Num: "ListenAddresses", Type: "[]string", Comment: `Binding address for the libp2p host - 0 means random port. Format: multiaddress; see https://multiformats.io/multiaddr/`, }, { - Name: "AnnounceAddresses", + Num: "AnnounceAddresses", Type: "[]string", Comment: `Addresses to explicitally announce to other peers. If not specified, @@ -437,26 +437,26 @@ all interface addresses are announced Format: multiaddress`, }, { - Name: "NoAnnounceAddresses", + Num: "NoAnnounceAddresses", Type: "[]string", Comment: `Addresses to not announce Format: multiaddress`, }, { - Name: "BootstrapPeers", + Num: "BootstrapPeers", Type: "[]string", Comment: ``, }, { - Name: "ProtectedPeers", + Num: "ProtectedPeers", Type: "[]string", Comment: ``, }, { - Name: "DisableNatPortMap", + Num: "DisableNatPortMap", Type: "bool", Comment: `When not disabled (default), lotus asks NAT devices (e.g., routers), to @@ -465,14 +465,14 @@ When this works (i.e., when your router supports NAT port forwarding), it makes the local lotus node accessible from the public internet`, }, { - Name: "ConnMgrLow", + Num: "ConnMgrLow", Type: "uint", Comment: `ConnMgrLow is the number of connections that the basic connection manager will trim down to.`, }, { - Name: "ConnMgrHigh", + Num: "ConnMgrHigh", Type: "uint", Comment: `ConnMgrHigh is the number of connections that, when exceeded, will trigger @@ -480,7 +480,7 @@ a connection GC operation. Note: protected/recently formed connections don't count towards this limit.`, }, { - Name: "ConnMgrGrace", + Num: "ConnMgrGrace", Type: "Duration", Comment: `ConnMgrGrace is a time duration that new connections are immune from being @@ -489,7 +489,7 @@ closed by the connection manager.`, }, "Logging": []DocField{ { - Name: "SubsystemLevels", + Num: "SubsystemLevels", Type: "map[string]string", Comment: `SubsystemLevels specify per-subsystem log levels`, @@ -497,38 +497,38 @@ closed by the connection manager.`, }, "MinerAddressConfig": []DocField{ { - Name: "PreCommitControl", + Num: "PreCommitControl", Type: "[]string", Comment: `Addresses to send PreCommit messages from`, }, { - Name: "CommitControl", + Num: "CommitControl", Type: "[]string", Comment: `Addresses to send Commit messages from`, }, { - Name: "TerminateControl", + Num: "TerminateControl", Type: "[]string", Comment: ``, }, { - Name: "DealPublishControl", + Num: "DealPublishControl", Type: "[]string", Comment: ``, }, { - Name: "DisableOwnerFallback", + Num: "DisableOwnerFallback", Type: "bool", Comment: `DisableOwnerFallback disables usage of the owner address for messages sent automatically`, }, { - Name: "DisableWorkerFallback", + Num: "DisableWorkerFallback", Type: "bool", Comment: `DisableWorkerFallback disables usage of the worker address for messages @@ -539,49 +539,49 @@ over the worker address if this flag is set.`, }, "MinerFeeConfig": []DocField{ { - Name: "MaxPreCommitGasFee", + Num: "MaxPreCommitGasFee", Type: "types.FIL", Comment: ``, }, { - Name: "MaxCommitGasFee", + Num: "MaxCommitGasFee", Type: "types.FIL", Comment: ``, }, { - Name: "MaxPreCommitBatchGasFee", + Num: "MaxPreCommitBatchGasFee", Type: "BatchFeeConfig", Comment: `maxBatchFee = maxBase + maxPerSector * nSectors`, }, { - Name: "MaxCommitBatchGasFee", + Num: "MaxCommitBatchGasFee", Type: "BatchFeeConfig", Comment: ``, }, { - Name: "MaxTerminateGasFee", + Num: "MaxTerminateGasFee", Type: "types.FIL", Comment: ``, }, { - Name: "MaxWindowPoStGasFee", + Num: "MaxWindowPoStGasFee", Type: "types.FIL", Comment: `WindowPoSt is a high-value operation, so the default fee should be high.`, }, { - Name: "MaxPublishDealsFee", + Num: "MaxPublishDealsFee", Type: "types.FIL", Comment: ``, }, { - Name: "MaxMarketBalanceAddFee", + Num: "MaxMarketBalanceAddFee", Type: "types.FIL", Comment: ``, @@ -589,37 +589,37 @@ over the worker address if this flag is set.`, }, "MinerSubsystemConfig": []DocField{ { - Name: "EnableMining", + Num: "EnableMining", Type: "bool", Comment: ``, }, { - Name: "EnableSealing", + Num: "EnableSealing", Type: "bool", Comment: ``, }, { - Name: "EnableSectorStorage", + Num: "EnableSectorStorage", Type: "bool", Comment: ``, }, { - Name: "EnableMarkets", + Num: "EnableMarkets", Type: "bool", Comment: ``, }, { - Name: "SealerApiInfo", + Num: "SealerApiInfo", Type: "string", Comment: ``, }, { - Name: "SectorIndexApiInfo", + Num: "SectorIndexApiInfo", Type: "string", Comment: ``, @@ -627,7 +627,7 @@ over the worker address if this flag is set.`, }, "ProvingConfig": []DocField{ { - Name: "ParallelCheckLimit", + Num: "ParallelCheckLimit", Type: "int", Comment: `Maximum number of sector checks to run in parallel. (0 = unlimited) @@ -640,7 +640,7 @@ After changing this option, confirm that the new value works in your setup by in 'lotus-miner proving compute window-post 0'`, }, { - Name: "DisableBuiltinWindowPoSt", + Num: "DisableBuiltinWindowPoSt", Type: "bool", Comment: `Disable Window PoSt computation on the lotus-miner process even if no window PoSt workers are present. @@ -652,7 +652,7 @@ After changing this option, confirm that the new value works in your setup by in 'lotus-miner proving compute window-post 0'`, }, { - Name: "DisableBuiltinWinningPoSt", + Num: "DisableBuiltinWinningPoSt", Type: "bool", Comment: `Disable Winning PoSt computation on the lotus-miner process even if no winning PoSt workers are present. @@ -661,7 +661,7 @@ WARNING: If no WinningPoSt workers are connected, Winning PoSt WILL FAIL resulti Before enabling this option, make sure your PoSt workers work correctly.`, }, { - Name: "DisableWDPoStPreChecks", + Num: "DisableWDPoStPreChecks", Type: "bool", Comment: `Disable WindowPoSt provable sector readability checks. @@ -690,7 +690,7 @@ After changing this option, confirm that the new value works in your setup by in 'lotus-miner proving compute window-post 0'`, }, { - Name: "MaxPartitionsPerPoStMessage", + Num: "MaxPartitionsPerPoStMessage", Type: "int", Comment: `Maximum number of partitions to prove in a single SubmitWindowPoSt messace. 0 = network limit (10 in nv16) @@ -708,7 +708,7 @@ to prove each deadline, resulting in more total gas use (but each message will h Setting this value above the network limit has no effect`, }, { - Name: "MaxPartitionsPerRecoveryMessage", + Num: "MaxPartitionsPerRecoveryMessage", Type: "int", Comment: `In some cases when submitting DeclareFaultsRecovered messages, @@ -720,13 +720,13 @@ resulting in more total gas use (but each message will have lower gas limit)`, }, "Pubsub": []DocField{ { - Name: "Bootstrapper", + Num: "Bootstrapper", Type: "bool", Comment: `Run the node in bootstrap-node mode`, }, { - Name: "DirectPeers", + Num: "DirectPeers", Type: "[]string", Comment: `DirectPeers specifies peers with direct peering agreements. These peers are @@ -737,13 +737,13 @@ symmetrically configured at both ends. Type: Array of multiaddress peerinfo strings, must include peerid (/p2p/12D3K...`, }, { - Name: "IPColocationWhitelist", + Num: "IPColocationWhitelist", Type: "[]string", Comment: ``, }, { - Name: "RemoteTracer", + Num: "RemoteTracer", Type: "string", Comment: ``, @@ -751,19 +751,19 @@ Type: Array of multiaddress peerinfo strings, must include peerid (/p2p/12D3K... }, "RetrievalPricing": []DocField{ { - Name: "Strategy", + Num: "Strategy", Type: "string", Comment: ``, }, { - Name: "Default", + Num: "Default", Type: "*RetrievalPricingDefault", Comment: ``, }, { - Name: "External", + Num: "External", Type: "*RetrievalPricingExternal", Comment: ``, @@ -771,7 +771,7 @@ Type: Array of multiaddress peerinfo strings, must include peerid (/p2p/12D3K... }, "RetrievalPricingDefault": []DocField{ { - Name: "VerifiedDealsFreeTransfer", + Num: "VerifiedDealsFreeTransfer", Type: "bool", Comment: `VerifiedDealsFreeTransfer configures zero fees for data transfer for a retrieval deal @@ -782,7 +782,7 @@ default value is true`, }, "RetrievalPricingExternal": []DocField{ { - Name: "Path", + Num: "Path", Type: "string", Comment: `Path of the external script that will be run to price a retrieval deal. @@ -791,68 +791,68 @@ This parameter is ONLY applicable if the retrieval pricing policy strategy has b }, "SealerConfig": []DocField{ { - Name: "ParallelFetchLimit", + Num: "ParallelFetchLimit", Type: "int", Comment: ``, }, { - Name: "AllowAddPiece", + Num: "AllowAddPiece", Type: "bool", Comment: `Local worker config`, }, { - Name: "AllowPreCommit1", + Num: "AllowPreCommit1", Type: "bool", Comment: ``, }, { - Name: "AllowPreCommit2", + Num: "AllowPreCommit2", Type: "bool", Comment: ``, }, { - Name: "AllowCommit", + Num: "AllowCommit", Type: "bool", Comment: ``, }, { - Name: "AllowUnseal", + Num: "AllowUnseal", Type: "bool", Comment: ``, }, { - Name: "AllowReplicaUpdate", + Num: "AllowReplicaUpdate", Type: "bool", Comment: ``, }, { - Name: "AllowProveReplicaUpdate2", + Num: "AllowProveReplicaUpdate2", Type: "bool", Comment: ``, }, { - Name: "AllowRegenSectorKey", + Num: "AllowRegenSectorKey", Type: "bool", Comment: ``, }, { - Name: "LocalWorkerName", + Num: "LocalWorkerName", Type: "string", Comment: `LocalWorkerName specifies a custom name for the builtin worker. If set to an empty string (default) os hostname will be used`, }, { - Name: "Assigner", + Num: "Assigner", Type: "string", Comment: `Assigner specifies the worker assigner to use when scheduling tasks. @@ -860,7 +860,7 @@ If set to an empty string (default) os hostname will be used`, "spread" - assign tasks to as many distinct workers as possible.`, }, { - Name: "DisallowRemoteFinalize", + Num: "DisallowRemoteFinalize", Type: "bool", Comment: `DisallowRemoteFinalize when set to true will force all Finalize tasks to @@ -876,7 +876,7 @@ If you see stuck Finalize tasks after enabling this setting, check 'lotus-miner sealing sched-diag' and 'lotus-miner storage find [sector num]'`, }, { - Name: "ResourceFiltering", + Num: "ResourceFiltering", Type: "sealer.ResourceFilteringStrategy", Comment: `ResourceFiltering instructs the system which resource filtering strategy @@ -886,7 +886,7 @@ to "hardware".`, }, "SealingConfig": []DocField{ { - Name: "MaxWaitDealsSectors", + Num: "MaxWaitDealsSectors", Type: "uint64", Comment: `Upper bound on how many sectors can be waiting for more deals to be packed in it before it begins sealing at any given time. @@ -896,19 +896,19 @@ Note that setting this number too high in relation to deal ingestion rate may re 0 = no limit`, }, { - Name: "MaxSealingSectors", + Num: "MaxSealingSectors", Type: "uint64", Comment: `Upper bound on how many sectors can be sealing+upgrading at the same time when creating new CC sectors (0 = unlimited)`, }, { - Name: "MaxSealingSectorsForDeals", + Num: "MaxSealingSectorsForDeals", Type: "uint64", Comment: `Upper bound on how many sectors can be sealing+upgrading at the same time when creating new sectors with deals (0 = unlimited)`, }, { - Name: "PreferNewSectorsForDeals", + Num: "PreferNewSectorsForDeals", Type: "bool", Comment: `Prefer creating new sectors even if there are sectors Available for upgrading. @@ -917,13 +917,13 @@ possible to use fast sector upgrades to handle high volumes of storage deals, wh flow when the volume of storage deals is lower.`, }, { - Name: "MaxUpgradingSectors", + Num: "MaxUpgradingSectors", Type: "uint64", Comment: `Upper bound on how many sectors can be sealing+upgrading at the same time when upgrading CC sectors with deals (0 = MaxSealingSectorsForDeals)`, }, { - Name: "CommittedCapacitySectorLifetime", + Num: "CommittedCapacitySectorLifetime", Type: "Duration", Comment: `CommittedCapacitySectorLifetime is the duration a Committed Capacity (CC) sector will @@ -931,27 +931,27 @@ live before it must be extended or converted into sector containing deals before terminated. Value must be between 180-540 days inclusive`, }, { - Name: "WaitDealsDelay", + Num: "WaitDealsDelay", Type: "Duration", Comment: `Period of time that a newly created sector will wait for more deals to be packed in to before it starts to seal. Sectors which are fully filled will start sealing immediately`, }, { - Name: "AlwaysKeepUnsealedCopy", + Num: "AlwaysKeepUnsealedCopy", Type: "bool", Comment: `Whether to keep unsealed copies of deal data regardless of whether the client requested that. This lets the miner avoid the relatively high cost of unsealing the data later, at the cost of more storage space`, }, { - Name: "FinalizeEarly", + Num: "FinalizeEarly", Type: "bool", Comment: `Run sector finalization before submitting sector proof to the chain`, }, { - Name: "MakeNewSectorForDeals", + Num: "MakeNewSectorForDeals", Type: "bool", Comment: `Whether new sectors are created to pack incoming deals @@ -959,111 +959,111 @@ When this is set to false no new sectors will be created for sealing incoming de This is useful for forcing all deals to be assigned as snap deals to sectors marked for upgrade`, }, { - Name: "MakeCCSectorsAvailable", + Num: "MakeCCSectorsAvailable", Type: "bool", Comment: `After sealing CC sectors, make them available for upgrading with deals`, }, { - Name: "CollateralFromMinerBalance", + Num: "CollateralFromMinerBalance", Type: "bool", Comment: `Whether to use available miner balance for sector collateral instead of sending it with each message`, }, { - Name: "AvailableBalanceBuffer", + Num: "AvailableBalanceBuffer", Type: "types.FIL", Comment: `Minimum available balance to keep in the miner actor before sending it with messages`, }, { - Name: "DisableCollateralFallback", + Num: "DisableCollateralFallback", Type: "bool", Comment: `Don't send collateral with messages even if there is no available balance in the miner actor`, }, { - Name: "BatchPreCommits", + Num: "BatchPreCommits", Type: "bool", Comment: `enable / disable precommit batching (takes effect after nv13)`, }, { - Name: "MaxPreCommitBatch", + Num: "MaxPreCommitBatch", Type: "int", Comment: `maximum precommit batch size - batches will be sent immediately above this size`, }, { - Name: "PreCommitBatchWait", + Num: "PreCommitBatchWait", Type: "Duration", Comment: `how long to wait before submitting a batch after crossing the minimum batch size`, }, { - Name: "PreCommitBatchSlack", + Num: "PreCommitBatchSlack", Type: "Duration", Comment: `time buffer for forceful batch submission before sectors/deal in batch would start expiring`, }, { - Name: "AggregateCommits", + Num: "AggregateCommits", Type: "bool", Comment: `enable / disable commit aggregation (takes effect after nv13)`, }, { - Name: "MinCommitBatch", + Num: "MinCommitBatch", Type: "int", Comment: `minimum batched commit size - batches above this size will eventually be sent on a timeout`, }, { - Name: "MaxCommitBatch", + Num: "MaxCommitBatch", Type: "int", Comment: `maximum batched commit size - batches will be sent immediately above this size`, }, { - Name: "CommitBatchWait", + Num: "CommitBatchWait", Type: "Duration", Comment: `how long to wait before submitting a batch after crossing the minimum batch size`, }, { - Name: "CommitBatchSlack", + Num: "CommitBatchSlack", Type: "Duration", Comment: `time buffer for forceful batch submission before sectors/deals in batch would start expiring`, }, { - Name: "BatchPreCommitAboveBaseFee", + Num: "BatchPreCommitAboveBaseFee", Type: "types.FIL", Comment: `network BaseFee below which to stop doing precommit batching, instead sending precommit messages to the chain individually`, }, { - Name: "AggregateAboveBaseFee", + Num: "AggregateAboveBaseFee", Type: "types.FIL", Comment: `network BaseFee below which to stop doing commit aggregation, instead submitting proofs to the chain individually`, }, { - Name: "TerminateBatchMax", + Num: "TerminateBatchMax", Type: "uint64", Comment: ``, }, { - Name: "TerminateBatchMin", + Num: "TerminateBatchMin", Type: "uint64", Comment: ``, }, { - Name: "TerminateBatchWait", + Num: "TerminateBatchWait", Type: "Duration", Comment: ``, @@ -1071,35 +1071,35 @@ submitting proofs to the chain individually`, }, "Splitstore": []DocField{ { - Name: "ColdStoreType", + Num: "ColdStoreType", Type: "string", Comment: `ColdStoreType specifies the type of the coldstore. It can be "universal" (default) or "discard" for discarding cold blocks.`, }, { - Name: "HotStoreType", + Num: "HotStoreType", Type: "string", Comment: `HotStoreType specifies the type of the hotstore. Only currently supported value is "badger".`, }, { - Name: "MarkSetType", + Num: "MarkSetType", Type: "string", Comment: `MarkSetType specifies the type of the markset. It can be "map" for in memory marking or "badger" (default) for on-disk marking.`, }, { - Name: "HotStoreMessageRetention", + Num: "HotStoreMessageRetention", Type: "uint64", Comment: `HotStoreMessageRetention specifies the retention policy for messages, in finalities beyond the compaction boundary; default is 0.`, }, { - Name: "HotStoreFullGCFrequency", + Num: "HotStoreFullGCFrequency", Type: "uint64", Comment: `HotStoreFullGCFrequency specifies how often to perform a full (moving) GC on the hotstore. @@ -1107,7 +1107,7 @@ A value of 0 disables, while a value 1 will do full GC in every compaction. Default is 20 (about once a week).`, }, { - Name: "EnableColdStoreAutoPrune", + Num: "EnableColdStoreAutoPrune", Type: "bool", Comment: `EnableColdStoreAutoPrune turns on compaction of the cold store i.e. pruning @@ -1115,7 +1115,7 @@ where hotstore compaction occurs every finality epochs pruning happens every 3 f Default is false`, }, { - Name: "ColdStoreFullGCFrequency", + Num: "ColdStoreFullGCFrequency", Type: "uint64", Comment: `ColdStoreFullGCFrequency specifies how often to performa a full (moving) GC on the coldstore. @@ -1124,7 +1124,7 @@ full GC in every prune. Default is 7 (about once every a week)`, }, { - Name: "ColdStoreRetention", + Num: "ColdStoreRetention", Type: "int64", Comment: `ColdStoreRetention specifies the retention policy for data reachable from the chain, in @@ -1133,55 +1133,55 @@ finalities beyond the compaction boundary, default is 0, -1 retains everything`, }, "StorageMiner": []DocField{ { - Name: "Subsystems", + Num: "Subsystems", Type: "MinerSubsystemConfig", Comment: ``, }, { - Name: "Dealmaking", + Num: "Dealmaking", Type: "DealmakingConfig", Comment: ``, }, { - Name: "IndexProvider", + Num: "IndexProvider", Type: "IndexProviderConfig", Comment: ``, }, { - Name: "Proving", + Num: "Proving", Type: "ProvingConfig", Comment: ``, }, { - Name: "Sealing", + Num: "Sealing", Type: "SealingConfig", Comment: ``, }, { - Name: "Storage", + Num: "Storage", Type: "SealerConfig", Comment: ``, }, { - Name: "Fees", + Num: "Fees", Type: "MinerFeeConfig", Comment: ``, }, { - Name: "Addresses", + Num: "Addresses", Type: "MinerAddressConfig", Comment: ``, }, { - Name: "DAGStore", + Num: "DAGStore", Type: "DAGStoreConfig", Comment: ``, @@ -1189,19 +1189,19 @@ finalities beyond the compaction boundary, default is 0, -1 retains everything`, }, "Wallet": []DocField{ { - Name: "RemoteBackend", + Num: "RemoteBackend", Type: "string", Comment: ``, }, { - Name: "EnableLedger", + Num: "EnableLedger", Type: "bool", Comment: ``, }, { - Name: "DisableLocal", + Num: "DisableLocal", Type: "bool", Comment: ``, diff --git a/node/config/doc_util.go b/node/config/doc_util.go index b88333238..4da94948f 100644 --- a/node/config/doc_util.go +++ b/node/config/doc_util.go @@ -16,7 +16,7 @@ func findDoc(root interface{}, section, name string) *DocField { return findDocSect("Common", section, name) } -func findDocSect(root, section, name string) *DocField { +func findDocSect(root, section, num string) *DocField { path := strings.Split(section, ".") docSection := Doc[root] @@ -26,7 +26,7 @@ func findDocSect(root, section, name string) *DocField { } for _, field := range docSection { - if field.Name == e { + if field.Num == e { docSection = Doc[field.Type] break } @@ -35,7 +35,7 @@ func findDocSect(root, section, name string) *DocField { } for _, df := range docSection { - if df.Name == name { + if df.Num == num { return &df } } From 30f66578e162581f4d1514ad0a953e703bcbb582 Mon Sep 17 00:00:00 2001 From: Aayush Date: Thu, 8 Sep 2022 16:31:12 -0400 Subject: [PATCH 111/185] fixup genesis creation --- chain/gen/genesis/miners.go | 102 +++++++++++++++++++++--------------- extern/filecoin-ffi | 2 +- go.mod | 2 +- go.sum | 8 ++- 4 files changed, 67 insertions(+), 47 deletions(-) diff --git a/chain/gen/genesis/miners.go b/chain/gen/genesis/miners.go index 0397d38b1..e74934cc9 100644 --- a/chain/gen/genesis/miners.go +++ b/chain/gen/genesis/miners.go @@ -6,6 +6,12 @@ import ( "fmt" "math/rand" + smoothing9 "github.com/filecoin-project/go-state-types/builtin/v9/util/smoothing" + + miner9 "github.com/filecoin-project/go-state-types/builtin/v9/miner" + + market9 "github.com/filecoin-project/go-state-types/builtin/v9/market" + "github.com/ipfs/go-cid" cbor "github.com/ipfs/go-ipld-cbor" cbg "github.com/whyrusleeping/cbor-gen" @@ -26,7 +32,6 @@ import ( miner0 "github.com/filecoin-project/specs-actors/actors/builtin/miner" power0 "github.com/filecoin-project/specs-actors/actors/builtin/power" reward0 "github.com/filecoin-project/specs-actors/actors/builtin/reward" - smoothing0 "github.com/filecoin-project/specs-actors/actors/util/smoothing" market2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/market" reward2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/reward" market4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/market" @@ -120,10 +125,12 @@ func SetupStorageMiners(ctx context.Context, cs *store.ChainStore, sys vm.Syscal presealExp abi.ChainEpoch - dealIDs []abi.DealID + dealIDs []abi.DealID + sectorWeight []abi.StoragePower }, len(miners)) maxPeriods := policy.GetMaxSectorExpirationExtension() / minertypes.WPoStProvingPeriod + rawPow, qaPow := big.NewInt(0), big.NewInt(0) for i, m := range miners { // Create miner through power actor i := i @@ -197,7 +204,7 @@ func SetupStorageMiners(ctx context.Context, cs *store.ChainStore, sys vm.Syscal } } - // Publish preseal deals + // Publish preseal deals, and calculate the QAPower { publish := func(params *markettypes.PublishStorageDealsParams) error { @@ -227,6 +234,7 @@ func SetupStorageMiners(ctx context.Context, cs *store.ChainStore, sys vm.Syscal params := &markettypes.PublishStorageDealsParams{} for _, preseal := range m.Sectors { + fmt.Println("presealing ", preseal.SectorID) preseal.Deal.VerifiedDeal = true preseal.Deal.EndEpoch = minerInfos[i].presealExp p := markettypes.ClientDealProposal{ @@ -257,6 +265,11 @@ func SetupStorageMiners(ctx context.Context, cs *store.ChainStore, sys vm.Syscal params = &markettypes.PublishStorageDealsParams{} } + + rawPow = big.Add(rawPow, big.NewInt(int64(m.SectorSize))) + sectorWeight := builtin.QAPowerForWeight(m.SectorSize, minerInfos[i].presealExp, big.Zero(), big.NewInt(int64(preseal.Deal.PieceSize))) + minerInfos[i].sectorWeight = append(minerInfos[i].sectorWeight, sectorWeight) + qaPow = big.Add(qaPow, sectorWeight) } if len(params.Deals) > 0 { @@ -267,24 +280,6 @@ func SetupStorageMiners(ctx context.Context, cs *store.ChainStore, sys vm.Syscal } } - // adjust total network power for equal pledge per sector - rawPow, qaPow := big.NewInt(0), big.NewInt(0) - { - for i, m := range miners { - for pi := range m.Sectors { - rawPow = types.BigAdd(rawPow, types.NewInt(uint64(m.SectorSize))) - - dweight, vdweight, err := dealWeight(ctx, genesisVm, minerInfos[i].maddr, []abi.DealID{minerInfos[i].dealIDs[pi]}, 0, minerInfos[i].presealExp, av) - if err != nil { - return cid.Undef, xerrors.Errorf("getting deal weight: %w", err) - } - - sectorWeight := builtin.QAPowerForWeight(m.SectorSize, minerInfos[i].presealExp, dweight, vdweight) - - qaPow = types.BigAdd(qaPow, sectorWeight) - } - } - nh, err := genesisVm.Flush(ctx) if err != nil { return cid.Undef, xerrors.Errorf("flushing vm: %w", err) @@ -369,12 +364,7 @@ func SetupStorageMiners(ctx context.Context, cs *store.ChainStore, sys vm.Syscal Expiration: minerInfos[i].presealExp, // TODO: Allow setting externally! } - dweight, vdweight, err := dealWeight(ctx, genesisVm, minerInfos[i].maddr, params.DealIDs, 0, minerInfos[i].presealExp, av) - if err != nil { - return cid.Undef, xerrors.Errorf("getting deal weight: %w", err) - } - - sectorWeight := builtin.QAPowerForWeight(m.SectorSize, minerInfos[i].presealExp, dweight, vdweight) + sectorWeight := minerInfos[i].sectorWeight[pi] // we've added fake power for this sector above, remove it now @@ -442,14 +432,13 @@ func SetupStorageMiners(ctx context.Context, cs *store.ChainStore, sys vm.Syscal return cid.Undef, xerrors.Errorf("getting current total power: %w", err) } - pcd := miner0.PreCommitDepositForPower((*smoothing0.FilterEstimate)(&rewardSmoothed), tpow.QualityAdjPowerSmoothed, sectorWeight) + pcd := miner9.PreCommitDepositForPower(smoothing9.FilterEstimate(rewardSmoothed), smoothing9.FilterEstimate(*tpow.QualityAdjPowerSmoothed), miner9.QAPowerMax(m.SectorSize)) - pledge := miner0.InitialPledgeForPower( + pledge := miner9.InitialPledgeForPower( sectorWeight, baselinePower, - tpow.PledgeCollateral, - (*smoothing0.FilterEstimate)(&rewardSmoothed), - tpow.QualityAdjPowerSmoothed, + smoothing9.FilterEstimate(rewardSmoothed), + smoothing9.FilterEstimate(*tpow.QualityAdjPowerSmoothed), big.Zero(), ) @@ -617,7 +606,7 @@ func currentTotalPower(ctx context.Context, vm vm.Interface, maddr address.Addre return &pwr, nil } -func dealWeight(ctx context.Context, vm vm.Interface, maddr address.Address, dealIDs []abi.DealID, sectorStart, sectorExpiry abi.ChainEpoch, av actorstypes.Version) (abi.DealWeight, abi.DealWeight, error) { +func dealWeight(ctx context.Context, vm vm.Interface, maddr address.Address, spt abi.RegisteredSealProof, dealIDs []abi.DealID, sectorStart, sectorExpiry abi.ChainEpoch, av actorstypes.Version) (abi.DealWeight, abi.DealWeight, error) { // TODO: This hack should move to market actor wrapper if av <= actorstypes.Version2 { params := &market0.VerifyDealsForActivationParams{ @@ -654,27 +643,54 @@ func dealWeight(ctx context.Context, vm vm.Interface, maddr address.Address, dea return weight, verifiedWeight, nil } - params := &market4.VerifyDealsForActivationParams{Sectors: []market4.SectorDeals{{ - SectorExpiry: sectorExpiry, - DealIDs: dealIDs, - }}} - var dealWeights market4.VerifyDealsForActivationReturn + if av < actorstypes.Version9 { + params := &market4.VerifyDealsForActivationParams{Sectors: []market4.SectorDeals{{ + SectorExpiry: sectorExpiry, + DealIDs: dealIDs, + }}} + paramEnc := mustEnc(params) + + var dealWeights market4.VerifyDealsForActivationReturn + ret, err := doExecValue(ctx, vm, + market.Address, + maddr, + abi.NewTokenAmount(0), + market.Methods.VerifyDealsForActivation, + paramEnc, + ) + if err != nil { + return big.Zero(), big.Zero(), err + } + if err := dealWeights.UnmarshalCBOR(bytes.NewReader(ret)); err != nil { + return big.Zero(), big.Zero(), err + } + + return dealWeights.Sectors[0].DealWeight, dealWeights.Sectors[0].VerifiedDealWeight, nil + + } + + params := &market9.ActivateDealsParams{ + DealIDs: dealIDs, + SectorExpiry: sectorExpiry} + paramEnc := mustEnc(params) + + var dealWeights market9.ActivateDealsResult ret, err := doExecValue(ctx, vm, market.Address, maddr, abi.NewTokenAmount(0), - market.Methods.VerifyDealsForActivation, - mustEnc(params), + market.Methods.ActivateDeals, + paramEnc, ) if err != nil { - return big.Zero(), big.Zero(), err + return big.Zero(), big.Zero(), xerrors.Errorf("failed to activate deals: %w", err) } - if err := dealWeights.UnmarshalCBOR(bytes.NewReader(ret)); err != nil { + if err := dealWeights.UnmarshalCBOR(bytes.NewReader(ret)); xerrors.Errorf("failed to unmarshal ret: %w", err) != nil { return big.Zero(), big.Zero(), err } - return dealWeights.Sectors[0].DealWeight, dealWeights.Sectors[0].VerifiedDealWeight, nil + return dealWeights.Weights.DealWeight, dealWeights.Weights.VerifiedDealWeight, nil } func currentEpochBlockReward(ctx context.Context, vm vm.Interface, maddr address.Address, av actorstypes.Version) (abi.StoragePower, builtin.FilterEstimate, error) { diff --git a/extern/filecoin-ffi b/extern/filecoin-ffi index f997fe6c7..b3185c5fb 160000 --- a/extern/filecoin-ffi +++ b/extern/filecoin-ffi @@ -1 +1 @@ -Subproject commit f997fe6c77632c0bc58d0b1fdf53ee7a93f6027c +Subproject commit b3185c5fbe05a1032fde707fee2f95ef117461d0 diff --git a/go.mod b/go.mod index fb9e4c589..71c758244 100644 --- a/go.mod +++ b/go.mod @@ -42,7 +42,7 @@ require ( github.com/filecoin-project/go-legs v0.4.4 github.com/filecoin-project/go-padreader v0.0.1 github.com/filecoin-project/go-paramfetch v0.0.4 - github.com/filecoin-project/go-state-types v0.1.12-0.20220907205406-e8b028ad923f + github.com/filecoin-project/go-state-types v0.1.12-0.20220909195146-6740cdd9390d github.com/filecoin-project/go-statemachine v1.0.2 github.com/filecoin-project/go-statestore v0.2.0 github.com/filecoin-project/go-storedcounter v0.1.0 diff --git a/go.sum b/go.sum index 3fd51d139..fe63fe3d2 100644 --- a/go.sum +++ b/go.sum @@ -343,8 +343,12 @@ github.com/filecoin-project/go-state-types v0.1.0/go.mod h1:ezYnPf0bNkTsDibL/psS github.com/filecoin-project/go-state-types v0.1.6/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q= github.com/filecoin-project/go-state-types v0.1.8/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q= github.com/filecoin-project/go-state-types v0.1.10/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q= -github.com/filecoin-project/go-state-types v0.1.12-0.20220907205406-e8b028ad923f h1:khCYaU4ieUwhWiRncmGBBI21wXhVF1xaGSgw7Pwcvmw= -github.com/filecoin-project/go-state-types v0.1.12-0.20220907205406-e8b028ad923f/go.mod h1:n/kujdC9JphvYTrmaD1+vJpvDPy/DwzckoMzP0nBKWI= +github.com/filecoin-project/go-state-types v0.1.12-0.20220909165003-f4ad1a59d916 h1:30E8Wwpe17E816LVRZeeN4QLklGpVO2v+1tGXuQx1Ps= +github.com/filecoin-project/go-state-types v0.1.12-0.20220909165003-f4ad1a59d916/go.mod h1:n/kujdC9JphvYTrmaD1+vJpvDPy/DwzckoMzP0nBKWI= +github.com/filecoin-project/go-state-types v0.1.12-0.20220909170026-395c37ab732c h1:+QMHpDZ0Zhc1K1nAUg+S2Cm1muEJhGa8N8Nx2tL2Rcc= +github.com/filecoin-project/go-state-types v0.1.12-0.20220909170026-395c37ab732c/go.mod h1:n/kujdC9JphvYTrmaD1+vJpvDPy/DwzckoMzP0nBKWI= +github.com/filecoin-project/go-state-types v0.1.12-0.20220909195146-6740cdd9390d h1:r1uMayyVGBNZv2WPWEG6Qy7PUmjX8H+tFQnHjCOjwmM= +github.com/filecoin-project/go-state-types v0.1.12-0.20220909195146-6740cdd9390d/go.mod h1:n/kujdC9JphvYTrmaD1+vJpvDPy/DwzckoMzP0nBKWI= github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig= github.com/filecoin-project/go-statemachine v1.0.2 h1:421SSWBk8GIoCoWYYTE/d+qCWccgmRH0uXotXRDjUbc= github.com/filecoin-project/go-statemachine v1.0.2/go.mod h1:jZdXXiHa61n4NmgWFG4w8tnqgvZVHYbJ3yW7+y8bF54= From 92cc24fca208541590e223e736a045e14a0a69d9 Mon Sep 17 00:00:00 2001 From: Aayush Date: Fri, 9 Sep 2022 16:26:55 -0400 Subject: [PATCH 112/185] support fvm gas tracing --- api/cbor_gen.go | 7 +- chain/exchange/cbor_gen.go | 3 +- chain/types/cbor_gen.go | 7 +- chain/vm/cbor_gen.go | 222 ++++++++++++++++++++++++++++++++++++- chain/vm/fvm.go | 29 ++++- gen/main.go | 1 + node/hello/cbor_gen.go | 3 +- paychmgr/cbor_gen.go | 5 +- storage/sealer/cbor_gen.go | 3 +- 9 files changed, 254 insertions(+), 26 deletions(-) diff --git a/api/cbor_gen.go b/api/cbor_gen.go index 66655fd75..40982779e 100644 --- a/api/cbor_gen.go +++ b/api/cbor_gen.go @@ -8,13 +8,12 @@ import ( "math" "sort" - cid "github.com/ipfs/go-cid" - cbg "github.com/whyrusleeping/cbor-gen" - xerrors "golang.org/x/xerrors" - abi "github.com/filecoin-project/go-state-types/abi" market "github.com/filecoin-project/go-state-types/builtin/v8/market" paych "github.com/filecoin-project/go-state-types/builtin/v8/paych" + cid "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + xerrors "golang.org/x/xerrors" ) var _ = xerrors.Errorf diff --git a/chain/exchange/cbor_gen.go b/chain/exchange/cbor_gen.go index d1eb271e9..9c7f68ab8 100644 --- a/chain/exchange/cbor_gen.go +++ b/chain/exchange/cbor_gen.go @@ -8,11 +8,10 @@ import ( "math" "sort" + types "github.com/filecoin-project/lotus/chain/types" cid "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" xerrors "golang.org/x/xerrors" - - types "github.com/filecoin-project/lotus/chain/types" ) var _ = xerrors.Errorf diff --git a/chain/types/cbor_gen.go b/chain/types/cbor_gen.go index 78a3449ee..79ff5d19c 100644 --- a/chain/types/cbor_gen.go +++ b/chain/types/cbor_gen.go @@ -8,14 +8,13 @@ import ( "math" "sort" - cid "github.com/ipfs/go-cid" - cbg "github.com/whyrusleeping/cbor-gen" - xerrors "golang.org/x/xerrors" - abi "github.com/filecoin-project/go-state-types/abi" crypto "github.com/filecoin-project/go-state-types/crypto" exitcode "github.com/filecoin-project/go-state-types/exitcode" proof "github.com/filecoin-project/go-state-types/proof" + cid "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + xerrors "golang.org/x/xerrors" ) var _ = xerrors.Errorf diff --git a/chain/vm/cbor_gen.go b/chain/vm/cbor_gen.go index 64b623f63..804d9fe4b 100644 --- a/chain/vm/cbor_gen.go +++ b/chain/vm/cbor_gen.go @@ -8,11 +8,10 @@ import ( "math" "sort" + types "github.com/filecoin-project/lotus/chain/types" cid "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" xerrors "golang.org/x/xerrors" - - types "github.com/filecoin-project/lotus/chain/types" ) var _ = xerrors.Errorf @@ -20,7 +19,7 @@ var _ = cid.Undef var _ = math.E var _ = sort.Sort -var lengthBufFvmExecutionTrace = []byte{132} +var lengthBufFvmExecutionTrace = []byte{133} func (t *FvmExecutionTrace) MarshalCBOR(w io.Writer) error { if t == nil { @@ -56,6 +55,20 @@ func (t *FvmExecutionTrace) MarshalCBOR(w io.Writer) error { return err } + // t.GasCharges ([]vm.FvmGasCharge) (slice) + if len(t.GasCharges) > cbg.MaxLength { + return xerrors.Errorf("Slice value in field t.GasCharges was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajArray, uint64(len(t.GasCharges))); err != nil { + return err + } + for _, v := range t.GasCharges { + if err := v.MarshalCBOR(cw); err != nil { + return err + } + } + // t.Subcalls ([]vm.FvmExecutionTrace) (slice) if len(t.Subcalls) > cbg.MaxLength { return xerrors.Errorf("Slice value in field t.Subcalls was too long") @@ -91,7 +104,7 @@ func (t *FvmExecutionTrace) UnmarshalCBOR(r io.Reader) (err error) { return fmt.Errorf("cbor input should be of type array") } - if extra != 4 { + if extra != 5 { return fmt.Errorf("cbor input had wrong number of fields") } @@ -143,6 +156,35 @@ func (t *FvmExecutionTrace) UnmarshalCBOR(r io.Reader) (err error) { t.Error = string(sval) } + // t.GasCharges ([]vm.FvmGasCharge) (slice) + + maj, extra, err = cr.ReadHeader() + if err != nil { + return err + } + + if extra > cbg.MaxLength { + return fmt.Errorf("t.GasCharges: array too large (%d)", extra) + } + + if maj != cbg.MajArray { + return fmt.Errorf("expected cbor array") + } + + if extra > 0 { + t.GasCharges = make([]FvmGasCharge, extra) + } + + for i := 0; i < int(extra); i++ { + + var v FvmGasCharge + if err := v.UnmarshalCBOR(cr); err != nil { + return err + } + + t.GasCharges[i] = v + } + // t.Subcalls ([]vm.FvmExecutionTrace) (slice) maj, extra, err = cr.ReadHeader() @@ -174,3 +216,175 @@ func (t *FvmExecutionTrace) UnmarshalCBOR(r io.Reader) (err error) { return nil } + +var lengthBufFvmGasCharge = []byte{132} + +func (t *FvmGasCharge) MarshalCBOR(w io.Writer) error { + if t == nil { + _, err := w.Write(cbg.CborNull) + return err + } + + cw := cbg.NewCborWriter(w) + + if _, err := cw.Write(lengthBufFvmGasCharge); err != nil { + return err + } + + // t.Name (string) (string) + if len(t.Name) > cbg.MaxLength { + return xerrors.Errorf("Value in field t.Name was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len(t.Name))); err != nil { + return err + } + if _, err := io.WriteString(w, string(t.Name)); err != nil { + return err + } + + // t.TotalGas (int64) (int64) + if t.TotalGas >= 0 { + if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.TotalGas)); err != nil { + return err + } + } else { + if err := cw.WriteMajorTypeHeader(cbg.MajNegativeInt, uint64(-t.TotalGas-1)); err != nil { + return err + } + } + + // t.ComputeGas (int64) (int64) + if t.ComputeGas >= 0 { + if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.ComputeGas)); err != nil { + return err + } + } else { + if err := cw.WriteMajorTypeHeader(cbg.MajNegativeInt, uint64(-t.ComputeGas-1)); err != nil { + return err + } + } + + // t.StorageGas (int64) (int64) + if t.StorageGas >= 0 { + if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.StorageGas)); err != nil { + return err + } + } else { + if err := cw.WriteMajorTypeHeader(cbg.MajNegativeInt, uint64(-t.StorageGas-1)); err != nil { + return err + } + } + return nil +} + +func (t *FvmGasCharge) UnmarshalCBOR(r io.Reader) (err error) { + *t = FvmGasCharge{} + + cr := cbg.NewCborReader(r) + + maj, extra, err := cr.ReadHeader() + if err != nil { + return err + } + defer func() { + if err == io.EOF { + err = io.ErrUnexpectedEOF + } + }() + + if maj != cbg.MajArray { + return fmt.Errorf("cbor input should be of type array") + } + + if extra != 4 { + return fmt.Errorf("cbor input had wrong number of fields") + } + + // t.Name (string) (string) + + { + sval, err := cbg.ReadString(cr) + if err != nil { + return err + } + + t.Name = string(sval) + } + // t.TotalGas (int64) (int64) + { + maj, extra, err := cr.ReadHeader() + var extraI int64 + if err != nil { + return err + } + switch maj { + case cbg.MajUnsignedInt: + extraI = int64(extra) + if extraI < 0 { + return fmt.Errorf("int64 positive overflow") + } + case cbg.MajNegativeInt: + extraI = int64(extra) + if extraI < 0 { + return fmt.Errorf("int64 negative oveflow") + } + extraI = -1 - extraI + default: + return fmt.Errorf("wrong type for int64 field: %d", maj) + } + + t.TotalGas = int64(extraI) + } + // t.ComputeGas (int64) (int64) + { + maj, extra, err := cr.ReadHeader() + var extraI int64 + if err != nil { + return err + } + switch maj { + case cbg.MajUnsignedInt: + extraI = int64(extra) + if extraI < 0 { + return fmt.Errorf("int64 positive overflow") + } + case cbg.MajNegativeInt: + extraI = int64(extra) + if extraI < 0 { + return fmt.Errorf("int64 negative oveflow") + } + extraI = -1 - extraI + default: + return fmt.Errorf("wrong type for int64 field: %d", maj) + } + + t.ComputeGas = int64(extraI) + } + // t.StorageGas (int64) (int64) + { + maj, extra, err := cr.ReadHeader() + var extraI int64 + if err != nil { + return err + } + switch maj { + case cbg.MajUnsignedInt: + extraI = int64(extra) + if extraI < 0 { + return fmt.Errorf("int64 positive overflow") + } + case cbg.MajNegativeInt: + extraI = int64(extra) + if extraI < 0 { + return fmt.Errorf("int64 negative oveflow") + } + extraI = -1 - extraI + default: + return fmt.Errorf("wrong type for int64 field: %d", maj) + } + + t.StorageGas = int64(extraI) + } + return nil +} diff --git a/chain/vm/fvm.go b/chain/vm/fvm.go index a87aa0a51..10e6724ed 100644 --- a/chain/vm/fvm.go +++ b/chain/vm/fvm.go @@ -49,13 +49,20 @@ type FvmExtern struct { base cid.Cid } +type FvmGasCharge struct { + Name string + TotalGas int64 + ComputeGas int64 + StorageGas int64 +} + // This may eventually become identical to ExecutionTrace, but we can make incremental progress towards that type FvmExecutionTrace struct { - Msg *types.Message - MsgRct *types.MessageReceipt - Error string - - Subcalls []FvmExecutionTrace + Msg *types.Message + MsgRct *types.MessageReceipt + Error string + GasCharges []FvmGasCharge `cborgen:"maxlen=1000000000"` + Subcalls []FvmExecutionTrace `cborgen:"maxlen=1000000000"` } func (t *FvmExecutionTrace) ToExecutionTrace() types.ExecutionTrace { @@ -70,6 +77,18 @@ func (t *FvmExecutionTrace) ToExecutionTrace() types.ExecutionTrace { Subcalls: nil, // Should be nil when there are no subcalls for backwards compatibility } + if len(t.GasCharges) > 0 { + ret.GasCharges = make([]*types.GasTrace, len(t.GasCharges)) + for i, v := range t.GasCharges { + ret.GasCharges[i] = &types.GasTrace{ + Name: v.Name, + TotalGas: v.TotalGas, + ComputeGas: v.ComputeGas, + StorageGas: v.StorageGas, + } + } + } + if len(t.Subcalls) > 0 { ret.Subcalls = make([]types.ExecutionTrace, len(t.Subcalls)) diff --git a/gen/main.go b/gen/main.go index fcb1d6dfa..e5fc2ed5f 100644 --- a/gen/main.go +++ b/gen/main.go @@ -41,6 +41,7 @@ func main() { err = gen.WriteTupleEncodersToFile("./chain/vm/cbor_gen.go", "vm", vm.FvmExecutionTrace{}, + vm.FvmGasCharge{}, ) if err != nil { fmt.Println(err) diff --git a/node/hello/cbor_gen.go b/node/hello/cbor_gen.go index 81a1774c1..68c82e2bb 100644 --- a/node/hello/cbor_gen.go +++ b/node/hello/cbor_gen.go @@ -8,11 +8,10 @@ import ( "math" "sort" + abi "github.com/filecoin-project/go-state-types/abi" cid "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" xerrors "golang.org/x/xerrors" - - abi "github.com/filecoin-project/go-state-types/abi" ) var _ = xerrors.Errorf diff --git a/paychmgr/cbor_gen.go b/paychmgr/cbor_gen.go index 78a55488e..450d526d8 100644 --- a/paychmgr/cbor_gen.go +++ b/paychmgr/cbor_gen.go @@ -8,12 +8,11 @@ import ( "math" "sort" + address "github.com/filecoin-project/go-address" + paych "github.com/filecoin-project/go-state-types/builtin/v8/paych" cid "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" xerrors "golang.org/x/xerrors" - - address "github.com/filecoin-project/go-address" - paych "github.com/filecoin-project/go-state-types/builtin/v8/paych" ) var _ = xerrors.Errorf diff --git a/storage/sealer/cbor_gen.go b/storage/sealer/cbor_gen.go index 48bf0146a..6db7d96a4 100644 --- a/storage/sealer/cbor_gen.go +++ b/storage/sealer/cbor_gen.go @@ -8,11 +8,10 @@ import ( "math" "sort" + sealtasks "github.com/filecoin-project/lotus/storage/sealer/sealtasks" cid "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" xerrors "golang.org/x/xerrors" - - sealtasks "github.com/filecoin-project/lotus/storage/sealer/sealtasks" ) var _ = xerrors.Errorf From c0bbaebaf412331baa6922813bb15053ac5ee5ab Mon Sep 17 00:00:00 2001 From: Aayush Date: Fri, 9 Sep 2022 16:42:55 -0400 Subject: [PATCH 113/185] more fixes --- api/cbor_gen.go | 7 +- chain/actors/builtin/registry.go | 140 +++++++++++++++ chain/actors/builtin/registry.go.template | 70 ++++++++ chain/exchange/cbor_gen.go | 3 +- chain/gen/genesis/miners.go | 99 +--------- chain/stmgr/utils.go | 4 +- chain/types/cbor_gen.go | 7 +- chain/vm/cbor_gen.go | 3 +- go.mod | 2 +- go.sum | 8 +- lotuspond/front/src/chain/methods.json | 210 ++++++++++++++++++++++ node/hello/cbor_gen.go | 3 +- paychmgr/cbor_gen.go | 5 +- storage/pipeline/precommit_batch.go | 10 +- storage/sealer/cbor_gen.go | 3 +- 15 files changed, 457 insertions(+), 117 deletions(-) diff --git a/api/cbor_gen.go b/api/cbor_gen.go index 40982779e..66655fd75 100644 --- a/api/cbor_gen.go +++ b/api/cbor_gen.go @@ -8,12 +8,13 @@ import ( "math" "sort" - abi "github.com/filecoin-project/go-state-types/abi" - market "github.com/filecoin-project/go-state-types/builtin/v8/market" - paych "github.com/filecoin-project/go-state-types/builtin/v8/paych" cid "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" xerrors "golang.org/x/xerrors" + + abi "github.com/filecoin-project/go-state-types/abi" + market "github.com/filecoin-project/go-state-types/builtin/v8/market" + paych "github.com/filecoin-project/go-state-types/builtin/v8/paych" ) var _ = xerrors.Errorf diff --git a/chain/actors/builtin/registry.go b/chain/actors/builtin/registry.go index d2384a1a0..a51ef6245 100644 --- a/chain/actors/builtin/registry.go +++ b/chain/actors/builtin/registry.go @@ -5,7 +5,27 @@ import ( actorstypes "github.com/filecoin-project/go-state-types/actors" account8 "github.com/filecoin-project/go-state-types/builtin/v8/account" + cron8 "github.com/filecoin-project/go-state-types/builtin/v8/cron" + _init8 "github.com/filecoin-project/go-state-types/builtin/v8/init" + market8 "github.com/filecoin-project/go-state-types/builtin/v8/market" + miner8 "github.com/filecoin-project/go-state-types/builtin/v8/miner" + multisig8 "github.com/filecoin-project/go-state-types/builtin/v8/multisig" + paych8 "github.com/filecoin-project/go-state-types/builtin/v8/paych" + power8 "github.com/filecoin-project/go-state-types/builtin/v8/power" + reward8 "github.com/filecoin-project/go-state-types/builtin/v8/reward" + system8 "github.com/filecoin-project/go-state-types/builtin/v8/system" + verifreg8 "github.com/filecoin-project/go-state-types/builtin/v8/verifreg" account9 "github.com/filecoin-project/go-state-types/builtin/v9/account" + cron9 "github.com/filecoin-project/go-state-types/builtin/v9/cron" + _init9 "github.com/filecoin-project/go-state-types/builtin/v9/init" + market9 "github.com/filecoin-project/go-state-types/builtin/v9/market" + miner9 "github.com/filecoin-project/go-state-types/builtin/v9/miner" + multisig9 "github.com/filecoin-project/go-state-types/builtin/v9/multisig" + paych9 "github.com/filecoin-project/go-state-types/builtin/v9/paych" + power9 "github.com/filecoin-project/go-state-types/builtin/v9/power" + reward9 "github.com/filecoin-project/go-state-types/builtin/v9/reward" + system9 "github.com/filecoin-project/go-state-types/builtin/v9/system" + verifreg9 "github.com/filecoin-project/go-state-types/builtin/v9/verifreg" "github.com/filecoin-project/go-state-types/cbor" rtt "github.com/filecoin-project/go-state-types/rt" @@ -54,6 +74,66 @@ func MakeRegistry(av actorstypes.Version) []rtt.VMActor { methods: account8.Methods, state: new(account8.State), }) + case actors.CronKey: + registry = append(registry, RegistryEntry{ + code: codeID, + methods: cron8.Methods, + state: new(cron8.State), + }) + case actors.InitKey: + registry = append(registry, RegistryEntry{ + code: codeID, + methods: _init8.Methods, + state: new(_init8.State), + }) + case actors.MarketKey: + registry = append(registry, RegistryEntry{ + code: codeID, + methods: market8.Methods, + state: new(market8.State), + }) + case actors.MinerKey: + registry = append(registry, RegistryEntry{ + code: codeID, + methods: miner8.Methods, + state: new(miner8.State), + }) + case actors.MultisigKey: + registry = append(registry, RegistryEntry{ + code: codeID, + methods: multisig8.Methods, + state: new(multisig8.State), + }) + case actors.PaychKey: + registry = append(registry, RegistryEntry{ + code: codeID, + methods: paych8.Methods, + state: new(paych8.State), + }) + case actors.PowerKey: + registry = append(registry, RegistryEntry{ + code: codeID, + methods: power8.Methods, + state: new(power8.State), + }) + case actors.RewardKey: + registry = append(registry, RegistryEntry{ + code: codeID, + methods: reward8.Methods, + state: new(reward8.State), + }) + case actors.SystemKey: + registry = append(registry, RegistryEntry{ + code: codeID, + methods: system8.Methods, + state: new(system8.State), + }) + case actors.VerifregKey: + registry = append(registry, RegistryEntry{ + code: codeID, + methods: verifreg8.Methods, + state: new(verifreg8.State), + }) } } @@ -66,6 +146,66 @@ func MakeRegistry(av actorstypes.Version) []rtt.VMActor { methods: account9.Methods, state: new(account9.State), }) + case actors.CronKey: + registry = append(registry, RegistryEntry{ + code: codeID, + methods: cron9.Methods, + state: new(cron9.State), + }) + case actors.InitKey: + registry = append(registry, RegistryEntry{ + code: codeID, + methods: _init9.Methods, + state: new(_init9.State), + }) + case actors.MarketKey: + registry = append(registry, RegistryEntry{ + code: codeID, + methods: market9.Methods, + state: new(market9.State), + }) + case actors.MinerKey: + registry = append(registry, RegistryEntry{ + code: codeID, + methods: miner9.Methods, + state: new(miner9.State), + }) + case actors.MultisigKey: + registry = append(registry, RegistryEntry{ + code: codeID, + methods: multisig9.Methods, + state: new(multisig9.State), + }) + case actors.PaychKey: + registry = append(registry, RegistryEntry{ + code: codeID, + methods: paych9.Methods, + state: new(paych9.State), + }) + case actors.PowerKey: + registry = append(registry, RegistryEntry{ + code: codeID, + methods: power9.Methods, + state: new(power9.State), + }) + case actors.RewardKey: + registry = append(registry, RegistryEntry{ + code: codeID, + methods: reward9.Methods, + state: new(reward9.State), + }) + case actors.SystemKey: + registry = append(registry, RegistryEntry{ + code: codeID, + methods: system9.Methods, + state: new(system9.State), + }) + case actors.VerifregKey: + registry = append(registry, RegistryEntry{ + code: codeID, + methods: verifreg9.Methods, + state: new(verifreg9.State), + }) } } diff --git a/chain/actors/builtin/registry.go.template b/chain/actors/builtin/registry.go.template index 56a177330..ec6d5b633 100644 --- a/chain/actors/builtin/registry.go.template +++ b/chain/actors/builtin/registry.go.template @@ -6,6 +6,16 @@ import ( {{range .versions}} {{if (ge . 8)}} account{{.}} "github.com/filecoin-project/go-state-types/builtin/v{{.}}/account" + cron{{.}} "github.com/filecoin-project/go-state-types/builtin/v{{.}}/cron" + _init{{.}} "github.com/filecoin-project/go-state-types/builtin/v{{.}}/init" + multisig{{.}} "github.com/filecoin-project/go-state-types/builtin/v{{.}}/multisig" + miner{{.}} "github.com/filecoin-project/go-state-types/builtin/v{{.}}/miner" + market{{.}} "github.com/filecoin-project/go-state-types/builtin/v{{.}}/market" + reward{{.}} "github.com/filecoin-project/go-state-types/builtin/v{{.}}/reward" + paych{{.}} "github.com/filecoin-project/go-state-types/builtin/v{{.}}/paych" + power{{.}} "github.com/filecoin-project/go-state-types/builtin/v{{.}}/power" + system{{.}} "github.com/filecoin-project/go-state-types/builtin/v{{.}}/system" + verifreg{{.}} "github.com/filecoin-project/go-state-types/builtin/v{{.}}/verifreg" {{end}} {{end}} "github.com/filecoin-project/go-state-types/cbor" @@ -56,6 +66,66 @@ func MakeRegistry(av actorstypes.Version) []rtt.VMActor { methods: account{{.}}.Methods, state: new(account{{.}}.State), }) + case actors.CronKey: + registry = append(registry, RegistryEntry{ + code: codeID, + methods: cron{{.}}.Methods, + state: new(cron{{.}}.State), + }) + case actors.InitKey: + registry = append(registry, RegistryEntry{ + code: codeID, + methods: _init{{.}}.Methods, + state: new(_init{{.}}.State), + }) + case actors.MarketKey: + registry = append(registry, RegistryEntry{ + code: codeID, + methods: market{{.}}.Methods, + state: new(market{{.}}.State), + }) + case actors.MinerKey: + registry = append(registry, RegistryEntry{ + code: codeID, + methods: miner{{.}}.Methods, + state: new(miner{{.}}.State), + }) + case actors.MultisigKey: + registry = append(registry, RegistryEntry{ + code: codeID, + methods: multisig{{.}}.Methods, + state: new(multisig{{.}}.State), + }) + case actors.PaychKey: + registry = append(registry, RegistryEntry{ + code: codeID, + methods: paych{{.}}.Methods, + state: new(paych{{.}}.State), + }) + case actors.PowerKey: + registry = append(registry, RegistryEntry{ + code: codeID, + methods: power{{.}}.Methods, + state: new(power{{.}}.State), + }) + case actors.RewardKey: + registry = append(registry, RegistryEntry{ + code: codeID, + methods: reward{{.}}.Methods, + state: new(reward{{.}}.State), + }) + case actors.SystemKey: + registry = append(registry, RegistryEntry{ + code: codeID, + methods: system{{.}}.Methods, + state: new(system{{.}}.State), + }) + case actors.VerifregKey: + registry = append(registry, RegistryEntry{ + code: codeID, + methods: verifreg{{.}}.Methods, + state: new(verifreg{{.}}.State), + }) } } {{end}} diff --git a/chain/exchange/cbor_gen.go b/chain/exchange/cbor_gen.go index 9c7f68ab8..d1eb271e9 100644 --- a/chain/exchange/cbor_gen.go +++ b/chain/exchange/cbor_gen.go @@ -8,10 +8,11 @@ import ( "math" "sort" - types "github.com/filecoin-project/lotus/chain/types" cid "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" xerrors "golang.org/x/xerrors" + + types "github.com/filecoin-project/lotus/chain/types" ) var _ = xerrors.Errorf diff --git a/chain/gen/genesis/miners.go b/chain/gen/genesis/miners.go index e74934cc9..55156fda6 100644 --- a/chain/gen/genesis/miners.go +++ b/chain/gen/genesis/miners.go @@ -6,12 +6,6 @@ import ( "fmt" "math/rand" - smoothing9 "github.com/filecoin-project/go-state-types/builtin/v9/util/smoothing" - - miner9 "github.com/filecoin-project/go-state-types/builtin/v9/miner" - - market9 "github.com/filecoin-project/go-state-types/builtin/v9/market" - "github.com/ipfs/go-cid" cbor "github.com/ipfs/go-ipld-cbor" cbg "github.com/whyrusleeping/cbor-gen" @@ -25,16 +19,15 @@ import ( builtintypes "github.com/filecoin-project/go-state-types/builtin" markettypes "github.com/filecoin-project/go-state-types/builtin/v8/market" minertypes "github.com/filecoin-project/go-state-types/builtin/v8/miner" + miner9 "github.com/filecoin-project/go-state-types/builtin/v9/miner" + smoothing9 "github.com/filecoin-project/go-state-types/builtin/v9/util/smoothing" "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/go-state-types/network" builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" - market0 "github.com/filecoin-project/specs-actors/actors/builtin/market" miner0 "github.com/filecoin-project/specs-actors/actors/builtin/miner" power0 "github.com/filecoin-project/specs-actors/actors/builtin/power" reward0 "github.com/filecoin-project/specs-actors/actors/builtin/reward" - market2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/market" reward2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/reward" - market4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/market" power4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/power" reward4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/reward" builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" @@ -280,6 +273,7 @@ func SetupStorageMiners(ctx context.Context, cs *store.ChainStore, sys vm.Syscal } } + { nh, err := genesisVm.Flush(ctx) if err != nil { return cid.Undef, xerrors.Errorf("flushing vm: %w", err) @@ -606,93 +600,6 @@ func currentTotalPower(ctx context.Context, vm vm.Interface, maddr address.Addre return &pwr, nil } -func dealWeight(ctx context.Context, vm vm.Interface, maddr address.Address, spt abi.RegisteredSealProof, dealIDs []abi.DealID, sectorStart, sectorExpiry abi.ChainEpoch, av actorstypes.Version) (abi.DealWeight, abi.DealWeight, error) { - // TODO: This hack should move to market actor wrapper - if av <= actorstypes.Version2 { - params := &market0.VerifyDealsForActivationParams{ - DealIDs: dealIDs, - SectorStart: sectorStart, - SectorExpiry: sectorExpiry, - } - - ret, err := doExecValue(ctx, vm, - market.Address, - maddr, - abi.NewTokenAmount(0), - builtin0.MethodsMarket.VerifyDealsForActivation, - mustEnc(params), - ) - if err != nil { - return big.Zero(), big.Zero(), err - } - var weight, verifiedWeight abi.DealWeight - if av < actorstypes.Version2 { - var dealWeights market0.VerifyDealsForActivationReturn - err = dealWeights.UnmarshalCBOR(bytes.NewReader(ret)) - weight = dealWeights.DealWeight - verifiedWeight = dealWeights.VerifiedDealWeight - } else { - var dealWeights market2.VerifyDealsForActivationReturn - err = dealWeights.UnmarshalCBOR(bytes.NewReader(ret)) - weight = dealWeights.DealWeight - verifiedWeight = dealWeights.VerifiedDealWeight - } - if err != nil { - return big.Zero(), big.Zero(), err - } - - return weight, verifiedWeight, nil - } - - if av < actorstypes.Version9 { - params := &market4.VerifyDealsForActivationParams{Sectors: []market4.SectorDeals{{ - SectorExpiry: sectorExpiry, - DealIDs: dealIDs, - }}} - paramEnc := mustEnc(params) - - var dealWeights market4.VerifyDealsForActivationReturn - ret, err := doExecValue(ctx, vm, - market.Address, - maddr, - abi.NewTokenAmount(0), - market.Methods.VerifyDealsForActivation, - paramEnc, - ) - if err != nil { - return big.Zero(), big.Zero(), err - } - if err := dealWeights.UnmarshalCBOR(bytes.NewReader(ret)); err != nil { - return big.Zero(), big.Zero(), err - } - - return dealWeights.Sectors[0].DealWeight, dealWeights.Sectors[0].VerifiedDealWeight, nil - - } - - params := &market9.ActivateDealsParams{ - DealIDs: dealIDs, - SectorExpiry: sectorExpiry} - paramEnc := mustEnc(params) - - var dealWeights market9.ActivateDealsResult - ret, err := doExecValue(ctx, vm, - market.Address, - maddr, - abi.NewTokenAmount(0), - market.Methods.ActivateDeals, - paramEnc, - ) - if err != nil { - return big.Zero(), big.Zero(), xerrors.Errorf("failed to activate deals: %w", err) - } - if err := dealWeights.UnmarshalCBOR(bytes.NewReader(ret)); xerrors.Errorf("failed to unmarshal ret: %w", err) != nil { - return big.Zero(), big.Zero(), err - } - - return dealWeights.Weights.DealWeight, dealWeights.Weights.VerifiedDealWeight, nil -} - func currentEpochBlockReward(ctx context.Context, vm vm.Interface, maddr address.Address, av actorstypes.Version) (abi.StoragePower, builtin.FilterEstimate, error) { rwret, err := doExecValue(ctx, vm, reward.Address, maddr, big.Zero(), reward.Methods.ThisEpochReward, nil) if err != nil { diff --git a/chain/stmgr/utils.go b/chain/stmgr/utils.go index 9e7a08ba7..03ade3bd2 100644 --- a/chain/stmgr/utils.go +++ b/chain/stmgr/utils.go @@ -30,13 +30,15 @@ import ( func GetReturnType(ctx context.Context, sm *StateManager, to address.Address, method abi.MethodNum, ts *types.TipSet) (cbg.CBORUnmarshaler, error) { act, err := sm.LoadActor(ctx, to, ts) if err != nil { - return nil, xerrors.Errorf("(get sset) failed to load miner actor: %w", err) + return nil, xerrors.Errorf("(get sset) failed to load actor: %w", err) } m, found := sm.tsExec.NewActorRegistry().Methods[act.Code][method] if !found { return nil, fmt.Errorf("unknown method %d for actor %s", method, act.Code) } + + fmt.Println("found ", m.Ret, " and ", m.Params, " for ", m.Num) return reflect.New(m.Ret.Elem()).Interface().(cbg.CBORUnmarshaler), nil } diff --git a/chain/types/cbor_gen.go b/chain/types/cbor_gen.go index 79ff5d19c..78a3449ee 100644 --- a/chain/types/cbor_gen.go +++ b/chain/types/cbor_gen.go @@ -8,13 +8,14 @@ import ( "math" "sort" + cid "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + xerrors "golang.org/x/xerrors" + abi "github.com/filecoin-project/go-state-types/abi" crypto "github.com/filecoin-project/go-state-types/crypto" exitcode "github.com/filecoin-project/go-state-types/exitcode" proof "github.com/filecoin-project/go-state-types/proof" - cid "github.com/ipfs/go-cid" - cbg "github.com/whyrusleeping/cbor-gen" - xerrors "golang.org/x/xerrors" ) var _ = xerrors.Errorf diff --git a/chain/vm/cbor_gen.go b/chain/vm/cbor_gen.go index 804d9fe4b..c2bb4fa79 100644 --- a/chain/vm/cbor_gen.go +++ b/chain/vm/cbor_gen.go @@ -8,10 +8,11 @@ import ( "math" "sort" - types "github.com/filecoin-project/lotus/chain/types" cid "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" xerrors "golang.org/x/xerrors" + + types "github.com/filecoin-project/lotus/chain/types" ) var _ = xerrors.Errorf diff --git a/go.mod b/go.mod index 71c758244..e20d246c5 100644 --- a/go.mod +++ b/go.mod @@ -42,7 +42,7 @@ require ( github.com/filecoin-project/go-legs v0.4.4 github.com/filecoin-project/go-padreader v0.0.1 github.com/filecoin-project/go-paramfetch v0.0.4 - github.com/filecoin-project/go-state-types v0.1.12-0.20220909195146-6740cdd9390d + github.com/filecoin-project/go-state-types v0.1.12-0.20220909210634-916a5a14a31b github.com/filecoin-project/go-statemachine v1.0.2 github.com/filecoin-project/go-statestore v0.2.0 github.com/filecoin-project/go-storedcounter v0.1.0 diff --git a/go.sum b/go.sum index fe63fe3d2..655957331 100644 --- a/go.sum +++ b/go.sum @@ -343,12 +343,8 @@ github.com/filecoin-project/go-state-types v0.1.0/go.mod h1:ezYnPf0bNkTsDibL/psS github.com/filecoin-project/go-state-types v0.1.6/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q= github.com/filecoin-project/go-state-types v0.1.8/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q= github.com/filecoin-project/go-state-types v0.1.10/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q= -github.com/filecoin-project/go-state-types v0.1.12-0.20220909165003-f4ad1a59d916 h1:30E8Wwpe17E816LVRZeeN4QLklGpVO2v+1tGXuQx1Ps= -github.com/filecoin-project/go-state-types v0.1.12-0.20220909165003-f4ad1a59d916/go.mod h1:n/kujdC9JphvYTrmaD1+vJpvDPy/DwzckoMzP0nBKWI= -github.com/filecoin-project/go-state-types v0.1.12-0.20220909170026-395c37ab732c h1:+QMHpDZ0Zhc1K1nAUg+S2Cm1muEJhGa8N8Nx2tL2Rcc= -github.com/filecoin-project/go-state-types v0.1.12-0.20220909170026-395c37ab732c/go.mod h1:n/kujdC9JphvYTrmaD1+vJpvDPy/DwzckoMzP0nBKWI= -github.com/filecoin-project/go-state-types v0.1.12-0.20220909195146-6740cdd9390d h1:r1uMayyVGBNZv2WPWEG6Qy7PUmjX8H+tFQnHjCOjwmM= -github.com/filecoin-project/go-state-types v0.1.12-0.20220909195146-6740cdd9390d/go.mod h1:n/kujdC9JphvYTrmaD1+vJpvDPy/DwzckoMzP0nBKWI= +github.com/filecoin-project/go-state-types v0.1.12-0.20220909210634-916a5a14a31b h1:Dd7R2JHJaXrNc1kZ+Z3PIUTEy5SRbQdw8YwGyWLLZn4= +github.com/filecoin-project/go-state-types v0.1.12-0.20220909210634-916a5a14a31b/go.mod h1:n/kujdC9JphvYTrmaD1+vJpvDPy/DwzckoMzP0nBKWI= github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig= github.com/filecoin-project/go-statemachine v1.0.2 h1:421SSWBk8GIoCoWYYTE/d+qCWccgmRH0uXotXRDjUbc= github.com/filecoin-project/go-statemachine v1.0.2/go.mod h1:jZdXXiHa61n4NmgWFG4w8tnqgvZVHYbJ3yW7+y8bF54= diff --git a/lotuspond/front/src/chain/methods.json b/lotuspond/front/src/chain/methods.json index f8fc1338d..d0127944e 100644 --- a/lotuspond/front/src/chain/methods.json +++ b/lotuspond/front/src/chain/methods.json @@ -736,10 +736,220 @@ "1", "2" ], + "fil/8/cron": [ + "0", + "1", + "2" + ], + "fil/8/init": [ + "0", + "1", + "2" + ], + "fil/8/multisig": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9" + ], + "fil/8/paymentchannel": [ + "0", + "1", + "2", + "3", + "4" + ], + "fil/8/reward": [ + "0", + "1", + "2", + "3", + "4" + ], + "fil/8/storagemarket": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9" + ], + "fil/8/storageminer": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15", + "16", + "17", + "18", + "19", + "20", + "21", + "22", + "23", + "24", + "25", + "26", + "27" + ], + "fil/8/storagepower": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "8", + "9" + ], + "fil/8/system": [ + "0", + "1" + ], + "fil/8/verifiedregistry": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7" + ], "fil/9/account": [ "0", "1", "2", "3" + ], + "fil/9/cron": [ + "0", + "1", + "2" + ], + "fil/9/init": [ + "0", + "1", + "2" + ], + "fil/9/multisig": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9" + ], + "fil/9/paymentchannel": [ + "0", + "1", + "2", + "3", + "4" + ], + "fil/9/reward": [ + "0", + "1", + "2", + "3", + "4" + ], + "fil/9/storagemarket": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9" + ], + "fil/9/storageminer": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15", + "16", + "17", + "18", + "19", + "20", + "21", + "22", + "23", + "24", + "25", + "26", + "27", + "28", + "29", + "30", + "31" + ], + "fil/9/storagepower": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "8", + "9" + ], + "fil/9/system": [ + "0", + "1" + ], + "fil/9/verifiedregistry": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7" ] } \ No newline at end of file diff --git a/node/hello/cbor_gen.go b/node/hello/cbor_gen.go index 68c82e2bb..81a1774c1 100644 --- a/node/hello/cbor_gen.go +++ b/node/hello/cbor_gen.go @@ -8,10 +8,11 @@ import ( "math" "sort" - abi "github.com/filecoin-project/go-state-types/abi" cid "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" xerrors "golang.org/x/xerrors" + + abi "github.com/filecoin-project/go-state-types/abi" ) var _ = xerrors.Errorf diff --git a/paychmgr/cbor_gen.go b/paychmgr/cbor_gen.go index 450d526d8..78a55488e 100644 --- a/paychmgr/cbor_gen.go +++ b/paychmgr/cbor_gen.go @@ -8,11 +8,12 @@ import ( "math" "sort" - address "github.com/filecoin-project/go-address" - paych "github.com/filecoin-project/go-state-types/builtin/v8/paych" cid "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" xerrors "golang.org/x/xerrors" + + address "github.com/filecoin-project/go-address" + paych "github.com/filecoin-project/go-state-types/builtin/v8/paych" ) var _ = xerrors.Errorf diff --git a/storage/pipeline/precommit_batch.go b/storage/pipeline/precommit_batch.go index 7f7ea8069..94b8d272f 100644 --- a/storage/pipeline/precommit_batch.go +++ b/storage/pipeline/precommit_batch.go @@ -281,9 +281,17 @@ func (b *PreCommitBatcher) processIndividually(cfg sealiface.Config) ([]sealifac } func (b *PreCommitBatcher) processSingle(cfg sealiface.Config, mi api.MinerInfo, avail *abi.TokenAmount, params *preCommitEntry) (cid.Cid, error) { + msgParams := miner.PreCommitSectorParams{ + SealProof: params.pci.SealProof, + SectorNumber: params.pci.SectorNumber, + SealedCID: params.pci.SealedCID, + SealRandEpoch: params.pci.SealRandEpoch, + DealIDs: params.pci.DealIDs, + Expiration: params.pci.Expiration, + } enc := new(bytes.Buffer) - if err := params.pci.MarshalCBOR(enc); err != nil { + if err := msgParams.MarshalCBOR(enc); err != nil { return cid.Undef, xerrors.Errorf("marshaling precommit params: %w", err) } diff --git a/storage/sealer/cbor_gen.go b/storage/sealer/cbor_gen.go index 6db7d96a4..48bf0146a 100644 --- a/storage/sealer/cbor_gen.go +++ b/storage/sealer/cbor_gen.go @@ -8,10 +8,11 @@ import ( "math" "sort" - sealtasks "github.com/filecoin-project/lotus/storage/sealer/sealtasks" cid "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" xerrors "golang.org/x/xerrors" + + sealtasks "github.com/filecoin-project/lotus/storage/sealer/sealtasks" ) var _ = xerrors.Errorf From 76090193ea774853a0775ae2357b07ec6ad65791 Mon Sep 17 00:00:00 2001 From: Aayush Date: Fri, 9 Sep 2022 21:40:03 -0400 Subject: [PATCH 114/185] Tweak StateMinerPreCommitDepositForPower based on network version --- node/impl/full/state.go | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/node/impl/full/state.go b/node/impl/full/state.go index 97308dcc9..1c062d6d6 100644 --- a/node/impl/full/state.go +++ b/node/impl/full/state.go @@ -1186,16 +1186,20 @@ func (a *StateAPI) StateMinerPreCommitDepositForPower(ctx context.Context, maddr store := a.Chain.ActorStore(ctx) var sectorWeight abi.StoragePower - if act, err := state.GetActor(market.Address); err != nil { - return types.EmptyInt, xerrors.Errorf("loading market actor %s: %w", maddr, err) - } else if s, err := market.Load(store, act); err != nil { - return types.EmptyInt, xerrors.Errorf("loading market actor state %s: %w", maddr, err) - } else if w, vw, err := s.VerifyDealsForActivation(maddr, pci.DealIDs, ts.Height(), pci.Expiration); err != nil { - return types.EmptyInt, xerrors.Errorf("verifying deals for activation: %w", err) + if a.StateManager.GetNetworkVersion(ctx, ts.Height()) <= network.Version16 { + if act, err := state.GetActor(market.Address); err != nil { + return types.EmptyInt, xerrors.Errorf("loading market actor %s: %w", maddr, err) + } else if s, err := market.Load(store, act); err != nil { + return types.EmptyInt, xerrors.Errorf("loading market actor state %s: %w", maddr, err) + } else if w, vw, err := s.VerifyDealsForActivation(maddr, pci.DealIDs, ts.Height(), pci.Expiration); err != nil { + return types.EmptyInt, xerrors.Errorf("verifying deals for activation: %w", err) + } else { + // NB: not exactly accurate, but should always lead us to *over* estimate, not under + duration := pci.Expiration - ts.Height() + sectorWeight = builtin.QAPowerForWeight(ssize, duration, w, vw) + } } else { - // NB: not exactly accurate, but should always lead us to *over* estimate, not under - duration := pci.Expiration - ts.Height() - sectorWeight = builtin.QAPowerForWeight(ssize, duration, w, vw) + sectorWeight = minertypes.QAPowerMax(ssize) } var powerSmoothed builtin.FilterEstimate From 19c3232d2feea2cdbe87de449c4dd3b660883fbb Mon Sep 17 00:00:00 2001 From: Aayush Date: Sat, 10 Sep 2022 10:34:47 -0400 Subject: [PATCH 115/185] more fixes --- chain/actors/agen/main.go | 2 +- .../builtin/multisig/message.go.template | 6 ++-- chain/actors/builtin/multisig/message0.go | 4 +-- chain/actors/builtin/multisig/message2.go | 4 +-- chain/actors/builtin/multisig/message3.go | 4 +-- chain/actors/builtin/multisig/message4.go | 4 +-- chain/actors/builtin/multisig/message5.go | 4 +-- chain/actors/builtin/multisig/message6.go | 4 +-- chain/actors/builtin/multisig/message7.go | 4 +-- chain/actors/builtin/multisig/message8.go | 4 +-- chain/actors/builtin/multisig/message9.go | 4 +-- chain/gen/genesis/miners.go | 2 +- cli/chain_test.go | 3 +- cli/filplus.go | 33 ++++++++++++++----- extern/filecoin-ffi | 2 +- itests/deadlines_test.go | 2 +- itests/multisig/suite.go | 2 -- itests/verifreg_test.go | 4 +-- .../ondealsectorcommitted_test.go | 6 ++-- storage/pipeline/precommit_batch.go | 22 +++---------- storage/pipeline/states_sealing.go | 20 ++++++----- storage/pipeline/utils.go | 12 +++++++ 22 files changed, 83 insertions(+), 69 deletions(-) diff --git a/chain/actors/agen/main.go b/chain/actors/agen/main.go index bb2ca8bd3..6797a5ba5 100644 --- a/chain/actors/agen/main.go +++ b/chain/actors/agen/main.go @@ -231,7 +231,7 @@ func generateRegistry(registryPath string) error { return nil // skip } - return xerrors.Errorf("loading builtin template file: %w", err) + return xerrors.Errorf("loading registry template file: %w", err) } tpl := template.Must(template.New("").Funcs(template.FuncMap{ diff --git a/chain/actors/builtin/multisig/message.go.template b/chain/actors/builtin/multisig/message.go.template index 84dd308f4..1e1559968 100644 --- a/chain/actors/builtin/multisig/message.go.template +++ b/chain/actors/builtin/multisig/message.go.template @@ -10,15 +10,13 @@ import ( builtin{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin" init{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin/init" multisig{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin/multisig" - builtin{{.latestVersion}} "github.com/filecoin-project/go-state-types/builtin" {{else}} actorstypes "github.com/filecoin-project/go-state-types/actors" multisig{{.v}} "github.com/filecoin-project/go-state-types/builtin{{.import}}multisig" init{{.latestVersion}} "github.com/filecoin-project/go-state-types/builtin/v{{.latestVersion}}/init" - builtin{{.latestVersion}} "github.com/filecoin-project/go-state-types/builtin" {{end}} - + builtintypes "github.com/filecoin-project/go-state-types/builtin" "github.com/filecoin-project/lotus/chain/actors" init_ "github.com/filecoin-project/lotus/chain/actors/builtin/init" "github.com/filecoin-project/lotus/chain/types" @@ -90,7 +88,7 @@ func (m message{{.v}}) Create( return &types.Message{ To: init_.Address, From: m.from, - Method: builtin{{.latestVersion}}.MethodsInit.Exec, + Method: builtintypes.MethodsInit.Exec, Params: enc, Value: initialAmount, }, nil diff --git a/chain/actors/builtin/multisig/message0.go b/chain/actors/builtin/multisig/message0.go index 1431b0366..7dbdf444c 100644 --- a/chain/actors/builtin/multisig/message0.go +++ b/chain/actors/builtin/multisig/message0.go @@ -5,7 +5,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - builtin9 "github.com/filecoin-project/go-state-types/builtin" + builtintypes "github.com/filecoin-project/go-state-types/builtin" builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" init0 "github.com/filecoin-project/specs-actors/actors/builtin/init" multisig0 "github.com/filecoin-project/specs-actors/actors/builtin/multisig" @@ -67,7 +67,7 @@ func (m message0) Create( return &types.Message{ To: init_.Address, From: m.from, - Method: builtin9.MethodsInit.Exec, + Method: builtintypes.MethodsInit.Exec, Params: enc, Value: initialAmount, }, nil diff --git a/chain/actors/builtin/multisig/message2.go b/chain/actors/builtin/multisig/message2.go index 5120ae0ee..91ad17b84 100644 --- a/chain/actors/builtin/multisig/message2.go +++ b/chain/actors/builtin/multisig/message2.go @@ -5,7 +5,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - builtin9 "github.com/filecoin-project/go-state-types/builtin" + builtintypes "github.com/filecoin-project/go-state-types/builtin" builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" init2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/init" multisig2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/multisig" @@ -64,7 +64,7 @@ func (m message2) Create( return &types.Message{ To: init_.Address, From: m.from, - Method: builtin9.MethodsInit.Exec, + Method: builtintypes.MethodsInit.Exec, Params: enc, Value: initialAmount, }, nil diff --git a/chain/actors/builtin/multisig/message3.go b/chain/actors/builtin/multisig/message3.go index 5194cbcd4..4124e00c8 100644 --- a/chain/actors/builtin/multisig/message3.go +++ b/chain/actors/builtin/multisig/message3.go @@ -5,7 +5,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - builtin9 "github.com/filecoin-project/go-state-types/builtin" + builtintypes "github.com/filecoin-project/go-state-types/builtin" builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" init3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/init" multisig3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/multisig" @@ -64,7 +64,7 @@ func (m message3) Create( return &types.Message{ To: init_.Address, From: m.from, - Method: builtin9.MethodsInit.Exec, + Method: builtintypes.MethodsInit.Exec, Params: enc, Value: initialAmount, }, nil diff --git a/chain/actors/builtin/multisig/message4.go b/chain/actors/builtin/multisig/message4.go index cbf3cd841..33449df75 100644 --- a/chain/actors/builtin/multisig/message4.go +++ b/chain/actors/builtin/multisig/message4.go @@ -5,7 +5,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - builtin9 "github.com/filecoin-project/go-state-types/builtin" + builtintypes "github.com/filecoin-project/go-state-types/builtin" builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" init4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/init" multisig4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/multisig" @@ -64,7 +64,7 @@ func (m message4) Create( return &types.Message{ To: init_.Address, From: m.from, - Method: builtin9.MethodsInit.Exec, + Method: builtintypes.MethodsInit.Exec, Params: enc, Value: initialAmount, }, nil diff --git a/chain/actors/builtin/multisig/message5.go b/chain/actors/builtin/multisig/message5.go index beca1690d..46c35dabc 100644 --- a/chain/actors/builtin/multisig/message5.go +++ b/chain/actors/builtin/multisig/message5.go @@ -5,7 +5,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - builtin9 "github.com/filecoin-project/go-state-types/builtin" + builtintypes "github.com/filecoin-project/go-state-types/builtin" builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" init5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/init" multisig5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/multisig" @@ -64,7 +64,7 @@ func (m message5) Create( return &types.Message{ To: init_.Address, From: m.from, - Method: builtin9.MethodsInit.Exec, + Method: builtintypes.MethodsInit.Exec, Params: enc, Value: initialAmount, }, nil diff --git a/chain/actors/builtin/multisig/message6.go b/chain/actors/builtin/multisig/message6.go index 39c2dd3b1..f528cfbb5 100644 --- a/chain/actors/builtin/multisig/message6.go +++ b/chain/actors/builtin/multisig/message6.go @@ -5,7 +5,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - builtin9 "github.com/filecoin-project/go-state-types/builtin" + builtintypes "github.com/filecoin-project/go-state-types/builtin" builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" init6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/init" multisig6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/multisig" @@ -64,7 +64,7 @@ func (m message6) Create( return &types.Message{ To: init_.Address, From: m.from, - Method: builtin9.MethodsInit.Exec, + Method: builtintypes.MethodsInit.Exec, Params: enc, Value: initialAmount, }, nil diff --git a/chain/actors/builtin/multisig/message7.go b/chain/actors/builtin/multisig/message7.go index 5f67df4a2..6e62dad13 100644 --- a/chain/actors/builtin/multisig/message7.go +++ b/chain/actors/builtin/multisig/message7.go @@ -5,7 +5,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - builtin9 "github.com/filecoin-project/go-state-types/builtin" + builtintypes "github.com/filecoin-project/go-state-types/builtin" builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" init7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/init" multisig7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/multisig" @@ -64,7 +64,7 @@ func (m message7) Create( return &types.Message{ To: init_.Address, From: m.from, - Method: builtin9.MethodsInit.Exec, + Method: builtintypes.MethodsInit.Exec, Params: enc, Value: initialAmount, }, nil diff --git a/chain/actors/builtin/multisig/message8.go b/chain/actors/builtin/multisig/message8.go index 8d26d0b58..f627a695f 100644 --- a/chain/actors/builtin/multisig/message8.go +++ b/chain/actors/builtin/multisig/message8.go @@ -6,7 +6,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" actorstypes "github.com/filecoin-project/go-state-types/actors" - builtin9 "github.com/filecoin-project/go-state-types/builtin" + builtintypes "github.com/filecoin-project/go-state-types/builtin" multisig8 "github.com/filecoin-project/go-state-types/builtin/v8/multisig" init9 "github.com/filecoin-project/go-state-types/builtin/v9/init" @@ -69,7 +69,7 @@ func (m message8) Create( return &types.Message{ To: init_.Address, From: m.from, - Method: builtin9.MethodsInit.Exec, + Method: builtintypes.MethodsInit.Exec, Params: enc, Value: initialAmount, }, nil diff --git a/chain/actors/builtin/multisig/message9.go b/chain/actors/builtin/multisig/message9.go index 727c6e960..62f6ff558 100644 --- a/chain/actors/builtin/multisig/message9.go +++ b/chain/actors/builtin/multisig/message9.go @@ -6,7 +6,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" actorstypes "github.com/filecoin-project/go-state-types/actors" - builtin9 "github.com/filecoin-project/go-state-types/builtin" + builtintypes "github.com/filecoin-project/go-state-types/builtin" init9 "github.com/filecoin-project/go-state-types/builtin/v9/init" multisig9 "github.com/filecoin-project/go-state-types/builtin/v9/multisig" @@ -69,7 +69,7 @@ func (m message9) Create( return &types.Message{ To: init_.Address, From: m.from, - Method: builtin9.MethodsInit.Exec, + Method: builtintypes.MethodsInit.Exec, Params: enc, Value: initialAmount, }, nil diff --git a/chain/gen/genesis/miners.go b/chain/gen/genesis/miners.go index 55156fda6..385e89c00 100644 --- a/chain/gen/genesis/miners.go +++ b/chain/gen/genesis/miners.go @@ -260,7 +260,7 @@ func SetupStorageMiners(ctx context.Context, cs *store.ChainStore, sys vm.Syscal } rawPow = big.Add(rawPow, big.NewInt(int64(m.SectorSize))) - sectorWeight := builtin.QAPowerForWeight(m.SectorSize, minerInfos[i].presealExp, big.Zero(), big.NewInt(int64(preseal.Deal.PieceSize))) + sectorWeight := builtin.QAPowerForWeight(m.SectorSize, minerInfos[i].presealExp, big.Zero(), markettypes.DealWeight(&preseal.Deal)) minerInfos[i].sectorWeight = append(minerInfos[i].sectorWeight, sectorWeight) qaPow = big.Add(qaPow, sectorWeight) } diff --git a/cli/chain_test.go b/cli/chain_test.go index 9fd46724e..80af1a6e7 100644 --- a/cli/chain_test.go +++ b/cli/chain_test.go @@ -327,7 +327,8 @@ func TestInspectUsage(t *testing.T) { // check for gas by sender assert.Contains(t, out, "By Sender") // check for gas by method - assert.Contains(t, out, "By Method:\nSend") + methodStr := fmt.Sprintf("By Method:\n%d", builtin.MethodSend) + assert.Contains(t, out, methodStr) }) } diff --git a/cli/filplus.go b/cli/filplus.go index 5374a9f40..66de32d0c 100644 --- a/cli/filplus.go +++ b/cli/filplus.go @@ -13,7 +13,9 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" - verifregtypes "github.com/filecoin-project/go-state-types/builtin/v8/verifreg" + verifregtypes8 "github.com/filecoin-project/go-state-types/builtin/v8/verifreg" + verifregtypes9 "github.com/filecoin-project/go-state-types/builtin/v9/verifreg" + "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/lotus/api/v0api" "github.com/filecoin-project/lotus/blockstore" @@ -94,7 +96,7 @@ var filplusVerifyClientCmd = &cli.Command{ } // TODO: This should be abstracted over actor versions - params, err := actors.SerializeParams(&verifregtypes.AddVerifiedClientParams{Address: target, Allowance: allowance}) + params, err := actors.SerializeParams(&verifregtypes9.AddVerifiedClientParams{Address: target, Allowance: allowance}) if err != nil { return err } @@ -359,15 +361,30 @@ var filplusSignRemoveDataCapProposal = &cli.Command{ } } - params := verifregtypes.RemoveDataCapProposal{ - RemovalProposalID: id, - DataCapAmount: allowanceToRemove, - VerifiedClient: clientIdAddr, + nv, err := api.StateNetworkVersion(ctx, types.EmptyTSK) + if err != nil { + return xerrors.Errorf("failed to get network version: %w", err) } paramBuf := new(bytes.Buffer) - paramBuf.WriteString(verifregtypes.SignatureDomainSeparation_RemoveDataCap) - err = params.MarshalCBOR(paramBuf) + paramBuf.WriteString(verifregtypes9.SignatureDomainSeparation_RemoveDataCap) + if nv <= network.Version16 { + params := verifregtypes8.RemoveDataCapProposal{ + RemovalProposalID: id, + DataCapAmount: allowanceToRemove, + VerifiedClient: clientIdAddr, + } + + err = params.MarshalCBOR(paramBuf) + } else { + params := verifregtypes9.RemoveDataCapProposal{ + RemovalProposalID: verifregtypes9.RmDcProposalID{ProposalID: id}, + DataCapAmount: allowanceToRemove, + VerifiedClient: clientIdAddr, + } + + err = params.MarshalCBOR(paramBuf) + } if err != nil { return xerrors.Errorf("failed to marshall paramBuf: %w", err) } diff --git a/extern/filecoin-ffi b/extern/filecoin-ffi index b3185c5fb..945bc4ae5 160000 --- a/extern/filecoin-ffi +++ b/extern/filecoin-ffi @@ -1 +1 @@ -Subproject commit b3185c5fbe05a1032fde707fee2f95ef117461d0 +Subproject commit 945bc4ae58de63735e430607166d1a9c3c7dd43a diff --git a/itests/deadlines_test.go b/itests/deadlines_test.go index a2b0bde88..a00c33b68 100644 --- a/itests/deadlines_test.go +++ b/itests/deadlines_test.go @@ -64,7 +64,7 @@ func TestDeadlineToggling(t *testing.T) { //stm: @CHAIN_INCOMING_HANDLE_INCOMING_BLOCKS_001, @CHAIN_INCOMING_VALIDATE_BLOCK_PUBSUB_001, @CHAIN_INCOMING_VALIDATE_MESSAGE_PUBSUB_001 //stm: @MINER_SECTOR_LIST_001 - kit.Expensive(t) + //kit.Expensive(t) kit.QuietMiningLogs() diff --git a/itests/multisig/suite.go b/itests/multisig/suite.go index 39edfdc4e..9a81d0bf9 100644 --- a/itests/multisig/suite.go +++ b/itests/multisig/suite.go @@ -79,8 +79,6 @@ func RunMultisigTests(t *testing.T, client *kit.TestFullNode) { require.Regexp(t, regexp.MustCompile("Balance: 0.000000000000001 FIL"), out) // Expect 1 transaction require.Regexp(t, regexp.MustCompile(`Transactions:\s*1`), out) - // Expect transaction to be "AddSigner" - require.Regexp(t, regexp.MustCompile(`AddSigner`), out) // Approve adding the new address // msig add-approve --from= 0 false diff --git a/itests/verifreg_test.go b/itests/verifreg_test.go index 9132cf28b..9b1c71162 100644 --- a/itests/verifreg_test.go +++ b/itests/verifreg_test.go @@ -14,7 +14,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" - verifregst "github.com/filecoin-project/go-state-types/builtin/v8/verifreg" + verifregst "github.com/filecoin-project/go-state-types/builtin/v9/verifreg" "github.com/filecoin-project/go-state-types/network" lapi "github.com/filecoin-project/lotus/api" @@ -290,7 +290,7 @@ func TestRemoveDataCap(t *testing.T) { removeProposal := verifregst.RemoveDataCapProposal{ VerifiedClient: verifiedClientID, DataCapAmount: removeDatacap, - RemovalProposalID: proposalID, + RemovalProposalID: verifregst.RmDcProposalID{ProposalID: proposalID}, } buf := bytes.Buffer{} diff --git a/markets/storageadapter/ondealsectorcommitted_test.go b/markets/storageadapter/ondealsectorcommitted_test.go index 5cb5230b4..2ed1d2f39 100644 --- a/markets/storageadapter/ondealsectorcommitted_test.go +++ b/markets/storageadapter/ondealsectorcommitted_test.go @@ -96,7 +96,7 @@ func TestOnDealSectorPreCommitted(t *testing.T) { }, matchStates: []matchState{ { - msg: makeMessage(t, provider, builtin.MethodsMiner.PreCommitSector, &minertypes.SectorPreCommitInfo{ + msg: makeMessage(t, provider, builtin.MethodsMiner.PreCommitSector, &minertypes.PreCommitSectorParams{ SectorNumber: sectorNumber, SealedCID: sealedCid, DealIDs: []abi.DealID{dealID}, @@ -114,7 +114,7 @@ func TestOnDealSectorPreCommitted(t *testing.T) { }, matchStates: []matchState{ { - msg: makeMessage(t, provider, builtin.MethodsMiner.PreCommitSector, &minertypes.SectorPreCommitInfo{ + msg: makeMessage(t, provider, builtin.MethodsMiner.PreCommitSector, &minertypes.PreCommitSectorParams{ SectorNumber: sectorNumber, SealedCID: sealedCid, DealIDs: []abi.DealID{dealID}, @@ -172,7 +172,7 @@ func TestOnDealSectorPreCommitted(t *testing.T) { currentDealInfoErr2: errors.New("something went wrong"), matchStates: []matchState{ { - msg: makeMessage(t, provider, builtin.MethodsMiner.PreCommitSector, &minertypes.SectorPreCommitInfo{ + msg: makeMessage(t, provider, builtin.MethodsMiner.PreCommitSector, &minertypes.PreCommitSectorParams{ SectorNumber: sectorNumber, SealedCID: sealedCid, DealIDs: []abi.DealID{dealID}, diff --git a/storage/pipeline/precommit_batch.go b/storage/pipeline/precommit_batch.go index 94b8d272f..6ee6aed93 100644 --- a/storage/pipeline/precommit_batch.go +++ b/storage/pipeline/precommit_batch.go @@ -280,22 +280,15 @@ func (b *PreCommitBatcher) processIndividually(cfg sealiface.Config) ([]sealifac return res, nil } -func (b *PreCommitBatcher) processSingle(cfg sealiface.Config, mi api.MinerInfo, avail *abi.TokenAmount, params *preCommitEntry) (cid.Cid, error) { - msgParams := miner.PreCommitSectorParams{ - SealProof: params.pci.SealProof, - SectorNumber: params.pci.SectorNumber, - SealedCID: params.pci.SealedCID, - SealRandEpoch: params.pci.SealRandEpoch, - DealIDs: params.pci.DealIDs, - Expiration: params.pci.Expiration, - } +func (b *PreCommitBatcher) processSingle(cfg sealiface.Config, mi api.MinerInfo, avail *abi.TokenAmount, entry *preCommitEntry) (cid.Cid, error) { + msgParams := infoToPreCommitSectorParams(entry.pci) enc := new(bytes.Buffer) if err := msgParams.MarshalCBOR(enc); err != nil { return cid.Undef, xerrors.Errorf("marshaling precommit params: %w", err) } - deposit := params.deposit + deposit := entry.deposit if cfg.CollateralFromMinerBalance { c := big.Sub(deposit, *avail) *avail = big.Sub(*avail, deposit) @@ -336,14 +329,7 @@ func (b *PreCommitBatcher) processBatch(cfg sealiface.Config, tsk types.TipSetKe } res.Sectors = append(res.Sectors, p.pci.SectorNumber) - params.Sectors = append(params.Sectors, miner.PreCommitSectorParams{ - SealProof: p.pci.SealProof, - SectorNumber: p.pci.SectorNumber, - SealedCID: p.pci.SealedCID, - SealRandEpoch: p.pci.SealRandEpoch, - DealIDs: p.pci.DealIDs, - Expiration: p.pci.Expiration, - }) + params.Sectors = append(params.Sectors, *infoToPreCommitSectorParams(p.pci)) deposit = big.Add(deposit, p.deposit) } diff --git a/storage/pipeline/states_sealing.go b/storage/pipeline/states_sealing.go index 96e1f5a7e..c31c36335 100644 --- a/storage/pipeline/states_sealing.go +++ b/storage/pipeline/states_sealing.go @@ -283,7 +283,7 @@ func (m *Sealing) handlePreCommit2(ctx statemachine.Context, sector SectorInfo) }) } -func (m *Sealing) preCommitParams(ctx statemachine.Context, sector SectorInfo) (*miner.SectorPreCommitInfo, big.Int, types.TipSetKey, error) { +func (m *Sealing) preCommitInfo(ctx statemachine.Context, sector SectorInfo) (*miner.SectorPreCommitInfo, big.Int, types.TipSetKey, error) { ts, err := m.Api.ChainHead(ctx.Context()) if err != nil { log.Errorf("handlePreCommitting: api error, not proceeding: %+v", err) @@ -381,14 +381,16 @@ func (m *Sealing) handlePreCommitting(ctx statemachine.Context, sector SectorInf } } - params, pcd, tsk, err := m.preCommitParams(ctx, sector) + info, pcd, tsk, err := m.preCommitInfo(ctx, sector) if err != nil { - return ctx.Send(SectorChainPreCommitFailed{xerrors.Errorf("preCommitParams: %w", err)}) + return ctx.Send(SectorChainPreCommitFailed{xerrors.Errorf("preCommitInfo: %w", err)}) } - if params == nil { - return nil // event was sent in preCommitParams + if info == nil { + return nil // event was sent in preCommitInfo } + params := infoToPreCommitSectorParams(info) + deposit, err := collateralSendAmount(ctx.Context(), m.Api, m.maddr, cfg, pcd) if err != nil { return err @@ -418,7 +420,7 @@ func (m *Sealing) handlePreCommitting(ctx statemachine.Context, sector SectorInf return ctx.Send(SectorChainPreCommitFailed{xerrors.Errorf("pushing message to mpool: %w", err)}) } - return ctx.Send(SectorPreCommitted{Message: mcid, PreCommitDeposit: pcd, PreCommitInfo: *params}) + return ctx.Send(SectorPreCommitted{Message: mcid, PreCommitDeposit: pcd, PreCommitInfo: *info}) } func (m *Sealing) handleSubmitPreCommitBatch(ctx statemachine.Context, sector SectorInfo) error { @@ -426,12 +428,12 @@ func (m *Sealing) handleSubmitPreCommitBatch(ctx statemachine.Context, sector Se return ctx.Send(SectorSealPreCommit1Failed{xerrors.Errorf("sector had nil commR or commD")}) } - params, deposit, _, err := m.preCommitParams(ctx, sector) + params, deposit, _, err := m.preCommitInfo(ctx, sector) if err != nil { - return ctx.Send(SectorChainPreCommitFailed{xerrors.Errorf("preCommitParams: %w", err)}) + return ctx.Send(SectorChainPreCommitFailed{xerrors.Errorf("preCommitInfo: %w", err)}) } if params == nil { - return nil // event was sent in preCommitParams + return nil // event was sent in preCommitInfo } res, err := m.precommiter.AddPreCommit(ctx.Context(), sector, deposit, params) diff --git a/storage/pipeline/utils.go b/storage/pipeline/utils.go index 69a8f914c..3f8d534cb 100644 --- a/storage/pipeline/utils.go +++ b/storage/pipeline/utils.go @@ -10,6 +10,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" + "github.com/filecoin-project/go-state-types/builtin/v9/miner" "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/chain/types" @@ -111,3 +112,14 @@ func sendMsg(ctx context.Context, sa interface { return smsg.Cid(), nil } + +func infoToPreCommitSectorParams(info *miner.SectorPreCommitInfo) *miner.PreCommitSectorParams { + return &miner.PreCommitSectorParams{ + SealProof: info.SealProof, + SectorNumber: info.SectorNumber, + SealedCID: info.SealedCID, + SealRandEpoch: info.SealRandEpoch, + DealIDs: info.DealIDs, + Expiration: info.Expiration, + } +} From 8d99d27932c78ce54c9121d3c9f88af4cf82089d Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Mon, 12 Sep 2022 10:45:34 -0400 Subject: [PATCH 116/185] add envvar for PROPAGATION_DELAY_SECS --- build/params_calibnet.go | 15 +++++++++++++++ build/params_mainnet.go | 19 +++++++++++++++++-- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/build/params_calibnet.go b/build/params_calibnet.go index 9ecfc048d..44083604d 100644 --- a/build/params_calibnet.go +++ b/build/params_calibnet.go @@ -4,6 +4,9 @@ package build import ( + "os" + "strconv" + "github.com/ipfs/go-cid" "github.com/filecoin-project/go-address" @@ -84,6 +87,18 @@ func init() { Devnet = true + if len(os.Getenv("PROPAGATION_DELAY_SECS")) != 0 { + PropagationDelaySecs, err := strconv.ParseUint(os.Getenv("PROPAGATION_DELAY_SECS"), 10, 64) + if err != nil { + PropagationDelaySecs = uint64(6) + log.Warnw("Error setting PROPAGATION_DELAY_SECS, %v, proceed with default value %s", err, + PropagationDelaySecs) + } else { + log.Warnw(" !!WARNING!! propagation delay is set to be %s second, "+ + "this value impacts your message republish interval and block forming - monitor with caution!!", PropagationDelaySecs) + } + } + BuildType = BuildCalibnet } diff --git a/build/params_mainnet.go b/build/params_mainnet.go index 7a532c174..5c5444e05 100644 --- a/build/params_mainnet.go +++ b/build/params_mainnet.go @@ -6,6 +6,7 @@ package build import ( "math" "os" + "strconv" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" @@ -86,6 +87,7 @@ var SupportedProofTypes = []abi.RegisteredSealProof{ var ConsensusMinerMinPower = abi.NewStoragePower(10 << 40) var MinVerifiedDealSize = abi.NewStoragePower(1 << 20) var PreCommitChallengeDelay = abi.ChainEpoch(150) +var PropagationDelaySecs = uint64(6) func init() { if os.Getenv("LOTUS_USE_TEST_ADDRESSES") != "1" { @@ -96,6 +98,21 @@ func init() { UpgradeSkyrHeight = math.MaxInt64 } + // NOTE: DO NOT change this unless you REALLY know what you're doing. This is not consensus critical, however, + //set this value too high may impacts your block submission; set this value too low may cause you miss + //parent tipsets for blocking forming and mining. + if len(os.Getenv("PROPAGATION_DELAY_SECS")) != 0 { + PropagationDelaySecs, err := strconv.ParseUint(os.Getenv("PROPAGATION_DELAY_SECS"), 10, 64) + if err != nil { + PropagationDelaySecs = uint64(6) + log.Warnw("Error setting PROPAGATION_DELAY_SECS, %v, proceed with default value %s", err, + PropagationDelaySecs) + } else { + log.Warnw(" !!WARNING!! propagation delay is set to be %s second, "+ + "this value impacts your message republish interval and block forming - monitor with caution!!", PropagationDelaySecs) + } + } + Devnet = false BuildType = BuildMainnet @@ -103,8 +120,6 @@ func init() { const BlockDelaySecs = uint64(builtin2.EpochDurationSeconds) -const PropagationDelaySecs = uint64(6) - // BootstrapPeerThreshold is the minimum number peers we need to track for a sync worker to start const BootstrapPeerThreshold = 4 From 001c5500bd54050a5a9e938fde5c5740f931c66b Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Mon, 12 Sep 2022 10:48:55 -0400 Subject: [PATCH 117/185] increase the default propagation delay to 10 sec --- build/params_calibnet.go | 4 ++-- build/params_mainnet.go | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/build/params_calibnet.go b/build/params_calibnet.go index 44083604d..c44cf7187 100644 --- a/build/params_calibnet.go +++ b/build/params_calibnet.go @@ -90,7 +90,7 @@ func init() { if len(os.Getenv("PROPAGATION_DELAY_SECS")) != 0 { PropagationDelaySecs, err := strconv.ParseUint(os.Getenv("PROPAGATION_DELAY_SECS"), 10, 64) if err != nil { - PropagationDelaySecs = uint64(6) + PropagationDelaySecs = uint64(10) log.Warnw("Error setting PROPAGATION_DELAY_SECS, %v, proceed with default value %s", err, PropagationDelaySecs) } else { @@ -105,7 +105,7 @@ func init() { const BlockDelaySecs = uint64(builtin2.EpochDurationSeconds) -const PropagationDelaySecs = uint64(6) +const PropagationDelaySecs = uint64(10) // BootstrapPeerThreshold is the minimum number peers we need to track for a sync worker to start const BootstrapPeerThreshold = 4 diff --git a/build/params_mainnet.go b/build/params_mainnet.go index 5c5444e05..e08e1b9b1 100644 --- a/build/params_mainnet.go +++ b/build/params_mainnet.go @@ -87,7 +87,7 @@ var SupportedProofTypes = []abi.RegisteredSealProof{ var ConsensusMinerMinPower = abi.NewStoragePower(10 << 40) var MinVerifiedDealSize = abi.NewStoragePower(1 << 20) var PreCommitChallengeDelay = abi.ChainEpoch(150) -var PropagationDelaySecs = uint64(6) +var PropagationDelaySecs = uint64(10) func init() { if os.Getenv("LOTUS_USE_TEST_ADDRESSES") != "1" { @@ -104,7 +104,7 @@ func init() { if len(os.Getenv("PROPAGATION_DELAY_SECS")) != 0 { PropagationDelaySecs, err := strconv.ParseUint(os.Getenv("PROPAGATION_DELAY_SECS"), 10, 64) if err != nil { - PropagationDelaySecs = uint64(6) + PropagationDelaySecs = uint64(10) log.Warnw("Error setting PROPAGATION_DELAY_SECS, %v, proceed with default value %s", err, PropagationDelaySecs) } else { From 108d41fd781eafead6b2de7d39937cf9af0af12f Mon Sep 17 00:00:00 2001 From: Aayush Date: Mon, 12 Sep 2022 13:56:38 -0400 Subject: [PATCH 118/185] Update FFI and go-state-types --- extern/filecoin-ffi | 2 +- go.mod | 2 +- go.sum | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/extern/filecoin-ffi b/extern/filecoin-ffi index 945bc4ae5..c70caaf14 160000 --- a/extern/filecoin-ffi +++ b/extern/filecoin-ffi @@ -1 +1 @@ -Subproject commit 945bc4ae58de63735e430607166d1a9c3c7dd43a +Subproject commit c70caaf14f8ff5b15eb5166093d9e57055e571f8 diff --git a/go.mod b/go.mod index e20d246c5..55b3049ee 100644 --- a/go.mod +++ b/go.mod @@ -42,7 +42,7 @@ require ( github.com/filecoin-project/go-legs v0.4.4 github.com/filecoin-project/go-padreader v0.0.1 github.com/filecoin-project/go-paramfetch v0.0.4 - github.com/filecoin-project/go-state-types v0.1.12-0.20220909210634-916a5a14a31b + github.com/filecoin-project/go-state-types v0.1.12-alpha github.com/filecoin-project/go-statemachine v1.0.2 github.com/filecoin-project/go-statestore v0.2.0 github.com/filecoin-project/go-storedcounter v0.1.0 diff --git a/go.sum b/go.sum index 655957331..6cd99c8e4 100644 --- a/go.sum +++ b/go.sum @@ -343,8 +343,8 @@ github.com/filecoin-project/go-state-types v0.1.0/go.mod h1:ezYnPf0bNkTsDibL/psS github.com/filecoin-project/go-state-types v0.1.6/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q= github.com/filecoin-project/go-state-types v0.1.8/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q= github.com/filecoin-project/go-state-types v0.1.10/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q= -github.com/filecoin-project/go-state-types v0.1.12-0.20220909210634-916a5a14a31b h1:Dd7R2JHJaXrNc1kZ+Z3PIUTEy5SRbQdw8YwGyWLLZn4= -github.com/filecoin-project/go-state-types v0.1.12-0.20220909210634-916a5a14a31b/go.mod h1:n/kujdC9JphvYTrmaD1+vJpvDPy/DwzckoMzP0nBKWI= +github.com/filecoin-project/go-state-types v0.1.12-alpha h1:6BbnnrFqCOkiogZd6CTe7Bf1nRKrJDE6CP/I/dqM4C8= +github.com/filecoin-project/go-state-types v0.1.12-alpha/go.mod h1:n/kujdC9JphvYTrmaD1+vJpvDPy/DwzckoMzP0nBKWI= github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig= github.com/filecoin-project/go-statemachine v1.0.2 h1:421SSWBk8GIoCoWYYTE/d+qCWccgmRH0uXotXRDjUbc= github.com/filecoin-project/go-statemachine v1.0.2/go.mod h1:jZdXXiHa61n4NmgWFG4w8tnqgvZVHYbJ3yW7+y8bF54= From a0ec3a7bbe5453461770028b4008f1c22cb550a6 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Fri, 9 Sep 2022 20:50:37 -0400 Subject: [PATCH 119/185] Add option to terminate sectors from any address --- cmd/lotus-shed/sectors.go | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/cmd/lotus-shed/sectors.go b/cmd/lotus-shed/sectors.go index deb5cff8b..0332b4ba3 100644 --- a/cmd/lotus-shed/sectors.go +++ b/cmd/lotus-shed/sectors.go @@ -58,6 +58,10 @@ var terminateSectorCmd = &cli.Command{ Name: "really-do-it", Usage: "pass this flag if you know what you are doing", }, + &cli.StringFlag{ + Name: "from", + Usage: "specify the address to send the terminate message from", + }, }, Action: func(cctx *cli.Context) error { if cctx.Args().Len() < 1 { @@ -137,8 +141,19 @@ var terminateSectorCmd = &cli.Command{ return xerrors.Errorf("serializing params: %w", err) } + var fromAddr address.Address + if from := cctx.String("from"); from != "" { + var err error + fromAddr, err = address.NewFromString(from) + if err != nil { + return fmt.Errorf("parsing address %s: %w", from, err) + } + } else { + fromAddr = mi.Worker + } + smsg, err := nodeApi.MpoolPushMessage(ctx, &types.Message{ - From: mi.Owner, + From: fromAddr, To: maddr, Method: builtin.MethodsMiner.TerminateSectors, From b13cf825411be0a3d1e0489215264aec85da69c0 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 8 Sep 2022 12:22:06 -0700 Subject: [PATCH 120/185] chore: update bitswap and some libp2p packages This removes some deprecated packages from the build tree. --- go.mod | 15 ++++++--------- go.sum | 31 ++++++++++++------------------- 2 files changed, 18 insertions(+), 28 deletions(-) diff --git a/go.mod b/go.mod index 9b89fba0f..6bc8be1af 100644 --- a/go.mod +++ b/go.mod @@ -71,7 +71,7 @@ require ( github.com/icza/backscanner v0.0.0-20210726202459-ac2ffc679f94 github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab github.com/ipfs/bbloom v0.0.4 - github.com/ipfs/go-bitswap v0.8.0 + github.com/ipfs/go-bitswap v0.10.2 github.com/ipfs/go-block-format v0.0.3 github.com/ipfs/go-blockservice v0.4.0 github.com/ipfs/go-cid v0.2.0 @@ -110,10 +110,10 @@ require ( github.com/koalacxr/quantile v0.0.1 github.com/libp2p/go-buffer-pool v0.1.0 github.com/libp2p/go-libp2p v0.22.0 - github.com/libp2p/go-libp2p-kad-dht v0.17.0 - github.com/libp2p/go-libp2p-peerstore v0.7.1 + github.com/libp2p/go-libp2p-kad-dht v0.18.0 + github.com/libp2p/go-libp2p-peerstore v0.8.0 github.com/libp2p/go-libp2p-pubsub v0.8.0 - github.com/libp2p/go-libp2p-record v0.1.3 + github.com/libp2p/go-libp2p-record v0.2.0 github.com/libp2p/go-libp2p-routing-helpers v0.2.3 github.com/libp2p/go-maddr-filter v0.1.0 github.com/mattn/go-isatty v0.0.16 @@ -226,7 +226,7 @@ require ( github.com/ipfs/go-ipfs-posinfo v0.0.1 // indirect github.com/ipfs/go-ipfs-pq v0.0.2 // indirect github.com/ipfs/go-ipld-legacy v0.1.1 // indirect - github.com/ipfs/go-ipns v0.1.3-0.20220819140646-0d8e99ba180a // indirect + github.com/ipfs/go-ipns v0.2.0 // indirect github.com/ipfs/go-log v1.0.5 // indirect github.com/ipfs/go-path v0.3.0 // indirect github.com/ipfs/go-peertaskqueue v0.7.1 // indirect @@ -246,15 +246,12 @@ require ( github.com/klauspost/cpuid/v2 v2.1.0 // indirect github.com/koron/go-ssdp v0.0.3 // indirect github.com/libp2p/go-cidranger v1.1.0 // indirect - github.com/libp2p/go-eventbus v0.3.0 // indirect github.com/libp2p/go-flow-metrics v0.1.0 // indirect github.com/libp2p/go-libp2p-asn-util v0.2.0 // indirect github.com/libp2p/go-libp2p-connmgr v0.4.0 // indirect github.com/libp2p/go-libp2p-core v0.20.0 // indirect github.com/libp2p/go-libp2p-gostream v0.4.0 // indirect - github.com/libp2p/go-libp2p-kbucket v0.4.7 // indirect - github.com/libp2p/go-libp2p-loggables v0.1.0 // indirect - github.com/libp2p/go-libp2p-netutil v0.2.0 // indirect + github.com/libp2p/go-libp2p-kbucket v0.5.0 // indirect github.com/libp2p/go-libp2p-noise v0.5.0 // indirect github.com/libp2p/go-libp2p-tls v0.5.0 // indirect github.com/libp2p/go-msgio v0.2.0 // indirect diff --git a/go.sum b/go.sum index 79f7c7319..1a5628f06 100644 --- a/go.sum +++ b/go.sum @@ -644,8 +644,8 @@ github.com/ipfs/go-bitswap v0.1.0/go.mod h1:FFJEf18E9izuCqUtHxbWEvq+reg7o4CW5wSA github.com/ipfs/go-bitswap v0.1.2/go.mod h1:qxSWS4NXGs7jQ6zQvoPY3+NmOfHHG47mhkiLzBpJQIs= github.com/ipfs/go-bitswap v0.5.1/go.mod h1:P+ckC87ri1xFLvk74NlXdP0Kj9RmWAh4+H78sC6Qopo= github.com/ipfs/go-bitswap v0.6.0/go.mod h1:Hj3ZXdOC5wBJvENtdqsixmzzRukqd8EHLxZLZc3mzRA= -github.com/ipfs/go-bitswap v0.8.0 h1:UEV7kogQu2iGggkE9GhLykDrRCUpsNnpu2NODww/srw= -github.com/ipfs/go-bitswap v0.8.0/go.mod h1:/h8sBij8UVEaNWl8ABzpLRA5Y1cttdNUnpeGo2AA/LQ= +github.com/ipfs/go-bitswap v0.10.2 h1:B81RIwkTnIvSYT1ZCzxjYTeF0Ek88xa9r1AMpTfk+9Q= +github.com/ipfs/go-bitswap v0.10.2/go.mod h1:+fZEvycxviZ7c+5KlKwTzLm0M28g2ukCPqiuLfJk4KA= github.com/ipfs/go-block-format v0.0.1/go.mod h1:DK/YYcsSUIVAFNwo/KZCdIIbpN0ROH/baNLgayt4pFc= github.com/ipfs/go-block-format v0.0.2/go.mod h1:AWR46JfpcObNfg3ok2JHDUfdiHRgWhJgCQF+KIgOPJY= github.com/ipfs/go-block-format v0.0.3 h1:r8t66QstRp/pd/or4dpnbVfXT5Gt7lOqRvC+/dDTpMc= @@ -773,8 +773,8 @@ github.com/ipfs/go-ipld-format v0.4.0/go.mod h1:co/SdBE8h99968X0hViiw1MNlh6fvxxn github.com/ipfs/go-ipld-legacy v0.1.0/go.mod h1:86f5P/srAmh9GcIcWQR9lfFLZPrIyyXQeVlOWeeWEuI= github.com/ipfs/go-ipld-legacy v0.1.1 h1:BvD8PEuqwBHLTKqlGFTHSwrwFOMkVESEvwIYwR2cdcc= github.com/ipfs/go-ipld-legacy v0.1.1/go.mod h1:8AyKFCjgRPsQFf15ZQgDB8Din4DML/fOmKZkkFkrIEg= -github.com/ipfs/go-ipns v0.1.3-0.20220819140646-0d8e99ba180a h1:5UPw4plVUYhbZjY9ZWSLVEWUyYWQIM3WYumZQfBlPXI= -github.com/ipfs/go-ipns v0.1.3-0.20220819140646-0d8e99ba180a/go.mod h1:VHLj6/KLxdj+a5BTwpKRoHhtw+TP+hcb0ZUpQSqW4fI= +github.com/ipfs/go-ipns v0.2.0 h1:BgmNtQhqOw5XEZ8RAfWEpK4DhqaYiuP6h71MhIp7xXU= +github.com/ipfs/go-ipns v0.2.0/go.mod h1:3cLT2rbvgPZGkHJoPO1YMJeh6LtkxopCkKFcio/wE24= github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= github.com/ipfs/go-log v1.0.0/go.mod h1:JO7RzlMK6rA+CIxFMLOuB6Wf5b81GDiKElL7UPSIKjA= github.com/ipfs/go-log v1.0.1/go.mod h1:HuWlQttfN6FWNHRhlY5yMk/lW7evQC0HHGOxEwMRR8I= @@ -963,8 +963,6 @@ github.com/libp2p/go-conn-security-multistream v0.2.1/go.mod h1:cR1d8gA0Hr59Fj6N github.com/libp2p/go-conn-security-multistream v0.3.0/go.mod h1:EEP47t4fw/bTelVmEzIDqSe69hO/ip52xBEhZMLWAHM= github.com/libp2p/go-eventbus v0.1.0/go.mod h1:vROgu5cs5T7cv7POWlWxBaVLxfSegC5UGQf8A2eEmx4= github.com/libp2p/go-eventbus v0.2.1/go.mod h1:jc2S4SoEVPP48H9Wpzm5aiGwUCBMfGhVhhBjyhhCJs8= -github.com/libp2p/go-eventbus v0.3.0 h1:FCHfSpM469NSXipOoX3npAP7bJHSAmUIxj1qe8AtT5k= -github.com/libp2p/go-eventbus v0.3.0/go.mod h1:d+p2Q4lgRHTBLwOXdzX0hOl8D4hiHHNgcoy1MuomBHU= github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8= github.com/libp2p/go-flow-metrics v0.0.2/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS27omG0uWU5slZs= github.com/libp2p/go-flow-metrics v0.0.3/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS27omG0uWU5slZs= @@ -982,7 +980,6 @@ github.com/libp2p/go-libp2p v0.16.0/go.mod h1:ump42BsirwAWxKzsCiFnTtN1Yc+DuPu76f github.com/libp2p/go-libp2p v0.17.0/go.mod h1:Fkin50rsGdv5mm5BshBUtPRZknt9esfmYXBOYcwOTgw= github.com/libp2p/go-libp2p v0.22.0 h1:2Tce0kHOp5zASFKJbNzRElvh0iZwdtG5uZheNW8chIw= github.com/libp2p/go-libp2p v0.22.0/go.mod h1:UDolmweypBSjQb2f7xutPnwZ/fxioLbMBxSjRksxxU4= -github.com/libp2p/go-libp2p-asn-util v0.0.0-20200825225859-85005c6cf052/go.mod h1:nRMRTab+kZuk0LnKZpxhOVH/ndsdr2Nr//Zltc/vwgo= github.com/libp2p/go-libp2p-asn-util v0.1.0/go.mod h1:wu+AnM9Ii2KgO5jMmS1rz9dvzTdj8BXqsPR9HR0XB7I= github.com/libp2p/go-libp2p-asn-util v0.2.0 h1:rg3+Os8jbnO5DxkC7K/Utdi+DkY3q/d1/1q+8WeNAsw= github.com/libp2p/go-libp2p-asn-util v0.2.0/go.mod h1:WoaWxbHKBymSN41hWSq/lGKJEca7TNm58+gGJi2WsLI= @@ -1059,12 +1056,11 @@ github.com/libp2p/go-libp2p-interface-connmgr v0.0.1/go.mod h1:GarlRLH0LdeWcLnYM github.com/libp2p/go-libp2p-interface-connmgr v0.0.4/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= github.com/libp2p/go-libp2p-interface-connmgr v0.0.5/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= github.com/libp2p/go-libp2p-interface-pnet v0.0.1/go.mod h1:el9jHpQAXK5dnTpKA4yfCNBZXvrzdOU75zz+C6ryp3k= -github.com/libp2p/go-libp2p-kad-dht v0.17.0 h1:HWEjqjNVDuf8yuccuswGy1vYGzB0v4Z+yQ4DMDMSIqk= -github.com/libp2p/go-libp2p-kad-dht v0.17.0/go.mod h1:zeE26Xo+PY7sS2AgkBQQcBnJEazMT26KGZLUFttl+rk= -github.com/libp2p/go-libp2p-kbucket v0.4.7 h1:spZAcgxifvFZHBD8tErvppbnNiKA5uokDu3CV7axu70= -github.com/libp2p/go-libp2p-kbucket v0.4.7/go.mod h1:XyVo99AfQH0foSf176k4jY1xUJ2+jUJIZCSDm7r2YKk= +github.com/libp2p/go-libp2p-kad-dht v0.18.0 h1:akqO3gPMwixR7qFSFq70ezRun97g5hrA/lBW9jrjUYM= +github.com/libp2p/go-libp2p-kad-dht v0.18.0/go.mod h1:Gb92MYIPm3K2pJLGn8wl0m8wiKDvHrYpg+rOd0GzzPA= +github.com/libp2p/go-libp2p-kbucket v0.5.0 h1:g/7tVm8ACHDxH29BGrpsQlnNeu+6OF1A9bno/4/U1oA= +github.com/libp2p/go-libp2p-kbucket v0.5.0/go.mod h1:zGzGCpQd78b5BNTDGHNDLaTt9aDK/A02xeZp9QeFC4U= github.com/libp2p/go-libp2p-loggables v0.0.1/go.mod h1:lDipDlBNYbpyqyPX/KcoO+eq0sJYEVR2JgOexcivchg= -github.com/libp2p/go-libp2p-loggables v0.1.0 h1:h3w8QFfCt2UJl/0/NW4K829HX/0S4KD31PQ7m8UXXO8= github.com/libp2p/go-libp2p-loggables v0.1.0/go.mod h1:EyumB2Y6PrYjr55Q3/tiJ/o3xoDasoRYM7nOzEpoa90= github.com/libp2p/go-libp2p-metrics v0.0.1/go.mod h1:jQJ95SXXA/K1VZi13h52WZMa9ja78zjyy5rspMsC/08= github.com/libp2p/go-libp2p-mplex v0.1.1/go.mod h1:KUQWpGkCzfV7UIpi8SKsAVxyBgz1c9R5EvxgnwLsb/I= @@ -1082,8 +1078,6 @@ github.com/libp2p/go-libp2p-net v0.0.1/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8 github.com/libp2p/go-libp2p-net v0.0.2/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8EgNU9DrCcR8c= github.com/libp2p/go-libp2p-netutil v0.0.1/go.mod h1:GdusFvujWZI9Vt0X5BKqwWWmZFxecf9Gt03cKxm2f/Q= github.com/libp2p/go-libp2p-netutil v0.1.0/go.mod h1:3Qv/aDqtMLTUyQeundkKsA+YCThNdbQD54k3TqjpbFU= -github.com/libp2p/go-libp2p-netutil v0.2.0 h1:DecSQ5nRnE5RfOmlNx+qubPL+rX8NSC6vyPRCiJXzg4= -github.com/libp2p/go-libp2p-netutil v0.2.0/go.mod h1:5ny0YEgWwWLxPwRJn5gGYr5bh9msiDI1CStSesvqYRM= github.com/libp2p/go-libp2p-noise v0.2.0/go.mod h1:IEbYhBBzGyvdLBoxxULL/SGbJARhUeqlO8lVSREYu2Q= github.com/libp2p/go-libp2p-noise v0.3.0/go.mod h1:JNjHbociDJKHD64KTkzGnzqJ0FEV5gHJa6AB00kbCNQ= github.com/libp2p/go-libp2p-noise v0.5.0 h1:gwJZ/3iH3MRnBrLIyr/YLdCOnmqfJMptlsFFUIc3j0Y= @@ -1102,8 +1096,8 @@ github.com/libp2p/go-libp2p-peerstore v0.2.6/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuD github.com/libp2p/go-libp2p-peerstore v0.2.7/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= github.com/libp2p/go-libp2p-peerstore v0.4.0/go.mod h1:rDJUFyzEWPpXpEwywkcTYYzDHlwza8riYMaUzaN6hX0= github.com/libp2p/go-libp2p-peerstore v0.6.0/go.mod h1:DGEmKdXrcYpK9Jha3sS7MhqYdInxJy84bIPtSu65bKc= -github.com/libp2p/go-libp2p-peerstore v0.7.1 h1:7FpALlqR+3+oOBXdzm3AVt0vjMYLW1b7jM03E4iEHlw= -github.com/libp2p/go-libp2p-peerstore v0.7.1/go.mod h1:cdUWTHro83vpg6unCpGUr8qJoX3e93Vy8o97u5ppIM0= +github.com/libp2p/go-libp2p-peerstore v0.8.0 h1:bzTG693TA1Ju/zKmUCQzDLSqiJnyRFVwPpuloZ/OZtI= +github.com/libp2p/go-libp2p-peerstore v0.8.0/go.mod h1:9geHWmNA3YDlQBjL/uPEJD6vpDK12aDNlUNHJ6kio/s= github.com/libp2p/go-libp2p-pnet v0.2.0/go.mod h1:Qqvq6JH/oMZGwqs3N1Fqhv8NVhrdYcO0BW4wssv21LA= github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1VZNHYcK8cLgFJLZ4s= github.com/libp2p/go-libp2p-protocol v0.1.0/go.mod h1:KQPHpAabB57XQxGrXCNvbL6UEXfQqUgC/1adR2Xtflk= @@ -1117,8 +1111,8 @@ github.com/libp2p/go-libp2p-quic-transport v0.15.2/go.mod h1:wv4uGwjcqe8Mhjj7N/I github.com/libp2p/go-libp2p-record v0.0.1/go.mod h1:grzqg263Rug/sRex85QrDOLntdFAymLDLm7lxMgU79Q= github.com/libp2p/go-libp2p-record v0.1.0/go.mod h1:ujNc8iuE5dlKWVy6wuL6dd58t0n7xI4hAIl8pE6wu5Q= github.com/libp2p/go-libp2p-record v0.1.2/go.mod h1:pal0eNcT5nqZaTV7UGhqeGqxFgGdsU/9W//C8dqjQDk= -github.com/libp2p/go-libp2p-record v0.1.3 h1:R27hoScIhQf/A8XJZ8lYpnqh9LatJ5YbHs28kCIfql0= -github.com/libp2p/go-libp2p-record v0.1.3/go.mod h1:yNUff/adKIfPnYQXgp6FQmNu3gLJ6EMg7+/vv2+9pY4= +github.com/libp2p/go-libp2p-record v0.2.0 h1:oiNUOCWno2BFuxt3my4i1frNrt7PerzB3queqa1NkQ0= +github.com/libp2p/go-libp2p-record v0.2.0/go.mod h1:I+3zMkvvg5m2OcSdoL0KPljyJyvNDFGKX7QdlpYUcwk= github.com/libp2p/go-libp2p-routing v0.0.1/go.mod h1:N51q3yTr4Zdr7V8Jt2JIktVU+3xBBylx1MZeVA6t1Ys= github.com/libp2p/go-libp2p-routing-helpers v0.2.3 h1:xY61alxJ6PurSi+MXbywZpelvuU4U4p/gPTxjqCqTzY= github.com/libp2p/go-libp2p-routing-helpers v0.2.3/go.mod h1:795bh+9YeoFl99rMASoiVgHdi5bjack0N1+AFAdbvBw= @@ -1148,7 +1142,6 @@ github.com/libp2p/go-libp2p-testing v0.4.0/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotl github.com/libp2p/go-libp2p-testing v0.4.2/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotlKsNSbKQ/lImlOWF0= github.com/libp2p/go-libp2p-testing v0.5.0/go.mod h1:QBk8fqIL1XNcno/l3/hhaIEn4aLRijpYOR+zVjjlh+A= github.com/libp2p/go-libp2p-testing v0.6.0/go.mod h1:QBk8fqIL1XNcno/l3/hhaIEn4aLRijpYOR+zVjjlh+A= -github.com/libp2p/go-libp2p-testing v0.6.1-0.20211213091545-6aa944478bd3/go.mod h1:KB5rnDAM6eNBajC8qYV6hUvBaqIH0w0plTDA5yV9QlA= github.com/libp2p/go-libp2p-testing v0.12.0 h1:EPvBb4kKMWO29qP4mZGyhVzUyR25dvfUIK5WDu6iPUA= github.com/libp2p/go-libp2p-tls v0.1.3/go.mod h1:wZfuewxOndz5RTnCAxFliGjvYSDA40sKitV4c50uI1M= github.com/libp2p/go-libp2p-tls v0.3.0/go.mod h1:fwF5X6PWGxm6IDRwF3V8AVCCj/hOd5oFlg+wo2FxJDY= From 4c4b10c6177783622eb51f1b33888bc44034192b Mon Sep 17 00:00:00 2001 From: Shrenuj Bansal Date: Tue, 13 Sep 2022 16:33:55 -0400 Subject: [PATCH 121/185] Ignore uuid check for messages with uuid not set --- itests/mpool_msg_uuid_test.go | 52 +++++++++++++++++++++++++++++++++++ node/impl/full/mpool.go | 7 +++-- 2 files changed, 56 insertions(+), 3 deletions(-) create mode 100644 itests/mpool_msg_uuid_test.go diff --git a/itests/mpool_msg_uuid_test.go b/itests/mpool_msg_uuid_test.go new file mode 100644 index 000000000..74e2f2a23 --- /dev/null +++ b/itests/mpool_msg_uuid_test.go @@ -0,0 +1,52 @@ +package itests + +import ( + "context" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/big" + "github.com/filecoin-project/go-state-types/exitcode" + "github.com/filecoin-project/lotus/api" + "github.com/filecoin-project/lotus/chain/types" + "github.com/filecoin-project/lotus/itests/kit" + "github.com/filecoin-project/lotus/node/config" + "github.com/stretchr/testify/require" + "testing" + "time" +) + +func TestMsgWithoutUuidWithMaxFee(t *testing.T) { + ctx := context.Background() + + kit.QuietMiningLogs() + + node, _, ens := kit.EnsembleMinimal(t, kit.MockProofs()) + ens.InterconnectAll().BeginMining(10 * time.Millisecond) + + bal, err := node.WalletBalance(ctx, node.DefaultKey.Address) + require.NoError(t, err) + + // send self half of account balance + msgHalfBal := &types.Message{ + From: node.DefaultKey.Address, + To: node.DefaultKey.Address, + Value: big.Div(bal, big.NewInt(2)), + } + smHalfBal, err := node.MpoolPushMessage(ctx, msgHalfBal, &api.MessageSendSpec{MaxFee: abi.TokenAmount(config.DefaultDefaultMaxFee)}) + require.NoError(t, err) + mLookup, err := node.StateWaitMsg(ctx, smHalfBal.Cid(), 3, api.LookbackNoLimit, true) + require.NoError(t, err) + require.Equal(t, exitcode.Ok, mLookup.Receipt.ExitCode) + + msgQuarterBal := &types.Message{ + From: node.DefaultKey.Address, + To: node.DefaultKey.Address, + Value: big.Div(bal, big.NewInt(4)), + } + smQuarterBal, err := node.MpoolPushMessage(ctx, msgQuarterBal, &api.MessageSendSpec{MaxFee: abi.TokenAmount(config.DefaultDefaultMaxFee)}) + require.NoError(t, err) + + require.Equal(t, msgQuarterBal.Value, smQuarterBal.Message.Value) + mLookup, err = node.StateWaitMsg(ctx, smQuarterBal.Cid(), 3, api.LookbackNoLimit, true) + require.NoError(t, err) + require.Equal(t, exitcode.Ok, mLookup.Receipt.ExitCode) +} diff --git a/node/impl/full/mpool.go b/node/impl/full/mpool.go index 98b2ac8a6..a9f1ebda9 100644 --- a/node/impl/full/mpool.go +++ b/node/impl/full/mpool.go @@ -3,6 +3,7 @@ package full import ( "context" "encoding/json" + "github.com/google/uuid" "github.com/ipfs/go-cid" "go.uber.org/fx" @@ -142,8 +143,8 @@ func (a *MpoolAPI) MpoolPushMessage(ctx context.Context, msg *types.Message, spe msg = &cp inMsg := *msg - // Check if this uuid has already been processed - if spec != nil { + // Check if this uuid has already been processed. Ignore if uuid is not populated + if (spec != nil) && (spec.MsgUuid != uuid.UUID{}) { signedMessage, err := a.MessageSigner.GetSignedMessage(ctx, spec.MsgUuid) if err == nil { log.Warnf("Message already processed. cid=%s", signedMessage.Cid()) @@ -206,7 +207,7 @@ func (a *MpoolAPI) MpoolPushMessage(ctx context.Context, msg *types.Message, spe } // Store uuid->signed message in datastore - if spec != nil { + if (spec != nil) && (spec.MsgUuid != uuid.UUID{}) { err = a.MessageSigner.StoreSignedMessage(ctx, spec.MsgUuid, signedMsg) if err != nil { return nil, err From a50a21b0766279231b6270f385d4f6ca592f45b3 Mon Sep 17 00:00:00 2001 From: Shrenuj Bansal Date: Tue, 13 Sep 2022 16:52:47 -0400 Subject: [PATCH 122/185] cleanup --- .circleci/config.yml | 5 +++++ itests/mpool_msg_uuid_test.go | 9 ++++++--- node/impl/full/mpool.go | 2 +- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 53ac6bce0..e3bb77b9f 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -924,6 +924,11 @@ workflows: suite: itest-mempool target: "./itests/mempool_test.go" + - test: + name: test-itest-mpool_msg_uuid + suite: itest-mpool_msg_uuid + target: "./itests/mpool_msg_uuid_test.go" + - test: name: test-itest-multisig suite: itest-multisig diff --git a/itests/mpool_msg_uuid_test.go b/itests/mpool_msg_uuid_test.go index 74e2f2a23..3eb30a6f6 100644 --- a/itests/mpool_msg_uuid_test.go +++ b/itests/mpool_msg_uuid_test.go @@ -2,16 +2,19 @@ package itests import ( "context" + "testing" + "time" + + "github.com/stretchr/testify/require" + "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-state-types/exitcode" + "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/itests/kit" "github.com/filecoin-project/lotus/node/config" - "github.com/stretchr/testify/require" - "testing" - "time" ) func TestMsgWithoutUuidWithMaxFee(t *testing.T) { diff --git a/node/impl/full/mpool.go b/node/impl/full/mpool.go index a9f1ebda9..a2dbf0a86 100644 --- a/node/impl/full/mpool.go +++ b/node/impl/full/mpool.go @@ -3,8 +3,8 @@ package full import ( "context" "encoding/json" - "github.com/google/uuid" + "github.com/google/uuid" "github.com/ipfs/go-cid" "go.uber.org/fx" "golang.org/x/xerrors" From ea53f12a981288549a9ed873f00a2baaf6c417f5 Mon Sep 17 00:00:00 2001 From: TippyFlitsUK Date: Wed, 14 Sep 2022 00:10:22 +0100 Subject: [PATCH 123/185] chore: Fix dead links to docs.filecoin.io --- .github/ISSUE_TEMPLATE/bug_report.yml | 2 +- CHANGELOG.md | 24 ++++++++++--------- README.md | 14 +++++------ docker-compose.yaml | 2 +- documentation/en/README.md | 14 ++++------- documentation/en/about.md | 12 +++++----- .../en/default-lotus-miner-config.toml | 4 ++-- node/config/doc_gen.go | 4 ++-- node/config/types.go | 4 ++-- snap/snapcraft.yaml | 2 +- tools/dockers/docker-examples/README.md | 2 +- tools/packer/etc/motd | 4 ++-- 12 files changed, 43 insertions(+), 45 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 9c76b54dd..981a80256 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -81,7 +81,7 @@ body: render: text description: | Please provide debug logs of the problem, remember you can get set log level control for: - * lotus: use `lotus log list` to get all log systems available and set level by `lotus log set-level`. An example can be found [here](https://docs.filecoin.io/get-started/lotus/configuration-and-advanced-usage/#log-level-control). + * lotus: use `lotus log list` to get all log systems available and set level by `lotus log set-level`. An example can be found [here](https://lotus.filecoin.io/lotus/configure/defaults/#log-level-control). * lotus-miner:`lotus-miner log list` to get all log systems available and set level by `lotus-miner log set-level If you don't provide detailed logs when you raise the issue it will almost certainly be the first request I make before furthur diagnosing the problem. validations: diff --git a/CHANGELOG.md b/CHANGELOG.md index 0ce30c688..1e84bb02b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -103,6 +103,8 @@ Contributors | Aloxaf | 1 | +2/-2 | 1 | +# Lotus changelog + # v1.17.0 / 2022-08-02 This is an optional release of Lotus. This feature release introduces a lot of new sealing and scheduler improvements, and many other functionalities and bug fixes. @@ -1439,7 +1441,7 @@ storage providers and clients. ## Highlights - 🌟🌟🌟 Introduce Dagstore and CARv2 for deal-making (#6671) ([filecoin-project/lotus#6671](https://github.com/filecoin-project/lotus/pull/6671)) - - **[lotus miner markets' Dagstore](https://docs.filecoin.io/mine/lotus/dagstore/#conceptual-overview)** is a + - **[lotus miner markets' Dagstore](https://lotus.filecoin.io/storage-providers/operate/dagstore/)** is a component of the `markets` subsystem in lotus-miner. It is a sharded store to hold large IPLD graphs efficiently, packaged as location-transparent attachable CAR files and it replaces the former Badger staging blockstore. It is designed to provide high efficiency and throughput, and minimize resource utilization during deal-making operations. @@ -1447,18 +1449,18 @@ storage providers and clients. blockstores, which are served as the direct medium for data exchanges in markets for both storage and retrieval deal making without requiring intermediate buffers. - In the future, lotus will leverage and interact with Dagstore a lot for new features and improvements for deal - making, therefore, it's highly recommended to lotus users to go through [Lotus Miner: About the markets dagstore](https://docs.filecoin.io/mine/lotus/dagstore/#conceptual-overview) thoroughly to learn more about Dagstore's + making, therefore, it's highly recommended to lotus users to go through [Lotus Miner: About the markets dagstore](https://lotus.filecoin.io/storage-providers/operate/dagstore/) thoroughly to learn more about Dagstore's conceptual overview, terminology, directory structure, configuration and so on. - **Note**: - When you first start your lotus-miner or market subsystem with this release, a one-time/first-time **dagstore migration** will be triggered which replaces the former Badger staging blockstore with dagstore. We highly - recommend storage providers to read this [section](https://docs.filecoin.io/mine/lotus/dagstore/#first-time-migration) to learn more about + recommend storage providers to read this [section](https://lotus.filecoin.io/storage-providers/operate/dagstore/#first-time-migration) to learn more about what the process does, what to expect and how monitor it. - It is highly recommended to **wait all ongoing data transfer to finish or cancel inbound storage deals that are still transferring**, using the `lotus-miner data-transfers cancel` command before upgrade your market nodes. Reason being that the new dagstore changes attributes in the internal deal state objects, and the paths to the staging CARs where the deal data was being placed will be lost. - ‼️Having your dags initialized will become important in the near feature for you to provide a better storage and retrieval service. We'd suggest you to start [forced bulk initialization] soon if possible as this process places relatively high IP workload on your storage system and is better to be carried out gradually and over a - longer timeframe. Read how to do properly perform a force bulk initialization [here](https://docs.filecoin.io/mine/lotus/dagstore/#forcing-bulk-initialization). + longer timeframe. Read how to do properly perform a force bulk initialization [here](https://lotus.filecoin.io/storage-providers/operate/dagstore/#forcing-bulk-initialization). - ⏮ Rollback Alert(from v1.11.2-rcX to any version lower): If a storages deal is initiated with M1/v1.11.2(-rcX) release, it needs to get to the `StorageDealAwaitingPrecommit` state before you can do a version rollback or the markets process may panic. - 💙 **Special thanks to [MinerX fellows for testing and providing valuable feedbacks](https://github.com/filecoin-project/lotus/discussions/6852) for Dagstore in the past month!** @@ -1588,8 +1590,8 @@ Contributors This is a **highly recommended** but optional Lotus v1.11.1 release that introduces many deal making and datastore improvements and new features along with other bug fixes. ## Highlights -- ⭐️⭐️⭐️[**lotus-miner market subsystem**](https://docs.filecoin.io/mine/lotus/split-markets-miners/#frontmatter-title) is introduced in this release! It is **highly recommended** for storage providers to run markets processes on a separate machine! Doing so, only this machine needs to exposes public ports for deal making. This also means that the other miner operations can now be completely isolated by from the deal making processes and storage providers can stop and restarts the markets process without affecting an ongoing Winning/Window PoSt! - - More details on the concepts, architecture and how to split the market process can be found [here](https://docs.filecoin.io/mine/lotus/split-markets-miners/#concepts). +- ⭐️⭐️⭐️[**lotus-miner market subsystem**](https://lotus.filecoin.io/storage-providers/advanced-configurations/split-markets-miners/) is introduced in this release! It is **highly recommended** for storage providers to run markets processes on a separate machine! Doing so, only this machine needs to exposes public ports for deal making. This also means that the other miner operations can now be completely isolated by from the deal making processes and storage providers can stop and restarts the markets process without affecting an ongoing Winning/Window PoSt! + - More details on the concepts, architecture and how to split the market process can be found [here](https://lotus.filecoin.io/storage-providers/advanced-configurations/split-markets-miners/#concepts). - Base on your system setup(running on separate machines, same machine and so on), please see the suggested practice by community members [here](https://github.com/filecoin-project/lotus/discussions/7047#discussion-3515335). - Note: if you are running lotus-worker on a different machine, you will need to set `MARKETS_API_INFO` for certain CLI to work properly. This will be improved by #7072. - Huge thanks to MinerX fellows for [helping testing the implementation, reporting the issues so they were fixed by now and providing feedbacks](https://github.com/filecoin-project/lotus/discussions/6861) to user docs in the past three weeks! @@ -1599,7 +1601,7 @@ This is a **highly recommended** but optional Lotus v1.11.1 release that introd - `AvailableBalanceBuffer`: minimum available balance to keep in the miner actor before sending it with messages, default is 0FIL. - `DisableCollateralFallback`: whether to send collateral with messages even if there is no available balance in the miner actor, default is `false`. - Config for deal publishing control addresses ([filecoin-project/lotus#6697](https://github.com/filecoin-project/lotus/pull/6697)) - - Set `DealPublishControl` to set the wallet used for sending `PublishStorageDeals` messages, instructions [here](https://docs.filecoin.io/mine/lotus/miner-addresses/#control-addresses). + - Set `DealPublishControl` to set the wallet used for sending `PublishStorageDeals` messages, instructions [here](https://lotus.filecoin.io/storage-providers/operate/addresses/#control-addresses). - Config UX improvements ([filecoin-project/lotus#6848](https://github.com/filecoin-project/lotus/pull/6848)) - You can now preview the the default and updated node config by running `lotus/lotus-miner config default/updated` @@ -2028,7 +2030,7 @@ Note that this release is built on top of Lotus v1.9.0. Enterprising users can u FIPs [0008](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0008.md) and [0013](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0013.md) combine to allow for a significant increase in the rate of onboarding storage on the Filecoin network. This aims to lead to more useful data being stored on the network, reduced network congestion, and lower network base fee. -**Check out the documentation [here](https://docs.filecoin.io/mine/lotus/miner-configuration/#precommitsectorsbatch) for details on the new Lotus miner sealing config options, [here](https://docs.filecoin.io/mine/lotus/miner-configuration/#fees-section) for fee config options, and explanations of the new features.** +**Check out the documentation [here]((https://lotus.filecoin.io/storage-providers/advanced-configurations/sealing/#precommitsectorsbatch) for details on the new Lotus miner sealing config options, [here](https://lotus.filecoin.io/storage-providers/setup/configuration/#fees-section) for fee config options, and explanations of the new features.** Note: - We recommend to keep `PreCommitSectorsBatch` as 1. @@ -2044,7 +2046,7 @@ Given these assumptions: - We'd expect a network storage growth rate of around 530PiB per day. 😳 🎉 🥳 😅 - We'd expect network bandwidth dedicated to `SubmitWindowedPoSt` to grow by about 0.02% per day. -- We'd expect the [state-tree](https://spec.filecoin.io/#section-systems.filecoin_vm.state_tree) (and therefore [snapshot](https://docs.filecoin.io/get-started/lotus/chain/#lightweight-snapshot)) size to grow by 1.16GiB per day. +- We'd expect the [state-tree](https://spec.filecoin.io/#section-systems.filecoin_vm.state_tree) (and therefore [snapshot](https://lotus.filecoin.io/lotus/manage/chain-management/#lightweight-snapshot)) size to grow by 1.16GiB per day. - Nearly all of the state-tree growth is expected to come from new sector metadata. - We'd expect the daily lotus datastore growth rate to increase by about 10-15% (from current ~21GiB/day). - Most "growth" of the lotus datastore is due to "churn", historical data that's no longer referenced by the latest state-tree. @@ -2065,7 +2067,7 @@ Included in the HyperDrive upgrade is [FIP-0015](https://github.com/filecoin-pro - Implement FIP-0015 ([filecoin-project/lotus#6361](https://github.com/filecoin-project/lotus/pull/6361)) - Integrate FIP0013 and FIP0008 ([filecoin-project/lotus#6235](https://github.com/filecoin-project/lotus/pull/6235)) - - [Configuration docs and cli examples](https://docs.filecoin.io/mine/lotus/miner-configuration/#precommitsectorsbatch) + - [Configuration docs and cli examples](https://lotus.filecoin.io/storage-providers/advanced-configurations/sealing/#precommitsectorsbatch) - [cli docs](https://github.com/filecoin-project/lotus/blob/master/documentation/en/cli-lotus-miner.md#lotus-miner-sectors-batching) - Introduce gas prices for aggregate verifications ([filecoin-project/lotus#6347](https://github.com/filecoin-project/lotus/pull/6347)) - Introduce v5 actors ([filecoin-project/lotus#6195](https://github.com/filecoin-project/lotus/pull/6195)) @@ -2383,7 +2385,7 @@ Note that this release does NOT set an upgrade epoch for v3 actors to take effec - [#5309](https://github.com/filecoin-project/lotus/pull/5309) Batch multiple deals in one `PublishStorageMessages` - [#5411](https://github.com/filecoin-project/lotus/pull/5411) Handle batch `PublishStorageDeals` message in sealing recovery - [#5505](https://github.com/filecoin-project/lotus/pull/5505) Exclude expired deals from batching in `PublishStorageDeals` messages - - Added `PublishMsgPeriod` and `MaxDealsPerPublishMsg` to miner `Dealmaking` [configuration](https://docs.filecoin.io/mine/lotus/miner-configuration/#dealmaking-section). See how they work [here](https://docs.filecoin.io/mine/lotus/miner-configuration/#publishing-several-deals-in-one-message). + - Added `PublishMsgPeriod` and `MaxDealsPerPublishMsg` to miner `Dealmaking` [configuration](https://lotus.filecoin.io/storage-providers/advanced-configurations/market/#dealmaking-section). See how they work [here](https://lotus.filecoin.io/storage-providers/advanced-configurations/market/#publishing-several-deals-in-one-message). - [#5538](https://github.com/filecoin-project/lotus/pull/5538), [#5549](https://github.com/filecoin-project/lotus/pull/5549) Added a command to list pending deals and force publish messages. - Run `lotus-miner market pending-publish` - [#5428](https://github.com/filecoin-project/lotus/pull/5428) Moved waiting for `PublishStorageDeals` messages' receipt from markets to lotus diff --git a/README.md b/README.md index 0b3062520..bab033e72 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@

- + Project Lotus Logo

@@ -67,7 +67,7 @@ Fedora: sudo dnf -y install gcc make git bzr jq pkgconfig mesa-libOpenCL mesa-libOpenCL-devel opencl-headers ocl-icd ocl-icd-devel clang llvm wget hwloc hwloc-devel ``` -For other distributions you can find the required dependencies [here.](https://docs.filecoin.io/get-started/lotus/installation/#system-specific) For instructions specific to macOS, you can find them [here.](https://docs.filecoin.io/get-started/lotus/installation/#macos) +For other distributions you can find the required dependencies [here.](https://lotus.filecoin.io/lotus/install/prerequisites/#supported-platforms) For instructions specific to macOS, you can find them [here.](https://lotus.filecoin.io/lotus/install/macos/) #### Go @@ -101,7 +101,7 @@ Note: The default branch `master` is the dev branch where the latest new feature 2. To join mainnet, checkout the [latest release](https://github.com/filecoin-project/lotus/releases). - If you are changing networks from a previous Lotus installation or there has been a network reset, read the [Switch networks guide](https://docs.filecoin.io/get-started/lotus/switch-networks/) before proceeding. + If you are changing networks from a previous Lotus installation or there has been a network reset, read the [Switch networks guide](https://lotus.filecoin.io/lotus/manage/switch-networks/) before proceeding. For networks other than mainnet, look up the current branch or tag/commit for the network you want to join in the [Filecoin networks dashboard](https://network.filecoin.io), then build Lotus for your specific network below. @@ -113,8 +113,8 @@ Note: The default branch `master` is the dev branch where the latest new feature Currently, the latest code on the _master_ branch corresponds to mainnet. -3. If you are in China, see "[Lotus: tips when running in China](https://docs.filecoin.io/get-started/lotus/tips-running-in-china/)". -4. This build instruction uses the prebuilt proofs binaries. If you want to build the proof binaries from source check the [complete instructions](https://docs.filecoin.io/get-started/lotus/installation/#build-and-install-lotus). Note, if you are building the proof binaries from source, [installing rustup](https://docs.filecoin.io/get-started/lotus/installation/#rustup) is also needed. +3. If you are in China, see "[Lotus: tips when running in China](https://lotus.filecoin.io/lotus/configure/nodes-in-china/)". +4. This build instruction uses the prebuilt proofs binaries. If you want to build the proof binaries from source check the [complete instructions](https://lotus.filecoin.io/lotus/install/prerequisites/). Note, if you are building the proof binaries from source, [installing rustup](https://lotus.filecoin.io/lotus/install/linux/#rustup) is also needed. 5. Build and install Lotus: @@ -129,9 +129,9 @@ Note: The default branch `master` is the dev branch where the latest new feature This will put `lotus`, `lotus-miner` and `lotus-worker` in `/usr/local/bin`. - `lotus` will use the `$HOME/.lotus` folder by default for storage (configuration, chain data, wallets, etc). See [advanced options](https://docs.filecoin.io/get-started/lotus/configuration-and-advanced-usage/) for information on how to customize the Lotus folder. + `lotus` will use the `$HOME/.lotus` folder by default for storage (configuration, chain data, wallets, etc). See [advanced options](https://lotus.filecoin.io/lotus/configure/defaults/#environment-variables) for information on how to customize the Lotus folder. -6. You should now have Lotus installed. You can now [start the Lotus daemon and sync the chain](https://docs.filecoin.io/get-started/lotus/installation/#start-the-lotus-daemon-and-sync-the-chain). +6. You should now have Lotus installed. You can now [start the Lotus daemon and sync the chain](https://lotus.filecoin.io/lotus/install/linux/#start-the-lotus-daemon-and-sync-the-chain). ## License diff --git a/docker-compose.yaml b/docker-compose.yaml index d68eed8db..a269ba7b5 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -15,7 +15,7 @@ # docker swarm init (if you haven't already) # docker stack deploy -c docker-compose.yaml mylotuscluster # -# for more information, please visit docs.filecoin.io +# for more information, please visit lotus.filecoin.io version: "3.8" diff --git a/documentation/en/README.md b/documentation/en/README.md index 21cdbe8b7..8c99df017 100644 --- a/documentation/en/README.md +++ b/documentation/en/README.md @@ -2,16 +2,12 @@ This folder contains some Lotus documentation mostly intended for Lotus developers. -User documentation (including documentation for miners) has been moved to https://docs.filecoin.io and https://lotus.filecoin.io: +User documentation (including documentation for miners) has been moved to https://lotus.filecoin.io: -- https://docs.filecoin.io/get-started/overview/ - - https://lotus.filecoin.io/lotus/get-started/what-is-lotus/ -- https://docs.filecoin.io/store/ - - https://lotus.filecoin.io/tutorials/lotus/store-and-retrieve/store-data/ -- https://docs.filecoin.io/storage-provider/ - - https://lotus.filecoin.io/tutorials/lotus-miner/run-a-miner/ -- https://docs.filecoin.io/build/ - - https://lotus.filecoin.io/developers/ +- https://lotus.filecoin.io/lotus/get-started/what-is-lotus/ +- https://lotus.filecoin.io/tutorials/lotus/store-and-retrieve/store-data/ +- https://lotus.filecoin.io/tutorials/lotus-miner/run-a-miner/ +- https://lotus.filecoin.io/developers/ ## Documentation Website diff --git a/documentation/en/about.md b/documentation/en/about.md index f2051e00b..de2bb4c37 100644 --- a/documentation/en/about.md +++ b/documentation/en/about.md @@ -8,12 +8,12 @@ It is written in Go and provides a suite of command-line applications: - Lotus Miner (`lotus-miner`): a Filecoin miner. See the the respective Lotus Miner section in the Mine documentation. - Lotus Worker (`lotus-worker`): a worker that assists miners to perform mining-related tasks. See its respective guide for more information. -The [Lotus user documentation](https://docs.filecoin.io/get-started/lotus) is part of the [Filecoin documentation site](https://docs.filecoin.io): +The [Lotus user documentation](https://lotus.filecoin.io/lotus/get-started/what-is-lotus/) is part of the [Filecoin documentation site](https://lotus.filecoin.io): -* To install and get started with Lotus, visit the [Get Started section](https://docs.filecoin.io/get-started/lotus). -* Information about how to perform deals on the Filecoin network using Lotus can be found in the [Store section](https://docs.filecoin.io/store/lotus). -* Miners looking to provide storage to the Network can find the latest guides in the [Mine section](https://docs.filecoin.io/mine/lotus). -* Developers and integrators that wish to use the Lotus APIs can start in the [Build section](https://docs.filecoin.io/mine/lotus). +* To install and get started with Lotus, visit the [Get Started section](https://lotus.filecoin.io/lotus/install/prerequisites/). +* Information about how to perform deals on the Filecoin network using Lotus can be found in the [Store section](https://lotus.filecoin.io/tutorials/lotus/store-and-retrieve/store-data/). +* Miners looking to provide storage to the Network can find the latest guides in the [Mine section](https://lotus.filecoin.io/tutorials/lotus-miner/run-a-miner/). +* Developers and integrators that wish to use the Lotus APIs can start in the [Build section](https://lotus.filecoin.io/tutorials/lotus/build-with-lotus-api/). -For more details about Filecoin, check out the [Filecoin Docs](https://docs.filecoin.io) and [Filecoin Spec](https://spec.filecoin.io/). +For more details about Filecoin, check out the [Filecoin Docs](https://lotus.filecoin.io) and [Filecoin Spec](https://spec.filecoin.io/). diff --git a/documentation/en/default-lotus-miner-config.toml b/documentation/en/default-lotus-miner-config.toml index 786924904..46b21a91c 100644 --- a/documentation/en/default-lotus-miner-config.toml +++ b/documentation/en/default-lotus-miner-config.toml @@ -240,14 +240,14 @@ #StartEpochSealingBuffer = 480 # A command used for fine-grained evaluation of storage deals - # see https://docs.filecoin.io/mine/lotus/miner-configuration/#using-filters-for-fine-grained-storage-and-retrieval-deal-acceptance for more details + # see https://lotus.filecoin.io/storage-providers/advanced-configurations/market/#using-filters-for-fine-grained-storage-and-retrieval-deal-acceptance for more details # # type: string # env var: LOTUS_DEALMAKING_FILTER #Filter = "" # A command used for fine-grained evaluation of retrieval deals - # see https://docs.filecoin.io/mine/lotus/miner-configuration/#using-filters-for-fine-grained-storage-and-retrieval-deal-acceptance for more details + # see https://lotus.filecoin.io/storage-providers/advanced-configurations/market/#using-filters-for-fine-grained-storage-and-retrieval-deal-acceptance for more details # # type: string # env var: LOTUS_DEALMAKING_RETRIEVALFILTER diff --git a/node/config/doc_gen.go b/node/config/doc_gen.go index 68e413ac8..63c1ddabd 100644 --- a/node/config/doc_gen.go +++ b/node/config/doc_gen.go @@ -325,14 +325,14 @@ regardless of this number.`, Type: "string", Comment: `A command used for fine-grained evaluation of storage deals -see https://docs.filecoin.io/mine/lotus/miner-configuration/#using-filters-for-fine-grained-storage-and-retrieval-deal-acceptance for more details`, +see https://lotus.filecoin.io/storage-providers/advanced-configurations/market/#using-filters-for-fine-grained-storage-and-retrieval-deal-acceptance for more details`, }, { Num: "RetrievalFilter", Type: "string", Comment: `A command used for fine-grained evaluation of retrieval deals -see https://docs.filecoin.io/mine/lotus/miner-configuration/#using-filters-for-fine-grained-storage-and-retrieval-deal-acceptance for more details`, +see https://lotus.filecoin.io/storage-providers/advanced-configurations/market/#using-filters-for-fine-grained-storage-and-retrieval-deal-acceptance for more details`, }, { Num: "RetrievalPricing", diff --git a/node/config/types.go b/node/config/types.go index ddc574efb..dbea0ddb6 100644 --- a/node/config/types.go +++ b/node/config/types.go @@ -158,10 +158,10 @@ type DealmakingConfig struct { StartEpochSealingBuffer uint64 // A command used for fine-grained evaluation of storage deals - // see https://docs.filecoin.io/mine/lotus/miner-configuration/#using-filters-for-fine-grained-storage-and-retrieval-deal-acceptance for more details + // see https://lotus.filecoin.io/storage-providers/advanced-configurations/market/#using-filters-for-fine-grained-storage-and-retrieval-deal-acceptance for more details Filter string // A command used for fine-grained evaluation of retrieval deals - // see https://docs.filecoin.io/mine/lotus/miner-configuration/#using-filters-for-fine-grained-storage-and-retrieval-deal-acceptance for more details + // see https://lotus.filecoin.io/storage-providers/advanced-configurations/market/#using-filters-for-fine-grained-storage-and-retrieval-deal-acceptance for more details RetrievalFilter string RetrievalPricing *RetrievalPricing diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index 3f83ad16d..8c7323a2b 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -13,7 +13,7 @@ description: | https://fil.org - https://docs.filecoin.io + https://lotus.filecoin.io https://github.com/filecoin-project/lotus diff --git a/tools/dockers/docker-examples/README.md b/tools/dockers/docker-examples/README.md index 3b8c34480..22ddd2476 100644 --- a/tools/dockers/docker-examples/README.md +++ b/tools/dockers/docker-examples/README.md @@ -11,7 +11,7 @@ In this `docker-examples/` directory are community-contributed Docker and Docker - local node for a developer (`api-local-`) - hosted endpoint for apps / multiple developers (`api-hosted-`) - **For a local devnet or shared devnet** - - basic local devnet (also see [lotus docs on setting up a local devnet](https://docs.filecoin.io/build/local-devnet/)) + - basic local devnet (also see [lotus docs on setting up a local devnet](https://lotus.filecoin.io/developers/local-network/)) - shared devnet diff --git a/tools/packer/etc/motd b/tools/packer/etc/motd index 5966d972b..892b156e1 100644 --- a/tools/packer/etc/motd +++ b/tools/packer/etc/motd @@ -55,10 +55,10 @@ You only need to do this once, after which, you can enable and start the miner. Do you want to access your lotus daemon remotely? Learn how to setup token authentication and use client libraries from lotus docs. -https://docs.filecoin.io/build/lotus/enable-remote-api-access/ +https://lotus.filecoin.io/reference/basics/api-access/ -For more information, see https://docs.filecoin.io/ +For more information, see https://lotus.filecoin.io/ Found a bug? let us know! https://github.com/filecoin-project/lotus Chat with us on slack! https://filecoinproject.slack.com/archives/CEGN061C5 From 21906b5a63cc819b707c856485e497c7a59904d2 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 14 Sep 2022 00:19:47 -0400 Subject: [PATCH 124/185] add api and cli calls for beneficiary withdrawl --- api/api_storage.go | 5 ++++ api/proxy_gen.go | 13 ++++++++++ api/types.go | 4 +++ build/openrpc/full.json.gz | Bin 28281 -> 28423 bytes build/openrpc/gateway.json.gz | Bin 4942 -> 5080 bytes build/openrpc/miner.json.gz | Bin 15449 -> 15508 bytes build/openrpc/worker.json.gz | Bin 5076 -> 5075 bytes cmd/lotus-miner/actor.go | 14 ++++++++-- cmd/lotus-shed/actor.go | 15 +++++++++-- documentation/en/api-v0-methods-miner.md | 27 ++++++++++++++++++++ documentation/en/api-v0-methods.md | 15 ++++++++++- documentation/en/api-v1-unstable-methods.md | 15 ++++++++++- documentation/en/cli-lotus-miner.md | 5 ++-- node/impl/full/state.go | 3 +++ node/impl/storminer.go | 17 +++++++++++- 15 files changed, 124 insertions(+), 9 deletions(-) diff --git a/api/api_storage.go b/api/api_storage.go index 1caf459d6..e9c7aad61 100644 --- a/api/api_storage.go +++ b/api/api_storage.go @@ -54,6 +54,11 @@ type StorageMiner interface { // and does not wait for message execution ActorWithdrawBalance(ctx context.Context, amount abi.TokenAmount) (cid.Cid, error) //perm:admin + // BeneficiaryWithdrawBalance allows the beneficiary of a miner to withdraw balance from miner actor + // Specify amount as "0" to withdraw full balance. This method returns a message CID + // and does not wait for message execution + BeneficiaryWithdrawBalance(context.Context, abi.TokenAmount) (cid.Cid, error) //perm:admin + MiningBase(context.Context) (*types.TipSet, error) //perm:read ComputeWindowPoSt(ctx context.Context, dlIdx uint64, tsk types.TipSetKey) ([]miner.SubmitWindowedPoStParams, error) //perm:admin diff --git a/api/proxy_gen.go b/api/proxy_gen.go index 2b162f346..43bd40f83 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -664,6 +664,8 @@ type StorageMinerStruct struct { ActorWithdrawBalance func(p0 context.Context, p1 abi.TokenAmount) (cid.Cid, error) `perm:"admin"` + BeneficiaryWithdrawBalance func(p0 context.Context, p1 abi.TokenAmount) (cid.Cid, error) `perm:"admin"` + CheckProvable func(p0 context.Context, p1 abi.RegisteredPoStProof, p2 []storiface.SectorRef, p3 bool) (map[abi.SectorNumber]string, error) `perm:"admin"` ComputeDataCid func(p0 context.Context, p1 abi.UnpaddedPieceSize, p2 storiface.Data) (abi.PieceInfo, error) `perm:"admin"` @@ -4036,6 +4038,17 @@ func (s *StorageMinerStub) ActorWithdrawBalance(p0 context.Context, p1 abi.Token return *new(cid.Cid), ErrNotSupported } +func (s *StorageMinerStruct) BeneficiaryWithdrawBalance(p0 context.Context, p1 abi.TokenAmount) (cid.Cid, error) { + if s.Internal.BeneficiaryWithdrawBalance == nil { + return *new(cid.Cid), ErrNotSupported + } + return s.Internal.BeneficiaryWithdrawBalance(p0, p1) +} + +func (s *StorageMinerStub) BeneficiaryWithdrawBalance(p0 context.Context, p1 abi.TokenAmount) (cid.Cid, error) { + return *new(cid.Cid), ErrNotSupported +} + func (s *StorageMinerStruct) CheckProvable(p0 context.Context, p1 abi.RegisteredPoStProof, p2 []storiface.SectorRef, p3 bool) (map[abi.SectorNumber]string, error) { if s.Internal.CheckProvable == nil { return *new(map[abi.SectorNumber]string), ErrNotSupported diff --git a/api/types.go b/api/types.go index 683589ce1..dc83be3c7 100644 --- a/api/types.go +++ b/api/types.go @@ -17,6 +17,7 @@ import ( datatransfer "github.com/filecoin-project/go-data-transfer" "github.com/filecoin-project/go-fil-markets/retrievalmarket" "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/builtin/v9/miner" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/node/modules/dtypes" @@ -295,6 +296,9 @@ type MinerInfo struct { SectorSize abi.SectorSize WindowPoStPartitionSectors uint64 ConsensusFaultElapsed abi.ChainEpoch + Beneficiary address.Address + BeneficiaryTerm miner.BeneficiaryTerm + PendingBeneficiaryTerm *miner.PendingBeneficiaryChange } type NetworkParams struct { diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index c14beca7f99bcc8645f9221a4fa5accfc65171b6..4d823b135b775d5c1fb538b9375e35941490c1f0 100644 GIT binary patch delta 26887 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 O0RR7yxRpqhg#`ej^&`Ik delta 26760 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 diff --git a/build/openrpc/gateway.json.gz b/build/openrpc/gateway.json.gz index 6e069623c457896a01bc2dd84d44f4c68bd10eb3..570715c79f051576a54c8854093418ef5ab8fee0 100644 GIT binary patch literal 5080 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 literal 4942 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 delta 12749 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 HC;|Zh#$dB3 delta 3928 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 Date: Wed, 14 Sep 2022 12:41:47 -0400 Subject: [PATCH 125/185] fix: docsgen: revert rename of API Name to Num --- node/config/cfgdocgen/gen.go | 4 +- node/config/doc_gen.go | 326 +++++++++++++++++------------------ node/config/doc_util.go | 6 +- 3 files changed, 168 insertions(+), 168 deletions(-) diff --git a/node/config/cfgdocgen/gen.go b/node/config/cfgdocgen/gen.go index d14b1aecf..513350152 100644 --- a/node/config/cfgdocgen/gen.go +++ b/node/config/cfgdocgen/gen.go @@ -94,7 +94,7 @@ func run() error { package config type DocField struct { - Num string + Name string Type string Comment string } @@ -109,7 +109,7 @@ var Doc = map[string][]DocField{ for _, f := range typ { fmt.Println("\t\t{") - fmt.Printf("\t\t\tNum: \"%s\",\n", f.Name) + fmt.Printf("\t\t\tName: \"%s\",\n", f.Name) fmt.Printf("\t\t\tType: \"%s\",\n\n", f.Type) fmt.Printf("\t\t\tComment: `%s`,\n", f.Comment) fmt.Println("\t\t},") diff --git a/node/config/doc_gen.go b/node/config/doc_gen.go index 63c1ddabd..f317e0606 100644 --- a/node/config/doc_gen.go +++ b/node/config/doc_gen.go @@ -3,7 +3,7 @@ package config type DocField struct { - Num string + Name string Type string Comment string } @@ -11,19 +11,19 @@ type DocField struct { var Doc = map[string][]DocField{ "API": []DocField{ { - Num: "ListenAddress", + Name: "ListenAddress", Type: "string", Comment: `Binding address for the Lotus API`, }, { - Num: "RemoteListenAddress", + Name: "RemoteListenAddress", Type: "string", Comment: ``, }, { - Num: "Timeout", + Name: "Timeout", Type: "Duration", Comment: ``, @@ -31,7 +31,7 @@ var Doc = map[string][]DocField{ }, "Backup": []DocField{ { - Num: "DisableMetadataLog", + Name: "DisableMetadataLog", Type: "bool", Comment: `When set to true disables metadata log (.lotus/kvlog). This can save disk @@ -43,13 +43,13 @@ your node if metadata log is disabled`, }, "BatchFeeConfig": []DocField{ { - Num: "Base", + Name: "Base", Type: "types.FIL", Comment: ``, }, { - Num: "PerSector", + Name: "PerSector", Type: "types.FIL", Comment: ``, @@ -57,13 +57,13 @@ your node if metadata log is disabled`, }, "Chainstore": []DocField{ { - Num: "EnableSplitstore", + Name: "EnableSplitstore", Type: "bool", Comment: ``, }, { - Num: "Splitstore", + Name: "Splitstore", Type: "Splitstore", Comment: ``, @@ -71,45 +71,45 @@ your node if metadata log is disabled`, }, "Client": []DocField{ { - Num: "UseIpfs", + Name: "UseIpfs", Type: "bool", Comment: ``, }, { - Num: "IpfsOnlineMode", + Name: "IpfsOnlineMode", Type: "bool", Comment: ``, }, { - Num: "IpfsMAddr", + Name: "IpfsMAddr", Type: "string", Comment: ``, }, { - Num: "IpfsUseForRetrieval", + Name: "IpfsUseForRetrieval", Type: "bool", Comment: ``, }, { - Num: "SimultaneousTransfersForStorage", + Name: "SimultaneousTransfersForStorage", Type: "uint64", Comment: `The maximum number of simultaneous data transfers between the client and storage providers for storage deals`, }, { - Num: "SimultaneousTransfersForRetrieval", + Name: "SimultaneousTransfersForRetrieval", Type: "uint64", Comment: `The maximum number of simultaneous data transfers between the client and storage providers for retrieval deals`, }, { - Num: "OffChainRetrieval", + Name: "OffChainRetrieval", Type: "bool", Comment: `Require that retrievals perform no on-chain operations. Paid retrievals @@ -119,31 +119,31 @@ of automatically performing on-chain operations.`, }, "Common": []DocField{ { - Num: "API", + Name: "API", Type: "API", Comment: ``, }, { - Num: "Backup", + Name: "Backup", Type: "Backup", Comment: ``, }, { - Num: "Logging", + Name: "Logging", Type: "Logging", Comment: ``, }, { - Num: "Libp2p", + Name: "Libp2p", Type: "Libp2p", Comment: ``, }, { - Num: "Pubsub", + Name: "Pubsub", Type: "Pubsub", Comment: ``, @@ -151,7 +151,7 @@ of automatically performing on-chain operations.`, }, "DAGStoreConfig": []DocField{ { - Num: "RootDir", + Name: "RootDir", Type: "string", Comment: `Path to the dagstore root directory. This directory contains three @@ -166,7 +166,7 @@ Default value: /dagstore (split deployment) or /dagstore (monolith deployment)`, }, { - Num: "MaxConcurrentIndex", + Name: "MaxConcurrentIndex", Type: "int", Comment: `The maximum amount of indexing jobs that can run simultaneously. @@ -174,7 +174,7 @@ Default value: /dagstore (split deployment) or Default value: 5.`, }, { - Num: "MaxConcurrentReadyFetches", + Name: "MaxConcurrentReadyFetches", Type: "int", Comment: `The maximum amount of unsealed deals that can be fetched simultaneously @@ -182,7 +182,7 @@ from the storage subsystem. 0 means unlimited. Default value: 0 (unlimited).`, }, { - Num: "MaxConcurrentUnseals", + Name: "MaxConcurrentUnseals", Type: "int", Comment: `The maximum amount of unseals that can be processed simultaneously @@ -190,7 +190,7 @@ from the storage subsystem. 0 means unlimited. Default value: 0 (unlimited).`, }, { - Num: "MaxConcurrencyStorageCalls", + Name: "MaxConcurrencyStorageCalls", Type: "int", Comment: `The maximum number of simultaneous inflight API calls to the storage @@ -198,7 +198,7 @@ subsystem. Default value: 100.`, }, { - Num: "GCInterval", + Name: "GCInterval", Type: "Duration", Comment: `The time between calls to periodic dagstore GC, in time.Duration string @@ -208,49 +208,49 @@ Default value: 1 minute.`, }, "DealmakingConfig": []DocField{ { - Num: "ConsiderOnlineStorageDeals", + Name: "ConsiderOnlineStorageDeals", Type: "bool", Comment: `When enabled, the miner can accept online deals`, }, { - Num: "ConsiderOfflineStorageDeals", + Name: "ConsiderOfflineStorageDeals", Type: "bool", Comment: `When enabled, the miner can accept offline deals`, }, { - Num: "ConsiderOnlineRetrievalDeals", + Name: "ConsiderOnlineRetrievalDeals", Type: "bool", Comment: `When enabled, the miner can accept retrieval deals`, }, { - Num: "ConsiderOfflineRetrievalDeals", + Name: "ConsiderOfflineRetrievalDeals", Type: "bool", Comment: `When enabled, the miner can accept offline retrieval deals`, }, { - Num: "ConsiderVerifiedStorageDeals", + Name: "ConsiderVerifiedStorageDeals", Type: "bool", Comment: `When enabled, the miner can accept verified deals`, }, { - Num: "ConsiderUnverifiedStorageDeals", + Name: "ConsiderUnverifiedStorageDeals", Type: "bool", Comment: `When enabled, the miner can accept unverified deals`, }, { - Num: "PieceCidBlocklist", + Name: "PieceCidBlocklist", Type: "[]cid.Cid", Comment: `A list of Data CIDs to reject when making deals`, }, { - Num: "ExpectedSealDuration", + Name: "ExpectedSealDuration", Type: "Duration", Comment: `Maximum expected amount of time getting the deal into a sealed sector will take @@ -258,47 +258,47 @@ This includes the time the deal will need to get transferred and published before being assigned to a sector`, }, { - Num: "MaxDealStartDelay", + Name: "MaxDealStartDelay", Type: "Duration", Comment: `Maximum amount of time proposed deal StartEpoch can be in future`, }, { - Num: "PublishMsgPeriod", + Name: "PublishMsgPeriod", Type: "Duration", Comment: `When a deal is ready to publish, the amount of time to wait for more deals to be ready to publish before publishing them all as a batch`, }, { - Num: "MaxDealsPerPublishMsg", + Name: "MaxDealsPerPublishMsg", Type: "uint64", Comment: `The maximum number of deals to include in a single PublishStorageDeals message`, }, { - Num: "MaxProviderCollateralMultiplier", + Name: "MaxProviderCollateralMultiplier", Type: "uint64", Comment: `The maximum collateral that the provider will put up against a deal, as a multiplier of the minimum collateral bound`, }, { - Num: "MaxStagingDealsBytes", + Name: "MaxStagingDealsBytes", Type: "int64", Comment: `The maximum allowed disk usage size in bytes of staging deals not yet passed to the sealing node by the markets service. 0 is unlimited.`, }, { - Num: "SimultaneousTransfersForStorage", + Name: "SimultaneousTransfersForStorage", Type: "uint64", Comment: `The maximum number of parallel online data transfers for storage deals`, }, { - Num: "SimultaneousTransfersForStoragePerClient", + Name: "SimultaneousTransfersForStoragePerClient", Type: "uint64", Comment: `The maximum number of simultaneous data transfers from any single client @@ -309,33 +309,33 @@ across all storage clients is bound by SimultaneousTransfersForStorage regardless of this number.`, }, { - Num: "SimultaneousTransfersForRetrieval", + Name: "SimultaneousTransfersForRetrieval", Type: "uint64", Comment: `The maximum number of parallel online data transfers for retrieval deals`, }, { - Num: "StartEpochSealingBuffer", + Name: "StartEpochSealingBuffer", Type: "uint64", Comment: `Minimum start epoch buffer to give time for sealing of sector with deal.`, }, { - Num: "Filter", + Name: "Filter", Type: "string", Comment: `A command used for fine-grained evaluation of storage deals see https://lotus.filecoin.io/storage-providers/advanced-configurations/market/#using-filters-for-fine-grained-storage-and-retrieval-deal-acceptance for more details`, }, { - Num: "RetrievalFilter", + Name: "RetrievalFilter", Type: "string", Comment: `A command used for fine-grained evaluation of retrieval deals see https://lotus.filecoin.io/storage-providers/advanced-configurations/market/#using-filters-for-fine-grained-storage-and-retrieval-deal-acceptance for more details`, }, { - Num: "RetrievalPricing", + Name: "RetrievalPricing", Type: "*RetrievalPricing", Comment: ``, @@ -343,7 +343,7 @@ see https://lotus.filecoin.io/storage-providers/advanced-configurations/market/# }, "FeeConfig": []DocField{ { - Num: "DefaultMaxFee", + Name: "DefaultMaxFee", Type: "types.FIL", Comment: ``, @@ -351,25 +351,25 @@ see https://lotus.filecoin.io/storage-providers/advanced-configurations/market/# }, "FullNode": []DocField{ { - Num: "Client", + Name: "Client", Type: "Client", Comment: ``, }, { - Num: "Wallet", + Name: "Wallet", Type: "Wallet", Comment: ``, }, { - Num: "Fees", + Name: "Fees", Type: "FeeConfig", Comment: ``, }, { - Num: "Chainstore", + Name: "Chainstore", Type: "Chainstore", Comment: ``, @@ -377,14 +377,14 @@ see https://lotus.filecoin.io/storage-providers/advanced-configurations/market/# }, "IndexProviderConfig": []DocField{ { - Num: "Enable", + Name: "Enable", Type: "bool", Comment: `Enable set whether to enable indexing announcement to the network and expose endpoints that allow indexer nodes to process announcements. Enabled by default.`, }, { - Num: "EntriesCacheCapacity", + Name: "EntriesCacheCapacity", Type: "int", Comment: `EntriesCacheCapacity sets the maximum capacity to use for caching the indexing advertisement @@ -395,7 +395,7 @@ with the default EntriesCacheCapacity, and EntriesChunkSize means the cache size 256MiB when full.`, }, { - Num: "EntriesChunkSize", + Name: "EntriesChunkSize", Type: "int", Comment: `EntriesChunkSize sets the maximum number of multihashes to include in a single entries chunk. @@ -403,7 +403,7 @@ Defaults to 16384 if not specified. Note that chunks are chained together for in advertisements that include more multihashes than the configured EntriesChunkSize.`, }, { - Num: "TopicName", + Name: "TopicName", Type: "string", Comment: `TopicName sets the topic name on which the changes to the advertised content are announced. @@ -412,7 +412,7 @@ in following format: '/indexer/ingest/' Defaults to empty, which implies the topic name is inferred from network name.`, }, { - Num: "PurgeCacheOnStart", + Name: "PurgeCacheOnStart", Type: "bool", Comment: `PurgeCacheOnStart sets whether to clear any cached entries chunks when the provider engine @@ -422,14 +422,14 @@ datastore if any is present.`, }, "Libp2p": []DocField{ { - Num: "ListenAddresses", + Name: "ListenAddresses", Type: "[]string", Comment: `Binding address for the libp2p host - 0 means random port. Format: multiaddress; see https://multiformats.io/multiaddr/`, }, { - Num: "AnnounceAddresses", + Name: "AnnounceAddresses", Type: "[]string", Comment: `Addresses to explicitally announce to other peers. If not specified, @@ -437,26 +437,26 @@ all interface addresses are announced Format: multiaddress`, }, { - Num: "NoAnnounceAddresses", + Name: "NoAnnounceAddresses", Type: "[]string", Comment: `Addresses to not announce Format: multiaddress`, }, { - Num: "BootstrapPeers", + Name: "BootstrapPeers", Type: "[]string", Comment: ``, }, { - Num: "ProtectedPeers", + Name: "ProtectedPeers", Type: "[]string", Comment: ``, }, { - Num: "DisableNatPortMap", + Name: "DisableNatPortMap", Type: "bool", Comment: `When not disabled (default), lotus asks NAT devices (e.g., routers), to @@ -465,14 +465,14 @@ When this works (i.e., when your router supports NAT port forwarding), it makes the local lotus node accessible from the public internet`, }, { - Num: "ConnMgrLow", + Name: "ConnMgrLow", Type: "uint", Comment: `ConnMgrLow is the number of connections that the basic connection manager will trim down to.`, }, { - Num: "ConnMgrHigh", + Name: "ConnMgrHigh", Type: "uint", Comment: `ConnMgrHigh is the number of connections that, when exceeded, will trigger @@ -480,7 +480,7 @@ a connection GC operation. Note: protected/recently formed connections don't count towards this limit.`, }, { - Num: "ConnMgrGrace", + Name: "ConnMgrGrace", Type: "Duration", Comment: `ConnMgrGrace is a time duration that new connections are immune from being @@ -489,7 +489,7 @@ closed by the connection manager.`, }, "Logging": []DocField{ { - Num: "SubsystemLevels", + Name: "SubsystemLevels", Type: "map[string]string", Comment: `SubsystemLevels specify per-subsystem log levels`, @@ -497,38 +497,38 @@ closed by the connection manager.`, }, "MinerAddressConfig": []DocField{ { - Num: "PreCommitControl", + Name: "PreCommitControl", Type: "[]string", Comment: `Addresses to send PreCommit messages from`, }, { - Num: "CommitControl", + Name: "CommitControl", Type: "[]string", Comment: `Addresses to send Commit messages from`, }, { - Num: "TerminateControl", + Name: "TerminateControl", Type: "[]string", Comment: ``, }, { - Num: "DealPublishControl", + Name: "DealPublishControl", Type: "[]string", Comment: ``, }, { - Num: "DisableOwnerFallback", + Name: "DisableOwnerFallback", Type: "bool", Comment: `DisableOwnerFallback disables usage of the owner address for messages sent automatically`, }, { - Num: "DisableWorkerFallback", + Name: "DisableWorkerFallback", Type: "bool", Comment: `DisableWorkerFallback disables usage of the worker address for messages @@ -539,49 +539,49 @@ over the worker address if this flag is set.`, }, "MinerFeeConfig": []DocField{ { - Num: "MaxPreCommitGasFee", + Name: "MaxPreCommitGasFee", Type: "types.FIL", Comment: ``, }, { - Num: "MaxCommitGasFee", + Name: "MaxCommitGasFee", Type: "types.FIL", Comment: ``, }, { - Num: "MaxPreCommitBatchGasFee", + Name: "MaxPreCommitBatchGasFee", Type: "BatchFeeConfig", Comment: `maxBatchFee = maxBase + maxPerSector * nSectors`, }, { - Num: "MaxCommitBatchGasFee", + Name: "MaxCommitBatchGasFee", Type: "BatchFeeConfig", Comment: ``, }, { - Num: "MaxTerminateGasFee", + Name: "MaxTerminateGasFee", Type: "types.FIL", Comment: ``, }, { - Num: "MaxWindowPoStGasFee", + Name: "MaxWindowPoStGasFee", Type: "types.FIL", Comment: `WindowPoSt is a high-value operation, so the default fee should be high.`, }, { - Num: "MaxPublishDealsFee", + Name: "MaxPublishDealsFee", Type: "types.FIL", Comment: ``, }, { - Num: "MaxMarketBalanceAddFee", + Name: "MaxMarketBalanceAddFee", Type: "types.FIL", Comment: ``, @@ -589,37 +589,37 @@ over the worker address if this flag is set.`, }, "MinerSubsystemConfig": []DocField{ { - Num: "EnableMining", + Name: "EnableMining", Type: "bool", Comment: ``, }, { - Num: "EnableSealing", + Name: "EnableSealing", Type: "bool", Comment: ``, }, { - Num: "EnableSectorStorage", + Name: "EnableSectorStorage", Type: "bool", Comment: ``, }, { - Num: "EnableMarkets", + Name: "EnableMarkets", Type: "bool", Comment: ``, }, { - Num: "SealerApiInfo", + Name: "SealerApiInfo", Type: "string", Comment: ``, }, { - Num: "SectorIndexApiInfo", + Name: "SectorIndexApiInfo", Type: "string", Comment: ``, @@ -627,7 +627,7 @@ over the worker address if this flag is set.`, }, "ProvingConfig": []DocField{ { - Num: "ParallelCheckLimit", + Name: "ParallelCheckLimit", Type: "int", Comment: `Maximum number of sector checks to run in parallel. (0 = unlimited) @@ -640,7 +640,7 @@ After changing this option, confirm that the new value works in your setup by in 'lotus-miner proving compute window-post 0'`, }, { - Num: "DisableBuiltinWindowPoSt", + Name: "DisableBuiltinWindowPoSt", Type: "bool", Comment: `Disable Window PoSt computation on the lotus-miner process even if no window PoSt workers are present. @@ -652,7 +652,7 @@ After changing this option, confirm that the new value works in your setup by in 'lotus-miner proving compute window-post 0'`, }, { - Num: "DisableBuiltinWinningPoSt", + Name: "DisableBuiltinWinningPoSt", Type: "bool", Comment: `Disable Winning PoSt computation on the lotus-miner process even if no winning PoSt workers are present. @@ -661,7 +661,7 @@ WARNING: If no WinningPoSt workers are connected, Winning PoSt WILL FAIL resulti Before enabling this option, make sure your PoSt workers work correctly.`, }, { - Num: "DisableWDPoStPreChecks", + Name: "DisableWDPoStPreChecks", Type: "bool", Comment: `Disable WindowPoSt provable sector readability checks. @@ -690,7 +690,7 @@ After changing this option, confirm that the new value works in your setup by in 'lotus-miner proving compute window-post 0'`, }, { - Num: "MaxPartitionsPerPoStMessage", + Name: "MaxPartitionsPerPoStMessage", Type: "int", Comment: `Maximum number of partitions to prove in a single SubmitWindowPoSt messace. 0 = network limit (10 in nv16) @@ -708,7 +708,7 @@ to prove each deadline, resulting in more total gas use (but each message will h Setting this value above the network limit has no effect`, }, { - Num: "MaxPartitionsPerRecoveryMessage", + Name: "MaxPartitionsPerRecoveryMessage", Type: "int", Comment: `In some cases when submitting DeclareFaultsRecovered messages, @@ -720,13 +720,13 @@ resulting in more total gas use (but each message will have lower gas limit)`, }, "Pubsub": []DocField{ { - Num: "Bootstrapper", + Name: "Bootstrapper", Type: "bool", Comment: `Run the node in bootstrap-node mode`, }, { - Num: "DirectPeers", + Name: "DirectPeers", Type: "[]string", Comment: `DirectPeers specifies peers with direct peering agreements. These peers are @@ -737,13 +737,13 @@ symmetrically configured at both ends. Type: Array of multiaddress peerinfo strings, must include peerid (/p2p/12D3K...`, }, { - Num: "IPColocationWhitelist", + Name: "IPColocationWhitelist", Type: "[]string", Comment: ``, }, { - Num: "RemoteTracer", + Name: "RemoteTracer", Type: "string", Comment: ``, @@ -751,19 +751,19 @@ Type: Array of multiaddress peerinfo strings, must include peerid (/p2p/12D3K... }, "RetrievalPricing": []DocField{ { - Num: "Strategy", + Name: "Strategy", Type: "string", Comment: ``, }, { - Num: "Default", + Name: "Default", Type: "*RetrievalPricingDefault", Comment: ``, }, { - Num: "External", + Name: "External", Type: "*RetrievalPricingExternal", Comment: ``, @@ -771,7 +771,7 @@ Type: Array of multiaddress peerinfo strings, must include peerid (/p2p/12D3K... }, "RetrievalPricingDefault": []DocField{ { - Num: "VerifiedDealsFreeTransfer", + Name: "VerifiedDealsFreeTransfer", Type: "bool", Comment: `VerifiedDealsFreeTransfer configures zero fees for data transfer for a retrieval deal @@ -782,7 +782,7 @@ default value is true`, }, "RetrievalPricingExternal": []DocField{ { - Num: "Path", + Name: "Path", Type: "string", Comment: `Path of the external script that will be run to price a retrieval deal. @@ -791,68 +791,68 @@ This parameter is ONLY applicable if the retrieval pricing policy strategy has b }, "SealerConfig": []DocField{ { - Num: "ParallelFetchLimit", + Name: "ParallelFetchLimit", Type: "int", Comment: ``, }, { - Num: "AllowAddPiece", + Name: "AllowAddPiece", Type: "bool", Comment: `Local worker config`, }, { - Num: "AllowPreCommit1", + Name: "AllowPreCommit1", Type: "bool", Comment: ``, }, { - Num: "AllowPreCommit2", + Name: "AllowPreCommit2", Type: "bool", Comment: ``, }, { - Num: "AllowCommit", + Name: "AllowCommit", Type: "bool", Comment: ``, }, { - Num: "AllowUnseal", + Name: "AllowUnseal", Type: "bool", Comment: ``, }, { - Num: "AllowReplicaUpdate", + Name: "AllowReplicaUpdate", Type: "bool", Comment: ``, }, { - Num: "AllowProveReplicaUpdate2", + Name: "AllowProveReplicaUpdate2", Type: "bool", Comment: ``, }, { - Num: "AllowRegenSectorKey", + Name: "AllowRegenSectorKey", Type: "bool", Comment: ``, }, { - Num: "LocalWorkerName", + Name: "LocalWorkerName", Type: "string", Comment: `LocalWorkerName specifies a custom name for the builtin worker. If set to an empty string (default) os hostname will be used`, }, { - Num: "Assigner", + Name: "Assigner", Type: "string", Comment: `Assigner specifies the worker assigner to use when scheduling tasks. @@ -860,7 +860,7 @@ If set to an empty string (default) os hostname will be used`, "spread" - assign tasks to as many distinct workers as possible.`, }, { - Num: "DisallowRemoteFinalize", + Name: "DisallowRemoteFinalize", Type: "bool", Comment: `DisallowRemoteFinalize when set to true will force all Finalize tasks to @@ -876,7 +876,7 @@ If you see stuck Finalize tasks after enabling this setting, check 'lotus-miner sealing sched-diag' and 'lotus-miner storage find [sector num]'`, }, { - Num: "ResourceFiltering", + Name: "ResourceFiltering", Type: "sealer.ResourceFilteringStrategy", Comment: `ResourceFiltering instructs the system which resource filtering strategy @@ -886,7 +886,7 @@ to "hardware".`, }, "SealingConfig": []DocField{ { - Num: "MaxWaitDealsSectors", + Name: "MaxWaitDealsSectors", Type: "uint64", Comment: `Upper bound on how many sectors can be waiting for more deals to be packed in it before it begins sealing at any given time. @@ -896,19 +896,19 @@ Note that setting this number too high in relation to deal ingestion rate may re 0 = no limit`, }, { - Num: "MaxSealingSectors", + Name: "MaxSealingSectors", Type: "uint64", Comment: `Upper bound on how many sectors can be sealing+upgrading at the same time when creating new CC sectors (0 = unlimited)`, }, { - Num: "MaxSealingSectorsForDeals", + Name: "MaxSealingSectorsForDeals", Type: "uint64", Comment: `Upper bound on how many sectors can be sealing+upgrading at the same time when creating new sectors with deals (0 = unlimited)`, }, { - Num: "PreferNewSectorsForDeals", + Name: "PreferNewSectorsForDeals", Type: "bool", Comment: `Prefer creating new sectors even if there are sectors Available for upgrading. @@ -917,13 +917,13 @@ possible to use fast sector upgrades to handle high volumes of storage deals, wh flow when the volume of storage deals is lower.`, }, { - Num: "MaxUpgradingSectors", + Name: "MaxUpgradingSectors", Type: "uint64", Comment: `Upper bound on how many sectors can be sealing+upgrading at the same time when upgrading CC sectors with deals (0 = MaxSealingSectorsForDeals)`, }, { - Num: "CommittedCapacitySectorLifetime", + Name: "CommittedCapacitySectorLifetime", Type: "Duration", Comment: `CommittedCapacitySectorLifetime is the duration a Committed Capacity (CC) sector will @@ -931,27 +931,27 @@ live before it must be extended or converted into sector containing deals before terminated. Value must be between 180-540 days inclusive`, }, { - Num: "WaitDealsDelay", + Name: "WaitDealsDelay", Type: "Duration", Comment: `Period of time that a newly created sector will wait for more deals to be packed in to before it starts to seal. Sectors which are fully filled will start sealing immediately`, }, { - Num: "AlwaysKeepUnsealedCopy", + Name: "AlwaysKeepUnsealedCopy", Type: "bool", Comment: `Whether to keep unsealed copies of deal data regardless of whether the client requested that. This lets the miner avoid the relatively high cost of unsealing the data later, at the cost of more storage space`, }, { - Num: "FinalizeEarly", + Name: "FinalizeEarly", Type: "bool", Comment: `Run sector finalization before submitting sector proof to the chain`, }, { - Num: "MakeNewSectorForDeals", + Name: "MakeNewSectorForDeals", Type: "bool", Comment: `Whether new sectors are created to pack incoming deals @@ -959,111 +959,111 @@ When this is set to false no new sectors will be created for sealing incoming de This is useful for forcing all deals to be assigned as snap deals to sectors marked for upgrade`, }, { - Num: "MakeCCSectorsAvailable", + Name: "MakeCCSectorsAvailable", Type: "bool", Comment: `After sealing CC sectors, make them available for upgrading with deals`, }, { - Num: "CollateralFromMinerBalance", + Name: "CollateralFromMinerBalance", Type: "bool", Comment: `Whether to use available miner balance for sector collateral instead of sending it with each message`, }, { - Num: "AvailableBalanceBuffer", + Name: "AvailableBalanceBuffer", Type: "types.FIL", Comment: `Minimum available balance to keep in the miner actor before sending it with messages`, }, { - Num: "DisableCollateralFallback", + Name: "DisableCollateralFallback", Type: "bool", Comment: `Don't send collateral with messages even if there is no available balance in the miner actor`, }, { - Num: "BatchPreCommits", + Name: "BatchPreCommits", Type: "bool", Comment: `enable / disable precommit batching (takes effect after nv13)`, }, { - Num: "MaxPreCommitBatch", + Name: "MaxPreCommitBatch", Type: "int", Comment: `maximum precommit batch size - batches will be sent immediately above this size`, }, { - Num: "PreCommitBatchWait", + Name: "PreCommitBatchWait", Type: "Duration", Comment: `how long to wait before submitting a batch after crossing the minimum batch size`, }, { - Num: "PreCommitBatchSlack", + Name: "PreCommitBatchSlack", Type: "Duration", Comment: `time buffer for forceful batch submission before sectors/deal in batch would start expiring`, }, { - Num: "AggregateCommits", + Name: "AggregateCommits", Type: "bool", Comment: `enable / disable commit aggregation (takes effect after nv13)`, }, { - Num: "MinCommitBatch", + Name: "MinCommitBatch", Type: "int", Comment: `minimum batched commit size - batches above this size will eventually be sent on a timeout`, }, { - Num: "MaxCommitBatch", + Name: "MaxCommitBatch", Type: "int", Comment: `maximum batched commit size - batches will be sent immediately above this size`, }, { - Num: "CommitBatchWait", + Name: "CommitBatchWait", Type: "Duration", Comment: `how long to wait before submitting a batch after crossing the minimum batch size`, }, { - Num: "CommitBatchSlack", + Name: "CommitBatchSlack", Type: "Duration", Comment: `time buffer for forceful batch submission before sectors/deals in batch would start expiring`, }, { - Num: "BatchPreCommitAboveBaseFee", + Name: "BatchPreCommitAboveBaseFee", Type: "types.FIL", Comment: `network BaseFee below which to stop doing precommit batching, instead sending precommit messages to the chain individually`, }, { - Num: "AggregateAboveBaseFee", + Name: "AggregateAboveBaseFee", Type: "types.FIL", Comment: `network BaseFee below which to stop doing commit aggregation, instead submitting proofs to the chain individually`, }, { - Num: "TerminateBatchMax", + Name: "TerminateBatchMax", Type: "uint64", Comment: ``, }, { - Num: "TerminateBatchMin", + Name: "TerminateBatchMin", Type: "uint64", Comment: ``, }, { - Num: "TerminateBatchWait", + Name: "TerminateBatchWait", Type: "Duration", Comment: ``, @@ -1071,35 +1071,35 @@ submitting proofs to the chain individually`, }, "Splitstore": []DocField{ { - Num: "ColdStoreType", + Name: "ColdStoreType", Type: "string", Comment: `ColdStoreType specifies the type of the coldstore. It can be "universal" (default) or "discard" for discarding cold blocks.`, }, { - Num: "HotStoreType", + Name: "HotStoreType", Type: "string", Comment: `HotStoreType specifies the type of the hotstore. Only currently supported value is "badger".`, }, { - Num: "MarkSetType", + Name: "MarkSetType", Type: "string", Comment: `MarkSetType specifies the type of the markset. It can be "map" for in memory marking or "badger" (default) for on-disk marking.`, }, { - Num: "HotStoreMessageRetention", + Name: "HotStoreMessageRetention", Type: "uint64", Comment: `HotStoreMessageRetention specifies the retention policy for messages, in finalities beyond the compaction boundary; default is 0.`, }, { - Num: "HotStoreFullGCFrequency", + Name: "HotStoreFullGCFrequency", Type: "uint64", Comment: `HotStoreFullGCFrequency specifies how often to perform a full (moving) GC on the hotstore. @@ -1107,7 +1107,7 @@ A value of 0 disables, while a value 1 will do full GC in every compaction. Default is 20 (about once a week).`, }, { - Num: "EnableColdStoreAutoPrune", + Name: "EnableColdStoreAutoPrune", Type: "bool", Comment: `EnableColdStoreAutoPrune turns on compaction of the cold store i.e. pruning @@ -1115,7 +1115,7 @@ where hotstore compaction occurs every finality epochs pruning happens every 3 f Default is false`, }, { - Num: "ColdStoreFullGCFrequency", + Name: "ColdStoreFullGCFrequency", Type: "uint64", Comment: `ColdStoreFullGCFrequency specifies how often to performa a full (moving) GC on the coldstore. @@ -1124,7 +1124,7 @@ full GC in every prune. Default is 7 (about once every a week)`, }, { - Num: "ColdStoreRetention", + Name: "ColdStoreRetention", Type: "int64", Comment: `ColdStoreRetention specifies the retention policy for data reachable from the chain, in @@ -1133,55 +1133,55 @@ finalities beyond the compaction boundary, default is 0, -1 retains everything`, }, "StorageMiner": []DocField{ { - Num: "Subsystems", + Name: "Subsystems", Type: "MinerSubsystemConfig", Comment: ``, }, { - Num: "Dealmaking", + Name: "Dealmaking", Type: "DealmakingConfig", Comment: ``, }, { - Num: "IndexProvider", + Name: "IndexProvider", Type: "IndexProviderConfig", Comment: ``, }, { - Num: "Proving", + Name: "Proving", Type: "ProvingConfig", Comment: ``, }, { - Num: "Sealing", + Name: "Sealing", Type: "SealingConfig", Comment: ``, }, { - Num: "Storage", + Name: "Storage", Type: "SealerConfig", Comment: ``, }, { - Num: "Fees", + Name: "Fees", Type: "MinerFeeConfig", Comment: ``, }, { - Num: "Addresses", + Name: "Addresses", Type: "MinerAddressConfig", Comment: ``, }, { - Num: "DAGStore", + Name: "DAGStore", Type: "DAGStoreConfig", Comment: ``, @@ -1189,19 +1189,19 @@ finalities beyond the compaction boundary, default is 0, -1 retains everything`, }, "Wallet": []DocField{ { - Num: "RemoteBackend", + Name: "RemoteBackend", Type: "string", Comment: ``, }, { - Num: "EnableLedger", + Name: "EnableLedger", Type: "bool", Comment: ``, }, { - Num: "DisableLocal", + Name: "DisableLocal", Type: "bool", Comment: ``, diff --git a/node/config/doc_util.go b/node/config/doc_util.go index 4da94948f..b88333238 100644 --- a/node/config/doc_util.go +++ b/node/config/doc_util.go @@ -16,7 +16,7 @@ func findDoc(root interface{}, section, name string) *DocField { return findDocSect("Common", section, name) } -func findDocSect(root, section, num string) *DocField { +func findDocSect(root, section, name string) *DocField { path := strings.Split(section, ".") docSection := Doc[root] @@ -26,7 +26,7 @@ func findDocSect(root, section, num string) *DocField { } for _, field := range docSection { - if field.Num == e { + if field.Name == e { docSection = Doc[field.Type] break } @@ -35,7 +35,7 @@ func findDocSect(root, section, num string) *DocField { } for _, df := range docSection { - if df.Num == num { + if df.Name == name { return &df } } From d94cdaaade83d7bf4251af42a5ba10155db7e2d3 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 14 Sep 2022 13:15:17 -0400 Subject: [PATCH 126/185] Fixes node startup --- api/types.go | 2 +- node/impl/full/state.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/api/types.go b/api/types.go index dc83be3c7..f3cf119bb 100644 --- a/api/types.go +++ b/api/types.go @@ -297,7 +297,7 @@ type MinerInfo struct { WindowPoStPartitionSectors uint64 ConsensusFaultElapsed abi.ChainEpoch Beneficiary address.Address - BeneficiaryTerm miner.BeneficiaryTerm + BeneficiaryTerm *miner.BeneficiaryTerm PendingBeneficiaryTerm *miner.PendingBeneficiaryChange } diff --git a/node/impl/full/state.go b/node/impl/full/state.go index d7da00eb1..5247b9fb5 100644 --- a/node/impl/full/state.go +++ b/node/impl/full/state.go @@ -178,7 +178,7 @@ func (m *StateModule) StateMinerInfo(ctx context.Context, actor address.Address, WindowPoStPartitionSectors: info.WindowPoStPartitionSectors, ConsensusFaultElapsed: info.ConsensusFaultElapsed, Beneficiary: info.Beneficiary, - BeneficiaryTerm: info.BeneficiaryTerm, + BeneficiaryTerm: &info.BeneficiaryTerm, PendingBeneficiaryTerm: info.PendingBeneficiaryTerm, } From 308cef950b3180fec651bccc31da2c21c96c6fc7 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 14 Sep 2022 14:33:29 -0400 Subject: [PATCH 127/185] cctx.Args().Len() to cctx.NArg() --- cli/backup.go | 2 +- cli/chain.go | 6 ++-- cli/client.go | 4 +-- cli/filplus.go | 4 +-- cli/mpool.go | 6 ++-- cli/multisig.go | 52 +++++++++++++++---------------- cli/net.go | 2 +- cli/paych.go | 22 ++++++------- cli/send.go | 2 +- cli/state.go | 8 ++--- cmd/lotus-bench/simple.go | 2 +- cmd/lotus-miner/init_restore.go | 2 +- cmd/lotus-miner/market.go | 4 +-- cmd/lotus-miner/proving.go | 8 ++--- cmd/lotus-miner/sealing.go | 6 ++-- cmd/lotus-miner/sectors.go | 18 +++++------ cmd/lotus-seed/genesis.go | 12 +++---- cmd/lotus-shed/base16.go | 2 +- cmd/lotus-shed/base32.go | 2 +- cmd/lotus-shed/base64.go | 2 +- cmd/lotus-shed/consensus.go | 2 +- cmd/lotus-shed/datastore.go | 4 +-- cmd/lotus-shed/export-car.go | 2 +- cmd/lotus-shed/keyinfo.go | 4 +-- cmd/lotus-shed/miner.go | 4 +-- cmd/lotus-shed/msg.go | 2 +- cmd/lotus-shed/proofs.go | 2 +- cmd/lotus-shed/rpc.go | 2 +- cmd/lotus-shed/sectors.go | 4 +-- cmd/lotus-shed/signatures.go | 4 +-- cmd/lotus-shed/stateroot-stats.go | 4 +-- cmd/lotus-shed/sync.go | 6 ++-- cmd/lotus-shed/verifreg.go | 8 ++--- 33 files changed, 107 insertions(+), 107 deletions(-) diff --git a/cli/backup.go b/cli/backup.go index 4d88d4bbc..3cb44718f 100644 --- a/cli/backup.go +++ b/cli/backup.go @@ -114,7 +114,7 @@ this command must be within this base path`, }, ArgsUsage: "[backup file path]", Action: func(cctx *cli.Context) error { - if cctx.Args().Len() != 1 { + if cctx.NArg() != 1 { return xerrors.Errorf("expected 1 argument") } diff --git a/cli/chain.go b/cli/chain.go index 39f1608f5..80df5655b 100644 --- a/cli/chain.go +++ b/cli/chain.go @@ -946,7 +946,7 @@ var ChainBisectCmd = &cli.Command{ defer closer() ctx := ReqContext(cctx) - if cctx.Args().Len() < 4 { + if cctx.NArg() < 4 { return xerrors.New("need at least 4 args") } @@ -1312,7 +1312,7 @@ var chainDecodeParamsCmd = &cli.Command{ defer closer() ctx := ReqContext(cctx) - if cctx.Args().Len() != 3 { + if cctx.NArg() != 3 { return ShowHelp(cctx, fmt.Errorf("incorrect number of arguments")) } @@ -1391,7 +1391,7 @@ var chainEncodeParamsCmd = &cli.Command{ Action: func(cctx *cli.Context) error { afmt := NewAppFmt(cctx.App) - if cctx.Args().Len() != 3 { + if cctx.NArg() != 3 { return ShowHelp(cctx, fmt.Errorf("incorrect number of arguments")) } diff --git a/cli/client.go b/cli/client.go index 5f2342b2b..577a8e840 100644 --- a/cli/client.go +++ b/cli/client.go @@ -212,7 +212,7 @@ var clientCommPCmd = &cli.Command{ defer closer() ctx := ReqContext(cctx) - if cctx.Args().Len() != 1 { + if cctx.NArg() != 1 { return fmt.Errorf("usage: commP ") } @@ -245,7 +245,7 @@ var clientCarGenCmd = &cli.Command{ defer closer() ctx := ReqContext(cctx) - if cctx.Args().Len() != 2 { + if cctx.NArg() != 2 { return fmt.Errorf("usage: generate-car ") } diff --git a/cli/filplus.go b/cli/filplus.go index 66de32d0c..7ac4f0d58 100644 --- a/cli/filplus.go +++ b/cli/filplus.go @@ -61,7 +61,7 @@ var filplusVerifyClientCmd = &cli.Command{ return err } - if cctx.Args().Len() != 2 { + if cctx.NArg() != 2 { return fmt.Errorf("must specify two arguments: address and allowance") } @@ -289,7 +289,7 @@ var filplusSignRemoveDataCapProposal = &cli.Command{ }, }, Action: func(cctx *cli.Context) error { - if cctx.Args().Len() != 3 { + if cctx.NArg() != 3 { return fmt.Errorf("must specify three arguments: notary address, client address, and allowance to remove") } diff --git a/cli/mpool.go b/cli/mpool.go index 1410814b5..c8003092d 100644 --- a/cli/mpool.go +++ b/cli/mpool.go @@ -404,7 +404,7 @@ var MpoolReplaceCmd = &cli.Command{ var from address.Address var nonce uint64 - switch cctx.Args().Len() { + switch cctx.NArg() { case 1: mcid, err := cid.Decode(cctx.Args().First()) if err != nil { @@ -610,7 +610,7 @@ var MpoolConfig = &cli.Command{ Usage: "get or set current mpool configuration", ArgsUsage: "[new-config]", Action: func(cctx *cli.Context) error { - if cctx.Args().Len() > 1 { + if cctx.NArg() > 1 { return cli.ShowCommandHelp(cctx, cctx.Command.Name) } @@ -624,7 +624,7 @@ var MpoolConfig = &cli.Command{ ctx := ReqContext(cctx) - if cctx.Args().Len() == 0 { + if cctx.NArg() == 0 { cfg, err := api.MpoolGetConfig(ctx) if err != nil { return err diff --git a/cli/multisig.go b/cli/multisig.go index 67c833397..7a86c2d87 100644 --- a/cli/multisig.go +++ b/cli/multisig.go @@ -88,7 +88,7 @@ var msigCreateCmd = &cli.Command{ }, }, Action: func(cctx *cli.Context) error { - if cctx.Args().Len() < 1 { + if cctx.NArg() < 1 { return ShowHelp(cctx, fmt.Errorf("multisigs must have at least one signer")) } @@ -365,11 +365,11 @@ var msigProposeCmd = &cli.Command{ }, }, Action: func(cctx *cli.Context) error { - if cctx.Args().Len() < 3 { + if cctx.NArg() < 3 { return ShowHelp(cctx, fmt.Errorf("must pass at least multisig address, destination, and value")) } - if cctx.Args().Len() > 3 && cctx.Args().Len() != 5 { + if cctx.NArg() > 3 && cctx.NArg() != 5 { return ShowHelp(cctx, fmt.Errorf("must either pass three or five arguments")) } @@ -399,7 +399,7 @@ var msigProposeCmd = &cli.Command{ var method uint64 var params []byte - if cctx.Args().Len() == 5 { + if cctx.NArg() == 5 { m, err := strconv.ParseUint(cctx.Args().Get(3), 10, 64) if err != nil { return err @@ -487,15 +487,15 @@ var msigApproveCmd = &cli.Command{ }, }, Action: func(cctx *cli.Context) error { - if cctx.Args().Len() < 2 { + if cctx.NArg() < 2 { return ShowHelp(cctx, fmt.Errorf("must pass at least multisig address and message ID")) } - if cctx.Args().Len() > 2 && cctx.Args().Len() < 5 { + if cctx.NArg() > 2 && cctx.NArg() < 5 { return ShowHelp(cctx, fmt.Errorf("usage: msig approve ")) } - if cctx.Args().Len() > 5 && cctx.Args().Len() != 7 { + if cctx.NArg() > 5 && cctx.NArg() != 7 { return ShowHelp(cctx, fmt.Errorf("usage: msig approve [ ]")) } @@ -534,7 +534,7 @@ var msigApproveCmd = &cli.Command{ } var msgCid cid.Cid - if cctx.Args().Len() == 2 { + if cctx.NArg() == 2 { proto, err := api.MsigApprove(ctx, msig, txid, from) if err != nil { return err @@ -571,7 +571,7 @@ var msigApproveCmd = &cli.Command{ var method uint64 var params []byte - if cctx.Args().Len() == 7 { + if cctx.NArg() == 7 { m, err := strconv.ParseUint(cctx.Args().Get(5), 10, 64) if err != nil { return err @@ -624,15 +624,15 @@ var msigCancelCmd = &cli.Command{ }, }, Action: func(cctx *cli.Context) error { - if cctx.Args().Len() < 2 { + if cctx.NArg() < 2 { return ShowHelp(cctx, fmt.Errorf("must pass at least multisig address and message ID")) } - if cctx.Args().Len() > 2 && cctx.Args().Len() < 4 { + if cctx.NArg() > 2 && cctx.NArg() < 4 { return ShowHelp(cctx, fmt.Errorf("usage: msig cancel ")) } - if cctx.Args().Len() > 4 && cctx.Args().Len() != 6 { + if cctx.NArg() > 4 && cctx.NArg() != 6 { return ShowHelp(cctx, fmt.Errorf("usage: msig cancel [ ]")) } @@ -671,7 +671,7 @@ var msigCancelCmd = &cli.Command{ } var msgCid cid.Cid - if cctx.Args().Len() == 2 { + if cctx.NArg() == 2 { proto, err := api.MsigCancel(ctx, msig, txid, from) if err != nil { return err @@ -696,7 +696,7 @@ var msigCancelCmd = &cli.Command{ var method uint64 var params []byte - if cctx.Args().Len() == 6 { + if cctx.NArg() == 6 { m, err := strconv.ParseUint(cctx.Args().Get(4), 10, 64) if err != nil { return err @@ -753,7 +753,7 @@ var msigRemoveProposeCmd = &cli.Command{ }, }, Action: func(cctx *cli.Context) error { - if cctx.Args().Len() != 2 { + if cctx.NArg() != 2 { return ShowHelp(cctx, fmt.Errorf("must pass multisig address and signer address")) } @@ -840,7 +840,7 @@ var msigAddProposeCmd = &cli.Command{ }, }, Action: func(cctx *cli.Context) error { - if cctx.Args().Len() != 2 { + if cctx.NArg() != 2 { return ShowHelp(cctx, fmt.Errorf("must pass multisig address and signer address")) } @@ -949,7 +949,7 @@ var msigAddApproveCmd = &cli.Command{ }, }, Action: func(cctx *cli.Context) error { - if cctx.Args().Len() != 5 { + if cctx.NArg() != 5 { return ShowHelp(cctx, fmt.Errorf("must pass multisig address, proposer address, transaction id, new signer address, whether to increase threshold")) } @@ -1040,7 +1040,7 @@ var msigAddCancelCmd = &cli.Command{ }, }, Action: func(cctx *cli.Context) error { - if cctx.Args().Len() != 4 { + if cctx.NArg() != 4 { return ShowHelp(cctx, fmt.Errorf("must pass multisig address, transaction id, new signer address, whether to increase threshold")) } @@ -1126,7 +1126,7 @@ var msigSwapProposeCmd = &cli.Command{ }, }, Action: func(cctx *cli.Context) error { - if cctx.Args().Len() != 3 { + if cctx.NArg() != 3 { return ShowHelp(cctx, fmt.Errorf("must pass multisig address, old signer address, new signer address")) } @@ -1207,7 +1207,7 @@ var msigSwapApproveCmd = &cli.Command{ }, }, Action: func(cctx *cli.Context) error { - if cctx.Args().Len() != 5 { + if cctx.NArg() != 5 { return ShowHelp(cctx, fmt.Errorf("must pass multisig address, proposer address, transaction id, old signer address, new signer address")) } @@ -1298,7 +1298,7 @@ var msigSwapCancelCmd = &cli.Command{ }, }, Action: func(cctx *cli.Context) error { - if cctx.Args().Len() != 4 { + if cctx.NArg() != 4 { return ShowHelp(cctx, fmt.Errorf("must pass multisig address, transaction id, old signer address, new signer address")) } @@ -1384,7 +1384,7 @@ var msigLockProposeCmd = &cli.Command{ }, }, Action: func(cctx *cli.Context) error { - if cctx.Args().Len() != 4 { + if cctx.NArg() != 4 { return ShowHelp(cctx, fmt.Errorf("must pass multisig address, start epoch, unlock duration, and amount")) } @@ -1480,7 +1480,7 @@ var msigLockApproveCmd = &cli.Command{ }, }, Action: func(cctx *cli.Context) error { - if cctx.Args().Len() != 6 { + if cctx.NArg() != 6 { return ShowHelp(cctx, fmt.Errorf("must pass multisig address, proposer address, tx id, start epoch, unlock duration, and amount")) } @@ -1586,7 +1586,7 @@ var msigLockCancelCmd = &cli.Command{ }, }, Action: func(cctx *cli.Context) error { - if cctx.Args().Len() != 5 { + if cctx.NArg() != 5 { return ShowHelp(cctx, fmt.Errorf("must pass multisig address, tx id, start epoch, unlock duration, and amount")) } @@ -1693,7 +1693,7 @@ var msigVestedCmd = &cli.Command{ }, }, Action: func(cctx *cli.Context) error { - if cctx.Args().Len() != 1 { + if cctx.NArg() != 1 { return ShowHelp(cctx, fmt.Errorf("must pass multisig address")) } @@ -1749,7 +1749,7 @@ var msigProposeThresholdCmd = &cli.Command{ }, }, Action: func(cctx *cli.Context) error { - if cctx.Args().Len() != 2 { + if cctx.NArg() != 2 { return ShowHelp(cctx, fmt.Errorf("must pass multisig address and new threshold value")) } diff --git a/cli/net.go b/cli/net.go index 5a141e52d..c1ca1ce18 100644 --- a/cli/net.go +++ b/cli/net.go @@ -141,7 +141,7 @@ var NetPing = &cli.Command{ }, }, Action: func(cctx *cli.Context) error { - if cctx.Args().Len() != 1 { + if cctx.NArg() != 1 { return xerrors.Errorf("please provide a peerID") } diff --git a/cli/paych.go b/cli/paych.go index 8277e3123..263aa7f34 100644 --- a/cli/paych.go +++ b/cli/paych.go @@ -50,7 +50,7 @@ var paychAddFundsCmd = &cli.Command{ }, }, Action: func(cctx *cli.Context) error { - if cctx.Args().Len() != 3 { + if cctx.NArg() != 3 { return ShowHelp(cctx, fmt.Errorf("must pass three arguments: ")) } @@ -112,7 +112,7 @@ var paychStatusByFromToCmd = &cli.Command{ Usage: "Show the status of an active outbound payment channel by from/to addresses", ArgsUsage: "[fromAddress toAddress]", Action: func(cctx *cli.Context) error { - if cctx.Args().Len() != 2 { + if cctx.NArg() != 2 { return ShowHelp(cctx, fmt.Errorf("must pass two arguments: ")) } ctx := ReqContext(cctx) @@ -148,7 +148,7 @@ var paychStatusCmd = &cli.Command{ Usage: "Show the status of an outbound payment channel", ArgsUsage: "[channelAddress]", Action: func(cctx *cli.Context) error { - if cctx.Args().Len() != 1 { + if cctx.NArg() != 1 { return ShowHelp(cctx, fmt.Errorf("must pass an argument: ")) } ctx := ReqContext(cctx) @@ -260,7 +260,7 @@ var paychSettleCmd = &cli.Command{ Usage: "Settle a payment channel", ArgsUsage: "[channelAddress]", Action: func(cctx *cli.Context) error { - if cctx.Args().Len() != 1 { + if cctx.NArg() != 1 { return fmt.Errorf("must pass payment channel address") } @@ -300,7 +300,7 @@ var paychCloseCmd = &cli.Command{ Usage: "Collect funds for a payment channel", ArgsUsage: "[channelAddress]", Action: func(cctx *cli.Context) error { - if cctx.Args().Len() != 1 { + if cctx.NArg() != 1 { return fmt.Errorf("must pass payment channel address") } @@ -360,7 +360,7 @@ var paychVoucherCreateCmd = &cli.Command{ }, }, Action: func(cctx *cli.Context) error { - if cctx.Args().Len() != 2 { + if cctx.NArg() != 2 { return ShowHelp(cctx, fmt.Errorf("must pass two arguments: ")) } @@ -408,7 +408,7 @@ var paychVoucherCheckCmd = &cli.Command{ Usage: "Check validity of payment channel voucher", ArgsUsage: "[channelAddress voucher]", Action: func(cctx *cli.Context) error { - if cctx.Args().Len() != 2 { + if cctx.NArg() != 2 { return ShowHelp(cctx, fmt.Errorf("must pass payment channel address and voucher to validate")) } @@ -444,7 +444,7 @@ var paychVoucherAddCmd = &cli.Command{ Usage: "Add payment channel voucher to local datastore", ArgsUsage: "[channelAddress voucher]", Action: func(cctx *cli.Context) error { - if cctx.Args().Len() != 2 { + if cctx.NArg() != 2 { return ShowHelp(cctx, fmt.Errorf("must pass payment channel address and voucher")) } @@ -486,7 +486,7 @@ var paychVoucherListCmd = &cli.Command{ }, }, Action: func(cctx *cli.Context) error { - if cctx.Args().Len() != 1 { + if cctx.NArg() != 1 { return ShowHelp(cctx, fmt.Errorf("must pass payment channel address")) } @@ -531,7 +531,7 @@ var paychVoucherBestSpendableCmd = &cli.Command{ }, }, Action: func(cctx *cli.Context) error { - if cctx.Args().Len() != 1 { + if cctx.NArg() != 1 { return ShowHelp(cctx, fmt.Errorf("must pass payment channel address")) } @@ -602,7 +602,7 @@ var paychVoucherSubmitCmd = &cli.Command{ Usage: "Submit voucher to chain to update payment channel state", ArgsUsage: "[channelAddress voucher]", Action: func(cctx *cli.Context) error { - if cctx.Args().Len() != 2 { + if cctx.NArg() != 2 { return ShowHelp(cctx, fmt.Errorf("must pass payment channel address and voucher")) } diff --git a/cli/send.go b/cli/send.go index b5bfd3eb0..b2471e7cd 100644 --- a/cli/send.go +++ b/cli/send.go @@ -67,7 +67,7 @@ var sendCmd = &cli.Command{ fmt.Println("'force' flag is deprecated, use global flag 'force-send'") } - if cctx.Args().Len() != 2 { + if cctx.NArg() != 2 { return ShowHelp(cctx, fmt.Errorf("'send' expects two arguments, target and amount")) } diff --git a/cli/state.go b/cli/state.go index bea7ed0df..e4afc6915 100644 --- a/cli/state.go +++ b/cli/state.go @@ -504,7 +504,7 @@ var StateReplayCmd = &cli.Command{ }, }, Action: func(cctx *cli.Context) error { - if cctx.Args().Len() != 1 { + if cctx.NArg() != 1 { fmt.Println("must provide cid of message to replay") return nil } @@ -1580,7 +1580,7 @@ var StateCallCmd = &cli.Command{ }, }, Action: func(cctx *cli.Context) error { - if cctx.Args().Len() < 2 { + if cctx.NArg() < 2 { return fmt.Errorf("must specify at least actor and method to invoke") } @@ -1619,7 +1619,7 @@ var StateCallCmd = &cli.Command{ var params []byte // If params were passed in, decode them - if cctx.Args().Len() > 2 { + if cctx.NArg() > 2 { switch cctx.String("encoding") { case "base64": params, err = base64.StdEncoding.DecodeString(cctx.Args().Get(2)) @@ -1743,7 +1743,7 @@ var StateSectorCmd = &cli.Command{ ctx := ReqContext(cctx) - if cctx.Args().Len() != 2 { + if cctx.NArg() != 2 { return xerrors.Errorf("expected 2 params: minerAddress and sectorNumber") } diff --git a/cmd/lotus-bench/simple.go b/cmd/lotus-bench/simple.go index b999cd277..87e2c3bc0 100644 --- a/cmd/lotus-bench/simple.go +++ b/cmd/lotus-bench/simple.go @@ -959,7 +959,7 @@ var simpleProveReplicaUpdate2 = &cli.Command{ } func ParsePieceInfos(cctx *cli.Context, firstArg int) ([]abi.PieceInfo, error) { - args := cctx.Args().Len() - firstArg + args := cctx.NArg() - firstArg if args%2 != 0 { return nil, xerrors.Errorf("piece info argunemts need to be supplied in pairs") } diff --git a/cmd/lotus-miner/init_restore.go b/cmd/lotus-miner/init_restore.go index a54146fb2..9d7f977b6 100644 --- a/cmd/lotus-miner/init_restore.go +++ b/cmd/lotus-miner/init_restore.go @@ -96,7 +96,7 @@ var restoreCmd = &cli.Command{ } func restore(ctx context.Context, cctx *cli.Context, targetPath string, strConfig *paths.StorageConfig, manageConfig func(*config.StorageMiner) error, after func(api lapi.FullNode, addr address.Address, peerid peer.ID, mi api.MinerInfo) error) error { - if cctx.Args().Len() != 1 { + if cctx.NArg() != 1 { return xerrors.Errorf("expected 1 argument") } diff --git a/cmd/lotus-miner/market.go b/cmd/lotus-miner/market.go index 37d252efa..78b68214e 100644 --- a/cmd/lotus-miner/market.go +++ b/cmd/lotus-miner/market.go @@ -370,7 +370,7 @@ var dealsImportDataCmd = &cli.Command{ ctx := lcli.DaemonContext(cctx) - if cctx.Args().Len() < 2 { + if cctx.NArg() < 2 { return fmt.Errorf("must specify proposal CID and file path") } @@ -617,7 +617,7 @@ var setSealDurationCmd = &cli.Command{ } defer closer() ctx := lcli.ReqContext(cctx) - if cctx.Args().Len() != 1 { + if cctx.NArg() != 1 { return xerrors.Errorf("must pass duration in minutes") } diff --git a/cmd/lotus-miner/proving.go b/cmd/lotus-miner/proving.go index 85bc48e78..bbb744680 100644 --- a/cmd/lotus-miner/proving.go +++ b/cmd/lotus-miner/proving.go @@ -314,7 +314,7 @@ var provingDeadlineInfoCmd = &cli.Command{ ArgsUsage: "", Action: func(cctx *cli.Context) error { - if cctx.Args().Len() != 1 { + if cctx.NArg() != 1 { return xerrors.Errorf("must pass deadline index") } @@ -461,7 +461,7 @@ var provingCheckProvableCmd = &cli.Command{ }, }, Action: func(cctx *cli.Context) error { - if cctx.Args().Len() != 1 { + if cctx.NArg() != 1 { return xerrors.Errorf("must pass deadline index") } @@ -616,7 +616,7 @@ var provingComputeWindowPoStCmd = &cli.Command{ It will not send any messages to the chain.`, ArgsUsage: "[deadline index]", Action: func(cctx *cli.Context) error { - if cctx.Args().Len() != 1 { + if cctx.NArg() != 1 { return xerrors.Errorf("must pass deadline index") } @@ -661,7 +661,7 @@ var provingRecoverFaultsCmd = &cli.Command{ }, }, Action: func(cctx *cli.Context) error { - if cctx.Args().Len() < 1 { + if cctx.NArg() < 1 { return xerrors.Errorf("must pass at least 1 sector number") } diff --git a/cmd/lotus-miner/sealing.go b/cmd/lotus-miner/sealing.go index 970f54a55..334266c79 100644 --- a/cmd/lotus-miner/sealing.go +++ b/cmd/lotus-miner/sealing.go @@ -372,7 +372,7 @@ var sealingAbortCmd = &cli.Command{ }, }, Action: func(cctx *cli.Context) error { - if cctx.Args().Len() != 1 { + if cctx.NArg() != 1 { return xerrors.Errorf("expected 1 argument") } @@ -430,7 +430,7 @@ var sealingDataCidCmd = &cli.Command{ }, }, Action: func(cctx *cli.Context) error { - if cctx.Args().Len() < 1 || cctx.Args().Len() > 2 { + if cctx.NArg() < 1 || cctx.NArg() > 2 { return xerrors.Errorf("expected 1 or 2 arguments") } @@ -484,7 +484,7 @@ var sealingDataCidCmd = &cli.Command{ } var psize abi.PaddedPieceSize - if cctx.Args().Len() == 2 { + if cctx.NArg() == 2 { rps, err := humanize.ParseBytes(cctx.Args().Get(1)) if err != nil { return xerrors.Errorf("parsing piece size: %w", err) diff --git a/cmd/lotus-miner/sectors.go b/cmd/lotus-miner/sectors.go index 45a1256aa..336a06f52 100644 --- a/cmd/lotus-miner/sectors.go +++ b/cmd/lotus-miner/sectors.go @@ -1378,7 +1378,7 @@ var sectorsTerminateCmd = &cli.Command{ } defer closer() ctx := lcli.ReqContext(cctx) - if cctx.Args().Len() != 1 { + if cctx.NArg() != 1 { return xerrors.Errorf("must pass sector number") } @@ -1488,7 +1488,7 @@ var sectorsRemoveCmd = &cli.Command{ } defer closer() ctx := lcli.ReqContext(cctx) - if cctx.Args().Len() != 1 { + if cctx.NArg() != 1 { return xerrors.Errorf("must pass sector number") } @@ -1506,7 +1506,7 @@ var sectorsSnapUpCmd = &cli.Command{ Usage: "Mark a committed capacity sector to be filled with deals", ArgsUsage: "", Action: func(cctx *cli.Context) error { - if cctx.Args().Len() != 1 { + if cctx.NArg() != 1 { return lcli.ShowHelp(cctx, xerrors.Errorf("must pass sector number")) } @@ -1550,7 +1550,7 @@ var sectorsSnapAbortCmd = &cli.Command{ }, }, Action: func(cctx *cli.Context) error { - if cctx.Args().Len() != 1 { + if cctx.NArg() != 1 { return lcli.ShowHelp(cctx, xerrors.Errorf("must pass sector number")) } @@ -1587,7 +1587,7 @@ var sectorsStartSealCmd = &cli.Command{ } defer closer() ctx := lcli.ReqContext(cctx) - if cctx.Args().Len() != 1 { + if cctx.NArg() != 1 { return xerrors.Errorf("must pass sector number") } @@ -1611,7 +1611,7 @@ var sectorsSealDelayCmd = &cli.Command{ } defer closer() ctx := lcli.ReqContext(cctx) - if cctx.Args().Len() != 1 { + if cctx.NArg() != 1 { return xerrors.Errorf("must pass duration in minutes") } @@ -1714,7 +1714,7 @@ var sectorsUpdateCmd = &cli.Command{ } defer closer() ctx := lcli.ReqContext(cctx) - if cctx.Args().Len() < 2 { + if cctx.NArg() < 2 { return xerrors.Errorf("must pass sector number and new state") } @@ -2310,7 +2310,7 @@ var sectorsNumbersReserveCmd = &cli.Command{ defer closer() ctx := lcli.ReqContext(cctx) - if cctx.Args().Len() != 2 { + if cctx.NArg() != 2 { return xerrors.Errorf("expected 2 arguments: [reservation name] [reserved ranges]") } @@ -2335,7 +2335,7 @@ var sectorsNumbersFreeCmd = &cli.Command{ defer closer() ctx := lcli.ReqContext(cctx) - if cctx.Args().Len() != 1 { + if cctx.NArg() != 1 { return xerrors.Errorf("expected 1 argument: [reservation name]") } diff --git a/cmd/lotus-seed/genesis.go b/cmd/lotus-seed/genesis.go index 9f0a8f7dc..df2a91ad9 100644 --- a/cmd/lotus-seed/genesis.go +++ b/cmd/lotus-seed/genesis.go @@ -93,7 +93,7 @@ var genesisAddMinerCmd = &cli.Command{ Description: "add genesis miner", Flags: []cli.Flag{}, Action: func(cctx *cli.Context) error { - if cctx.Args().Len() != 2 { + if cctx.NArg() != 2 { return xerrors.New("seed genesis add-miner [genesis.json] [preseal.json]") } @@ -181,7 +181,7 @@ type GenAccountEntry struct { var genesisAddMsigsCmd = &cli.Command{ Name: "add-msigs", Action: func(cctx *cli.Context) error { - if cctx.Args().Len() < 2 { + if cctx.NArg() < 2 { return fmt.Errorf("must specify template file and csv file with accounts") } @@ -329,7 +329,7 @@ var genesisSetVRKCmd = &cli.Command{ }, }, Action: func(cctx *cli.Context) error { - if cctx.Args().Len() != 1 { + if cctx.NArg() != 1 { return fmt.Errorf("must specify template file") } @@ -425,7 +425,7 @@ var genesisSetRemainderCmd = &cli.Command{ }, }, Action: func(cctx *cli.Context) error { - if cctx.Args().Len() != 1 { + if cctx.NArg() != 1 { return fmt.Errorf("must specify template file") } @@ -519,7 +519,7 @@ var genesisSetActorVersionCmd = &cli.Command{ }, ArgsUsage: "", Action: func(cctx *cli.Context) error { - if cctx.Args().Len() != 1 { + if cctx.NArg() != 1 { return fmt.Errorf("must specify genesis file") } @@ -597,7 +597,7 @@ var genesisSetVRKSignersCmd = &cli.Command{ }, }, Action: func(cctx *cli.Context) error { - if cctx.Args().Len() != 1 { + if cctx.NArg() != 1 { return fmt.Errorf("must specify template file") } diff --git a/cmd/lotus-shed/base16.go b/cmd/lotus-shed/base16.go index adfdfeddb..a5d384815 100644 --- a/cmd/lotus-shed/base16.go +++ b/cmd/lotus-shed/base16.go @@ -24,7 +24,7 @@ var base16Cmd = &cli.Command{ Action: func(cctx *cli.Context) error { var input io.Reader - if cctx.Args().Len() == 0 { + if cctx.NArg() == 0 { input = os.Stdin } else { input = strings.NewReader(cctx.Args().First()) diff --git a/cmd/lotus-shed/base32.go b/cmd/lotus-shed/base32.go index 4ca177316..66e180ddc 100644 --- a/cmd/lotus-shed/base32.go +++ b/cmd/lotus-shed/base32.go @@ -24,7 +24,7 @@ var base32Cmd = &cli.Command{ Action: func(cctx *cli.Context) error { var input io.Reader - if cctx.Args().Len() == 0 { + if cctx.NArg() == 0 { input = os.Stdin } else { input = strings.NewReader(cctx.Args().First()) diff --git a/cmd/lotus-shed/base64.go b/cmd/lotus-shed/base64.go index 9143a6a19..cacc60152 100644 --- a/cmd/lotus-shed/base64.go +++ b/cmd/lotus-shed/base64.go @@ -32,7 +32,7 @@ var base64Cmd = &cli.Command{ Action: func(cctx *cli.Context) error { var input io.Reader - if cctx.Args().Len() == 0 { + if cctx.NArg() == 0 { input = os.Stdin } else { input = strings.NewReader(cctx.Args().First()) diff --git a/cmd/lotus-shed/consensus.go b/cmd/lotus-shed/consensus.go index f6bd7688f..197de56f9 100644 --- a/cmd/lotus-shed/consensus.go +++ b/cmd/lotus-shed/consensus.go @@ -84,7 +84,7 @@ var consensusCheckCmd = &cli.Command{ filePath := cctx.Args().First() var input *bufio.Reader - if cctx.Args().Len() == 0 { + if cctx.NArg() == 0 { input = bufio.NewReader(os.Stdin) } else { var err error diff --git a/cmd/lotus-shed/datastore.go b/cmd/lotus-shed/datastore.go index 7cdb2b1e6..cd650d122 100644 --- a/cmd/lotus-shed/datastore.go +++ b/cmd/lotus-shed/datastore.go @@ -171,7 +171,7 @@ var datastoreBackupStatCmd = &cli.Command{ Description: "validate and print info about datastore backup", ArgsUsage: "[file]", Action: func(cctx *cli.Context) error { - if cctx.Args().Len() != 1 { + if cctx.NArg() != 1 { return xerrors.Errorf("expected 1 argument") } @@ -220,7 +220,7 @@ var datastoreBackupListCmd = &cli.Command{ }, ArgsUsage: "[file]", Action: func(cctx *cli.Context) error { - if cctx.Args().Len() != 1 { + if cctx.NArg() != 1 { return xerrors.Errorf("expected 1 argument") } diff --git a/cmd/lotus-shed/export-car.go b/cmd/lotus-shed/export-car.go index 97e4fb6c6..b33b2b4ec 100644 --- a/cmd/lotus-shed/export-car.go +++ b/cmd/lotus-shed/export-car.go @@ -38,7 +38,7 @@ var exportCarCmd = &cli.Command{ }, }, Action: func(cctx *cli.Context) error { - if cctx.Args().Len() != 2 { + if cctx.NArg() != 2 { return lcli.ShowHelp(cctx, fmt.Errorf("must specify file name and object")) } diff --git a/cmd/lotus-shed/keyinfo.go b/cmd/lotus-shed/keyinfo.go index 135b5bc9d..373964dc6 100644 --- a/cmd/lotus-shed/keyinfo.go +++ b/cmd/lotus-shed/keyinfo.go @@ -149,7 +149,7 @@ var keyinfoImportCmd = &cli.Command{ flagRepo := cctx.String("repo") var input io.Reader - if cctx.Args().Len() == 0 { + if cctx.NArg() == 0 { input = os.Stdin } else { var err error @@ -261,7 +261,7 @@ var keyinfoInfoCmd = &cli.Command{ format := cctx.String("format") var input io.Reader - if cctx.Args().Len() == 0 { + if cctx.NArg() == 0 { input = os.Stdin } else { var err error diff --git a/cmd/lotus-shed/miner.go b/cmd/lotus-shed/miner.go index a23a44410..0d925336d 100644 --- a/cmd/lotus-shed/miner.go +++ b/cmd/lotus-shed/miner.go @@ -135,7 +135,7 @@ var minerCreateCmd = &cli.Command{ defer closer() ctx := lcli.ReqContext(cctx) - if cctx.Args().Len() != 4 { + if cctx.NArg() != 4 { return xerrors.Errorf("expected 4 args (sender owner worker sectorSize)") } @@ -273,7 +273,7 @@ var minerUnpackInfoCmd = &cli.Command{ Usage: "unpack miner info all dump", ArgsUsage: "[allinfo.txt] [dir]", Action: func(cctx *cli.Context) error { - if cctx.Args().Len() != 2 { + if cctx.NArg() != 2 { return xerrors.Errorf("expected 2 args") } diff --git a/cmd/lotus-shed/msg.go b/cmd/lotus-shed/msg.go index 49412948c..34b260961 100644 --- a/cmd/lotus-shed/msg.go +++ b/cmd/lotus-shed/msg.go @@ -27,7 +27,7 @@ var msgCmd = &cli.Command{ Usage: "Translate message between various formats", ArgsUsage: "Message in any form", Action: func(cctx *cli.Context) error { - if cctx.Args().Len() != 1 { + if cctx.NArg() != 1 { return xerrors.Errorf("expected 1 argument") } diff --git a/cmd/lotus-shed/proofs.go b/cmd/lotus-shed/proofs.go index 65cf04918..752469778 100644 --- a/cmd/lotus-shed/proofs.go +++ b/cmd/lotus-shed/proofs.go @@ -42,7 +42,7 @@ var verifySealProofCmd = &cli.Command{ }, }, Action: func(cctx *cli.Context) error { - if cctx.Args().Len() != 3 { + if cctx.NArg() != 3 { return fmt.Errorf("must specify commR, commD, and proof to verify") } diff --git a/cmd/lotus-shed/rpc.go b/cmd/lotus-shed/rpc.go index b253304a1..82412e317 100644 --- a/cmd/lotus-shed/rpc.go +++ b/cmd/lotus-shed/rpc.go @@ -112,7 +112,7 @@ var rpcCmd = &cli.Command{ } if cctx.Args().Present() { - if cctx.Args().Len() > 2 { + if cctx.NArg() > 2 { return xerrors.Errorf("expected 1 or 2 arguments: method [params]") } diff --git a/cmd/lotus-shed/sectors.go b/cmd/lotus-shed/sectors.go index 0332b4ba3..39e17f045 100644 --- a/cmd/lotus-shed/sectors.go +++ b/cmd/lotus-shed/sectors.go @@ -64,7 +64,7 @@ var terminateSectorCmd = &cli.Command{ }, }, Action: func(cctx *cli.Context) error { - if cctx.Args().Len() < 1 { + if cctx.NArg() < 1 { return fmt.Errorf("at least one sector must be specified") } @@ -200,7 +200,7 @@ var terminateSectorPenaltyEstimationCmd = &cli.Command{ }, }, Action: func(cctx *cli.Context) error { - if cctx.Args().Len() < 1 { + if cctx.NArg() < 1 { return fmt.Errorf("at least one sector must be specified") } diff --git a/cmd/lotus-shed/signatures.go b/cmd/lotus-shed/signatures.go index 0f43503f6..d06ae56ea 100644 --- a/cmd/lotus-shed/signatures.go +++ b/cmd/lotus-shed/signatures.go @@ -31,7 +31,7 @@ var sigsVerifyBlsMsgsCmd = &cli.Command{ Description: "given a block, verifies the bls signature of the messages in the block", Usage: "", Action: func(cctx *cli.Context) error { - if cctx.Args().Len() != 1 { + if cctx.NArg() != 1 { return xerrors.Errorf("usage: ") } @@ -101,7 +101,7 @@ var sigsVerifyVoteCmd = &cli.Command{ Usage: " ", Action: func(cctx *cli.Context) error { - if cctx.Args().Len() != 3 { + if cctx.NArg() != 3 { return xerrors.Errorf("usage: verify-vote ") } diff --git a/cmd/lotus-shed/stateroot-stats.go b/cmd/lotus-shed/stateroot-stats.go index 7937b3ccd..f429c4e64 100644 --- a/cmd/lotus-shed/stateroot-stats.go +++ b/cmd/lotus-shed/stateroot-stats.go @@ -174,8 +174,8 @@ var staterootStatCmd = &cli.Command{ } outcap := 10 - if cctx.Args().Len() > outcap { - outcap = cctx.Args().Len() + if cctx.NArg() > outcap { + outcap = cctx.NArg() } if len(infos) < outcap { outcap = len(infos) diff --git a/cmd/lotus-shed/sync.go b/cmd/lotus-shed/sync.go index 397e76da3..915ef38d0 100644 --- a/cmd/lotus-shed/sync.go +++ b/cmd/lotus-shed/sync.go @@ -38,7 +38,7 @@ var syncValidateCmd = &cli.Command{ defer closer() ctx := lcli.ReqContext(cctx) - if cctx.Args().Len() < 1 { + if cctx.NArg() < 1 { fmt.Println("usage: ...") fmt.Println("At least one block cid must be provided") return nil @@ -75,7 +75,7 @@ var syncScrapePowerCmd = &cli.Command{ Usage: "given a height and a tipset, reports what percentage of mining power had a winning ticket between the tipset and height", ArgsUsage: "[height tipsetkey]", Action: func(cctx *cli.Context) error { - if cctx.Args().Len() < 1 { + if cctx.NArg() < 1 { fmt.Println("usage: [blockCid1 blockCid2...]") fmt.Println("Any CIDs passed after the height will be used as the tipset key") fmt.Println("If no block CIDs are provided, chain head will be used") @@ -90,7 +90,7 @@ var syncScrapePowerCmd = &cli.Command{ defer closer() ctx := lcli.ReqContext(cctx) - if cctx.Args().Len() < 1 { + if cctx.NArg() < 1 { fmt.Println("usage: ...") fmt.Println("At least one block cid must be provided") return nil diff --git a/cmd/lotus-shed/verifreg.go b/cmd/lotus-shed/verifreg.go index 2731ea11b..97392b2f0 100644 --- a/cmd/lotus-shed/verifreg.go +++ b/cmd/lotus-shed/verifreg.go @@ -46,7 +46,7 @@ var verifRegAddVerifierFromMsigCmd = &cli.Command{ Usage: "make a given account a verifier", ArgsUsage: " ", Action: func(cctx *cli.Context) error { - if cctx.Args().Len() != 3 { + if cctx.NArg() != 3 { return fmt.Errorf("must specify three arguments: sender, verifier, and allowance") } @@ -119,7 +119,7 @@ var verifRegAddVerifierFromAccountCmd = &cli.Command{ Usage: "make a given account a verifier", ArgsUsage: " ", Action: func(cctx *cli.Context) error { - if cctx.Args().Len() != 3 { + if cctx.NArg() != 3 { return fmt.Errorf("must specify three arguments: sender, verifier, and allowance") } @@ -201,7 +201,7 @@ var verifRegVerifyClientCmd = &cli.Command{ return err } - if cctx.Args().Len() != 2 { + if cctx.NArg() != 2 { return fmt.Errorf("must specify two arguments: address and allowance") } @@ -418,7 +418,7 @@ var verifRegRemoveVerifiedClientDataCapCmd = &cli.Command{ Usage: "Remove data cap from verified client", ArgsUsage: " ", Action: func(cctx *cli.Context) error { - if cctx.Args().Len() != 7 { + if cctx.NArg() != 7 { return fmt.Errorf("must specify seven arguments: sender, client, allowance to remove, verifier 1 address, verifier 1 signature, verifier 2 address, verifier 2 signature") } From fb0633453a90c6797bcb9a86dd28cce15dab89a7 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 14 Sep 2022 14:51:18 -0400 Subject: [PATCH 128/185] api, nodeApi to minerApi --- cmd/lotus-miner/actor.go | 38 +++++++------- cmd/lotus-miner/info_all.go | 4 +- cmd/lotus-miner/main.go | 4 +- cmd/lotus-miner/proving.go | 16 +++--- cmd/lotus-miner/sealing.go | 26 +++++----- cmd/lotus-miner/sectors.go | 100 ++++++++++++++++++------------------ cmd/lotus-miner/storage.go | 62 +++++++++++----------- cmd/lotus-shed/actor.go | 24 ++++----- cmd/lotus-shed/sectors.go | 8 +-- 9 files changed, 141 insertions(+), 141 deletions(-) diff --git a/cmd/lotus-miner/actor.go b/cmd/lotus-miner/actor.go index c1b86b59c..e4e4b4eae 100644 --- a/cmd/lotus-miner/actor.go +++ b/cmd/lotus-miner/actor.go @@ -81,7 +81,7 @@ var actorSetAddrsCmd = &cli.Command{ return fmt.Errorf("unset can only be used with no arguments") } - nodeAPI, closer, err := lcli.GetStorageMinerAPI(cctx) + minerApi, closer, err := lcli.GetStorageMinerAPI(cctx) if err != nil { return err } @@ -112,7 +112,7 @@ var actorSetAddrsCmd = &cli.Command{ addrs = append(addrs, maddrNop2p.Bytes()) } - maddr, err := nodeAPI.ActorAddress(ctx) + maddr, err := minerApi.ActorAddress(ctx) if err != nil { return err } @@ -177,7 +177,7 @@ var actorSetPeeridCmd = &cli.Command{ }, }, Action: func(cctx *cli.Context) error { - nodeAPI, closer, err := lcli.GetStorageMinerAPI(cctx) + minerApi, closer, err := lcli.GetStorageMinerAPI(cctx) if err != nil { return err } @@ -196,7 +196,7 @@ var actorSetPeeridCmd = &cli.Command{ return fmt.Errorf("failed to parse input as a peerId: %w", err) } - maddr, err := nodeAPI.ActorAddress(ctx) + maddr, err := minerApi.ActorAddress(ctx) if err != nil { return err } @@ -258,7 +258,7 @@ var actorWithdrawCmd = &cli.Command{ amount = abi.TokenAmount(f) } - nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx) + minerApi, closer, err := lcli.GetStorageMinerAPI(cctx) if err != nil { return err } @@ -274,9 +274,9 @@ var actorWithdrawCmd = &cli.Command{ var res cid.Cid if cctx.IsSet("beneficiary") { - res, err = nodeApi.BeneficiaryWithdrawBalance(ctx, amount) + res, err = minerApi.BeneficiaryWithdrawBalance(ctx, amount) } else { - res, err = nodeApi.ActorWithdrawBalance(ctx, amount) + res, err = minerApi.ActorWithdrawBalance(ctx, amount) } if err != nil { return err @@ -326,7 +326,7 @@ var actorRepayDebtCmd = &cli.Command{ }, }, Action: func(cctx *cli.Context) error { - nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx) + minerApi, closer, err := lcli.GetStorageMinerAPI(cctx) if err != nil { return err } @@ -340,7 +340,7 @@ var actorRepayDebtCmd = &cli.Command{ ctx := lcli.ReqContext(cctx) - maddr, err := nodeApi.ActorAddress(ctx) + maddr, err := minerApi.ActorAddress(ctx) if err != nil { return err } @@ -441,7 +441,7 @@ var actorControlList = &cli.Command{ color.NoColor = !cctx.Bool("color") } - nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx) + minerApi, closer, err := lcli.GetStorageMinerAPI(cctx) if err != nil { return err } @@ -473,7 +473,7 @@ var actorControlList = &cli.Command{ tablewriter.Col("balance"), ) - ac, err := nodeApi.ActorAddressConfig(ctx) + ac, err := minerApi.ActorAddressConfig(ctx) if err != nil { return err } @@ -610,7 +610,7 @@ var actorControlSet = &cli.Command{ }, }, Action: func(cctx *cli.Context) error { - nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx) + minerApi, closer, err := lcli.GetStorageMinerAPI(cctx) if err != nil { return err } @@ -624,7 +624,7 @@ var actorControlSet = &cli.Command{ ctx := lcli.ReqContext(cctx) - maddr, err := nodeApi.ActorAddress(ctx) + maddr, err := minerApi.ActorAddress(ctx) if err != nil { return err } @@ -826,7 +826,7 @@ var actorProposeChangeWorker = &cli.Command{ return fmt.Errorf("must pass address of new worker address") } - nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx) + minerApi, closer, err := lcli.GetStorageMinerAPI(cctx) if err != nil { return err } @@ -850,7 +850,7 @@ var actorProposeChangeWorker = &cli.Command{ return err } - maddr, err := nodeApi.ActorAddress(ctx) + maddr, err := minerApi.ActorAddress(ctx) if err != nil { return err } @@ -941,7 +941,7 @@ var actorConfirmChangeWorker = &cli.Command{ return fmt.Errorf("must pass address of new worker address") } - nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx) + minerApi, closer, err := lcli.GetStorageMinerAPI(cctx) if err != nil { return err } @@ -965,7 +965,7 @@ var actorConfirmChangeWorker = &cli.Command{ return err } - maddr, err := nodeApi.ActorAddress(ctx) + maddr, err := minerApi.ActorAddress(ctx) if err != nil { return err } @@ -1056,7 +1056,7 @@ var actorCompactAllocatedCmd = &cli.Command{ return fmt.Errorf("must pass address of new owner address") } - nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx) + minerApi, closer, err := lcli.GetStorageMinerAPI(cctx) if err != nil { return err } @@ -1070,7 +1070,7 @@ var actorCompactAllocatedCmd = &cli.Command{ ctx := lcli.ReqContext(cctx) - maddr, err := nodeApi.ActorAddress(ctx) + maddr, err := minerApi.ActorAddress(ctx) if err != nil { return err } diff --git a/cmd/lotus-miner/info_all.go b/cmd/lotus-miner/info_all.go index 38cc7fc05..bf6d7e4b9 100644 --- a/cmd/lotus-miner/info_all.go +++ b/cmd/lotus-miner/info_all.go @@ -16,7 +16,7 @@ var infoAllCmd = &cli.Command{ Name: "all", Usage: "dump all related miner info", Action: func(cctx *cli.Context) error { - nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx) + minerApi, closer, err := lcli.GetStorageMinerAPI(cctx) if err != nil { return err } @@ -220,7 +220,7 @@ var infoAllCmd = &cli.Command{ // Very Very Verbose info fmt.Println("\n#: Per Sector Info") - list, err := nodeApi.SectorsList(ctx) + list, err := minerApi.SectorsList(ctx) if err != nil { fmt.Println("ERROR: ", err) } diff --git a/cmd/lotus-miner/main.go b/cmd/lotus-miner/main.go index 0462373ae..3cc796168 100644 --- a/cmd/lotus-miner/main.go +++ b/cmd/lotus-miner/main.go @@ -177,13 +177,13 @@ func getActorAddress(ctx context.Context, cctx *cli.Context) (maddr address.Addr return } - nodeAPI, closer, err := lcli.GetStorageMinerAPI(cctx) + minerApi, closer, err := lcli.GetStorageMinerAPI(cctx) if err != nil { return address.Undef, err } defer closer() - maddr, err = nodeAPI.ActorAddress(ctx) + maddr, err = minerApi.ActorAddress(ctx) if err != nil { return maddr, xerrors.Errorf("getting actor address: %w", err) } diff --git a/cmd/lotus-miner/proving.go b/cmd/lotus-miner/proving.go index bbb744680..496e94c50 100644 --- a/cmd/lotus-miner/proving.go +++ b/cmd/lotus-miner/proving.go @@ -476,7 +476,7 @@ var provingCheckProvableCmd = &cli.Command{ } defer closer() - sapi, scloser, err := lcli.GetStorageMinerAPI(cctx) + minerApi, scloser, err := lcli.GetStorageMinerAPI(cctx) if err != nil { return err } @@ -484,7 +484,7 @@ var provingCheckProvableCmd = &cli.Command{ ctx := lcli.ReqContext(cctx) - addr, err := sapi.ActorAddress(ctx) + addr, err := minerApi.ActorAddress(ctx) if err != nil { return err } @@ -510,7 +510,7 @@ var provingCheckProvableCmd = &cli.Command{ var filter map[abi.SectorID]struct{} if cctx.IsSet("storage-id") { - sl, err := sapi.StorageList(ctx) + sl, err := minerApi.StorageList(ctx) if err != nil { return err } @@ -582,7 +582,7 @@ var provingCheckProvableCmd = &cli.Command{ }) } - bad, err := sapi.CheckProvable(ctx, info.WindowPoStProofType, tocheck, cctx.Bool("slow")) + bad, err := minerApi.CheckProvable(ctx, info.WindowPoStProofType, tocheck, cctx.Bool("slow")) if err != nil { return err } @@ -625,7 +625,7 @@ It will not send any messages to the chain.`, return xerrors.Errorf("could not parse deadline index: %w", err) } - sapi, scloser, err := lcli.GetStorageMinerAPI(cctx) + minerApi, scloser, err := lcli.GetStorageMinerAPI(cctx) if err != nil { return err } @@ -634,7 +634,7 @@ It will not send any messages to the chain.`, ctx := lcli.ReqContext(cctx) start := time.Now() - res, err := sapi.ComputeWindowPoSt(ctx, dlIdx, types.EmptyTSK) + res, err := minerApi.ComputeWindowPoSt(ctx, dlIdx, types.EmptyTSK) fmt.Printf("Took %s\n", time.Now().Sub(start)) if err != nil { return err @@ -675,7 +675,7 @@ var provingRecoverFaultsCmd = &cli.Command{ sectors = append(sectors, abi.SectorNumber(s)) } - nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx) + minerApi, closer, err := lcli.GetStorageMinerAPI(cctx) if err != nil { return err } @@ -689,7 +689,7 @@ var provingRecoverFaultsCmd = &cli.Command{ ctx := lcli.ReqContext(cctx) - msgs, err := nodeApi.RecoverFault(ctx, sectors) + msgs, err := minerApi.RecoverFault(ctx, sectors) if err != nil { return err } diff --git a/cmd/lotus-miner/sealing.go b/cmd/lotus-miner/sealing.go index 334266c79..adf3b9c2f 100644 --- a/cmd/lotus-miner/sealing.go +++ b/cmd/lotus-miner/sealing.go @@ -57,7 +57,7 @@ func workersCmd(sealing bool) *cli.Command { color.NoColor = !cctx.Bool("color") } - nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx) + minerApi, closer, err := lcli.GetStorageMinerAPI(cctx) if err != nil { return err } @@ -65,7 +65,7 @@ func workersCmd(sealing bool) *cli.Command { ctx := lcli.ReqContext(cctx) - stats, err := nodeApi.WorkerStats(ctx) + stats, err := minerApi.WorkerStats(ctx) if err != nil { return err } @@ -233,7 +233,7 @@ var sealingJobsCmd = &cli.Command{ color.NoColor = !cctx.Bool("color") } - nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx) + minerApi, closer, err := lcli.GetStorageMinerAPI(cctx) if err != nil { return err } @@ -241,7 +241,7 @@ var sealingJobsCmd = &cli.Command{ ctx := lcli.ReqContext(cctx) - jobs, err := nodeApi.WorkerJobs(ctx) + jobs, err := minerApi.WorkerJobs(ctx) if err != nil { return xerrors.Errorf("getting worker jobs: %w", err) } @@ -275,7 +275,7 @@ var sealingJobsCmd = &cli.Command{ workerHostnames := map[uuid.UUID]string{} - wst, err := nodeApi.WorkerStats(ctx) + wst, err := minerApi.WorkerStats(ctx) if err != nil { return xerrors.Errorf("getting worker stats: %w", err) } @@ -337,7 +337,7 @@ var sealingSchedDiagCmd = &cli.Command{ }, }, Action: func(cctx *cli.Context) error { - nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx) + minerApi, closer, err := lcli.GetStorageMinerAPI(cctx) if err != nil { return err } @@ -345,7 +345,7 @@ var sealingSchedDiagCmd = &cli.Command{ ctx := lcli.ReqContext(cctx) - st, err := nodeApi.SealingSchedDiag(ctx, cctx.Bool("force-sched")) + st, err := minerApi.SealingSchedDiag(ctx, cctx.Bool("force-sched")) if err != nil { return err } @@ -376,7 +376,7 @@ var sealingAbortCmd = &cli.Command{ return xerrors.Errorf("expected 1 argument") } - nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx) + minerApi, closer, err := lcli.GetStorageMinerAPI(cctx) if err != nil { return err } @@ -385,14 +385,14 @@ var sealingAbortCmd = &cli.Command{ ctx := lcli.ReqContext(cctx) if cctx.Bool("sched") { - err = nodeApi.SealingRemoveRequest(ctx, uuid.Must(uuid.Parse(cctx.Args().First()))) + err = minerApi.SealingRemoveRequest(ctx, uuid.Must(uuid.Parse(cctx.Args().First()))) if err != nil { return xerrors.Errorf("Failed to removed the request with UUID %s: %w", cctx.Args().First(), err) } return nil } - jobs, err := nodeApi.WorkerJobs(ctx) + jobs, err := minerApi.WorkerJobs(ctx) if err != nil { return xerrors.Errorf("getting worker jobs: %w", err) } @@ -415,7 +415,7 @@ var sealingAbortCmd = &cli.Command{ fmt.Printf("aborting job %s, task %s, sector %d, running on host %s\n", job.ID.String(), job.Task.Short(), job.Sector.Number, job.Hostname) - return nodeApi.SealingAbort(ctx, job.ID) + return minerApi.SealingAbort(ctx, job.ID) }, } @@ -434,7 +434,7 @@ var sealingDataCidCmd = &cli.Command{ return xerrors.Errorf("expected 1 or 2 arguments") } - nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx) + minerApi, closer, err := lcli.GetStorageMinerAPI(cctx) if err != nil { return err } @@ -500,7 +500,7 @@ var sealingDataCidCmd = &cli.Command{ psize = padreader.PaddedSize(sz).Padded() } - pc, err := nodeApi.ComputeDataCid(ctx, psize.Unpadded(), r) + pc, err := minerApi.ComputeDataCid(ctx, psize.Unpadded(), r) if err != nil { return xerrors.Errorf("computing data CID: %w", err) } diff --git a/cmd/lotus-miner/sectors.go b/cmd/lotus-miner/sectors.go index 336a06f52..b35c38fd4 100644 --- a/cmd/lotus-miner/sectors.go +++ b/cmd/lotus-miner/sectors.go @@ -69,14 +69,14 @@ var sectorsPledgeCmd = &cli.Command{ Name: "pledge", Usage: "store random data in a sector", Action: func(cctx *cli.Context) error { - nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx) + minerApi, closer, err := lcli.GetStorageMinerAPI(cctx) if err != nil { return err } defer closer() ctx := lcli.ReqContext(cctx) - id, err := nodeApi.PledgeSector(ctx) + id, err := minerApi.PledgeSector(ctx) if err != nil { return err } @@ -113,7 +113,7 @@ var sectorsStatusCmd = &cli.Command{ }, }, Action: func(cctx *cli.Context) error { - nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx) + minerApi, closer, err := lcli.GetStorageMinerAPI(cctx) if err != nil { return err } @@ -130,7 +130,7 @@ var sectorsStatusCmd = &cli.Command{ } onChainInfo := cctx.Bool("on-chain-info") - status, err := nodeApi.SectorsStatus(ctx, abi.SectorNumber(id), onChainInfo) + status, err := minerApi.SectorsStatus(ctx, abi.SectorNumber(id), onChainInfo) if err != nil { return err } @@ -318,7 +318,7 @@ var sectorsListCmd = &cli.Command{ color.NoColor = !cctx.Bool("color") } - nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx) + minerApi, closer, err := lcli.GetStorageMinerAPI(cctx) if err != nil { return err } @@ -359,16 +359,16 @@ var sectorsListCmd = &cli.Command{ } if len(states) == 0 { - list, err = nodeApi.SectorsList(ctx) + list, err = minerApi.SectorsList(ctx) } else { - list, err = nodeApi.SectorsListInStates(ctx, states) + list, err = minerApi.SectorsListInStates(ctx, states) } if err != nil { return err } - maddr, err := nodeApi.ActorAddress(ctx) + maddr, err := minerApi.ActorAddress(ctx) if err != nil { return err } @@ -418,7 +418,7 @@ var sectorsListCmd = &cli.Command{ fast := cctx.Bool("fast") for _, s := range list { - st, err := nodeApi.SectorsStatus(ctx, s, !fast) + st, err := minerApi.SectorsStatus(ctx, s, !fast) if err != nil { tw.Write(map[string]interface{}{ "ID": s, @@ -1372,7 +1372,7 @@ var sectorsTerminateCmd = &cli.Command{ if !cctx.Bool("really-do-it") { return xerrors.Errorf("pass --really-do-it to confirm this action") } - nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx) + minerApi, closer, err := lcli.GetStorageMinerAPI(cctx) if err != nil { return err } @@ -1387,7 +1387,7 @@ var sectorsTerminateCmd = &cli.Command{ return xerrors.Errorf("could not parse sector number: %w", err) } - return nodeApi.SectorTerminate(ctx, abi.SectorNumber(id)) + return minerApi.SectorTerminate(ctx, abi.SectorNumber(id)) }, } @@ -1395,14 +1395,14 @@ var sectorsTerminateFlushCmd = &cli.Command{ Name: "flush", Usage: "Send a terminate message if there are sectors queued for termination", Action: func(cctx *cli.Context) error { - nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx) + minerApi, closer, err := lcli.GetStorageMinerAPI(cctx) if err != nil { return err } defer closer() ctx := lcli.ReqContext(cctx) - mcid, err := nodeApi.SectorTerminateFlush(ctx) + mcid, err := minerApi.SectorTerminateFlush(ctx) if err != nil { return err } @@ -1421,7 +1421,7 @@ var sectorsTerminatePendingCmd = &cli.Command{ Name: "pending", Usage: "List sector numbers of sectors pending termination", Action: func(cctx *cli.Context) error { - nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx) + minerAPI, closer, err := lcli.GetStorageMinerAPI(cctx) if err != nil { return err } @@ -1433,12 +1433,12 @@ var sectorsTerminatePendingCmd = &cli.Command{ defer nCloser() ctx := lcli.ReqContext(cctx) - pending, err := nodeApi.SectorTerminatePending(ctx) + pending, err := minerAPI.SectorTerminatePending(ctx) if err != nil { return err } - maddr, err := nodeApi.ActorAddress(ctx) + maddr, err := minerAPI.ActorAddress(ctx) if err != nil { return err } @@ -1482,7 +1482,7 @@ var sectorsRemoveCmd = &cli.Command{ if !cctx.Bool("really-do-it") { return xerrors.Errorf("this is a command for advanced users, only use it if you are sure of what you are doing") } - nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx) + minerAPI, closer, err := lcli.GetStorageMinerAPI(cctx) if err != nil { return err } @@ -1497,7 +1497,7 @@ var sectorsRemoveCmd = &cli.Command{ return xerrors.Errorf("could not parse sector number: %w", err) } - return nodeApi.SectorRemove(ctx, abi.SectorNumber(id)) + return minerAPI.SectorRemove(ctx, abi.SectorNumber(id)) }, } @@ -1510,7 +1510,7 @@ var sectorsSnapUpCmd = &cli.Command{ return lcli.ShowHelp(cctx, xerrors.Errorf("must pass sector number")) } - nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx) + minerAPI, closer, err := lcli.GetStorageMinerAPI(cctx) if err != nil { return err } @@ -1535,7 +1535,7 @@ var sectorsSnapUpCmd = &cli.Command{ return xerrors.Errorf("could not parse sector number: %w", err) } - return nodeApi.SectorMarkForUpgrade(ctx, abi.SectorNumber(id), true) + return minerAPI.SectorMarkForUpgrade(ctx, abi.SectorNumber(id), true) }, } @@ -1560,7 +1560,7 @@ var sectorsSnapAbortCmd = &cli.Command{ return fmt.Errorf("--really-do-it must be specified for this action to have an effect; you have been warned") } - nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx) + minerAPI, closer, err := lcli.GetStorageMinerAPI(cctx) if err != nil { return err } @@ -1572,7 +1572,7 @@ var sectorsSnapAbortCmd = &cli.Command{ return xerrors.Errorf("could not parse sector number: %w", err) } - return nodeApi.SectorAbortUpgrade(ctx, abi.SectorNumber(id)) + return minerAPI.SectorAbortUpgrade(ctx, abi.SectorNumber(id)) }, } @@ -1581,7 +1581,7 @@ var sectorsStartSealCmd = &cli.Command{ Usage: "Manually start sealing a sector (filling any unused space with junk)", ArgsUsage: "", Action: func(cctx *cli.Context) error { - nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx) + minerAPI, closer, err := lcli.GetStorageMinerAPI(cctx) if err != nil { return err } @@ -1596,7 +1596,7 @@ var sectorsStartSealCmd = &cli.Command{ return xerrors.Errorf("could not parse sector number: %w", err) } - return nodeApi.SectorStartSealing(ctx, abi.SectorNumber(id)) + return minerAPI.SectorStartSealing(ctx, abi.SectorNumber(id)) }, } @@ -1605,7 +1605,7 @@ var sectorsSealDelayCmd = &cli.Command{ Usage: "Set the time, in minutes, that a new sector waits for deals before sealing starts", ArgsUsage: "", Action: func(cctx *cli.Context) error { - nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx) + minerAPI, closer, err := lcli.GetStorageMinerAPI(cctx) if err != nil { return err } @@ -1622,7 +1622,7 @@ var sectorsSealDelayCmd = &cli.Command{ delay := hs * uint64(time.Minute) - return nodeApi.SectorSetSealDelay(ctx, time.Duration(delay)) + return minerAPI.SectorSetSealDelay(ctx, time.Duration(delay)) }, } @@ -1708,7 +1708,7 @@ var sectorsUpdateCmd = &cli.Command{ if !cctx.Bool("really-do-it") { return xerrors.Errorf("this is a command for advanced users, only use it if you are sure of what you are doing") } - nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx) + minerAPI, closer, err := lcli.GetStorageMinerAPI(cctx) if err != nil { return err } @@ -1723,7 +1723,7 @@ var sectorsUpdateCmd = &cli.Command{ return xerrors.Errorf("could not parse sector number: %w", err) } - _, err = nodeApi.SectorsStatus(ctx, abi.SectorNumber(id), false) + _, err = minerAPI.SectorsStatus(ctx, abi.SectorNumber(id), false) if err != nil { return xerrors.Errorf("sector %d not found, could not change state", id) } @@ -1737,7 +1737,7 @@ var sectorsUpdateCmd = &cli.Command{ return nil } - return nodeApi.SectorsUpdate(ctx, abi.SectorNumber(id), api.SectorState(cctx.Args().Get(1))) + return minerAPI.SectorsUpdate(ctx, abi.SectorNumber(id), api.SectorState(cctx.Args().Get(1))) }, } @@ -1765,7 +1765,7 @@ var sectorsExpiredCmd = &cli.Command{ }, }, Action: func(cctx *cli.Context) error { - nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx) + minerAPI, closer, err := lcli.GetStorageMinerAPI(cctx) if err != nil { return err } @@ -1805,7 +1805,7 @@ var sectorsExpiredCmd = &cli.Command{ return xerrors.Errorf("getting lookback tipset: %w", err) } - maddr, err := nodeApi.ActorAddress(ctx) + maddr, err := minerAPI.ActorAddress(ctx) if err != nil { return xerrors.Errorf("getting actor address: %w", err) } @@ -1813,7 +1813,7 @@ var sectorsExpiredCmd = &cli.Command{ // toCheck is a working bitfield which will only contain terminated sectors toCheck := bitfield.New() { - sectors, err := nodeApi.SectorsList(ctx) + sectors, err := minerAPI.SectorsList(ctx) if err != nil { return xerrors.Errorf("getting sector list: %w", err) } @@ -1890,7 +1890,7 @@ var sectorsExpiredCmd = &cli.Command{ err = toCheck.ForEach(func(u uint64) error { s := abi.SectorNumber(u) - st, err := nodeApi.SectorsStatus(ctx, s, true) + st, err := minerAPI.SectorsStatus(ctx, s, true) if err != nil { fmt.Printf("%d:\tError getting status: %s\n", u, err) return nil @@ -1933,7 +1933,7 @@ var sectorsExpiredCmd = &cli.Command{ for _, number := range toRemove { fmt.Printf("Removing sector\t%s:\t", color.YellowString("%d", number)) - err := nodeApi.SectorRemove(ctx, number) + err := minerAPI.SectorRemove(ctx, number) if err != nil { color.Red("ERROR: %s\n", err.Error()) } else { @@ -1965,7 +1965,7 @@ var sectorsBatchingPendingCommit = &cli.Command{ }, }, Action: func(cctx *cli.Context) error { - api, closer, err := lcli.GetStorageMinerAPI(cctx) + minerAPI, closer, err := lcli.GetStorageMinerAPI(cctx) if err != nil { return err } @@ -1973,7 +1973,7 @@ var sectorsBatchingPendingCommit = &cli.Command{ ctx := lcli.ReqContext(cctx) if cctx.Bool("publish-now") { - res, err := api.SectorCommitFlush(ctx) + res, err := minerAPI.SectorCommitFlush(ctx) if err != nil { return xerrors.Errorf("flush: %w", err) } @@ -2000,7 +2000,7 @@ var sectorsBatchingPendingCommit = &cli.Command{ return nil } - pending, err := api.SectorCommitPending(ctx) + pending, err := minerAPI.SectorCommitPending(ctx) if err != nil { return xerrors.Errorf("getting pending deals: %w", err) } @@ -2027,7 +2027,7 @@ var sectorsBatchingPendingPreCommit = &cli.Command{ }, }, Action: func(cctx *cli.Context) error { - api, closer, err := lcli.GetStorageMinerAPI(cctx) + minerAPI, closer, err := lcli.GetStorageMinerAPI(cctx) if err != nil { return err } @@ -2035,7 +2035,7 @@ var sectorsBatchingPendingPreCommit = &cli.Command{ ctx := lcli.ReqContext(cctx) if cctx.Bool("publish-now") { - res, err := api.SectorPreCommitFlush(ctx) + res, err := minerAPI.SectorPreCommitFlush(ctx) if err != nil { return xerrors.Errorf("flush: %w", err) } @@ -2058,7 +2058,7 @@ var sectorsBatchingPendingPreCommit = &cli.Command{ return nil } - pending, err := api.SectorPreCommitPending(ctx) + pending, err := minerAPI.SectorPreCommitPending(ctx) if err != nil { return xerrors.Errorf("getting pending deals: %w", err) } @@ -2079,14 +2079,14 @@ var sectorsRefreshPieceMatchingCmd = &cli.Command{ Name: "match-pending-pieces", Usage: "force a refreshed match of pending pieces to open sectors without manually waiting for more deals", Action: func(cctx *cli.Context) error { - nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx) + minerAPI, closer, err := lcli.GetStorageMinerAPI(cctx) if err != nil { return err } defer closer() ctx := lcli.ReqContext(cctx) - if err := nodeApi.SectorMatchPendingPiecesToOpenSectors(ctx); err != nil { + if err := minerAPI.SectorMatchPendingPiecesToOpenSectors(ctx); err != nil { return err } @@ -2219,14 +2219,14 @@ var sectorsNumbersInfoCmd = &cli.Command{ Name: "info", Usage: "view sector assigner state", Action: func(cctx *cli.Context) error { - api, closer, err := lcli.GetStorageMinerAPI(cctx) + minerAPI, closer, err := lcli.GetStorageMinerAPI(cctx) if err != nil { return err } defer closer() ctx := lcli.ReqContext(cctx) - am, err := api.SectorNumAssignerMeta(ctx) + am, err := minerAPI.SectorNumAssignerMeta(ctx) if err != nil { return err } @@ -2253,14 +2253,14 @@ var sectorsNumbersReservationsCmd = &cli.Command{ Name: "reservations", Usage: "list sector number reservations", Action: func(cctx *cli.Context) error { - api, closer, err := lcli.GetStorageMinerAPI(cctx) + minerAPI, closer, err := lcli.GetStorageMinerAPI(cctx) if err != nil { return err } defer closer() ctx := lcli.ReqContext(cctx) - rs, err := api.SectorNumReservations(ctx) + rs, err := minerAPI.SectorNumReservations(ctx) if err != nil { return err } @@ -2303,7 +2303,7 @@ var sectorsNumbersReserveCmd = &cli.Command{ }, ArgsUsage: "[reservation name] [reserved ranges]", Action: func(cctx *cli.Context) error { - api, closer, err := lcli.GetStorageMinerAPI(cctx) + minerAPI, closer, err := lcli.GetStorageMinerAPI(cctx) if err != nil { return err } @@ -2319,7 +2319,7 @@ var sectorsNumbersReserveCmd = &cli.Command{ return xerrors.Errorf("parsing ranges: %w", err) } - return api.SectorNumReserve(ctx, cctx.Args().First(), bf, cctx.Bool("force")) + return minerAPI.SectorNumReserve(ctx, cctx.Args().First(), bf, cctx.Bool("force")) }, } @@ -2328,7 +2328,7 @@ var sectorsNumbersFreeCmd = &cli.Command{ Usage: "remove sector number reservations", ArgsUsage: "[reservation name]", Action: func(cctx *cli.Context) error { - api, closer, err := lcli.GetStorageMinerAPI(cctx) + minerAPI, closer, err := lcli.GetStorageMinerAPI(cctx) if err != nil { return err } @@ -2339,6 +2339,6 @@ var sectorsNumbersFreeCmd = &cli.Command{ return xerrors.Errorf("expected 1 argument: [reservation name]") } - return api.SectorNumFree(ctx, cctx.Args().First()) + return minerAPI.SectorNumFree(ctx, cctx.Args().First()) }, } diff --git a/cmd/lotus-miner/storage.go b/cmd/lotus-miner/storage.go index cc5d94534..1200448b1 100644 --- a/cmd/lotus-miner/storage.go +++ b/cmd/lotus-miner/storage.go @@ -109,7 +109,7 @@ over time }, }, Action: func(cctx *cli.Context) error { - nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx) + minerApi, closer, err := lcli.GetStorageMinerAPI(cctx) if err != nil { return err } @@ -172,7 +172,7 @@ over time } } - return nodeApi.StorageAddLocal(ctx, p) + return minerApi.StorageAddLocal(ctx, p) }, } @@ -186,7 +186,7 @@ var storageDetachCmd = &cli.Command{ }, ArgsUsage: "[path]", Action: func(cctx *cli.Context) error { - nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx) + minerApi, closer, err := lcli.GetStorageMinerAPI(cctx) if err != nil { return err } @@ -206,7 +206,7 @@ var storageDetachCmd = &cli.Command{ return xerrors.Errorf("pass --really-do-it to execute the action") } - return nodeApi.StorageDetachLocal(ctx, p) + return minerApi.StorageDetachLocal(ctx, p) }, } @@ -228,7 +228,7 @@ var storageRedeclareCmd = &cli.Command{ }, }, Action: func(cctx *cli.Context) error { - nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx) + minerApi, closer, err := lcli.GetStorageMinerAPI(cctx) if err != nil { return err } @@ -241,11 +241,11 @@ var storageRedeclareCmd = &cli.Command{ if cctx.IsSet("id") { id := storiface.ID(cctx.String("id")) - return nodeApi.StorageRedeclareLocal(ctx, &id, cctx.Bool("drop-missing")) + return minerApi.StorageRedeclareLocal(ctx, &id, cctx.Bool("drop-missing")) } if cctx.Bool("all") { - return nodeApi.StorageRedeclareLocal(ctx, nil, cctx.Bool("drop-missing")) + return minerApi.StorageRedeclareLocal(ctx, nil, cctx.Bool("drop-missing")) } return xerrors.Errorf("either --all or --id must be specified") @@ -270,19 +270,19 @@ var storageListCmd = &cli.Command{ color.NoColor = !cctx.Bool("color") } - nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx) + minerApi, closer, err := lcli.GetStorageMinerAPI(cctx) if err != nil { return err } defer closer() ctx := lcli.ReqContext(cctx) - st, err := nodeApi.StorageList(ctx) + st, err := minerApi.StorageList(ctx) if err != nil { return err } - local, err := nodeApi.StorageLocal(ctx) + local, err := minerApi.StorageLocal(ctx) if err != nil { return err } @@ -295,7 +295,7 @@ var storageListCmd = &cli.Command{ sorted := make([]fsInfo, 0, len(st)) for id, decls := range st { - st, err := nodeApi.StorageStat(ctx, id) + st, err := minerApi.StorageStat(ctx, id) if err != nil { sorted = append(sorted, fsInfo{ID: id, sectors: decls}) continue @@ -325,7 +325,7 @@ var storageListCmd = &cli.Command{ fmt.Printf("%s:\n", s.ID) pingStart := time.Now() - st, err := nodeApi.StorageStat(ctx, s.ID) + st, err := minerApi.StorageStat(ctx, s.ID) if err != nil { fmt.Printf("\t%s: %s:\n", color.RedString("Error"), err) continue @@ -398,7 +398,7 @@ var storageListCmd = &cli.Command{ color.BlueString("Caches: %d", cnt[2]), types.SizeStr(types.NewInt(uint64(st.Reserved)))) - si, err := nodeApi.StorageInfo(ctx, s.ID) + si, err := minerApi.StorageInfo(ctx, s.ID) if err != nil { return err } @@ -469,14 +469,14 @@ var storageFindCmd = &cli.Command{ Usage: "find sector in the storage system", ArgsUsage: "[sector number]", Action: func(cctx *cli.Context) error { - nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx) + minerApi, closer, err := lcli.GetStorageMinerAPI(cctx) if err != nil { return err } defer closer() ctx := lcli.ReqContext(cctx) - ma, err := nodeApi.ActorAddress(ctx) + ma, err := minerApi.ActorAddress(ctx) if err != nil { return err } @@ -500,27 +500,27 @@ var storageFindCmd = &cli.Command{ Number: abi.SectorNumber(snum), } - u, err := nodeApi.StorageFindSector(ctx, sid, storiface.FTUnsealed, 0, false) + u, err := minerApi.StorageFindSector(ctx, sid, storiface.FTUnsealed, 0, false) if err != nil { return xerrors.Errorf("finding unsealed: %w", err) } - s, err := nodeApi.StorageFindSector(ctx, sid, storiface.FTSealed, 0, false) + s, err := minerApi.StorageFindSector(ctx, sid, storiface.FTSealed, 0, false) if err != nil { return xerrors.Errorf("finding sealed: %w", err) } - c, err := nodeApi.StorageFindSector(ctx, sid, storiface.FTCache, 0, false) + c, err := minerApi.StorageFindSector(ctx, sid, storiface.FTCache, 0, false) if err != nil { return xerrors.Errorf("finding cache: %w", err) } - us, err := nodeApi.StorageFindSector(ctx, sid, storiface.FTUpdate, 0, false) + us, err := minerApi.StorageFindSector(ctx, sid, storiface.FTUpdate, 0, false) if err != nil { return xerrors.Errorf("finding sealed: %w", err) } - uc, err := nodeApi.StorageFindSector(ctx, sid, storiface.FTUpdateCache, 0, false) + uc, err := minerApi.StorageFindSector(ctx, sid, storiface.FTUpdateCache, 0, false) if err != nil { return xerrors.Errorf("finding cache: %w", err) } @@ -582,7 +582,7 @@ var storageFindCmd = &cli.Command{ sts.updatecache = true } - local, err := nodeApi.StorageLocal(ctx) + local, err := minerApi.StorageLocal(ctx) if err != nil { return err } @@ -644,7 +644,7 @@ var storageListSectorsCmd = &cli.Command{ color.NoColor = !cctx.Bool("color") } - nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx) + minerApi, closer, err := lcli.GetStorageMinerAPI(cctx) if err != nil { return err } @@ -658,12 +658,12 @@ var storageListSectorsCmd = &cli.Command{ ctx := lcli.ReqContext(cctx) - sectors, err := nodeApi.SectorsList(ctx) + sectors, err := minerApi.SectorsList(ctx) if err != nil { return xerrors.Errorf("listing sectors: %w", err) } - maddr, err := nodeApi.ActorAddress(ctx) + maddr, err := minerApi.ActorAddress(ctx) if err != nil { return err } @@ -706,7 +706,7 @@ var storageListSectorsCmd = &cli.Command{ var list []entry for _, sector := range sectors { - st, err := nodeApi.SectorsStatus(ctx, sector, false) + st, err := minerApi.SectorsStatus(ctx, sector, false) if err != nil { return xerrors.Errorf("getting sector status for sector %d: %w", sector, err) } @@ -716,7 +716,7 @@ var storageListSectorsCmd = &cli.Command{ } for _, ft := range storiface.PathTypes { - si, err := nodeApi.StorageFindSector(ctx, sid(sector), ft, mi.SectorSize, false) + si, err := minerApi.StorageFindSector(ctx, sid(sector), ft, mi.SectorSize, false) if err != nil { return xerrors.Errorf("find sector %d: %w", sector, err) } @@ -869,7 +869,7 @@ var storageCleanupCmd = &cli.Command{ }, }, Action: func(cctx *cli.Context) error { - api, closer, err := lcli.GetStorageMinerAPI(cctx) + minerAPI, closer, err := lcli.GetStorageMinerAPI(cctx) if err != nil { return err } @@ -884,7 +884,7 @@ var storageCleanupCmd = &cli.Command{ ctx := lcli.ReqContext(cctx) if cctx.Bool("removed") { - if err := cleanupRemovedSectorData(ctx, api, napi); err != nil { + if err := cleanupRemovedSectorData(ctx, minerAPI, napi); err != nil { return err } } @@ -962,20 +962,20 @@ var storageLocks = &cli.Command{ Name: "locks", Usage: "show active sector locks", Action: func(cctx *cli.Context) error { - api, closer, err := lcli.GetStorageMinerAPI(cctx) + minerAPI, closer, err := lcli.GetStorageMinerAPI(cctx) if err != nil { return err } defer closer() ctx := lcli.ReqContext(cctx) - locks, err := api.StorageGetLocks(ctx) + locks, err := minerAPI.StorageGetLocks(ctx) if err != nil { return err } for _, lock := range locks.Locks { - st, err := api.SectorsStatus(ctx, lock.Sector.Number, false) + st, err := minerAPI.SectorsStatus(ctx, lock.Sector.Number, false) if err != nil { return xerrors.Errorf("getting sector status(%d): %w", lock.Sector.Number, err) } diff --git a/cmd/lotus-shed/actor.go b/cmd/lotus-shed/actor.go index c07b50ffb..53cb5e1ec 100644 --- a/cmd/lotus-shed/actor.go +++ b/cmd/lotus-shed/actor.go @@ -74,13 +74,13 @@ var actorWithdrawCmd = &cli.Command{ ctx := lcli.ReqContext(cctx) if maddr.Empty() { - minerAPI, closer, err := lcli.GetStorageMinerAPI(cctx) + minerApi, closer, err := lcli.GetStorageMinerAPI(cctx) if err != nil { return err } defer closer() - maddr, err = minerAPI.ActorAddress(ctx) + maddr, err = minerApi.ActorAddress(ctx) if err != nil { return err } @@ -233,13 +233,13 @@ var actorSetOwnerCmd = &cli.Command{ } if maddr.Empty() { - minerAPI, closer, err := lcli.GetStorageMinerAPI(cctx) + minerApi, closer, err := lcli.GetStorageMinerAPI(cctx) if err != nil { return err } defer closer() - maddr, err = minerAPI.ActorAddress(ctx) + maddr, err = minerApi.ActorAddress(ctx) if err != nil { return err } @@ -339,13 +339,13 @@ var actorControlList = &cli.Command{ ctx := lcli.ReqContext(cctx) if maddr.Empty() { - minerAPI, closer, err := lcli.GetStorageMinerAPI(cctx) + minerApi, closer, err := lcli.GetStorageMinerAPI(cctx) if err != nil { return err } defer closer() - maddr, err = minerAPI.ActorAddress(ctx) + maddr, err = minerApi.ActorAddress(ctx) if err != nil { return err } @@ -448,13 +448,13 @@ var actorControlSet = &cli.Command{ ctx := lcli.ReqContext(cctx) if maddr.Empty() { - minerAPI, closer, err := lcli.GetStorageMinerAPI(cctx) + minerApi, closer, err := lcli.GetStorageMinerAPI(cctx) if err != nil { return err } defer closer() - maddr, err = minerAPI.ActorAddress(ctx) + maddr, err = minerApi.ActorAddress(ctx) if err != nil { return err } @@ -590,13 +590,13 @@ var actorProposeChangeWorker = &cli.Command{ } if maddr.Empty() { - minerAPI, closer, err := lcli.GetStorageMinerAPI(cctx) + minerApi, closer, err := lcli.GetStorageMinerAPI(cctx) if err != nil { return err } defer closer() - maddr, err = minerAPI.ActorAddress(ctx) + maddr, err = minerApi.ActorAddress(ctx) if err != nil { return err } @@ -720,13 +720,13 @@ var actorConfirmChangeWorker = &cli.Command{ } if maddr.Empty() { - minerAPI, closer, err := lcli.GetStorageMinerAPI(cctx) + minerApi, closer, err := lcli.GetStorageMinerAPI(cctx) if err != nil { return err } defer closer() - maddr, err = minerAPI.ActorAddress(ctx) + maddr, err = minerApi.ActorAddress(ctx) if err != nil { return err } diff --git a/cmd/lotus-shed/sectors.go b/cmd/lotus-shed/sectors.go index 39e17f045..8fa7803d3 100644 --- a/cmd/lotus-shed/sectors.go +++ b/cmd/lotus-shed/sectors.go @@ -90,13 +90,13 @@ var terminateSectorCmd = &cli.Command{ ctx := lcli.ReqContext(cctx) if maddr.Empty() { - api, acloser, err := lcli.GetStorageMinerAPI(cctx) + minerApi, acloser, err := lcli.GetStorageMinerAPI(cctx) if err != nil { return err } defer acloser() - maddr, err = api.ActorAddress(ctx) + maddr, err = minerApi.ActorAddress(ctx) if err != nil { return err } @@ -222,13 +222,13 @@ var terminateSectorPenaltyEstimationCmd = &cli.Command{ ctx := lcli.ReqContext(cctx) if maddr.Empty() { - api, acloser, err := lcli.GetStorageMinerAPI(cctx) + minerApi, acloser, err := lcli.GetStorageMinerAPI(cctx) if err != nil { return err } defer acloser() - maddr, err = api.ActorAddress(ctx) + maddr, err = minerApi.ActorAddress(ctx) if err != nil { return err } From 3ca9b1e3312a9461164593fdd6e86802e51795f1 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 14 Sep 2022 14:53:11 -0400 Subject: [PATCH 129/185] wait.Receipt.ExitCode != 0 to wait.Receipt.ExitCode.IsError() --- cli/filplus.go | 2 +- cli/multisig.go | 30 +++++++++++++++--------------- cli/paych.go | 6 +++--- cli/wallet.go | 2 +- cmd/lotus-miner/actor.go | 10 +++++----- cmd/lotus-miner/proving.go | 2 +- cmd/lotus-miner/sectors.go | 2 +- cmd/lotus-shed/actor.go | 8 ++++---- cmd/lotus-shed/miner-multisig.go | 14 +++++++------- cmd/lotus-shed/miner.go | 4 ++-- cmd/lotus-shed/sectors.go | 2 +- cmd/lotus-shed/verifreg.go | 8 ++++---- paychmgr/simple.go | 4 ++-- 13 files changed, 47 insertions(+), 47 deletions(-) diff --git a/cli/filplus.go b/cli/filplus.go index 7ac4f0d58..5e19e5b04 100644 --- a/cli/filplus.go +++ b/cli/filplus.go @@ -120,7 +120,7 @@ var filplusVerifyClientCmd = &cli.Command{ return err } - if mwait.Receipt.ExitCode != 0 { + if mwait.Receipt.ExitCode.IsError() { return fmt.Errorf("failed to add verified client: %d", mwait.Receipt.ExitCode) } diff --git a/cli/multisig.go b/cli/multisig.go index 7a86c2d87..dc468a2cd 100644 --- a/cli/multisig.go +++ b/cli/multisig.go @@ -167,7 +167,7 @@ var msigCreateCmd = &cli.Command{ } // check it executed successfully - if wait.Receipt.ExitCode != 0 { + if wait.Receipt.ExitCode.IsError() { fmt.Fprintln(cctx.App.Writer, "actor creation failed!") return err } @@ -456,7 +456,7 @@ var msigProposeCmd = &cli.Command{ return err } - if wait.Receipt.ExitCode != 0 { + if wait.Receipt.ExitCode.IsError() { return fmt.Errorf("proposal returned exit %d", wait.Receipt.ExitCode) } @@ -605,7 +605,7 @@ var msigApproveCmd = &cli.Command{ return err } - if wait.Receipt.ExitCode != 0 { + if wait.Receipt.ExitCode.IsError() { return fmt.Errorf("approve returned exit %d", wait.Receipt.ExitCode) } @@ -730,7 +730,7 @@ var msigCancelCmd = &cli.Command{ return err } - if wait.Receipt.ExitCode != 0 { + if wait.Receipt.ExitCode.IsError() { return fmt.Errorf("cancel returned exit %d", wait.Receipt.ExitCode) } @@ -810,7 +810,7 @@ var msigRemoveProposeCmd = &cli.Command{ return err } - if wait.Receipt.ExitCode != 0 { + if wait.Receipt.ExitCode.IsError() { return fmt.Errorf("add proposal returned exit %d", wait.Receipt.ExitCode) } @@ -930,7 +930,7 @@ var msigAddProposeCmd = &cli.Command{ return err } - if wait.Receipt.ExitCode != 0 { + if wait.Receipt.ExitCode.IsError() { return fmt.Errorf("add proposal returned exit %d", wait.Receipt.ExitCode) } @@ -1021,7 +1021,7 @@ var msigAddApproveCmd = &cli.Command{ return err } - if wait.Receipt.ExitCode != 0 { + if wait.Receipt.ExitCode.IsError() { return fmt.Errorf("add approval returned exit %d", wait.Receipt.ExitCode) } @@ -1107,7 +1107,7 @@ var msigAddCancelCmd = &cli.Command{ return err } - if wait.Receipt.ExitCode != 0 { + if wait.Receipt.ExitCode.IsError() { return fmt.Errorf("add cancellation returned exit %d", wait.Receipt.ExitCode) } @@ -1188,7 +1188,7 @@ var msigSwapProposeCmd = &cli.Command{ return err } - if wait.Receipt.ExitCode != 0 { + if wait.Receipt.ExitCode.IsError() { return fmt.Errorf("swap proposal returned exit %d", wait.Receipt.ExitCode) } @@ -1279,7 +1279,7 @@ var msigSwapApproveCmd = &cli.Command{ return err } - if wait.Receipt.ExitCode != 0 { + if wait.Receipt.ExitCode.IsError() { return fmt.Errorf("swap approval returned exit %d", wait.Receipt.ExitCode) } @@ -1365,7 +1365,7 @@ var msigSwapCancelCmd = &cli.Command{ return err } - if wait.Receipt.ExitCode != 0 { + if wait.Receipt.ExitCode.IsError() { return fmt.Errorf("swap cancellation returned exit %d", wait.Receipt.ExitCode) } @@ -1461,7 +1461,7 @@ var msigLockProposeCmd = &cli.Command{ return err } - if wait.Receipt.ExitCode != 0 { + if wait.Receipt.ExitCode.IsError() { return fmt.Errorf("lock proposal returned exit %d", wait.Receipt.ExitCode) } @@ -1567,7 +1567,7 @@ var msigLockApproveCmd = &cli.Command{ return err } - if wait.Receipt.ExitCode != 0 { + if wait.Receipt.ExitCode.IsError() { return fmt.Errorf("lock approval returned exit %d", wait.Receipt.ExitCode) } @@ -1668,7 +1668,7 @@ var msigLockCancelCmd = &cli.Command{ return err } - if wait.Receipt.ExitCode != 0 { + if wait.Receipt.ExitCode.IsError() { return fmt.Errorf("lock cancellation returned exit %d", wait.Receipt.ExitCode) } @@ -1814,7 +1814,7 @@ var msigProposeThresholdCmd = &cli.Command{ return err } - if wait.Receipt.ExitCode != 0 { + if wait.Receipt.ExitCode.IsError() { return fmt.Errorf("change threshold proposal returned exit %d", wait.Receipt.ExitCode) } diff --git a/cli/paych.go b/cli/paych.go index 263aa7f34..09d4fcb11 100644 --- a/cli/paych.go +++ b/cli/paych.go @@ -286,7 +286,7 @@ var paychSettleCmd = &cli.Command{ if err != nil { return nil } - if mwait.Receipt.ExitCode != 0 { + if mwait.Receipt.ExitCode.IsError() { return fmt.Errorf("settle message execution failed (exit code %d)", mwait.Receipt.ExitCode) } @@ -326,7 +326,7 @@ var paychCloseCmd = &cli.Command{ if err != nil { return nil } - if mwait.Receipt.ExitCode != 0 { + if mwait.Receipt.ExitCode.IsError() { return fmt.Errorf("collect message execution failed (exit code %d)", mwait.Receipt.ExitCode) } @@ -634,7 +634,7 @@ var paychVoucherSubmitCmd = &cli.Command{ return err } - if mwait.Receipt.ExitCode != 0 { + if mwait.Receipt.ExitCode.IsError() { return fmt.Errorf("message execution failed (exit code %d)", mwait.Receipt.ExitCode) } diff --git a/cli/wallet.go b/cli/wallet.go index 4193138c3..56c1532f4 100644 --- a/cli/wallet.go +++ b/cli/wallet.go @@ -645,7 +645,7 @@ var walletMarketWithdraw = &cli.Command{ } // check it executed successfully - if wait.Receipt.ExitCode != 0 { + if wait.Receipt.ExitCode.IsError() { afmt.Println(cctx.App.Writer, "withdrawal failed!") return err } diff --git a/cmd/lotus-miner/actor.go b/cmd/lotus-miner/actor.go index e4e4b4eae..c06711170 100644 --- a/cmd/lotus-miner/actor.go +++ b/cmd/lotus-miner/actor.go @@ -290,7 +290,7 @@ var actorWithdrawCmd = &cli.Command{ return xerrors.Errorf("Timeout waiting for withdrawal message %s", wait.Message) } - if wait.Receipt.ExitCode != 0 { + if wait.Receipt.ExitCode.IsError() { return xerrors.Errorf("Failed to execute withdrawal message %s: %w", wait.Message, wait.Receipt.ExitCode.Error()) } @@ -799,7 +799,7 @@ var actorSetOwnerCmd = &cli.Command{ } // check it executed successfully - if wait.Receipt.ExitCode != 0 { + if wait.Receipt.ExitCode.IsError() { fmt.Println("owner change failed!") return err } @@ -905,7 +905,7 @@ var actorProposeChangeWorker = &cli.Command{ } // check it executed successfully - if wait.Receipt.ExitCode != 0 { + if wait.Receipt.ExitCode.IsError() { fmt.Fprintln(cctx.App.Writer, "Propose worker change failed!") return err } @@ -1011,7 +1011,7 @@ var actorConfirmChangeWorker = &cli.Command{ } // check it executed successfully - if wait.Receipt.ExitCode != 0 { + if wait.Receipt.ExitCode.IsError() { fmt.Fprintln(cctx.App.Writer, "Worker change failed!") return err } @@ -1170,7 +1170,7 @@ var actorCompactAllocatedCmd = &cli.Command{ } // check it executed successfully - if wait.Receipt.ExitCode != 0 { + if wait.Receipt.ExitCode.IsError() { fmt.Println("Propose owner change failed!") return err } diff --git a/cmd/lotus-miner/proving.go b/cmd/lotus-miner/proving.go index 496e94c50..1774a8e00 100644 --- a/cmd/lotus-miner/proving.go +++ b/cmd/lotus-miner/proving.go @@ -707,7 +707,7 @@ var provingRecoverFaultsCmd = &cli.Command{ return } - if wait.Receipt.ExitCode != 0 { + if wait.Receipt.ExitCode.IsError() { results <- xerrors.Errorf("Failed to execute message %s: %w", wait.Message, wait.Receipt.ExitCode.Error()) return } diff --git a/cmd/lotus-miner/sectors.go b/cmd/lotus-miner/sectors.go index b35c38fd4..c6adc85b5 100644 --- a/cmd/lotus-miner/sectors.go +++ b/cmd/lotus-miner/sectors.go @@ -2195,7 +2195,7 @@ var sectorsCompactPartitionsCmd = &cli.Command{ } // check it executed successfully - if wait.Receipt.ExitCode != 0 { + if wait.Receipt.ExitCode.IsError() { fmt.Println(cctx.App.Writer, "compact partitions failed!") return err } diff --git a/cmd/lotus-shed/actor.go b/cmd/lotus-shed/actor.go index 53cb5e1ec..d91c6de93 100644 --- a/cmd/lotus-shed/actor.go +++ b/cmd/lotus-shed/actor.go @@ -144,7 +144,7 @@ var actorWithdrawCmd = &cli.Command{ } // check it executed successfully - if wait.Receipt.ExitCode != 0 { + if wait.Receipt.ExitCode.IsError() { fmt.Println(cctx.App.Writer, "withdrawal failed!") return err } @@ -279,7 +279,7 @@ var actorSetOwnerCmd = &cli.Command{ } // check it executed successfully - if wait.Receipt.ExitCode != 0 { + if wait.Receipt.ExitCode.IsError() { fmt.Println("owner change failed!") return err } @@ -647,7 +647,7 @@ var actorProposeChangeWorker = &cli.Command{ } // check it executed successfully - if wait.Receipt.ExitCode != 0 { + if wait.Receipt.ExitCode.IsError() { fmt.Fprintln(cctx.App.Writer, "Propose worker change failed!") return err } @@ -768,7 +768,7 @@ var actorConfirmChangeWorker = &cli.Command{ } // check it executed successfully - if wait.Receipt.ExitCode != 0 { + if wait.Receipt.ExitCode.IsError() { fmt.Fprintln(cctx.App.Writer, "Worker change failed!") return err } diff --git a/cmd/lotus-shed/miner-multisig.go b/cmd/lotus-shed/miner-multisig.go index aba08113f..d58c634b0 100644 --- a/cmd/lotus-shed/miner-multisig.go +++ b/cmd/lotus-shed/miner-multisig.go @@ -101,7 +101,7 @@ var mmProposeWithdrawBalance = &cli.Command{ } // check it executed successfully - if wait.Receipt.ExitCode != 0 { + if wait.Receipt.ExitCode.IsError() { fmt.Fprintln(cctx.App.Writer, "Propose owner change tx failed!") return err } @@ -180,7 +180,7 @@ var mmApproveWithdrawBalance = &cli.Command{ } // check it executed successfully - if wait.Receipt.ExitCode != 0 { + if wait.Receipt.ExitCode.IsError() { fmt.Fprintln(cctx.App.Writer, "Approve owner change tx failed!") return err } @@ -261,7 +261,7 @@ var mmProposeChangeOwner = &cli.Command{ } // check it executed successfully - if wait.Receipt.ExitCode != 0 { + if wait.Receipt.ExitCode.IsError() { fmt.Fprintln(cctx.App.Writer, "Propose owner change tx failed!") return err } @@ -351,7 +351,7 @@ var mmApproveChangeOwner = &cli.Command{ } // check it executed successfully - if wait.Receipt.ExitCode != 0 { + if wait.Receipt.ExitCode.IsError() { fmt.Fprintln(cctx.App.Writer, "Approve owner change tx failed!") return err } @@ -448,7 +448,7 @@ var mmProposeChangeWorker = &cli.Command{ } // check it executed successfully - if wait.Receipt.ExitCode != 0 { + if wait.Receipt.ExitCode.IsError() { fmt.Fprintln(cctx.App.Writer, "Propose worker change tx failed!") return err } @@ -532,7 +532,7 @@ var mmConfirmChangeWorker = &cli.Command{ } // check it executed successfully - if wait.Receipt.ExitCode != 0 { + if wait.Receipt.ExitCode.IsError() { fmt.Fprintln(cctx.App.Writer, "Propose worker change tx failed!") return err } @@ -647,7 +647,7 @@ var mmProposeControlSet = &cli.Command{ } // check it executed successfully - if wait.Receipt.ExitCode != 0 { + if wait.Receipt.ExitCode.IsError() { fmt.Fprintln(cctx.App.Writer, "Propose worker change tx failed!") return err } diff --git a/cmd/lotus-shed/miner.go b/cmd/lotus-shed/miner.go index 0d925336d..9be1b7fdc 100644 --- a/cmd/lotus-shed/miner.go +++ b/cmd/lotus-shed/miner.go @@ -475,7 +475,7 @@ var sendInvalidWindowPoStCmd = &cli.Command{ } // check it executed successfully - if wait.Receipt.ExitCode != 0 { + if wait.Receipt.ExitCode.IsError() { fmt.Println(cctx.App.Writer, "Invalid PoST message failed!") return err } @@ -574,7 +574,7 @@ var generateAndSendConsensusFaultCmd = &cli.Command{ } // check it executed successfully - if wait.Receipt.ExitCode != 0 { + if wait.Receipt.ExitCode.IsError() { fmt.Println(cctx.App.Writer, "Report consensus fault failed!") return err } diff --git a/cmd/lotus-shed/sectors.go b/cmd/lotus-shed/sectors.go index 8fa7803d3..891110859 100644 --- a/cmd/lotus-shed/sectors.go +++ b/cmd/lotus-shed/sectors.go @@ -171,7 +171,7 @@ var terminateSectorCmd = &cli.Command{ return err } - if wait.Receipt.ExitCode != 0 { + if wait.Receipt.ExitCode.IsError() { return fmt.Errorf("terminate sectors message returned exit %d", wait.Receipt.ExitCode) } diff --git a/cmd/lotus-shed/verifreg.go b/cmd/lotus-shed/verifreg.go index 97392b2f0..c04dfa94c 100644 --- a/cmd/lotus-shed/verifreg.go +++ b/cmd/lotus-shed/verifreg.go @@ -104,7 +104,7 @@ var verifRegAddVerifierFromMsigCmd = &cli.Command{ return err } - if mwait.Receipt.ExitCode != 0 { + if mwait.Receipt.ExitCode.IsError() { return fmt.Errorf("failed to add verifier: %d", mwait.Receipt.ExitCode) } @@ -170,7 +170,7 @@ var verifRegAddVerifierFromAccountCmd = &cli.Command{ return err } - if mwait.Receipt.ExitCode != 0 { + if mwait.Receipt.ExitCode.IsError() { return fmt.Errorf("failed to add verified client: %d", mwait.Receipt.ExitCode) } @@ -246,7 +246,7 @@ var verifRegVerifyClientCmd = &cli.Command{ return err } - if mwait.Receipt.ExitCode != 0 { + if mwait.Receipt.ExitCode.IsError() { return fmt.Errorf("failed to add verified client: %d", mwait.Receipt.ExitCode) } @@ -555,7 +555,7 @@ var verifRegRemoveVerifiedClientDataCapCmd = &cli.Command{ return err } - if mwait.Receipt.ExitCode != 0 { + if mwait.Receipt.ExitCode.IsError() { return fmt.Errorf("failed to removed verified data cap: %d", mwait.Receipt.ExitCode) } diff --git a/paychmgr/simple.go b/paychmgr/simple.go index 6b2aee2aa..6d6b78a71 100644 --- a/paychmgr/simple.go +++ b/paychmgr/simple.go @@ -537,7 +537,7 @@ func (ca *channelAccessor) waitPaychCreateMsg(ctx context.Context, channelID str } // If channel creation failed - if mwait.Receipt.ExitCode != 0 { + if mwait.Receipt.ExitCode.IsError() { ca.lk.Lock() defer ca.lk.Unlock() @@ -651,7 +651,7 @@ func (ca *channelAccessor) waitAddFundsMsg(ctx context.Context, channelID string return err } - if mwait.Receipt.ExitCode != 0 { + if mwait.Receipt.ExitCode.IsError() { err := xerrors.Errorf("voucher channel creation failed: adding funds (exit code %d)", mwait.Receipt.ExitCode) log.Error(err) From 4f75e2041c13cdd8be8bdcd790449c2ec7f0091f Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 14 Sep 2022 15:38:15 -0400 Subject: [PATCH 130/185] Add helper function to print usage when wrong number of arguments are supplied --- cli/backup.go | 2 +- cli/chain.go | 6 +++--- cli/client.go | 8 ++++---- cli/client_retr.go | 6 +++--- cli/filplus.go | 4 ++-- cli/helper.go | 4 ++++ cli/mpool.go | 2 +- cli/multisig.go | 26 +++++++++++++------------- cli/net.go | 2 +- cli/paych.go | 22 +++++++++++----------- cli/send.go | 2 +- cli/state.go | 7 +++---- cmd/lotus-miner/actor.go | 2 +- cmd/lotus-miner/dagstore.go | 8 ++++---- cmd/lotus-miner/index_provider.go | 2 +- cmd/lotus-miner/init_restore.go | 2 +- cmd/lotus-miner/market.go | 6 +++--- cmd/lotus-miner/proving.go | 8 ++++---- cmd/lotus-miner/sealing.go | 4 ++-- cmd/lotus-miner/sectors.go | 16 ++++++++-------- cmd/lotus-shed/actor.go | 2 +- cmd/lotus-shed/chain.go | 2 +- cmd/lotus-shed/datastore.go | 7 ++++--- cmd/lotus-shed/diff.go | 2 +- cmd/lotus-shed/export-car.go | 2 +- cmd/lotus-shed/ledger.go | 2 +- cmd/lotus-shed/migrations.go | 3 ++- cmd/lotus-shed/miner-multisig.go | 4 ++-- cmd/lotus-shed/miner-peerid.go | 3 ++- cmd/lotus-shed/miner.go | 7 ++++--- cmd/lotus-shed/msg.go | 2 +- cmd/lotus-shed/proofs.go | 4 +++- cmd/lotus-shed/rpc.go | 2 +- cmd/lotus-shed/sectors.go | 4 ++-- cmd/lotus-shed/send-csv.go | 2 +- cmd/lotus-shed/signatures.go | 4 ++-- cmd/lotus-shed/sync.go | 8 ++------ cmd/lotus-shed/terminations.go | 3 ++- cmd/lotus-shed/verifreg.go | 8 ++++---- 39 files changed, 108 insertions(+), 102 deletions(-) diff --git a/cli/backup.go b/cli/backup.go index 3cb44718f..83234a423 100644 --- a/cli/backup.go +++ b/cli/backup.go @@ -115,7 +115,7 @@ this command must be within this base path`, ArgsUsage: "[backup file path]", Action: func(cctx *cli.Context) error { if cctx.NArg() != 1 { - return xerrors.Errorf("expected 1 argument") + return IncorrectNumArgs(cctx) } if cctx.Bool("offline") { diff --git a/cli/chain.go b/cli/chain.go index 80df5655b..814aebeed 100644 --- a/cli/chain.go +++ b/cli/chain.go @@ -947,7 +947,7 @@ var ChainBisectCmd = &cli.Command{ ctx := ReqContext(cctx) if cctx.NArg() < 4 { - return xerrors.New("need at least 4 args") + return IncorrectNumArgs(cctx) } start, err := strconv.ParseUint(cctx.Args().Get(0), 10, 64) @@ -1313,7 +1313,7 @@ var chainDecodeParamsCmd = &cli.Command{ ctx := ReqContext(cctx) if cctx.NArg() != 3 { - return ShowHelp(cctx, fmt.Errorf("incorrect number of arguments")) + return IncorrectNumArgs(cctx) } to, err := address.NewFromString(cctx.Args().First()) @@ -1392,7 +1392,7 @@ var chainEncodeParamsCmd = &cli.Command{ afmt := NewAppFmt(cctx.App) if cctx.NArg() != 3 { - return ShowHelp(cctx, fmt.Errorf("incorrect number of arguments")) + return IncorrectNumArgs(cctx) } method, err := strconv.ParseInt(cctx.Args().Get(1), 10, 64) diff --git a/cli/client.go b/cli/client.go index 577a8e840..377505363 100644 --- a/cli/client.go +++ b/cli/client.go @@ -130,7 +130,7 @@ var clientImportCmd = &cli.Command{ ctx := ReqContext(cctx) if cctx.NArg() != 1 { - return xerrors.New("expected input path as the only arg") + return IncorrectNumArgs(cctx) } absPath, err := filepath.Abs(cctx.Args().First()) @@ -213,7 +213,7 @@ var clientCommPCmd = &cli.Command{ ctx := ReqContext(cctx) if cctx.NArg() != 1 { - return fmt.Errorf("usage: commP ") + return IncorrectNumArgs(cctx) } ret, err := api.ClientCalcCommP(ctx, cctx.Args().Get(0)) @@ -246,7 +246,7 @@ var clientCarGenCmd = &cli.Command{ ctx := ReqContext(cctx) if cctx.NArg() != 2 { - return fmt.Errorf("usage: generate-car ") + return IncorrectNumArgs(cctx) } ref := lapi.FileRef{ @@ -376,7 +376,7 @@ The minimum value is 518400 (6 months).`, afmt := NewAppFmt(cctx.App) if cctx.NArg() != 4 { - return xerrors.New(expectedArgsMsg) + return IncorrectNumArgs(cctx) } // [data, miner, price, dur] diff --git a/cli/client_retr.go b/cli/client_retr.go index f32e5d4e4..3fe656f15 100644 --- a/cli/client_retr.go +++ b/cli/client_retr.go @@ -289,7 +289,7 @@ Examples: }, retrFlagsCommon...), Action: func(cctx *cli.Context) error { if cctx.NArg() != 2 { - return ShowHelp(cctx, fmt.Errorf("incorrect number of arguments")) + return IncorrectNumArgs(cctx) } if cctx.Bool("car-export-merkle-proof") { @@ -405,7 +405,7 @@ var clientRetrieveCatCmd = &cli.Command{ }, retrFlagsCommon...), Action: func(cctx *cli.Context) error { if cctx.NArg() != 1 { - return ShowHelp(cctx, fmt.Errorf("incorrect number of arguments")) + return IncorrectNumArgs(cctx) } ainfo, err := GetAPIInfo(cctx, repo.FullNode) @@ -484,7 +484,7 @@ var clientRetrieveLsCmd = &cli.Command{ }, retrFlagsCommon...), Action: func(cctx *cli.Context) error { if cctx.NArg() != 1 { - return ShowHelp(cctx, fmt.Errorf("incorrect number of arguments")) + return IncorrectNumArgs(cctx) } ainfo, err := GetAPIInfo(cctx, repo.FullNode) diff --git a/cli/filplus.go b/cli/filplus.go index 5e19e5b04..d74171dd6 100644 --- a/cli/filplus.go +++ b/cli/filplus.go @@ -62,7 +62,7 @@ var filplusVerifyClientCmd = &cli.Command{ } if cctx.NArg() != 2 { - return fmt.Errorf("must specify two arguments: address and allowance") + return IncorrectNumArgs(cctx) } target, err := address.NewFromString(cctx.Args().Get(0)) @@ -290,7 +290,7 @@ var filplusSignRemoveDataCapProposal = &cli.Command{ }, Action: func(cctx *cli.Context) error { if cctx.NArg() != 3 { - return fmt.Errorf("must specify three arguments: notary address, client address, and allowance to remove") + return IncorrectNumArgs(cctx) } api, closer, err := GetFullNodeAPI(cctx) diff --git a/cli/helper.go b/cli/helper.go index da236bcae..c4a61397c 100644 --- a/cli/helper.go +++ b/cli/helper.go @@ -31,6 +31,10 @@ func ShowHelp(cctx *ufcli.Context, err error) error { return &PrintHelpErr{Err: err, Ctx: cctx} } +func IncorrectNumArgs(cctx *ufcli.Context) error { + return ShowHelp(cctx, fmt.Errorf("incorrect number of arguments, got %d", cctx.NArg())) +} + func RunApp(app *ufcli.App) { if err := app.Run(os.Args); err != nil { if os.Getenv("LOTUS_DEV") != "" { diff --git a/cli/mpool.go b/cli/mpool.go index c8003092d..e098806cb 100644 --- a/cli/mpool.go +++ b/cli/mpool.go @@ -611,7 +611,7 @@ var MpoolConfig = &cli.Command{ ArgsUsage: "[new-config]", Action: func(cctx *cli.Context) error { if cctx.NArg() > 1 { - return cli.ShowCommandHelp(cctx, cctx.Command.Name) + return IncorrectNumArgs(cctx) } afmt := NewAppFmt(cctx.App) diff --git a/cli/multisig.go b/cli/multisig.go index dc468a2cd..1dd7d01b8 100644 --- a/cli/multisig.go +++ b/cli/multisig.go @@ -89,7 +89,7 @@ var msigCreateCmd = &cli.Command{ }, Action: func(cctx *cli.Context) error { if cctx.NArg() < 1 { - return ShowHelp(cctx, fmt.Errorf("multisigs must have at least one signer")) + return IncorrectNumArgs(cctx) } srv, err := GetFullNodeServices(cctx) @@ -754,7 +754,7 @@ var msigRemoveProposeCmd = &cli.Command{ }, Action: func(cctx *cli.Context) error { if cctx.NArg() != 2 { - return ShowHelp(cctx, fmt.Errorf("must pass multisig address and signer address")) + return IncorrectNumArgs(cctx) } srv, err := GetFullNodeServices(cctx) @@ -841,7 +841,7 @@ var msigAddProposeCmd = &cli.Command{ }, Action: func(cctx *cli.Context) error { if cctx.NArg() != 2 { - return ShowHelp(cctx, fmt.Errorf("must pass multisig address and signer address")) + return IncorrectNumArgs(cctx) } srv, err := GetFullNodeServices(cctx) @@ -950,7 +950,7 @@ var msigAddApproveCmd = &cli.Command{ }, Action: func(cctx *cli.Context) error { if cctx.NArg() != 5 { - return ShowHelp(cctx, fmt.Errorf("must pass multisig address, proposer address, transaction id, new signer address, whether to increase threshold")) + return IncorrectNumArgs(cctx) } srv, err := GetFullNodeServices(cctx) @@ -1041,7 +1041,7 @@ var msigAddCancelCmd = &cli.Command{ }, Action: func(cctx *cli.Context) error { if cctx.NArg() != 4 { - return ShowHelp(cctx, fmt.Errorf("must pass multisig address, transaction id, new signer address, whether to increase threshold")) + return IncorrectNumArgs(cctx) } srv, err := GetFullNodeServices(cctx) @@ -1127,7 +1127,7 @@ var msigSwapProposeCmd = &cli.Command{ }, Action: func(cctx *cli.Context) error { if cctx.NArg() != 3 { - return ShowHelp(cctx, fmt.Errorf("must pass multisig address, old signer address, new signer address")) + return IncorrectNumArgs(cctx) } srv, err := GetFullNodeServices(cctx) @@ -1208,7 +1208,7 @@ var msigSwapApproveCmd = &cli.Command{ }, Action: func(cctx *cli.Context) error { if cctx.NArg() != 5 { - return ShowHelp(cctx, fmt.Errorf("must pass multisig address, proposer address, transaction id, old signer address, new signer address")) + return IncorrectNumArgs(cctx) } srv, err := GetFullNodeServices(cctx) @@ -1299,7 +1299,7 @@ var msigSwapCancelCmd = &cli.Command{ }, Action: func(cctx *cli.Context) error { if cctx.NArg() != 4 { - return ShowHelp(cctx, fmt.Errorf("must pass multisig address, transaction id, old signer address, new signer address")) + return IncorrectNumArgs(cctx) } srv, err := GetFullNodeServices(cctx) @@ -1385,7 +1385,7 @@ var msigLockProposeCmd = &cli.Command{ }, Action: func(cctx *cli.Context) error { if cctx.NArg() != 4 { - return ShowHelp(cctx, fmt.Errorf("must pass multisig address, start epoch, unlock duration, and amount")) + return IncorrectNumArgs(cctx) } srv, err := GetFullNodeServices(cctx) @@ -1481,7 +1481,7 @@ var msigLockApproveCmd = &cli.Command{ }, Action: func(cctx *cli.Context) error { if cctx.NArg() != 6 { - return ShowHelp(cctx, fmt.Errorf("must pass multisig address, proposer address, tx id, start epoch, unlock duration, and amount")) + return IncorrectNumArgs(cctx) } srv, err := GetFullNodeServices(cctx) @@ -1587,7 +1587,7 @@ var msigLockCancelCmd = &cli.Command{ }, Action: func(cctx *cli.Context) error { if cctx.NArg() != 5 { - return ShowHelp(cctx, fmt.Errorf("must pass multisig address, tx id, start epoch, unlock duration, and amount")) + return IncorrectNumArgs(cctx) } srv, err := GetFullNodeServices(cctx) @@ -1694,7 +1694,7 @@ var msigVestedCmd = &cli.Command{ }, Action: func(cctx *cli.Context) error { if cctx.NArg() != 1 { - return ShowHelp(cctx, fmt.Errorf("must pass multisig address")) + return IncorrectNumArgs(cctx) } api, closer, err := GetFullNodeAPI(cctx) @@ -1750,7 +1750,7 @@ var msigProposeThresholdCmd = &cli.Command{ }, Action: func(cctx *cli.Context) error { if cctx.NArg() != 2 { - return ShowHelp(cctx, fmt.Errorf("must pass multisig address and new threshold value")) + return IncorrectNumArgs(cctx) } srv, err := GetFullNodeServices(cctx) diff --git a/cli/net.go b/cli/net.go index c1ca1ce18..b0615e0b1 100644 --- a/cli/net.go +++ b/cli/net.go @@ -142,7 +142,7 @@ var NetPing = &cli.Command{ }, Action: func(cctx *cli.Context) error { if cctx.NArg() != 1 { - return xerrors.Errorf("please provide a peerID") + return IncorrectNumArgs(cctx) } api, closer, err := GetAPI(cctx) diff --git a/cli/paych.go b/cli/paych.go index 09d4fcb11..1067d0913 100644 --- a/cli/paych.go +++ b/cli/paych.go @@ -51,7 +51,7 @@ var paychAddFundsCmd = &cli.Command{ }, Action: func(cctx *cli.Context) error { if cctx.NArg() != 3 { - return ShowHelp(cctx, fmt.Errorf("must pass three arguments: ")) + return IncorrectNumArgs(cctx) } from, err := address.NewFromString(cctx.Args().Get(0)) @@ -113,7 +113,7 @@ var paychStatusByFromToCmd = &cli.Command{ ArgsUsage: "[fromAddress toAddress]", Action: func(cctx *cli.Context) error { if cctx.NArg() != 2 { - return ShowHelp(cctx, fmt.Errorf("must pass two arguments: ")) + return IncorrectNumArgs(cctx) } ctx := ReqContext(cctx) @@ -149,7 +149,7 @@ var paychStatusCmd = &cli.Command{ ArgsUsage: "[channelAddress]", Action: func(cctx *cli.Context) error { if cctx.NArg() != 1 { - return ShowHelp(cctx, fmt.Errorf("must pass an argument: ")) + return IncorrectNumArgs(cctx) } ctx := ReqContext(cctx) @@ -261,7 +261,7 @@ var paychSettleCmd = &cli.Command{ ArgsUsage: "[channelAddress]", Action: func(cctx *cli.Context) error { if cctx.NArg() != 1 { - return fmt.Errorf("must pass payment channel address") + return IncorrectNumArgs(cctx) } ch, err := address.NewFromString(cctx.Args().Get(0)) @@ -301,7 +301,7 @@ var paychCloseCmd = &cli.Command{ ArgsUsage: "[channelAddress]", Action: func(cctx *cli.Context) error { if cctx.NArg() != 1 { - return fmt.Errorf("must pass payment channel address") + return IncorrectNumArgs(cctx) } ch, err := address.NewFromString(cctx.Args().Get(0)) @@ -361,7 +361,7 @@ var paychVoucherCreateCmd = &cli.Command{ }, Action: func(cctx *cli.Context) error { if cctx.NArg() != 2 { - return ShowHelp(cctx, fmt.Errorf("must pass two arguments: ")) + return IncorrectNumArgs(cctx) } ch, err := address.NewFromString(cctx.Args().Get(0)) @@ -409,7 +409,7 @@ var paychVoucherCheckCmd = &cli.Command{ ArgsUsage: "[channelAddress voucher]", Action: func(cctx *cli.Context) error { if cctx.NArg() != 2 { - return ShowHelp(cctx, fmt.Errorf("must pass payment channel address and voucher to validate")) + return IncorrectNumArgs(cctx) } ch, err := address.NewFromString(cctx.Args().Get(0)) @@ -445,7 +445,7 @@ var paychVoucherAddCmd = &cli.Command{ ArgsUsage: "[channelAddress voucher]", Action: func(cctx *cli.Context) error { if cctx.NArg() != 2 { - return ShowHelp(cctx, fmt.Errorf("must pass payment channel address and voucher")) + return IncorrectNumArgs(cctx) } ch, err := address.NewFromString(cctx.Args().Get(0)) @@ -487,7 +487,7 @@ var paychVoucherListCmd = &cli.Command{ }, Action: func(cctx *cli.Context) error { if cctx.NArg() != 1 { - return ShowHelp(cctx, fmt.Errorf("must pass payment channel address")) + return IncorrectNumArgs(cctx) } ch, err := address.NewFromString(cctx.Args().Get(0)) @@ -532,7 +532,7 @@ var paychVoucherBestSpendableCmd = &cli.Command{ }, Action: func(cctx *cli.Context) error { if cctx.NArg() != 1 { - return ShowHelp(cctx, fmt.Errorf("must pass payment channel address")) + return IncorrectNumArgs(cctx) } ch, err := address.NewFromString(cctx.Args().Get(0)) @@ -603,7 +603,7 @@ var paychVoucherSubmitCmd = &cli.Command{ ArgsUsage: "[channelAddress voucher]", Action: func(cctx *cli.Context) error { if cctx.NArg() != 2 { - return ShowHelp(cctx, fmt.Errorf("must pass payment channel address and voucher")) + return IncorrectNumArgs(cctx) } ch, err := address.NewFromString(cctx.Args().Get(0)) diff --git a/cli/send.go b/cli/send.go index b2471e7cd..4268f8eb2 100644 --- a/cli/send.go +++ b/cli/send.go @@ -68,7 +68,7 @@ var sendCmd = &cli.Command{ } if cctx.NArg() != 2 { - return ShowHelp(cctx, fmt.Errorf("'send' expects two arguments, target and amount")) + return IncorrectNumArgs(cctx) } srv, err := GetFullNodeServices(cctx) diff --git a/cli/state.go b/cli/state.go index e4afc6915..a7e195b1c 100644 --- a/cli/state.go +++ b/cli/state.go @@ -505,8 +505,7 @@ var StateReplayCmd = &cli.Command{ }, Action: func(cctx *cli.Context) error { if cctx.NArg() != 1 { - fmt.Println("must provide cid of message to replay") - return nil + return IncorrectNumArgs(cctx) } mcid, err := cid.Decode(cctx.Args().First()) @@ -1581,7 +1580,7 @@ var StateCallCmd = &cli.Command{ }, Action: func(cctx *cli.Context) error { if cctx.NArg() < 2 { - return fmt.Errorf("must specify at least actor and method to invoke") + return ShowHelp(cctx, fmt.Errorf("must specify at least actor and method to invoke")) } api, closer, err := GetFullNodeAPI(cctx) @@ -1744,7 +1743,7 @@ var StateSectorCmd = &cli.Command{ ctx := ReqContext(cctx) if cctx.NArg() != 2 { - return xerrors.Errorf("expected 2 params: minerAddress and sectorNumber") + return IncorrectNumArgs(cctx) } ts, err := LoadTipSet(ctx, cctx, api) diff --git a/cmd/lotus-miner/actor.go b/cmd/lotus-miner/actor.go index c06711170..aad110414 100644 --- a/cmd/lotus-miner/actor.go +++ b/cmd/lotus-miner/actor.go @@ -729,7 +729,7 @@ var actorSetOwnerCmd = &cli.Command{ } if cctx.NArg() != 2 { - return fmt.Errorf("must pass new owner address and sender address") + return lcli.IncorrectNumArgs(cctx) } api, acloser, err := lcli.GetFullNodeAPI(cctx) diff --git a/cmd/lotus-miner/dagstore.go b/cmd/lotus-miner/dagstore.go index 37d048825..519b43cc7 100644 --- a/cmd/lotus-miner/dagstore.go +++ b/cmd/lotus-miner/dagstore.go @@ -77,7 +77,7 @@ var dagstoreRegisterShardCmd = &cli.Command{ } if cctx.NArg() != 1 { - return fmt.Errorf("must provide a single shard key") + return lcli.IncorrectNumArgs(cctx) } marketsAPI, closer, err := lcli.GetMarketsAPI(cctx) @@ -116,7 +116,7 @@ var dagstoreInitializeShardCmd = &cli.Command{ } if cctx.NArg() != 1 { - return fmt.Errorf("must provide a single shard key") + return lcli.IncorrectNumArgs(cctx) } marketsApi, closer, err := lcli.GetMarketsAPI(cctx) @@ -148,7 +148,7 @@ var dagstoreRecoverShardCmd = &cli.Command{ } if cctx.NArg() != 1 { - return fmt.Errorf("must provide a single shard key") + return lcli.IncorrectNumArgs(cctx) } marketsApi, closer, err := lcli.GetMarketsAPI(cctx) @@ -330,7 +330,7 @@ var dagstoreLookupPiecesCmd = &cli.Command{ } if cctx.NArg() != 1 { - return fmt.Errorf("must provide a CID") + return lcli.IncorrectNumArgs(cctx) } cidStr := cctx.Args().First() diff --git a/cmd/lotus-miner/index_provider.go b/cmd/lotus-miner/index_provider.go index 1e4b69d86..4ed14549d 100644 --- a/cmd/lotus-miner/index_provider.go +++ b/cmd/lotus-miner/index_provider.go @@ -36,7 +36,7 @@ var indexProvAnnounceCmd = &cli.Command{ } if cctx.NArg() != 1 { - return fmt.Errorf("must provide the deal proposal CID") + return lcli.IncorrectNumArgs(cctx) } proposalCidStr := cctx.Args().First() diff --git a/cmd/lotus-miner/init_restore.go b/cmd/lotus-miner/init_restore.go index 9d7f977b6..3d179f3ba 100644 --- a/cmd/lotus-miner/init_restore.go +++ b/cmd/lotus-miner/init_restore.go @@ -97,7 +97,7 @@ var restoreCmd = &cli.Command{ func restore(ctx context.Context, cctx *cli.Context, targetPath string, strConfig *paths.StorageConfig, manageConfig func(*config.StorageMiner) error, after func(api lapi.FullNode, addr address.Address, peerid peer.ID, mi api.MinerInfo) error) error { if cctx.NArg() != 1 { - return xerrors.Errorf("expected 1 argument") + return lcli.IncorrectNumArgs(cctx) } log.Info("Trying to connect to full node RPC") diff --git a/cmd/lotus-miner/market.go b/cmd/lotus-miner/market.go index 78b68214e..706e49236 100644 --- a/cmd/lotus-miner/market.go +++ b/cmd/lotus-miner/market.go @@ -370,8 +370,8 @@ var dealsImportDataCmd = &cli.Command{ ctx := lcli.DaemonContext(cctx) - if cctx.NArg() < 2 { - return fmt.Errorf("must specify proposal CID and file path") + if cctx.NArg() != 2 { + return lcli.IncorrectNumArgs(cctx) } propCid, err := cid.Decode(cctx.Args().Get(0)) @@ -618,7 +618,7 @@ var setSealDurationCmd = &cli.Command{ defer closer() ctx := lcli.ReqContext(cctx) if cctx.NArg() != 1 { - return xerrors.Errorf("must pass duration in minutes") + return lcli.IncorrectNumArgs(cctx) } hs, err := strconv.ParseUint(cctx.Args().Get(0), 10, 64) diff --git a/cmd/lotus-miner/proving.go b/cmd/lotus-miner/proving.go index 1774a8e00..6f6fd6635 100644 --- a/cmd/lotus-miner/proving.go +++ b/cmd/lotus-miner/proving.go @@ -315,7 +315,7 @@ var provingDeadlineInfoCmd = &cli.Command{ Action: func(cctx *cli.Context) error { if cctx.NArg() != 1 { - return xerrors.Errorf("must pass deadline index") + return lcli.IncorrectNumArgs(cctx) } dlIdx, err := strconv.ParseUint(cctx.Args().Get(0), 10, 64) @@ -462,7 +462,7 @@ var provingCheckProvableCmd = &cli.Command{ }, Action: func(cctx *cli.Context) error { if cctx.NArg() != 1 { - return xerrors.Errorf("must pass deadline index") + return lcli.IncorrectNumArgs(cctx) } dlIdx, err := strconv.ParseUint(cctx.Args().Get(0), 10, 64) @@ -617,7 +617,7 @@ It will not send any messages to the chain.`, ArgsUsage: "[deadline index]", Action: func(cctx *cli.Context) error { if cctx.NArg() != 1 { - return xerrors.Errorf("must pass deadline index") + return lcli.IncorrectNumArgs(cctx) } dlIdx, err := strconv.ParseUint(cctx.Args().Get(0), 10, 64) @@ -662,7 +662,7 @@ var provingRecoverFaultsCmd = &cli.Command{ }, Action: func(cctx *cli.Context) error { if cctx.NArg() < 1 { - return xerrors.Errorf("must pass at least 1 sector number") + return lcli.ShowHelp(cctx, xerrors.Errorf("must pass at least 1 sector number")) } arglist := cctx.Args().Slice() diff --git a/cmd/lotus-miner/sealing.go b/cmd/lotus-miner/sealing.go index adf3b9c2f..34c84772d 100644 --- a/cmd/lotus-miner/sealing.go +++ b/cmd/lotus-miner/sealing.go @@ -373,7 +373,7 @@ var sealingAbortCmd = &cli.Command{ }, Action: func(cctx *cli.Context) error { if cctx.NArg() != 1 { - return xerrors.Errorf("expected 1 argument") + return lcli.IncorrectNumArgs(cctx) } minerApi, closer, err := lcli.GetStorageMinerAPI(cctx) @@ -431,7 +431,7 @@ var sealingDataCidCmd = &cli.Command{ }, Action: func(cctx *cli.Context) error { if cctx.NArg() < 1 || cctx.NArg() > 2 { - return xerrors.Errorf("expected 1 or 2 arguments") + return lcli.ShowHelp(cctx, xerrors.Errorf("expected 1 or 2 arguments")) } minerApi, closer, err := lcli.GetStorageMinerAPI(cctx) diff --git a/cmd/lotus-miner/sectors.go b/cmd/lotus-miner/sectors.go index c6adc85b5..bcd60acf2 100644 --- a/cmd/lotus-miner/sectors.go +++ b/cmd/lotus-miner/sectors.go @@ -1379,7 +1379,7 @@ var sectorsTerminateCmd = &cli.Command{ defer closer() ctx := lcli.ReqContext(cctx) if cctx.NArg() != 1 { - return xerrors.Errorf("must pass sector number") + return lcli.IncorrectNumArgs(cctx) } id, err := strconv.ParseUint(cctx.Args().Get(0), 10, 64) @@ -1489,7 +1489,7 @@ var sectorsRemoveCmd = &cli.Command{ defer closer() ctx := lcli.ReqContext(cctx) if cctx.NArg() != 1 { - return xerrors.Errorf("must pass sector number") + return lcli.IncorrectNumArgs(cctx) } id, err := strconv.ParseUint(cctx.Args().Get(0), 10, 64) @@ -1507,7 +1507,7 @@ var sectorsSnapUpCmd = &cli.Command{ ArgsUsage: "", Action: func(cctx *cli.Context) error { if cctx.NArg() != 1 { - return lcli.ShowHelp(cctx, xerrors.Errorf("must pass sector number")) + return lcli.IncorrectNumArgs(cctx) } minerAPI, closer, err := lcli.GetStorageMinerAPI(cctx) @@ -1588,7 +1588,7 @@ var sectorsStartSealCmd = &cli.Command{ defer closer() ctx := lcli.ReqContext(cctx) if cctx.NArg() != 1 { - return xerrors.Errorf("must pass sector number") + return lcli.IncorrectNumArgs(cctx) } id, err := strconv.ParseUint(cctx.Args().Get(0), 10, 64) @@ -1612,7 +1612,7 @@ var sectorsSealDelayCmd = &cli.Command{ defer closer() ctx := lcli.ReqContext(cctx) if cctx.NArg() != 1 { - return xerrors.Errorf("must pass duration in minutes") + return lcli.IncorrectNumArgs(cctx) } hs, err := strconv.ParseUint(cctx.Args().Get(0), 10, 64) @@ -1715,7 +1715,7 @@ var sectorsUpdateCmd = &cli.Command{ defer closer() ctx := lcli.ReqContext(cctx) if cctx.NArg() < 2 { - return xerrors.Errorf("must pass sector number and new state") + return lcli.ShowHelp(cctx, xerrors.Errorf("must pass sector number and new state")) } id, err := strconv.ParseUint(cctx.Args().Get(0), 10, 64) @@ -2311,7 +2311,7 @@ var sectorsNumbersReserveCmd = &cli.Command{ ctx := lcli.ReqContext(cctx) if cctx.NArg() != 2 { - return xerrors.Errorf("expected 2 arguments: [reservation name] [reserved ranges]") + return lcli.IncorrectNumArgs(cctx) } bf, err := strle.HumanRangesToBitField(cctx.Args().Get(1)) @@ -2336,7 +2336,7 @@ var sectorsNumbersFreeCmd = &cli.Command{ ctx := lcli.ReqContext(cctx) if cctx.NArg() != 1 { - return xerrors.Errorf("expected 1 argument: [reservation name]") + return lcli.IncorrectNumArgs(cctx) } return minerAPI.SectorNumFree(ctx, cctx.Args().First()) diff --git a/cmd/lotus-shed/actor.go b/cmd/lotus-shed/actor.go index d91c6de93..9d1fd9d19 100644 --- a/cmd/lotus-shed/actor.go +++ b/cmd/lotus-shed/actor.go @@ -192,7 +192,7 @@ var actorSetOwnerCmd = &cli.Command{ } if cctx.NArg() != 2 { - return fmt.Errorf("must pass new owner address and sender address") + return lcli.IncorrectNumArgs(cctx) } var maddr address.Address diff --git a/cmd/lotus-shed/chain.go b/cmd/lotus-shed/chain.go index efbbd3b62..9eaa42795 100644 --- a/cmd/lotus-shed/chain.go +++ b/cmd/lotus-shed/chain.go @@ -56,7 +56,7 @@ var computeStateRangeCmd = &cli.Command{ ArgsUsage: "[START_TIPSET_REF] [END_TIPSET_REF]", Action: func(cctx *cli.Context) error { if cctx.NArg() != 2 { - return fmt.Errorf("expected two arguments: a start and an end tipset") + return lcli.IncorrectNumArgs(cctx) } api, closer, err := lcli.GetFullNodeAPI(cctx) diff --git a/cmd/lotus-shed/datastore.go b/cmd/lotus-shed/datastore.go index cd650d122..5614e34f6 100644 --- a/cmd/lotus-shed/datastore.go +++ b/cmd/lotus-shed/datastore.go @@ -20,6 +20,7 @@ import ( "go.uber.org/multierr" "golang.org/x/xerrors" + lcli "github.com/filecoin-project/lotus/cli" "github.com/filecoin-project/lotus/lib/backupds" "github.com/filecoin-project/lotus/node/repo" ) @@ -172,7 +173,7 @@ var datastoreBackupStatCmd = &cli.Command{ ArgsUsage: "[file]", Action: func(cctx *cli.Context) error { if cctx.NArg() != 1 { - return xerrors.Errorf("expected 1 argument") + return lcli.IncorrectNumArgs(cctx) } f, err := os.Open(cctx.Args().First()) @@ -221,7 +222,7 @@ var datastoreBackupListCmd = &cli.Command{ ArgsUsage: "[file]", Action: func(cctx *cli.Context) error { if cctx.NArg() != 1 { - return xerrors.Errorf("expected 1 argument") + return lcli.IncorrectNumArgs(cctx) } f, err := os.Open(cctx.Args().First()) @@ -308,7 +309,7 @@ var datastoreRewriteCmd = &cli.Command{ ArgsUsage: "source destination", Action: func(cctx *cli.Context) error { if cctx.NArg() != 2 { - return xerrors.Errorf("expected 2 arguments, got %d", cctx.NArg()) + return lcli.IncorrectNumArgs(cctx) } fromPath, err := homedir.Expand(cctx.Args().Get(0)) if err != nil { diff --git a/cmd/lotus-shed/diff.go b/cmd/lotus-shed/diff.go index 9fc6f7963..22b54981f 100644 --- a/cmd/lotus-shed/diff.go +++ b/cmd/lotus-shed/diff.go @@ -31,7 +31,7 @@ var diffStateTrees = &cli.Command{ ctx := lcli.ReqContext(cctx) if cctx.NArg() != 2 { - return xerrors.Errorf("expected two state-tree roots") + return lcli.IncorrectNumArgs(cctx) } argA := cctx.Args().Get(0) diff --git a/cmd/lotus-shed/export-car.go b/cmd/lotus-shed/export-car.go index b33b2b4ec..214b1d5df 100644 --- a/cmd/lotus-shed/export-car.go +++ b/cmd/lotus-shed/export-car.go @@ -39,7 +39,7 @@ var exportCarCmd = &cli.Command{ }, Action: func(cctx *cli.Context) error { if cctx.NArg() != 2 { - return lcli.ShowHelp(cctx, fmt.Errorf("must specify file name and object")) + return lcli.IncorrectNumArgs(cctx) } outfile := cctx.Args().First() diff --git a/cmd/lotus-shed/ledger.go b/cmd/lotus-shed/ledger.go index 20de8dd89..d9a888d20 100644 --- a/cmd/lotus-shed/ledger.go +++ b/cmd/lotus-shed/ledger.go @@ -300,7 +300,7 @@ var ledgerNewAddressesCmd = &cli.Command{ ctx := lcli.ReqContext(cctx) if cctx.NArg() != 1 { - return fmt.Errorf("must pass account index") + return lcli.IncorrectNumArgs(cctx) } index, err := strconv.ParseUint(cctx.Args().First(), 10, 32) diff --git a/cmd/lotus-shed/migrations.go b/cmd/lotus-shed/migrations.go index 2c75edd74..2e291c947 100644 --- a/cmd/lotus-shed/migrations.go +++ b/cmd/lotus-shed/migrations.go @@ -16,6 +16,7 @@ import ( "github.com/filecoin-project/lotus/chain/store" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/chain/vm" + lcli "github.com/filecoin-project/lotus/cli" "github.com/filecoin-project/lotus/node/repo" "github.com/filecoin-project/lotus/storage/sealer/ffiwrapper" ) @@ -34,7 +35,7 @@ var migrationsCmd = &cli.Command{ ctx := context.TODO() if cctx.NArg() != 1 { - return fmt.Errorf("must pass block cid") + return lcli.IncorrectNumArgs(cctx) } blkCid, err := cid.Decode(cctx.Args().First()) diff --git a/cmd/lotus-shed/miner-multisig.go b/cmd/lotus-shed/miner-multisig.go index d58c634b0..e4268a291 100644 --- a/cmd/lotus-shed/miner-multisig.go +++ b/cmd/lotus-shed/miner-multisig.go @@ -128,7 +128,7 @@ var mmApproveWithdrawBalance = &cli.Command{ ArgsUsage: "[amount txnId proposer]", Action: func(cctx *cli.Context) error { if cctx.NArg() != 3 { - return fmt.Errorf("must pass amount, txn Id, and proposer address") + return lcli.IncorrectNumArgs(cctx) } api, closer, err := lcli.GetFullNodeAPI(cctx) @@ -287,7 +287,7 @@ var mmApproveChangeOwner = &cli.Command{ ArgsUsage: "[newOwner txnId proposer]", Action: func(cctx *cli.Context) error { if cctx.NArg() != 3 { - return fmt.Errorf("must pass new owner address, txn Id, and proposer address") + return lcli.IncorrectNumArgs(cctx) } api, closer, err := lcli.GetFullNodeAPI(cctx) diff --git a/cmd/lotus-shed/miner-peerid.go b/cmd/lotus-shed/miner-peerid.go index 85f720a10..e43063797 100644 --- a/cmd/lotus-shed/miner-peerid.go +++ b/cmd/lotus-shed/miner-peerid.go @@ -20,6 +20,7 @@ import ( "github.com/filecoin-project/lotus/chain/state" "github.com/filecoin-project/lotus/chain/store" "github.com/filecoin-project/lotus/chain/types" + lcli "github.com/filecoin-project/lotus/cli" "github.com/filecoin-project/lotus/node/repo" ) @@ -35,7 +36,7 @@ var minerPeeridCmd = &cli.Command{ ctx := context.TODO() if cctx.NArg() != 2 { - return fmt.Errorf("must pass peer id and state root") + return lcli.IncorrectNumArgs(cctx) } pid, err := peer.Decode(cctx.Args().Get(0)) diff --git a/cmd/lotus-shed/miner.go b/cmd/lotus-shed/miner.go index 9be1b7fdc..348626fe1 100644 --- a/cmd/lotus-shed/miner.go +++ b/cmd/lotus-shed/miner.go @@ -136,7 +136,7 @@ var minerCreateCmd = &cli.Command{ ctx := lcli.ReqContext(cctx) if cctx.NArg() != 4 { - return xerrors.Errorf("expected 4 args (sender owner worker sectorSize)") + return lcli.IncorrectNumArgs(cctx) } sender, err := address.NewFromString(cctx.Args().First()) @@ -274,7 +274,7 @@ var minerUnpackInfoCmd = &cli.Command{ ArgsUsage: "[allinfo.txt] [dir]", Action: func(cctx *cli.Context) error { if cctx.NArg() != 2 { - return xerrors.Errorf("expected 2 args") + return lcli.IncorrectNumArgs(cctx) } src, err := homedir.Expand(cctx.Args().Get(0)) @@ -488,9 +488,10 @@ var generateAndSendConsensusFaultCmd = &cli.Command{ Name: "generate-and-send-consensus-fault", Usage: "Provided a block CID mined by the miner, will create another block at the same height, and send both block headers to generate a consensus fault.", Description: `Note: This is meant for testing purposes and should NOT be used on mainnet or you will be slashed`, + ArgsUsage: "blockCID", Action: func(cctx *cli.Context) error { if cctx.NArg() != 1 { - return xerrors.Errorf("expected 1 arg (blockCID)") + return lcli.IncorrectNumArgs(cctx) } blockCid, err := cid.Parse(cctx.Args().First()) diff --git a/cmd/lotus-shed/msg.go b/cmd/lotus-shed/msg.go index 34b260961..847b93d9f 100644 --- a/cmd/lotus-shed/msg.go +++ b/cmd/lotus-shed/msg.go @@ -28,7 +28,7 @@ var msgCmd = &cli.Command{ ArgsUsage: "Message in any form", Action: func(cctx *cli.Context) error { if cctx.NArg() != 1 { - return xerrors.Errorf("expected 1 argument") + return lcli.IncorrectNumArgs(cctx) } msg, err := messageFromString(cctx, cctx.Args().First()) diff --git a/cmd/lotus-shed/proofs.go b/cmd/lotus-shed/proofs.go index 752469778..1a16e2fdc 100644 --- a/cmd/lotus-shed/proofs.go +++ b/cmd/lotus-shed/proofs.go @@ -11,6 +11,8 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" prooftypes "github.com/filecoin-project/go-state-types/proof" + + lcli "github.com/filecoin-project/lotus/cli" ) var proofsCmd = &cli.Command{ @@ -43,7 +45,7 @@ var verifySealProofCmd = &cli.Command{ }, Action: func(cctx *cli.Context) error { if cctx.NArg() != 3 { - return fmt.Errorf("must specify commR, commD, and proof to verify") + return lcli.IncorrectNumArgs(cctx) } commr, err := cid.Decode(cctx.Args().Get(0)) diff --git a/cmd/lotus-shed/rpc.go b/cmd/lotus-shed/rpc.go index 82412e317..3be269358 100644 --- a/cmd/lotus-shed/rpc.go +++ b/cmd/lotus-shed/rpc.go @@ -113,7 +113,7 @@ var rpcCmd = &cli.Command{ if cctx.Args().Present() { if cctx.NArg() > 2 { - return xerrors.Errorf("expected 1 or 2 arguments: method [params]") + return lcli.ShowHelp(cctx, xerrors.Errorf("expected 1 or 2 arguments: method [params]")) } params := cctx.Args().Get(1) diff --git a/cmd/lotus-shed/sectors.go b/cmd/lotus-shed/sectors.go index 891110859..52d07f5b6 100644 --- a/cmd/lotus-shed/sectors.go +++ b/cmd/lotus-shed/sectors.go @@ -65,7 +65,7 @@ var terminateSectorCmd = &cli.Command{ }, Action: func(cctx *cli.Context) error { if cctx.NArg() < 1 { - return fmt.Errorf("at least one sector must be specified") + return lcli.ShowHelp(cctx, fmt.Errorf("at least one sector must be specified")) } var maddr address.Address @@ -201,7 +201,7 @@ var terminateSectorPenaltyEstimationCmd = &cli.Command{ }, Action: func(cctx *cli.Context) error { if cctx.NArg() < 1 { - return fmt.Errorf("at least one sector must be specified") + return lcli.ShowHelp(cctx, fmt.Errorf("at least one sector must be specified")) } var maddr address.Address diff --git a/cmd/lotus-shed/send-csv.go b/cmd/lotus-shed/send-csv.go index ce1c8b68a..17b62150f 100644 --- a/cmd/lotus-shed/send-csv.go +++ b/cmd/lotus-shed/send-csv.go @@ -34,7 +34,7 @@ var sendCsvCmd = &cli.Command{ ArgsUsage: "[csvfile]", Action: func(cctx *cli.Context) error { if cctx.NArg() != 1 { - return xerrors.New("must supply path to csv file") + return lcli.IncorrectNumArgs(cctx) } api, closer, err := lcli.GetFullNodeAPIV1(cctx) diff --git a/cmd/lotus-shed/signatures.go b/cmd/lotus-shed/signatures.go index d06ae56ea..536f8e82d 100644 --- a/cmd/lotus-shed/signatures.go +++ b/cmd/lotus-shed/signatures.go @@ -32,7 +32,7 @@ var sigsVerifyBlsMsgsCmd = &cli.Command{ Usage: "", Action: func(cctx *cli.Context) error { if cctx.NArg() != 1 { - return xerrors.Errorf("usage: ") + return lcli.IncorrectNumArgs(cctx) } api, closer, err := lcli.GetFullNodeAPI(cctx) @@ -102,7 +102,7 @@ var sigsVerifyVoteCmd = &cli.Command{ Action: func(cctx *cli.Context) error { if cctx.NArg() != 3 { - return xerrors.Errorf("usage: verify-vote ") + return lcli.IncorrectNumArgs(cctx) } fip, err := strconv.ParseInt(cctx.Args().First(), 10, 64) diff --git a/cmd/lotus-shed/sync.go b/cmd/lotus-shed/sync.go index 915ef38d0..eb11dea27 100644 --- a/cmd/lotus-shed/sync.go +++ b/cmd/lotus-shed/sync.go @@ -39,9 +39,7 @@ var syncValidateCmd = &cli.Command{ ctx := lcli.ReqContext(cctx) if cctx.NArg() < 1 { - fmt.Println("usage: ...") - fmt.Println("At least one block cid must be provided") - return nil + return lcli.ShowHelp(cctx, fmt.Errorf("at least one block cid must be provided")) } args := cctx.Args().Slice() @@ -91,9 +89,7 @@ var syncScrapePowerCmd = &cli.Command{ ctx := lcli.ReqContext(cctx) if cctx.NArg() < 1 { - fmt.Println("usage: ...") - fmt.Println("At least one block cid must be provided") - return nil + return lcli.ShowHelp(cctx, fmt.Errorf("at least one block cid must be provided")) } h, err := strconv.ParseInt(cctx.Args().Get(0), 10, 0) diff --git a/cmd/lotus-shed/terminations.go b/cmd/lotus-shed/terminations.go index 87855cec7..c5f35995a 100644 --- a/cmd/lotus-shed/terminations.go +++ b/cmd/lotus-shed/terminations.go @@ -23,6 +23,7 @@ import ( "github.com/filecoin-project/lotus/chain/state" "github.com/filecoin-project/lotus/chain/store" "github.com/filecoin-project/lotus/chain/types" + lcli "github.com/filecoin-project/lotus/cli" "github.com/filecoin-project/lotus/node/repo" ) @@ -40,7 +41,7 @@ var terminationsCmd = &cli.Command{ ctx := context.TODO() if cctx.NArg() != 2 { - return fmt.Errorf("must pass block cid && lookback period") + return lcli.IncorrectNumArgs(cctx) } blkCid, err := cid.Decode(cctx.Args().First()) diff --git a/cmd/lotus-shed/verifreg.go b/cmd/lotus-shed/verifreg.go index c04dfa94c..0fa905b5f 100644 --- a/cmd/lotus-shed/verifreg.go +++ b/cmd/lotus-shed/verifreg.go @@ -47,7 +47,7 @@ var verifRegAddVerifierFromMsigCmd = &cli.Command{ ArgsUsage: " ", Action: func(cctx *cli.Context) error { if cctx.NArg() != 3 { - return fmt.Errorf("must specify three arguments: sender, verifier, and allowance") + return lcli.IncorrectNumArgs(cctx) } sender, err := address.NewFromString(cctx.Args().Get(0)) @@ -120,7 +120,7 @@ var verifRegAddVerifierFromAccountCmd = &cli.Command{ ArgsUsage: " ", Action: func(cctx *cli.Context) error { if cctx.NArg() != 3 { - return fmt.Errorf("must specify three arguments: sender, verifier, and allowance") + return lcli.IncorrectNumArgs(cctx) } sender, err := address.NewFromString(cctx.Args().Get(0)) @@ -202,7 +202,7 @@ var verifRegVerifyClientCmd = &cli.Command{ } if cctx.NArg() != 2 { - return fmt.Errorf("must specify two arguments: address and allowance") + return lcli.IncorrectNumArgs(cctx) } target, err := address.NewFromString(cctx.Args().Get(0)) @@ -419,7 +419,7 @@ var verifRegRemoveVerifiedClientDataCapCmd = &cli.Command{ ArgsUsage: " ", Action: func(cctx *cli.Context) error { if cctx.NArg() != 7 { - return fmt.Errorf("must specify seven arguments: sender, client, allowance to remove, verifier 1 address, verifier 1 signature, verifier 2 address, verifier 2 signature") + return lcli.IncorrectNumArgs(cctx) } srv, err := lcli.GetFullNodeServices(cctx) From 84fd51ff50f6d1f641fa8a5a061683184415fdfa Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 14 Sep 2022 16:12:01 -0400 Subject: [PATCH 131/185] add cli commands for changing beneficiary --- cmd/lotus-miner/actor.go | 268 +++++++++++++++++++++++++++- cmd/lotus-shed/miner-multisig.go | 229 ++++++++++++++++++++++-- documentation/en/cli-lotus-miner.md | 52 ++++-- 3 files changed, 520 insertions(+), 29 deletions(-) diff --git a/cmd/lotus-miner/actor.go b/cmd/lotus-miner/actor.go index aad110414..b1f97d530 100644 --- a/cmd/lotus-miner/actor.go +++ b/cmd/lotus-miner/actor.go @@ -4,6 +4,7 @@ import ( "bytes" "fmt" "os" + "strconv" "strings" "github.com/fatih/color" @@ -20,7 +21,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-state-types/builtin" - "github.com/filecoin-project/go-state-types/builtin/v8/miner" + "github.com/filecoin-project/go-state-types/builtin/v9/miner" "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/lotus/api" @@ -48,6 +49,8 @@ var actorCmd = &cli.Command{ actorProposeChangeWorker, actorConfirmChangeWorker, actorCompactAllocatedCmd, + actorProposeChangeBeneficiary, + actorConfirmChangeBeneficiary, }, } @@ -906,8 +909,7 @@ var actorProposeChangeWorker = &cli.Command{ // check it executed successfully if wait.Receipt.ExitCode.IsError() { - fmt.Fprintln(cctx.App.Writer, "Propose worker change failed!") - return err + return fmt.Errorf("propose worker change failed") } mi, err = api.StateMinerInfo(ctx, maddr, wait.TipSet) @@ -925,6 +927,139 @@ var actorProposeChangeWorker = &cli.Command{ }, } +var actorProposeChangeBeneficiary = &cli.Command{ + Name: "propose-change-beneficiary", + Usage: "Propose a beneficiary address change", + ArgsUsage: "[beneficiaryAddress quota expiration]", + Flags: []cli.Flag{ + &cli.BoolFlag{ + Name: "really-do-it", + Usage: "Actually send transaction performing the action", + Value: false, + }, + &cli.BoolFlag{ + Name: "overwrite-pending-change", + Usage: "Overwrite the current beneficiary change proposal", + Value: false, + }, + &cli.StringFlag{ + Name: "actor", + Usage: "specify the address of miner actor", + }, + }, + Action: func(cctx *cli.Context) error { + if cctx.NArg() != 3 { + return lcli.IncorrectNumArgs(cctx) + } + + api, acloser, err := lcli.GetFullNodeAPI(cctx) + if err != nil { + return xerrors.Errorf("getting fullnode api: %w", err) + } + defer acloser() + + ctx := lcli.ReqContext(cctx) + + na, err := address.NewFromString(cctx.Args().Get(0)) + if err != nil { + return xerrors.Errorf("parsing beneficiary address: %w", err) + } + + newAddr, err := api.StateLookupID(ctx, na, types.EmptyTSK) + if err != nil { + return xerrors.Errorf("looking up new beneficiary address: %w", err) + } + + quota, err := types.ParseFIL(cctx.Args().Get(1)) + if err != nil { + return xerrors.Errorf("parsing quota: %w", err) + } + + expiration, err := strconv.ParseInt(cctx.Args().Get(2), 10, 64) + if err != nil { + return xerrors.Errorf("parsing expiration: %w", err) + } + + maddr, err := getActorAddress(ctx, cctx) + if err != nil { + return xerrors.Errorf("getting miner address: %w", err) + } + + mi, err := api.StateMinerInfo(ctx, maddr, types.EmptyTSK) + if err != nil { + return xerrors.Errorf("getting miner info: %w", err) + } + + if mi.Beneficiary == mi.Owner && newAddr == mi.Owner { + return fmt.Errorf("beneficiary %s already set to owner address", mi.Beneficiary) + } + + if mi.PendingBeneficiaryTerm != nil { + fmt.Println("WARNING: replacing Pending Beneficiary Term of:") + fmt.Println("Beneficiary: ", mi.PendingBeneficiaryTerm.NewBeneficiary) + fmt.Println("Quota:", mi.PendingBeneficiaryTerm.NewQuota) + fmt.Println("Expiration Epoch:", mi.PendingBeneficiaryTerm.NewExpiration) + + if !cctx.Bool("overwrite-pending-change") { + return fmt.Errorf("must pass --overwrite-pending-change to replace current pending beneficiary change. Please review CAREFULLY") + } + } + + if !cctx.Bool("really-do-it") { + fmt.Println("Pass --really-do-it to actually execute this action") + return nil + } + + params := &miner.ChangeBeneficiaryParams{ + NewBeneficiary: newAddr, + NewQuota: abi.TokenAmount(quota), + NewExpiration: abi.ChainEpoch(expiration), + } + + sp, err := actors.SerializeParams(params) + if err != nil { + return xerrors.Errorf("serializing params: %w", err) + } + + smsg, err := api.MpoolPushMessage(ctx, &types.Message{ + From: mi.Owner, + To: maddr, + Method: builtin.MethodsMiner.ChangeBeneficiary, + Value: big.Zero(), + Params: sp, + }, nil) + if err != nil { + return xerrors.Errorf("mpool push: %w", err) + } + + fmt.Println("Propose Message CID:", smsg.Cid()) + + // wait for it to get mined into a block + wait, err := api.StateWaitMsg(ctx, smsg.Cid(), build.MessageConfidence) + if err != nil { + return xerrors.Errorf("waiting for message to be included in block: %w", err) + } + + // check it executed successfully + if wait.Receipt.ExitCode.IsError() { + return fmt.Errorf("propose beneficiary change failed") + } + + updatedMinerInfo, err := api.StateMinerInfo(ctx, maddr, wait.TipSet) + if err != nil { + return xerrors.Errorf("getting miner info: %w", err) + } + + if updatedMinerInfo.PendingBeneficiaryTerm == nil { + fmt.Println("Beneficiary address successfully changed") + } else { + fmt.Println("Beneficiary address change awaiting additional confirmations") + } + + return nil + }, +} + var actorConfirmChangeWorker = &cli.Command{ Name: "confirm-change-worker", Usage: "Confirm a worker address change", @@ -988,7 +1123,7 @@ var actorConfirmChangeWorker = &cli.Command{ } if !cctx.Bool("really-do-it") { - fmt.Fprintln(cctx.App.Writer, "Pass --really-do-it to actually execute this action") + fmt.Println("Pass --really-do-it to actually execute this action") return nil } @@ -1002,7 +1137,7 @@ var actorConfirmChangeWorker = &cli.Command{ return xerrors.Errorf("mpool push: %w", err) } - fmt.Fprintln(cctx.App.Writer, "Confirm Message CID:", smsg.Cid()) + fmt.Println("Confirm Message CID:", smsg.Cid()) // wait for it to get mined into a block wait, err := api.StateWaitMsg(ctx, smsg.Cid(), build.MessageConfidence) @@ -1028,6 +1163,129 @@ var actorConfirmChangeWorker = &cli.Command{ }, } +var actorConfirmChangeBeneficiary = &cli.Command{ + Name: "confirm-change-beneficiary", + Usage: "Confirm a beneficiary address change", + ArgsUsage: "[minerAddress]", + Flags: []cli.Flag{ + &cli.BoolFlag{ + Name: "really-do-it", + Usage: "Actually send transaction performing the action", + Value: false, + }, + &cli.BoolFlag{ + Name: "existing-beneficiary", + Usage: "send confirmation from the existing beneficiary address", + }, + &cli.BoolFlag{ + Name: "new-beneficiary", + Usage: "send confirmation from the new beneficiary address", + }, + }, + Action: func(cctx *cli.Context) error { + if cctx.NArg() != 1 { + return lcli.IncorrectNumArgs(cctx) + } + + api, acloser, err := lcli.GetFullNodeAPI(cctx) + if err != nil { + return xerrors.Errorf("getting fullnode api: %w", err) + } + defer acloser() + + ctx := lcli.ReqContext(cctx) + + maddr, err := address.NewFromString(cctx.Args().First()) + if err != nil { + return xerrors.Errorf("parsing beneficiary address: %w", err) + } + + mi, err := api.StateMinerInfo(ctx, maddr, types.EmptyTSK) + if err != nil { + return xerrors.Errorf("getting miner info: %w", err) + } + + if mi.PendingBeneficiaryTerm == nil { + return fmt.Errorf("no pending beneficiary term found for miner %s", maddr) + } + + if (cctx.IsSet("existing-beneficiary") && cctx.IsSet("new-beneficiary")) || (!cctx.IsSet("existing-beneficiary") && !cctx.IsSet("new-beneficiary")) { + return lcli.ShowHelp(cctx, fmt.Errorf("must pass exactly one of --existing-beneficiary or --existing-beneficiary")) + } + + var fromAddr address.Address + if cctx.IsSet("existing-beneficiary") { + if mi.PendingBeneficiaryTerm.ApprovedByBeneficiary { + return fmt.Errorf("beneficiary change already approved by current beneficiary") + } + fromAddr = mi.Beneficiary + } else { + if mi.PendingBeneficiaryTerm.ApprovedByNominee { + return fmt.Errorf("beneficiary change already approved by new beneficiary") + } + fromAddr = mi.PendingBeneficiaryTerm.NewBeneficiary + } + + fmt.Println("Confirming Pending Beneficiary Term of:") + fmt.Println("Beneficiary: ", mi.PendingBeneficiaryTerm.NewBeneficiary) + fmt.Println("Quota:", mi.PendingBeneficiaryTerm.NewQuota) + fmt.Println("Expiration Epoch:", mi.PendingBeneficiaryTerm.NewExpiration) + + if !cctx.Bool("really-do-it") { + fmt.Println("Pass --really-do-it to actually execute this action") + return nil + } + + params := &miner.ChangeBeneficiaryParams{ + NewBeneficiary: mi.PendingBeneficiaryTerm.NewBeneficiary, + NewQuota: mi.PendingBeneficiaryTerm.NewQuota, + NewExpiration: mi.PendingBeneficiaryTerm.NewExpiration, + } + + sp, err := actors.SerializeParams(params) + if err != nil { + return xerrors.Errorf("serializing params: %w", err) + } + + smsg, err := api.MpoolPushMessage(ctx, &types.Message{ + From: fromAddr, + To: maddr, + Method: builtin.MethodsMiner.ChangeBeneficiary, + Value: big.Zero(), + Params: sp, + }, nil) + if err != nil { + return xerrors.Errorf("mpool push: %w", err) + } + + fmt.Println("Confirm Message CID:", smsg.Cid()) + + // wait for it to get mined into a block + wait, err := api.StateWaitMsg(ctx, smsg.Cid(), build.MessageConfidence) + if err != nil { + return xerrors.Errorf("waiting for message to be included in block: %w", err) + } + + // check it executed successfully + if wait.Receipt.ExitCode.IsError() { + return fmt.Errorf("confirm beneficiary change failed") + } + + updatedMinerInfo, err := api.StateMinerInfo(ctx, maddr, types.EmptyTSK) + if err != nil { + return err + } + + if updatedMinerInfo.PendingBeneficiaryTerm == nil { + fmt.Println("Beneficiary address successfully changed") + } else { + fmt.Println("Beneficiary address change awaiting additional confirmations") + } + + return nil + }, +} + var actorCompactAllocatedCmd = &cli.Command{ Name: "compact-allocated", Usage: "compact allocated sectors bitfield", diff --git a/cmd/lotus-shed/miner-multisig.go b/cmd/lotus-shed/miner-multisig.go index e4268a291..0ea29c50b 100644 --- a/cmd/lotus-shed/miner-multisig.go +++ b/cmd/lotus-shed/miner-multisig.go @@ -12,9 +12,8 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-state-types/builtin" - miner2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/miner" - miner5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/miner" - msig5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/multisig" + "github.com/filecoin-project/go-state-types/builtin/v9/miner" + "github.com/filecoin-project/go-state-types/builtin/v9/multisig" "github.com/filecoin-project/lotus/build" "github.com/filecoin-project/lotus/chain/actors" @@ -33,6 +32,8 @@ var minerMultisigsCmd = &cli.Command{ mmProposeChangeWorker, mmConfirmChangeWorker, mmProposeControlSet, + mmProposeChangeBeneficiary, + mmConfirmChangeBeneficiary, }, Flags: []cli.Flag{ &cli.StringFlag{ @@ -80,7 +81,7 @@ var mmProposeWithdrawBalance = &cli.Command{ return err } - sp, err := actors.SerializeParams(&miner5.WithdrawBalanceParams{ + sp, err := actors.SerializeParams(&miner.WithdrawBalanceParams{ AmountRequested: abi.TokenAmount(val), }) if err != nil { @@ -106,7 +107,7 @@ var mmProposeWithdrawBalance = &cli.Command{ return err } - var retval msig5.ProposeReturn + var retval multisig.ProposeReturn if err := retval.UnmarshalCBOR(bytes.NewReader(wait.Receipt.Return)); err != nil { return fmt.Errorf("failed to unmarshal propose return value: %w", err) } @@ -149,7 +150,7 @@ var mmApproveWithdrawBalance = &cli.Command{ return err } - sp, err := actors.SerializeParams(&miner5.WithdrawBalanceParams{ + sp, err := actors.SerializeParams(&miner.WithdrawBalanceParams{ AmountRequested: abi.TokenAmount(val), }) if err != nil { @@ -185,7 +186,7 @@ var mmApproveWithdrawBalance = &cli.Command{ return err } - var retval msig5.ApproveReturn + var retval multisig.ApproveReturn if err := retval.UnmarshalCBOR(bytes.NewReader(wait.Receipt.Return)); err != nil { return fmt.Errorf("failed to unmarshal approve return value: %w", err) } @@ -266,7 +267,7 @@ var mmProposeChangeOwner = &cli.Command{ return err } - var retval msig5.ProposeReturn + var retval multisig.ProposeReturn if err := retval.UnmarshalCBOR(bytes.NewReader(wait.Receipt.Return)); err != nil { return fmt.Errorf("failed to unmarshal propose return value: %w", err) } @@ -356,7 +357,7 @@ var mmApproveChangeOwner = &cli.Command{ return err } - var retval msig5.ApproveReturn + var retval multisig.ApproveReturn if err := retval.UnmarshalCBOR(bytes.NewReader(wait.Receipt.Return)); err != nil { return fmt.Errorf("failed to unmarshal approve return value: %w", err) } @@ -421,7 +422,7 @@ var mmProposeChangeWorker = &cli.Command{ } } - cwp := &miner2.ChangeWorkerAddressParams{ + cwp := &miner.ChangeWorkerAddressParams{ NewWorker: newAddr, NewControlAddrs: mi.ControlAddresses, } @@ -453,7 +454,7 @@ var mmProposeChangeWorker = &cli.Command{ return err } - var retval msig5.ProposeReturn + var retval multisig.ProposeReturn if err := retval.UnmarshalCBOR(bytes.NewReader(wait.Receipt.Return)); err != nil { return fmt.Errorf("failed to unmarshal propose return value: %w", err) } @@ -469,6 +470,114 @@ var mmProposeChangeWorker = &cli.Command{ }, } +var mmProposeChangeBeneficiary = &cli.Command{ + Name: "propose-change-beneficiary", + Usage: "Propose a beneficiary address change", + ArgsUsage: "[beneficiaryAddress quota expiration]", + Flags: []cli.Flag{ + &cli.BoolFlag{ + Name: "really-do-it", + Usage: "Actually send transaction performing the action", + Value: false, + }, + &cli.BoolFlag{ + Name: "overwrite-pending-change", + Usage: "Overwrite the current beneficiary change proposal", + Value: false, + }, + }, + Action: func(cctx *cli.Context) error { + if cctx.NArg() != 3 { + return lcli.IncorrectNumArgs(cctx) + } + + api, acloser, err := lcli.GetFullNodeAPI(cctx) + if err != nil { + return xerrors.Errorf("getting fullnode api: %w", err) + } + defer acloser() + + ctx := lcli.ReqContext(cctx) + + na, err := address.NewFromString(cctx.Args().Get(0)) + if err != nil { + return xerrors.Errorf("parsing beneficiary address: %w", err) + } + + newAddr, err := api.StateLookupID(ctx, na, types.EmptyTSK) + if err != nil { + return xerrors.Errorf("looking up new beneficiary address: %w", err) + } + + quota, err := types.ParseFIL(cctx.Args().Get(1)) + if err != nil { + return xerrors.Errorf("parsing quota: %w", err) + } + + expiration, err := types.BigFromString(cctx.Args().Get(2)) + if err != nil { + return xerrors.Errorf("parsing expiration: %w", err) + } + + multisigAddr, sender, minerAddr, err := getInputs(cctx) + if err != nil { + return err + } + + mi, err := api.StateMinerInfo(ctx, minerAddr, types.EmptyTSK) + if err != nil { + return err + } + + if mi.PendingBeneficiaryTerm != nil { + fmt.Println("WARNING: replacing Pending Beneficiary Term of:") + fmt.Println("Beneficiary: ", mi.PendingBeneficiaryTerm.NewBeneficiary) + fmt.Println("Quota:", mi.PendingBeneficiaryTerm.NewQuota) + fmt.Println("Expiration Epoch:", mi.PendingBeneficiaryTerm.NewExpiration) + + if !cctx.Bool("overwrite-pending-change") { + return fmt.Errorf("must pass --overwrite-pending-change to replace current pending beneficiary change. Please review CAREFULLY") + } + } + + if !cctx.Bool("really-do-it") { + fmt.Println("Pass --really-do-it to actually execute this action") + return nil + } + + params := &miner.ChangeBeneficiaryParams{ + NewBeneficiary: newAddr, + NewQuota: abi.TokenAmount(quota), + NewExpiration: abi.ChainEpoch(expiration.Int64()), + } + + sp, err := actors.SerializeParams(params) + if err != nil { + return xerrors.Errorf("serializing params: %w", err) + } + + pcid, err := api.MsigPropose(ctx, multisigAddr, minerAddr, big.Zero(), sender, uint64(builtin.MethodsMiner.ChangeBeneficiary), sp) + if err != nil { + return xerrors.Errorf("proposing message: %w", err) + } + + fmt.Println("Propose Message CID: ", pcid) + + // wait for it to get mined into a block + wait, err := api.StateWaitMsg(ctx, pcid, build.MessageConfidence) + if err != nil { + return xerrors.Errorf("waiting for message to be included in block: %w", err) + } + + // check it executed successfully + if wait.Receipt.ExitCode.IsError() { + return fmt.Errorf("propose beneficiary change failed") + } + + return nil + }, +} + var mmConfirmChangeWorker = &cli.Command{ Name: "confirm-change-worker", Usage: "Confirm an worker address change", @@ -537,7 +646,7 @@ var mmConfirmChangeWorker = &cli.Command{ return err } - var retval msig5.ProposeReturn + var retval multisig.ProposeReturn if err := retval.UnmarshalCBOR(bytes.NewReader(wait.Receipt.Return)); err != nil { return fmt.Errorf("failed to unmarshal propose return value: %w", err) } @@ -552,6 +661,98 @@ var mmConfirmChangeWorker = &cli.Command{ }, } +var mmConfirmChangeBeneficiary = &cli.Command{ + Name: "confirm-change-beneficiary", + Usage: "Confirm a beneficiary address change", + ArgsUsage: "[minerAddress]", + Flags: []cli.Flag{ + &cli.BoolFlag{ + Name: "really-do-it", + Usage: "Actually send transaction performing the action", + Value: false, + }, + }, + Action: func(cctx *cli.Context) error { + if cctx.NArg() != 1 { + return lcli.IncorrectNumArgs(cctx) + } + + api, acloser, err := lcli.GetFullNodeAPI(cctx) + if err != nil { + return xerrors.Errorf("getting fullnode api: %w", err) + } + defer acloser() + + ctx := lcli.ReqContext(cctx) + + multisigAddr, sender, minerAddr, err := getInputs(cctx) + if err != nil { + return err + } + + mi, err := api.StateMinerInfo(ctx, minerAddr, types.EmptyTSK) + if err != nil { + return err + } + + if mi.PendingBeneficiaryTerm == nil { + return fmt.Errorf("no pending beneficiary term found for miner %s", minerAddr) + } + + fmt.Println("Confirming Pending Beneficiary Term of:") + fmt.Println("Beneficiary: ", mi.PendingBeneficiaryTerm.NewBeneficiary) + fmt.Println("Quota:", mi.PendingBeneficiaryTerm.NewQuota) + fmt.Println("Expiration Epoch:", mi.PendingBeneficiaryTerm.NewExpiration) + + if !cctx.Bool("really-do-it") { + fmt.Println("Pass --really-do-it to actually execute this action") + return nil + } + + params := &miner.ChangeBeneficiaryParams{ + NewBeneficiary: mi.PendingBeneficiaryTerm.NewBeneficiary, + NewQuota: mi.PendingBeneficiaryTerm.NewQuota, + NewExpiration: mi.PendingBeneficiaryTerm.NewExpiration, + } + + sp, err := actors.SerializeParams(params) + if err != nil { + return xerrors.Errorf("serializing params: %w", err) + } + + pcid, err := api.MsigPropose(ctx, multisigAddr, minerAddr, big.Zero(), sender, uint64(builtin.MethodsMiner.ChangeBeneficiary), sp) + if err != nil { + return xerrors.Errorf("proposing message: %w", err) + } + + fmt.Println("Confirm Message CID:", pcid) + + // wait for it to get mined into a block + wait, err := api.StateWaitMsg(ctx, pcid, build.MessageConfidence) + if err != nil { + return xerrors.Errorf("waiting for message to be included in block: %w", err) + } + + // check it executed successfully + if wait.Receipt.ExitCode != 0 { + return fmt.Errorf("confirm beneficiary change failed") + } + + updatedMinerInfo, err := api.StateMinerInfo(ctx, minerAddr, types.EmptyTSK) + if err != nil { + return err + } + + if updatedMinerInfo.PendingBeneficiaryTerm == nil { + fmt.Println("Beneficiary address successfully changed") + } else { + fmt.Println("Beneficiary address change awaiting additional confirmations") + } + + return nil + }, +} + var mmProposeControlSet = &cli.Command{ Name: "propose-control-set", Usage: "Set control address(-es)", @@ -623,7 +824,7 @@ var mmProposeControlSet = &cli.Command{ } } - cwp := &miner2.ChangeWorkerAddressParams{ + cwp := &miner.ChangeWorkerAddressParams{ NewWorker: mi.Worker, NewControlAddrs: toSet, } @@ -652,7 +853,7 @@ var mmProposeControlSet = &cli.Command{ return err } - var retval msig5.ProposeReturn + var retval multisig.ProposeReturn if err := retval.UnmarshalCBOR(bytes.NewReader(wait.Receipt.Return)); err != nil { return fmt.Errorf("failed to unmarshal propose return value: %w", err) } diff --git a/documentation/en/cli-lotus-miner.md b/documentation/en/cli-lotus-miner.md index 235465aa2..322fe10de 100644 --- a/documentation/en/cli-lotus-miner.md +++ b/documentation/en/cli-lotus-miner.md @@ -231,16 +231,18 @@ USAGE: lotus-miner actor command [command options] [arguments...] COMMANDS: - set-addresses, set-addrs set addresses that your miner can be publicly dialed on - withdraw withdraw available balance to beneficiary - repay-debt pay down a miner's debt - set-peer-id set the peer id of your miner - set-owner Set owner address (this command should be invoked twice, first with the old owner as the senderAddress, and then with the new owner) - control Manage control addresses - propose-change-worker Propose a worker address change - confirm-change-worker Confirm a worker address change - compact-allocated compact allocated sectors bitfield - help, h Shows a list of commands or help for one command + set-addresses, set-addrs set addresses that your miner can be publicly dialed on + withdraw withdraw available balance to beneficiary + repay-debt pay down a miner's debt + set-peer-id set the peer id of your miner + set-owner Set owner address (this command should be invoked twice, first with the old owner as the senderAddress, and then with the new owner) + control Manage control addresses + propose-change-worker Propose a worker address change + confirm-change-worker Confirm a worker address change + compact-allocated compact allocated sectors bitfield + propose-change-beneficiary Propose a beneficiary address change + confirm-change-beneficiary Confirm a beneficiary address change + help, h Shows a list of commands or help for one command OPTIONS: --help, -h show help (default: false) @@ -390,6 +392,36 @@ OPTIONS: ``` +### lotus-miner actor propose-change-beneficiary +``` +NAME: + lotus-miner actor propose-change-beneficiary - Propose a beneficiary address change + +USAGE: + lotus-miner actor propose-change-beneficiary [command options] [beneficiaryAddress quota expiration] + +OPTIONS: + --actor value specify the address of miner actor + --overwrite-pending-change Overwrite the current beneficiary change proposal (default: false) + --really-do-it Actually send transaction performing the action (default: false) + +``` + +### lotus-miner actor confirm-change-beneficiary +``` +NAME: + lotus-miner actor confirm-change-beneficiary - Confirm a beneficiary address change + +USAGE: + lotus-miner actor confirm-change-beneficiary [command options] [minerAddress] + +OPTIONS: + --existing-beneficiary send confirmation from the existing beneficiary address (default: false) + --new-beneficiary send confirmation from the new beneficiary address (default: false) + --really-do-it Actually send transaction performing the action (default: false) + +``` + ## lotus-miner info ``` NAME: From 3c193287640eb9a9bb903e8541d4f7b474e0c277 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 14 Sep 2022 17:38:01 -0400 Subject: [PATCH 132/185] Review fixes --- cmd/lotus-miner/actor.go | 12 ++++++------ cmd/lotus-shed/miner-multisig.go | 10 +++++----- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/cmd/lotus-miner/actor.go b/cmd/lotus-miner/actor.go index b1f97d530..7b0e81c3b 100644 --- a/cmd/lotus-miner/actor.go +++ b/cmd/lotus-miner/actor.go @@ -1006,7 +1006,7 @@ var actorProposeChangeBeneficiary = &cli.Command{ } if !cctx.Bool("really-do-it") { - fmt.Println("Pass --really-do-it to actually execute this action") + fmt.Println("Pass --really-do-it to actually execute this action. Review what you're about to approve CAREFULLY please") return nil } @@ -1050,7 +1050,7 @@ var actorProposeChangeBeneficiary = &cli.Command{ return xerrors.Errorf("getting miner info: %w", err) } - if updatedMinerInfo.PendingBeneficiaryTerm == nil { + if updatedMinerInfo.PendingBeneficiaryTerm == nil && updatedMinerInfo.Beneficiary == newAddr { fmt.Println("Beneficiary address successfully changed") } else { fmt.Println("Beneficiary address change awaiting additional confirmations") @@ -1210,7 +1210,7 @@ var actorConfirmChangeBeneficiary = &cli.Command{ } if (cctx.IsSet("existing-beneficiary") && cctx.IsSet("new-beneficiary")) || (!cctx.IsSet("existing-beneficiary") && !cctx.IsSet("new-beneficiary")) { - return lcli.ShowHelp(cctx, fmt.Errorf("must pass exactly one of --existing-beneficiary or --existing-beneficiary")) + return lcli.ShowHelp(cctx, fmt.Errorf("must pass exactly one of --existing-beneficiary or --new-beneficiary")) } var fromAddr address.Address @@ -1232,7 +1232,7 @@ var actorConfirmChangeBeneficiary = &cli.Command{ fmt.Println("Expiration Epoch:", mi.PendingBeneficiaryTerm.NewExpiration) if !cctx.Bool("really-do-it") { - fmt.Println("Pass --really-do-it to actually execute this action") + fmt.Println("Pass --really-do-it to actually execute this action. Review what you're about to approve CAREFULLY please") return nil } @@ -1268,7 +1268,7 @@ var actorConfirmChangeBeneficiary = &cli.Command{ // check it executed successfully if wait.Receipt.ExitCode.IsError() { - return fmt.Errorf("confirm beneficiary change failed") + return fmt.Errorf("confirm beneficiary change failed with code %d", wait.Receipt.ExitCode) } updatedMinerInfo, err := api.StateMinerInfo(ctx, maddr, types.EmptyTSK) @@ -1276,7 +1276,7 @@ var actorConfirmChangeBeneficiary = &cli.Command{ return err } - if updatedMinerInfo.PendingBeneficiaryTerm == nil { + if updatedMinerInfo.PendingBeneficiaryTerm == nil && updatedMinerInfo.Beneficiary == mi.PendingBeneficiaryTerm.NewBeneficiary { fmt.Println("Beneficiary address successfully changed") } else { fmt.Println("Beneficiary address change awaiting additional confirmations") diff --git a/cmd/lotus-shed/miner-multisig.go b/cmd/lotus-shed/miner-multisig.go index 0ea29c50b..080229a6a 100644 --- a/cmd/lotus-shed/miner-multisig.go +++ b/cmd/lotus-shed/miner-multisig.go @@ -541,7 +541,7 @@ var mmProposeChangeBeneficiary = &cli.Command{ } if !cctx.Bool("really-do-it") { - fmt.Println("Pass --really-do-it to actually execute this action") + fmt.Println("Pass --really-do-it to actually execute this action. Review what you're about to approve CAREFULLY please") return nil } @@ -705,7 +705,7 @@ var mmConfirmChangeBeneficiary = &cli.Command{ fmt.Println("Expiration Epoch:", mi.PendingBeneficiaryTerm.NewExpiration) if !cctx.Bool("really-do-it") { - fmt.Println("Pass --really-do-it to actually execute this action") + fmt.Println("Pass --really-do-it to actually execute this action. Review what you're about to approve CAREFULLY please") return nil } @@ -734,8 +734,8 @@ var mmConfirmChangeBeneficiary = &cli.Command{ } // check it executed successfully - if wait.Receipt.ExitCode != 0 { - return fmt.Errorf("confirm beneficiary change failed") + if wait.Receipt.ExitCode.IsError() { + return fmt.Errorf("confirm beneficiary change failed with code %d", wait.Receipt.ExitCode) } updatedMinerInfo, err := api.StateMinerInfo(ctx, minerAddr, types.EmptyTSK) @@ -743,7 +743,7 @@ var mmConfirmChangeBeneficiary = &cli.Command{ return err } - if updatedMinerInfo.PendingBeneficiaryTerm == nil { + if updatedMinerInfo.PendingBeneficiaryTerm == nil && updatedMinerInfo.Beneficiary == mi.PendingBeneficiaryTerm.NewBeneficiary { fmt.Println("Beneficiary address successfully changed") } else { fmt.Println("Beneficiary address change awaiting additional confirmations") From 9d63e1412e6bbe52766a3a0fa8335c72fba4b020 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 14 Sep 2022 01:04:15 -0400 Subject: [PATCH 133/185] print beneficiary info in state miner-info and lotus-miner info --- cli/state.go | 16 ++++++++++++++++ cmd/lotus-miner/info.go | 17 +++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/cli/state.go b/cli/state.go index a7e195b1c..a0fc49f30 100644 --- a/cli/state.go +++ b/cli/state.go @@ -169,6 +169,22 @@ var StateMinerInfo = &cli.Command{ for i, controlAddress := range mi.ControlAddresses { fmt.Printf("Control %d: \t%s\n", i, controlAddress) } + if mi.Beneficiary != address.Undef { + fmt.Printf("Beneficiary:\t%s\n", mi.Beneficiary) + if mi.Beneficiary != mi.Owner { + fmt.Printf("Beneficiary Quota:\t%s\n", mi.BeneficiaryTerm.Quota) + fmt.Printf("Beneficiary Used Quota:\t%s\n", mi.BeneficiaryTerm.UsedQuota) + fmt.Printf("Beneficiary Expiration:\t%s\n", mi.BeneficiaryTerm.Expiration) + } + } + if mi.PendingBeneficiaryTerm != nil { + fmt.Printf("Pending Beneficiary Term:\n") + fmt.Printf("New Beneficiary:\t%s\n", mi.PendingBeneficiaryTerm.NewBeneficiary) + fmt.Printf("New Quota:\t%s\n", mi.PendingBeneficiaryTerm.NewQuota) + fmt.Printf("New Expiration:\t%s\n", mi.PendingBeneficiaryTerm.NewExpiration) + fmt.Printf("Approved By Beneficiary:\t%t\n", mi.PendingBeneficiaryTerm.ApprovedByBeneficiary) + fmt.Printf("Approved By Nominee:\t%t\n", mi.PendingBeneficiaryTerm.ApprovedByNominee) + } fmt.Printf("PeerID:\t%s\n", mi.PeerId) fmt.Printf("Multiaddrs:\t") diff --git a/cmd/lotus-miner/info.go b/cmd/lotus-miner/info.go index 408482a89..e8cbfd8b7 100644 --- a/cmd/lotus-miner/info.go +++ b/cmd/lotus-miner/info.go @@ -313,6 +313,23 @@ func handleMiningInfo(ctx context.Context, cctx *cli.Context, fullapi v1api.Full } colorTokenAmount("Total Spendable: %s\n", spendable) + if mi.Beneficiary != address.Undef { + fmt.Println() + fmt.Printf("Beneficiary:\t%s\n", mi.Beneficiary) + if mi.Beneficiary != mi.Owner { + fmt.Printf("Beneficiary Quota:\t%s\n", mi.BeneficiaryTerm.Quota) + fmt.Printf("Beneficiary Used Quota:\t%s\n", mi.BeneficiaryTerm.UsedQuota) + fmt.Printf("Beneficiary Expiration:\t%s\n", mi.BeneficiaryTerm.Expiration) + } + } + if mi.PendingBeneficiaryTerm != nil { + fmt.Printf("Pending Beneficiary Term:\n") + fmt.Printf("New Beneficiary:\t%s\n", mi.PendingBeneficiaryTerm.NewBeneficiary) + fmt.Printf("New Quota:\t%s\n", mi.PendingBeneficiaryTerm.NewQuota) + fmt.Printf("New Expiration:\t%s\n", mi.PendingBeneficiaryTerm.NewExpiration) + fmt.Printf("Approved By Beneficiary:\t%t\n", mi.PendingBeneficiaryTerm.ApprovedByBeneficiary) + fmt.Printf("Approved By Nominee:\t%t\n", mi.PendingBeneficiaryTerm.ApprovedByNominee) + } fmt.Println() if !cctx.Bool("hide-sectors-info") { From d2c726cd28a4d5ae2dbac48ce58d9e0a594b0a71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 14 Sep 2022 11:35:07 +0200 Subject: [PATCH 134/185] fix: sealing: Abort upgrades in sectors with no deals --- storage/pipeline/states_replica_update.go | 5 +++++ storage/pipeline/states_sealing.go | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/storage/pipeline/states_replica_update.go b/storage/pipeline/states_replica_update.go index ae90d2535..d0e896357 100644 --- a/storage/pipeline/states_replica_update.go +++ b/storage/pipeline/states_replica_update.go @@ -21,6 +21,11 @@ import ( ) func (m *Sealing) handleReplicaUpdate(ctx statemachine.Context, sector SectorInfo) error { + // if the sector ended up not having any deals, abort the upgrade + if !sector.hasDeals() { + return ctx.Send(SectorAbortUpgrade{xerrors.New("sector had no deals")}) + } + if err := checkPieces(ctx.Context(), m.maddr, sector, m.Api, true); err != nil { // Sanity check state return handleErrors(ctx, err, sector) } diff --git a/storage/pipeline/states_sealing.go b/storage/pipeline/states_sealing.go index c31c36335..f769341dd 100644 --- a/storage/pipeline/states_sealing.go +++ b/storage/pipeline/states_sealing.go @@ -49,6 +49,11 @@ func (m *Sealing) handlePacking(ctx statemachine.Context, sector SectorInfo) err delete(m.assignedPieces, m.minerSectorID(sector.SectorNumber)) m.inputLk.Unlock() + // if this is a snapdeals sector, but it ended up not having any deals, abort the upgrade + if sector.State == SnapDealsPacking && !sector.hasDeals() { + return ctx.Send(SectorAbortUpgrade{xerrors.New("sector had no deals")}) + } + log.Infow("performing filling up rest of the sector...", "sector", sector.SectorNumber) var allocated abi.UnpaddedPieceSize From 305cfa1f69b99f90f283c9c527126e2aed0ef21d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 14 Sep 2022 12:13:22 +0200 Subject: [PATCH 135/185] sealing: Pick safer minTarget in calcTargetExpiration --- storage/pipeline/input.go | 15 ++++++++++----- storage/pipeline/states_replica_update.go | 2 +- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/storage/pipeline/input.go b/storage/pipeline/input.go index c7af7783e..2f203a17b 100644 --- a/storage/pipeline/input.go +++ b/storage/pipeline/input.go @@ -396,7 +396,7 @@ func (m *Sealing) updateInput(ctx context.Context, sp abi.RegisteredSealProof) e e abi.ChainEpoch p abi.TokenAmount }) - expF := func(sn abi.SectorNumber) (abi.ChainEpoch, abi.TokenAmount, error) { + getExpirationCached := func(sn abi.SectorNumber) (abi.ChainEpoch, abi.TokenAmount, error) { if e, ok := memo[sn]; ok { return e.e, e.p, nil } @@ -440,13 +440,13 @@ func (m *Sealing) updateInput(ctx context.Context, sp abi.RegisteredSealProof) e avail := abi.PaddedPieceSize(ssize).Unpadded() - sector.used // check that sector lifetime is long enough to fit deal using latest expiration from on chain - ok, err := sector.dealFitsInLifetime(piece.deal.DealProposal.EndEpoch, expF) + ok, err := sector.dealFitsInLifetime(piece.deal.DealProposal.EndEpoch, getExpirationCached) if err != nil { log.Errorf("failed to check expiration for cc Update sector %d", sector.number) continue } if !ok { - exp, _, _ := expF(sector.number) + exp, _, _ := getExpirationCached(sector.number) log.Debugf("CC update sector %d cannot fit deal, expiration %d before deal end epoch %d", id, exp, piece.deal.DealProposal.EndEpoch) continue } @@ -513,7 +513,7 @@ func (m *Sealing) updateInput(ctx context.Context, sp abi.RegisteredSealProof) e if len(toAssign) > 0 { log.Errorf("we are trying to create a new sector with open sectors %v", m.openSectors) - if err := m.tryGetDealSector(ctx, sp, expF); err != nil { + if err := m.tryGetDealSector(ctx, sp, getExpirationCached); err != nil { log.Errorw("Failed to create a new sector for deals", "error", err) } } @@ -551,8 +551,13 @@ func (m *Sealing) calcTargetExpiration(ctx context.Context, ssize abi.SectorSize } minDur, maxDur := policy.DealDurationBounds(0) + minTarget = ts.Height() + minDur - return ts.Height() + minDur, ts.Height() + maxDur, nil + if len(candidates) > 0 && candidates[0].deal.DealProposal.EndEpoch > minTarget { + minTarget = candidates[0].deal.DealProposal.EndEpoch + } + + return minTarget, ts.Height() + maxDur, nil } func (m *Sealing) maybeUpgradeSector(ctx context.Context, sp abi.RegisteredSealProof, ef expFn) (bool, error) { diff --git a/storage/pipeline/states_replica_update.go b/storage/pipeline/states_replica_update.go index d0e896357..0261201f3 100644 --- a/storage/pipeline/states_replica_update.go +++ b/storage/pipeline/states_replica_update.go @@ -302,6 +302,6 @@ func handleErrors(ctx statemachine.Context, err error, sector SectorInfo) error case *ErrExpiredDeals: // Probably not much we can do here, maybe re-pack the sector? return ctx.Send(SectorDealsExpired{xerrors.Errorf("expired dealIDs in sector: %w", err)}) default: - return xerrors.Errorf("checkPieces sanity check error: %w", err) + return xerrors.Errorf("checkPieces sanity check error: %w (%+v)", err, err) } } From bf3daea12455149b40948d7d6b43b1e8496c0328 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 14 Sep 2022 12:45:22 +0200 Subject: [PATCH 136/185] sealing: Minimum upgrade sector expiration/target config --- .../en/default-lotus-miner-config.toml | 24 ++++++++++ node/config/doc_gen.go | 24 ++++++++++ node/config/types.go | 18 +++++++ node/modules/storageminer.go | 37 ++++++++------- storage/pipeline/input.go | 47 +++++++++++++------ storage/pipeline/sealiface/config.go | 4 ++ 6 files changed, 124 insertions(+), 30 deletions(-) diff --git a/documentation/en/default-lotus-miner-config.toml b/documentation/en/default-lotus-miner-config.toml index 46b21a91c..ae235e01e 100644 --- a/documentation/en/default-lotus-miner-config.toml +++ b/documentation/en/default-lotus-miner-config.toml @@ -442,6 +442,30 @@ # env var: LOTUS_SEALING_MAXUPGRADINGSECTORS #MaxUpgradingSectors = 0 + # When set to a non-zero value, minimum number of epochs until sector expiration required for sectors to be considered + # for upgrades (0 = DealMinDuration = 180 days = 518400 epochs) + # + # Note that if all deals waiting in the input queue have lifetimes longer than this value, upgrade sectors will be + # required to have expiration of at least the soonest-ending deal + # + # type: uint64 + # env var: LOTUS_SEALING_MINUPGRADESECTOREXPIRATION + #MinUpgradeSectorExpiration = 0 + + # When set to a non-zero value, minimum number of epochs until sector expiration above which upgrade candidates will + # be selected based on lowest initial pledge. + # + # Target sector expiration is calculated by looking at the input deal queue, sorting it by deal expiration, and + # selecting N deals from the queue up to sector size. The target expiration will be Nth deal end epoch, or in case + # where there weren't enough deals to fill a sector, DealMaxDuration (540 days = 1555200 epochs) + # + # Setting this to a high value (for example to maximum deal duration - 1555200) will disable selection based on + # initial pledge - upgrade sectors will always be chosen based on longest expiration + # + # type: uint64 + # env var: LOTUS_SEALING_MINTARGETUPGRADESECTOREXPIRATION + #MinTargetUpgradeSectorExpiration = 0 + # CommittedCapacitySectorLifetime is the duration a Committed Capacity (CC) sector will # live before it must be extended or converted into sector containing deals before it is # terminated. Value must be between 180-540 days inclusive diff --git a/node/config/doc_gen.go b/node/config/doc_gen.go index f317e0606..6b5927448 100644 --- a/node/config/doc_gen.go +++ b/node/config/doc_gen.go @@ -922,6 +922,30 @@ flow when the volume of storage deals is lower.`, Comment: `Upper bound on how many sectors can be sealing+upgrading at the same time when upgrading CC sectors with deals (0 = MaxSealingSectorsForDeals)`, }, + { + Name: "MinUpgradeSectorExpiration", + Type: "uint64", + + Comment: `When set to a non-zero value, minimum number of epochs until sector expiration required for sectors to be considered +for upgrades (0 = DealMinDuration = 180 days = 518400 epochs) + +Note that if all deals waiting in the input queue have lifetimes longer than this value, upgrade sectors will be +required to have expiration of at least the soonest-ending deal`, + }, + { + Name: "MinTargetUpgradeSectorExpiration", + Type: "uint64", + + Comment: `When set to a non-zero value, minimum number of epochs until sector expiration above which upgrade candidates will +be selected based on lowest initial pledge. + +Target sector expiration is calculated by looking at the input deal queue, sorting it by deal expiration, and +selecting N deals from the queue up to sector size. The target expiration will be Nth deal end epoch, or in case +where there weren't enough deals to fill a sector, DealMaxDuration (540 days = 1555200 epochs) + +Setting this to a high value (for example to maximum deal duration - 1555200) will disable selection based on +initial pledge - upgrade sectors will always be chosen based on longest expiration`, + }, { Name: "CommittedCapacitySectorLifetime", Type: "Duration", diff --git a/node/config/types.go b/node/config/types.go index dbea0ddb6..3c85587c3 100644 --- a/node/config/types.go +++ b/node/config/types.go @@ -319,6 +319,24 @@ type SealingConfig struct { // Upper bound on how many sectors can be sealing+upgrading at the same time when upgrading CC sectors with deals (0 = MaxSealingSectorsForDeals) MaxUpgradingSectors uint64 + // When set to a non-zero value, minimum number of epochs until sector expiration required for sectors to be considered + // for upgrades (0 = DealMinDuration = 180 days = 518400 epochs) + // + // Note that if all deals waiting in the input queue have lifetimes longer than this value, upgrade sectors will be + // required to have expiration of at least the soonest-ending deal + MinUpgradeSectorExpiration uint64 + + // When set to a non-zero value, minimum number of epochs until sector expiration above which upgrade candidates will + // be selected based on lowest initial pledge. + // + // Target sector expiration is calculated by looking at the input deal queue, sorting it by deal expiration, and + // selecting N deals from the queue up to sector size. The target expiration will be Nth deal end epoch, or in case + // where there weren't enough deals to fill a sector, DealMaxDuration (540 days = 1555200 epochs) + // + // Setting this to a high value (for example to maximum deal duration - 1555200) will disable selection based on + // initial pledge - upgrade sectors will always be chosen based on longest expiration + MinTargetUpgradeSectorExpiration uint64 + // CommittedCapacitySectorLifetime is the duration a Committed Capacity (CC) sector will // live before it must be extended or converted into sector containing deals before it is // terminated. Value must be between 180-540 days inclusive diff --git a/node/modules/storageminer.go b/node/modules/storageminer.go index 2ea733605..0d85cd168 100644 --- a/node/modules/storageminer.go +++ b/node/modules/storageminer.go @@ -983,17 +983,19 @@ func NewSetSealConfigFunc(r repo.LockedRepo) (dtypes.SetSealingConfigFunc, error return func(cfg sealiface.Config) (err error) { err = mutateSealingCfg(r, func(c config.SealingConfiger) { newCfg := config.SealingConfig{ - MaxWaitDealsSectors: cfg.MaxWaitDealsSectors, - MaxSealingSectors: cfg.MaxSealingSectors, - MaxSealingSectorsForDeals: cfg.MaxSealingSectorsForDeals, - PreferNewSectorsForDeals: cfg.PreferNewSectorsForDeals, - MaxUpgradingSectors: cfg.MaxUpgradingSectors, - CommittedCapacitySectorLifetime: config.Duration(cfg.CommittedCapacitySectorLifetime), - WaitDealsDelay: config.Duration(cfg.WaitDealsDelay), - MakeNewSectorForDeals: cfg.MakeNewSectorForDeals, - MakeCCSectorsAvailable: cfg.MakeCCSectorsAvailable, - AlwaysKeepUnsealedCopy: cfg.AlwaysKeepUnsealedCopy, - FinalizeEarly: cfg.FinalizeEarly, + MaxWaitDealsSectors: cfg.MaxWaitDealsSectors, + MaxSealingSectors: cfg.MaxSealingSectors, + MaxSealingSectorsForDeals: cfg.MaxSealingSectorsForDeals, + PreferNewSectorsForDeals: cfg.PreferNewSectorsForDeals, + MaxUpgradingSectors: cfg.MaxUpgradingSectors, + CommittedCapacitySectorLifetime: config.Duration(cfg.CommittedCapacitySectorLifetime), + WaitDealsDelay: config.Duration(cfg.WaitDealsDelay), + MakeNewSectorForDeals: cfg.MakeNewSectorForDeals, + MinUpgradeSectorExpiration: cfg.MinUpgradeSectorExpiration, + MinTargetUpgradeSectorExpiration: cfg.MinTargetUpgradeSectorExpiration, + MakeCCSectorsAvailable: cfg.MakeCCSectorsAvailable, + AlwaysKeepUnsealedCopy: cfg.AlwaysKeepUnsealedCopy, + FinalizeEarly: cfg.FinalizeEarly, CollateralFromMinerBalance: cfg.CollateralFromMinerBalance, AvailableBalanceBuffer: types.FIL(cfg.AvailableBalanceBuffer), @@ -1024,11 +1026,14 @@ func NewSetSealConfigFunc(r repo.LockedRepo) (dtypes.SetSealingConfigFunc, error func ToSealingConfig(dealmakingCfg config.DealmakingConfig, sealingCfg config.SealingConfig) sealiface.Config { return sealiface.Config{ - MaxWaitDealsSectors: sealingCfg.MaxWaitDealsSectors, - MaxSealingSectors: sealingCfg.MaxSealingSectors, - MaxSealingSectorsForDeals: sealingCfg.MaxSealingSectorsForDeals, - PreferNewSectorsForDeals: sealingCfg.PreferNewSectorsForDeals, - MaxUpgradingSectors: sealingCfg.MaxUpgradingSectors, + MaxWaitDealsSectors: sealingCfg.MaxWaitDealsSectors, + MaxSealingSectors: sealingCfg.MaxSealingSectors, + MaxSealingSectorsForDeals: sealingCfg.MaxSealingSectorsForDeals, + PreferNewSectorsForDeals: sealingCfg.PreferNewSectorsForDeals, + MinUpgradeSectorExpiration: sealingCfg.MinUpgradeSectorExpiration, + MinTargetUpgradeSectorExpiration: sealingCfg.MinTargetUpgradeSectorExpiration, + MaxUpgradingSectors: sealingCfg.MaxUpgradingSectors, + StartEpochSealingBuffer: abi.ChainEpoch(dealmakingCfg.StartEpochSealingBuffer), MakeNewSectorForDeals: sealingCfg.MakeNewSectorForDeals, CommittedCapacitySectorLifetime: time.Duration(sealingCfg.CommittedCapacitySectorLifetime), diff --git a/storage/pipeline/input.go b/storage/pipeline/input.go index 2f203a17b..e86f7b9a9 100644 --- a/storage/pipeline/input.go +++ b/storage/pipeline/input.go @@ -521,7 +521,7 @@ func (m *Sealing) updateInput(ctx context.Context, sp abi.RegisteredSealProof) e return nil } -func (m *Sealing) calcTargetExpiration(ctx context.Context, ssize abi.SectorSize) (minTarget, target abi.ChainEpoch, err error) { +func (m *Sealing) calcTargetExpiration(ctx context.Context, ssize abi.SectorSize, cfg sealiface.Config) (minExp, target abi.ChainEpoch, err error) { var candidates []*pendingPiece for _, piece := range m.pendingPieces { @@ -537,30 +537,49 @@ func (m *Sealing) calcTargetExpiration(ctx context.Context, ssize abi.SectorSize }) var totalBytes uint64 + var full bool + + // Find the expiration of the last deal which can fit into the sector, use that as the initial target for _, candidate := range candidates { totalBytes += uint64(candidate.size) + target = candidate.deal.DealProposal.EndEpoch if totalBytes >= uint64(abi.PaddedPieceSize(ssize).Unpadded()) { - return candidates[0].deal.DealProposal.EndEpoch, candidate.deal.DealProposal.EndEpoch, nil + full = true + break } } - ts, err := m.Api.ChainHead(ctx) - if err != nil { - return 0, 0, xerrors.Errorf("getting current epoch: %w", err) + // if the sector isn't full, use max deal duration as the target + if !full { + ts, err := m.Api.ChainHead(ctx) + if err != nil { + return 0, 0, xerrors.Errorf("getting current epoch: %w", err) + } + + minDur, maxDur := policy.DealDurationBounds(0) + minExp = ts.Height() + minDur + + target = maxDur } - minDur, maxDur := policy.DealDurationBounds(0) - minTarget = ts.Height() + minDur - - if len(candidates) > 0 && candidates[0].deal.DealProposal.EndEpoch > minTarget { - minTarget = candidates[0].deal.DealProposal.EndEpoch + // make sure that at least one deal in the queue is within the expiration + if len(candidates) > 0 && candidates[0].deal.DealProposal.EndEpoch > minExp { + minExp = candidates[0].deal.DealProposal.EndEpoch } - return minTarget, ts.Height() + maxDur, nil + // apply user minimums + if abi.ChainEpoch(cfg.MinUpgradeSectorExpiration) > minExp { + minExp = abi.ChainEpoch(cfg.MinUpgradeSectorExpiration) + } + if abi.ChainEpoch(cfg.MinTargetUpgradeSectorExpiration) > target { + target = abi.ChainEpoch(cfg.MinTargetUpgradeSectorExpiration) + } + + return minExp, target, nil } -func (m *Sealing) maybeUpgradeSector(ctx context.Context, sp abi.RegisteredSealProof, ef expFn) (bool, error) { +func (m *Sealing) maybeUpgradeSector(ctx context.Context, sp abi.RegisteredSealProof, cfg sealiface.Config, ef expFn) (bool, error) { if len(m.available) == 0 { return false, nil } @@ -569,7 +588,7 @@ func (m *Sealing) maybeUpgradeSector(ctx context.Context, sp abi.RegisteredSealP if err != nil { return false, xerrors.Errorf("getting sector size: %w", err) } - minExpiration, targetExpiration, err := m.calcTargetExpiration(ctx, ssize) + minExpiration, targetExpiration, err := m.calcTargetExpiration(ctx, ssize, cfg) if err != nil { return false, xerrors.Errorf("calculating min target expiration: %w", err) } @@ -687,7 +706,7 @@ func (m *Sealing) tryGetDealSector(ctx context.Context, sp abi.RegisteredSealPro "shouldUpgrade", shouldUpgrade) if shouldUpgrade { - got, err := m.maybeUpgradeSector(ctx, sp, ef) + got, err := m.maybeUpgradeSector(ctx, sp, cfg, ef) if err != nil { return err } diff --git a/storage/pipeline/sealiface/config.go b/storage/pipeline/sealiface/config.go index 0470db38e..2db155d5c 100644 --- a/storage/pipeline/sealiface/config.go +++ b/storage/pipeline/sealiface/config.go @@ -20,6 +20,10 @@ type Config struct { PreferNewSectorsForDeals bool + MinUpgradeSectorExpiration uint64 + + MinTargetUpgradeSectorExpiration uint64 + MaxUpgradingSectors uint64 MakeNewSectorForDeals bool From 609dad02a2d223a276c7fc56feb25b881f775d32 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Thu, 15 Sep 2022 10:42:44 -0400 Subject: [PATCH 137/185] actor-cids cli command now defaults to current network version instead of newest --- cli/state.go | 11 +++++++++-- documentation/en/cli-lotus.md | 2 +- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/cli/state.go b/cli/state.go index a0fc49f30..51c3b3911 100644 --- a/cli/state.go +++ b/cli/state.go @@ -1900,7 +1900,6 @@ var StateSysActorCIDsCmd = &cli.Command{ &cli.UintFlag{ Name: "network-version", Usage: "specify network version", - Value: uint(build.NewestNetworkVersion), }, }, Action: func(cctx *cli.Context) error { @@ -1916,7 +1915,15 @@ var StateSysActorCIDsCmd = &cli.Command{ ctx := ReqContext(cctx) - nv := network.Version(cctx.Uint64("network-version")) + var nv network.Version + if cctx.IsSet("network-version") { + nv = network.Version(cctx.Uint64("network-version")) + } else { + nv, err = api.StateNetworkVersion(ctx, types.EmptyTSK) + if err != nil { + return err + } + } fmt.Printf("Network Version: %d\n", nv) diff --git a/documentation/en/cli-lotus.md b/documentation/en/cli-lotus.md index 0a064be76..ad978fd4b 100644 --- a/documentation/en/cli-lotus.md +++ b/documentation/en/cli-lotus.md @@ -2029,7 +2029,7 @@ USAGE: lotus state actor-cids [command options] [arguments...] OPTIONS: - --network-version value specify network version (default: 17) + --network-version value specify network version (default: 0) ``` From 32ce8f0d9bea93db71e1da213e1dfa9df5f7d569 Mon Sep 17 00:00:00 2001 From: LexLuthr Date: Fri, 16 Sep 2022 11:37:12 +0530 Subject: [PATCH 138/185] display updated & update-cache for storage --- cmd/lotus-miner/storage.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/cmd/lotus-miner/storage.go b/cmd/lotus-miner/storage.go index 1200448b1..290d128e4 100644 --- a/cmd/lotus-miner/storage.go +++ b/cmd/lotus-miner/storage.go @@ -313,7 +313,7 @@ var storageListCmd = &cli.Command{ for _, s := range sorted { - var cnt [3]int + var cnt [5]int for _, decl := range s.sectors { for i := range cnt { if decl.SectorFileType&(1< Date: Fri, 16 Sep 2022 12:41:48 +0200 Subject: [PATCH 139/185] fix expiration config handling in calcTargetExpiration --- storage/pipeline/input.go | 50 +++++++++++++++++++-------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/storage/pipeline/input.go b/storage/pipeline/input.go index e86f7b9a9..e4ca53493 100644 --- a/storage/pipeline/input.go +++ b/storage/pipeline/input.go @@ -521,7 +521,7 @@ func (m *Sealing) updateInput(ctx context.Context, sp abi.RegisteredSealProof) e return nil } -func (m *Sealing) calcTargetExpiration(ctx context.Context, ssize abi.SectorSize, cfg sealiface.Config) (minExp, target abi.ChainEpoch, err error) { +func (m *Sealing) calcTargetExpiration(ctx context.Context, ssize abi.SectorSize, cfg sealiface.Config) (minExpEpoch, targetEpoch abi.ChainEpoch, err error) { var candidates []*pendingPiece for _, piece := range m.pendingPieces { @@ -542,7 +542,7 @@ func (m *Sealing) calcTargetExpiration(ctx context.Context, ssize abi.SectorSize // Find the expiration of the last deal which can fit into the sector, use that as the initial target for _, candidate := range candidates { totalBytes += uint64(candidate.size) - target = candidate.deal.DealProposal.EndEpoch + targetEpoch = candidate.deal.DealProposal.EndEpoch if totalBytes >= uint64(abi.PaddedPieceSize(ssize).Unpadded()) { full = true @@ -550,33 +550,33 @@ func (m *Sealing) calcTargetExpiration(ctx context.Context, ssize abi.SectorSize } } + ts, err := m.Api.ChainHead(ctx) + if err != nil { + return 0, 0, xerrors.Errorf("getting current epoch: %w", err) + } + // if the sector isn't full, use max deal duration as the target if !full { - ts, err := m.Api.ChainHead(ctx) - if err != nil { - return 0, 0, xerrors.Errorf("getting current epoch: %w", err) - } - minDur, maxDur := policy.DealDurationBounds(0) - minExp = ts.Height() + minDur - target = maxDur + minExpEpoch = ts.Height() + minDur + targetEpoch = ts.Height() + maxDur } // make sure that at least one deal in the queue is within the expiration - if len(candidates) > 0 && candidates[0].deal.DealProposal.EndEpoch > minExp { - minExp = candidates[0].deal.DealProposal.EndEpoch + if len(candidates) > 0 && candidates[0].deal.DealProposal.EndEpoch > minExpEpoch { + minExpEpoch = candidates[0].deal.DealProposal.EndEpoch } // apply user minimums - if abi.ChainEpoch(cfg.MinUpgradeSectorExpiration) > minExp { - minExp = abi.ChainEpoch(cfg.MinUpgradeSectorExpiration) + if abi.ChainEpoch(cfg.MinUpgradeSectorExpiration)+ts.Height() > minExpEpoch { + minExpEpoch = abi.ChainEpoch(cfg.MinUpgradeSectorExpiration) + ts.Height() } - if abi.ChainEpoch(cfg.MinTargetUpgradeSectorExpiration) > target { - target = abi.ChainEpoch(cfg.MinTargetUpgradeSectorExpiration) + if abi.ChainEpoch(cfg.MinTargetUpgradeSectorExpiration)+ts.Height() > targetEpoch { + targetEpoch = abi.ChainEpoch(cfg.MinTargetUpgradeSectorExpiration) + ts.Height() } - return minExp, target, nil + return minExpEpoch, targetEpoch, nil } func (m *Sealing) maybeUpgradeSector(ctx context.Context, sp abi.RegisteredSealProof, cfg sealiface.Config, ef expFn) (bool, error) { @@ -588,7 +588,7 @@ func (m *Sealing) maybeUpgradeSector(ctx context.Context, sp abi.RegisteredSealP if err != nil { return false, xerrors.Errorf("getting sector size: %w", err) } - minExpiration, targetExpiration, err := m.calcTargetExpiration(ctx, ssize, cfg) + minExpirationEpoch, targetExpirationEpoch, err := m.calcTargetExpiration(ctx, ssize, cfg) if err != nil { return false, xerrors.Errorf("calculating min target expiration: %w", err) } @@ -598,7 +598,7 @@ func (m *Sealing) maybeUpgradeSector(ctx context.Context, sp abi.RegisteredSealP bestPledge := types.TotalFilecoinInt for s := range m.available { - expiration, pledge, err := ef(s.Number) + expirationEpoch, pledge, err := ef(s.Number) if err != nil { log.Errorw("checking sector expiration", "error", err) continue @@ -620,24 +620,24 @@ func (m *Sealing) maybeUpgradeSector(ctx context.Context, sp abi.RegisteredSealP // if best is below target, we want larger expirations // if best is above target, we want lower pledge, but only if still above target - if bestExpiration < targetExpiration { - if expiration > bestExpiration && slowChecks(s.Number) { - bestExpiration = expiration + if bestExpiration < targetExpirationEpoch { + if expirationEpoch > bestExpiration && slowChecks(s.Number) { + bestExpiration = expirationEpoch bestPledge = pledge candidate = s } continue } - if expiration >= targetExpiration && pledge.LessThan(bestPledge) && slowChecks(s.Number) { - bestExpiration = expiration + if expirationEpoch >= targetExpirationEpoch && pledge.LessThan(bestPledge) && slowChecks(s.Number) { + bestExpiration = expirationEpoch bestPledge = pledge candidate = s } } - if bestExpiration < minExpiration { - log.Infow("Not upgrading any sectors", "available", len(m.available), "pieces", len(m.pendingPieces), "bestExp", bestExpiration, "target", targetExpiration, "min", minExpiration, "candidate", candidate) + if bestExpiration < minExpirationEpoch { + log.Infow("Not upgrading any sectors", "available", len(m.available), "pieces", len(m.pendingPieces), "bestExp", bestExpiration, "target", targetExpirationEpoch, "min", minExpirationEpoch, "candidate", candidate) // didn't find a good sector / no sectors were available return false, nil } From f1e4ecaaa3442457a5fffc3cd7e808d5f73d8de7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 16 Sep 2022 17:51:09 +0200 Subject: [PATCH 140/185] fix: Drop unused PreCommitInfo from pipeline.SectorInfo --- storage/pipeline/cbor_gen.go | 39 +------------------------------ storage/pipeline/fsm_events.go | 1 - storage/pipeline/states_failed.go | 5 ---- storage/pipeline/types.go | 2 -- 4 files changed, 1 insertion(+), 46 deletions(-) diff --git a/storage/pipeline/cbor_gen.go b/storage/pipeline/cbor_gen.go index fe7fa2d53..308508ce7 100644 --- a/storage/pipeline/cbor_gen.go +++ b/storage/pipeline/cbor_gen.go @@ -13,7 +13,6 @@ import ( xerrors "golang.org/x/xerrors" abi "github.com/filecoin-project/go-state-types/abi" - miner "github.com/filecoin-project/go-state-types/builtin/v9/miner" api "github.com/filecoin-project/lotus/api" ) @@ -154,7 +153,7 @@ func (t *SectorInfo) MarshalCBOR(w io.Writer) error { cw := cbg.NewCborWriter(w) - if _, err := cw.Write([]byte{184, 32}); err != nil { + if _, err := cw.Write([]byte{184, 31}); err != nil { return err } @@ -404,22 +403,6 @@ func (t *SectorInfo) MarshalCBOR(w io.Writer) error { return err } - // t.PreCommitInfo (miner.SectorPreCommitInfo) (struct) - if len("PreCommitInfo") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"PreCommitInfo\" was too long") - } - - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("PreCommitInfo"))); err != nil { - return err - } - if _, err := io.WriteString(w, string("PreCommitInfo")); err != nil { - return err - } - - if err := t.PreCommitInfo.MarshalCBOR(cw); err != nil { - return err - } - // t.PreCommitDeposit (big.Int) (struct) if len("PreCommitDeposit") > cbg.MaxLength { return xerrors.Errorf("Value in field \"PreCommitDeposit\" was too long") @@ -1128,26 +1111,6 @@ func (t *SectorInfo) UnmarshalCBOR(r io.Reader) (err error) { if _, err := io.ReadFull(cr, t.Proof[:]); err != nil { return err } - // t.PreCommitInfo (miner.SectorPreCommitInfo) (struct) - case "PreCommitInfo": - - { - - b, err := cr.ReadByte() - if err != nil { - return err - } - if b != cbg.CborNull[0] { - if err := cr.UnreadByte(); err != nil { - return err - } - t.PreCommitInfo = new(miner.SectorPreCommitInfo) - if err := t.PreCommitInfo.UnmarshalCBOR(cr); err != nil { - return xerrors.Errorf("unmarshaling t.PreCommitInfo pointer: %w", err) - } - } - - } // t.PreCommitDeposit (big.Int) (struct) case "PreCommitDeposit": diff --git a/storage/pipeline/fsm_events.go b/storage/pipeline/fsm_events.go index 8ddd529a6..4d41f9070 100644 --- a/storage/pipeline/fsm_events.go +++ b/storage/pipeline/fsm_events.go @@ -205,7 +205,6 @@ type SectorPreCommitted struct { func (evt SectorPreCommitted) apply(state *SectorInfo) { state.PreCommitMessage = &evt.Message state.PreCommitDeposit = evt.PreCommitDeposit - state.PreCommitInfo = &evt.PreCommitInfo } type SectorSeedReady struct { diff --git a/storage/pipeline/states_failed.go b/storage/pipeline/states_failed.go index 38f030333..09e090bc8 100644 --- a/storage/pipeline/states_failed.go +++ b/storage/pipeline/states_failed.go @@ -391,11 +391,6 @@ func (m *Sealing) handleDealsExpired(ctx statemachine.Context, sector SectorInfo return xerrors.Errorf("sector is committed on-chain, but we're in DealsExpired") } - if sector.PreCommitInfo == nil { - // TODO: Create a separate state which will remove those pieces, and go back to PC1 - log.Errorf("non-precommitted sector with expired deals, can't recover from this yet") - } - // Not much to do here, we can't go back in time to commit this sector return ctx.Send(SectorRemove{}) } diff --git a/storage/pipeline/types.go b/storage/pipeline/types.go index 0419aabc2..69e2b4ee0 100644 --- a/storage/pipeline/types.go +++ b/storage/pipeline/types.go @@ -7,7 +7,6 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" - "github.com/filecoin-project/go-state-types/builtin/v9/miner" "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/chain/types" @@ -74,7 +73,6 @@ type SectorInfo struct { CommR *cid.Cid // SectorKey Proof []byte - PreCommitInfo *miner.SectorPreCommitInfo PreCommitDeposit big.Int PreCommitMessage *cid.Cid PreCommitTipSet types.TipSetKey From 4382bbcc966440f4369a53a691f3c54f9d7e0772 Mon Sep 17 00:00:00 2001 From: Aayush Date: Fri, 16 Sep 2022 14:30:05 -0400 Subject: [PATCH 141/185] feat: add logs to markets event handler --- chain/events/events_called.go | 2 +- markets/storageadapter/ondealsectorcommitted.go | 8 ++++---- markets/storageadapter/ondealsectorcommitted_test.go | 6 +++--- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/chain/events/events_called.go b/chain/events/events_called.go index 7fc92e6a9..3ac02b2f7 100644 --- a/chain/events/events_called.go +++ b/chain/events/events_called.go @@ -554,7 +554,7 @@ func (me *messageEvents) Called(ctx context.Context, check CheckFunc, msgHnd Msg id, err := me.hcAPI.onHeadChanged(ctx, check, hnd, rev, confidence, timeout) if err != nil { - return err + return xerrors.Errorf("on head changed error: %w", err) } me.lk.Lock() diff --git a/markets/storageadapter/ondealsectorcommitted.go b/markets/storageadapter/ondealsectorcommitted.go index 3c3f28824..53171eaeb 100644 --- a/markets/storageadapter/ondealsectorcommitted.go +++ b/markets/storageadapter/ondealsectorcommitted.go @@ -72,7 +72,7 @@ func (mgr *SectorCommittedManager) OnDealSectorPreCommitted(ctx context.Context, // Note: the error returned from here will end up being returned // from OnDealSectorPreCommitted so no need to call the callback // with the error - return false, false, err + return false, false, xerrors.Errorf("failed to check deal activity: %w", err) } if isActive { @@ -89,7 +89,7 @@ func (mgr *SectorCommittedManager) OnDealSectorPreCommitted(ctx context.Context, diff, err := mgr.dpc.diffPreCommits(ctx, provider, dealInfo.PublishMsgTipSet, ts.Key()) if err != nil { - return false, false, err + return false, false, xerrors.Errorf("failed to diff precommits: %w", err) } for _, info := range diff.Added { @@ -139,7 +139,7 @@ func (mgr *SectorCommittedManager) OnDealSectorPreCommitted(ctx context.Context, // current deal ID from the publish message CID res, err := mgr.dealInfo.GetCurrentDealInfo(ctx, ts.Key(), &proposal, publishCid) if err != nil { - return false, err + return false, xerrors.Errorf("failed to get dealinfo: %w", err) } // If this is a replica update method that succeeded the deal is active @@ -159,7 +159,7 @@ func (mgr *SectorCommittedManager) OnDealSectorPreCommitted(ctx context.Context, // Extract the message parameters sn, err := dealSectorInPreCommitMsg(msg, res) if err != nil { - return false, err + return false, xerrors.Errorf("failed to extract message params: %w", err) } if sn != nil { diff --git a/markets/storageadapter/ondealsectorcommitted_test.go b/markets/storageadapter/ondealsectorcommitted_test.go index 2ed1d2f39..22367420a 100644 --- a/markets/storageadapter/ondealsectorcommitted_test.go +++ b/markets/storageadapter/ondealsectorcommitted_test.go @@ -145,7 +145,7 @@ func TestOnDealSectorPreCommitted(t *testing.T) { "error getting current deal info in check func": { currentDealInfoErr: errors.New("something went wrong"), expectedCBCallCount: 0, - expectedError: xerrors.Errorf("failed to set up called handler: failed to look up deal on chain: something went wrong"), + expectedError: xerrors.Errorf("failed to set up called handler: failed to check deal activity: failed to look up deal on chain: something went wrong"), }, "sector already active": { currentDealInfo: pipeline.CurrentDealInfo{ @@ -162,7 +162,7 @@ func TestOnDealSectorPreCommitted(t *testing.T) { PublishMsgTipSet: types.EmptyTSK, }, expectedCBCallCount: 0, - expectedError: xerrors.Errorf("failed to set up called handler: deal %d was slashed at epoch %d", dealID, slashedDeal.State.SlashEpoch), + expectedError: xerrors.Errorf("failed to set up called handler: failed to check deal activity: deal %d was slashed at epoch %d", dealID, slashedDeal.State.SlashEpoch), }, "error getting current deal info in called func": { currentDealInfo: pipeline.CurrentDealInfo{ @@ -180,7 +180,7 @@ func TestOnDealSectorPreCommitted(t *testing.T) { }, }, expectedCBCallCount: 1, - expectedCBError: errors.New("handling applied event: something went wrong"), + expectedCBError: errors.New("handling applied event: failed to get dealinfo: something went wrong"), }, "proposed deal epoch timeout": { currentDealInfo: pipeline.CurrentDealInfo{ From d68bb937d81cd83b9e5b46d8870e6e88a9942cdf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 19 Sep 2022 09:49:27 +0200 Subject: [PATCH 142/185] fix: ffiwrapper: Close readers in AddPiece --- storage/sealer/ffiwrapper/sealer_cgo.go | 20 +++++- storage/sealer/ffiwrapper/sealer_test.go | 84 ++++++++++++++++++++++++ 2 files changed, 101 insertions(+), 3 deletions(-) diff --git a/storage/sealer/ffiwrapper/sealer_cgo.go b/storage/sealer/ffiwrapper/sealer_cgo.go index cf4eddff0..785d11eb8 100644 --- a/storage/sealer/ffiwrapper/sealer_cgo.go +++ b/storage/sealer/ffiwrapper/sealer_cgo.go @@ -60,7 +60,9 @@ func (sb *Sealer) DataCid(ctx context.Context, pieceSize abi.UnpaddedPieceSize, log.Warnf("DataCid: cannot close pieceData reader %T because it is not an io.Closer", origPieceData) return } - closer.Close() //nolint:errcheck + if err := closer.Close(); err != nil { + log.Warnw("closing pieceData in DataCid", "error", err) + } }() pieceData = io.LimitReader(io.MultiReader( @@ -182,7 +184,19 @@ func (sb *Sealer) DataCid(ctx context.Context, pieceSize abi.UnpaddedPieceSize, }, nil } -func (sb *Sealer) AddPiece(ctx context.Context, sector storiface.SectorRef, existingPieceSizes []abi.UnpaddedPieceSize, pieceSize abi.UnpaddedPieceSize, file storiface.Data) (abi.PieceInfo, error) { +func (sb *Sealer) AddPiece(ctx context.Context, sector storiface.SectorRef, existingPieceSizes []abi.UnpaddedPieceSize, pieceSize abi.UnpaddedPieceSize, pieceData storiface.Data) (abi.PieceInfo, error) { + origPieceData := pieceData + defer func() { + closer, ok := origPieceData.(io.Closer) + if !ok { + log.Warnf("AddPiece: cannot close pieceData reader %T because it is not an io.Closer", origPieceData) + return + } + if err := closer.Close(); err != nil { + log.Warnw("closing pieceData in AddPiece", "error", err) + } + }() + // TODO: allow tuning those: chunk := abi.PaddedPieceSize(4 << 20) parallel := runtime.NumCPU() @@ -248,7 +262,7 @@ func (sb *Sealer) AddPiece(ctx context.Context, sector storiface.SectorRef, exis pw := fr32.NewPadWriter(w) - pr := io.TeeReader(io.LimitReader(file, int64(pieceSize)), pw) + pr := io.TeeReader(io.LimitReader(pieceData, int64(pieceSize)), pw) throttle := make(chan []byte, parallel) piecePromises := make([]func() (abi.PieceInfo, error), 0) diff --git a/storage/sealer/ffiwrapper/sealer_test.go b/storage/sealer/ffiwrapper/sealer_test.go index 71fd7c4a0..654caf784 100644 --- a/storage/sealer/ffiwrapper/sealer_test.go +++ b/storage/sealer/ffiwrapper/sealer_test.go @@ -991,3 +991,87 @@ func TestPoStChallengeAssumptions(t *testing.T) { require.Len(t, c1.Challenges, 3) } } + +func TestDCAPCloses(t *testing.T) { + sz := abi.PaddedPieceSize(2 << 10).Unpadded() + + cdir, err := ioutil.TempDir("", "sbtest-c-") + if err != nil { + t.Fatal(err) + } + miner := abi.ActorID(123) + + sp := &basicfs.Provider{ + Root: cdir, + } + sb, err := New(sp) + if err != nil { + t.Fatalf("%+v", err) + } + cleanup := func() { + if t.Failed() { + fmt.Printf("not removing %s\n", cdir) + return + } + if err := os.RemoveAll(cdir); err != nil { + t.Error(err) + } + } + t.Cleanup(cleanup) + + t.Run("DataCid", func(t *testing.T) { + r := rand.New(rand.NewSource(0x7e5)) + + clr := &closeAssertReader{ + Reader: io.LimitReader(r, int64(sz)), + } + + c, err := sb.DataCid(context.TODO(), sz, clr) + if err != nil { + t.Fatal(err) + } + + require.Equal(t, "baga6ea4seaqeje7jy4hufnybpo7ckxzujaigqbcxhdjq7ojb4b6xzgqdugkyciq", c.PieceCID.String()) + require.True(t, clr.closed) + }) + + t.Run("AddPiece", func(t *testing.T) { + r := rand.New(rand.NewSource(0x7e5)) + + clr := &closeAssertReader{ + Reader: io.LimitReader(r, int64(sz)), + } + + c, err := sb.AddPiece(context.TODO(), storiface.SectorRef{ + ID: abi.SectorID{ + Miner: miner, + Number: 0, + }, + ProofType: abi.RegisteredSealProof_StackedDrg2KiBV1_1, + }, nil, sz, clr) + if err != nil { + t.Fatal(err) + } + + require.Equal(t, "baga6ea4seaqeje7jy4hufnybpo7ckxzujaigqbcxhdjq7ojb4b6xzgqdugkyciq", c.PieceCID.String()) + require.True(t, clr.closed) + }) + +} + +type closeAssertReader struct { + io.Reader + closed bool +} + +func (c *closeAssertReader) Close() error { + if c.closed { + panic("double close") + } + + c.closed = true + + return nil +} + +var _ io.Closer = &closeAssertReader{} From 29135aa77cccc4362119cca76440d123f7f28cdf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 24 Aug 2022 15:27:27 -0400 Subject: [PATCH 143/185] sector import: Initial api scaffolding --- api/api_storage.go | 88 +++++++++++++++ api/docgen/docgen.go | 4 + api/proxy_gen.go | 13 +++ build/openrpc/miner.json.gz | Bin 15508 -> 15743 bytes build/openrpc/worker.json.gz | Bin 5075 -> 5035 bytes documentation/en/api-v0-methods-miner.md | 126 ++++++++++++++++++++++ node/impl/storminer.go | 4 + storage/pipeline/checks.go | 22 ++-- storage/pipeline/receive.go | 78 ++++++++++++++ storage/pipeline/states_replica_update.go | 4 +- storage/pipeline/states_sealing.go | 2 +- 11 files changed, 327 insertions(+), 14 deletions(-) create mode 100644 storage/pipeline/receive.go diff --git a/api/api_storage.go b/api/api_storage.go index e9c7aad61..02af793c9 100644 --- a/api/api_storage.go +++ b/api/api_storage.go @@ -3,6 +3,7 @@ package api import ( "bytes" "context" + "net/http" "time" "github.com/google/uuid" @@ -17,6 +18,7 @@ import ( "github.com/filecoin-project/go-fil-markets/storagemarket" "github.com/filecoin-project/go-jsonrpc/auth" "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-state-types/builtin/v8/market" "github.com/filecoin-project/go-state-types/builtin/v9/miner" abinetwork "github.com/filecoin-project/go-state-types/network" @@ -144,6 +146,8 @@ type StorageMiner interface { // SectorNumFree drops a sector reservation SectorNumFree(ctx context.Context, name string) error //perm:admin + SectorReceive(ctx context.Context, meta RemoteSectorMeta) error + // WorkerConnect tells the node to connect to workers RPC WorkerConnect(context.Context, string) error //perm:admin retry:true WorkerStats(context.Context) (map[uuid.UUID]storiface.WorkerStats, error) //perm:admin @@ -504,3 +508,87 @@ type NumAssignerMeta struct { Next abi.SectorNumber } + +type RemoteSectorMeta struct { + //////// + // BASIC SECTOR INFORMATION + + // State specifies the first state the sector will enter after being imported + // Must be one of the following states: + // * Packing + // * GetTicket + // * PreCommitting + // * SubmitCommit + // * Proving/Available + State SectorState + + Sector abi.SectorID + Type abi.RegisteredSealProof + + //////// + // SEALING METADATA + // (allows lotus to continue the sealing process) + + // Required in Packing and later + Pieces []SectorPiece // todo better type? + + // Required in PreCommitting and later + TicketValue abi.SealRandomness + TicketEpoch abi.ChainEpoch + PreCommit1Out storiface.PreCommit1Out // todo specify better + + CommD *cid.Cid + CommR *cid.Cid // SectorKey + + // Required in SubmitCommit and later + PreCommitInfo *miner.SectorPreCommitInfo + PreCommitDeposit big.Int + PreCommitMessage *cid.Cid + PreCommitTipSet types.TipSetKey + + SeedValue abi.InteractiveSealRandomness + SeedEpoch abi.ChainEpoch + + CommitProof []byte + + // Required in Proving/Available + CommitMessage *cid.Cid + + // Optional sector metadata to import + Log []SectorLog + + //////// + // SECTOR DATA SOURCE + + // Sector urls - lotus will use those for fetching files into local storage + + // Required in all states + DataUnsealed *SectorData + + // Required in PreCommitting and later + DataSealed *SectorData + DataCache *SectorData + + //////// + // SEALING SERVICE HOOKS + + // todo Commit1Provider + // todo OnDone / OnStateChange +} + +type SectorData struct { + // Local when set to true indicates to lotus that sector data is already + // available locally; When set lotus will skip fetching sector data, and + // only check that sector data exists in sector storage + Local bool + + // URL to the sector data + // For sealed/unsealed sector, lotus expects octet-stream + // For cache, lotus expects a tar archive with cache files (todo maybe use not-tar; specify what files with what paths must be present) + // Valid schemas: + // - http:// / https:// + URL string + + // optional http headers to use when requesting sector data + Headers http.Header +} diff --git a/api/docgen/docgen.go b/api/docgen/docgen.go index 40b6e6078..47192bfd9 100644 --- a/api/docgen/docgen.go +++ b/api/docgen/docgen.go @@ -6,6 +6,7 @@ import ( "go/ast" "go/parser" "go/token" + "net/http" "path/filepath" "reflect" "strings" @@ -340,6 +341,9 @@ func init() { "": bitfield.NewFromSet([]uint64{5, 6, 7, 10}), }) + addExample(http.Header{ + "Authorization": []string{"Bearer ey.."}, + }) } func GetAPIType(name, pkg string) (i interface{}, t reflect.Type, permStruct []reflect.Type) { diff --git a/api/proxy_gen.go b/api/proxy_gen.go index 43bd40f83..fd31166a9 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -846,6 +846,8 @@ type StorageMinerStruct struct { SectorPreCommitPending func(p0 context.Context) ([]abi.SectorID, error) `perm:"admin"` + SectorReceive func(p0 context.Context, p1 RemoteSectorMeta) error `` + SectorRemove func(p0 context.Context, p1 abi.SectorNumber) error `perm:"admin"` SectorSetExpectedSealDuration func(p0 context.Context, p1 time.Duration) error `perm:"write"` @@ -5039,6 +5041,17 @@ func (s *StorageMinerStub) SectorPreCommitPending(p0 context.Context) ([]abi.Sec return *new([]abi.SectorID), ErrNotSupported } +func (s *StorageMinerStruct) SectorReceive(p0 context.Context, p1 RemoteSectorMeta) error { + if s.Internal.SectorReceive == nil { + return ErrNotSupported + } + return s.Internal.SectorReceive(p0, p1) +} + +func (s *StorageMinerStub) SectorReceive(p0 context.Context, p1 RemoteSectorMeta) error { + return ErrNotSupported +} + func (s *StorageMinerStruct) SectorRemove(p0 context.Context, p1 abi.SectorNumber) error { if s.Internal.SectorRemove == nil { return ErrNotSupported diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index e9637ed2e2521a7ea0c87413fd84da1b6fc76906..99ca3b3666cabaaf974b06194236752f869832ef 100644 GIT binary patch literal 15743 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 R+xq9ngH2O10SpxA{{f?KKKB3s literal 15508 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 WJw4q%{l5SJ0RR70n%LKz_5uK5cl+!B diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index 17e7677083f186be67190da912ff10587e430214..f0d2db3c69241b2c6b7cfd999ad7f49e94f7a063 100644 GIT binary patch literal 5035 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 deal.Proposal.StartEpoch { - return &ErrExpiredDeals{xerrors.Errorf("piece %d (of %d) of sector %d refers expired deal %d - should start at %d, head %d", i, len(si.Pieces), si.SectorNumber, p.DealInfo.DealID, deal.Proposal.StartEpoch, ts.Height())} + return &ErrExpiredDeals{xerrors.Errorf("piece %d (of %d) of sector %d refers expired deal %d - should start at %d, head %d", i, len(pieces), sn, p.DealInfo.DealID, deal.Proposal.StartEpoch, ts.Height())} } } if mustHaveDeals && dealCount <= 0 { - return &ErrNoDeals{(xerrors.Errorf("sector %d must have deals, but does not", si.SectorNumber))} + return &ErrNoDeals{xerrors.Errorf("sector %d must have deals, but does not", sn)} } return nil @@ -95,7 +95,7 @@ func checkPieces(ctx context.Context, maddr address.Address, si SectorInfo, api // // matches pieces, and that the seal ticket isn't expired func checkPrecommit(ctx context.Context, maddr address.Address, si SectorInfo, tsk types.TipSetKey, height abi.ChainEpoch, api SealingAPI) (err error) { - if err := checkPieces(ctx, maddr, si, api, false); err != nil { + if err := checkPieces(ctx, maddr, si.SectorNumber, si.Pieces, api, false); err != nil { return err } @@ -210,7 +210,7 @@ func (m *Sealing) checkCommit(ctx context.Context, si SectorInfo, proof []byte, return &ErrInvalidProof{xerrors.New("invalid proof (compute error?)")} } - if err := checkPieces(ctx, m.maddr, si, m.Api, false); err != nil { + if err := checkPieces(ctx, m.maddr, si.SectorNumber, si.Pieces, m.Api, false); err != nil { return err } @@ -220,7 +220,7 @@ func (m *Sealing) checkCommit(ctx context.Context, si SectorInfo, proof []byte, // check that sector info is good after running a replica update func checkReplicaUpdate(ctx context.Context, maddr address.Address, si SectorInfo, tsk types.TipSetKey, api SealingAPI) error { - if err := checkPieces(ctx, maddr, si, api, true); err != nil { + if err := checkPieces(ctx, maddr, si.SectorNumber, si.Pieces, api, true); err != nil { return err } if !si.CCUpdate { diff --git a/storage/pipeline/receive.go b/storage/pipeline/receive.go new file mode 100644 index 000000000..e32fd4f86 --- /dev/null +++ b/storage/pipeline/receive.go @@ -0,0 +1,78 @@ +package sealing + +import ( + "context" + + "github.com/ipfs/go-datastore" + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + + "github.com/filecoin-project/lotus/api" +) + +func (m *Sealing) Receive(ctx context.Context, meta api.RemoteSectorMeta) error { + if err := m.checkSectorMeta(ctx, meta); err != nil { + return err + } + + panic("impl me") +} + +func (m *Sealing) checkSectorMeta(ctx context.Context, meta api.RemoteSectorMeta) error { + { + mid, err := address.IDFromAddress(m.maddr) + if err != nil { + panic(err) + } + + if meta.Sector.Miner != abi.ActorID(mid) { + return xerrors.Errorf("sector for wrong actor - expected actor id %d, sector was for actor %d", mid, meta.Sector.Miner) + } + } + + { + // initial sanity check, doesn't prevent races + _, err := m.GetSectorInfo(meta.Sector.Number) + if err != nil && !xerrors.Is(err, datastore.ErrNotFound) { + return err + } + if err == nil { + return xerrors.Errorf("sector with ID %d already exists in the sealing pipeline", meta.Sector.Number) + } + } + + { + spt, err := m.currentSealProof(ctx) + if err != nil { + return err + } + + if meta.Type != spt { + return xerrors.Errorf("sector seal proof type doesn't match current seal proof type (%d!=%d)", meta.Type, spt) + } + } + + switch SectorState(meta.State) { + case Packing: + //checkPieces(ctx, m.maddr, meta.Sector.Number, meta.Pieces, m.Api, false) + + fallthrough + case GetTicket: + + fallthrough + case PreCommitting: + + fallthrough + case SubmitCommit: + + fallthrough + case Proving, Available: + + return nil + default: + return xerrors.Errorf("imported sector State in not supported") + } + +} diff --git a/storage/pipeline/states_replica_update.go b/storage/pipeline/states_replica_update.go index 0261201f3..a78d6dee8 100644 --- a/storage/pipeline/states_replica_update.go +++ b/storage/pipeline/states_replica_update.go @@ -26,7 +26,7 @@ func (m *Sealing) handleReplicaUpdate(ctx statemachine.Context, sector SectorInf return ctx.Send(SectorAbortUpgrade{xerrors.New("sector had no deals")}) } - if err := checkPieces(ctx.Context(), m.maddr, sector, m.Api, true); err != nil { // Sanity check state + if err := checkPieces(ctx.Context(), m.maddr, sector.SectorNumber, sector.Pieces, m.Api, true); err != nil { // Sanity check state return handleErrors(ctx, err, sector) } out, err := m.sealer.ReplicaUpdate(sector.sealingCtx(ctx.Context()), m.minerSector(sector.SectorType, sector.SectorNumber), sector.pieceInfos()) @@ -66,7 +66,7 @@ func (m *Sealing) handleProveReplicaUpdate(ctx statemachine.Context, sector Sect return ctx.Send(SectorProveReplicaUpdateFailed{xerrors.Errorf("prove replica update (1) failed: %w", err)}) } - if err := checkPieces(ctx.Context(), m.maddr, sector, m.Api, true); err != nil { // Sanity check state + if err := checkPieces(ctx.Context(), m.maddr, sector.SectorNumber, sector.Pieces, m.Api, true); err != nil { // Sanity check state return handleErrors(ctx, err, sector) } diff --git a/storage/pipeline/states_sealing.go b/storage/pipeline/states_sealing.go index f769341dd..f2d61fc62 100644 --- a/storage/pipeline/states_sealing.go +++ b/storage/pipeline/states_sealing.go @@ -207,7 +207,7 @@ func (m *Sealing) handleGetTicket(ctx statemachine.Context, sector SectorInfo) e } func (m *Sealing) handlePreCommit1(ctx statemachine.Context, sector SectorInfo) error { - if err := checkPieces(ctx.Context(), m.maddr, sector, m.Api, false); err != nil { // Sanity check state + if err := checkPieces(ctx.Context(), m.maddr, sector.SectorNumber, sector.Pieces, m.Api, false); err != nil { // Sanity check state switch err.(type) { case *ErrApi: log.Errorf("handlePreCommit1: api error, not proceeding: %+v", err) From 5c485c337566b4bd84a297b8b129c7f4c13f2deb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 25 Aug 2022 20:37:36 -0400 Subject: [PATCH 144/185] sealing: Drop redundant Piece type --- api/cbor_gen.go | 123 +++++++++++++++++++ cmd/lotus-miner/init.go | 2 +- gen/main.go | 1 + itests/kit/ensemble.go | 2 +- storage/pipeline/cbor_gen.go | 139 ++-------------------- storage/pipeline/checks.go | 3 +- storage/pipeline/fsm_events.go | 5 +- storage/pipeline/gen/main.go | 1 - storage/pipeline/input.go | 4 +- storage/pipeline/precommit_policy.go | 5 +- storage/pipeline/precommit_policy_test.go | 6 +- storage/pipeline/states_failed_test.go | 2 +- storage/pipeline/types.go | 18 +-- storage/pipeline/types_test.go | 2 +- 14 files changed, 152 insertions(+), 161 deletions(-) diff --git a/api/cbor_gen.go b/api/cbor_gen.go index 66655fd75..0932bdbc0 100644 --- a/api/cbor_gen.go +++ b/api/cbor_gen.go @@ -1005,6 +1005,129 @@ func (t *PieceDealInfo) UnmarshalCBOR(r io.Reader) (err error) { return nil } +func (t *SectorPiece) MarshalCBOR(w io.Writer) error { + if t == nil { + _, err := w.Write(cbg.CborNull) + return err + } + + cw := cbg.NewCborWriter(w) + + if _, err := cw.Write([]byte{162}); err != nil { + return err + } + + // t.Piece (abi.PieceInfo) (struct) + if len("Piece") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"Piece\" was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("Piece"))); err != nil { + return err + } + if _, err := io.WriteString(w, string("Piece")); err != nil { + return err + } + + if err := t.Piece.MarshalCBOR(cw); err != nil { + return err + } + + // t.DealInfo (api.PieceDealInfo) (struct) + if len("DealInfo") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"DealInfo\" was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("DealInfo"))); err != nil { + return err + } + if _, err := io.WriteString(w, string("DealInfo")); err != nil { + return err + } + + if err := t.DealInfo.MarshalCBOR(cw); err != nil { + return err + } + return nil +} + +func (t *SectorPiece) UnmarshalCBOR(r io.Reader) (err error) { + *t = SectorPiece{} + + cr := cbg.NewCborReader(r) + + maj, extra, err := cr.ReadHeader() + if err != nil { + return err + } + defer func() { + if err == io.EOF { + err = io.ErrUnexpectedEOF + } + }() + + if maj != cbg.MajMap { + return fmt.Errorf("cbor input should be of type map") + } + + if extra > cbg.MaxLength { + return fmt.Errorf("SectorPiece: map struct too large (%d)", extra) + } + + var name string + n := extra + + for i := uint64(0); i < n; i++ { + + { + sval, err := cbg.ReadString(cr) + if err != nil { + return err + } + + name = string(sval) + } + + switch name { + // t.Piece (abi.PieceInfo) (struct) + case "Piece": + + { + + if err := t.Piece.UnmarshalCBOR(cr); err != nil { + return xerrors.Errorf("unmarshaling t.Piece: %w", err) + } + + } + // t.DealInfo (api.PieceDealInfo) (struct) + case "DealInfo": + + { + + b, err := cr.ReadByte() + if err != nil { + return err + } + if b != cbg.CborNull[0] { + if err := cr.UnreadByte(); err != nil { + return err + } + t.DealInfo = new(PieceDealInfo) + if err := t.DealInfo.UnmarshalCBOR(cr); err != nil { + return xerrors.Errorf("unmarshaling t.DealInfo pointer: %w", err) + } + } + + } + + default: + // Field doesn't exist on this type, so ignore it + cbg.ScanForLinks(r, func(cid.Cid) {}) + } + } + + return nil +} func (t *DealSchedule) MarshalCBOR(w io.Writer) error { if t == nil { _, err := w.Write(cbg.CborNull) diff --git a/cmd/lotus-miner/init.go b/cmd/lotus-miner/init.go index dd245f038..ce69fad5b 100644 --- a/cmd/lotus-miner/init.go +++ b/cmd/lotus-miner/init.go @@ -314,7 +314,7 @@ func migratePreSealMeta(ctx context.Context, api v1api.FullNode, metadata string info := &pipeline.SectorInfo{ State: pipeline.Proving, SectorNumber: sector.SectorID, - Pieces: []pipeline.Piece{ + Pieces: []lapi.SectorPiece{ { Piece: abi.PieceInfo{ Size: abi.PaddedPieceSize(meta.SectorSize), diff --git a/gen/main.go b/gen/main.go index e5fc2ed5f..77f340813 100644 --- a/gen/main.go +++ b/gen/main.go @@ -65,6 +65,7 @@ func main() { api.SealTicket{}, api.SealSeed{}, api.PieceDealInfo{}, + api.SectorPiece{}, api.DealSchedule{}, ) if err != nil { diff --git a/itests/kit/ensemble.go b/itests/kit/ensemble.go index 98d7b178f..bcc2d93c2 100644 --- a/itests/kit/ensemble.go +++ b/itests/kit/ensemble.go @@ -962,7 +962,7 @@ func importPreSealMeta(ctx context.Context, meta genesis.Miner, mds dtypes.Metad info := &pipeline.SectorInfo{ State: pipeline.Proving, SectorNumber: sector.SectorID, - Pieces: []pipeline.Piece{ + Pieces: []api.SectorPiece{ { Piece: abi.PieceInfo{ Size: abi.PaddedPieceSize(meta.SectorSize), diff --git a/storage/pipeline/cbor_gen.go b/storage/pipeline/cbor_gen.go index 308508ce7..0d9d1a918 100644 --- a/storage/pipeline/cbor_gen.go +++ b/storage/pipeline/cbor_gen.go @@ -22,129 +22,6 @@ var _ = cid.Undef var _ = math.E var _ = sort.Sort -func (t *Piece) MarshalCBOR(w io.Writer) error { - if t == nil { - _, err := w.Write(cbg.CborNull) - return err - } - - cw := cbg.NewCborWriter(w) - - if _, err := cw.Write([]byte{162}); err != nil { - return err - } - - // t.Piece (abi.PieceInfo) (struct) - if len("Piece") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"Piece\" was too long") - } - - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("Piece"))); err != nil { - return err - } - if _, err := io.WriteString(w, string("Piece")); err != nil { - return err - } - - if err := t.Piece.MarshalCBOR(cw); err != nil { - return err - } - - // t.DealInfo (api.PieceDealInfo) (struct) - if len("DealInfo") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"DealInfo\" was too long") - } - - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("DealInfo"))); err != nil { - return err - } - if _, err := io.WriteString(w, string("DealInfo")); err != nil { - return err - } - - if err := t.DealInfo.MarshalCBOR(cw); err != nil { - return err - } - return nil -} - -func (t *Piece) UnmarshalCBOR(r io.Reader) (err error) { - *t = Piece{} - - cr := cbg.NewCborReader(r) - - maj, extra, err := cr.ReadHeader() - if err != nil { - return err - } - defer func() { - if err == io.EOF { - err = io.ErrUnexpectedEOF - } - }() - - if maj != cbg.MajMap { - return fmt.Errorf("cbor input should be of type map") - } - - if extra > cbg.MaxLength { - return fmt.Errorf("Piece: map struct too large (%d)", extra) - } - - var name string - n := extra - - for i := uint64(0); i < n; i++ { - - { - sval, err := cbg.ReadString(cr) - if err != nil { - return err - } - - name = string(sval) - } - - switch name { - // t.Piece (abi.PieceInfo) (struct) - case "Piece": - - { - - if err := t.Piece.UnmarshalCBOR(cr); err != nil { - return xerrors.Errorf("unmarshaling t.Piece: %w", err) - } - - } - // t.DealInfo (api.PieceDealInfo) (struct) - case "DealInfo": - - { - - b, err := cr.ReadByte() - if err != nil { - return err - } - if b != cbg.CborNull[0] { - if err := cr.UnreadByte(); err != nil { - return err - } - t.DealInfo = new(api.PieceDealInfo) - if err := t.DealInfo.UnmarshalCBOR(cr); err != nil { - return xerrors.Errorf("unmarshaling t.DealInfo pointer: %w", err) - } - } - - } - - default: - // Field doesn't exist on this type, so ignore it - cbg.ScanForLinks(r, func(cid.Cid) {}) - } - } - - return nil -} func (t *SectorInfo) MarshalCBOR(w io.Writer) error { if t == nil { _, err := w.Write(cbg.CborNull) @@ -240,7 +117,7 @@ func (t *SectorInfo) MarshalCBOR(w io.Writer) error { } } - // t.Pieces ([]sealing.Piece) (slice) + // t.Pieces ([]api.SectorPiece) (slice) if len("Pieces") > cbg.MaxLength { return xerrors.Errorf("Value in field \"Pieces\" was too long") } @@ -573,7 +450,7 @@ func (t *SectorInfo) MarshalCBOR(w io.Writer) error { return err } - // t.CCPieces ([]sealing.Piece) (slice) + // t.CCPieces ([]api.SectorPiece) (slice) if len("CCPieces") > cbg.MaxLength { return xerrors.Errorf("Value in field \"CCPieces\" was too long") } @@ -943,7 +820,7 @@ func (t *SectorInfo) UnmarshalCBOR(r io.Reader) (err error) { t.CreationTime = int64(extraI) } - // t.Pieces ([]sealing.Piece) (slice) + // t.Pieces ([]api.SectorPiece) (slice) case "Pieces": maj, extra, err = cr.ReadHeader() @@ -960,12 +837,12 @@ func (t *SectorInfo) UnmarshalCBOR(r io.Reader) (err error) { } if extra > 0 { - t.Pieces = make([]Piece, extra) + t.Pieces = make([]api.SectorPiece, extra) } for i := 0; i < int(extra); i++ { - var v Piece + var v api.SectorPiece if err := v.UnmarshalCBOR(cr); err != nil { return err } @@ -1273,7 +1150,7 @@ func (t *SectorInfo) UnmarshalCBOR(r io.Reader) (err error) { default: return fmt.Errorf("booleans are either major type 7, value 20 or 21 (got %d)", extra) } - // t.CCPieces ([]sealing.Piece) (slice) + // t.CCPieces ([]api.SectorPiece) (slice) case "CCPieces": maj, extra, err = cr.ReadHeader() @@ -1290,12 +1167,12 @@ func (t *SectorInfo) UnmarshalCBOR(r io.Reader) (err error) { } if extra > 0 { - t.CCPieces = make([]Piece, extra) + t.CCPieces = make([]api.SectorPiece, extra) } for i := 0; i < int(extra); i++ { - var v Piece + var v api.SectorPiece if err := v.UnmarshalCBOR(cr); err != nil { return err } diff --git a/storage/pipeline/checks.go b/storage/pipeline/checks.go index ce0512c2b..10f7a9eaf 100644 --- a/storage/pipeline/checks.go +++ b/storage/pipeline/checks.go @@ -13,6 +13,7 @@ import ( "github.com/filecoin-project/go-state-types/crypto" prooftypes "github.com/filecoin-project/go-state-types/proof" + "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/chain/actors/policy" "github.com/filecoin-project/lotus/chain/types" ) @@ -41,7 +42,7 @@ type ErrCommitWaitFailed struct{ error } type ErrBadRU struct{ error } type ErrBadPR struct{ error } -func checkPieces(ctx context.Context, maddr address.Address, sn abi.SectorNumber, pieces []Piece, api SealingAPI, mustHaveDeals bool) error { +func checkPieces(ctx context.Context, maddr address.Address, sn abi.SectorNumber, pieces []api.SectorPiece, api SealingAPI, mustHaveDeals bool) error { ts, err := api.ChainHead(ctx) if err != nil { return &ErrApi{xerrors.Errorf("getting chain head: %w", err)} diff --git a/storage/pipeline/fsm_events.go b/storage/pipeline/fsm_events.go index 4d41f9070..ac9c5775d 100644 --- a/storage/pipeline/fsm_events.go +++ b/storage/pipeline/fsm_events.go @@ -10,6 +10,7 @@ import ( "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-state-types/builtin/v9/miner" + "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/storage/sealer/storiface" ) @@ -87,7 +88,7 @@ func (evt SectorAddPiece) apply(state *SectorInfo) { } type SectorPieceAdded struct { - NewPieces []Piece + NewPieces []api.SectorPiece } func (evt SectorPieceAdded) apply(state *SectorInfo) { @@ -113,7 +114,7 @@ type SectorPacked struct{ FillerPieces []abi.PieceInfo } func (evt SectorPacked) apply(state *SectorInfo) { for idx := range evt.FillerPieces { - state.Pieces = append(state.Pieces, Piece{ + state.Pieces = append(state.Pieces, api.SectorPiece{ Piece: evt.FillerPieces[idx], DealInfo: nil, // filler pieces don't have deals associated with them }) diff --git a/storage/pipeline/gen/main.go b/storage/pipeline/gen/main.go index 6da1d96b7..578c81478 100644 --- a/storage/pipeline/gen/main.go +++ b/storage/pipeline/gen/main.go @@ -11,7 +11,6 @@ import ( func main() { err := gen.WriteMapEncodersToFile("./cbor_gen.go", "sealing", - sealing.Piece{}, sealing.SectorInfo{}, sealing.Log{}, ) diff --git a/storage/pipeline/input.go b/storage/pipeline/input.go index e4ca53493..824fee255 100644 --- a/storage/pipeline/input.go +++ b/storage/pipeline/input.go @@ -234,7 +234,7 @@ func (m *Sealing) handleAddPiece(ctx statemachine.Context, sector SectorInfo) er } pieceSizes = append(pieceSizes, p.Unpadded()) - res.NewPieces = append(res.NewPieces, Piece{ + res.NewPieces = append(res.NewPieces, api.SectorPiece{ Piece: ppi, }) } @@ -262,7 +262,7 @@ func (m *Sealing) handleAddPiece(ctx statemachine.Context, sector SectorInfo) er offset += deal.size pieceSizes = append(pieceSizes, deal.size) - res.NewPieces = append(res.NewPieces, Piece{ + res.NewPieces = append(res.NewPieces, api.SectorPiece{ Piece: ppi, DealInfo: &deal.deal, }) diff --git a/storage/pipeline/precommit_policy.go b/storage/pipeline/precommit_policy.go index e0761d209..04f69a93a 100644 --- a/storage/pipeline/precommit_policy.go +++ b/storage/pipeline/precommit_policy.go @@ -9,6 +9,7 @@ import ( "github.com/filecoin-project/go-state-types/builtin/v8/miner" "github.com/filecoin-project/go-state-types/network" + "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/chain/actors/builtin" "github.com/filecoin-project/lotus/chain/actors/policy" "github.com/filecoin-project/lotus/chain/types" @@ -16,7 +17,7 @@ import ( ) type PreCommitPolicy interface { - Expiration(ctx context.Context, ps ...Piece) (abi.ChainEpoch, error) + Expiration(ctx context.Context, ps ...api.SectorPiece) (abi.ChainEpoch, error) } type Chain interface { @@ -59,7 +60,7 @@ func NewBasicPreCommitPolicy(api Chain, cfgGetter dtypes.GetSealingConfigFunc, p // Expiration produces the pre-commit sector expiration epoch for an encoded // replica containing the provided enumeration of pieces and deals. -func (p *BasicPreCommitPolicy) Expiration(ctx context.Context, ps ...Piece) (abi.ChainEpoch, error) { +func (p *BasicPreCommitPolicy) Expiration(ctx context.Context, ps ...api.SectorPiece) (abi.ChainEpoch, error) { ts, err := p.api.ChainHead(ctx) if err != nil { return 0, err diff --git a/storage/pipeline/precommit_policy_test.go b/storage/pipeline/precommit_policy_test.go index 5d2da1ee0..b81086362 100644 --- a/storage/pipeline/precommit_policy_test.go +++ b/storage/pipeline/precommit_policy_test.go @@ -95,7 +95,7 @@ func TestBasicPolicyMostConstrictiveSchedule(t *testing.T) { h: abi.ChainEpoch(55), }, cfg, 2) longestDealEpochEnd := abi.ChainEpoch(547300) - pieces := []pipeline.Piece{ + pieces := []api.SectorPiece{ { Piece: abi.PieceInfo{ Size: abi.PaddedPieceSize(1024), @@ -136,7 +136,7 @@ func TestBasicPolicyIgnoresExistingScheduleIfExpired(t *testing.T) { h: abi.ChainEpoch(55), }, cfg, 0) - pieces := []pipeline.Piece{ + pieces := []api.SectorPiece{ { Piece: abi.PieceInfo{ Size: abi.PaddedPieceSize(1024), @@ -165,7 +165,7 @@ func TestMissingDealIsIgnored(t *testing.T) { h: abi.ChainEpoch(55), }, cfg, 0) - pieces := []pipeline.Piece{ + pieces := []api.SectorPiece{ { Piece: abi.PieceInfo{ Size: abi.PaddedPieceSize(1024), diff --git a/storage/pipeline/states_failed_test.go b/storage/pipeline/states_failed_test.go index 0243af126..f6846c8f5 100644 --- a/storage/pipeline/states_failed_test.go +++ b/storage/pipeline/states_failed_test.go @@ -76,7 +76,7 @@ func TestStateRecoverDealIDs(t *testing.T) { // TODO sctx should satisfy an interface so it can be useable for mocking. This will fail because we are passing in an empty context now to get this to build. // https://github.com/filecoin-project/lotus/issues/7867 err := fakeSealing.HandleRecoverDealIDs(statemachine.Context{}, pipeline.SectorInfo{ - Pieces: []pipeline.Piece{ + Pieces: []api2.SectorPiece{ { DealInfo: &api2.PieceDealInfo{ DealID: dealId, diff --git a/storage/pipeline/types.go b/storage/pipeline/types.go index 69e2b4ee0..4f175ae61 100644 --- a/storage/pipeline/types.go +++ b/storage/pipeline/types.go @@ -22,18 +22,6 @@ type Context interface { Send(evt interface{}) error } -// Piece is a tuple of piece and deal info -type PieceWithDealInfo struct { - Piece abi.PieceInfo - DealInfo api.PieceDealInfo -} - -// Piece is a tuple of piece info and optional deal -type Piece struct { - Piece abi.PieceInfo - DealInfo *api.PieceDealInfo // nil for pieces which do not appear in deals (e.g. filler pieces) -} - type Log struct { Timestamp uint64 Trace string // for errors @@ -61,7 +49,7 @@ type SectorInfo struct { // Packing CreationTime int64 // unix seconds - Pieces []Piece + Pieces []api.SectorPiece // PreCommit1 TicketValue abi.SealRandomness @@ -89,7 +77,7 @@ type SectorInfo struct { // CCUpdate CCUpdate bool - CCPieces []Piece + CCPieces []api.SectorPiece UpdateSealed *cid.Cid UpdateUnsealed *cid.Cid ReplicaUpdateProof storiface.ReplicaUpdateProof @@ -161,7 +149,7 @@ func (t *SectorInfo) sealingCtx(ctx context.Context) context.Context { // Returns list of offset/length tuples of sector data ranges which clients // requested to keep unsealed -func (t *SectorInfo) keepUnsealedRanges(pieces []Piece, invert, alwaysKeep bool) []storiface.Range { +func (t *SectorInfo) keepUnsealedRanges(pieces []api.SectorPiece, invert, alwaysKeep bool) []storiface.Range { var out []storiface.Range var at abi.UnpaddedPieceSize diff --git a/storage/pipeline/types_test.go b/storage/pipeline/types_test.go index 69e102bf4..5aa0f7dc2 100644 --- a/storage/pipeline/types_test.go +++ b/storage/pipeline/types_test.go @@ -43,7 +43,7 @@ func TestSectorInfoSerialization(t *testing.T) { si := &SectorInfo{ State: "stateful", SectorNumber: 234, - Pieces: []Piece{{ + Pieces: []api.SectorPiece{{ Piece: abi.PieceInfo{ Size: 5, PieceCID: dummyCid, From 332d83bd18aa4b17030b19c30d225f63933fb991 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 25 Aug 2022 20:48:57 -0400 Subject: [PATCH 145/185] sector import: Check pieces in Sealing.Receive --- storage/pipeline/receive.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/storage/pipeline/receive.go b/storage/pipeline/receive.go index e32fd4f86..134e3b7eb 100644 --- a/storage/pipeline/receive.go +++ b/storage/pipeline/receive.go @@ -56,7 +56,9 @@ func (m *Sealing) checkSectorMeta(ctx context.Context, meta api.RemoteSectorMeta switch SectorState(meta.State) { case Packing: - //checkPieces(ctx, m.maddr, meta.Sector.Number, meta.Pieces, m.Api, false) + if err := checkPieces(ctx, m.maddr, meta.Sector.Number, meta.Pieces, m.Api, false); err != nil { + return xerrors.Errorf("checking pieces: %w", err) + } fallthrough case GetTicket: From ca790b4c69d4f2f5aa415d2d6aeb620efbd28320 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 25 Aug 2022 20:53:21 -0400 Subject: [PATCH 146/185] sealing: Validate piece alignment in checkPieces --- storage/pipeline/checks.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/storage/pipeline/checks.go b/storage/pipeline/checks.go index 10f7a9eaf..6381ce898 100644 --- a/storage/pipeline/checks.go +++ b/storage/pipeline/checks.go @@ -49,8 +49,15 @@ func checkPieces(ctx context.Context, maddr address.Address, sn abi.SectorNumber } dealCount := 0 + var offset abi.PaddedPieceSize for i, p := range pieces { + // check that the piece is correctly aligned + if offset%p.Piece.Size != 0 { + return &ErrInvalidPiece{xerrors.Errorf("sector %d piece %d is not aligned: size=%xh offset=%xh off-by=%xh", sn, i, p.Piece.Size, offset, offset%p.Piece.Size)} + } + offset += p.Piece.Size + // if no deal is associated with the piece, ensure that we added it as // filler (i.e. ensure that it has a zero PieceCID) if p.DealInfo == nil { From 23184192913ad30097a6f5a5d7de4bc2633d3c94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 25 Aug 2022 21:24:12 -0400 Subject: [PATCH 147/185] sector import: Fix missing perm tag on SectorReceive --- api/api_storage.go | 2 +- api/proxy_gen.go | 2 +- build/openrpc/miner.json.gz | Bin 15743 -> 15711 bytes documentation/en/api-v0-methods-miner.md | 4 ++-- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/api/api_storage.go b/api/api_storage.go index 02af793c9..32309f388 100644 --- a/api/api_storage.go +++ b/api/api_storage.go @@ -146,7 +146,7 @@ type StorageMiner interface { // SectorNumFree drops a sector reservation SectorNumFree(ctx context.Context, name string) error //perm:admin - SectorReceive(ctx context.Context, meta RemoteSectorMeta) error + SectorReceive(ctx context.Context, meta RemoteSectorMeta) error //perm:admin // WorkerConnect tells the node to connect to workers RPC WorkerConnect(context.Context, string) error //perm:admin retry:true diff --git a/api/proxy_gen.go b/api/proxy_gen.go index fd31166a9..6cb86ce54 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -846,7 +846,7 @@ type StorageMinerStruct struct { SectorPreCommitPending func(p0 context.Context) ([]abi.SectorID, error) `perm:"admin"` - SectorReceive func(p0 context.Context, p1 RemoteSectorMeta) error `` + SectorReceive func(p0 context.Context, p1 RemoteSectorMeta) error `perm:"admin"` SectorRemove func(p0 context.Context, p1 abi.SectorNumber) error `perm:"admin"` diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index 99ca3b3666cabaaf974b06194236752f869832ef..4912f83066e10949969be4d4b166088da92f0aa2 100644 GIT binary patch delta 5504 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 C&(e4R delta 5496 zcmV-;6^H8IdjEQ`5h#DM&rhyb$PsDf#G+t}D0eF9)_RSI7uCiS$k&LjETh}d<|H{U zswrp`QU;OdMn-BSYI$Ylt~ohRz0^%F2bz~oKKiCbvyhukboSC3d204in|Hl$dDl$T zU1R+Y(LcCZcOQ5+;{I5FKL!Ms~Ly?fs*Ty?9Z-%_Xu;sG}2TLmkttPa581f%_?fhKUK%jz)vT zs|)B*Ar8{-qMRAb(JA5rB%lcIaZr~yF{RhozCx5Uaw9X9lc5JKe^H(J3LzswOzcs7 z0X%a^kb?Gq#O(e1>fK5w|5~B{35Y5+_;YK?2mC80Msh>KNOp}}3fH!n@oNX_DBUWj zuJkFSFq+hSZt0;&_Bk@HZ8OXBpIZ-HOe#WWxb&fB}^sjG(Txv$}C^14I zXl1UN%xd{DIjpi(^W?PBP?AN3eQUPb=%R*cTYaXjKGRm8e`%}FNc#(R$|dHcI(@5> zc1|7hJdqjS#O>B=F5BLe=fcD$vb3n)`Qbo(|ELzwo!DH;h&W@bSpt51yIK0f$R1X$ zR8g?IS8X2InyY>iI0&ko6VUmA2 z=4!;#rDU*1fBj{<##=aUcUSzYjbJ+;_xic{&fj9kGlNa=pK_LfW+VjGd@7}%*6L7QX<$ifetq=e*&RY1U4ejWFoNHD!%)jhu!k? z`M5X8O@h8^yv9xj#4L`Fm-8rM_YC08@P9VuMFJrUEq6yXb@JHqyD9k5a_9NDH_A-~ zziOsb&sBb@o@#tpP^+f`^F?t~;J6S0cOOdgv^@D*cygSZSj|0l;oY2-c`^c~F>5#q zv>~>Pf1_E*mQe&UFR8%a)K+Q5OmCKYq&|=*@o;VC_d|%AOei_>$M&{rY zx!1GR%X6@gvz%=?2GBIwMs*pul`CZ4(3~Me|GuTpfXv!yNnKA%XQJJ#W6 z+kg}$^RS^y-#e+AP&-f1j+YNO)+xS^=j=<;_}L=;iSTmeXVynaE%xG!e_)ECd0`@h zch8>vP8iZ5eCU{4f0|2PFA%|2#l(4$JnAY1xT5n|Hk-kdi#yNG5zD4B?PU{r5=2vW z0s>BwBqqG#yj`EIl=3&*9N#v_x6Scwb9~zz-_kk0l@xltawu}Uu`CXOZMu`Z(^9S` zRJtxm2|jt2EJA6fW3tvB`~&>4A?n!_=iYP|Nel%IUJ>1fc=KEX#13Gw>`lB;NN4Tud*ZzCfv)1yE4Wxnx_Pg3y(kyTgm zCkRR^({bpUe-Q^lOui_xR#@eA*3pjri&Ocp4_EQu-UX-z|M3Yv^8bEz`Gc}V8v<5} zH;R^`Eo>dbTjc{j7PSJj{tPJ5kE_=2#vmwSz$|?5z;6}wtK?!6@dOf{PGTdS#~N_Ysb4hA zzhd3!0Lw9uBYd;AgBHj^L`U5lav=a?x)Qbg9=I{YJ+J)t|Id0@IEZxtb#bMk0N@~_ zdqaM+C^`by;a!G7vEBtXDRMl_=g<|^%R(FWe{En}HdjqIi^g_$ez6npTAUkphWv0e z9M2Ai)8S;glcS_G2Pi-|15|7=ot-AEB>rHSXH$*5B-tW=Wek&s+?L7FC4*?5DS$??nv$Bl zf394UOij@%;+kFfsgx(@*{VG?XhVEQ7F{|V<>eBYe>C6HV31Xd#FtHV50V4~WudKl zVk*EkCV`a>j($LqyBF@QAC4)9Sw%#mFfrMO=?E~1?TIBI!!JVtKf@Q%0^NL2CX7dArESeLyic5;nU=VbOMGkn5I7Y}2w|bO-%ReU;<+$<_F=T|NVMWJc z@m`Y11-PXFOW}dDg-E%uO>{#5$CRHJy8Ku#SgH;{Y$wW368$c8i?~=EA!1_Sdu(jj z_&Q#W#)e>v@M?CZDHe@&5M0a&f1s{g>$Szh^*QjM@1TdsqBS04->S``bx~EjTs3aInBv{Cu(V(DDb3;RNjWfoR6zW-#%x zuG*8#S|;{kR&t+U)sKjtTl!ta!o6`A@?slF8Nr(>7{fl)98*{dx{3)Le;L6}3Uo^m zE!4t(D;0x9v<<7wYFQ-!`hy{35gz?`^rhG7b^4uNr+3@YE)g`eqc4NbkUi-1ZlB6# zGk8c;tEVTrZ@PHT8a|#0fa8v~#w7falp5i@?Tv{SDRAH|*h@{%4_EGdFwM`glo~`O zWG4Gw#cLZEpryPCteKkdf2`*}@P_gXCmDO?sV$K6Ib_l%)3wQTZ8YI4tk%)9QN{48EeP1WJR;c7+;8G6?V^#YmxK2e-}1Wh08tspNGwZ zsFwofE)gB0%F^0f15)_bhIFMBuxmn#zBZQV=cgN)M7Men48x(J@E315 z&ldR7o{Ie-r()mFFxr@y^YL(ypL%qO43Sk++oFg=%95l%r(y`z@`>Wm8n43kU5 z$odxqOCk5a{XRO z3oq;1F(22q)D)^$YO40VAg%a59}h?Qxkz3aw#s6geXn@Je-|tLrr@?=&2qdp@k*5y zd^H~G?TKExDqmZ(?==b1SK??J=VzN;JKMUxHV?$E-ED8!E<`~9dg#bypjemkQZF21 z>w{~3aIFt6RDzyQ;Uydm`zmq|Gcwoyw46KSoLGb~2B;!&V-PB*ug9R&-N+|V$~Fw+ z-BM(lE>G4Xf0ls&wb)q18w)(}rY^X=IBBr%Uz_ay{Jb#D2r(DL@Gom#ExJ7XJp0&t zv%yC9^XEjEM(|~xDG`D%H~=r`qtpf~Hm02&g%@BfJr*ziM#VZoi>Wc2!NI{~IvF2~ z`qSCLbg_U3vjtl87SrAYAr!f!t|(T$*Yjf7w8Kenf7+kJ-od0lHx5Q)I6j!`z3Bm5 z^u~+6KA51f5s%`|fp`twJ0>jIL?3M6z4f>9iL-PPad~`0Q#&lTk`w0;7W>2Nxo^y1hA&l*H1+D{UvK?0|K?{IiH>Q4uw7+U>F zzc=X*4u_LQF$;U^NwFIyup15r{lQ>7Ivn)k==FxZ!`Yxe?)OGY2p-5WoTM;}q|r+; z93?QEj7EdexHlV(5*Wq^zDW!x)5HF3e{?wEYa_vMygv*u*+T|6+-nAy?mYv{_M8Ep zI#JC)Fj=;$p_*#g{q&So2U)xtdHj;P;F-~D6+xql;N{6ZDg5`0+>?@jugLwW6L`*` zVb~bysD{Yz?VHH2flw2>ft)3+fmx!rBI!RG%to`x;b1n2As2o8e8?qb|8zW^f6a!Y z@oW%Z(8%NGL$0Fa-v!mzlKeZOdetq!i%@-13G5ZsCsn{6QGG-Kc;_blW)(o{(Mu}; zRfL{j0jOeDQUUB0at#>&yF;!y1yGynn^pi#Q2lNcKtpTSz%F2S$ThGB*cEbV1u$rx zK0nHNK!9GaVP|7g=K+J>sMqh!e@2t>q&*MVCkA*W=K(Lq0IKH!FU0^6wO~LBb!@bL zq1G?d`h{A*Q0o`^!Tdt}Y7&|B@ApR2@!=$~%HFdE_b+lCpHu)Zi%nYeza%zk7tl*$ zllJ+%BsNKD{<7F41^UZklNRMKiA~z2^OD%4eK;?NO+-3}2@efB?tcgie|_2;4|@}T zleTkHC8U@li9PA{2ea{L&>zLEsMxNpdE68Q_@Fl!&wA6*V49e?;o)dFosEa1!=`PO z9Q0cIyp(;uH#DD=?|Vh_DRI9~G%uC^b^P`cG&3AYFQ@>NG1{@`z7A?-&u&8pWd?c; zdj(7SX|f!vvFFc-UvsLUe?Iv)tqU3<{|5Z_J0$;<#lL6dpHvF_MgB3ZVBI4J*(TQE z#x@{DZCuZbIq=)Ko;I$hjq7RSdR{87N1_bc7@ud^DYP*@dmQ4>#`v@`K5dMTP!SGV zBI5FrH+N{;9wfZbPN5C;X+wR!r=x_uqWU(}r}j=Ewn=EUK&u5>e=X2zfmRFrU|L{9 zT<t5|iT!@t*J1zrN+DFA- uE`2pnw_i3sPoAqYdUID&?rHV+QE#X{J>5S2zW@LL|NnV423Sau1OotVWTW2z diff --git a/documentation/en/api-v0-methods-miner.md b/documentation/en/api-v0-methods-miner.md index 32912980b..8960857bc 100644 --- a/documentation/en/api-v0-methods-miner.md +++ b/documentation/en/api-v0-methods-miner.md @@ -3153,9 +3153,9 @@ Response: ``` ### SectorReceive -There are not yet any comments for this method. -Perms: + +Perms: admin Inputs: ```json From 2b644525f8a02e1fa1878c8acaa68b7a64550259 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 30 Aug 2022 21:45:36 +0200 Subject: [PATCH 148/185] sector import: More check progress --- storage/pipeline/receive.go | 61 +++++++++++++++++++++++++++++-------- 1 file changed, 49 insertions(+), 12 deletions(-) diff --git a/storage/pipeline/receive.go b/storage/pipeline/receive.go index 134e3b7eb..1d6813ae8 100644 --- a/storage/pipeline/receive.go +++ b/storage/pipeline/receive.go @@ -2,6 +2,8 @@ package sealing import ( "context" + "errors" + cbg "github.com/whyrusleeping/cbor-gen" "github.com/ipfs/go-datastore" "golang.org/x/xerrors" @@ -17,6 +19,15 @@ func (m *Sealing) Receive(ctx context.Context, meta api.RemoteSectorMeta) error return err } + err := m.sectors.Get(uint64(meta.Sector.Number)).Get(&cbg.Deferred{}) + if errors.Is(err, datastore.ErrNotFound) { + + } else if err != nil { + return xerrors.Errorf("checking if sector exists: %w", err) + } else if err == nil { + return xerrors.Errorf("sector %d state already exists", meta.Sector.Number) + } + panic("impl me") } @@ -54,27 +65,53 @@ func (m *Sealing) checkSectorMeta(ctx context.Context, meta api.RemoteSectorMeta } } + var info SectorInfo + switch SectorState(meta.State) { - case Packing: - if err := checkPieces(ctx, m.maddr, meta.Sector.Number, meta.Pieces, m.Api, false); err != nil { - return xerrors.Errorf("checking pieces: %w", err) - } - - fallthrough - case GetTicket: - - fallthrough - case PreCommitting: + case Proving, Available: + // todo possibly check + info.CommitMessage = meta.CommitMessage fallthrough case SubmitCommit: + info.PreCommitInfo = meta.PreCommitInfo + info.PreCommitDeposit = meta.PreCommitDeposit + info.PreCommitMessage = meta.PreCommitMessage + info.PreCommitTipSet = meta.PreCommitTipSet + + // todo check + info.SeedValue = meta.SeedValue + info.SeedEpoch = meta.SeedEpoch + + // todo validate + info.Proof = meta.CommitProof fallthrough - case Proving, Available: + case PreCommitting: + info.TicketValue = meta.TicketValue + info.TicketEpoch = meta.TicketEpoch + + info.PreCommit1Out = meta.PreCommit1Out + + info.CommD = meta.CommD // todo check cid prefixes + info.CommR = meta.CommR + + fallthrough + case GetTicket: + fallthrough + case Packing: + // todo check num free + info.State = SectorState(meta.State) // todo dedupe states + info.SectorNumber = meta.Sector.Number + info.Pieces = meta.Pieces + info.SectorType = meta.Type + + if err := checkPieces(ctx, m.maddr, meta.Sector.Number, meta.Pieces, m.Api, false); err != nil { + return xerrors.Errorf("checking pieces: %w", err) + } return nil default: return xerrors.Errorf("imported sector State in not supported") } - } From 39e4845f42eaa15506ae9841e3b430924f11a301 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 31 Aug 2022 12:43:40 +0200 Subject: [PATCH 149/185] sector import: Put the imported sector into the sealing pipeline --- cmd/lotus-miner/info.go | 2 ++ storage/pipeline/fsm.go | 8 +++++ storage/pipeline/fsm_events.go | 12 ++++++++ storage/pipeline/receive.go | 53 ++++++++++++++++++++------------ storage/pipeline/sector_state.go | 6 +++- storage/pipeline/types.go | 2 +- 6 files changed, 61 insertions(+), 22 deletions(-) diff --git a/cmd/lotus-miner/info.go b/cmd/lotus-miner/info.go index e8cbfd8b7..ecce9c6c2 100644 --- a/cmd/lotus-miner/info.go +++ b/cmd/lotus-miner/info.go @@ -498,6 +498,8 @@ var stateList = []stateMeta{ {col: color.FgGreen, state: sealing.Available}, {col: color.FgGreen, state: sealing.UpdateActivating}, + {col: color.FgMagenta, state: sealing.ReceiveSector}, + {col: color.FgBlue, state: sealing.Empty}, {col: color.FgBlue, state: sealing.WaitDeals}, {col: color.FgBlue, state: sealing.AddPiece}, diff --git a/storage/pipeline/fsm.go b/storage/pipeline/fsm.go index 3df57a501..59e99bc59 100644 --- a/storage/pipeline/fsm.go +++ b/storage/pipeline/fsm.go @@ -40,6 +40,11 @@ func (m *Sealing) Plan(events []statemachine.Event, user interface{}) (interface } var fsmPlanners = map[SectorState]func(events []statemachine.Event, state *SectorInfo) (uint64, error){ + // external import + ReceiveSector: planOne( + onReturning(SectorReceived{}), + ), + // Sealing UndefinedSectorState: planOne( @@ -457,6 +462,9 @@ func (m *Sealing) plan(events []statemachine.Event, state *SectorInfo) (func(sta } switch state.State { + case ReceiveSector: + return m.handleReceiveSector, processed, nil + // Happy path case Empty: fallthrough diff --git a/storage/pipeline/fsm_events.go b/storage/pipeline/fsm_events.go index ac9c5775d..ec87f8e38 100644 --- a/storage/pipeline/fsm_events.go +++ b/storage/pipeline/fsm_events.go @@ -526,3 +526,15 @@ type SectorRemoveFailed struct{ error } func (evt SectorRemoveFailed) FormatError(xerrors.Printer) (next error) { return evt.error } func (evt SectorRemoveFailed) apply(*SectorInfo) {} + +type SectorReceive struct { + State SectorInfo +} + +func (evt SectorReceive) apply(state *SectorInfo) { + *state = evt.State +} + +type SectorReceived struct{} + +func (evt SectorReceived) apply(state *SectorInfo) {} diff --git a/storage/pipeline/receive.go b/storage/pipeline/receive.go index 1d6813ae8..4a70932a5 100644 --- a/storage/pipeline/receive.go +++ b/storage/pipeline/receive.go @@ -2,9 +2,7 @@ package sealing import ( "context" - "errors" - cbg "github.com/whyrusleeping/cbor-gen" - + "github.com/filecoin-project/go-statemachine" "github.com/ipfs/go-datastore" "golang.org/x/xerrors" @@ -15,23 +13,30 @@ import ( ) func (m *Sealing) Receive(ctx context.Context, meta api.RemoteSectorMeta) error { - if err := m.checkSectorMeta(ctx, meta); err != nil { + si, err := m.checkSectorMeta(ctx, meta) + if err != nil { return err } - err := m.sectors.Get(uint64(meta.Sector.Number)).Get(&cbg.Deferred{}) - if errors.Is(err, datastore.ErrNotFound) { - - } else if err != nil { + exists, err := m.sectors.Has(uint64(meta.Sector.Number)) + if err != nil { return xerrors.Errorf("checking if sector exists: %w", err) - } else if err == nil { + } + if exists { return xerrors.Errorf("sector %d state already exists", meta.Sector.Number) } - panic("impl me") + err = m.sectors.Send(uint64(meta.Sector.Number), SectorReceive{ + State: si, + }) + if err != nil { + return xerrors.Errorf("receiving sector: %w", err) + } + + return nil } -func (m *Sealing) checkSectorMeta(ctx context.Context, meta api.RemoteSectorMeta) error { +func (m *Sealing) checkSectorMeta(ctx context.Context, meta api.RemoteSectorMeta) (SectorInfo, error) { { mid, err := address.IDFromAddress(m.maddr) if err != nil { @@ -39,7 +44,7 @@ func (m *Sealing) checkSectorMeta(ctx context.Context, meta api.RemoteSectorMeta } if meta.Sector.Miner != abi.ActorID(mid) { - return xerrors.Errorf("sector for wrong actor - expected actor id %d, sector was for actor %d", mid, meta.Sector.Miner) + return SectorInfo{}, xerrors.Errorf("sector for wrong actor - expected actor id %d, sector was for actor %d", mid, meta.Sector.Miner) } } @@ -47,21 +52,21 @@ func (m *Sealing) checkSectorMeta(ctx context.Context, meta api.RemoteSectorMeta // initial sanity check, doesn't prevent races _, err := m.GetSectorInfo(meta.Sector.Number) if err != nil && !xerrors.Is(err, datastore.ErrNotFound) { - return err + return SectorInfo{}, err } if err == nil { - return xerrors.Errorf("sector with ID %d already exists in the sealing pipeline", meta.Sector.Number) + return SectorInfo{}, xerrors.Errorf("sector with ID %d already exists in the sealing pipeline", meta.Sector.Number) } } { spt, err := m.currentSealProof(ctx) if err != nil { - return err + return SectorInfo{}, err } if meta.Type != spt { - return xerrors.Errorf("sector seal proof type doesn't match current seal proof type (%d!=%d)", meta.Type, spt) + return SectorInfo{}, xerrors.Errorf("sector seal proof type doesn't match current seal proof type (%d!=%d)", meta.Type, spt) } } @@ -101,17 +106,25 @@ func (m *Sealing) checkSectorMeta(ctx context.Context, meta api.RemoteSectorMeta fallthrough case Packing: // todo check num free - info.State = SectorState(meta.State) // todo dedupe states + info.Return = ReturnState(meta.State) // todo dedupe states + info.State = ReceiveSector + info.SectorNumber = meta.Sector.Number info.Pieces = meta.Pieces info.SectorType = meta.Type if err := checkPieces(ctx, m.maddr, meta.Sector.Number, meta.Pieces, m.Api, false); err != nil { - return xerrors.Errorf("checking pieces: %w", err) + return SectorInfo{}, xerrors.Errorf("checking pieces: %w", err) } - return nil + return info, nil default: - return xerrors.Errorf("imported sector State in not supported") + return SectorInfo{}, xerrors.Errorf("imported sector State in not supported") } } + +func (m *Sealing) handleReceiveSector(ctx statemachine.Context, sector SectorInfo) error { + // todo fetch stuff + + return ctx.Send(SectorReceived{}) +} diff --git a/storage/pipeline/sector_state.go b/storage/pipeline/sector_state.go index 4f81f5544..ad77fdbd5 100644 --- a/storage/pipeline/sector_state.go +++ b/storage/pipeline/sector_state.go @@ -63,6 +63,7 @@ var ExistSectorStateList = map[SectorState]struct{}{ ReleaseSectorKeyFailed: {}, FinalizeReplicaUpdateFailed: {}, AbortUpgrade: {}, + ReceiveSector: {}, } // cmd/lotus-miner/info.go defines CLI colors corresponding to these states @@ -113,6 +114,9 @@ const ( UpdateActivating SectorState = "UpdateActivating" ReleaseSectorKey SectorState = "ReleaseSectorKey" + // external import + ReceiveSector SectorState = "ReceiveSector" + // error modes FailedUnrecoverable SectorState = "FailedUnrecoverable" AddPieceFailed SectorState = "AddPieceFailed" @@ -153,7 +157,7 @@ func toStatState(st SectorState, finEarly bool) statSectorState { switch st { case UndefinedSectorState, Empty, WaitDeals, AddPiece, AddPieceFailed, SnapDealsWaitDeals, SnapDealsAddPiece: return sstStaging - case Packing, GetTicket, PreCommit1, PreCommit2, PreCommitting, PreCommitWait, SubmitPreCommitBatch, PreCommitBatchWait, WaitSeed, Committing, CommitFinalize, FinalizeSector, SnapDealsPacking, UpdateReplica, ProveReplicaUpdate, FinalizeReplicaUpdate: + case Packing, GetTicket, PreCommit1, PreCommit2, PreCommitting, PreCommitWait, SubmitPreCommitBatch, PreCommitBatchWait, WaitSeed, Committing, CommitFinalize, FinalizeSector, SnapDealsPacking, UpdateReplica, ProveReplicaUpdate, FinalizeReplicaUpdate, ReceiveSector: return sstSealing case SubmitCommit, CommitWait, SubmitCommitAggregate, CommitAggregateWait, SubmitReplicaUpdate, ReplicaUpdateWait: if finEarly { diff --git a/storage/pipeline/types.go b/storage/pipeline/types.go index 4f175ae61..0321d113f 100644 --- a/storage/pipeline/types.go +++ b/storage/pipeline/types.go @@ -86,7 +86,7 @@ type SectorInfo struct { // Faults FaultReportMsg *cid.Cid - // Recovery + // Recovery / Import Return ReturnState // Termination From fbb487ae2b649b92a2b911bb6fefaaec77f45bed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 31 Aug 2022 13:56:25 +0200 Subject: [PATCH 150/185] sector import: Plumbing for DownloadSectorData in the sealing system --- api/api_storage.go | 25 ++----- api/api_worker.go | 1 + api/docgen/docgen.go | 8 +++ api/proxy_gen.go | 26 ++++++++ build/openrpc/full.json.gz | Bin 28423 -> 28355 bytes build/openrpc/gateway.json.gz | Bin 5080 -> 4943 bytes build/openrpc/miner.json.gz | Bin 15711 -> 15751 bytes build/openrpc/worker.json.gz | Bin 5035 -> 5202 bytes documentation/en/api-v0-methods-miner.md | 25 +++++++ documentation/en/api-v0-methods-worker.md | 42 ++++++++++++ storage/pipeline/receive.go | 6 +- storage/sealer/ffiwrapper/sealer_cgo.go | 4 ++ storage/sealer/manager.go | 77 ++++++++++++++++++++++ storage/sealer/sealtasks/task.go | 13 ++-- storage/sealer/storiface/storage.go | 20 ++++++ storage/sealer/storiface/worker.go | 2 + storage/sealer/worker_local.go | 13 ++++ 17 files changed, 235 insertions(+), 27 deletions(-) diff --git a/api/api_storage.go b/api/api_storage.go index 32309f388..7ae95cde2 100644 --- a/api/api_storage.go +++ b/api/api_storage.go @@ -3,7 +3,6 @@ package api import ( "bytes" "context" - "net/http" "time" "github.com/google/uuid" @@ -170,6 +169,7 @@ type StorageMiner interface { ReturnMoveStorage(ctx context.Context, callID storiface.CallID, err *storiface.CallError) error //perm:admin retry:true ReturnUnsealPiece(ctx context.Context, callID storiface.CallID, err *storiface.CallError) error //perm:admin retry:true ReturnReadPiece(ctx context.Context, callID storiface.CallID, ok bool, err *storiface.CallError) error //perm:admin retry:true + ReturnDownloadSector(ctx context.Context, callID storiface.CallID, err *storiface.CallError) error //perm:admin retry:true ReturnFetch(ctx context.Context, callID storiface.CallID, err *storiface.CallError) error //perm:admin retry:true // SealingSchedDiag dumps internal sealing scheduler state @@ -563,11 +563,11 @@ type RemoteSectorMeta struct { // Sector urls - lotus will use those for fetching files into local storage // Required in all states - DataUnsealed *SectorData + DataUnsealed *storiface.SectorData // Required in PreCommitting and later - DataSealed *SectorData - DataCache *SectorData + DataSealed *storiface.SectorData + DataCache *storiface.SectorData //////// // SEALING SERVICE HOOKS @@ -575,20 +575,3 @@ type RemoteSectorMeta struct { // todo Commit1Provider // todo OnDone / OnStateChange } - -type SectorData struct { - // Local when set to true indicates to lotus that sector data is already - // available locally; When set lotus will skip fetching sector data, and - // only check that sector data exists in sector storage - Local bool - - // URL to the sector data - // For sealed/unsealed sector, lotus expects octet-stream - // For cache, lotus expects a tar archive with cache files (todo maybe use not-tar; specify what files with what paths must be present) - // Valid schemas: - // - http:// / https:// - URL string - - // optional http headers to use when requesting sector data - Headers http.Header -} diff --git a/api/api_worker.go b/api/api_worker.go index 609cb4271..4b56d1154 100644 --- a/api/api_worker.go +++ b/api/api_worker.go @@ -49,6 +49,7 @@ type Worker interface { MoveStorage(ctx context.Context, sector storiface.SectorRef, types storiface.SectorFileType) (storiface.CallID, error) //perm:admin UnsealPiece(context.Context, storiface.SectorRef, storiface.UnpaddedByteIndex, abi.UnpaddedPieceSize, abi.SealRandomness, cid.Cid) (storiface.CallID, error) //perm:admin Fetch(context.Context, storiface.SectorRef, storiface.SectorFileType, storiface.PathType, storiface.AcquireMode) (storiface.CallID, error) //perm:admin + DownloadSectorData(ctx context.Context, sector storiface.SectorRef, finalized bool, src map[storiface.SectorFileType]storiface.SectorData) (storiface.CallID, error) //perm:admin GenerateWinningPoSt(ctx context.Context, ppt abi.RegisteredPoStProof, mid abi.ActorID, sectors []storiface.PostSectorChallenge, randomness abi.PoStRandomness) ([]proof.PoStProof, error) //perm:admin GenerateWindowPoSt(ctx context.Context, ppt abi.RegisteredPoStProof, mid abi.ActorID, sectors []storiface.PostSectorChallenge, partitionIdx int, randomness abi.PoStRandomness) (storiface.WindowPoStResult, error) //perm:admin diff --git a/api/docgen/docgen.go b/api/docgen/docgen.go index 47192bfd9..e078cbe0f 100644 --- a/api/docgen/docgen.go +++ b/api/docgen/docgen.go @@ -344,6 +344,14 @@ func init() { addExample(http.Header{ "Authorization": []string{"Bearer ey.."}, }) + + addExample(map[storiface.SectorFileType]storiface.SectorData{ + storiface.FTSealed: { + Local: false, + URL: "https://example.com/sealingservice/sectors/s-f0123-12345", + Headers: nil, + }, + }) } func GetAPIType(name, pkg string) (i interface{}, t reflect.Type, permStruct []reflect.Type) { diff --git a/api/proxy_gen.go b/api/proxy_gen.go index 6cb86ce54..04e79c2de 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -778,6 +778,8 @@ type StorageMinerStruct struct { ReturnDataCid func(p0 context.Context, p1 storiface.CallID, p2 abi.PieceInfo, p3 *storiface.CallError) error `perm:"admin"` + ReturnDownloadSector func(p0 context.Context, p1 storiface.CallID, p2 *storiface.CallError) error `perm:"admin"` + ReturnFetch func(p0 context.Context, p1 storiface.CallID, p2 *storiface.CallError) error `perm:"admin"` ReturnFinalizeReplicaUpdate func(p0 context.Context, p1 storiface.CallID, p2 *storiface.CallError) error `perm:"admin"` @@ -953,6 +955,8 @@ type WorkerStruct struct { DataCid func(p0 context.Context, p1 abi.UnpaddedPieceSize, p2 storiface.Data) (storiface.CallID, error) `perm:"admin"` + DownloadSectorData func(p0 context.Context, p1 storiface.SectorRef, p2 bool, p3 map[storiface.SectorFileType]storiface.SectorData) (storiface.CallID, error) `perm:"admin"` + Enabled func(p0 context.Context) (bool, error) `perm:"admin"` Fetch func(p0 context.Context, p1 storiface.SectorRef, p2 storiface.SectorFileType, p3 storiface.PathType, p4 storiface.AcquireMode) (storiface.CallID, error) `perm:"admin"` @@ -4667,6 +4671,17 @@ func (s *StorageMinerStub) ReturnDataCid(p0 context.Context, p1 storiface.CallID return ErrNotSupported } +func (s *StorageMinerStruct) ReturnDownloadSector(p0 context.Context, p1 storiface.CallID, p2 *storiface.CallError) error { + if s.Internal.ReturnDownloadSector == nil { + return ErrNotSupported + } + return s.Internal.ReturnDownloadSector(p0, p1, p2) +} + +func (s *StorageMinerStub) ReturnDownloadSector(p0 context.Context, p1 storiface.CallID, p2 *storiface.CallError) error { + return ErrNotSupported +} + func (s *StorageMinerStruct) ReturnFetch(p0 context.Context, p1 storiface.CallID, p2 *storiface.CallError) error { if s.Internal.ReturnFetch == nil { return ErrNotSupported @@ -5536,6 +5551,17 @@ func (s *WorkerStub) DataCid(p0 context.Context, p1 abi.UnpaddedPieceSize, p2 st return *new(storiface.CallID), ErrNotSupported } +func (s *WorkerStruct) DownloadSectorData(p0 context.Context, p1 storiface.SectorRef, p2 bool, p3 map[storiface.SectorFileType]storiface.SectorData) (storiface.CallID, error) { + if s.Internal.DownloadSectorData == nil { + return *new(storiface.CallID), ErrNotSupported + } + return s.Internal.DownloadSectorData(p0, p1, p2, p3) +} + +func (s *WorkerStub) DownloadSectorData(p0 context.Context, p1 storiface.SectorRef, p2 bool, p3 map[storiface.SectorFileType]storiface.SectorData) (storiface.CallID, error) { + return *new(storiface.CallID), ErrNotSupported +} + func (s *WorkerStruct) Enabled(p0 context.Context) (bool, error) { if s.Internal.Enabled == nil { return false, ErrNotSupported diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 4d823b135b775d5c1fb538b9375e35941490c1f0..942fb190afe07f2f1df19e969c1a4b3db8e725ac 100644 GIT binary patch delta 25762 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�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 delta 25823 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Ñ{_A{2Gf`Yb0C-rWyl8yzAx35 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 diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index 4912f83066e10949969be4d4b166088da92f0aa2..2f9273ea76d6742fd51aa1b7520002c8fb22b20e 100644 GIT binary patch delta 14867 zcmV+uI_$;YdWU#fOX_wC%Y=5N=~rO0^; zZT!}DtjFztmWXth*8g`toXuw1(^IFIYELY(z{|$8E5Kw^aIA?e{fgEFR2*wpn}!3t zcYi|3#dDl|TTaE_v{NTO&({k>TFQ3ZT&5k_!mPG%XhACR}HxfMSv+Psw06Grbvfo*w zYY%wl)O_>X%`MABkVIN0Cn~FHdYN0pH-AkCErEV|Rnl|R>-P$z=N01r#$Qo=(HX+X zkeeM~_d!xqgEw%FyWw}G!Zd7JWDmq(Ru`qQaWK3a%hF)d?f(92|4b7mHl^t?BwyzY z!8cXOW<5tv3e0c(F~BZ>AZQX9_HZ;D&kl#v;beLn4$f=&eKY5vU%;GyV!ARM_$}}b znvm!XI5Yt$mrdumdu`nza=f-Sgqb`#Ho7O+DCN&Y2L(*(L9EW5=`rM!VFPP_mbi(p zt(>^&J)flU=pu!8_`F26a6%>&oEeBvyucZ9<^;3lupQ(gLfMMA$XpzVHgimtf+^S% zi={^fzyY)_IHOENEi7k^3^3mU2>uXT?GAw8#4?Z$-aM?Zz5v< zXZC3=aT$Y9BquM?5;OdeabaE23&*k+9bgZ@ms^)w4qiYVd8+Xeu{T41z|7*Gz?(I+ zzl3^IsJ>gVDn(*8hFF1oEdXCh<|ZeC4V(>-4Q01>QTF8S%($p;QiP)zq+sd>q({RXwPUUA4MnGr z!YmU;O7Fx#6e*t1#D<1}j0=o(BsS0X0EE(pf$%oiyvZ3^ScQsZCDwDv_Bw!AO_wAG z=PQ$)E0WY??M#jIdxOzVG)a7A<+wQCU&+0hO}qgC1!T^5^sS7v;Y)JV?+phXjemP0 z)KVKpZ$+nVwEMz6MMB7Ryg}4cRo}BX9FGdcp>MX;7KR)^o|7yFLw~6h|e zlGLA>s8P;_vQv3lG~=?C?G@sjXf3p(X-A7%DcaG@fAA~XYDZ*anjPLA8LbM1y7qDe zbr};lhIvJK63#-sPivUpty<4%C6;DJIS16chkyQ4i>+84HJwt*yVxMa1Q@F>J(R`>yvS^TeeTgu*Q|3}Q;zpvh{bn>qi z`k#OPQ>!mtBE86nmna(Fv^6p?$9#?nbhht_ZW&A>FnQ^s$tZHjS+qB+%NBcTpG?Mu z_Q{`^7}f)u_a;V42qn)_*$_u*uFyaSG47327f<$=w5B+YfJ?&&+El? zvV_eMVo+#!6!%ld3W*KyTj#h zLmXs$JzPAJ(el6J;m{abqapp94D126A0JoFy}r6fLaIH_F;E$uW(fAu52R-M6hXtp z1ZhVjwiksC<$t3U6nRDr^eEn3-C^5iWB4-e^ts67qS%XSs-!A98n+ijfQ+yjj<|Y{ zyW4g2}V{)Huxvu1Q!b{WzhQzUoE;Q z%fX!-wNF9y#_(d6L!}6+S7uurPI7Du2SJM7LH%xH*MBoBA^`F%3hy{im8is|;aOidgmuQAMUZ@0Ap&%0nykmzFtN)qz=Y$- zScZSwTGU2`qZ_X+xQFHjX?0Khvvl%r8`I3NrTD{$?G@Nfrum&S_w+EExliHJrIv#} zp44LP@bm2W@-Mf3i>noMj7z=_MH_$+V4>xo0SC2`xgWzjo0Dz{9)FdXB->WZ7+Hpa znB7XsD&$T$Z4Q@kg5bzS@NcBA>DNOH?}kIeUAQYe863j-*AX5~CSzl<`RWY+Ubv(A z8X6PhaftEK_*?5}R~ubNZm7cFvqja8w3|(@H`MtO^FL7o8_$E8I)?3NzArK5F7&ZV z$8P@sI(#-QX7e+GDSw70{wgS^5zi-J)z<7e@R}<5d^Gd*eI6<}`0WBnz=nhm4B)aR z-5YX4g3llq54uHM>{1t43$Q>`UolZe5Dj9k4_MIgm0qkO0gqeWB-VI)64Xg^c7NMGkNfbuhYz zrpv#4E5buatY;ynJAYfyp^SIKEFo;a}b$b)edjNOib_56)KnL;A z)9B*hHQx?UWPffMrtsdv#tk|99YCGpdrY?+c|-%l%XX}LOqN}6MqG-Z;X&uXBYwm}0j7L4qewf*M9_Qb!N)GxxM;C4 zdAKfg)?i}`gHeb23W4~tGx9-yZ`k4_)}A%=C<=vSgMVC3H~~eh&^n+AbDKpC3y4h@ z;6+H=3`MaLfHTk)!{j&g09^J*_lBHNFgGpz&IKDnv6-Bp1t!>CaoST>=l83Q`h%Q2 z9be9#W0!IQsh6Rf1|wyKmW2><~$55=DB6#_c_?Rp#XDyfq&aDjv&@_Fy zct@-U!he{Z%ZSig1-}z>3*bG(Cf`C@gzs&`ohakyHFWL}bwe%Gx{;e1d6V7dnGIYf zth6I76k*5yTxok_?g|{G;uK$(t=k{w=1h%j@mJ%5$1(r8{VjYi3JCD(T(*GD;-P(I;Y zBHg-2PICuF6i{RDMHE^g180lKQ;tQ4ZFqfM!i`ft&1%>8eKYVlC#NK&QsMn+gM%ZGT43P_wDx#7j-m_` zM}N^syUNy(Y@lgwg}=)1z7oHLnPq!%|B8>kYd)IfBqN+6Xu2mBaj}7%-xmuL6Ljgj z_V~+sOjQat+q*KiEVFQjQwlem*Th0pVL6!r?4+2Kmr3~&>6QCRyoWiFs#%NVQDeKL z8wJ`P;YOkEkZcpkE24cKqMhc1K*g7c?0-byW_gl@CZSA_dKggeU%?@6yw z%fdDVvo)gKxv0%TT@mcF5bU6r7pM|lq0i(VIXqsmU82o~+XCTc1KtJk<_u|PaYw1RN=C01*0S;nC;2u4N6{nh z6B8pswIjb`G|&6HXBI{D**TmeQ-6%*ib5xmg!-Ns@dq9iT{u`r7s&BmYP|^b6U*eG z(+m^-LLicO96hu5>PM%$KZh>;Y#WRj6KI&wT}2-?sOl13sw(NU-t<3r2neD#@V$X^Cpg|;D441G@9lg zxw=J3c9i-m!jg50e!l)loxwOSQimxx!Eo4kXIlE5*+`?OK;@}-iQ4Yj01Neeo%-&% zc<)Hz=hYgIzInD19k-d~tzOa2CS~`(GRB_dMes1HzCv_I!3SlK^ZW^-40*8!p$v8_ zeg%mE?EDgzm#gah!);;@i+=)i(zMWy7q}R1yDU=f3U16G3FH-fydL(L7KH#sDWTPX ziW0zWF^F_rMFS4WMqjbW>tT^uQNU4(6xvrHGSM6L*<+{bBMWuK8n1>mhP|SYrU)Ul z9VAi;x+NB=5-U=lO>&2zSmpJwO1~(WDnbnHhNF}KZi!9gqf+WKNq-LdibY-ziwugw zwXP6t(OaDbE&s}opm0DbM@TxYtFu8CwmYYN<(S@Q$F!0e=cC~$CsK}ASVqnxjBf={J!3gv}tARy?06DN3pE^v^J z@I5j*H^k*dwYETq1Q^x>F)e5SOkKYMqlzB={-Z~gggGA#Cpn=WB9ia~5*?YRkiu&R z5_ge7b~0in4_Kb8F(8H1Yt!``pPll!avLG1%l{shZ8`J0ZGS423WigD^>i*$I)B8N zikFY|#~+l9_i8`{&(BUdcUg3W96l?pNu`|W-`QO@!<}4Z;}MEn0C<0JI{ekL{`~m$ z@$0Yu{=a+l%l}gQ<}&esSMhAFm&sPv`f){x4nB4iw+h%bR~V z*>{)|4dX>oM_`!q6vHL4T#EI2yMaQ8c~a0L;Ge*opEJHHiiIoeE?fE$Y*q<_D;rS0 ziB^o8U$)o<2AXe{OI{y2Rg6&II1aNhVuI2Iyb{*Zf%eMX61_EXxW9rVi;J^pB{ig+ zMlzGy5jP5Jav3tN%`bGR50e`b8Gmjr#hDwK3NcYdTfs|ldyR38`Io(3uYbV* zx$gCj_&@*FI+_P`r`k zjfz*?XQ`Qbch1E)rpkSLr*iou5z5P`_Zs1^{F<-Ptg8eQRX{kxRn-!qV%(EX@`>_N z*4u!AGKL@Fq3mL~9ye6E+&uWG7Bxf}r)oM>j3qP1BY3GEVx0XlV8%GG{ren+?0N2f z^YX?vt{l%rRZErjj<^)F{C|T$TSzf&O!P&TKQ*bz+0Rw>S$q~XBPtSZ+~klNQxes* zWuwHg630p$D{-vE@w1ELtQ_R;*%Ld>Nw^Zu!jFg^yLSy7uL3}Ja`DgJb$sGJr0x}7 zk|1F4*u5)vvkKrXdQ}5#cal*(Xd=B||>J z$MiF{#?k5^OfI?+<`G zJ6CV0Rc;aSP?eE{@!632A~vUzU(_pe!56Y}Wec$~QhFm?Wht!@r?BQ)Ge$TS7Fdv0 ztsCq+9)Y%1sp31<5`Uv!PEu7MHiMM9#_A#pDMxPvmu`BJQC3+*LAR?l5=iexePj$f ztuwM4$tViHV9mQN^_9YB;v&Xmp_;gW+chGT&%ix2g=;nO@QmmVf-d4RznTP3ftM-| zl-IpnZK3F>t4h$=1l5#suS7%)ax!KFk9g%F5j1O8!ps8HN`E=bEWqsqDy5KBg)v`y zXrn5Oxp$Ijn3Jd^c=Q~*v6z@9VMZxf`Ije$jXaM>xdoGgUUI2vs*6hHw(>``qk3Bz z2xs1Pnbk@v-ASE_|3IhWwQGHUz+!@g=rbTFjqCmOO@)Umj#F)d9 zSN@4U3eA9=j%u0&>Cx@TILJXe!%)a?sf>n}j0W+%Vn{$InA#I;w3C4q8V1w(5-do~ zlc5zL5LnzQWqozD56}(IGks#pb(7H*908e=?iDKnDRz?^79W3oGd#vjRc+3kRmpOh zg?4)iN``FN|EQ59omF?NK~vV3li>2K=}oY9RcxY^m9aua{?54U%4*=pNo8+Ya=%j> zM72Tu4mOAh6Q|;uMC_KT-+G$6ipwQXygR0yxB{2@!m}`{p%u4Uq$0%QO11qRcEn>K z@1&0zA$y+f^8rjh9Er0k-#wZ$^c>VZUb`?e~Ah!bQ~g1DzwXq$~03={9m4 z-0OIG{f(kWEDFslZV9uM@%9Iza-*L{lIJJz(!1hxagLTy-(ENtwRFqdde`4}erNfu z$qA9#wZ*5r@|H|;q{(%u8m|%;R29v_=MMpIw*B!1Ko$Rj;Ou%KE>(8q`>( zb0s+}Wa58k>MlX{=BY_Ue<&rhBCR4?vPwl2rci5nlbS~O1e#Q8=Mai_ndU9$KD;t} ze_B}K@IsVyXlm(4!DQR`krqr&mD}@CkOh`}0&WefJ%Rg9?DYheshLi{mr0Zg?J{-B zx1&=&CJj74)&+8~WpJ$XPhMhewWCQd_+P~Yv_^lL`8z#yP)>2>6yJNNxRezcmjY6g zpCM$vX`CC|;ui)AN<&Z_Ww}fduo^j@^=mR_%J0TrlnAZD!-Q6BFe}%f=h` za;`8IGk=L(#)K{1dyoO`SuQ@v=(ioh%pQ>J)dyKaRC>7v>fO=W|sf7ettytc$!3d^0}ny9KJsEeRpRtOAouH_ayan-a0 z-&I}-KF;uL9^LLcygVb68#{>yLjdQvd$NL<@V#CK*dzYv0vZM~g1v4B*yF6{rIO^T zpom{p`4J2?Y7sGv8Fo9BBGFls)Av2C%rk#gZ+lr}knAItY5OBia67a4xUaJXyKj^^ zfCL-ta1_Hq3xgPcw}VhBjdLI>0bh3k1=sE*y<#PGaTrL@em=-{pZKT9d>p?MGn4McX&z1CV z`ZN6iMrIGia(z3k2j^72RIPp>L2`er^+HoBrcTuleu%6?8=;}E?38_cm{T_-5W`_e zaU&fRfT^a1g3qM%P|&(vO%%ml>7pN57v(cUUMs0x_8w;HJY$ri${%>OL0sc$PL`>V zt>@UKC)i-DQZITd4JI$MG$_DdrbeQ`3NuH2g;iapB=Fr)W@xBLlKG#dDkguP<=Kir zj^)t3LKT)$H?J#wWIW4B9|fAMr#{D8#9^%6uA_WWu-9EEM|_P zoO!Svc`37F@XAf~d%a#q3yOcIRW#benpLIdv3x0+S7yLY`Z>|zmz=te4H1k`i*e#0 z^86xfONkdyN8J->nqB}nkA(*=7mEP*6@K4Te(SBS|e-ct3b zgM*X0?KZcBh>FZ;phE{aNd-b}oI(n-wmI@D)PwL68r18$9R(VWqg;Q6$o^?LcgPVC zTFZA*dR6IFrB{_+ReFDQkM-&>Cr`)ICe{NnEod}w?PLL}q-E>r)L4Hlsn+Bep5@|W zrA3t%Ez_b(o-29o$@5W8(u@#c9}wlqXLZFm|9%y__<8I}&z>$~b8PF=p^zfkvW zn&~tFgtK3p8f~yEjW$pkO=+~f)@TuqlB>gTAw#a`=vQWDSCGKBb+~@Osmr~u8)@+f7VYTp_^^})R~mc|HF(H5>eNbU zvDd1_CWX2Gp`dOOqY;5pQ;RhW$A}=%wgOY(7fOGD?WqD&5f@5#y=vVxEv#j5#cwW0 z?QFtAK(#d(YHKSNf@)8h#m1-fnbK!_sn3wwlPSIS`t{nZu%<&yTsPg8g@9`6H6f2q zu+bp@D~`wxl$zS4DW$fjN-g9cNjho!ERW6p3!V+uJs4D{f=YMqq3)jc3Ttu*s%@GF z5P^TP`-sg*XYFX_IQA-1Q>o;=P{~S$D;e&|@P1xRjt!xBjjlFxck6Q2sU^dcP_i!? z7T*MoitZXtK`gj%I03fOox@p}XUpw0Mgp1(=n4Thd`wr60_Y%s2%MX&cT50XVHaTH zQb=^vZG2&IV#ujQOTU+?x$p@S#%aQQ_WyrkGBd2X^$9w6h`PyY3@_<{+Eb1jv~q%{2bXgbWv)%JMu60LcejlVa@ zZ6tSMfb!(eW`m9H=g%^NCkC%20hGisUl4g8TZ zOj~2gD4&xZ~;C%reuxWBh z;UGqZ9bh@a4aP)=_tv!ZJFtHt6q{geIp~J?z4=l`d|S<7RwgD=i@q~i(eDjLb;X6` zVY_$pNn>r_{KPoMB9fk%i_P4`?&<^^+7Xj(9gPDx)sDua;XwRim|8A0*~h$(6X8Q? zCsH6Jf}?(qb@>N!@B$-)b?wi@iHQ-R+L5;C^#{X|*3m8;>mD1(i9UZjhjV0#;a*Yb z(D$~buNc^Vuiw$$6C?h>6JHk&*3kuWyq8)p0{z4?O-PZ$FySu*B8kUOVxF!%W0!{@ zl=lDB(SAk94r2~D5mfVK`D-QP7fP;VmBS-%_DeoWIFqs_t15(W&SZw@t$)={qBLDC zU?f7jGWdlwTN%X+daQp6BTAAo*k-dw)n4P=9Gofo8?g*0WSW^OkZLu8sWv59sK!}1 zJ-kj#!ah$}QI?$>HEdFfBk{6|2Y=SlyzjX5t|-6!Po>r>@S97o(<|9HALgV}dSQM% z8uf#@aqC@vpMsKobo}L(`*b2%%p6gdUF!1m7Xp@vN*9v@H9-a3jLUaygX zAw}jExQH0ctQ7CTT7*RiE8I7d;d1GqC8HOxupF;x_l8`02h+@=0(cRA3|;aM%0O4! zcV}^Q{&c0tps=aLlSd;qe^tc30GA3`$-vTvlu^n>?ECJ|Me!~XdC!MX)l7)=-tM_$ z{A@8x?!B@z{aH?SUX+zD5HUpTL^EON!O0Vcp}*_wR8|CfAPa?H6mD(77vf$n`h2AP zXc`Di>{4JYfbG5UL}1`&w7?v3A?AA;33{ZVF!aS;3nDH$85v?NfALyMl;uPm)D}Iv zJ(_>DtUT-GBqWLT{D|oLM;qys$!=(#ZXD=QOkJkVftbzS6t7X&Z&J?PIj{@(Jk~)C zHqReT5yR)d1^hAZ+GJsob-bK)%FhVDO>e( zas>hc;0upT*u=dbe+APP0|fwg%QaEFOIRhuDBusy7UG-@5cFVf4?G9C$0ax90b=TM z&RJUy0tSMn3+8CSelQ(Mp+jB&d|WZpelyb`Cum!c$S3IBeXyM7ht_dGvd7lJMI5E) z*KzpmoM5MLewL)0{Xb;hg9{miVB+ zR72|Q&yDB%=T z>*JLj3C+g2LCYR5d~i?`i`0XVpWWnOvMg0x9+Y+zRESbpw4~py;aIjCIxqyE^Sw}O z(M+C?Un*}PcGM9u?t&YXm2D?U{gc8-;@>vw%W$cif7o&fNZC4c4ec*t32*0^E-*5U z?mJ9Bus@^}YP5?2g<8~4J?)wpTM0|W&`h5d#Pw{1*WAY1v}ok1)h%f(qi4DP9Ciks zK6kno92ow{D(J8P39fS3mvK(YlEj{=Ug0W0VN-7-yVaDStK;sOQ`u2C0UAqp0jBLa{a4YL1Q z_sDUufq)Aah;D(tLi(NCy&-=<6B|HZK?mxT!C82KjsQIP+5yK0|L%a^!K?%R(*XzH zubM6P;?$BW+$Jxx#M>_;rCd(WCK0EFaatjNf1g+zQa1xQ1CoSn++ac{qo2T=CKih5 zt-wNQ)hr3dR_s^K#!*s$a_RM#&OZ4o-ipb(`4$*x0XHTEeEmhngzqE(ruBeadI0Ys zHsRbv2>@K2u24)~-;fVtA3`0h3q#5x;4elmtbdeR-&ZO?1v&1_cRw1mnITqga_*fz zf7na;IPUcdgSUdhs!c;#aBx71r{nQYTsj(GF#RQgF!L31)?D*C> z!_*6I4Vu0{d~0gz3PW78TGx(peTkS=6=eFNa;je#nHEr2^ElHasCGh4lTddVZJIFx zDT!1ba~evflCV=Qqg2SL3OOxj>_K5{f7~U~5pLwK@*w1G$S(QdyyJF6VX0rrgV&Bz zDnxGQRpF8YmCY%mkTQro*)dZ5P%Ekvcg^W@>g8g3NzJ?#^3gXfnpWI)=CYTk$aAfa zR3i1hB~mllb&d5qME~G++L5@o#eW!w7{3K3Xv&_Q`pe0FT>3wP5B%j9S3_9Ve}dCu zEJW>S=9j~7b-5YHOPE{=L3E4_7}?!+wD*rT_5witHkZgYp^i?V4RuVnK52N51@5N^ z8YU)4I~olVuP&fNg*ZsRi*jZ#N2iDjkbok*$3dat#FSoR`wCIc$gRv&63pBlx-06C z(eUnYIouEj8D9?j*NdG1Sdw}i7$CY!hukJ;;9_&1|!)uaw%NfV#co>sH1eNfMPVb?8+syxiqM{FZ1L^ozEg@51=PMUzovpBKW2 z&3uK4iY!6F*=evzP4%0z;fw?fd1R24ZqJEADwQ)%wXbu0QKo-=Bji#uf=7iB3PGFY zd&w<-ACto}doNE;OARGie~Glfc)vH=ghqcBtBNe+I6CT{EcXHO(|v zBc3iPgEi_e+cn<8al5-}UMeK*eB2urCNPWp78)IRFaWL9+4k;#Xz94aL#-@ZBys5k zze`F)a*10f#NfN&i~_?#JidVqT>NAm(v=ygo-6yXOFJhyU|2FB1rPXt_Hol2gQ%-%SM%#hvHl-ncNg`>LJV zJ6FZEck1zBN%5T;%ooK`g5yF2+VQ@Z_X0Q<{71f5OW)Yx86TOl#I~6lhCq z8Ar2}Eu#qJ-a3N`c)zyk7FZ7W6JmPGxsYG?IE#`j=HfuK znRDyHg8>c0L9UAofCFgU^@h2fzeWa_Zvg~e*3 zDc0HB0~_jh$Ow92tosvpzCrMbwOT=U)s0IOHtDsKANQ2cXN3vM0Vy|6Y)OJ@C$S|7 zb(e`P86%Jq1LcV=zNaW;b(PwpQd=6bcE4YkTkD?V+INlz-KyFjf1J&>90O>YY@@miTuRMr6{S%xWVAA~ILd5(PU=ps7Jp5=FeuF5e-)a@xI_yH-ew@>ivC65*5PXp_nj1R z&c?E+G+(@#OmgUK+UxZqR}Y?@a;r0X{orUiKAiMALDnb#{Zv-NuTFe@^?M6t!|LmY z$jTII_?~%tR2a(SGUc#o#N7fyjoTNzTf@)D!jj;4(M{M?{4` ze_3E-EdT^dd>>ps4(3~McKQQ3g7@^^hL9L?Zf&h_*LNt1W}S>=`=V^;+-z2U+81UU zt0a7tgrAv&&!8l7rxTxFA(8S@+$s!I59>0e9$X^oa81p#r7i!0o=BcM*5PN{fD|S3 zu%S!eJEA>}RC$f3rpU6XE5`&#aGSgJ3f5=nb^=UknwIy(HSw&Bfks?&T;T2 zu){mR9(mquzyXz|26L~jvd7&G*CTEjJCjwP8)*dMtC zTe&^sRc)>4X%dk4CYmh1+42XqyNU*dM-&CLzq7-Zes9zpPDd>qxuowcf6C<59gbws z#xO=X2VYUaB6kT3_kQnByhk|1v5FLLF;ZNmpPY~ThlMGcuGnxlGATHON+oe>$FPT%Y;IUzd@~*X5HV&iy4b*WsjhQor z*3NHHPZqd6SI zsm5zhXY!NpHXRK*+9&wvAt8RBKynog?tz584#G`7I@ZR{1bS?mN7lo&mH%pMXLI){ zBHNsoRbw}N6y&RU$C0b@T`*BuPU>*lvff5UT%|{U?yG#`9iOD)3nHs7<4+KjRHft4 zHUAbAzWH(sH+0p#K+YPw!fjD-ER+OaoEsJgTY6(Q-+Z~vG1N=hHNda<*5EAYb$B*99nmwSoMHw^9Q`r|K@kIH;e&@2a>6RP z*hD;mgr}3(NawKz+;i#|4fF3zH#)#_4CDyktnHu$auCr`_l8^uz?iN?Ex!kD3~|pZ z|NZ~79u^K_e_cQw0q7tPfP;+g4f)NY=m=b|unX3Rt}G)c*1NzaMUIF09J-=x-n!LB)b{taY=2*wr8LYdVIkJw6zL{(yt_=Ae^^T~K;;(G*=fQ`;tz&JHr2>W zk}dOB#xQBgZJ8WhGKl7x0%#u<~ZGdW(B~=u|tETfwUV@891CC|4uz3iew7+wZ;EbU6wiqKioN{0352&-$HsSSb z6O@=d9}f=mGMa=$_<)JgTug>g$|H~iTRqpGGEARQ`7W0DxsewcTjgvj#8mchD%nY$ zBdXZ^$hm0J_!g6~Ghu%MT>d$+D94qbh#@094J$hqi}#X5F2F4fI1?T?TZohk+e9}6 za7_7mq05i;f~D#J#CD?mB+>6ew}^|y5h5lAzQ@Lfjj!Y7Xlw|!2(M;mnqtvd2f@Xh z0P4E6URyj|p92s24tj_zTI(_PN^O=UukE|qEX`T_?#@g1$w_}$s9TE9NHbbL+ezs= z=pva@)RI%v3kM5)#m^Tz53PRC7*4=`ABg50ZUz&d)s;HQY-D0j^OE}ntA0fE+|uuA z7VeG1$S$^#lo7nCgfZ+xEii>MLDw;XBO};Jf$mI1OSQ1yO2%LjZNnWD>vg5Ae?haPVpBqf?7&O=eipC%{mER+|ghscj-Kv3Hz$;#bLiV zm9cS5OI|cf7UK)CEW_^kaV^>W?uE_N;c^fE=V9|8>ZOFaD@4c0vb6TrfE2#9Azf)D z?3&P`uZ@2thQ;ZI=azogkR$HeInk{j1jBG>Dg4D7&a(x+s8g{YV^$PigIjV+2eq&!Lbb1H^VE}tk4y(Jl$Lit(3+JCO@dFl^mGYEU5gTZ7lJ{XPW z{ew9)MhA1FcQ_x<=7WJg+D(k0$}o90P8}C#m|TA%M%KR|XwpV`CQ&#QvQ7L4;zI#M zhHb;nT4UN6{wfnC7uV=g$=)eRA?LxiDnWI$jO+I*T6lTaj`_H%Qd6i|sj0^If++EQ zJ|0erbCJ9rCvBj<%3f`IOT&2m7wQScnL?tzKYyw zPUhO5mUD-k6N?bW0Cgm83_|Vn^%#_<8~G$k`G#S0$?nh33$vUMb3qLMvgY-o%fo-q^N+nZ8*Fqxe@=vH1YZ`J5+V4K1MreQ zDs8Z0W7^qKcnQXt$KvJR$XF+6F*Rm0I5?P0C*y-re>yvuE*9`$wm^&CV%nP^gd&&J zmBp&}dR`2hb~x!x`*YYknDpny!DtM}2XnnQJ%Eeec+uAf6ErsBQQQR(uc3R#qy>M1 z=G*(;TgFrTQscMG{H2| zsiEQgQ9Xl-%S5?E#pQj|o{IaX@u2>g{1!^0qn#~@<)BOCS{p}?$c4z0Z`voczF2Kt ztV2^f8XS(MhljJ?WHuUg*el`b8uUkpqv>!mn(~KN575?*`h)3oH0$-J(`kP%c${v3 za`D;KjwYjy_L2YfMS~wNK7;;nc&ObbaIr0yGDZ1-iD5n1{)PBGPkensYl}_VpvMt` zkMRc|FFt>!*u-Cfyv9`o?h(VS4(hqxBQ0 zOo!9yq!-5~c-A69(SDLR4HA=vITe4jidooOFB7|A0=wa0&>sxOqr*Wjj$UurJDd&r z<9=@>h2TLphLaSAku>^D3`YqJC!^6|H15qtqXdRAf^QSU$@H*48y!yg+GJoj-X8{- z>>&dj?ll8U_nrY}d(Hq)ov3CYm@JiQsHYlsKRs2|K_0J09>1h6cxLpJB4~eA5xhLP zCx!o>k$Y0|?-jW}bpp>BGz=Rf9W@a7y?qn;4G?N$H&C#o4KPdeRwn&NgV|^{IULL; zG326;pAWgD?4OROv)OPoo(GPwU2L$N#T6Q+JbsjM2je7mwY&029)Oo-@F~BQ14|p*K zkUbB0DF%qB1p`v3V?+6clwU~sg_K`N`GtNkzYxEgBuo1Dd!y<2aFTymW$#&w`eG}BGp52BH${h4s_6kZ9s}tT+fR+@Ks!oitABvJu0r}rQ&~jGL(Ue@p+b=f{O9k z;}8cGM5e`}+;_{L=cWA2)5?*MhphA6AsL%Iwl(1J+uR?tq?-XL21f>O( z7EoG1X#u4LelRVtA+C2Dx)T2?nn*k4)`n0I>QhNU?Fx04{a$1WEeAsh${+i; zRy;*e|CavHFZ$YAeeYzc*erx%udB=mFZ?PqA0NGzLEZ2aqRBenvGTQ2S3>#qYb!LC zz3(YfGFS4_sYvbHeBx_|E)zT_xg0ST&mhDE!%AMtRRu?hq)@5;4VOAnpH-P2nY!-v zp2US%1+wEZP^NuU{1wty3w8Um#^=d%c}8#VO3Hn${@$NzPfxc`|1SUl|Npx}u{kmd F0|2U=zT5x+ delta 14848 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 diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index f0d2db3c69241b2c6b7cfd999ad7f49e94f7a063..2a35ab13436378a088b78f9d6a1f6cc745c78365 100644 GIT binary patch literal 5202 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 M|2}5G{{S%o0313bApigX literal 5035 zcmV;c6IARUiwFP!00000|Lk3DbECME|0*i(&CC{YFyNEAPPm=8*;yQ+OCUrY%r!UD8 zCR1BFdy*)o7Lv}S-)-u9;PPS&K3<$lvh;vl58EUt(H(Tu6B9j1D_L3~I=4+vI=gw2 z2wbqDzhMg*HYS~qrg?#pfh1Wnk!QHrp)VV?iwcSfJm4Tyzn>#qcoonJi(?nqvSNJEA zfun(6YA5JOy6ooKWNvXl;53K70TKTj3+O z)J4>H3HXJe$4qtaW$>%({$bNA-*If0B9oO_v45gsIrYDD6xMatP1YSI`1@P3x+UMg zf0ty*^A`)~E~PU`k|hVaa1oBB@3QwXS)Mqyhl8guA(Ti^oPHgu)jttS-Nm-d-~VXLDJc9btg;EGy}n)b>Z3$ zaw%r@Orhl=S#n~R)-`h!h=kbcGzkTfB^n5@{(H3*ard*U%@up{4>G8f>=Z`@H|rYi zRc(=ul-_vuG$WP*Xo=^1A?^b+%8KBt;x6>QnurRro zWXX3e=}eka>Ud|Tr?cRZj$toOrx9y7aa^0pb!ssNayqf>$>{=m6uGC+!KaRE|5*Ot z43W;v{*T{#`l!qLl;s}Gu*TTrq#jYJBIZ%VBGkiJMAT|iBx2jCHHXOO4%k?mAp|Pf_z-_pby_EX3=&qf$Ap`#pF!v2Cl&14o7PJ#aW; z91eFY%E6PgJiBL|$qY_(akqUlEs1$XRt`b(!d0oO<*U+fh#GTFMGDIB#vanwnFMS` z7z7`-H!mQaN0;M~hmS@u@Lz2caZ-ms*rtfXdL%^XL4+PE5Tc~!H%IMi;C0!^Le@qr zX`SRDXkjvwVnTV;4X)G~Cy057YH}^?2eh|Pf^7=6`P$f~suxfMOrV8-qD$mh*nroL z2`TT2MQ$DZ%NN@_mypc3sX(3(jZuSw9+yWL1Vwn06d|M8)z&4Rq(7%q4^j4}R9%*W zfKl*!m0Ygi81;3HRfaumZ@)3ybMZp}uK?cH2E1CY9C)L5u^-}wg^vZbVXaML?52+b zTw7+U0$c^S3UC$RdOUE|`}yGd1rg*z8ezwOqvda|y@*yUd2qI{9$v^bu-O@7lM`qQ zn{Ntp%la$ew`IoM2KbHidUv!tFcLz+xrqqHQ=Aj|9%B=@ta%R+${e(Ztm#Sk%mkBJ zXmErAXqqnaJY)jAsjUOfDRb*n+g%_NOqKwGzr&0|M<7#FYSf%&tx%0%c-VMvF0!PzK?YEL6=q{PAw2!AbN=Cy+Jvmf5XJI zA1~}Hx+j!xD=15IyF@e0WJD%=GVrqjjIE zNu!IYQG+>viqgnh@eZA@Isv~zffu!>(%EqBV>fUj2e*+q4t;+eC@V`_5zlUP^-h+e z)vhoPaqoG5tlGL!DvLy$F{>11h>u|@6N`#Q^kbENA5|J#59ZVQ);hPU&LBoj{#eP%XjX)8mH^Qft0iDQBW-*eT(pIgeIhryCpyOmB+{%(Dc)J}oJG zRQexcDgS%*X>O4JnxlVx_z(A>U|k+Y@nVs9aPX=L3ah+6?8X`?!I2?m~q=VMwxx0k{NPw z!@X_fXf&<{m1`*<8jSM!&^ejfoCJs!$^TF){S7F4vW$(e`_&?Eo9eh2NF-?^-%;fW zS2i%EkD5sCX+|yZ`trAUUzM_TA zx~eMrP?o;JAIS?}F0QXBw(w6F4p}#N<^sA5B`xeNaxQ(jxR%ZoS^5M$l-I)8CWi02 zh*0TFS;7+B>$5JJJXJ;N9d%*lUjg^jl~EgH{{Bu=NHoYPkWd_GCba$_&)<;NSDgYJMeEZb&?>D@LqLnPJ_Z1Wy;xv++N~D=GMA1G096Hg zegLQ{87Ba=O1K)xe{;gs2LK0aecb?1ht@X(05!e48fF2_30K1$pef<90HBJX&s$j! z*oddp9Biy>JwR1-rK^neey=aq1KMN&uVg*oXa-PqJ>Xad5Q7C1QfOdP#Dzp$NW_Ii zTu8))-dJ2{8tki_jN|TNG98;RK zH$Sd4X@`DXX|k^Tn9^iJI>(eI8^bxCG%@e&xTu-H{hMIuL#3xF{q-cRajLS_m|Y&b zuXNQ>PglEol0_wEZS~7m(SfUq+8ZfDT^*(dP8;ajaMaWELET)XL_ERIx%hc&bUy9h zTcz_Eci$$R&-MR@#O-s$EC?hW5dbPn)Nthf5Yc$oZnpu-0`Y2&3UbD2iUO;N>(3}( zeNb??`qzyGwWxm$ar*|0e4~-)+$YG zHfH5`INZ3kVu9)pC--=Tlp>d0Bu1|D%Z^(dZy}{y6<BY5zuFJzirOv=P9)&j4Leqn_f*^TbtcVU!LgZK z$K1vwXzF0wWGBT@wyitN=lDn27AbRcCzkAcT!}dMRh;|!%5bf(bn|iT0@At1iD*HY z`~x21hxtT!z@9Ecr=YgdGp2H@a3Np1J= z6O7i?=1s%4jpW^p&K63~n__*)xx4P|e!%v+&T;8?)dE9zZ3B7U74p1Lr@1UXQ8?f9 zeIJ{h>+5nVnyjeA>NmCV*?C&de1i`QGGuduvz-8I2-s8b81x!=VR;$Mq7&-O=s{}< z9_NTe&)pIyY!7%8y41TR2YQlCr!%i7ey73_RF&95BS%#2#{bu0W~x?bW)J8xT+|Ma zFw4$dcG_CH2Htt2fz8eso58V>+u!>7H|O**N1&#rk@| zHv|$0#~jfHPfY_Pj04m9qOxoL$4p&m#~0Kr%G)Es*API8i4 z&taA^4iwR<8V>dpZ>Ak@CVR4_cr!D!XdD*a9GaHtH(~Fgj z+WH$3Y*{eiH{QX7S$#gjtmY7A)@TVnfyG{12IAV~8Icr$`DxAo2RO3)_{ysNFR zWKXA0E`MaCuJJg2!TtsNf644$@8z@qOJpJFq3a;IADNuYKUJES^~YCRFCm%nCQYT9 zZ;HTYdnuBqT4t_oAnX}!u9`LQ=XB~J%HEW!%hDD8iNfFeukNpFtTOCjd(XNqF922m z>}vzqUcU%n7xn{hK5|&72u|SyN04y-`F#kF`RK?h$p=Lq@QXxYP3Pm?I&b+D{7L7? zUrO1AUq7RKbA-2NoRoV3-~Z^I`f5L2DcwN5GqC87s*P(II<;)@6_tOpxaVtIOE3+0vCPe62Sos_Wfs~74xOjSFOgRY#1n}3 z$`Eg$6zmhl-1>!!_K!$y3)d8sI&3*9DN>VQnCN&sz9cZQB{tj!Ond`zB@t;6>t=$e z2%=ICQRxBt$9s_+Z=M0=oAepmVgg3g`h8 z-aB1eM+f|2Q$XjC{ewN=Axbfs-I4`d0t)XDfMALqfrkv6m>!@uVD25xAVusC3cY*4 z)ZO&08b5Vlqgu(Rn1;q!!+Kj*@hw4Ro6!sQ!MU3I)U+SDktQmZ3pK@N5|ujGNVcu# zo5x=+p3RU8yy(G$(c#VMORwO|>FBGckER*ye9Wsh$EC5E6HDs;8c2tq|a zQTuA|MAs+XlL<8SlZmMeCcV)_RSkV_v?yJ35n+wzve99;AldCN=-qz~gI}DM87o;x z!Vt75^zOZ&nef=dLR*a0cc=v>MQfgdWx83BjzveO8^LPhsVXShAsVh0WJ$1h5{7{H zQ1Gx|ZTcNnSBH9U1QXi*CbU~CSpQtV6W#*=H|0vE8krZ*XtZz8r&ZaMV^j04`9^W| zT=R~2PYQzE(G%e0)>jk_f$+4sgJa!0dXYaXDSf`m>|||MOiS0Mb@sH{F$F2jPQ+apEK@!_dhy=Wf33wU9*u7ypPew@md}&2jw4uK5DbqXmmdF@#gFR8}=tg$a zh*$TuMs@=RaV&s1OG_lHie%N=2xqS#hbXdTPO=%5%Acrh+(R+diykSVdC?PG>~1Sn zBP%^cL$$r$5RPiyp|0$Wq%Bp*enFDbH;C!Ke2gfkN^Z*WC2(wt9U1|Px1X Date: Wed, 31 Aug 2022 19:34:08 +0200 Subject: [PATCH 151/185] sector import: Sector data download --- build/openrpc/miner.json.gz | Bin 15751 -> 15794 bytes build/openrpc/worker.json.gz | Bin 5202 -> 5244 bytes storage/paths/fetch.go | 104 ++++++++++++++++++++++++ storage/paths/remote.go | 62 +------------- storage/sealer/ffiwrapper/sealer_cgo.go | 32 +++++++- storage/sealer/tarutil/systar.go | 20 +++-- 6 files changed, 150 insertions(+), 68 deletions(-) create mode 100644 storage/paths/fetch.go diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index 2f9273ea76d6742fd51aa1b7520002c8fb22b20e..30cd2019132fbd79c8a551d954c3a5aad52f9bee 100644 GIT binary patch delta 15304 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 Ju{kmd0|4V`bv6J1 diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index 2a35ab13436378a088b78f9d6a1f6cc745c78365..76d71cb4c69e880e20c466b9fc20202b66dbad68 100644 GIT binary patch delta 5221 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 delta 5174 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 %s", url, outname) + + req, err := http.NewRequest("GET", url, nil) + if err != nil { + return xerrors.Errorf("request: %w", err) + } + req.Header = header + req = req.WithContext(ctx) + + resp, err := http.DefaultClient.Do(req) + if err != nil { + return xerrors.Errorf("do request: %w", err) + } + defer resp.Body.Close() // nolint + + if resp.StatusCode != 200 { + return xerrors.Errorf("non-200 code: %d", resp.StatusCode) + } + + start := time.Now() + var bytes int64 + defer func() { + took := time.Now().Sub(start) + mibps := float64(bytes) / 1024 / 1024 * float64(time.Second) / float64(took) + log.Infow("Fetch done", "url", url, "out", outname, "took", took.Round(time.Millisecond), "bytes", bytes, "MiB/s", mibps, "err", rerr) + }() + + mediatype, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) + if err != nil { + return xerrors.Errorf("parse media type: %w", err) + } + + if err := os.RemoveAll(outname); err != nil { + return xerrors.Errorf("removing dest: %w", err) + } + + switch mediatype { + case "application/x-tar": + bytes, err = tarutil.ExtractTar(resp.Body, outname, make([]byte, CopyBuf)) + return err + case "application/octet-stream": + f, err := os.Create(outname) + if err != nil { + return err + } + bytes, err = io.CopyBuffer(f, resp.Body, make([]byte, CopyBuf)) + if err != nil { + f.Close() // nolint + return err + } + return f.Close() + default: + return xerrors.Errorf("unknown content type: '%s'", mediatype) + } +} + +// FetchWithTemp fetches data into a temp 'fetching' directory, then moves the file to destination +func FetchWithTemp(ctx context.Context, urls []string, dest string, header http.Header) (string, error) { + var merr error + for _, url := range urls { + tempDest, err := tempFetchDest(dest, true) + if err != nil { + return "", err + } + + if err := os.RemoveAll(dest); err != nil { + return "", xerrors.Errorf("removing dest: %w", err) + } + + err = fetch(ctx, url, tempDest, header) + if err != nil { + merr = multierror.Append(merr, xerrors.Errorf("fetch error %s -> %s: %w", url, tempDest, err)) + continue + } + + if err := move(tempDest, dest); err != nil { + return "", xerrors.Errorf("fetch move error %s -> %s: %w", tempDest, dest, err) + } + + if merr != nil { + log.Warnw("acquireFromRemote encountered errors when fetching sector from remote", "errors", merr) + } + return url, nil + } + + return "", xerrors.Errorf("failed to fetch sector file (tried %v): %w", urls, merr) +} diff --git a/storage/paths/remote.go b/storage/paths/remote.go index 331f2cf7a..06d1080b3 100644 --- a/storage/paths/remote.go +++ b/storage/paths/remote.go @@ -7,7 +7,6 @@ import ( "io" "io/ioutil" "math/bits" - "mime" "net/http" "net/url" "os" @@ -24,7 +23,6 @@ import ( "github.com/filecoin-project/lotus/storage/sealer/fsutil" "github.com/filecoin-project/lotus/storage/sealer/storiface" - "github.com/filecoin-project/lotus/storage/sealer/tarutil" ) var FetchTempSubdir = "fetching" @@ -236,7 +234,7 @@ func (r *Remote) acquireFromRemote(ctx context.Context, s abi.SectorID, fileType return "", xerrors.Errorf("removing dest: %w", err) } - err = r.fetch(ctx, url, tempDest) + err = r.fetchThrottled(ctx, url, tempDest) if err != nil { merr = multierror.Append(merr, xerrors.Errorf("fetch error %s (storage %s) -> %s: %w", url, info.ID, tempDest, err)) continue @@ -256,9 +254,7 @@ func (r *Remote) acquireFromRemote(ctx context.Context, s abi.SectorID, fileType return "", xerrors.Errorf("failed to acquire sector %v from remote (tried %v): %w", s, si, merr) } -func (r *Remote) fetch(ctx context.Context, url, outname string) error { - log.Infof("Fetch %s -> %s", url, outname) - +func (r *Remote) fetchThrottled(ctx context.Context, url, outname string) (rerr error) { if len(r.limit) >= cap(r.limit) { log.Infof("Throttling fetch, %d already running", len(r.limit)) } @@ -274,59 +270,7 @@ func (r *Remote) fetch(ctx context.Context, url, outname string) error { return xerrors.Errorf("context error while waiting for fetch limiter: %w", ctx.Err()) } - req, err := http.NewRequest("GET", url, nil) - if err != nil { - return xerrors.Errorf("request: %w", err) - } - req.Header = r.auth - req = req.WithContext(ctx) - - resp, err := http.DefaultClient.Do(req) - if err != nil { - return xerrors.Errorf("do request: %w", err) - } - defer resp.Body.Close() // nolint - - if resp.StatusCode != 200 { - return xerrors.Errorf("non-200 code: %d", resp.StatusCode) - } - - /*bar := pb.New64(w.sizeForType(typ)) - bar.ShowPercent = true - bar.ShowSpeed = true - bar.Units = pb.U_BYTES - - barreader := bar.NewProxyReader(resp.Body) - - bar.Start() - defer bar.Finish()*/ - - mediatype, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) - if err != nil { - return xerrors.Errorf("parse media type: %w", err) - } - - if err := os.RemoveAll(outname); err != nil { - return xerrors.Errorf("removing dest: %w", err) - } - - switch mediatype { - case "application/x-tar": - return tarutil.ExtractTar(resp.Body, outname, make([]byte, CopyBuf)) - case "application/octet-stream": - f, err := os.Create(outname) - if err != nil { - return err - } - _, err = io.CopyBuffer(f, resp.Body, make([]byte, CopyBuf)) - if err != nil { - f.Close() // nolint - return err - } - return f.Close() - default: - return xerrors.Errorf("unknown content type: '%s'", mediatype) - } + return fetch(ctx, url, outname, r.auth) } func (r *Remote) checkAllocated(ctx context.Context, url string, spt abi.RegisteredSealProof, offset, size abi.PaddedPieceSize) (bool, error) { diff --git a/storage/sealer/ffiwrapper/sealer_cgo.go b/storage/sealer/ffiwrapper/sealer_cgo.go index c1d557713..0ed53183c 100644 --- a/storage/sealer/ffiwrapper/sealer_cgo.go +++ b/storage/sealer/ffiwrapper/sealer_cgo.go @@ -28,6 +28,7 @@ import ( "github.com/filecoin-project/go-state-types/proof" "github.com/filecoin-project/lotus/lib/nullreader" + spaths "github.com/filecoin-project/lotus/storage/paths" nr "github.com/filecoin-project/lotus/storage/pipeline/lib/nullreader" "github.com/filecoin-project/lotus/storage/sealer/fr32" "github.com/filecoin-project/lotus/storage/sealer/partialfile" @@ -1128,7 +1129,36 @@ func (sb *Sealer) Remove(ctx context.Context, sector storiface.SectorRef) error } func (sb *Sealer) DownloadSectorData(ctx context.Context, sector storiface.SectorRef, finalized bool, src map[storiface.SectorFileType]storiface.SectorData) error { - panic("todo") + var todo storiface.SectorFileType + for fileType := range src { + todo |= fileType + } + + ptype := storiface.PathSealing + if finalized { + ptype = storiface.PathStorage + } + + paths, done, err := sb.sectors.AcquireSector(ctx, sector, storiface.FTNone, todo, ptype) + if err != nil { + return xerrors.Errorf("failed to acquire sector paths: %w", err) + } + defer done() + + for fileType, data := range src { + out := storiface.PathByType(paths, fileType) + + if data.Local { + return xerrors.Errorf("sector(%v) with local data (%#v) requested in DownloadSectorData", sector, data) + } + + _, err := spaths.FetchWithTemp(ctx, []string{data.URL}, out, data.Headers) + if err != nil { + return xerrors.Errorf("downloading sector data: %w", err) + } + } + + return nil } func GetRequiredPadding(oldLength abi.PaddedPieceSize, newPieceLength abi.PaddedPieceSize) ([]abi.PaddedPieceSize, abi.PaddedPieceSize) { diff --git a/storage/sealer/tarutil/systar.go b/storage/sealer/tarutil/systar.go index 4cd2e2bbb..96dcce875 100644 --- a/storage/sealer/tarutil/systar.go +++ b/storage/sealer/tarutil/systar.go @@ -12,19 +12,20 @@ import ( var log = logging.Logger("tarutil") // nolint -func ExtractTar(body io.Reader, dir string, buf []byte) error { +func ExtractTar(body io.Reader, dir string, buf []byte) (int64, error) { if err := os.MkdirAll(dir, 0755); err != nil { // nolint - return xerrors.Errorf("mkdir: %w", err) + return 0, xerrors.Errorf("mkdir: %w", err) } tr := tar.NewReader(body) + var read int64 for { header, err := tr.Next() switch err { default: - return err + return read, err case io.EOF: - return nil + return read, nil case nil: } @@ -33,17 +34,20 @@ func ExtractTar(body io.Reader, dir string, buf []byte) error { f, err := os.Create(filepath.Join(dir, header.Name)) if err != nil { //nolint:gosec - return xerrors.Errorf("creating file %s: %w", filepath.Join(dir, header.Name), err) + return read, xerrors.Errorf("creating file %s: %w", filepath.Join(dir, header.Name), err) } // This data is coming from a trusted source, no need to check the size. + // TODO: now it's actually not coming from a trusted source, check size / paths //nolint:gosec - if _, err := io.CopyBuffer(f, tr, buf); err != nil { - return err + r, err := io.CopyBuffer(f, tr, buf) + read += r + if err != nil { + return read, err } if err := f.Close(); err != nil { - return err + return read, err } } } From cde23be559d302ba0956b3b5f8f0f589af06e25e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 2 Sep 2022 14:19:29 +0200 Subject: [PATCH 152/185] sector import: Fix tests --- storage/sealer/mock/mock.go | 8 ++++++++ storage/sealer/sched_test.go | 4 ++++ storage/sealer/teststorage_test.go | 4 ++++ 3 files changed, 16 insertions(+) diff --git a/storage/sealer/mock/mock.go b/storage/sealer/mock/mock.go index 5b0afd35c..173a4ddf2 100644 --- a/storage/sealer/mock/mock.go +++ b/storage/sealer/mock/mock.go @@ -517,6 +517,10 @@ func (mgr *SectorMgr) ReleaseSectorKey(ctx context.Context, sector storiface.Sec return nil } +func (mgr *SectorMgr) DownloadSectorData(ctx context.Context, sector storiface.SectorRef, finalized bool, src map[storiface.SectorFileType]storiface.SectorData) error { + return xerrors.Errorf("not supported") +} + func (mgr *SectorMgr) Remove(ctx context.Context, sector storiface.SectorRef) error { mgr.lk.Lock() defer mgr.lk.Unlock() @@ -613,6 +617,10 @@ func (mgr *SectorMgr) ReturnFinalizeReplicaUpdate(ctx context.Context, callID st panic("not supported") } +func (mgr *SectorMgr) ReturnDownloadSector(ctx context.Context, callID storiface.CallID, err *storiface.CallError) error { + panic("not supported") +} + func (m mockVerifProver) VerifySeal(svi prooftypes.SealVerifyInfo) (bool, error) { plen, err := svi.SealProof.ProofSize() if err != nil { diff --git a/storage/sealer/sched_test.go b/storage/sealer/sched_test.go index a30a4d261..bf4b90b19 100644 --- a/storage/sealer/sched_test.go +++ b/storage/sealer/sched_test.go @@ -67,6 +67,10 @@ type schedTestWorker struct { ignoreResources bool } +func (s *schedTestWorker) DownloadSectorData(ctx context.Context, sector storiface.SectorRef, finalized bool, src map[storiface.SectorFileType]storiface.SectorData) (storiface.CallID, error) { + panic("implement me") +} + func (s *schedTestWorker) DataCid(ctx context.Context, pieceSize abi.UnpaddedPieceSize, pieceData storiface.Data) (storiface.CallID, error) { panic("implement me") } diff --git a/storage/sealer/teststorage_test.go b/storage/sealer/teststorage_test.go index f88aa9355..ee200d9bb 100644 --- a/storage/sealer/teststorage_test.go +++ b/storage/sealer/teststorage_test.go @@ -21,6 +21,10 @@ type testExec struct { apch chan chan apres } +func (t *testExec) DownloadSectorData(ctx context.Context, sector storiface.SectorRef, finalized bool, src map[storiface.SectorFileType]storiface.SectorData) error { + panic("implement me") +} + func (t *testExec) DataCid(ctx context.Context, pieceSize abi.UnpaddedPieceSize, pieceData storiface.Data) (abi.PieceInfo, error) { panic("implement me") } From cdadf5e5a9b33f3e9e8bf6286a0153235f8c7632 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 2 Sep 2022 15:47:35 +0200 Subject: [PATCH 153/185] sector import: Implement handleReceiveSector --- storage/pipeline/receive.go | 49 ++++++++++++++++++++++++++++++++++--- storage/pipeline/types.go | 6 +++++ 2 files changed, 52 insertions(+), 3 deletions(-) diff --git a/storage/pipeline/receive.go b/storage/pipeline/receive.go index b21829772..a9e56a845 100644 --- a/storage/pipeline/receive.go +++ b/storage/pipeline/receive.go @@ -11,6 +11,7 @@ import ( "github.com/filecoin-project/go-statemachine" "github.com/filecoin-project/lotus/api" + "github.com/filecoin-project/lotus/storage/sealer/storiface" ) func (m *Sealing) Receive(ctx context.Context, meta api.RemoteSectorMeta) error { @@ -102,6 +103,19 @@ func (m *Sealing) checkSectorMeta(ctx context.Context, meta api.RemoteSectorMeta info.CommD = meta.CommD // todo check cid prefixes info.CommR = meta.CommR + if meta.DataSealed == nil { + return SectorInfo{}, xerrors.Errorf("expected DataSealed to be set") + } + if meta.DataCache == nil { + return SectorInfo{}, xerrors.Errorf("expected DataCache to be set") + } + info.RemoteDataSealed = meta.DataSealed + info.RemoteDataCache = meta.DataCache + + // If we get a sector after PC2, assume that we're getting finalized sector data + // todo: maybe only set if C1 provider is set? + info.RemoteDataFinalized = true + fallthrough case GetTicket: fallthrough @@ -118,6 +132,11 @@ func (m *Sealing) checkSectorMeta(ctx context.Context, meta api.RemoteSectorMeta return SectorInfo{}, xerrors.Errorf("checking pieces: %w", err) } + if meta.DataUnsealed == nil { + return SectorInfo{}, xerrors.Errorf("expected DataUnsealed to be set") + } + info.RemoteDataUnsealed = meta.DataUnsealed + return info, nil default: return SectorInfo{}, xerrors.Errorf("imported sector State in not supported") @@ -125,8 +144,32 @@ func (m *Sealing) checkSectorMeta(ctx context.Context, meta api.RemoteSectorMeta } func (m *Sealing) handleReceiveSector(ctx statemachine.Context, sector SectorInfo) error { - // todo fetch stuff - // m.sealer.DownloadSectorData(ctx, m.minerSector(sector.SectorType, sector.SectorNumber), ) - panic("todo") + toFetch := map[storiface.SectorFileType]storiface.SectorData{} + + for fileType, data := range map[storiface.SectorFileType]*storiface.SectorData{ + storiface.FTUnsealed: sector.RemoteDataUnsealed, + storiface.FTSealed: sector.RemoteDataSealed, + storiface.FTCache: sector.RemoteDataCache, + } { + if data == nil { + continue + } + + if data.Local { + // todo check exists + continue + } + + toFetch[fileType] = *data + } + + if len(toFetch) > 0 { + if err := m.sealer.DownloadSectorData(ctx.Context(), m.minerSector(sector.SectorType, sector.SectorNumber), sector.RemoteDataFinalized, toFetch); err != nil { + return xerrors.Errorf("downloading sector data: %w", err) // todo send err event + } + } + + // todo data checks? + return ctx.Send(SectorReceived{}) } diff --git a/storage/pipeline/types.go b/storage/pipeline/types.go index 0321d113f..025b5a768 100644 --- a/storage/pipeline/types.go +++ b/storage/pipeline/types.go @@ -93,6 +93,12 @@ type SectorInfo struct { TerminateMessage *cid.Cid TerminatedAt abi.ChainEpoch + // Remote import + RemoteDataUnsealed *storiface.SectorData + RemoteDataSealed *storiface.SectorData + RemoteDataCache *storiface.SectorData + RemoteDataFinalized bool + // Debug LastErr string From 3caa0107791798174b6bb682c4acd02f5f71e356 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 2 Sep 2022 17:12:58 +0200 Subject: [PATCH 154/185] sector import: Update type-gen --- build/openrpc/miner.json.gz | Bin 15794 -> 15786 bytes build/openrpc/worker.json.gz | Bin 5244 -> 5256 bytes documentation/en/api-v0-methods-miner.md | 33 +-- gen/main.go | 2 + storage/pipeline/cbor_gen.go | 145 ++++++++++- storage/sealer/ffiwrapper/sealer_cgo.go | 2 +- storage/sealer/storiface/cbor_gen.go | 312 +++++++++++++++++++++++ storage/sealer/storiface/storage.go | 16 +- 8 files changed, 492 insertions(+), 18 deletions(-) diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index 30cd2019132fbd79c8a551d954c3a5aad52f9bee..550389d525e47b28a21a1318a66003fef389fe26 100644 GIT binary patch delta 2019 zcmV<92ORjad#Zb|f+>F^#ObeSn{MDwM53=J(b?7Wb#(&u720u6rHgHIxlwip=Si3< zpG63&+UFj@e$%**fc-JY1UlRIM7Q`ZhjEaLCZouXFoY3XhY}MNEJ$R}TH(l`8iD~0gbajJ0U3n)J};I`4z{+wS>%Zlv#hfKc+-fHjbW>sWd;n zDPC=KQLDPGh11r;X=~xMwQ!{U1>5`*b5fnYRY^Ois(PNtjPF2q>%*7r&B}9OVh3DW zRPX$#BEI=m3olRXjAcZeu}>}mKfYHk{b6JSu2wiHa80N-kN6c-KMA}WRZgwy+*u&= zD3sP+N#8?heG-2-D)+{XAHxonTh74Gv1$yd0gT2NFo4($_eBvb zV!g2IV6Pe5n);hg@P=&*$&#r%Y5^GTBrW2F^)7#~}zsE;D%ajNHOE%ZLsOZ zG`87one)eD&S`EQdO(YHvx?$?)7a?V1=a0IJAcDZ)FhMB7 zz0Z^)0dF)7yB+XEZwcgP5OVXXTTcfLXJ ziM3imch!wc6gKIVGdK5?&u6*W)d4Bj&&o-HY9=cu33ZoQIg$}5iGkv*9N$wEvU;1B z)8^&WWbJ-GH!;{f$CWQk556yEV!x0=#!whc&8GKn0z^u3d+P_^^y@_2vkgJYfI z`*^_tNeu$FNPi-{T=``IqNEmkaYiu3(7Z5_!MkVAekTm+5I%Iwtv}5rFFS}}t7783 zNNRVLa$wPUESt^X$;F*#=ZIxfnf9`YJPD#HI{^VFNfHxYao(=aR!aGsZH{l7JG+khgI>Y0Km)A%+PG$to8IIKn?`?F8#Op50w()f z4$BdB%Ka4H1$W1X&p#6z8U`}nZ7Dh<272T-8NoRY-UN1d2iPOeyDzFXSZjh@w*%}k z@Pi-=L&c+5Hxn(Mn1|>UNDO0!-cAe9O6FLR$%OrpS#6fvGhWHrlAb03d2gc0;+rjh zP`j&Wkb6XtL;E{BZ0UdZM!n&5)WDHT`qCvSukLUpgC>SC$~gFn3Kq2+WVrWxf8ssD zA&%Qf@dhKs+w_z3asMzkMbi}c$ zfni)=%dpiMcAAyUDOm8>FhqIRN-P_PQT_VtIGozdnL=ylS3rNX7h}H!ZO^iDAw2@1 z6zUa|Afpfzwzi_Vh$^!OVBu~kHoG5qgqH&0^KP0Vdmra~on%A0a{Uw{w)1H4@0rk0#_cB6*4ga@RLU}g92T~v&=Hy3J8T1Z8s$g0{|E4 B;vfJ3 delta 2027 zcmVI4O&o9N%5v~mkBGi#?+|p51JJhH)o!^QgcM%w68H(!SEzB= zrAugYX;5}w=E;pJpGC-|+UFh_e$)8QpZzh%1UlRIM7Q|fh4F=pCZotcFN6`B`4STq zS%RFi(_oXD>NjJ<83`Ej$Uv5E&xt}Ql`~GYuXB7+rhk1Sz?yj0w8GC4j^L#0mkjXC}T!k($4z33Rw|5eTIsun~bK6M@Z^<=yYZ>Xx6+$GuT*R`XTk zMRPJBW^sJHK1UI|X8>=8|FbbK5(rsnxjQP7lgF0dO$CpZJI}|xac*w+RWr4BuJUW| zRO7>f;yZs8m@kT>0>_02xcg9Rr{&4l!jqHSOlj`13oqNO%##r?jakD{pbfEQ9L++u zj3SVE>kKB~{o1BmU^(DVi0LWkLVn$odqa3q8D1`t6Wj@fpkr=Z!}Z5v!^7N^?O<d-W(~D_rv)eM~kHwtR+*Iy>7V9SF!~w~J-GA1x(LKQmd5Ljo4PAjK zMN^4UvvX`hZ&6{6O@w=&Da*#6@6@tJUKFsb^n4%=>;xOYVWiJ+7A0BC#erxu=hlS> z0~&vZgIpIG00+>x>kV@|e~k<<-vS8!K#t1`i$ZW>8Au0jg!2s(1M6Pu=XzsOth2WV zHq`Hs5%j`X_b2XrgWwZuwSw-d8Eev=WAi%2!D4W- z_MBgC16K+~b-2av=vlZXGOFy2D(9ex6Uc@R#rnpCPT>4$XcrlqL^WOsa>x?glC*#3 zDpG#S`TNQF!`uW<_Yy5?aXkCJum~WdR%jyQ5-k*Xn}Jj-`WJy)g|9u_cT&Vzj%8kH zzIZd0D9y~kcR%i73!O?VlIO%nQtWW;?si=lumH7Jd_ZF&#)mIOZRVmc) zJ@fV`HDN29lVMCX` zcTz>3cAlUeFCTEMQ+yxK*_Wj8vqkz7;pNKDtdEjf?8OO=a54Ch{bRrtAa+oFqw1c*S|U zK3gf}Z?-wUZH{l7)FSsVh}bSHVIrCd#@bX|}VeDW+= zgwjmSf_%tVIONC{MJNGa#{z#1uR) zJnz1!+F-2-a@`KF$G{JQEDRNoV%6 zKC<}-`0c?wi6*Kl1_p+4fi1&UXV__0GN)j{W5W>TT`RF{97ccj8>r)OYBOgFt)1VZ z(B3Wm60|+b%7yd@fKsSeOoEI;P}tgv<|3-h9)N|rq1fzx;1OO5gwMNaitK%y^L3I9 z>B{v}h}h1f!TSp((^6tTsvS-i{n>OnKR}CN?_gvcqJ#Mm=?61785}M~b2x@mjn|%* z@{{j29Su6#C-^bwAt8RBKynog?tz584#G`7I@ZRP0zEcO>*3nUezmpb+QP3ll2;_2DZ1+q==!lV35c0=EW}4KgtSGm}3ug96=Wv&1sq3J7^R Ja#v^y0{}*G`tJY$ diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index 76d71cb4c69e880e20c466b9fc20202b66dbad68..f60f1fc3a794c45d1ce14f3b5d957fbb2986c5e9 100644 GIT binary patch delta 5252 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

UdF>d!|Y8np4hw3bk(;M$9=Nr*zH}K@FbJ0bR zb3x8uGCA+{_mOknxX(z=>ZfLeeD(Jwt$)m?8;jhGH&85~wah}>z@f7g`6cp7fp`M( zUK`@6Ip;(%w|?QG>MK&a%rz}a9k!hm7pX}wj5R#Ez9cZQB{tj!Ond|DN@Ar&?3)Rq zB8W;oL`BOv_$vmvRc7bA%+)98JIt>(N8ictEX+jA)LUq#W>2Qg6!K0er0xPb1x2k0DatO9xf z1@BHa*3kvO*%Z(@WdC3fc!*L=W`DP20at*+djueuqDSB%!zQK&s12BVhcieK`-4L7 z9x!z`msX9RI7RVet2Xi6`O|Y3lUb1>#ed5=Sf5g2 z<$K=R=F$FYVkt%uI~%*s!`L}APgw#TI6$}awE8`Gw}8&gZkg`< z^Ib4*h07F?LJQU^a!Te~xqpbu--sv8ku%lP`RU56X_mU7<5W5^A%!Onq;r4avfz@u zn!=9TY7A;#=xCr3m&inh1>HleB3?$G)Bhzp=Kem_zU7Fl(rdzjl*rGr?G)>Ra;VVL z#$yN-y`v7)en;0Qz0L%hdS_xP!%2TUQB^~)j24A^E@D~Z*=$tH34eC`1A6zLgT*gS z%Z%jAC1D6!6ngibUrliBVXiGk$~)8o<|stbD|{J zm;_6}6%;(kSet$a#nqwSTfu~OzX|Q`=j?xO#)S6*z-_*QsYYtx8I4{V^l4o*<=B?I zZ@!UVJlDJ<+LD|_?td@^=-e(9MMEICZSLT;?mex@o|P1)FEcyY*cH>#jcJ`et@lhp z3L_L=ckIAukh2XMd^YNbw{lufBxm)=xohG;(?sT{6-DR7L_f9%P;B1#6+`rvF}IL^)M*n~yJmW1H>J6|iXi z+3L5eYGT>Oy)g%tgklTOIdTzzE&?P7*7Sh8B*YK#6j2^rN;OtgX}!K%|9=1g0RR8z KmP3(eF#!MxyG1Sl delta 5240 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 diff --git a/documentation/en/api-v0-methods-miner.md b/documentation/en/api-v0-methods-miner.md index 4034c4407..e28ce4846 100644 --- a/documentation/en/api-v0-methods-miner.md +++ b/documentation/en/api-v0-methods-miner.md @@ -3272,29 +3272,32 @@ Inputs: "DataUnsealed": { "Local": true, "URL": "string value", - "Headers": { - "Authorization": [ - "Bearer ey.." - ] - } + "Headers": [ + { + "Key": "string value", + "Value": "string value" + } + ] }, "DataSealed": { "Local": true, "URL": "string value", - "Headers": { - "Authorization": [ - "Bearer ey.." - ] - } + "Headers": [ + { + "Key": "string value", + "Value": "string value" + } + ] }, "DataCache": { "Local": true, "URL": "string value", - "Headers": { - "Authorization": [ - "Bearer ey.." - ] - } + "Headers": [ + { + "Key": "string value", + "Value": "string value" + } + ] } } ] diff --git a/gen/main.go b/gen/main.go index 77f340813..b7aaa0a9a 100644 --- a/gen/main.go +++ b/gen/main.go @@ -103,6 +103,8 @@ func main() { err = gen.WriteMapEncodersToFile("./storage/sealer/storiface/cbor_gen.go", "storiface", storiface.CallID{}, + storiface.SecDataHttpHeader{}, + storiface.SectorData{}, ) if err != nil { fmt.Println(err) diff --git a/storage/pipeline/cbor_gen.go b/storage/pipeline/cbor_gen.go index 0d9d1a918..a86e5f768 100644 --- a/storage/pipeline/cbor_gen.go +++ b/storage/pipeline/cbor_gen.go @@ -15,6 +15,7 @@ import ( abi "github.com/filecoin-project/go-state-types/abi" api "github.com/filecoin-project/lotus/api" + storiface "github.com/filecoin-project/lotus/storage/sealer/storiface" ) var _ = xerrors.Errorf @@ -30,7 +31,7 @@ func (t *SectorInfo) MarshalCBOR(w io.Writer) error { cw := cbg.NewCborWriter(w) - if _, err := cw.Write([]byte{184, 31}); err != nil { + if _, err := cw.Write([]byte{184, 36}); err != nil { return err } @@ -654,6 +655,70 @@ func (t *SectorInfo) MarshalCBOR(w io.Writer) error { } } + // t.RemoteDataUnsealed (storiface.SectorData) (struct) + if len("RemoteDataUnsealed") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"RemoteDataUnsealed\" was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("RemoteDataUnsealed"))); err != nil { + return err + } + if _, err := io.WriteString(w, string("RemoteDataUnsealed")); err != nil { + return err + } + + if err := t.RemoteDataUnsealed.MarshalCBOR(cw); err != nil { + return err + } + + // t.RemoteDataSealed (storiface.SectorData) (struct) + if len("RemoteDataSealed") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"RemoteDataSealed\" was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("RemoteDataSealed"))); err != nil { + return err + } + if _, err := io.WriteString(w, string("RemoteDataSealed")); err != nil { + return err + } + + if err := t.RemoteDataSealed.MarshalCBOR(cw); err != nil { + return err + } + + // t.RemoteDataCache (storiface.SectorData) (struct) + if len("RemoteDataCache") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"RemoteDataCache\" was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("RemoteDataCache"))); err != nil { + return err + } + if _, err := io.WriteString(w, string("RemoteDataCache")); err != nil { + return err + } + + if err := t.RemoteDataCache.MarshalCBOR(cw); err != nil { + return err + } + + // t.RemoteDataFinalized (bool) (bool) + if len("RemoteDataFinalized") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"RemoteDataFinalized\" was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("RemoteDataFinalized"))); err != nil { + return err + } + if _, err := io.WriteString(w, string("RemoteDataFinalized")); err != nil { + return err + } + + if err := cbg.WriteBool(w, t.RemoteDataFinalized); err != nil { + return err + } + // t.LastErr (string) (string) if len("LastErr") > cbg.MaxLength { return xerrors.Errorf("Value in field \"LastErr\" was too long") @@ -1354,6 +1419,84 @@ func (t *SectorInfo) UnmarshalCBOR(r io.Reader) (err error) { t.TerminatedAt = abi.ChainEpoch(extraI) } + // t.RemoteDataUnsealed (storiface.SectorData) (struct) + case "RemoteDataUnsealed": + + { + + b, err := cr.ReadByte() + if err != nil { + return err + } + if b != cbg.CborNull[0] { + if err := cr.UnreadByte(); err != nil { + return err + } + t.RemoteDataUnsealed = new(storiface.SectorData) + if err := t.RemoteDataUnsealed.UnmarshalCBOR(cr); err != nil { + return xerrors.Errorf("unmarshaling t.RemoteDataUnsealed pointer: %w", err) + } + } + + } + // t.RemoteDataSealed (storiface.SectorData) (struct) + case "RemoteDataSealed": + + { + + b, err := cr.ReadByte() + if err != nil { + return err + } + if b != cbg.CborNull[0] { + if err := cr.UnreadByte(); err != nil { + return err + } + t.RemoteDataSealed = new(storiface.SectorData) + if err := t.RemoteDataSealed.UnmarshalCBOR(cr); err != nil { + return xerrors.Errorf("unmarshaling t.RemoteDataSealed pointer: %w", err) + } + } + + } + // t.RemoteDataCache (storiface.SectorData) (struct) + case "RemoteDataCache": + + { + + b, err := cr.ReadByte() + if err != nil { + return err + } + if b != cbg.CborNull[0] { + if err := cr.UnreadByte(); err != nil { + return err + } + t.RemoteDataCache = new(storiface.SectorData) + if err := t.RemoteDataCache.UnmarshalCBOR(cr); err != nil { + return xerrors.Errorf("unmarshaling t.RemoteDataCache pointer: %w", err) + } + } + + } + // t.RemoteDataFinalized (bool) (bool) + case "RemoteDataFinalized": + + maj, extra, err = cr.ReadHeader() + if err != nil { + return err + } + if maj != cbg.MajOther { + return fmt.Errorf("booleans must be major type 7") + } + switch extra { + case 20: + t.RemoteDataFinalized = false + case 21: + t.RemoteDataFinalized = true + default: + return fmt.Errorf("booleans are either major type 7, value 20 or 21 (got %d)", extra) + } // t.LastErr (string) (string) case "LastErr": diff --git a/storage/sealer/ffiwrapper/sealer_cgo.go b/storage/sealer/ffiwrapper/sealer_cgo.go index 0ed53183c..cc137151f 100644 --- a/storage/sealer/ffiwrapper/sealer_cgo.go +++ b/storage/sealer/ffiwrapper/sealer_cgo.go @@ -1152,7 +1152,7 @@ func (sb *Sealer) DownloadSectorData(ctx context.Context, sector storiface.Secto return xerrors.Errorf("sector(%v) with local data (%#v) requested in DownloadSectorData", sector, data) } - _, err := spaths.FetchWithTemp(ctx, []string{data.URL}, out, data.Headers) + _, err := spaths.FetchWithTemp(ctx, []string{data.URL}, out, data.HttpHeaders()) if err != nil { return xerrors.Errorf("downloading sector data: %w", err) } diff --git a/storage/sealer/storiface/cbor_gen.go b/storage/sealer/storiface/cbor_gen.go index 5b4623175..6fec11557 100644 --- a/storage/sealer/storiface/cbor_gen.go +++ b/storage/sealer/storiface/cbor_gen.go @@ -153,3 +153,315 @@ func (t *CallID) UnmarshalCBOR(r io.Reader) (err error) { return nil } +func (t *SecDataHttpHeader) MarshalCBOR(w io.Writer) error { + if t == nil { + _, err := w.Write(cbg.CborNull) + return err + } + + cw := cbg.NewCborWriter(w) + + if _, err := cw.Write([]byte{162}); err != nil { + return err + } + + // t.Key (string) (string) + if len("Key") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"Key\" was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("Key"))); err != nil { + return err + } + if _, err := io.WriteString(w, string("Key")); err != nil { + return err + } + + if len(t.Key) > cbg.MaxLength { + return xerrors.Errorf("Value in field t.Key was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len(t.Key))); err != nil { + return err + } + if _, err := io.WriteString(w, string(t.Key)); err != nil { + return err + } + + // t.Value (string) (string) + if len("Value") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"Value\" was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("Value"))); err != nil { + return err + } + if _, err := io.WriteString(w, string("Value")); err != nil { + return err + } + + if len(t.Value) > cbg.MaxLength { + return xerrors.Errorf("Value in field t.Value was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len(t.Value))); err != nil { + return err + } + if _, err := io.WriteString(w, string(t.Value)); err != nil { + return err + } + return nil +} + +func (t *SecDataHttpHeader) UnmarshalCBOR(r io.Reader) (err error) { + *t = SecDataHttpHeader{} + + cr := cbg.NewCborReader(r) + + maj, extra, err := cr.ReadHeader() + if err != nil { + return err + } + defer func() { + if err == io.EOF { + err = io.ErrUnexpectedEOF + } + }() + + if maj != cbg.MajMap { + return fmt.Errorf("cbor input should be of type map") + } + + if extra > cbg.MaxLength { + return fmt.Errorf("SecDataHttpHeader: map struct too large (%d)", extra) + } + + var name string + n := extra + + for i := uint64(0); i < n; i++ { + + { + sval, err := cbg.ReadString(cr) + if err != nil { + return err + } + + name = string(sval) + } + + switch name { + // t.Key (string) (string) + case "Key": + + { + sval, err := cbg.ReadString(cr) + if err != nil { + return err + } + + t.Key = string(sval) + } + // t.Value (string) (string) + case "Value": + + { + sval, err := cbg.ReadString(cr) + if err != nil { + return err + } + + t.Value = string(sval) + } + + default: + // Field doesn't exist on this type, so ignore it + cbg.ScanForLinks(r, func(cid.Cid) {}) + } + } + + return nil +} +func (t *SectorData) MarshalCBOR(w io.Writer) error { + if t == nil { + _, err := w.Write(cbg.CborNull) + return err + } + + cw := cbg.NewCborWriter(w) + + if _, err := cw.Write([]byte{163}); err != nil { + return err + } + + // t.Local (bool) (bool) + if len("Local") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"Local\" was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("Local"))); err != nil { + return err + } + if _, err := io.WriteString(w, string("Local")); err != nil { + return err + } + + if err := cbg.WriteBool(w, t.Local); err != nil { + return err + } + + // t.URL (string) (string) + if len("URL") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"URL\" was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("URL"))); err != nil { + return err + } + if _, err := io.WriteString(w, string("URL")); err != nil { + return err + } + + if len(t.URL) > cbg.MaxLength { + return xerrors.Errorf("Value in field t.URL was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len(t.URL))); err != nil { + return err + } + if _, err := io.WriteString(w, string(t.URL)); err != nil { + return err + } + + // t.Headers ([]storiface.SecDataHttpHeader) (slice) + if len("Headers") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"Headers\" was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("Headers"))); err != nil { + return err + } + if _, err := io.WriteString(w, string("Headers")); err != nil { + return err + } + + if len(t.Headers) > cbg.MaxLength { + return xerrors.Errorf("Slice value in field t.Headers was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajArray, uint64(len(t.Headers))); err != nil { + return err + } + for _, v := range t.Headers { + if err := v.MarshalCBOR(cw); err != nil { + return err + } + } + return nil +} + +func (t *SectorData) UnmarshalCBOR(r io.Reader) (err error) { + *t = SectorData{} + + cr := cbg.NewCborReader(r) + + maj, extra, err := cr.ReadHeader() + if err != nil { + return err + } + defer func() { + if err == io.EOF { + err = io.ErrUnexpectedEOF + } + }() + + if maj != cbg.MajMap { + return fmt.Errorf("cbor input should be of type map") + } + + if extra > cbg.MaxLength { + return fmt.Errorf("SectorData: map struct too large (%d)", extra) + } + + var name string + n := extra + + for i := uint64(0); i < n; i++ { + + { + sval, err := cbg.ReadString(cr) + if err != nil { + return err + } + + name = string(sval) + } + + switch name { + // t.Local (bool) (bool) + case "Local": + + maj, extra, err = cr.ReadHeader() + if err != nil { + return err + } + if maj != cbg.MajOther { + return fmt.Errorf("booleans must be major type 7") + } + switch extra { + case 20: + t.Local = false + case 21: + t.Local = true + default: + return fmt.Errorf("booleans are either major type 7, value 20 or 21 (got %d)", extra) + } + // t.URL (string) (string) + case "URL": + + { + sval, err := cbg.ReadString(cr) + if err != nil { + return err + } + + t.URL = string(sval) + } + // t.Headers ([]storiface.SecDataHttpHeader) (slice) + case "Headers": + + maj, extra, err = cr.ReadHeader() + if err != nil { + return err + } + + if extra > cbg.MaxLength { + return fmt.Errorf("t.Headers: array too large (%d)", extra) + } + + if maj != cbg.MajArray { + return fmt.Errorf("expected cbor array") + } + + if extra > 0 { + t.Headers = make([]SecDataHttpHeader, extra) + } + + for i := 0; i < int(extra); i++ { + + var v SecDataHttpHeader + if err := v.UnmarshalCBOR(cr); err != nil { + return err + } + + t.Headers[i] = v + } + + default: + // Field doesn't exist on this type, so ignore it + cbg.ScanForLinks(r, func(cid.Cid) {}) + } + } + + return nil +} diff --git a/storage/sealer/storiface/storage.go b/storage/sealer/storiface/storage.go index 4248cd71e..975011a0b 100644 --- a/storage/sealer/storiface/storage.go +++ b/storage/sealer/storiface/storage.go @@ -137,5 +137,19 @@ type SectorData struct { URL string // optional http headers to use when requesting sector data - Headers http.Header + Headers []SecDataHttpHeader +} + +func (sd *SectorData) HttpHeaders() http.Header { + out := http.Header{} + for _, header := range sd.Headers { + out[header.Key] = append(out[header.Key], header.Value) + } + return out +} + +// note: we can't use http.Header as that's backed by a go map, which is all kinds of messy +type SecDataHttpHeader struct { + Key string + Value string } From fef7232c6b0147d4dcfc80626eae7fdbecb21950 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 5 Sep 2022 15:28:36 +0200 Subject: [PATCH 155/185] sector import: Initial SectorReceive itest --- .circleci/config.yml | 5 + api/api_storage.go | 2 +- itests/sector_import_test.go | 230 ++++++++++++++++++++++++++++++++++ storage/paths/http_handler.go | 10 +- storage/pipeline/receive.go | 6 +- 5 files changed, 246 insertions(+), 7 deletions(-) create mode 100644 itests/sector_import_test.go diff --git a/.circleci/config.yml b/.circleci/config.yml index e3bb77b9f..58c89202b 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -974,6 +974,11 @@ workflows: suite: itest-sector_finalize_early target: "./itests/sector_finalize_early_test.go" + - test: + name: test-itest-sector_import + suite: itest-sector_import + target: "./itests/sector_import_test.go" + - test: name: test-itest-sector_make_cc_avail suite: itest-sector_make_cc_avail diff --git a/api/api_storage.go b/api/api_storage.go index 7ae95cde2..d58576bb4 100644 --- a/api/api_storage.go +++ b/api/api_storage.go @@ -542,7 +542,7 @@ type RemoteSectorMeta struct { // Required in SubmitCommit and later PreCommitInfo *miner.SectorPreCommitInfo - PreCommitDeposit big.Int + PreCommitDeposit *big.Int PreCommitMessage *cid.Cid PreCommitTipSet types.TipSetKey diff --git a/itests/sector_import_test.go b/itests/sector_import_test.go new file mode 100644 index 000000000..848d8f8e6 --- /dev/null +++ b/itests/sector_import_test.go @@ -0,0 +1,230 @@ +package itests + +import ( + "bytes" + "context" + "fmt" + "net/http" + "net/http/httptest" + "os" + "path/filepath" + "testing" + "time" + + "github.com/gorilla/mux" + "github.com/stretchr/testify/require" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/crypto" + + "github.com/filecoin-project/lotus/api" + lminer "github.com/filecoin-project/lotus/chain/actors/builtin/miner" + "github.com/filecoin-project/lotus/chain/actors/policy" + "github.com/filecoin-project/lotus/chain/types" + "github.com/filecoin-project/lotus/itests/kit" + spaths "github.com/filecoin-project/lotus/storage/paths" + "github.com/filecoin-project/lotus/storage/sealer/ffiwrapper" + "github.com/filecoin-project/lotus/storage/sealer/ffiwrapper/basicfs" + "github.com/filecoin-project/lotus/storage/sealer/storiface" + "github.com/filecoin-project/lotus/storage/sealer/tarutil" +) + +func TestSectorImportAfterPC2(t *testing.T) { + kit.QuietMiningLogs() + + var blockTime = 50 * time.Millisecond + + client, miner, ens := kit.EnsembleMinimal(t, kit.ThroughRPC()) + ens.InterconnectAll().BeginMining(blockTime) + + ctx := context.Background() + + // get some sector numbers + snums, err := miner.SectorNumReserveCount(ctx, "test-reservation-0001", 16) + require.NoError(t, err) + + sectorDir := t.TempDir() + + maddr, err := miner.ActorAddress(ctx) + require.NoError(t, err) + + mid, err := address.IDFromAddress(maddr) + require.NoError(t, err) + + spt, err := currentSealProof(ctx, client, maddr) + require.NoError(t, err) + + ssize, err := spt.SectorSize() + require.NoError(t, err) + + pieceSize := abi.PaddedPieceSize(ssize) + + //////// + // seal a sector up to pc2 outside of the pipeline + + sn, err := snums.First() + require.NoError(t, err) + snum := abi.SectorNumber(sn) + sid := abi.SectorID{ + Miner: abi.ActorID(mid), + Number: snum, + } + + sref := storiface.SectorRef{ + ID: sid, + ProofType: 0, + } + + sealer, err := ffiwrapper.New(&basicfs.Provider{ + Root: sectorDir, + }) + require.NoError(t, err) + + dataReader := bytes.NewReader(bytes.Repeat([]byte{0}, int(pieceSize.Unpadded()))) + + // create the unsealed sector file + pieceInfo, err := sealer.AddPiece(ctx, sref, nil, pieceSize.Unpadded(), dataReader) + require.NoError(t, err) + + // get most recent valid ticket epoch + ts, err := client.ChainHead(ctx) + require.NoError(t, err) + ticketEpoch := ts.Height() - policy.SealRandomnessLookback + + // ticket entropy is cbor-seriasized miner addr + buf := new(bytes.Buffer) + require.NoError(t, maddr.MarshalCBOR(buf)) + + // generate ticket randomness + rand, err := client.StateGetRandomnessFromTickets(ctx, crypto.DomainSeparationTag_SealRandomness, ticketEpoch, buf.Bytes(), ts.Key()) + require.NoError(t, err) + + // run PC1 + pc1out, err := sealer.SealPreCommit1(ctx, sref, abi.SealRandomness(rand), []abi.PieceInfo{pieceInfo}) + require.NoError(t, err) + + // run pc2 + scids, err := sealer.SealPreCommit2(ctx, sref, pc1out) + require.NoError(t, err) + + // todo split-finalize! + + //////// + // start http server serving sector data + + m := mux.NewRouter() + m.HandleFunc("/sectors/{type}/{id}", remoteGetSector(sectorDir)).Methods("GET") + srv := httptest.NewServer(m) + + //////// + // import the sector and continue sealing + + err = miner.SectorReceive(ctx, api.RemoteSectorMeta{ + State: "PreCommitting", + Sector: sid, + Type: spt, + + Pieces: []api.SectorPiece{ + { + Piece: pieceInfo, + DealInfo: nil, + }, + }, + + TicketValue: abi.SealRandomness(rand), + TicketEpoch: ticketEpoch, + + PreCommit1Out: pc1out, + + CommD: &scids.Unsealed, + CommR: &scids.Sealed, + + DataUnsealed: &storiface.SectorData{ + Local: false, + URL: fmt.Sprintf("%s/sectors/unsealed/s-t0%d-%d", srv.URL, mid, snum), + }, + DataSealed: &storiface.SectorData{ + Local: false, + URL: fmt.Sprintf("%s/sectors/sealed/s-t0%d-%d", srv.URL, mid, snum), + }, + DataCache: &storiface.SectorData{ + Local: false, + URL: fmt.Sprintf("%s/sectors/cache/s-t0%d-%d", srv.URL, mid, snum), + }, + }) + require.NoError(t, err) + + // check that we see the imported sector + ng, err := miner.SectorsListNonGenesis(ctx) + require.NoError(t, err) + require.Len(t, ng, 1) + require.Equal(t, snum, ng[0]) + + // todo wait sealed + +} + +func remoteGetSector(sectorRoot string) func(w http.ResponseWriter, r *http.Request) { + return func(w http.ResponseWriter, r *http.Request) { + + vars := mux.Vars(r) + + // validate sector id + id, err := storiface.ParseSectorID(vars["id"]) + if err != nil { + w.WriteHeader(500) + return + } + + // validate type + _, err = spaths.FileTypeFromString(vars["type"]) + if err != nil { + w.WriteHeader(500) + return + } + + path := filepath.Join(sectorRoot, vars["type"], vars["id"]) + + stat, err := os.Stat(path) + if err != nil { + w.WriteHeader(500) + return + } + + if stat.IsDir() { + if _, has := r.Header["Range"]; has { + w.WriteHeader(500) + return + } + + w.Header().Set("Content-Type", "application/x-tar") + w.WriteHeader(200) + + err := tarutil.TarDirectory(path, w, make([]byte, 1<<20)) + if err != nil { + return + } + } else { + w.Header().Set("Content-Type", "application/octet-stream") + // will do a ranged read over the file at the given path if the caller has asked for a ranged read in the request headers. + http.ServeFile(w, r, path) + } + + fmt.Printf("served sector file/dir, sectorID=%+v, fileType=%s, path=%s\n", id, vars["type"], path) + } +} + +func currentSealProof(ctx context.Context, api api.FullNode, maddr address.Address) (abi.RegisteredSealProof, error) { + mi, err := api.StateMinerInfo(ctx, maddr, types.EmptyTSK) + if err != nil { + return 0, err + } + + ver, err := api.StateNetworkVersion(ctx, types.EmptyTSK) + if err != nil { + return 0, err + } + + return lminer.PreferredSealProofTypeFromWindowPoStType(ver, mi.WindowPoStProofType) +} diff --git a/storage/paths/http_handler.go b/storage/paths/http_handler.go index c8f465f25..fbf1c85b0 100644 --- a/storage/paths/http_handler.go +++ b/storage/paths/http_handler.go @@ -95,7 +95,7 @@ func (handler *FetchHandler) remoteGetSector(w http.ResponseWriter, r *http.Requ return } - ft, err := ftFromString(vars["type"]) + ft, err := FileTypeFromString(vars["type"]) if err != nil { log.Errorf("%+v", err) w.WriteHeader(500) @@ -167,7 +167,7 @@ func (handler *FetchHandler) remoteDeleteSector(w http.ResponseWriter, r *http.R return } - ft, err := ftFromString(vars["type"]) + ft, err := FileTypeFromString(vars["type"]) if err != nil { log.Errorf("%+v", err) w.WriteHeader(500) @@ -195,9 +195,9 @@ func (handler *FetchHandler) remoteGetAllocated(w http.ResponseWriter, r *http.R return } - ft, err := ftFromString(vars["type"]) + ft, err := FileTypeFromString(vars["type"]) if err != nil { - log.Errorf("ftFromString: %+v", err) + log.Errorf("FileTypeFromString: %+v", err) w.WriteHeader(500) return } @@ -311,7 +311,7 @@ func (handler *FetchHandler) generateSingleVanillaProof(w http.ResponseWriter, r http.ServeContent(w, r, "", time.Time{}, bytes.NewReader(vanilla)) } -func ftFromString(t string) (storiface.SectorFileType, error) { +func FileTypeFromString(t string) (storiface.SectorFileType, error) { switch t { case storiface.FTUnsealed.String(): return storiface.FTUnsealed, nil diff --git a/storage/pipeline/receive.go b/storage/pipeline/receive.go index a9e56a845..3e1de43d9 100644 --- a/storage/pipeline/receive.go +++ b/storage/pipeline/receive.go @@ -81,8 +81,12 @@ func (m *Sealing) checkSectorMeta(ctx context.Context, meta api.RemoteSectorMeta fallthrough case SubmitCommit: + if meta.PreCommitDeposit == nil { + return SectorInfo{}, xerrors.Errorf("sector PreCommitDeposit was null") + } + info.PreCommitInfo = meta.PreCommitInfo - info.PreCommitDeposit = meta.PreCommitDeposit + info.PreCommitDeposit = *meta.PreCommitDeposit info.PreCommitMessage = meta.PreCommitMessage info.PreCommitTipSet = meta.PreCommitTipSet From 12a8ab5ac78f4606fe15cb17423194df23840f3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 6 Sep 2022 10:52:56 +0200 Subject: [PATCH 156/185] sector import: Add missing initial fsm state transition --- node/impl/storminer.go | 15 ++++++++++++--- storage/pipeline/fsm.go | 1 + storage/pipeline/receive.go | 1 + 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/node/impl/storminer.go b/node/impl/storminer.go index 9f1b9af35..c26d50410 100644 --- a/node/impl/storminer.go +++ b/node/impl/storminer.go @@ -182,16 +182,20 @@ func (sm *StorageMinerAPI) PledgeSector(ctx context.Context) (abi.SectorID, erro return abi.SectorID{}, err } + return sm.waitSectorStarted(ctx, sr.ID) +} + +func (sm *StorageMinerAPI) waitSectorStarted(ctx context.Context, si abi.SectorID) (abi.SectorID, error) { // wait for the sector to enter the Packing state // TODO: instead of polling implement some pubsub-type thing in storagefsm for { - info, err := sm.Miner.SectorsStatus(ctx, sr.ID.Number, false) + info, err := sm.Miner.SectorsStatus(ctx, si.Number, false) if err != nil { return abi.SectorID{}, xerrors.Errorf("getting pledged sector info: %w", err) } if info.State != api.SectorState(sealing.UndefinedSectorState) { - return sr.ID, nil + return si, nil } select { @@ -449,7 +453,12 @@ func (sm *StorageMinerAPI) SectorNumFree(ctx context.Context, name string) error } func (sm *StorageMinerAPI) SectorReceive(ctx context.Context, meta api.RemoteSectorMeta) error { - return sm.Miner.Receive(ctx, meta) + if err := sm.Miner.Receive(ctx, meta); err != nil { + return err + } + + _, err := sm.waitSectorStarted(ctx, meta.Sector) + return err } func (sm *StorageMinerAPI) ComputeWindowPoSt(ctx context.Context, dlIdx uint64, tsk types.TipSetKey) ([]minertypes.SubmitWindowedPoStParams, error) { diff --git a/storage/pipeline/fsm.go b/storage/pipeline/fsm.go index 59e99bc59..8512d7775 100644 --- a/storage/pipeline/fsm.go +++ b/storage/pipeline/fsm.go @@ -50,6 +50,7 @@ var fsmPlanners = map[SectorState]func(events []statemachine.Event, state *Secto UndefinedSectorState: planOne( on(SectorStart{}, WaitDeals), on(SectorStartCC{}, Packing), + on(SectorReceive{}, ReceiveSector), ), Empty: planOne( // deprecated on(SectorAddPiece{}, AddPiece), diff --git a/storage/pipeline/receive.go b/storage/pipeline/receive.go index 3e1de43d9..ef6496a35 100644 --- a/storage/pipeline/receive.go +++ b/storage/pipeline/receive.go @@ -14,6 +14,7 @@ import ( "github.com/filecoin-project/lotus/storage/sealer/storiface" ) +// todo m.inputLk? func (m *Sealing) Receive(ctx context.Context, meta api.RemoteSectorMeta) error { si, err := m.checkSectorMeta(ctx, meta) if err != nil { From 9c6d531ae73891ce29b9355010bb2b80f9dfcee0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 6 Sep 2022 11:06:30 +0200 Subject: [PATCH 157/185] sector import: Plumb sector download task canfig --- cmd/lotus-worker/main.go | 9 +++++++++ documentation/en/cli-lotus-worker.md | 1 + documentation/en/default-lotus-miner-config.toml | 6 ++++-- itests/kit/ensemble.go | 1 + itests/sector_import_test.go | 3 +-- node/config/def.go | 1 + node/config/doc_gen.go | 8 +++++++- node/config/storage.go | 1 + node/config/types.go | 2 +- storage/sealer/manager.go | 4 ++++ 10 files changed, 30 insertions(+), 6 deletions(-) diff --git a/cmd/lotus-worker/main.go b/cmd/lotus-worker/main.go index 286cce883..8b8db5aa7 100644 --- a/cmd/lotus-worker/main.go +++ b/cmd/lotus-worker/main.go @@ -224,6 +224,12 @@ var runCmd = &cli.Command{ Value: true, EnvVars: []string{"LOTUS_WORKER_REGEN_SECTOR_KEY"}, }, + &cli.BoolFlag{ + Name: "sector-download", + Usage: "enable external sector data download", + Value: false, + EnvVars: []string{"LOTUS_WORKER_SECTOR_DOWNLOAD"}, + }, &cli.BoolFlag{ Name: "windowpost", Usage: "enable window post", @@ -373,6 +379,9 @@ var runCmd = &cli.Command{ if (workerType == sealtasks.WorkerSealing || cctx.IsSet("addpiece")) && cctx.Bool("addpiece") { taskTypes = append(taskTypes, sealtasks.TTAddPiece, sealtasks.TTDataCid) } + if (workerType == sealtasks.WorkerSealing || cctx.IsSet("sector-download")) && cctx.Bool("sector-download") { + taskTypes = append(taskTypes, sealtasks.TTDownloadSector) + } if (workerType == sealtasks.WorkerSealing || cctx.IsSet("precommit1")) && cctx.Bool("precommit1") { taskTypes = append(taskTypes, sealtasks.TTPreCommit1) } diff --git a/documentation/en/cli-lotus-worker.md b/documentation/en/cli-lotus-worker.md index ec81d28d7..920fb3001 100644 --- a/documentation/en/cli-lotus-worker.md +++ b/documentation/en/cli-lotus-worker.md @@ -53,6 +53,7 @@ OPTIONS: --prove-replica-update2 enable prove replica update 2 (default: true) [$LOTUS_WORKER_PROVE_REPLICA_UPDATE2] --regen-sector-key enable regen sector key (default: true) [$LOTUS_WORKER_REGEN_SECTOR_KEY] --replica-update enable replica update (default: true) [$LOTUS_WORKER_REPLICA_UPDATE] + --sector-download enable external sector data download (default: false) [$LOTUS_WORKER_SECTOR_DOWNLOAD] --timeout value used when 'listen' is unspecified. must be a valid duration recognized by golang's time.ParseDuration function (default: "30m") [$LOTUS_WORKER_TIMEOUT] --unseal enable unsealing (32G sectors: 1 core, 128GiB Memory) (default: true) [$LOTUS_WORKER_UNSEAL] --windowpost enable window post (default: false) [$LOTUS_WORKER_WINDOWPOST] diff --git a/documentation/en/default-lotus-miner-config.toml b/documentation/en/default-lotus-miner-config.toml index ae235e01e..0147f979e 100644 --- a/documentation/en/default-lotus-miner-config.toml +++ b/documentation/en/default-lotus-miner-config.toml @@ -612,8 +612,10 @@ # env var: LOTUS_STORAGE_PARALLELFETCHLIMIT #ParallelFetchLimit = 10 - # Local worker config - # + # type: bool + # env var: LOTUS_STORAGE_ALLOWSECTORDOWNLOAD + #AllowSectorDownload = true + # type: bool # env var: LOTUS_STORAGE_ALLOWADDPIECE #AllowAddPiece = true diff --git a/itests/kit/ensemble.go b/itests/kit/ensemble.go index bcc2d93c2..8fa781e65 100644 --- a/itests/kit/ensemble.go +++ b/itests/kit/ensemble.go @@ -636,6 +636,7 @@ func (n *Ensemble) Start() *Ensemble { scfg := config.DefaultStorageMiner() if noLocal { + scfg.Storage.AllowSectorDownload = false scfg.Storage.AllowAddPiece = false scfg.Storage.AllowPreCommit1 = false scfg.Storage.AllowPreCommit2 = false diff --git a/itests/sector_import_test.go b/itests/sector_import_test.go index 848d8f8e6..e820d9d80 100644 --- a/itests/sector_import_test.go +++ b/itests/sector_import_test.go @@ -161,8 +161,7 @@ func TestSectorImportAfterPC2(t *testing.T) { require.Len(t, ng, 1) require.Equal(t, snum, ng[0]) - // todo wait sealed - + miner.WaitSectorsProving(ctx, map[abi.SectorNumber]struct{}{snum: {}}) } func remoteGetSector(sectorRoot string) func(w http.ResponseWriter, r *http.Request) { diff --git a/node/config/def.go b/node/config/def.go index ad2150af3..0566c7d99 100644 --- a/node/config/def.go +++ b/node/config/def.go @@ -146,6 +146,7 @@ func DefaultStorageMiner() *StorageMiner { }, Storage: SealerConfig{ + AllowSectorDownload: true, AllowAddPiece: true, AllowPreCommit1: true, AllowPreCommit2: true, diff --git a/node/config/doc_gen.go b/node/config/doc_gen.go index 6b5927448..3d90afd0b 100644 --- a/node/config/doc_gen.go +++ b/node/config/doc_gen.go @@ -796,11 +796,17 @@ This parameter is ONLY applicable if the retrieval pricing policy strategy has b Comment: ``, }, + { + Num: "AllowSectorDownload", + Type: "bool", + + Comment: ``, + }, { Name: "AllowAddPiece", Type: "bool", - Comment: `Local worker config`, + Comment: ``, }, { Name: "AllowPreCommit1", diff --git a/node/config/storage.go b/node/config/storage.go index 20f1791e6..0c72eabd1 100644 --- a/node/config/storage.go +++ b/node/config/storage.go @@ -54,6 +54,7 @@ func WriteStorageFile(path string, config paths.StorageConfig) error { func (c *StorageMiner) StorageManager() sealer.Config { return sealer.Config{ ParallelFetchLimit: c.Storage.ParallelFetchLimit, + AllowSectorDownload: c.Storage.AllowSectorDownload, AllowAddPiece: c.Storage.AllowAddPiece, AllowPreCommit1: c.Storage.AllowPreCommit1, AllowPreCommit2: c.Storage.AllowPreCommit2, diff --git a/node/config/types.go b/node/config/types.go index 3c85587c3..1f55da1c6 100644 --- a/node/config/types.go +++ b/node/config/types.go @@ -409,7 +409,7 @@ type SealingConfig struct { type SealerConfig struct { ParallelFetchLimit int - // Local worker config + AllowSectorDownload bool AllowAddPiece bool AllowPreCommit1 bool AllowPreCommit2 bool diff --git a/storage/sealer/manager.go b/storage/sealer/manager.go index 78c0622f4..a4d31e21b 100644 --- a/storage/sealer/manager.go +++ b/storage/sealer/manager.go @@ -108,6 +108,7 @@ type Config struct { ParallelFetchLimit int // Local worker config + AllowSectorDownload bool AllowAddPiece bool AllowPreCommit1 bool AllowPreCommit2 bool @@ -182,6 +183,9 @@ func New(ctx context.Context, lstor *paths.Local, stor paths.Store, ls paths.Loc localTasks := []sealtasks.TaskType{ sealtasks.TTCommit1, sealtasks.TTProveReplicaUpdate1, sealtasks.TTFinalize, sealtasks.TTFetch, sealtasks.TTFinalizeReplicaUpdate, } + if sc.AllowSectorDownload { + localTasks = append(localTasks, sealtasks.TTDownloadSector) + } if sc.AllowAddPiece { localTasks = append(localTasks, sealtasks.TTAddPiece, sealtasks.TTDataCid) } From 3086e8aa01ac7a2e9c74fd69ee601391e06cff44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 6 Sep 2022 11:27:07 +0200 Subject: [PATCH 158/185] sector import: Seal with the correct proof type in saas itest --- itests/sector_import_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/itests/sector_import_test.go b/itests/sector_import_test.go index e820d9d80..c578ab347 100644 --- a/itests/sector_import_test.go +++ b/itests/sector_import_test.go @@ -73,7 +73,7 @@ func TestSectorImportAfterPC2(t *testing.T) { sref := storiface.SectorRef{ ID: sid, - ProofType: 0, + ProofType: spt, } sealer, err := ffiwrapper.New(&basicfs.Provider{ From 830c2ffdf583f409ee3e2e09f85e3b8da48ff2a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 6 Sep 2022 17:09:27 +0200 Subject: [PATCH 159/185] sector import: FinalizeInto, send finalized cacde in itest --- itests/sector_import_test.go | 13 ++++++-- storage/sealer/ffiwrapper/sealer_cgo.go | 41 +++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 2 deletions(-) diff --git a/itests/sector_import_test.go b/itests/sector_import_test.go index c578ab347..818675828 100644 --- a/itests/sector_import_test.go +++ b/itests/sector_import_test.go @@ -108,7 +108,10 @@ func TestSectorImportAfterPC2(t *testing.T) { scids, err := sealer.SealPreCommit2(ctx, sref, pc1out) require.NoError(t, err) - // todo split-finalize! + // make finalized cache, put it in [sectorDir]/fin-cache + finDst := filepath.Join(sectorDir, "fin-cache", fmt.Sprintf("s-t01000-%d", snum)) + require.NoError(t, os.MkdirAll(finDst, 0777)) + require.NoError(t, sealer.FinalizeSectorInto(ctx, sref, finDst)) //////// // start http server serving sector data @@ -183,7 +186,13 @@ func remoteGetSector(sectorRoot string) func(w http.ResponseWriter, r *http.Requ return } - path := filepath.Join(sectorRoot, vars["type"], vars["id"]) + typ := vars["type"] + if typ == "cache" { + // if cache is requested, send the finalized cache we've created above + typ = "fin-cache" + } + + path := filepath.Join(sectorRoot, typ, vars["id"]) stat, err := os.Stat(path) if err != nil { diff --git a/storage/sealer/ffiwrapper/sealer_cgo.go b/storage/sealer/ffiwrapper/sealer_cgo.go index cc137151f..d73b72787 100644 --- a/storage/sealer/ffiwrapper/sealer_cgo.go +++ b/storage/sealer/ffiwrapper/sealer_cgo.go @@ -11,9 +11,12 @@ import ( "encoding/base64" "encoding/json" "io" + "io/ioutil" "math/bits" "os" + "path/filepath" "runtime" + "syscall" "github.com/detailyang/go-fallocate" "github.com/ipfs/go-cid" @@ -1069,6 +1072,44 @@ func (sb *Sealer) FinalizeSector(ctx context.Context, sector storiface.SectorRef return ffi.ClearCache(uint64(ssize), paths.Cache) } +// FinalizeSectorInto is like FinalizeSector, but writes finalized sector cache into a new path +func (sb *Sealer) FinalizeSectorInto(ctx context.Context, sector storiface.SectorRef, dest string) error { + ssize, err := sector.ProofType.SectorSize() + if err != nil { + return err + } + + paths, done, err := sb.sectors.AcquireSector(ctx, sector, storiface.FTCache, 0, storiface.PathStorage) + if err != nil { + return xerrors.Errorf("acquiring sector cache path: %w", err) + } + defer done() + + files, err := ioutil.ReadDir(paths.Cache) + if err != nil { + return err + } + for _, file := range files { + if file.Name() != "t_aux" && file.Name() != "p_aux" { + // link all the non-aux files + if err := syscall.Link(filepath.Join(paths.Cache, file.Name()), filepath.Join(dest, file.Name())); err != nil { + return xerrors.Errorf("link %s: %w", file.Name(), err) + } + continue + } + + d, err := os.ReadFile(filepath.Join(paths.Cache, file.Name())) + if err != nil { + return xerrors.Errorf("read %s: %w", file.Name(), err) + } + if err := os.WriteFile(filepath.Join(dest, file.Name()), d, 0666); err != nil { + return xerrors.Errorf("write %s: %w", file.Name(), err) + } + } + + return ffi.ClearCache(uint64(ssize), dest) +} + func (sb *Sealer) FinalizeReplicaUpdate(ctx context.Context, sector storiface.SectorRef, keepUnsealed []storiface.Range) error { ssize, err := sector.ProofType.SectorSize() if err != nil { From 9f03569cd0bf49d5d49ad786e14b9ad5f19cc0ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 9 Sep 2022 10:32:27 +0200 Subject: [PATCH 160/185] sector import: Remote Commit1 --- api/api_storage.go | 14 +++++- build/openrpc/miner.json.gz | Bin 15786 -> 15801 bytes cmd/lotus-miner/info.go | 1 + documentation/en/api-v0-methods-miner.md | 3 +- itests/sector_import_test.go | 52 ++++++++++++++++++++++ storage/pipeline/cbor_gen.go | 36 ++++++++++++++- storage/pipeline/fsm.go | 7 +++ storage/pipeline/fsm_events.go | 5 +++ storage/pipeline/receive.go | 3 +- storage/pipeline/sector_state.go | 2 + storage/pipeline/states_failed.go | 12 +++++ storage/pipeline/states_sealing.go | 54 ++++++++++++++++++++--- storage/pipeline/types.go | 9 ++-- 13 files changed, 183 insertions(+), 15 deletions(-) diff --git a/api/api_storage.go b/api/api_storage.go index d58576bb4..cf44614e1 100644 --- a/api/api_storage.go +++ b/api/api_storage.go @@ -572,6 +572,18 @@ type RemoteSectorMeta struct { //////// // SEALING SERVICE HOOKS - // todo Commit1Provider + // URL + // todo better doc + RemoteCommit1Endpoint string + // todo OnDone / OnStateChange } + +type RemoteCommit1Params struct { + Ticket, Seed []byte + + Unsealed cid.Cid + Sealed cid.Cid + + ProofType abi.RegisteredSealProof +} diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index 550389d525e47b28a21a1318a66003fef389fe26..61fcef75cdf265fe7db147deffcb16be1289e05c 100644 GIT binary patch delta 5200 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 diff --git a/cmd/lotus-miner/info.go b/cmd/lotus-miner/info.go index ecce9c6c2..9bc891c5b 100644 --- a/cmd/lotus-miner/info.go +++ b/cmd/lotus-miner/info.go @@ -545,6 +545,7 @@ var stateList = []stateMeta{ {col: color.FgRed, state: sealing.SealPreCommit2Failed}, {col: color.FgRed, state: sealing.PreCommitFailed}, {col: color.FgRed, state: sealing.ComputeProofFailed}, + {col: color.FgRed, state: sealing.RemoteCommit1Failed}, {col: color.FgRed, state: sealing.CommitFailed}, {col: color.FgRed, state: sealing.CommitFinalizeFailed}, {col: color.FgRed, state: sealing.PackingFailed}, diff --git a/documentation/en/api-v0-methods-miner.md b/documentation/en/api-v0-methods-miner.md index e28ce4846..94ac08cf5 100644 --- a/documentation/en/api-v0-methods-miner.md +++ b/documentation/en/api-v0-methods-miner.md @@ -3298,7 +3298,8 @@ Inputs: "Value": "string value" } ] - } + }, + "RemoteCommit1Endpoint": "string value" } ] ``` diff --git a/itests/sector_import_test.go b/itests/sector_import_test.go index 818675828..7ff4fa48f 100644 --- a/itests/sector_import_test.go +++ b/itests/sector_import_test.go @@ -3,6 +3,7 @@ package itests import ( "bytes" "context" + "encoding/json" "fmt" "net/http" "net/http/httptest" @@ -118,6 +119,7 @@ func TestSectorImportAfterPC2(t *testing.T) { m := mux.NewRouter() m.HandleFunc("/sectors/{type}/{id}", remoteGetSector(sectorDir)).Methods("GET") + m.HandleFunc("/sectors/{id}/commit1", remoteCommit1(sealer)).Methods("POST") srv := httptest.NewServer(m) //////// @@ -155,6 +157,8 @@ func TestSectorImportAfterPC2(t *testing.T) { Local: false, URL: fmt.Sprintf("%s/sectors/cache/s-t0%d-%d", srv.URL, mid, snum), }, + + RemoteCommit1Endpoint: fmt.Sprintf("%s/sectors/s-t0%d-%d/commit1", srv.URL, mid, snum), }) require.NoError(t, err) @@ -167,6 +171,54 @@ func TestSectorImportAfterPC2(t *testing.T) { miner.WaitSectorsProving(ctx, map[abi.SectorNumber]struct{}{snum: {}}) } +func remoteCommit1(s *ffiwrapper.Sealer) func(w http.ResponseWriter, r *http.Request) { + return func(w http.ResponseWriter, r *http.Request) { + vars := mux.Vars(r) + + // validate sector id + id, err := storiface.ParseSectorID(vars["id"]) + if err != nil { + w.WriteHeader(500) + return + } + + var params api.RemoteCommit1Params + if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { + w.WriteHeader(500) + return + } + + sref := storiface.SectorRef{ + ID: id, + ProofType: params.ProofType, + } + + ssize, err := params.ProofType.SectorSize() + if err != nil { + w.WriteHeader(500) + return + } + + p, err := s.SealCommit1(r.Context(), sref, params.Ticket, params.Seed, []abi.PieceInfo{ + { + Size: abi.PaddedPieceSize(ssize), + PieceCID: params.Unsealed, + }, + }, storiface.SectorCids{ + Unsealed: params.Unsealed, + Sealed: params.Sealed, + }) + if err != nil { + w.WriteHeader(500) + return + } + + if _, err := w.Write(p); err != nil { + fmt.Println("c1 write error") + } + } +} + func remoteGetSector(sectorRoot string) func(w http.ResponseWriter, r *http.Request) { return func(w http.ResponseWriter, r *http.Request) { diff --git a/storage/pipeline/cbor_gen.go b/storage/pipeline/cbor_gen.go index a86e5f768..4839a3202 100644 --- a/storage/pipeline/cbor_gen.go +++ b/storage/pipeline/cbor_gen.go @@ -31,7 +31,7 @@ func (t *SectorInfo) MarshalCBOR(w io.Writer) error { cw := cbg.NewCborWriter(w) - if _, err := cw.Write([]byte{184, 36}); err != nil { + if _, err := cw.Write([]byte{184, 37}); err != nil { return err } @@ -703,6 +703,29 @@ func (t *SectorInfo) MarshalCBOR(w io.Writer) error { return err } + // t.RemoteCommit1Endpoint (string) (string) + if len("RemoteCommit1Endpoint") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"RemoteCommit1Endpoint\" was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("RemoteCommit1Endpoint"))); err != nil { + return err + } + if _, err := io.WriteString(w, string("RemoteCommit1Endpoint")); err != nil { + return err + } + + if len(t.RemoteCommit1Endpoint) > cbg.MaxLength { + return xerrors.Errorf("Value in field t.RemoteCommit1Endpoint was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len(t.RemoteCommit1Endpoint))); err != nil { + return err + } + if _, err := io.WriteString(w, string(t.RemoteCommit1Endpoint)); err != nil { + return err + } + // t.RemoteDataFinalized (bool) (bool) if len("RemoteDataFinalized") > cbg.MaxLength { return xerrors.Errorf("Value in field \"RemoteDataFinalized\" was too long") @@ -1479,6 +1502,17 @@ func (t *SectorInfo) UnmarshalCBOR(r io.Reader) (err error) { } } + // t.RemoteCommit1Endpoint (string) (string) + case "RemoteCommit1Endpoint": + + { + sval, err := cbg.ReadString(cr) + if err != nil { + return err + } + + t.RemoteCommit1Endpoint = string(sval) + } // t.RemoteDataFinalized (bool) (bool) case "RemoteDataFinalized": diff --git a/storage/pipeline/fsm.go b/storage/pipeline/fsm.go index 8512d7775..fb0d16b38 100644 --- a/storage/pipeline/fsm.go +++ b/storage/pipeline/fsm.go @@ -225,6 +225,9 @@ var fsmPlanners = map[SectorState]func(events []statemachine.Event, state *Secto on(SectorRetryComputeProof{}, Committing), on(SectorSealPreCommit1Failed{}, SealPreCommit1Failed), ), + RemoteCommit1Failed: planOne( + on(SectorRetryComputeProof{}, Committing), + ), CommitFinalizeFailed: planOne( on(SectorRetryFinalize{}, CommitFinalize), ), @@ -539,6 +542,8 @@ func (m *Sealing) plan(events []statemachine.Event, state *SectorInfo) (func(sta return m.handlePreCommitFailed, processed, nil case ComputeProofFailed: return m.handleComputeProofFailed, processed, nil + case RemoteCommit1Failed: + return m.handleRemoteCommit1Failed, processed, nil case CommitFailed: return m.handleCommitFailed, processed, nil case CommitFinalizeFailed: @@ -666,6 +671,8 @@ func planCommitting(events []statemachine.Event, state *SectorInfo) (uint64, err return uint64(i + 1), nil case SectorComputeProofFailed: state.State = ComputeProofFailed + case SectorRemoteCommit1Failed: + state.State = RemoteCommit1Failed case SectorSealPreCommit1Failed: state.State = SealPreCommit1Failed case SectorCommitFailed: diff --git a/storage/pipeline/fsm_events.go b/storage/pipeline/fsm_events.go index ec87f8e38..600770c01 100644 --- a/storage/pipeline/fsm_events.go +++ b/storage/pipeline/fsm_events.go @@ -218,6 +218,11 @@ func (evt SectorSeedReady) apply(state *SectorInfo) { state.SeedValue = evt.SeedValue } +type SectorRemoteCommit1Failed struct{ error } + +func (evt SectorRemoteCommit1Failed) FormatError(xerrors.Printer) (next error) { return evt.error } +func (evt SectorRemoteCommit1Failed) apply(*SectorInfo) {} + type SectorComputeProofFailed struct{ error } func (evt SectorComputeProofFailed) FormatError(xerrors.Printer) (next error) { return evt.error } diff --git a/storage/pipeline/receive.go b/storage/pipeline/receive.go index ef6496a35..fd4f64a66 100644 --- a/storage/pipeline/receive.go +++ b/storage/pipeline/receive.go @@ -114,8 +114,9 @@ func (m *Sealing) checkSectorMeta(ctx context.Context, meta api.RemoteSectorMeta if meta.DataCache == nil { return SectorInfo{}, xerrors.Errorf("expected DataCache to be set") } - info.RemoteDataSealed = meta.DataSealed + info.RemoteDataSealed = meta.DataSealed // todo make head requests to check? info.RemoteDataCache = meta.DataCache + info.RemoteCommit1Endpoint = meta.RemoteCommit1Endpoint // If we get a sector after PC2, assume that we're getting finalized sector data // todo: maybe only set if C1 provider is set? diff --git a/storage/pipeline/sector_state.go b/storage/pipeline/sector_state.go index ad77fdbd5..136e72a16 100644 --- a/storage/pipeline/sector_state.go +++ b/storage/pipeline/sector_state.go @@ -31,6 +31,7 @@ var ExistSectorStateList = map[SectorState]struct{}{ SealPreCommit2Failed: {}, PreCommitFailed: {}, ComputeProofFailed: {}, + RemoteCommit1Failed: {}, CommitFailed: {}, PackingFailed: {}, FinalizeFailed: {}, @@ -124,6 +125,7 @@ const ( SealPreCommit2Failed SectorState = "SealPreCommit2Failed" PreCommitFailed SectorState = "PreCommitFailed" ComputeProofFailed SectorState = "ComputeProofFailed" + RemoteCommit1Failed SectorState = "RemoteCommit1Failed" CommitFailed SectorState = "CommitFailed" PackingFailed SectorState = "PackingFailed" // TODO: deprecated, remove FinalizeFailed SectorState = "FinalizeFailed" diff --git a/storage/pipeline/states_failed.go b/storage/pipeline/states_failed.go index 09e090bc8..fb7145f50 100644 --- a/storage/pipeline/states_failed.go +++ b/storage/pipeline/states_failed.go @@ -184,6 +184,18 @@ func (m *Sealing) handleComputeProofFailed(ctx statemachine.Context, sector Sect return ctx.Send(SectorRetryComputeProof{}) } +func (m *Sealing) handleRemoteCommit1Failed(ctx statemachine.Context, sector SectorInfo) error { + if err := failedCooldown(ctx, sector); err != nil { + return err + } + + if sector.InvalidProofs > 1 { + log.Errorw("consecutive remote commit1 fails", "sector", sector.SectorNumber, "c1url", sector.RemoteCommit1Endpoint) + } + + return ctx.Send(SectorRetryComputeProof{}) +} + func (m *Sealing) handleSubmitReplicaUpdateFailed(ctx statemachine.Context, sector SectorInfo) error { if err := failedCooldown(ctx, sector); err != nil { return err diff --git a/storage/pipeline/states_sealing.go b/storage/pipeline/states_sealing.go index f2d61fc62..56b7eb37a 100644 --- a/storage/pipeline/states_sealing.go +++ b/storage/pipeline/states_sealing.go @@ -3,6 +3,9 @@ package sealing import ( "bytes" "context" + "encoding/json" + "io" + "net/http" "github.com/ipfs/go-cid" "golang.org/x/xerrors" @@ -569,13 +572,50 @@ func (m *Sealing) handleCommitting(ctx statemachine.Context, sector SectorInfo) return ctx.Send(SectorCommitFailed{xerrors.Errorf("sector had nil commR or commD")}) } - cids := storiface.SectorCids{ - Unsealed: *sector.CommD, - Sealed: *sector.CommR, - } - c2in, err := m.sealer.SealCommit1(sector.sealingCtx(ctx.Context()), m.minerSector(sector.SectorType, sector.SectorNumber), sector.TicketValue, sector.SeedValue, sector.pieceInfos(), cids) - if err != nil { - return ctx.Send(SectorComputeProofFailed{xerrors.Errorf("computing seal proof failed(1): %w", err)}) + var c2in storiface.Commit1Out + if sector.RemoteCommit1Endpoint == "" { + cids := storiface.SectorCids{ + Unsealed: *sector.CommD, + Sealed: *sector.CommR, + } + c2in, err = m.sealer.SealCommit1(sector.sealingCtx(ctx.Context()), m.minerSector(sector.SectorType, sector.SectorNumber), sector.TicketValue, sector.SeedValue, sector.pieceInfos(), cids) + if err != nil { + return ctx.Send(SectorComputeProofFailed{xerrors.Errorf("computing seal proof failed(1): %w", err)}) + } + } else { + reqData := api.RemoteCommit1Params{ + Ticket: sector.TicketValue, + Seed: sector.SeedValue, + Unsealed: *sector.CommD, + Sealed: *sector.CommR, + ProofType: sector.SectorType, + } + reqBody, err := json.Marshal(&reqData) + if err != nil { + return xerrors.Errorf("marshaling remote commit1 request: %w", err) + } + + req, err := http.NewRequest("POST", sector.RemoteCommit1Endpoint, bytes.NewReader(reqBody)) + if err != nil { + return ctx.Send(SectorRemoteCommit1Failed{xerrors.Errorf("creating new remote commit1 request: %w", err)}) + } + req.Header.Set("Content-Type", "application/json") + req = req.WithContext(ctx.Context()) + resp, err := http.DefaultClient.Do(req) + if err != nil { + return ctx.Send(SectorRemoteCommit1Failed{xerrors.Errorf("requesting remote commit1: %w", err)}) + } + + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + return ctx.Send(SectorRemoteCommit1Failed{xerrors.Errorf("remote commit1 received non-200 http response %s", resp.Status)}) + } + + c2in, err = io.ReadAll(resp.Body) // todo some len constraint + if err != nil { + return ctx.Send(SectorRemoteCommit1Failed{xerrors.Errorf("reading commit1 response: %w", err)}) + } } proof, err := m.sealer.SealCommit2(sector.sealingCtx(ctx.Context()), m.minerSector(sector.SectorType, sector.SectorNumber), c2in) diff --git a/storage/pipeline/types.go b/storage/pipeline/types.go index 025b5a768..f59755dce 100644 --- a/storage/pipeline/types.go +++ b/storage/pipeline/types.go @@ -94,10 +94,11 @@ type SectorInfo struct { TerminatedAt abi.ChainEpoch // Remote import - RemoteDataUnsealed *storiface.SectorData - RemoteDataSealed *storiface.SectorData - RemoteDataCache *storiface.SectorData - RemoteDataFinalized bool + RemoteDataUnsealed *storiface.SectorData + RemoteDataSealed *storiface.SectorData + RemoteDataCache *storiface.SectorData + RemoteCommit1Endpoint string + RemoteDataFinalized bool // Debug LastErr string From b2dfaae68c7688dbbfd02142edd76ce18162688a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 9 Sep 2022 11:11:47 +0200 Subject: [PATCH 161/185] sector import: Test remote commit1 retry --- itests/kit/node_miner.go | 8 +- itests/sector_import_full_test.go | 221 ++++++++++++++++++ ...t_test.go => sector_import_simple_test.go} | 47 ++-- storage/pipeline/receive.go | 1 - storage/pipeline/states_failed.go | 4 +- 5 files changed, 260 insertions(+), 21 deletions(-) create mode 100644 itests/sector_import_full_test.go rename itests/{sector_import_test.go => sector_import_simple_test.go} (85%) diff --git a/itests/kit/node_miner.go b/itests/kit/node_miner.go index 8805ac36c..b08ce1847 100644 --- a/itests/kit/node_miner.go +++ b/itests/kit/node_miner.go @@ -97,6 +97,10 @@ func (tm *TestMiner) PledgeSectors(ctx context.Context, n, existing int, blockNo } func (tm *TestMiner) WaitSectorsProving(ctx context.Context, toCheck map[abi.SectorNumber]struct{}) { + tm.WaitSectorsProvingAllowFails(ctx, toCheck, map[api.SectorState]struct{}{}) +} + +func (tm *TestMiner) WaitSectorsProvingAllowFails(ctx context.Context, toCheck map[abi.SectorNumber]struct{}, okFails map[api.SectorState]struct{}) { for len(toCheck) > 0 { tm.FlushSealingBatches(ctx) @@ -109,7 +113,9 @@ func (tm *TestMiner) WaitSectorsProving(ctx context.Context, toCheck map[abi.Sec delete(toCheck, n) } if strings.Contains(string(st.State), "Fail") { - tm.t.Fatal("sector in a failed state", st.State) + if _, ok := okFails[st.State]; !ok { + tm.t.Fatal("sector in a failed state", st.State) + } } } diff --git a/itests/sector_import_full_test.go b/itests/sector_import_full_test.go new file mode 100644 index 000000000..3be72e8eb --- /dev/null +++ b/itests/sector_import_full_test.go @@ -0,0 +1,221 @@ +package itests + +import ( + "bytes" + "context" + "fmt" + "net/http" + "net/http/httptest" + "os" + "path/filepath" + "testing" + "time" + + "github.com/gorilla/mux" + "github.com/stretchr/testify/require" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/crypto" + + "github.com/filecoin-project/lotus/api" + "github.com/filecoin-project/lotus/chain/actors/policy" + "github.com/filecoin-project/lotus/itests/kit" + sealing "github.com/filecoin-project/lotus/storage/pipeline" + "github.com/filecoin-project/lotus/storage/sealer/ffiwrapper" + "github.com/filecoin-project/lotus/storage/sealer/ffiwrapper/basicfs" + "github.com/filecoin-project/lotus/storage/sealer/storiface" +) + +func TestSectorImport(t *testing.T) { + + type testCase struct { + c1handler func(s *ffiwrapper.Sealer) func(w http.ResponseWriter, r *http.Request) + } + + makeTest := func(mut func(*testCase)) *testCase { + tc := &testCase{ + c1handler: remoteCommit1, + } + mut(tc) + return tc + } + + runTest := func(tc *testCase) func(t *testing.T) { + return func(t *testing.T) { + kit.QuietMiningLogs() + + var blockTime = 50 * time.Millisecond + + //////// + // Start a miner node + + client, miner, ens := kit.EnsembleMinimal(t, kit.ThroughRPC()) + ens.InterconnectAll().BeginMining(blockTime) + + ctx := context.Background() + + //////// + // Reserve some sector numbers on the miner node; We'll use one of those when creating the sector "remotely" + snums, err := miner.SectorNumReserveCount(ctx, "test-reservation-0001", 16) + require.NoError(t, err) + + sectorDir := t.TempDir() + + maddr, err := miner.ActorAddress(ctx) + require.NoError(t, err) + + mid, err := address.IDFromAddress(maddr) + require.NoError(t, err) + + spt, err := currentSealProof(ctx, client, maddr) + require.NoError(t, err) + + ssize, err := spt.SectorSize() + require.NoError(t, err) + + pieceSize := abi.PaddedPieceSize(ssize) + + //////// + // Create/Seal a sector up to pc2 outside of the pipeline + + // get one sector number from the reservation done on the miner above + sn, err := snums.First() + require.NoError(t, err) + + // create all the sector identifiers + snum := abi.SectorNumber(sn) + sid := abi.SectorID{Miner: abi.ActorID(mid), Number: snum} + sref := storiface.SectorRef{ID: sid, ProofType: spt} + + // create a low-level sealer instance + sealer, err := ffiwrapper.New(&basicfs.Provider{ + Root: sectorDir, + }) + require.NoError(t, err) + + // CRETE THE UNSEALED FILE + + // create a reader for all-zero (CC) data + dataReader := bytes.NewReader(bytes.Repeat([]byte{0}, int(pieceSize.Unpadded()))) + + // create the unsealed CC sector file + pieceInfo, err := sealer.AddPiece(ctx, sref, nil, pieceSize.Unpadded(), dataReader) + require.NoError(t, err) + + // GENERATE THE TICKET + + // get most recent valid ticket epoch + ts, err := client.ChainHead(ctx) + require.NoError(t, err) + ticketEpoch := ts.Height() - policy.SealRandomnessLookback + + // ticket entropy is cbor-seriasized miner addr + buf := new(bytes.Buffer) + require.NoError(t, maddr.MarshalCBOR(buf)) + + // generate ticket randomness + rand, err := client.StateGetRandomnessFromTickets(ctx, crypto.DomainSeparationTag_SealRandomness, ticketEpoch, buf.Bytes(), ts.Key()) + require.NoError(t, err) + + // EXECUTE PRECOMMIT 1 / 2 + + // run PC1 + pc1out, err := sealer.SealPreCommit1(ctx, sref, abi.SealRandomness(rand), []abi.PieceInfo{pieceInfo}) + require.NoError(t, err) + + // run pc2 + scids, err := sealer.SealPreCommit2(ctx, sref, pc1out) + require.NoError(t, err) + + // make finalized cache, put it in [sectorDir]/fin-cache while keeping the large cache for remote C1 + finDst := filepath.Join(sectorDir, "fin-cache", fmt.Sprintf("s-t01000-%d", snum)) + require.NoError(t, os.MkdirAll(finDst, 0777)) + require.NoError(t, sealer.FinalizeSectorInto(ctx, sref, finDst)) + + //////// + // start http server serving sector data + + m := mux.NewRouter() + m.HandleFunc("/sectors/{type}/{id}", remoteGetSector(sectorDir)).Methods("GET") + m.HandleFunc("/sectors/{id}/commit1", tc.c1handler(sealer)).Methods("POST") + srv := httptest.NewServer(m) + + unsealedURL := fmt.Sprintf("%s/sectors/unsealed/s-t0%d-%d", srv.URL, mid, snum) + sealedURL := fmt.Sprintf("%s/sectors/sealed/s-t0%d-%d", srv.URL, mid, snum) + cacheURL := fmt.Sprintf("%s/sectors/cache/s-t0%d-%d", srv.URL, mid, snum) + remoteC1URL := fmt.Sprintf("%s/sectors/s-t0%d-%d/commit1", srv.URL, mid, snum) + + //////// + // import the sector and continue sealing + + err = miner.SectorReceive(ctx, api.RemoteSectorMeta{ + State: "PreCommitting", + Sector: sid, + Type: spt, + + Pieces: []api.SectorPiece{ + { + Piece: pieceInfo, + DealInfo: nil, + }, + }, + + TicketValue: abi.SealRandomness(rand), + TicketEpoch: ticketEpoch, + + PreCommit1Out: pc1out, + + CommD: &scids.Unsealed, + CommR: &scids.Sealed, + + DataUnsealed: &storiface.SectorData{ + Local: false, + URL: unsealedURL, + }, + DataSealed: &storiface.SectorData{ + Local: false, + URL: sealedURL, + }, + DataCache: &storiface.SectorData{ + Local: false, + URL: cacheURL, + }, + + RemoteCommit1Endpoint: remoteC1URL, + }) + require.NoError(t, err) + + // check that we see the imported sector + ng, err := miner.SectorsListNonGenesis(ctx) + require.NoError(t, err) + require.Len(t, ng, 1) + require.Equal(t, snum, ng[0]) + + miner.WaitSectorsProvingAllowFails(ctx, map[abi.SectorNumber]struct{}{snum: {}}, map[api.SectorState]struct{}{api.SectorState(sealing.RemoteCommit1Failed): {}}) + } + } + + // fail first remote c1, verifies that c1 retry works + t.Run("c1-retry", runTest(makeTest(func(testCase *testCase) { + prt := sealing.MinRetryTime + sealing.MinRetryTime = time.Second + t.Cleanup(func() { + sealing.MinRetryTime = prt + }) + + testCase.c1handler = func(s *ffiwrapper.Sealer) func(w http.ResponseWriter, r *http.Request) { + var failedOnce bool + + return func(w http.ResponseWriter, r *http.Request) { + if !failedOnce { + failedOnce = true + w.WriteHeader(http.StatusBadGateway) + return + } + + remoteCommit1(s)(w, r) + } + } + }))) +} diff --git a/itests/sector_import_test.go b/itests/sector_import_simple_test.go similarity index 85% rename from itests/sector_import_test.go rename to itests/sector_import_simple_test.go index 7ff4fa48f..8b1b72fd7 100644 --- a/itests/sector_import_test.go +++ b/itests/sector_import_simple_test.go @@ -36,12 +36,16 @@ func TestSectorImportAfterPC2(t *testing.T) { var blockTime = 50 * time.Millisecond + //////// + // Start a miner node + client, miner, ens := kit.EnsembleMinimal(t, kit.ThroughRPC()) ens.InterconnectAll().BeginMining(blockTime) ctx := context.Background() - // get some sector numbers + //////// + // Reserve some sector numbers on the miner node; We'll use one of those when creating the sector "remotely" snums, err := miner.SectorNumReserveCount(ctx, "test-reservation-0001", 16) require.NoError(t, err) @@ -62,32 +66,34 @@ func TestSectorImportAfterPC2(t *testing.T) { pieceSize := abi.PaddedPieceSize(ssize) //////// - // seal a sector up to pc2 outside of the pipeline + // Create/Seal a sector up to pc2 outside of the pipeline + // get one sector number from the reservation done on the miner above sn, err := snums.First() require.NoError(t, err) + + // create all the sector identifiers snum := abi.SectorNumber(sn) - sid := abi.SectorID{ - Miner: abi.ActorID(mid), - Number: snum, - } - - sref := storiface.SectorRef{ - ID: sid, - ProofType: spt, - } + sid := abi.SectorID{Miner: abi.ActorID(mid), Number: snum} + sref := storiface.SectorRef{ID: sid, ProofType: spt} + // create a low-level sealer instance sealer, err := ffiwrapper.New(&basicfs.Provider{ Root: sectorDir, }) require.NoError(t, err) + // CRETE THE UNSEALED FILE + + // create a reader for all-zero (CC) data dataReader := bytes.NewReader(bytes.Repeat([]byte{0}, int(pieceSize.Unpadded()))) - // create the unsealed sector file + // create the unsealed CC sector file pieceInfo, err := sealer.AddPiece(ctx, sref, nil, pieceSize.Unpadded(), dataReader) require.NoError(t, err) + // GENERATE THE TICKET + // get most recent valid ticket epoch ts, err := client.ChainHead(ctx) require.NoError(t, err) @@ -101,6 +107,8 @@ func TestSectorImportAfterPC2(t *testing.T) { rand, err := client.StateGetRandomnessFromTickets(ctx, crypto.DomainSeparationTag_SealRandomness, ticketEpoch, buf.Bytes(), ts.Key()) require.NoError(t, err) + // EXECUTE PRECOMMIT 1 / 2 + // run PC1 pc1out, err := sealer.SealPreCommit1(ctx, sref, abi.SealRandomness(rand), []abi.PieceInfo{pieceInfo}) require.NoError(t, err) @@ -109,7 +117,7 @@ func TestSectorImportAfterPC2(t *testing.T) { scids, err := sealer.SealPreCommit2(ctx, sref, pc1out) require.NoError(t, err) - // make finalized cache, put it in [sectorDir]/fin-cache + // make finalized cache, put it in [sectorDir]/fin-cache while keeping the large cache for remote C1 finDst := filepath.Join(sectorDir, "fin-cache", fmt.Sprintf("s-t01000-%d", snum)) require.NoError(t, os.MkdirAll(finDst, 0777)) require.NoError(t, sealer.FinalizeSectorInto(ctx, sref, finDst)) @@ -122,6 +130,11 @@ func TestSectorImportAfterPC2(t *testing.T) { m.HandleFunc("/sectors/{id}/commit1", remoteCommit1(sealer)).Methods("POST") srv := httptest.NewServer(m) + unsealedURL := fmt.Sprintf("%s/sectors/unsealed/s-t0%d-%d", srv.URL, mid, snum) + sealedURL := fmt.Sprintf("%s/sectors/sealed/s-t0%d-%d", srv.URL, mid, snum) + cacheURL := fmt.Sprintf("%s/sectors/cache/s-t0%d-%d", srv.URL, mid, snum) + remoteC1URL := fmt.Sprintf("%s/sectors/s-t0%d-%d/commit1", srv.URL, mid, snum) + //////// // import the sector and continue sealing @@ -147,18 +160,18 @@ func TestSectorImportAfterPC2(t *testing.T) { DataUnsealed: &storiface.SectorData{ Local: false, - URL: fmt.Sprintf("%s/sectors/unsealed/s-t0%d-%d", srv.URL, mid, snum), + URL: unsealedURL, }, DataSealed: &storiface.SectorData{ Local: false, - URL: fmt.Sprintf("%s/sectors/sealed/s-t0%d-%d", srv.URL, mid, snum), + URL: sealedURL, }, DataCache: &storiface.SectorData{ Local: false, - URL: fmt.Sprintf("%s/sectors/cache/s-t0%d-%d", srv.URL, mid, snum), + URL: cacheURL, }, - RemoteCommit1Endpoint: fmt.Sprintf("%s/sectors/s-t0%d-%d/commit1", srv.URL, mid, snum), + RemoteCommit1Endpoint: remoteC1URL, }) require.NoError(t, err) diff --git a/storage/pipeline/receive.go b/storage/pipeline/receive.go index fd4f64a66..13ee0ff02 100644 --- a/storage/pipeline/receive.go +++ b/storage/pipeline/receive.go @@ -126,7 +126,6 @@ func (m *Sealing) checkSectorMeta(ctx context.Context, meta api.RemoteSectorMeta case GetTicket: fallthrough case Packing: - // todo check num free info.Return = ReturnState(meta.State) // todo dedupe states info.State = ReceiveSector diff --git a/storage/pipeline/states_failed.go b/storage/pipeline/states_failed.go index fb7145f50..7292961d2 100644 --- a/storage/pipeline/states_failed.go +++ b/storage/pipeline/states_failed.go @@ -19,12 +19,12 @@ import ( "github.com/filecoin-project/lotus/chain/types" ) -const minRetryTime = 1 * time.Minute +var MinRetryTime = 1 * time.Minute func failedCooldown(ctx statemachine.Context, sector SectorInfo) error { // TODO: Exponential backoff when we see consecutive failures - retryStart := time.Unix(int64(sector.Log[len(sector.Log)-1].Timestamp), 0).Add(minRetryTime) + retryStart := time.Unix(int64(sector.Log[len(sector.Log)-1].Timestamp), 0).Add(MinRetryTime) if len(sector.Log) > 0 && !time.Now().After(retryStart) { log.Infof("%s(%d), waiting %s before retrying", sector.State, sector.SectorNumber, time.Until(retryStart)) select { From 142894895d8b235d7cdd3e0b1e06698122c5ffe8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 9 Sep 2022 12:22:21 +0200 Subject: [PATCH 162/185] sector import: Implement seed/ticket/commr/commd checks --- .circleci/config.yml | 11 +++- itests/sector_import_full_test.go | 73 ++++++++++++++++++++- storage/pipeline/receive.go | 102 ++++++++++++++++++++++++++---- 3 files changed, 170 insertions(+), 16 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 58c89202b..7fcd20677 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -975,9 +975,14 @@ workflows: target: "./itests/sector_finalize_early_test.go" - test: - name: test-itest-sector_import - suite: itest-sector_import - target: "./itests/sector_import_test.go" + name: test-itest-sector_import_full + suite: itest-sector_import_full + target: "./itests/sector_import_full_test.go" + + - test: + name: test-itest-sector_import_simple + suite: itest-sector_import_simple + target: "./itests/sector_import_simple_test.go" - test: name: test-itest-sector_make_cc_avail diff --git a/itests/sector_import_full_test.go b/itests/sector_import_full_test.go index 3be72e8eb..7be290793 100644 --- a/itests/sector_import_full_test.go +++ b/itests/sector_import_full_test.go @@ -31,6 +31,10 @@ func TestSectorImport(t *testing.T) { type testCase struct { c1handler func(s *ffiwrapper.Sealer) func(w http.ResponseWriter, r *http.Request) + + mutateRemoteMeta func(*api.RemoteSectorMeta) + + expectImportErrContains string } makeTest := func(mut func(*testCase)) *testCase { @@ -149,7 +153,7 @@ func TestSectorImport(t *testing.T) { //////// // import the sector and continue sealing - err = miner.SectorReceive(ctx, api.RemoteSectorMeta{ + rmeta := api.RemoteSectorMeta{ State: "PreCommitting", Sector: sid, Type: spt, @@ -183,7 +187,18 @@ func TestSectorImport(t *testing.T) { }, RemoteCommit1Endpoint: remoteC1URL, - }) + } + + if tc.mutateRemoteMeta != nil { + tc.mutateRemoteMeta(&rmeta) + } + + err = miner.SectorReceive(ctx, rmeta) + if tc.expectImportErrContains != "" { + require.ErrorContains(t, err, tc.expectImportErrContains) + return + } + require.NoError(t, err) // check that we see the imported sector @@ -218,4 +233,58 @@ func TestSectorImport(t *testing.T) { } } }))) + + t.Run("nil-commd", runTest(makeTest(func(testCase *testCase) { + testCase.mutateRemoteMeta = func(meta *api.RemoteSectorMeta) { + meta.CommD = nil + } + testCase.expectImportErrContains = "both CommR/CommD cids need to be set for sectors in PreCommitting and later states" + }))) + t.Run("nil-commr", runTest(makeTest(func(testCase *testCase) { + testCase.mutateRemoteMeta = func(meta *api.RemoteSectorMeta) { + meta.CommR = nil + } + testCase.expectImportErrContains = "both CommR/CommD cids need to be set for sectors in PreCommitting and later states" + }))) + + t.Run("nil-uns", runTest(makeTest(func(testCase *testCase) { + testCase.mutateRemoteMeta = func(meta *api.RemoteSectorMeta) { + meta.DataUnsealed = nil + } + testCase.expectImportErrContains = "expected DataUnsealed to be set" + }))) + t.Run("nil-sealed", runTest(makeTest(func(testCase *testCase) { + testCase.mutateRemoteMeta = func(meta *api.RemoteSectorMeta) { + meta.DataSealed = nil + } + testCase.expectImportErrContains = "expected DataSealed to be set" + }))) + t.Run("nil-cache", runTest(makeTest(func(testCase *testCase) { + testCase.mutateRemoteMeta = func(meta *api.RemoteSectorMeta) { + meta.DataCache = nil + } + testCase.expectImportErrContains = "expected DataCache to be set" + }))) + + t.Run("bad-commd", runTest(makeTest(func(testCase *testCase) { + testCase.mutateRemoteMeta = func(meta *api.RemoteSectorMeta) { + meta.CommD = meta.CommR + } + testCase.expectImportErrContains = "CommD cid has wrong prefix" + }))) + t.Run("bad-commr", runTest(makeTest(func(testCase *testCase) { + testCase.mutateRemoteMeta = func(meta *api.RemoteSectorMeta) { + meta.CommR = meta.CommD + } + testCase.expectImportErrContains = "CommR cid has wrong prefix" + }))) + + t.Run("bad-ticket", runTest(makeTest(func(testCase *testCase) { + testCase.mutateRemoteMeta = func(meta *api.RemoteSectorMeta) { + // flip one bit + meta.TicketValue[23] ^= 4 + } + testCase.expectImportErrContains = "tickets differ" + }))) + } diff --git a/storage/pipeline/receive.go b/storage/pipeline/receive.go index 13ee0ff02..d7eb5de7e 100644 --- a/storage/pipeline/receive.go +++ b/storage/pipeline/receive.go @@ -1,21 +1,28 @@ package sealing import ( + "bytes" "context" + "github.com/ipfs/go-cid" "github.com/ipfs/go-datastore" + "github.com/multiformats/go-multihash" "golang.org/x/xerrors" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/crypto" + "github.com/filecoin-project/go-state-types/proof" "github.com/filecoin-project/go-statemachine" "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/storage/sealer/storiface" ) -// todo m.inputLk? func (m *Sealing) Receive(ctx context.Context, meta api.RemoteSectorMeta) error { + m.inputLk.Lock() + defer m.inputLk.Unlock() + si, err := m.checkSectorMeta(ctx, meta) if err != nil { return err @@ -73,7 +80,13 @@ func (m *Sealing) checkSectorMeta(ctx context.Context, meta api.RemoteSectorMeta } } + ts, err := m.Api.ChainHead(ctx) + if err != nil { + return SectorInfo{}, xerrors.Errorf("getting chain head: %w", err) + } + var info SectorInfo + var validatePoRep bool switch SectorState(meta.State) { case Proving, Available: @@ -91,21 +104,69 @@ func (m *Sealing) checkSectorMeta(ctx context.Context, meta api.RemoteSectorMeta info.PreCommitMessage = meta.PreCommitMessage info.PreCommitTipSet = meta.PreCommitTipSet - // todo check + // check provided seed + if len(meta.SeedValue) != abi.RandomnessLength { + return SectorInfo{}, xerrors.Errorf("seed randomness had wrong length %d", len(meta.SeedValue)) + } + + maddrBuf := new(bytes.Buffer) + if err := m.maddr.MarshalCBOR(maddrBuf); err != nil { + return SectorInfo{}, xerrors.Errorf("marshal miner address for seed check: %w", err) + } + rand, err := m.Api.StateGetRandomnessFromTickets(ctx, crypto.DomainSeparationTag_InteractiveSealChallengeSeed, meta.SeedEpoch, maddrBuf.Bytes(), ts.Key()) + if err != nil { + return SectorInfo{}, xerrors.Errorf("generating check seed: %w", err) + } + if !bytes.Equal(rand, meta.SeedValue) { + return SectorInfo{}, xerrors.Errorf("provided(%x) and generated(%x) seeds differ", meta.SeedValue, rand) + } + info.SeedValue = meta.SeedValue info.SeedEpoch = meta.SeedEpoch - // todo validate info.Proof = meta.CommitProof + validatePoRep = true fallthrough case PreCommitting: + // check provided ticket + if len(meta.TicketValue) != abi.RandomnessLength { + return SectorInfo{}, xerrors.Errorf("ticket randomness had wrong length %d", len(meta.TicketValue)) + } + + maddrBuf := new(bytes.Buffer) + if err := m.maddr.MarshalCBOR(maddrBuf); err != nil { + return SectorInfo{}, xerrors.Errorf("marshal miner address for ticket check: %w", err) + } + rand, err := m.Api.StateGetRandomnessFromTickets(ctx, crypto.DomainSeparationTag_SealRandomness, meta.TicketEpoch, maddrBuf.Bytes(), ts.Key()) + if err != nil { + return SectorInfo{}, xerrors.Errorf("generating check ticket: %w", err) + } + if !bytes.Equal(rand, meta.TicketValue) { + return SectorInfo{}, xerrors.Errorf("provided(%x) and generated(%x) tickets differ", meta.TicketValue, rand) + } + info.TicketValue = meta.TicketValue info.TicketEpoch = meta.TicketEpoch info.PreCommit1Out = meta.PreCommit1Out - info.CommD = meta.CommD // todo check cid prefixes + // check CommD/R + if meta.CommD == nil || meta.CommR == nil { + return SectorInfo{}, xerrors.Errorf("both CommR/CommD cids need to be set for sectors in PreCommitting and later states") + } + + dp := meta.CommD.Prefix() + if dp.Version != 1 || dp.Codec != cid.FilCommitmentUnsealed || dp.MhType != multihash.SHA2_256_TRUNC254_PADDED || dp.MhLength != 32 { + return SectorInfo{}, xerrors.Errorf("CommD cid has wrong prefix") + } + + rp := meta.CommR.Prefix() + if rp.Version != 1 || rp.Codec != cid.FilCommitmentSealed || rp.MhType != multihash.POSEIDON_BLS12_381_A1_FC1 || rp.MhLength != 32 { + return SectorInfo{}, xerrors.Errorf("CommR cid has wrong prefix") + } + + info.CommD = meta.CommD info.CommR = meta.CommR if meta.DataSealed == nil { @@ -118,15 +179,14 @@ func (m *Sealing) checkSectorMeta(ctx context.Context, meta api.RemoteSectorMeta info.RemoteDataCache = meta.DataCache info.RemoteCommit1Endpoint = meta.RemoteCommit1Endpoint - // If we get a sector after PC2, assume that we're getting finalized sector data - // todo: maybe only set if C1 provider is set? - info.RemoteDataFinalized = true + // If we get a sector after PC2, and remote C1 endpoint is set, assume that we're getting finalized sector data + if info.RemoteCommit1Endpoint != "" { + info.RemoteDataFinalized = true + } fallthrough - case GetTicket: - fallthrough - case Packing: - info.Return = ReturnState(meta.State) // todo dedupe states + case GetTicket, Packing: + info.Return = ReturnState(meta.State) info.State = ReceiveSector info.SectorNumber = meta.Sector.Number @@ -142,6 +202,26 @@ func (m *Sealing) checkSectorMeta(ctx context.Context, meta api.RemoteSectorMeta } info.RemoteDataUnsealed = meta.DataUnsealed + // some late checks which require previous checks + if validatePoRep { + ok, err := m.verif.VerifySeal(proof.SealVerifyInfo{ + SealProof: meta.Type, + SectorID: meta.Sector, + DealIDs: nil, + Randomness: meta.TicketValue, + InteractiveRandomness: meta.SeedValue, + Proof: meta.CommitProof, + SealedCID: *meta.CommR, + UnsealedCID: *meta.CommD, + }) + if err != nil { + return SectorInfo{}, xerrors.Errorf("validating seal proof: %w", err) + } + if !ok { + return SectorInfo{}, xerrors.Errorf("seal proof invalid") + } + } + return info, nil default: return SectorInfo{}, xerrors.Errorf("imported sector State in not supported") From c17ab761c5fc2b22ca2b1e741f6aff40526cac0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 9 Sep 2022 12:54:48 +0200 Subject: [PATCH 163/185] sector import: Remote Commit2 --- api/api_storage.go | 10 ++++ build/openrpc/miner.json.gz | Bin 15801 -> 15813 bytes cmd/lotus-miner/info.go | 2 +- documentation/en/api-v0-methods-miner.md | 3 +- itests/sector_import_full_test.go | 2 +- itests/sector_import_simple_test.go | 29 ++++++++++++ storage/pipeline/cbor_gen.go | 36 ++++++++++++++- storage/pipeline/fsm.go | 10 ++-- storage/pipeline/fsm_events.go | 5 ++ storage/pipeline/receive.go | 20 +++++++- storage/pipeline/sector_state.go | 4 +- storage/pipeline/states_failed.go | 4 +- storage/pipeline/states_sealing.go | 56 ++++++++++++++++++++--- storage/pipeline/types.go | 1 + 14 files changed, 162 insertions(+), 20 deletions(-) diff --git a/api/api_storage.go b/api/api_storage.go index cf44614e1..6273c4881 100644 --- a/api/api_storage.go +++ b/api/api_storage.go @@ -576,6 +576,8 @@ type RemoteSectorMeta struct { // todo better doc RemoteCommit1Endpoint string + RemoteCommit2Endpoint string + // todo OnDone / OnStateChange } @@ -587,3 +589,11 @@ type RemoteCommit1Params struct { ProofType abi.RegisteredSealProof } + +type RemoteCommit2Params struct { + Sector abi.SectorID + ProofType abi.RegisteredSealProof + + // todo spec better + Commit1Out storiface.Commit1Out +} diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index 61fcef75cdf265fe7db147deffcb16be1289e05c..3d42364ddb4334b44a3ef885e0d3e628097916d1 100644 GIT binary patch delta 5199 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 J10Kf<0|3Mv2m1g3 delta 5187 zcmV-J6uj%jd%1hCrYV0~uO>GaFJ(7+o*=67S%mJYeeTiqH;uaz*dKFDptF5Xbc=6> z7^AspGKy>*Lm08;Dlt*Px<$6OB|hg%E!k#!tF4sxnXKaK5t}UGpOc;v&^V{G6Oxis z?UV@3P;pFLnaKQ0nI-;Xx<+Mx>FJ_M^W$6W)kYUJzT1*HZOMO}wq#CQGDq59;0-7- zC)Md&m9%q;ujh%(_(pZNu724Tt~?heHp-<%_0CT;;(KJZDD=bzT1Lbf+vyVU<6G*| zA4c}+YW0-@4~A;z5+TV zH)M{0VG%F3MD%m*f7Ip2V)vLV0VD<>RtS(iGx0r&R6u_=O`yY#i$Ew9fsF_>nFwsQ zNb!EBnYa9WKJJZjbG)w_FCmlxF^l8l)k=!kJp*_%{GW|^kwC~o%iU4QpggwxZt9t| z+<89kjdL^IubQbubd_I;s2U#@lp?CYd{G<~I4(rM-G|CUEl<7{o}A?7jdR~#c=c#y zo{WHL%o=}=0&R#b<7gJLWfXzTJ9sbw@7Ffn0?Pq^LQGFN7xK%m+#AAE?C^4loZyBm z1RZnR8m>PU8y@B+um^ji8ax=lXp8{^h|O?c6u~0a3%d^Xnz5~^zv%>T*tU=?nYyDE zfZ; z`v0?zjqV9n$kL2MYv@8qDVj=*nw@bJdW#A(jw0OqOgTsXe5aN*@}hucr6&n-U?dzVx7G`u%Uj3jG!0Bx<7H}8w8(Ns}*!t-MB^@CrBuIiQyTSLMk_Llqs-=K=3aQN6*4Fkx^xDR5=GloIo~oDAqS7bOPs3 zL%Yb>B&zXBkWrW5mZUXTk@8#4-%rjT=BB&4muOLo#Xq{_~wyqPjF^;C=!%43b)sr$3M*cu#M!2#F!%4%-qppNEoY){&GR z$jklC%bu zFPrj{Aeyoh5O9(tG2s z)173fmU1!?5I6&wpRz`C!EYbLqrO|GzMgtbwFb0T1}@Aq+)vzt;X%dk4CYmh1+42XqyNU+6M-(}fM>1$)7^8oTgRiJyQM;0cd%yQ5-Xk31xQ!HVFjBltKRF-w4|7vAU9sV= zWm0emrB3!^VS9zjpTloT@B7H+AKHGjKhP{K4aflA) zL!=+f;AC*P7|r1rPBmVoTFOtp+jKPOXrJJthlKcj0?Ac0xCavUItVxU=vW(D3iQ}C zt%qwX`_=$(+>Tw8`E^MqH*xf9}hC z;~k%*;tL|HuHsJ+lvJkU&^7-e4uqI|QDm*K9_*~69sBpf@?RgW;=jH7T@C)@6MW?V z{p|7wWr;QftQ2n)Em~XHI)=B(2Yf7QrE2{dP@*4Ktz~~(9<#c#AM~;kqCK^@p(}oP zR`Dn(38l!Gee>lOZs@9eft)pVh1(+MSSSfTKQ}B6xZJsrWFS9=`J0+ISx#4~g-U|j zgM%sBQF_|GvfCglNmJLFPkTj+JTEdZi=c*L+^rUf^$LwAUGG&GE~zkqag%^iYo zzT9RQ>V<#o8sL|Ihq4TM6`qYwNAwISqnJSwN570gP{e>)_~2oMoUlqRHW5!C;prqc z(s`@__ni7g!~7fMjSjFJ13AJsYddIx97J@~y&)F@Fs3U}%kP03L)`PqfB*lihlPV! z7f?q4I>-ayAftOjezPb#0@o|-f;FNm%Lt0~F0g+|k>g=Lhpwnz7TU0H1KYB>YPwl8 zw!8C-op{&c+^{p`hoj+mb~v04C)1rAC8ar7QLA`$0h?7QSzFoE?cSBQyg%Naw`#SK zcKiEUw!g2;QW|EJun=o-igXh?-mNEftfd&BVvFhQG+`z22g5v@YUCx!7WpeEP%G6uEoh-umH~a-3B}BucKegBK!T>c%fbKsCye zZ4|?+rt?Wwf{RB3j%7Enc?h61zjILFjG%w_rWhkSoMK<;52&-+ZNlr>CbVMmd^|YJ z%4iZ2;R7Z{eK8qADULu6Z1qfk$}oLK<-1to=SE&+Y?-sE5L4B|sbnWrj;LbuqvoPX zIP^E1;DH*&l&Ebjg{I0f_BH`AMSR zg>DfSiz7r#41AA`4I5v_%hA{nY!QE6&CWE%qOlHwi#Y+*b!)x0c(^_X9`qgb5LvXw zW9(bCS(LoC?`pF!XYIQ?FWo06VXkh;KO>d2ezud+chE&Dr>F&|rWXzt_==w|b{<;( zpfQ|){XP)QINS^-Ue;B6l3B~do@OQY30D1x=((leRV>^ahaoSvk(3d_g2l zg{7dYn81+{?4&@q6wyL0?6*=eSVY^f%B+@E0-!$_G8W;{k4Im6onEKk>2-Ry9qkf9 zLp%C1=nUC|PVe@qY&L_3M74T)qWh+c_pIULnE*KMXlqQuA4#bZ&fDIYc##4J-h#c< z^!#w;&Ihyn980M|R6=I5?^S=iws8Sk%A3HNsR_?|{sV6)&v25lSDxAeIiEu&Z8BY( zOxH#ezS1gP!(M&@bM>3x!te9$zzJpKZFGNrigZ&!XB1ovSJ*`r{gHc5Tq8H*?Zsg~Kb5g|OiNZYi;REqg;-W$_w2Y9 zIlp^hGgY|U!~c2MJcxQJVD1vpF{&)By)__(Z*53dS^>KzwCHPNiD7=a;kl*X)#Qk~ zW=?dg2f;8L8VY~$hVyKJFYT$=4{|E@{S2dxi8&t+NBOBom&g!VHMK2@IHW8|`g1CV zP%WP*4!t26nL_zl!rFg-F7J8j4`(w7d!vKFWH3G$jpqG>IW$HGbE9`SAJ684fj-(z zj9{B#@@$+s&d)HpM2xI|LC~bN@=T&|N@Sb(55$K8hzi?=oi)a^G5p(1luTTsOQm|J zB!!#@o2mrW(InUJm9+4(t{wAnZA(p|dZngn-wV=;@AL6+lAnKz;ARL?$6H)vy2dP zK@9)0=GCIh!_Tviy*C?dbU%MiglPm{=9v;9_<{rQf<8)ZuwrA{*->}_#?oW);%`)} z6SSBbvl$#5Os13Z!Kgo-9ZVMscraU_MQ<_fO%OtnOX`1$V%2*+FNRG!ob;ysIqV%w z`g7x8G=}4Yx!#)|z(sGo=<9dB7i9}3$qrKa zQ6jrWy^Kr%AseqKq;>Qg|6WDGC51Bouvo$IX382)+DQcs=a1?cRGbv$0u`6_O>-*l zo5q9sWAa-liH>%*B$k6Nk!x)nJt7w(PrhlN(E5L3wRN!$P3>rKIGP?F&U%yCXw+e^ zgr{rJA03XS!^vpMA6`8`TRZ9xrqj`^*Pl+Oz2I@W{mI2=S38=FI@(A6*B1?by!Z_I z!{MQJo501kT*?&X115&`VEY&1_dN0S39T(QX@ed|1U|+ee7yMlnPL-vg<>uGyv+r4 zplN?16T554qmLJ#xdMI%T_o$_#3K5}aS&m8`l+M!6R1pw)9Iua$0m5zAVSf8k~j?# zIQ4sn!^2U3IvB;!>QDN;Nq=xSoHUAA*jrDE-7taOa4_f(2IJA;pchB4H|!nG2K{lr zH&R0IK#t)gg<&L(UW(x;f#GB{8jQxh*=T>1z%WMeO=38i9`r{2;?>CGm(&H%j9#k<8dU@@Pwq+K zzh~s0l>B=|?oXY-a|R8=#z;psM1F7IM1Bo~n%E8GENKnQ61^2k|IuJJnoSM|vq^sp zx#;8PLoO-%r{n2tHXMy-gZP3*9zP#)6(#>JsJ@ou-x1ZTZUJ6|>XS-fuc$t$0``dN zBMQJfH|aO408)=$S^=mc^!y4y6|<5GV6TvC!1&)Ca?L4#+Em}P0%(HjccTCrTDt~z z0lP!4fjz*kkV`9oLF@GSQO*Mb^m=~{I~$ui4;b`Dy?$>tnv5sydB8p~z$-ZqcrgZ0 zJr8&(28gHy15&7CL#7q>YL}JN6MKbRQeo^Ba^IE9Xs?hC} zD{s;sAs5ja{6Z6%&gl0>)A8XXvGMVqHMr}MTLwub@v_*Yw-GOiP1UC2P5iB0Mem)u z!VM{=NMcWV{lRQJ8uUl;ZFp?2*F0{D0({ULjAy;+XfRDo-0*NToX*C>(P7gkUpeTt zr@f^dJbOd)N%_84G@lap`$T{9Qu$xU+b=;g!~OJv3P2g79sB$1pjP(8H*{-epx3Z3 zv7`$p%N-kg{*3rFrwZzmf78045%O=q+rLBdPg(qXM*c~quwUdK(+bu-a*%Ce9d2v` zQq)ERHK-igXrMM4Xg`!f8x8c5$bBEtKoVupMg~30PN9tq+T*~8HZp&xjSOldgM^B3 z&=L`s7s|Oq+x8&gg?0)*VieFGrO>oT32oxoGllx>5!J`kKxC89YJpY@v|6Cm0<9MK z!L-1JxZWM=t@v-FiP~tQR`|EkM6WuU=;_I;EbMAWWMi5g?LC2WGb{`2)i(WvJsiBB z@R9%gXm3O%(_TkA;eUVgKN-LiYeT39^{Jo?cZurEelIHJnS-GOMU(xzE}kN&e@lPp zmx^tyDtNNMtPG*p>oPOK%f+h9$49SaP;ESgXtFwZtmv)MMN)p%+Y*gcZ;6T&+Eu)& zDpD~woA{cc%LLCUE=P>TC4`t@SjDTn${>*xD&@c7Qb*~tGSfSwQVqV^leiEoL3UgQ xs cbg.MaxLength { + return xerrors.Errorf("Value in field \"RemoteCommit2Endpoint\" was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("RemoteCommit2Endpoint"))); err != nil { + return err + } + if _, err := io.WriteString(w, string("RemoteCommit2Endpoint")); err != nil { + return err + } + + if len(t.RemoteCommit2Endpoint) > cbg.MaxLength { + return xerrors.Errorf("Value in field t.RemoteCommit2Endpoint was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len(t.RemoteCommit2Endpoint))); err != nil { + return err + } + if _, err := io.WriteString(w, string(t.RemoteCommit2Endpoint)); err != nil { + return err + } + // t.RemoteDataFinalized (bool) (bool) if len("RemoteDataFinalized") > cbg.MaxLength { return xerrors.Errorf("Value in field \"RemoteDataFinalized\" was too long") @@ -1513,6 +1536,17 @@ func (t *SectorInfo) UnmarshalCBOR(r io.Reader) (err error) { t.RemoteCommit1Endpoint = string(sval) } + // t.RemoteCommit2Endpoint (string) (string) + case "RemoteCommit2Endpoint": + + { + sval, err := cbg.ReadString(cr) + if err != nil { + return err + } + + t.RemoteCommit2Endpoint = string(sval) + } // t.RemoteDataFinalized (bool) (bool) case "RemoteDataFinalized": diff --git a/storage/pipeline/fsm.go b/storage/pipeline/fsm.go index fb0d16b38..fc0a93a85 100644 --- a/storage/pipeline/fsm.go +++ b/storage/pipeline/fsm.go @@ -225,7 +225,7 @@ var fsmPlanners = map[SectorState]func(events []statemachine.Event, state *Secto on(SectorRetryComputeProof{}, Committing), on(SectorSealPreCommit1Failed{}, SealPreCommit1Failed), ), - RemoteCommit1Failed: planOne( + RemoteCommitFailed: planOne( on(SectorRetryComputeProof{}, Committing), ), CommitFinalizeFailed: planOne( @@ -542,8 +542,8 @@ func (m *Sealing) plan(events []statemachine.Event, state *SectorInfo) (func(sta return m.handlePreCommitFailed, processed, nil case ComputeProofFailed: return m.handleComputeProofFailed, processed, nil - case RemoteCommit1Failed: - return m.handleRemoteCommit1Failed, processed, nil + case RemoteCommitFailed: + return m.handleRemoteCommitFailed, processed, nil case CommitFailed: return m.handleCommitFailed, processed, nil case CommitFinalizeFailed: @@ -671,8 +671,8 @@ func planCommitting(events []statemachine.Event, state *SectorInfo) (uint64, err return uint64(i + 1), nil case SectorComputeProofFailed: state.State = ComputeProofFailed - case SectorRemoteCommit1Failed: - state.State = RemoteCommit1Failed + case SectorRemoteCommit1Failed, SectorRemoteCommit2Failed: + state.State = RemoteCommitFailed case SectorSealPreCommit1Failed: state.State = SealPreCommit1Failed case SectorCommitFailed: diff --git a/storage/pipeline/fsm_events.go b/storage/pipeline/fsm_events.go index 600770c01..1fbd94fd0 100644 --- a/storage/pipeline/fsm_events.go +++ b/storage/pipeline/fsm_events.go @@ -223,6 +223,11 @@ type SectorRemoteCommit1Failed struct{ error } func (evt SectorRemoteCommit1Failed) FormatError(xerrors.Printer) (next error) { return evt.error } func (evt SectorRemoteCommit1Failed) apply(*SectorInfo) {} +type SectorRemoteCommit2Failed struct{ error } + +func (evt SectorRemoteCommit2Failed) FormatError(xerrors.Printer) (next error) { return evt.error } +func (evt SectorRemoteCommit2Failed) apply(*SectorInfo) {} + type SectorComputeProofFailed struct{ error } func (evt SectorComputeProofFailed) FormatError(xerrors.Printer) (next error) { return evt.error } diff --git a/storage/pipeline/receive.go b/storage/pipeline/receive.go index d7eb5de7e..f06848bcb 100644 --- a/storage/pipeline/receive.go +++ b/storage/pipeline/receive.go @@ -3,6 +3,7 @@ package sealing import ( "bytes" "context" + "net/url" "github.com/ipfs/go-cid" "github.com/ipfs/go-datastore" @@ -177,7 +178,24 @@ func (m *Sealing) checkSectorMeta(ctx context.Context, meta api.RemoteSectorMeta } info.RemoteDataSealed = meta.DataSealed // todo make head requests to check? info.RemoteDataCache = meta.DataCache - info.RemoteCommit1Endpoint = meta.RemoteCommit1Endpoint + + if meta.RemoteCommit1Endpoint != "" { + // validate the url + if _, err := url.Parse(meta.RemoteCommit1Endpoint); err != nil { + return SectorInfo{}, xerrors.Errorf("parsing remote c1 endpoint url: %w", err) + } + + info.RemoteCommit1Endpoint = meta.RemoteCommit1Endpoint + } + + if meta.RemoteCommit2Endpoint != "" { + // validate the url + if _, err := url.Parse(meta.RemoteCommit2Endpoint); err != nil { + return SectorInfo{}, xerrors.Errorf("parsing remote c2 endpoint url: %w", err) + } + + info.RemoteCommit2Endpoint = meta.RemoteCommit2Endpoint + } // If we get a sector after PC2, and remote C1 endpoint is set, assume that we're getting finalized sector data if info.RemoteCommit1Endpoint != "" { diff --git a/storage/pipeline/sector_state.go b/storage/pipeline/sector_state.go index 136e72a16..7a56c136b 100644 --- a/storage/pipeline/sector_state.go +++ b/storage/pipeline/sector_state.go @@ -31,7 +31,7 @@ var ExistSectorStateList = map[SectorState]struct{}{ SealPreCommit2Failed: {}, PreCommitFailed: {}, ComputeProofFailed: {}, - RemoteCommit1Failed: {}, + RemoteCommitFailed: {}, CommitFailed: {}, PackingFailed: {}, FinalizeFailed: {}, @@ -125,7 +125,7 @@ const ( SealPreCommit2Failed SectorState = "SealPreCommit2Failed" PreCommitFailed SectorState = "PreCommitFailed" ComputeProofFailed SectorState = "ComputeProofFailed" - RemoteCommit1Failed SectorState = "RemoteCommit1Failed" + RemoteCommitFailed SectorState = "RemoteCommitFailed" CommitFailed SectorState = "CommitFailed" PackingFailed SectorState = "PackingFailed" // TODO: deprecated, remove FinalizeFailed SectorState = "FinalizeFailed" diff --git a/storage/pipeline/states_failed.go b/storage/pipeline/states_failed.go index 7292961d2..b90833b2d 100644 --- a/storage/pipeline/states_failed.go +++ b/storage/pipeline/states_failed.go @@ -184,13 +184,13 @@ func (m *Sealing) handleComputeProofFailed(ctx statemachine.Context, sector Sect return ctx.Send(SectorRetryComputeProof{}) } -func (m *Sealing) handleRemoteCommit1Failed(ctx statemachine.Context, sector SectorInfo) error { +func (m *Sealing) handleRemoteCommitFailed(ctx statemachine.Context, sector SectorInfo) error { if err := failedCooldown(ctx, sector); err != nil { return err } if sector.InvalidProofs > 1 { - log.Errorw("consecutive remote commit1 fails", "sector", sector.SectorNumber, "c1url", sector.RemoteCommit1Endpoint) + log.Errorw("consecutive remote commit fails", "sector", sector.SectorNumber, "c1url", sector.RemoteCommit1Endpoint, "c2url", sector.RemoteCommit2Endpoint) } return ctx.Send(SectorRetryComputeProof{}) diff --git a/storage/pipeline/states_sealing.go b/storage/pipeline/states_sealing.go index 56b7eb37a..9b815053a 100644 --- a/storage/pipeline/states_sealing.go +++ b/storage/pipeline/states_sealing.go @@ -574,6 +574,7 @@ func (m *Sealing) handleCommitting(ctx statemachine.Context, sector SectorInfo) var c2in storiface.Commit1Out if sector.RemoteCommit1Endpoint == "" { + // Local Commit1 cids := storiface.SectorCids{ Unsealed: *sector.CommD, Sealed: *sector.CommR, @@ -583,6 +584,8 @@ func (m *Sealing) handleCommitting(ctx statemachine.Context, sector SectorInfo) return ctx.Send(SectorComputeProofFailed{xerrors.Errorf("computing seal proof failed(1): %w", err)}) } } else { + // Remote Commit1 + reqData := api.RemoteCommit1Params{ Ticket: sector.TicketValue, Seed: sector.SeedValue, @@ -618,9 +621,50 @@ func (m *Sealing) handleCommitting(ctx statemachine.Context, sector SectorInfo) } } - proof, err := m.sealer.SealCommit2(sector.sealingCtx(ctx.Context()), m.minerSector(sector.SectorType, sector.SectorNumber), c2in) - if err != nil { - return ctx.Send(SectorComputeProofFailed{xerrors.Errorf("computing seal proof failed(2): %w", err)}) + var porepProof storiface.Proof + + if sector.RemoteCommit2Endpoint == "" { + // Local Commit2 + + porepProof, err = m.sealer.SealCommit2(sector.sealingCtx(ctx.Context()), m.minerSector(sector.SectorType, sector.SectorNumber), c2in) + if err != nil { + return ctx.Send(SectorComputeProofFailed{xerrors.Errorf("computing seal proof failed(2): %w", err)}) + } + } else { + // Remote Commit2 + + reqData := api.RemoteCommit2Params{ + ProofType: sector.SectorType, + Sector: m.minerSectorID(sector.SectorNumber), + + Commit1Out: c2in, + } + reqBody, err := json.Marshal(&reqData) + if err != nil { + return xerrors.Errorf("marshaling remote commit2 request: %w", err) + } + + req, err := http.NewRequest("POST", sector.RemoteCommit2Endpoint, bytes.NewReader(reqBody)) + if err != nil { + return ctx.Send(SectorRemoteCommit2Failed{xerrors.Errorf("creating new remote commit2 request: %w", err)}) + } + req.Header.Set("Content-Type", "application/json") + req = req.WithContext(ctx.Context()) + resp, err := http.DefaultClient.Do(req) + if err != nil { + return ctx.Send(SectorRemoteCommit2Failed{xerrors.Errorf("requesting remote commit2: %w", err)}) + } + + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + return ctx.Send(SectorRemoteCommit2Failed{xerrors.Errorf("remote commit2 received non-200 http response %s", resp.Status)}) + } + + porepProof, err = io.ReadAll(resp.Body) // todo some len constraint + if err != nil { + return ctx.Send(SectorRemoteCommit2Failed{xerrors.Errorf("reading commit2 response: %w", err)}) + } } { @@ -630,19 +674,19 @@ func (m *Sealing) handleCommitting(ctx statemachine.Context, sector SectorInfo) return nil } - if err := m.checkCommit(ctx.Context(), sector, proof, ts.Key()); err != nil { + if err := m.checkCommit(ctx.Context(), sector, porepProof, ts.Key()); err != nil { return ctx.Send(SectorCommitFailed{xerrors.Errorf("commit check error: %w", err)}) } } if cfg.FinalizeEarly { return ctx.Send(SectorProofReady{ - Proof: proof, + Proof: porepProof, }) } return ctx.Send(SectorCommitted{ - Proof: proof, + Proof: porepProof, }) } diff --git a/storage/pipeline/types.go b/storage/pipeline/types.go index f59755dce..81a2a2fec 100644 --- a/storage/pipeline/types.go +++ b/storage/pipeline/types.go @@ -98,6 +98,7 @@ type SectorInfo struct { RemoteDataSealed *storiface.SectorData RemoteDataCache *storiface.SectorData RemoteCommit1Endpoint string + RemoteCommit2Endpoint string RemoteDataFinalized bool // Debug From 474c60203bb41f6e63e833193a58b28d7058b96f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 9 Sep 2022 13:31:03 +0200 Subject: [PATCH 164/185] tarutil: Strict header checks --- storage/sealer/storiface/storage.go | 2 +- storage/sealer/tarutil/systar.go | 68 +++++++++++++++++++++++++++-- 2 files changed, 66 insertions(+), 4 deletions(-) diff --git a/storage/sealer/storiface/storage.go b/storage/sealer/storiface/storage.go index 975011a0b..5246a1a1a 100644 --- a/storage/sealer/storiface/storage.go +++ b/storage/sealer/storiface/storage.go @@ -131,7 +131,7 @@ type SectorData struct { // URL to the sector data // For sealed/unsealed sector, lotus expects octet-stream - // For cache, lotus expects a tar archive with cache files (todo maybe use not-tar; specify what files with what paths must be present) + // For cache, lotus expects a tar archive with cache files // Valid schemas: // - http:// / https:// URL string diff --git a/storage/sealer/tarutil/systar.go b/storage/sealer/tarutil/systar.go index 96dcce875..f7437d1f2 100644 --- a/storage/sealer/tarutil/systar.go +++ b/storage/sealer/tarutil/systar.go @@ -12,6 +12,63 @@ import ( var log = logging.Logger("tarutil") // nolint +var CacheFileConstraints = map[string]int64{ + "p_aux": 64, + "t_aux": 10240, + + "sc-02-data-tree-r-last.dat": 10_000_000, // small sectors + + "sc-02-data-tree-r-last-0.dat": 10_000_000, + "sc-02-data-tree-r-last-1.dat": 10_000_000, + "sc-02-data-tree-r-last-2.dat": 10_000_000, + "sc-02-data-tree-r-last-3.dat": 10_000_000, + "sc-02-data-tree-r-last-4.dat": 10_000_000, + "sc-02-data-tree-r-last-5.dat": 10_000_000, + "sc-02-data-tree-r-last-6.dat": 10_000_000, + "sc-02-data-tree-r-last-7.dat": 10_000_000, + + "sc-02-data-tree-r-last-8.dat": 10_000_000, + "sc-02-data-tree-r-last-9.dat": 10_000_000, + "sc-02-data-tree-r-last-10.dat": 10_000_000, + "sc-02-data-tree-r-last-11.dat": 10_000_000, + "sc-02-data-tree-r-last-12.dat": 10_000_000, + "sc-02-data-tree-r-last-13.dat": 10_000_000, + "sc-02-data-tree-r-last-14.dat": 10_000_000, + "sc-02-data-tree-r-last-15.dat": 10_000_000, + + "sc-02-data-layer-1.dat": 65 << 30, // 1x sector size + small buffer + "sc-02-data-layer-2.dat": 65 << 30, // 1x sector size + small buffer + "sc-02-data-layer-3.dat": 65 << 30, // 1x sector size + small buffer + "sc-02-data-layer-4.dat": 65 << 30, // 1x sector size + small buffer + "sc-02-data-layer-5.dat": 65 << 30, // 1x sector size + small buffer + "sc-02-data-layer-6.dat": 65 << 30, // 1x sector size + small buffer + "sc-02-data-layer-7.dat": 65 << 30, // 1x sector size + small buffer + "sc-02-data-layer-8.dat": 65 << 30, // 1x sector size + small buffer + "sc-02-data-layer-9.dat": 65 << 30, // 1x sector size + small buffer + "sc-02-data-layer-10.dat": 65 << 30, // 1x sector size + small buffer + "sc-02-data-layer-11.dat": 65 << 30, // 1x sector size + small buffer + + "sc-02-data-tree-c-0.dat": 5 << 30, // ~4.6G + "sc-02-data-tree-c-1.dat": 5 << 30, + "sc-02-data-tree-c-2.dat": 5 << 30, + "sc-02-data-tree-c-3.dat": 5 << 30, + "sc-02-data-tree-c-4.dat": 5 << 30, + "sc-02-data-tree-c-5.dat": 5 << 30, + "sc-02-data-tree-c-6.dat": 5 << 30, + "sc-02-data-tree-c-7.dat": 5 << 30, + + "sc-02-data-tree-c-8.dat": 5 << 30, + "sc-02-data-tree-c-9.dat": 5 << 30, + "sc-02-data-tree-c-10.dat": 5 << 30, + "sc-02-data-tree-c-11.dat": 5 << 30, + "sc-02-data-tree-c-12.dat": 5 << 30, + "sc-02-data-tree-c-13.dat": 5 << 30, + "sc-02-data-tree-c-14.dat": 5 << 30, + "sc-02-data-tree-c-15.dat": 5 << 30, + + "sc-02-data-tree-d.dat": 130 << 30, // 2x sector size, ~130G accunting for small buffer on 64G sectors +} + func ExtractTar(body io.Reader, dir string, buf []byte) (int64, error) { if err := os.MkdirAll(dir, 0755); err != nil { // nolint return 0, xerrors.Errorf("mkdir: %w", err) @@ -37,9 +94,14 @@ func ExtractTar(body io.Reader, dir string, buf []byte) (int64, error) { return read, xerrors.Errorf("creating file %s: %w", filepath.Join(dir, header.Name), err) } - // This data is coming from a trusted source, no need to check the size. - // TODO: now it's actually not coming from a trusted source, check size / paths - //nolint:gosec + sz, found := CacheFileConstraints[header.Name] + if !found { + return read, xerrors.Errorf("tar file %#v isn't expected") + } + if header.Size > sz { + return read, xerrors.Errorf("tar file %#v is bigger than expected: %d > %d", header.Name, header.Size, sz) + } + r, err := io.CopyBuffer(f, tr, buf) read += r if err != nil { From ef834b988c5f1f2ab05c4f80e416f81a6f614a8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 9 Sep 2022 13:42:04 +0200 Subject: [PATCH 165/185] sector import: Fix test build --- itests/sector_import_full_test.go | 150 +++++++++++++++++++++++++++- itests/sector_import_simple_test.go | 20 +--- 2 files changed, 152 insertions(+), 18 deletions(-) diff --git a/itests/sector_import_full_test.go b/itests/sector_import_full_test.go index 3e67b94fc..b26a24145 100644 --- a/itests/sector_import_full_test.go +++ b/itests/sector_import_full_test.go @@ -3,7 +3,12 @@ package itests import ( "bytes" "context" + "encoding/json" "fmt" + lminer "github.com/filecoin-project/lotus/chain/actors/builtin/miner" + "github.com/filecoin-project/lotus/chain/types" + spaths "github.com/filecoin-project/lotus/storage/paths" + "github.com/filecoin-project/lotus/storage/sealer/tarutil" "net/http" "net/http/httptest" "os" @@ -39,7 +44,7 @@ func TestSectorImport(t *testing.T) { makeTest := func(mut func(*testCase)) *testCase { tc := &testCase{ - c1handler: remoteCommit1, + c1handler: testRemoteCommit1, } mut(tc) return tc @@ -72,7 +77,11 @@ func TestSectorImport(t *testing.T) { mid, err := address.IDFromAddress(maddr) require.NoError(t, err) - spt, err := currentSealProof(ctx, client, maddr) + mi, err := client.StateMinerInfo(ctx, maddr, types.EmptyTSK) + require.NoError(t, err) + ver, err := client.StateNetworkVersion(ctx, types.EmptyTSK) + require.NoError(t, err) + spt, err := lminer.PreferredSealProofTypeFromWindowPoStType(ver, mi.WindowPoStProofType) require.NoError(t, err) ssize, err := spt.SectorSize() @@ -141,8 +150,9 @@ func TestSectorImport(t *testing.T) { // start http server serving sector data m := mux.NewRouter() - m.HandleFunc("/sectors/{type}/{id}", remoteGetSector(sectorDir)).Methods("GET") + m.HandleFunc("/sectors/{type}/{id}", testRemoteGetSector(sectorDir)).Methods("GET") m.HandleFunc("/sectors/{id}/commit1", tc.c1handler(sealer)).Methods("POST") + m.HandleFunc("/commit2", testRemoteCommit2(sealer)).Methods("POST") srv := httptest.NewServer(m) unsealedURL := fmt.Sprintf("%s/sectors/unsealed/s-t0%d-%d", srv.URL, mid, snum) @@ -288,3 +298,137 @@ func TestSectorImport(t *testing.T) { }))) } + +// note: stuff below is almost the same as in _simple version of this file; We need +// to copy it because on Circle we can't call those functions between test files, +// and for the _simple test we want everything in one file to make it easy to follow + +func testRemoteCommit1(s *ffiwrapper.Sealer) func(w http.ResponseWriter, r *http.Request) { + return func(w http.ResponseWriter, r *http.Request) { + vars := mux.Vars(r) + + // validate sector id + id, err := storiface.ParseSectorID(vars["id"]) + if err != nil { + w.WriteHeader(500) + return + } + + var params api.RemoteCommit1Params + if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { + w.WriteHeader(500) + return + } + + sref := storiface.SectorRef{ + ID: id, + ProofType: params.ProofType, + } + + ssize, err := params.ProofType.SectorSize() + if err != nil { + w.WriteHeader(500) + return + } + + p, err := s.SealCommit1(r.Context(), sref, params.Ticket, params.Seed, []abi.PieceInfo{ + { + Size: abi.PaddedPieceSize(ssize), + PieceCID: params.Unsealed, + }, + }, storiface.SectorCids{ + Unsealed: params.Unsealed, + Sealed: params.Sealed, + }) + if err != nil { + w.WriteHeader(500) + return + } + + if _, err := w.Write(p); err != nil { + fmt.Println("c1 write error") + } + } +} + +func testRemoteCommit2(s *ffiwrapper.Sealer) func(w http.ResponseWriter, r *http.Request) { + return func(w http.ResponseWriter, r *http.Request) { + var params api.RemoteCommit2Params + if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { + w.WriteHeader(500) + return + } + + sref := storiface.SectorRef{ + ID: params.Sector, + ProofType: params.ProofType, + } + + p, err := s.SealCommit2(r.Context(), sref, params.Commit1Out) + if err != nil { + fmt.Println("c2 error: ", err) + w.WriteHeader(500) + return + } + + if _, err := w.Write(p); err != nil { + fmt.Println("c2 write error") + } + } +} + +func testRemoteGetSector(sectorRoot string) func(w http.ResponseWriter, r *http.Request) { + return func(w http.ResponseWriter, r *http.Request) { + + vars := mux.Vars(r) + + // validate sector id + id, err := storiface.ParseSectorID(vars["id"]) + if err != nil { + w.WriteHeader(500) + return + } + + // validate type + _, err = spaths.FileTypeFromString(vars["type"]) + if err != nil { + w.WriteHeader(500) + return + } + + typ := vars["type"] + if typ == "cache" { + // if cache is requested, send the finalized cache we've created above + typ = "fin-cache" + } + + path := filepath.Join(sectorRoot, typ, vars["id"]) + + stat, err := os.Stat(path) + if err != nil { + w.WriteHeader(500) + return + } + + if stat.IsDir() { + if _, has := r.Header["Range"]; has { + w.WriteHeader(500) + return + } + + w.Header().Set("Content-Type", "application/x-tar") + w.WriteHeader(200) + + err := tarutil.TarDirectory(path, w, make([]byte, 1<<20)) + if err != nil { + return + } + } else { + w.Header().Set("Content-Type", "application/octet-stream") + // will do a ranged read over the file at the given path if the caller has asked for a ranged read in the request headers. + http.ServeFile(w, r, path) + } + + fmt.Printf("served sector file/dir, sectorID=%+v, fileType=%s, path=%s\n", id, vars["type"], path) + } +} diff --git a/itests/sector_import_simple_test.go b/itests/sector_import_simple_test.go index 419415c1b..f75d0d842 100644 --- a/itests/sector_import_simple_test.go +++ b/itests/sector_import_simple_test.go @@ -57,7 +57,11 @@ func TestSectorImportAfterPC2(t *testing.T) { mid, err := address.IDFromAddress(maddr) require.NoError(t, err) - spt, err := currentSealProof(ctx, client, maddr) + mi, err := client.StateMinerInfo(ctx, maddr, types.EmptyTSK) + require.NoError(t, err) + ver, err := client.StateNetworkVersion(ctx, types.EmptyTSK) + require.NoError(t, err) + spt, err := lminer.PreferredSealProofTypeFromWindowPoStType(ver, mi.WindowPoStProofType) require.NoError(t, err) ssize, err := spt.SectorSize() @@ -316,17 +320,3 @@ func remoteGetSector(sectorRoot string) func(w http.ResponseWriter, r *http.Requ fmt.Printf("served sector file/dir, sectorID=%+v, fileType=%s, path=%s\n", id, vars["type"], path) } } - -func currentSealProof(ctx context.Context, api api.FullNode, maddr address.Address) (abi.RegisteredSealProof, error) { - mi, err := api.StateMinerInfo(ctx, maddr, types.EmptyTSK) - if err != nil { - return 0, err - } - - ver, err := api.StateNetworkVersion(ctx, types.EmptyTSK) - if err != nil { - return 0, err - } - - return lminer.PreferredSealProofTypeFromWindowPoStType(ver, mi.WindowPoStProofType) -} From 061a990eb8e566bbfbb56379882b077a13493bfb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 9 Sep 2022 14:38:23 +0200 Subject: [PATCH 166/185] sector import: RemoteSealingDoneEndpoint --- api/api_storage.go | 21 +++++- build/openrpc/miner.json.gz | Bin 15813 -> 15826 bytes documentation/en/api-v0-methods-miner.md | 3 +- itests/kit/node_miner.go | 2 +- itests/sector_import_full_test.go | 78 ++++++++++++++++++++--- itests/sector_import_simple_test.go | 27 +++++++- storage/pipeline/cbor_gen.go | 36 ++++++++++- storage/pipeline/fsm.go | 61 ++++++++++++++++-- storage/pipeline/fsm_events.go | 3 + storage/pipeline/receive.go | 9 +++ storage/pipeline/types.go | 13 ++-- 11 files changed, 226 insertions(+), 27 deletions(-) diff --git a/api/api_storage.go b/api/api_storage.go index 6273c4881..5d7455340 100644 --- a/api/api_storage.go +++ b/api/api_storage.go @@ -573,12 +573,17 @@ type RemoteSectorMeta struct { // SEALING SERVICE HOOKS // URL - // todo better doc + // RemoteCommit1Endpoint is an URL of POST endpoint which lotus will call requesting Commit1 (seal_commit_phase1) + // request body will be json-serialized RemoteCommit1Params struct RemoteCommit1Endpoint string + // RemoteCommit2Endpoint is an URL of POST endpoint which lotus will call requesting Commit2 (seal_commit_phase2) + // request body will be json-serialized RemoteCommit2Params struct RemoteCommit2Endpoint string - // todo OnDone / OnStateChange + // RemoteSealingDoneEndpoint is called after the sector exists the sealing pipeline + // request body will be json-serialized RemoteSealingDoneParams struct + RemoteSealingDoneEndpoint string } type RemoteCommit1Params struct { @@ -597,3 +602,15 @@ type RemoteCommit2Params struct { // todo spec better Commit1Out storiface.Commit1Out } + +type RemoteSealingDoneParams struct { + // Successful is true if the sector has entered state considered as "successfully sealed" + Successful bool + + // State is the state the sector has entered + // For example "Proving" / "Removing" + State string + + // Optional commit message CID + CommitMessage *cid.Cid +} diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index 3d42364ddb4334b44a3ef885e0d3e628097916d1..f2bd95d2fb4f845af7ee46ac47065bd04a687dad 100644 GIT binary patch literal 15826 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 literal 15813 zcmV;$Jvzc4iwFP!00000|LnbcbK5r7IQ&&GeCM4_JF=p?CC}_1j-905I;|huX`g3f z&lVyf32O>uNyxU6@pu0X0Nx3b;6=9LaJSQ1BzSNDoEr|#IryeoHX@F#Ye!nYJLpcd zj)uv?(vH4q6jKvvN7}hXH!irmI045OXIe+QM~;gv!oTPrb_WLry4RjM+8WW7Ww_eW zmv0(@Yxd~}Y$Dylqv&8Z#U$I;stQKXM`e$ zKr@C7_~$ZwXto>p~zsLJh6XyUuAUh#_s)e zL!NHPUw{3jbu@RgUPEWA9cfxev!MgmVvrk$P1$^VU|TNcQ{%m6Q+nIc9OQ0H%2vjk z-2{HAc}>5Mb?xdaw1x~GdW37+M64fe(d!R}Bki`sKIdpa^TM%gtWMTDr@SiI3qUrmM{y zIB0EA1WZisw2roMOzlWpQEIzKZ{IF?ldf*9-!43QJFp##;q}&JwEK2$TJyJS=u+go zg*JX`JJ#d&KTAZqOY8qTAI@eo?dhqLPqil&S>R=D+7)2r6dY@!O249Y4i(4RRi@zp z@10O`{v0RY7E|#z?ZQDP)_RR8n_kB<KZv~Odv(lx2Fi27n`|>-Ie@3cH!Ja zzdsPerLl1^ylczSVAAdW{%e1!2@{*r^ca$_Glt-s zs${dCBPRvsH~tu47eEj+i41!<8jfd&!|8A`y$uKFwfw%BbI{LW&Ob3-84i4S2Te%y z8XTGcl*y)Z+`YE$5IJ638^TN;9UI*fY!vcmqJtbJ^&pn#&h!|vSu}|bG)?Ql1=Io$ z-WxFYUM(DJ4c2VN0A$^;M%DxWDH!vHT-iv+i!FeBRseLtjn=!-V&E1V)AV6>!SxEe zKz>5&0& z0IdtoC=*c&%UL4>%(no7Kg3qM10XoD45WiM4=b#%044@zBj&5VF)7yB+XEZwcgP5O zVRQErV1xj{C)R2O-BmX(`o3vz*?Pmpb};`6bp(eGuCbbIhj2Kd^Pzi(*7kp`$G`2( z)>_;Dov#;YyBLlZc(~b4HXAe=+>f-Uh}3kcgURwcmzu+YTxy=IkbZaJSoh36tt2jE z5c1^YC0b&JA2KeiD|+Er)}jOK0r+z3Qp>>$s3T7`ULy8p2$)&?6L_lV7am`VlKHc7S{B6&df_+bXlPWqX@qverWWv4ullS{6#J0HY zlVm#<8D9wi5gim+QL(2hy`aO?f->$^T0aIof`GpnuC5t#I68%8ep?mCOn)$BS{IUk zPyls~FK`evfNAM>T$9+4G8u6ZBaZIR5eI7hK7NR3ygFmHqZ6|gwlqA@HW`I$r)K#xr!y$bHVmHfLKnKBnRg!lbtJ))MV{U zjr4ni(M~i;d}YB_D z?w%qcx#G|_+bRn~4j@Yuez~1*ut_oLzJH{M7|0MhPl!8vz-1+~ z9xov=tTo|Bj`om0K3PFb-rJVG>HvGh9uY(zEa$H4ZRmaiZ$kJH`@T?$@^(2gR06e% zB=u(|YLv5~>{OoS&A6&%dxbbBS_|!H+R>s`igq;fAN-28+7a29W{0;&Mx#QZs=XXR zUBv{BVO~<6gtJiX(+cKyqtni9;h+E1Vk=ffO{bLdE;a~p!Lma;qu=W{ zU}%hF14xL$-3?+=bp$fAL?TpkgqMOxAuhAR517p2f4$pM_E!5pV)p)h^=_q;f348} z{PUk$b@3AEMMbkwebBy;)VZ*i-vtGS0P6 z{=~$v9@xCsF;YS(S(eHM6FM1jn}p4-+r7s26{5eQEjKgx*+chgGhbsWfO%dou9FpP zju3-f!y~_+Dpp8r=+CmH6H~b}u{0X&WCxd6byd03gt^m6f|=VxcSRjC8r~f)ha2J` z9Wt-(+A9u>JVBa_;rjJrYvwd5(dK=u{%u3qMer?NbB|6BDEz zjo4lkI+TxAP~;gg(4%;Bb%$-6jp56<)8`_Si()UTsg$bdXxv^90W!jBIO6I(_JWyA z+L5q?s;ifDPbyj_g+?UAM#b(b>_8IXJAG22#r)0z_^Ulu-6@ zgtCJ!Vx8*zhYN^hATSrtEMg!B&=mqMkEp=N0BrgJo5U`-UZEQj1WjattuxI5L*u-!>Mt zQR3*vYYXn7xj|ah6Mvab{%vEL5?hKtjM!d*-DH~IIde}B<;;BwmoBv&^zoz;Ylol9 zG4N?ScST!m_%+XN=7Cz5aq3utU~UD)8=pqCkT#Q1ph|*ntnaR@NPIX+=aWslffaJ ze;wh`WHL4uo3GCB?}a;>uc0w99)}n&jlZ>ycD2!UaymmYlVf{lw78PGap@Lyw|RNH)mjgcDH2 z3ata0Ft;*lSU_yL053w?W+;l40GxrY7$(1=2jH?lx;NyEg1KqwcP`ivip}H%Eil3E ziql?eb$-95XS6WMugTX_??(r0Pi6-`4-Y5d~X}>L>WJ?p>v0*8)~7( zja+Hujl9h>8@NnZX-8Tp!jAp9()PyO6*wxzDZVaSw?E9tGYZ(mvhFrEkAbQwULt_9 ztXw|_sJgI;bn+bHCO)QOlQ@Q7w%GAR4)<}fd4irFX^HOm2NFZ1&q+>`xO3~V;JV(?KF9775wV2bQ z+GdVZG=r0|q4PT2hFdvswun6CSajHi*ViT7IOWsa?)tuO1|DbRl!R0&ygyBFa0F5V zEF6K>91q7)RAJ&M8fjPA8j=k(&8_fP8QxdomoT$zFYdqPqwkuJCK<^HrwE$viA7v& zAm{hR!o&n!`mR0xvKmtrf|Yw$=9XpV?r;j>%6UyJL>ZP-8Ng18NqL!+FOgokuf%(p z5veL$B##=KCEX~{<_I?mb%$h|K)xl~=ONl@MhH}ViO5a_t^{fmWGex?6S|e7-xBWg z5bi81yeGXz4GY^8%*Kdz=b~1IdP}g+La>8gR-j6Bg+7yeu|PaYw1! zU!}f#Cf++z_*u2aqi>$AM8~bPywxk(*`)0LSH{?rtOy=P)mMn_DEOcVa+W_qlp)Xe zAQZuF#IK+*fSq5$@^V$3f4EKTVP1evniiVz0_VeRmPLwP!L=DAfqcszuZKORc_Bbi zN@z5oq5yDH45A!YQG-L|=(jBLdRSzZ7jTp!h2|BAO7uo`_SmWVkfGkP#;akCVJ|PF zDMAQM2Zvx;Q84p=Prw`ki%!CF{zX>{X4tMX1J59Y&=3y3jpsAPKUo*)}J50 zK7Rf6-~V@ye)(T&f1Dh<&gXx<)Bk+@<=uy?!7uK6>*MvK^XdHl*Z-x9%7Nm0dU^8? zC;JXFqG7x!>Iie5Vz?xhOR-*UH;@Z4OA2}f{1bTdv*fG1Sh(Eoi9qXihQyBnvQnno`@AZSwTXO>9r0L0>o1h(=BSR zQ(n5S(&RE^T$^9$QXK@tW%v}J7Q{G5wBylG#6E9a?Wo_;-a)t7T#7R{G8JN?&fF^` z#wC9LVQuskA7*00KOxtJOUX+7&a8(ERA*}ZDd3dKuN|Xs>D@!?{q^OW_M4#2ME9qX zjIH3MxV^@>#{A1(uh&1||6KQaNBp0EYaPvt8qaTZZY>2C=hiaaj{=CN+o#*7r;Zk7 zmsHvqV@I|gEpN2E(eg%;H%eY{FH`2>}|k6lHo^qNL~!rNvdSXC-|6t#@0Am9fZk6m%_CjRs?ypF+<8P#DV_)&0>3SCfe|lKrwUQ zv}?{sgO0|FW63VRFS&E|hFazp5f4=rNf@6Er7vQ0s`y2TO97mfm$KYo(O#)Sim}K&RrBYkjtd2kqfOdwB3{hX=2=l;>!ik?R;y ztd(;d6EJGl=1xG{Nrmn-#%-PMwoZ3jr@O7w-PY-D>vVs2%6*cN9v-T>Goo8ei_jWH zfij_GDg5|}F^8qD{1biTngJOdRWu3GquY^jkb$u6_WZf%Hha(tOwqUvUNjG4;XoEfVkbD4#9dkTs~w(Nh@ zNRrOVJJz77>dQ%Rxomn9tX&qHC}l}jD9_&+mtC?3ew>ti%aZwByFqL>h~L2mF=67A zT$701QubR%qXIBexDYMJ><$+3DUy`VwE2&|j5aRC>7vRP zP02x3ziUbkuPO1C!gA-gCbrcQ+KZrGRtO9-uH_ayaaFej-&Ix#KF;uL9^LLcygVb6 z8#{>yLjdQvd$NL<@V#CK*dzYv0vZM~g1v4B*kjrALP>I!Q^c>V{0N2`wTKwT47;65 zk?5?c>HD5muR-f;xus$DGDzYkcDvF@EKwkxokU)6n24!1<@3oiUYemlaXgtcQs)Y$A z%Xe(`E6JJQ^Nix3!iKrV_7$SJ$Jqg(W=efV@!Cy&&*;d~QYGq!}UWodF*`f z>lcKVE2Rh91Y$T0DXyi10x;#YQ1F?O9tv7FtBInx zx4P&@)V7Zy2zQQW6QWE&?C^IxvB+2~GLKPFw@@zyP$8zXip$bc>o7a^-GM;6mkAxI0 z{;J8w;;%-SSp2m^77lQ28MtNOeP`fFFC(1#!bHXr3HzrS^F{#385hoR*Eg_oc{c(n zhi{|c%CT-7Q#spSqqPm7jTy}Wid>4xvQ!wUjG3b-OAodqFI9F7Ub(4$uh;8nLGiSb zMtfMZs?a=EFD3KJ4A@COBRc$&Q`fN}f)Oe)P8>v*UxaNb@dE0odjd_<3jpV_5TR?t z9)h3a?cNI}%RJ$Z_g(jBJ2jHx0Pu#qCCS-Q!8cPRdUAo-X7f2}0j ziA`a!QC0{{Ddx{Ld^{5X`;(5g#w7A9xi!72k}7_+DnNF>X(d0&0G z_=n1_Z&mkt1GAnEnv)46)$#~7z1r&4RhE!{E49{}$ajQjJEn1{STY28fb5EX+GLmM52>XC2 zPd=+E#`*WVm)^XaW`wqnaVx7^S>4L&R#xwmtR81%8+noo6KLYE=n~l`)}gp3v5xGP z!FvW-F6*`-*`6_?R@S$&zLoW@tluYDf0&V_7nfwU{VZ`n&nMlR^s}VK(8}{xp11P6 zmFN2;&!-tVZ$gB9Ly7lKW}8M>~Cd%EBjm7 zzfZD%mXVMqq}eCy9(hu{hP01B*}Z&^bk>YSk7M7;@K%PmGQ5@HdnCgTdl|WiLVjI1 z)_vTqoEA9hvRneKluQpFdO-ew1e+$ja4c)#Ru4Rt;MI)ymk+p2=x9~J-l&3no>I$- zP2cgA$Z%~c9kh+*Y;~G~PU~l+=Vl4zG*{HoX@hz?O#tES*Q7=p>`J2zT8-9fw7u47 z5sp%;i~sI{sW4fMhB774LxIX4v|6v#dOOv6gWT-;O9X4D*9S04X}Gy%nbkE}&}TFH zD>{T$YqeTyZ?x9)+{@PLl2(_f=#pV>miZ+z5p{RvN^!={u3?N_jN5T9>Jm+9UdQ6tHE0hzK0q-bN@p@T_;8(0;QrBs~L_F zL7-^`)`nlS3T#gmSQ~NC>aJIh3+%-P2xfO%6e|b@KosP<9`&8R@JU%^b(Rjnr&a@?NOq zR))7S+>_z`tePAfLh%}1ZRYOQ<*ZXlh9{xOFB%r#1da0U8cspXxo|iEw$z=&GR)<2 zJB^Wm<^sAxzzrYM6{G+<2p|IIChHv&Kv&oWn79-Y9d&D8SezJgYSGf~RcbDL!h~^} zFrWRun9K}oZheBz9incs8pBI^p!SsG1{oCtytzG|TMn(nY*7HJwo;Bs6a`n;8cLwX zP-%^z)(G0Q5!7n<^U-vek*n?T=YP%#D<1}MC&X36(vFeP9cRn2!J;@MbJDW3+pHFM)dRh zV&Nj1uPamd&dqVDobj#*+kCHu4#|3(gjRSOI%KV7dZ`SexYv zxHi-g=XLf$=Y}9mSIA);gC4vuzymf-E-4(usIUVpN4UY5=z^3MSVYkibFrD5*j=4qLpx&9 zt)p=Or`pkYG#rRu3{%U6Ci|H8aUy&u%|r@>L~zvau`d5W4qjknu&(`?I59CIR6EiZ zz5ZZ0(mL9OW8Gr|Inih5aE?qd+$#zl`rfwm6$9Jv^*h>oV#FVK;_Je}I=VoP_fqRc zpr2T#2`O?ICj5m!B=Pu3%+r-;?D7zV!v3E++OG)NVax$1f^xnrf2~yfLdlgZb9m&< ze!)ixXOe8P%0dX|Ol64P`j_n_O4H>6Mk2JUf?r6prBRg7V_6tcl2pM~&K_lZjdOEw zrs!|PBu>aQGnF9Kas*RuN@S?USvWnsPE5i+Pgs%6&W##2DaDa^S;m7u>uBD0TzZ$3 zU;d{`YZds-mDlN&Y@81>(kZ<#KOT+x!Q8mjF27Gfkslp@x#d2cNEY)uNcGhv$~{F+ z0nf3$vwNsuiO0v2x3`WWhu3RlU`Ua<1uh~6Gb_b=uohtv!V33|WVl>9XvydWEG)-s z+Pxu{-oZ4pr~qDsA48Y?gEG+N_T4g$&YrFm8RRxqIG6U>omJJc`$Ozti z)B1y`+kk_h0oW#khnBcY-^vuBFsYc9nA^OJ*caeZAuAFrZAclVT*SWb z{+t)@5|Q_O2xZNLNbk*_JI2ozWpeM8o$1dqvh$*>e1V7|VkhbeLk~`tI1K$=XQ!$n z&;yw(1fy^(3%(HdV$tU#XZy6-Uk!2VEDsL?KR6lz{S)wFA3Yy~V8LoO3m8DSMqO}) zC|FpI2tZ~u$o^~HBger80xn!2x&`_Q>344ThWr6dYyf=)9jH?VXW;=l0`TB#2OJ;# zy90U$vkv%A2ONCAYBt}CQ%SCHo4m*pZ@!FF>vDQFi8#%T(+c_f#M+Rm8Nd=q3bJv7 z37w370&nVAD5AF<3#C!BBp6%1Us;Z$q5$R6>o1*s@>jeSlXdegFwg>SObYn=i;M~1 zNdQdi0lD-5-a~A{xrq`0xHw&*n7qCrAH+U{I#?HmltsW_j9ys(D7C(?RDcR{+?nrw zG-xtItk~q-JAJU1@^Rej@wN3#a))dO1NT`0!1ruwNM9#dn>lZpu} zWx=gM6M1~=oMGw(w+2mLAigyzvx zrb(!~j5d{wKuIDM$DD?esUYl>%cwTwv<*2eX6!+3Y}_T%5w7L0@*rew$S(QdyyJF6 zVWD5jgV&5xDnxGQRpF8YRm~}*kTQro*)dZ5P|K?mcg^W@>g8g3NzJ?#^3gXfnpWI& z=CYTk$aAfa+C=JoOQdG9>l*8Ki2lLtv?FnEi~leVF@6h7(3Cwp^_P?Vxb%MnANb2J zu7X>eQ z((oP&+)oiSOiYk=G#VscT|kElagcr&<;-A?P7xO%0Y!L^gF?fJDZR$_6{4Jx8=0vj zn7KW4SJWY+;oaeKxFHTQz8)?f$!PiC@o;Dit%X7Aru?^Zhb*9!elKvb#0pIb{l;9oH@k~<7WvTNj0xVFWNUpr7o z=~g*~qE8`((JbY2OAkfD=gadnuwM`~kR!zDuV|ZY;7>%NuP4#j)$?_A0`(Qzc~3&6 zc|zhnF>DKSF`57nZ8peiR=RXImqKOtgPy#q@>zsDt9|Z~|2K_$9M~UoOrW!UPjrj# znHWF1XflfIFGCoyRV^`5!SY6Sz$HHC6d~D-dqkm>9-1un>d~aEE&!)cC7^MJY9}Nm z&e|yv3Z&wgxXzKep)zj*h^Zu%ZK$WRD$S2?*jF1})JAVB>$H`1+R8d@WgTgMfzzPG zoK&Z8RnpF>(VizV=DraDIZa|RvCrazCq$i^+H)L!!C1zO0epAwNpRb*W z`BBtJB=E%Sn&~~KwA2KSI1-hN;HW!t*LVxR`0k3OwGn^k`Rb3)bPF(6C2Hyo|6c`rb;Ug3|YfK>J1rscCpsye%9q_Qi z`U>cf+>ki}hDE$!717VN|52Bpv)yB|1dtejSRp|6%*6L7Qc~G8fetq=0-;m{HX_hu zBCy%2$NQbP-tzPLxHrm88oz41CQ$~&ERK(tKPh7O4B*Z1e>Ubt0wD`6cSkjd^4Rjb zDUi}~=lQrd&P|=aYNoW&ReousYJ6Bw+o%HbMR8Q%xDWw%A4(auJo#F9a*~^f&b@%) zU8a?JG6JSCYd8wDA-0U8S;&@A1Tru6!34Zt+jI*o2mA>!J>^`;Z_{#b2+!HW%O!Gx zE4L7I%x!D9{#a~yn41wF?2T&hU;v{r1`HrJ!+lW%i&!u0I@oK*wx<536TD&DLb7D) zj#>bQJ4uUpfyWE%xb&wE`Qq1^x8*F+pjcs;Y=KQgkbDEneAJAgmyr(!I zc`m`vIySl|SRw5*4y~aZCZ%X9F=}=SQ|K)!Oks*}?=vMa`SYDx*2s$jmX)44#DSe) z12~NI8P1~Ojk!1wZRXs%@L)j0aFFXF1K;A-@ZxDQ9tya)ob>k9+O?u_r(mmz#S#JJ! zK+5&=hLWI~$s0;S-DTd8WCTiLpg3>H_Y{S!-ewN9nL{;MyWh`EU3SlL$Q+y^_jB%5OP;KRJJxn?LJbqD3u^XWtjrSY*@+O=Mi6g#vFgkZLs* zBXFzmwTJsoYGli?%&UADZ>ExaJDc`;y~xduXQ$lijNa}znvM@Ay-tu+%YQ!=l}M}- zvtRyNNYzmN>S4DkbuhkX-X7(KGPz7SY-(}0fKcIb3-40)GqSK0I9_y9c*Q%vMZN-` z2cyU@OZE{_;ZGLWSPKBb65j`RyMy@_oSptaj^I7L79%8vj7xD#T%{gLqFF~$%OEeA zJTqCCpZ0~x+-;46w#I?9#sPzpNKH?CeuYFDO@6B|_&qFpm3nZAsKYfiPe!-=`;Q`J z1h5W2+Xkd4ndS~%`rb*^(As(ad%QZsu}<-Qyd;98N&;J?KM`K8{K5rMQj5JfBbZ`n zUYN+>-Lq%E6NYpMA3EmNpXQR+F+{LcF>zibUA#)cvgkaP&5-cq;?6UE#ImVOd)efm z1kse8fPj-Ei3zVb7uaVjrJT?WkcNEQ>>6o9-l+ zwUny~l`c+Ff=`|$i%^=WS&$F;3Wpro;>g5_Y+vvrUkx+vk8{(g+$+zSQpcGnKxCg5 zM2@s>F`+7sLjkhjv>*Yuk_$1wJ==Ha{Q{UQtnhZFX0B373_*I1kZz;m0rQ<*NBu#s z;8>sm)_rYUGs#VFa)nJJtc@C+69JQbafs!JO6qJ(wraL{-JWz%VYbW!UNrJIzYw6fAgb7@}lsC6&ODfu{yI+E~XIZ(B9sy7a^@>T5Q3wiKThUxZmDvNZa5og2-48s%OM&ot zH%*bfk8{3GvLRi$ehLxWc{F%Eq-0u3>_@f3$)Z1-PUi<`G3*_Tj6-xVA0qu=1}B5V z#b^%4aH{co)>3}*-KL{KNBaaHJtV~M6G*P2!99?$*Fm_+N5|UOQlQ7CX+2z9*{`;? zoV!mE*=D>f8@u775OG?k{N~9+m?&~(z6&Nw=A;g%P4+f2;xaw@b6@5g@AxDYUl3V! z6@P-Dq%s|cuK5>nAjIU0B5Q?}V`m-h*uQ9&|N3wh|Lt8EYw#bR;3NO7Av64V|XOwo?g)Ap6! z23bkUg1+7%monQzufuHt5Y@vYh6OV%xRD*YL%gG*VWj;9q^oQ05Pb9HHp5UaWY++{ z{7ac-(5vulbULDENEyWpk~sQh41yvC%)$o`E98V#a_VHd0sU0Fs@tapJ;iX0E~Idnz!ve1To8`zf3RnyI)vE7|t?8Lhk=Z2jj zKO7Cmv%}$ZIGOI`C@Iasidx013)rke$=b@Mt_!cc<^A#Yyj81>wA2^F@$N^dV=cu16GKN#lOR3k4*w#Z)@!=xd%WpZ@MAev_ipi!)* zq$aN`*CbO@^oqD<7k(<`$$7SFPYv1--;qU^4o7*pMCKpPw=~MCMdHh*x(7)Dg0j$7 zJuwwv8FfrMO=?E~1?TIBI!!JVtKf@Q%0^NL2CX7dArEIcwkD zdFehm33GKz{u!yH^|PInzJo4OIYlivHN9}Kz*qcyvGdUK2aVwb?Dv6a#^Gi#@v^Sk zlgwHs_B1QGPq6AoM9(e#u43WdI1G8Qjiij=O%;q`A8L*%ECpS~1dfbgCk48th!$#L zzm^g8`cuhYBjXqN~Y+R>LmXUHCOdbdwyvl%=j zs@2mI-8WslXAK|E1i*1eTVoRbNJ@=x-uA}CixfEU7VM>_=Z7nIKA7d_SV|3|5;Bv0 zui~|h3(!*D1lCMVc-HeDctd%HlZ?Ic)E3D395QK>>DpwvHk$C2R_Pk{@)MY=-vk$a zpLYjNC?jv9`}0$zn+iIk;9|JKE~@B{+lTZY3;26DST@~y3z{RHK9dc8%qrH(+$rp{jMfQ+%j^#*c%-TCWG<8Xf*F1%%L$lm>a#r`FJ)T4D``%Vg%a^lV{`9aeju$C1Pa#3xX!C zm1h!#QzF~Me;_^-KvdW^?5r`Sjp5&BqGaM4T`JW(B`M@Q*iSb?ums zYg=jx)hjhs`(BV%e4mepll)vHuMAsdvCY0$JmHI#ep7JUux2@4n|P(l3ceZ-_4Y(B zU6rq`+4q_R=__%x9p-17T|3*lzBUiUuH9{K*e*mt0D9=iWuRD>@=`AxW9x%!eQ>Q0 zE>wb^PvIpT4f`r`rx}@Re_GBRa!xEl7z0$1xG@No)7N8A>TcwdC}kUl@op(HO_wKY z5z9b;T5K%hjRhWfQx{xboHSVXuT6G;eqNYmgqRCr_?I=W7F`~Go_*}S*&%2 z*#a$ki)n9y5Q>v=J3+To-(?ayKFVA7u(2ct0@AI$aM^Z+h;<3(Q|Owibf zM{(ysyoT-_lNJb?Z|{3=8Bg&`jo&i+<8nj(gqUhaJ@2wQNp_IRj}qB6>SbgC2-$c=A+4j|`1dLbE-94x zhs6qxH&fPd(oQO9IDb^npyH$`7pSmqYir|JY9qS=x{V0PDWGy@ah5D+EITnosMR` z{&YI+1&`D1PcA;Y+RAvZ7!e#O%s{eT}vK)y!gx&@H^-tSq~=`(Kn8R z2-DL~9j%{0WjdTrC%rf}!LtStiuRMlX^_CF-#Z*0j{4KVD27&l((g_BgTvvZQOv^L zdQ$9$3G9Z0L4Pn9j}8aDIC{Nd?{GHgkNdrm5`qVE3@0fJBWd(f3`YqJC!^6|H15qt zqXdRAf^QPT$@H*48y!yg+DI@Q?+*h^_K*P%_nHBwd(Qx~J!gQYPE<1xOqQ)`sHPfr zKRspDK^Ct@9>1h6cxLokMbM}sczJS93jaML_oU?CD{_D81fDZ!7&b;asv+`w`zG>h zAk@TeAZJNyV3z2uNcxWkv(apFIG9ah$VDGNA96|AKOIkJv*Bnw8^jkh^7#3Xt0?(* zLG`sH|Bk3$bqnw!RG(A=dqwq06|hHCA5j3_xk)Ta8T6+jbIzZ(V6(AqVy3)mfU4eSASgtF@dxcz5OY9YLNxiXG$R!oXULp5gd6V`Cxro-_7n;a)M!z?jjt?h^jgR-N!CjBs zGDs?km&GQ%jd)3H(vG8-#3t=2dP!`Og8pT(NlNyY#U{NMcu8#1j-Z#sChhroIcy@* zIZTsi*xmm_ocB(9<6&>&Z|y32@6;7;NHIkcd(!IrF?4X=37rhoj+iHXe=+n?Cuni=k= z7gPYs812~KUkA0aC%&OuGXuSbeTgMqI9cx4*z;$^uQ^pvpZuHF1&xq@1K$1}l7GtL z-!t-0Duw+b|Cm;=?vaCR6YFqe8<3(l8mK|#&_)Bb(Lnp56xwK@mqhOShz61^+O`J?FSJwm5uLR91JBWn(W_o@f1P*Tlz!4RBU5a!IK4MWeCMymzfb>E>>keK6)*KYU3$Hlhwgv zMQ@cZlJcwGmT0VcOH`!LuHscyk&3z5#Mca6CU{P9Ibtj>A;bj3DqiJP28pClDgO cbg.MaxLength { + return xerrors.Errorf("Value in field \"RemoteSealingDoneEndpoint\" was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("RemoteSealingDoneEndpoint"))); err != nil { + return err + } + if _, err := io.WriteString(w, string("RemoteSealingDoneEndpoint")); err != nil { + return err + } + + if len(t.RemoteSealingDoneEndpoint) > cbg.MaxLength { + return xerrors.Errorf("Value in field t.RemoteSealingDoneEndpoint was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len(t.RemoteSealingDoneEndpoint))); err != nil { + return err + } + if _, err := io.WriteString(w, string(t.RemoteSealingDoneEndpoint)); err != nil { + return err + } + // t.RemoteDataFinalized (bool) (bool) if len("RemoteDataFinalized") > cbg.MaxLength { return xerrors.Errorf("Value in field \"RemoteDataFinalized\" was too long") @@ -1547,6 +1570,17 @@ func (t *SectorInfo) UnmarshalCBOR(r io.Reader) (err error) { t.RemoteCommit2Endpoint = string(sval) } + // t.RemoteSealingDoneEndpoint (string) (string) + case "RemoteSealingDoneEndpoint": + + { + sval, err := cbg.ReadString(cr) + if err != nil { + return err + } + + t.RemoteSealingDoneEndpoint = string(sval) + } // t.RemoteDataFinalized (bool) (bool) case "RemoteDataFinalized": diff --git a/storage/pipeline/fsm.go b/storage/pipeline/fsm.go index fc0a93a85..264a6ca49 100644 --- a/storage/pipeline/fsm.go +++ b/storage/pipeline/fsm.go @@ -7,6 +7,7 @@ import ( "context" "encoding/json" "fmt" + "net/http" "reflect" "time" @@ -14,6 +15,8 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-statemachine" + + "github.com/filecoin-project/lotus/api" ) func (m *Sealing) Plan(events []statemachine.Event, user interface{}) (interface{}, uint64, error) { @@ -142,8 +145,8 @@ var fsmPlanners = map[SectorState]func(events []statemachine.Event, state *Secto ), FinalizeSector: planOne( - on(SectorFinalized{}, Proving), - on(SectorFinalizedAvailable{}, Available), + onWithCB(SectorFinalized{}, Proving, maybeNotifyRemoteDone(true, "Proving")), + onWithCB(SectorFinalizedAvailable{}, Available, maybeNotifyRemoteDone(true, "Available")), on(SectorFinalizeFailed{}, FinalizeFailed), ), @@ -218,7 +221,7 @@ var fsmPlanners = map[SectorState]func(events []statemachine.Event, state *Secto on(SectorRetryWaitSeed{}, WaitSeed), on(SectorSealPreCommit1Failed{}, SealPreCommit1Failed), on(SectorPreCommitLanded{}, WaitSeed), - on(SectorDealsExpired{}, DealsExpired), + onWithCB(SectorDealsExpired{}, DealsExpired, maybeNotifyRemoteDone(false, "DealsExpired")), on(SectorInvalidDealIDs{}, RecoverDealIDs), ), ComputeProofFailed: planOne( @@ -241,9 +244,9 @@ var fsmPlanners = map[SectorState]func(events []statemachine.Event, state *Secto on(SectorRetryPreCommit{}, PreCommitting), on(SectorRetryCommitWait{}, CommitWait), on(SectorRetrySubmitCommit{}, SubmitCommit), - on(SectorDealsExpired{}, DealsExpired), + onWithCB(SectorDealsExpired{}, DealsExpired, maybeNotifyRemoteDone(false, "DealsExpired")), on(SectorInvalidDealIDs{}, RecoverDealIDs), - on(SectorTicketExpired{}, Removing), + onWithCB(SectorTicketExpired{}, Removing, maybeNotifyRemoteDone(false, "Removing")), ), FinalizeFailed: planOne( on(SectorRetryFinalize{}, FinalizeSector), @@ -736,6 +739,16 @@ func on(mut mutator, next SectorState) func() (mutator, func(*SectorInfo) (bool, } } +func onWithCB(mut mutator, next SectorState, cb func(info *SectorInfo)) func() (mutator, func(*SectorInfo) (bool, error)) { + return func() (mutator, func(*SectorInfo) (bool, error)) { + return mut, func(state *SectorInfo) (bool, error) { + cb(state) + state.State = next + return false, nil + } + } +} + // like `on`, but doesn't change state func apply(mut mutator) func() (mutator, func(*SectorInfo) (bool, error)) { return func() (mutator, func(*SectorInfo) (bool, error)) { @@ -812,3 +825,41 @@ func planOneOrIgnore(ts ...func() (mut mutator, next func(*SectorInfo) (more boo return cnt, nil } } + +func maybeNotifyRemoteDone(success bool, state string) func(*SectorInfo) { + return func(sector *SectorInfo) { + if sector.RemoteSealingDoneEndpoint == "" { + return + } + + reqData := api.RemoteSealingDoneParams{ + Successful: success, + State: state, + CommitMessage: sector.CommitMessage, + } + reqBody, err := json.Marshal(&reqData) + if err != nil { + log.Errorf("marshaling remote done notification request params: %s", err) + return + } + + req, err := http.NewRequest("POST", sector.RemoteSealingDoneEndpoint, bytes.NewReader(reqBody)) + if err != nil { + log.Errorf("creating new remote done notification request: %s", err) + return + } + req.Header.Set("Content-Type", "application/json") + resp, err := http.DefaultClient.Do(req) + if err != nil { + log.Errorf("sending remote done notification: %s", err) + return + } + + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + log.Errorf("remote done notification received non-200 http response %s", resp.Status) + return + } + } +} diff --git a/storage/pipeline/fsm_events.go b/storage/pipeline/fsm_events.go index 1fbd94fd0..f92f527ad 100644 --- a/storage/pipeline/fsm_events.go +++ b/storage/pipeline/fsm_events.go @@ -524,6 +524,9 @@ func (evt SectorTerminateFailed) apply(*SectorInfo) {} type SectorRemove struct{} func (evt SectorRemove) applyGlobal(state *SectorInfo) bool { + // because this event is global we need to send the notification here instead through an fsm callback + maybeNotifyRemoteDone(false, "Removing")(state) + state.State = Removing return true } diff --git a/storage/pipeline/receive.go b/storage/pipeline/receive.go index f06848bcb..e5eec5ab9 100644 --- a/storage/pipeline/receive.go +++ b/storage/pipeline/receive.go @@ -211,6 +211,15 @@ func (m *Sealing) checkSectorMeta(ctx context.Context, meta api.RemoteSectorMeta info.Pieces = meta.Pieces info.SectorType = meta.Type + if meta.RemoteSealingDoneEndpoint != "" { + // validate the url + if _, err := url.Parse(meta.RemoteSealingDoneEndpoint); err != nil { + return SectorInfo{}, xerrors.Errorf("parsing remote sealing-done endpoint url: %w", err) + } + + info.RemoteSealingDoneEndpoint = meta.RemoteSealingDoneEndpoint + } + if err := checkPieces(ctx, m.maddr, meta.Sector.Number, meta.Pieces, m.Api, false); err != nil { return SectorInfo{}, xerrors.Errorf("checking pieces: %w", err) } diff --git a/storage/pipeline/types.go b/storage/pipeline/types.go index 81a2a2fec..cb1d84383 100644 --- a/storage/pipeline/types.go +++ b/storage/pipeline/types.go @@ -94,12 +94,13 @@ type SectorInfo struct { TerminatedAt abi.ChainEpoch // Remote import - RemoteDataUnsealed *storiface.SectorData - RemoteDataSealed *storiface.SectorData - RemoteDataCache *storiface.SectorData - RemoteCommit1Endpoint string - RemoteCommit2Endpoint string - RemoteDataFinalized bool + RemoteDataUnsealed *storiface.SectorData + RemoteDataSealed *storiface.SectorData + RemoteDataCache *storiface.SectorData + RemoteCommit1Endpoint string + RemoteCommit2Endpoint string + RemoteSealingDoneEndpoint string + RemoteDataFinalized bool // Debug LastErr string From fec9c0f98169fa37e11514ebaaf45e370ba560a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 9 Sep 2022 14:57:56 +0200 Subject: [PATCH 167/185] sector import: Fix lint --- build/openrpc/full.json.gz | Bin 28355 -> 28281 bytes build/openrpc/gateway.json.gz | Bin 4943 -> 4943 bytes build/openrpc/miner.json.gz | Bin 15826 -> 15968 bytes build/openrpc/worker.json.gz | Bin 5256 -> 5256 bytes documentation/en/api-v0-methods-miner.md | 5 +---- itests/sector_import_full_test.go | 2 +- node/config/doc_gen.go | 2 +- storage/pipeline/fsm.go | 2 +- storage/pipeline/states_sealing.go | 4 ++-- storage/sealer/tarutil/systar.go | 4 +++- 10 files changed, 9 insertions(+), 10 deletions(-) diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 942fb190afe07f2f1df19e969c1a4b3db8e725ac..d71446f65e6c5d0ad2be9ca2632365942a8d33bd 100644 GIT binary patch delta 23574 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Ñ{_A{2Gf`Yb0C-re`UxA2fi=WmMC-eI^lrBYou8F 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%0DmV01q*JJP+FgOuIlo$D5kfE$cNws z@7IGv!UtcbX=}AF*gsmqy18NIcatLOF0#G3$c}Te=hyHe83XncIiq0 zw5dA^68@lP^pvEmp4qw)_FSr)vDrk%e+i$zq9HpVo$F6c#B*(|hkQwDsvHG0P9I74 zfPXo+SUPuzD2jZ&+^&CeOZTqb!h)53{X5j^?ludmk6NNf8FTV z5LcV(46v*N32DZB;M4A7BS$*CK1c;hi-!R zUbIa7buqtnKgO!n1CjsscU^E$MzIR{)pXD}`CQ3RphcVQYuep}482)kaeun*l)zJFAZ zZWb~nJaYC}%`jB=6e_Ct?0hd_0>+ABD~w2=y7dI9TfDmCDM~(`t2j866zl##zK_Wm z`6#rzr)d;cE4DuP+xm+Kr#$ydNScH}0enNN6%k&iJ}YJXd-o=4(KDbOp@T=#LXqV>e?ga$5)5loK}sm0K(=;TYaA&L(Fk3sZU6^+Q%Ac zh~i>p^(H+pi_kWcfNB6}MEDm6l&tNlIg(_QBLoV1NXCc6tDo zByx3$c?rNa%>$4`w_b^IJ(0|MWbE-7>6)9Lk!r&{1=mpq(vZi0NJOzsLeQty`-h6> zL2tX|L+_ZWu-02i?F^%A)31ck`luSe#fed5(9=GR>d8?(4hYKADsm?MX^I81tNaiLQ*HOY7Z4H+P){ z3I*06PAU*J1PaH0w@H)$7QUAdn7JsrgYZV$yNO^B zf#3yQ%W{rhHV=#>IX`UIFYro}1upQaIsW+-udg6z-d)9B;MJq*SB86=a-~?XQl^BJ zHq{??^Woym=uJGAzW45JczTaK9~w5(^D=yuch=NThE{@q?ZxQmc)l2%>>_dY)G4(%wxD>7Rr?$N{iVe!A8;b`^K{{L}s zKbi%9(VVQN&chr%943R`T?fj-TX(ID6y957DgSE2&ci`&HYv97csgk!Y)vnNdKsiC zgT%^ak@lahssCD=>5q;ZQ>)WLpv`itOHgDAhXA%cI>Ca{10ItVZXkaO`~D8EW#lhm z>{Rf_TfO&Q{zv5Ke;V__VN_}N+0)|U?mkMGQdsd3DQC8^#~Mv;%ictsP1wl93{&C&CE~GMu6Nw19hCGU%S4TeNW~ hSnvJpvm#AN?~`MCB>NBjZvX%Q|NlkGVb&#r1pvI%kre;{ delta 23711 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%0DscL)(9Rf2hM8ECNGgBt)-LDK>?r+rG4Eh822 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 diff --git a/build/openrpc/gateway.json.gz b/build/openrpc/gateway.json.gz index b3db3736c003becfd4c77c46a95bd6af4b99ca32..a1210796764b08656a29b994459fc36024e2a03b 100644 GIT binary patch delta 3391 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 VySwjq{}%uN|NjdmZ0;lS007sox6J?m delta 3391 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 B9|`~f delta 15364 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 TyY>GE00960aeL+GXE6Z)tIN5S delta 2505 zcmV;)2{!hKDTpbs4Fi9#3|O1e+=Cg`88$hoN0=**dE~JO^)MC@*4h+_*fnayA+ou{ zu9BcrSXJIFsfkj&NY|Z4TH(5d>lUuN7T4Vy=D2SAkyth~gRuzBjLVCs3gDeePHfxq z=Zy>K+$0k*K^fb>OTMV$`ctAdh5}ig5}j0v31v&{ybTjdW&nSs28fj&0a}(1K~l$D zkK6Q0DwN8ee6(D> zd>q|=`DpkZ|IIcLCyDljZHhNfL)v&mgrrc>8Ev0o*$daXq zP$B!Pb+aVmAxLNrDVa#~!x%_1nmo1_RS%`O+5@g)5|oqC9}ky3S8@^{Vr-|KkH21l=N zN-WduL4AMK`mACEhyY#zysr&-2fbq84acGy;s%+I1+_t`O=Ik~jRIU-W~u^Q1-J@u z72tY2a2=}I;Q9p-y*zBHRlM`rjt8WT(i`pyTw`IoM z2KWv2djD#-ZzP0*a}yDYr#NHf`wW}FWz~C#Q09N2J!DNgL7E9Bv%ug81<*8Ipg(P1Q2{R}XET(8R)$}RWmaD;XiFEZrm)2sPS|GYW^Z?OETC*tzR{>ZX5gzM%i7>%r zb{G@hl<-_sIFkb3+&Qe!Zlw59%y%Pv0rgE4U6t`hI_g=&K?U6vbXU+_L3gw0?(3zF zDYu~k8{SBioHs?yPfXUP3bC4Vp?+-xPsQw^9U8wai@GK-g2- zTsCUp_vzF_l#P_C%hDD8iGttNclS3Xmg)AOzGvN+7XT{&_O$`*NX?TI4_1HNxW-zZ zaYa^Dxos?xm!G*Z<-EYiK<8v?bMw|n)y=Wic>4rrZHN80jI+k{xGZDca8yl|B|r07 z(8+ZyKUHVFQAr9H`cl!Uf&&W(Y-3 zCdl*r-DURJ$4F>U{D4v^^dx__C-$C$O3tv!yW<>bN>h*@?=7*zEWp1I{L>avE^__T zq=s!MeLgiq9TY&Jw!#zIru9Exm9N8yUf)m=sV1>Hb>vd@GQ(k%+yaVMjht{d?B|?tcZKM$#McIHyV+#SBa9Q}t<8k3U>In;{o?VZwva;mzsGDCf)R@T;efrs-1*aU7n50$ zBE`!&Sf5g2<$HhL+UC*zYGNry5jz{Z&cof_oK}x>K35DC;4`Aon19UZlu~NF&Ccl+ z6S-^B=BPA{oG$;?v}dH`e2*9F@B`dpq<}*`W2C5B)k*lrSFPc_yiZvI9XLR@^R)Us zc(;Jg&2E|Q{PSHfZiUMfkwOdBDsoEZTe*nK--sv8ku!hQ)A{MjtZA0Iq2p9KF(HK~ z4y1E`;j-Y8yqdy}+iDDIUg&6`5tqnBh6UY2tRh}Up40y&I_Ca9)xPD3tkP@3ft1M4 zvh5V>f^w+P)5c>66}_Vl)P6_TC%w)DntEqqD#J;CJW*9cuZ$LjdoE&GQso?lIH?P0DhM#?+X0^_1JPr*{nEJ?@0tJ4jCxA8<3 zlEv)f~iJo;2Dix z8uV#hH09Wqyl=jdUp&{mBifRjMeZ;K=-e(9MMHlexNYv>weCHw$exuHrY|!)+1M4+ z(v4}IKCSmmK?)-jUU%%kXpplF8hkeDhqrQCPb6pc$hm9cK+{C#rxiu##6&-~2T*L@ z_!V5?pU6LWBJ<;be#INXA}wet?k?U*;}t2(yQJw zz4w1?iIgEX*b=plW~2{|cy(WEqz_;a*8+&Uv_!C~2v)6)aE@|fh(cTDB%5Kb?1|de zJ>*lpFi8Q;3sZ2hyPZ^x?DXVy)$VyiII8tVx>6ZQTdI)boFJvYAg2FbVnjJra+{AY zfMc8O&=s&~{n_fbt7>A|#=QrYgklTOIdUlxfGz?g2-fs~yClR9@f1-WTuL=oRB64w TTmOFm00960=axf}XE6Z)2TSY& diff --git a/documentation/en/api-v0-methods-miner.md b/documentation/en/api-v0-methods-miner.md index c473f1904..848600bc6 100644 --- a/documentation/en/api-v0-methods-miner.md +++ b/documentation/en/api-v0-methods-miner.md @@ -3242,10 +3242,7 @@ Inputs: 5432 ], "Expiration": 10101, - "ReplaceCapacity": true, - "ReplaceSectorDeadline": 42, - "ReplaceSectorPartition": 42, - "ReplaceSectorNumber": 9 + "UnsealedCid": null }, "PreCommitDeposit": "0", "PreCommitMessage": null, diff --git a/itests/sector_import_full_test.go b/itests/sector_import_full_test.go index 761bee3a5..00a29b82b 100644 --- a/itests/sector_import_full_test.go +++ b/itests/sector_import_full_test.go @@ -259,7 +259,7 @@ func TestSectorImport(t *testing.T) { return } - remoteCommit1(s)(w, r) + testRemoteCommit1(s, m)(w, r) } } }))) diff --git a/node/config/doc_gen.go b/node/config/doc_gen.go index 3d90afd0b..7bd739f99 100644 --- a/node/config/doc_gen.go +++ b/node/config/doc_gen.go @@ -797,7 +797,7 @@ This parameter is ONLY applicable if the retrieval pricing policy strategy has b Comment: ``, }, { - Num: "AllowSectorDownload", + Num: "AllowSectorDownload", Type: "bool", Comment: ``, diff --git a/storage/pipeline/fsm.go b/storage/pipeline/fsm.go index 264a6ca49..46c0fd9b5 100644 --- a/storage/pipeline/fsm.go +++ b/storage/pipeline/fsm.go @@ -855,7 +855,7 @@ func maybeNotifyRemoteDone(success bool, state string) func(*SectorInfo) { return } - defer resp.Body.Close() + defer resp.Body.Close() //nolint:errcheck if resp.StatusCode != http.StatusOK { log.Errorf("remote done notification received non-200 http response %s", resp.Status) diff --git a/storage/pipeline/states_sealing.go b/storage/pipeline/states_sealing.go index 9b815053a..b40a9bf45 100644 --- a/storage/pipeline/states_sealing.go +++ b/storage/pipeline/states_sealing.go @@ -609,7 +609,7 @@ func (m *Sealing) handleCommitting(ctx statemachine.Context, sector SectorInfo) return ctx.Send(SectorRemoteCommit1Failed{xerrors.Errorf("requesting remote commit1: %w", err)}) } - defer resp.Body.Close() + defer resp.Body.Close() //nolint:errcheck if resp.StatusCode != http.StatusOK { return ctx.Send(SectorRemoteCommit1Failed{xerrors.Errorf("remote commit1 received non-200 http response %s", resp.Status)}) @@ -655,7 +655,7 @@ func (m *Sealing) handleCommitting(ctx statemachine.Context, sector SectorInfo) return ctx.Send(SectorRemoteCommit2Failed{xerrors.Errorf("requesting remote commit2: %w", err)}) } - defer resp.Body.Close() + defer resp.Body.Close() //nolint:errcheck if resp.StatusCode != http.StatusOK { return ctx.Send(SectorRemoteCommit2Failed{xerrors.Errorf("remote commit2 received non-200 http response %s", resp.Status)}) diff --git a/storage/sealer/tarutil/systar.go b/storage/sealer/tarutil/systar.go index f7437d1f2..309cc882a 100644 --- a/storage/sealer/tarutil/systar.go +++ b/storage/sealer/tarutil/systar.go @@ -102,7 +102,9 @@ func ExtractTar(body io.Reader, dir string, buf []byte) (int64, error) { return read, xerrors.Errorf("tar file %#v is bigger than expected: %d > %d", header.Name, header.Size, sz) } - r, err := io.CopyBuffer(f, tr, buf) + ltr := io.LimitReader(tr, header.Size) + + r, err := io.CopyBuffer(f, ltr, buf) read += r if err != nil { return read, err From a05593da5bd0939349806ec0bb50ba5b09432baf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 14 Sep 2022 09:57:38 +0200 Subject: [PATCH 168/185] systar: Create file after header checks --- storage/sealer/tarutil/systar.go | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/storage/sealer/tarutil/systar.go b/storage/sealer/tarutil/systar.go index 309cc882a..e13e5ff21 100644 --- a/storage/sealer/tarutil/systar.go +++ b/storage/sealer/tarutil/systar.go @@ -5,6 +5,7 @@ import ( "io" "os" "path/filepath" + "strings" logging "github.com/ipfs/go-log/v2" "golang.org/x/xerrors" @@ -87,13 +88,6 @@ func ExtractTar(body io.Reader, dir string, buf []byte) (int64, error) { case nil: } - //nolint:gosec - f, err := os.Create(filepath.Join(dir, header.Name)) - if err != nil { - //nolint:gosec - return read, xerrors.Errorf("creating file %s: %w", filepath.Join(dir, header.Name), err) - } - sz, found := CacheFileConstraints[header.Name] if !found { return read, xerrors.Errorf("tar file %#v isn't expected") @@ -102,6 +96,17 @@ func ExtractTar(body io.Reader, dir string, buf []byte) (int64, error) { return read, xerrors.Errorf("tar file %#v is bigger than expected: %d > %d", header.Name, header.Size, sz) } + out := filepath.Join(dir, header.Name) //nolint:gosec + + if !strings.HasPrefix(out, filepath.Clean(dir)) { + return read, xerrors.Errorf("unsafe tar path %#v (must be within %#v)", out, filepath.Clean(dir)) + } + + f, err := os.Create(out) + if err != nil { + return read, xerrors.Errorf("creating file %s: %w", out, err) + } + ltr := io.LimitReader(tr, header.Size) r, err := io.CopyBuffer(f, ltr, buf) From 859c2606f073d66c4669632a1b67fc7b9aec0d4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 16 Sep 2022 23:45:23 +0200 Subject: [PATCH 169/185] sealing: Address review --- api/api_storage.go | 6 ++--- api/api_worker.go | 2 +- api/docgen/docgen.go | 2 +- api/proxy_gen.go | 6 ++--- build/openrpc/full.json.gz | Bin 28281 -> 28424 bytes build/openrpc/gateway.json.gz | Bin 4943 -> 5080 bytes build/openrpc/miner.json.gz | Bin 15968 -> 16025 bytes build/openrpc/worker.json.gz | Bin 5256 -> 5260 bytes gen/main.go | 2 +- itests/sector_import_full_test.go | 8 +++---- itests/sector_import_simple_test.go | 8 +++---- node/config/doc_gen.go | 2 +- storage/paths/fetch.go | 1 + storage/pipeline/cbor_gen.go | 20 ++++++++-------- storage/pipeline/receive.go | 29 +++++++++++++++++++----- storage/pipeline/types.go | 6 ++--- storage/sealer/ffiwrapper/sealer_cgo.go | 2 +- storage/sealer/manager.go | 6 ++--- storage/sealer/mock/mock.go | 2 +- storage/sealer/sched_test.go | 2 +- storage/sealer/storiface/cbor_gen.go | 8 +++---- storage/sealer/storiface/storage.go | 6 ++--- storage/sealer/storiface/worker.go | 2 +- storage/sealer/teststorage_test.go | 2 +- storage/sealer/worker_local.go | 2 +- 25 files changed, 71 insertions(+), 53 deletions(-) diff --git a/api/api_storage.go b/api/api_storage.go index 5d7455340..0cccbeb7a 100644 --- a/api/api_storage.go +++ b/api/api_storage.go @@ -563,11 +563,11 @@ type RemoteSectorMeta struct { // Sector urls - lotus will use those for fetching files into local storage // Required in all states - DataUnsealed *storiface.SectorData + DataUnsealed *storiface.SectorLocation // Required in PreCommitting and later - DataSealed *storiface.SectorData - DataCache *storiface.SectorData + DataSealed *storiface.SectorLocation + DataCache *storiface.SectorLocation //////// // SEALING SERVICE HOOKS diff --git a/api/api_worker.go b/api/api_worker.go index 4b56d1154..cca929d39 100644 --- a/api/api_worker.go +++ b/api/api_worker.go @@ -49,7 +49,7 @@ type Worker interface { MoveStorage(ctx context.Context, sector storiface.SectorRef, types storiface.SectorFileType) (storiface.CallID, error) //perm:admin UnsealPiece(context.Context, storiface.SectorRef, storiface.UnpaddedByteIndex, abi.UnpaddedPieceSize, abi.SealRandomness, cid.Cid) (storiface.CallID, error) //perm:admin Fetch(context.Context, storiface.SectorRef, storiface.SectorFileType, storiface.PathType, storiface.AcquireMode) (storiface.CallID, error) //perm:admin - DownloadSectorData(ctx context.Context, sector storiface.SectorRef, finalized bool, src map[storiface.SectorFileType]storiface.SectorData) (storiface.CallID, error) //perm:admin + DownloadSectorData(ctx context.Context, sector storiface.SectorRef, finalized bool, src map[storiface.SectorFileType]storiface.SectorLocation) (storiface.CallID, error) //perm:admin GenerateWinningPoSt(ctx context.Context, ppt abi.RegisteredPoStProof, mid abi.ActorID, sectors []storiface.PostSectorChallenge, randomness abi.PoStRandomness) ([]proof.PoStProof, error) //perm:admin GenerateWindowPoSt(ctx context.Context, ppt abi.RegisteredPoStProof, mid abi.ActorID, sectors []storiface.PostSectorChallenge, partitionIdx int, randomness abi.PoStRandomness) (storiface.WindowPoStResult, error) //perm:admin diff --git a/api/docgen/docgen.go b/api/docgen/docgen.go index e078cbe0f..cd1f03337 100644 --- a/api/docgen/docgen.go +++ b/api/docgen/docgen.go @@ -345,7 +345,7 @@ func init() { "Authorization": []string{"Bearer ey.."}, }) - addExample(map[storiface.SectorFileType]storiface.SectorData{ + addExample(map[storiface.SectorFileType]storiface.SectorLocation{ storiface.FTSealed: { Local: false, URL: "https://example.com/sealingservice/sectors/s-f0123-12345", diff --git a/api/proxy_gen.go b/api/proxy_gen.go index 04e79c2de..935eaca94 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -955,7 +955,7 @@ type WorkerStruct struct { DataCid func(p0 context.Context, p1 abi.UnpaddedPieceSize, p2 storiface.Data) (storiface.CallID, error) `perm:"admin"` - DownloadSectorData func(p0 context.Context, p1 storiface.SectorRef, p2 bool, p3 map[storiface.SectorFileType]storiface.SectorData) (storiface.CallID, error) `perm:"admin"` + DownloadSectorData func(p0 context.Context, p1 storiface.SectorRef, p2 bool, p3 map[storiface.SectorFileType]storiface.SectorLocation) (storiface.CallID, error) `perm:"admin"` Enabled func(p0 context.Context) (bool, error) `perm:"admin"` @@ -5551,14 +5551,14 @@ func (s *WorkerStub) DataCid(p0 context.Context, p1 abi.UnpaddedPieceSize, p2 st return *new(storiface.CallID), ErrNotSupported } -func (s *WorkerStruct) DownloadSectorData(p0 context.Context, p1 storiface.SectorRef, p2 bool, p3 map[storiface.SectorFileType]storiface.SectorData) (storiface.CallID, error) { +func (s *WorkerStruct) DownloadSectorData(p0 context.Context, p1 storiface.SectorRef, p2 bool, p3 map[storiface.SectorFileType]storiface.SectorLocation) (storiface.CallID, error) { if s.Internal.DownloadSectorData == nil { return *new(storiface.CallID), ErrNotSupported } return s.Internal.DownloadSectorData(p0, p1, p2, p3) } -func (s *WorkerStub) DownloadSectorData(p0 context.Context, p1 storiface.SectorRef, p2 bool, p3 map[storiface.SectorFileType]storiface.SectorData) (storiface.CallID, error) { +func (s *WorkerStub) DownloadSectorData(p0 context.Context, p1 storiface.SectorRef, p2 bool, p3 map[storiface.SectorFileType]storiface.SectorLocation) (storiface.CallID, error) { return *new(storiface.CallID), ErrNotSupported } diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index d71446f65e6c5d0ad2be9ca2632365942a8d33bd..a8f16011a9c1b9424393842c633d5ddaabae5853 100644 GIT binary patch delta 27068 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 delta 26943 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 un|4BCb8FgWW`F37(gTH@1~%s$U|tkk zNkkpVTbA1drvLpJS#}~{BRgqHTMsipY-veaURrl8{RY%Ugt->zf#yzYrwdGg$%um9 zZ@@8k5a@yTl>44>)ju(g`WL_iH;8$dlAuR(f2Z}@MmONj1XIK()b>E{>u*5dRCIlV z9b{2Vc1|V`lXJw69co=)BF}?k!BxrF!Q$B!}nMn*odj2E8q>Kt-(3+DsQ ze2c#{GJ(8s8-_&*M>D>2BL6iFw`o||-Z{bcOXJ0>SbNhzj8XQ|`2CH1<9K9vI~Rl_ zMxc{DOXIJ<41yim{u^hA`;3Surg6sD2g(P&>r%#%EgIa3zrr@FAir=MVyZ8{k-Kl? z$B!St1fD;gLN*6I@M(e=G9W_+q1>1wZa^|OEIOSc!aZX|nZYO6GbGk`fC*g4;8fzu zX9D}f`D>SYI6!XrI`(zkX6g%sSc}a>{IDiy3RR*AP))dTVI#uv2qTt)b%Je!A(tU9 zm@zaw^N?-e1+*RGf*Uwk=M>q-aBe{3Z%KHj0gV%CBg=Sk zJHgh(z{JKDCW4*-Q~l!ca5g*PdfX@_2+cz{v1w6Xg+FpM!4gWh5A;|)S5&|SXlGc?8iG<kF1pWK3zkmr& zE>6YN<6mSrbZs=gVQt*8sE2O(WbTdkX4fB#GeiW zW*fE+f8WK4tn5e;J?e}TZUCL85pDklQ)J_S6AdweY<@;8Y75RN2*E?$j%Xcr4|(RD z+=yjY67I>;-696CdRccF-NOfvF*px)PC)7knLSR?SSamNpDT%k1jntm=@ceiZ`FFM zuD?}dQm_O`NjX^+J;8%26JE`2?w0Ci*hEj=%y=f0VQI0PQY(XRont=nhXzAa%8}t< zat%!2GY9m*gmc&H?e30)COa0L?v6t1@3qUQnAff&EXm!WLx;Ol=yAk$p^JB2MrZT? zKSpF{O#k2ecI$9otSR4yJVyk1xU%&acF(XIg{>$s>Fs>N?f`KeQ!#|LQ6q6V!-qBv zGc6DmC20dB@m9zFkiwDpj$?wrep&o_i|}~DL9ek=xqC_!-)Wqa+t*UQju7eP+<(12;v9OPJu&6O>b!nAn5MNQN7QK?O}&yG^bFW|r@4xa^GS8)%_n&*TlLw# zLvzz`TghjVoxerUKAAwGYmV?qG3#E!tH`i}HHkHdId2oIPM}YBr*A~9O{t4++naDk zI_>NIaoZ;h*}wKjGtwFV+-tY(Htn?eKcwZhusfSg*o`&0K_Flt_uz70BCS;;Z9UPm z+&x(WC-zngkDpYAYup5;O<>}LdilyAO?9EOh=(RM`*8F!UaV&zDE3;#f+8n4rzt9A zZ%tuQB}gh;ZZt@=nDe&j>@`m-9lohU%lF4Qx@{fKaWvwHg&10ki70^b_z4_hIr^DP ztx1mVS&_vk!`}n9i7##&wa_?jSNjbXrdu4$hv2a=_@S|AqU^I~quFRGA~tMOYlJoT zd|KRdzoWxFkLR0Uoe`8j!8fC^?}2G5%c?nM%`t0^`LsFa!CnE!d<(sg!=IJdr0lvn z1~sJAS;_Y#uxw^0QCXJVEvC0^=4c&4+OiOmAkY+M!-uOmju=Uqjp&CUdE`9fuv^44 z5VWgt3B>4+Co70QJS=EXC&p{e?8bwE0`aZ8J4Q1CnX*di}zY~0cmy*15sarzI zrtgxZy_nRt$v_n!dX$_`rGf%0^ZpOMlji;5Lq#GlYy`)7ks%|~A6-PQ`X{H<^2MGk;wKTr0$!2_wiI_!X1)#DWZs(69=H64 zIyz>V>Qt?r=I$5~!~_-p)oQdFuba)+t=6Z;L9f;7by}|*-Cm;+FJATCOx45^yVZqU zAif_pR6EvmPW3^W8RK?IT>u{&^z-uo%PVC@<5m;b6wWRrz-HG3Q%sa! z8!EZ7{9^4ol2;%6ufo}R9F+ESaPo0Cj^=~C+SeXsP9n?=VJw#fjG39_S;_{NLS z0as*kEI=1{6C!748GA#W^0xUUv#_PBy*#V)-G9EKYhA~&7D06#$8vQXH=zA4BR6$K zXKNxl+p6yD=bQk!^zir`@uM4v9XNE*F?68dGG&#YY%sZ5%#vDmj^w{NY0UD;F&@xZY6daUp3_g4bkCkBZJEgneBl?*T(xw!a30&ErTw_IV(^lGN}pv4ao z)SFcSA>Bj^qrxOUO!^2^M}Vejf8@H1-iU=Psj7N~ge5fHdlOO?5>MR6AZ`EECS)1Q z^s$(mPrpb+=P>8!O~||dMxK~(HPI$JuOZoTaxY3M`f?igsNOHuxvhy8wTycTGOmsT z*VfRVml%7EoP$>iGsI*(uqMd%ovNOp1eEoxBLOo6s3|U#p$p`O0=KHzh_A7>k80WR zaBNT^-xMC>?{uQ57X)(*oyZ|9ji3RCjLRYky`Y+b2|g2tTGyvOgL0_gamlb?a;&n( zfI2N5dnGyNXP5r4*UUMSIN*?@Bg>*b3HMtmZlCDB9-B|K%4hY7af?n}#DSLL^Xb*q z48CUY569rsUv}HS{FZXRR?byx!3IA?0RnEYjo1lw9LN!a&N20gUHb6KN`OUmp8C+X zk=@70LIeCuo@SAiO)|YGVwfcOl{~X(ZUtO4Ypn9DbOmCz*87tFHuqREs@=Mmict?# zY@~K^Y=-q`ZMYOda~f&oOkxtnIp8e#U-@$!6|&zj*@O%KF^i&hPH}{QL7pRiWN}*h zJaeq`dP;bhhZ{gzDNUjwH*y*>xrkcVu66APKU-Vzm zo#iNn8BS|Ecw(#Bwqr3h3onx|w8~+U)j|WG3kj~D*7L;EPWHMvB|zkkqV(E#FHWm5 zm$380`jVqj@6(g4tgO~;Yu&c?BR@K>x1V!}IN08okX<8Q@jy))!kQ@)DyWs*FV?y! zVM1+Jo&hG;S98Id3qD}FMB)BSzSXhu&peCK+t82to?6$)u3|_>V9MIj(TLC6p?Z*W z(ox|!15Ozn2jQnR__6|}D2gZEU!3N7S0yOXMw2Nkqi)X2nzf*n|7Bi)uyizoX*k;zhsOmgj#(;axM!OYMG{7T_>|loBvQHe0 z2v?65MR9NS*?Txdj$BGcqTLy>;}639+Gp58eZ<0-f$&L3)x#HZB8kT`gN_G&(E+kJ zWf{Z2haUgz+TznCrr|(uqCP5H6h!?#CAvj8E$wbjp`a{;<(JS&HVnUN*+EoFE$8D_ zC{pY2)`AjCPceha?mKleo9HW49Z~k^;s)X(KM2Xvc$D7G!5PDolw(vj`ujrwu5r;iZ35cYkub=rPM>6i0g zvtRH2_um`z_CMS`?;d&V^S_R*FSEDDZw9Tm-WfgrG-H?VZ{GcfkAMk+`bC1UbFXap zf{9IU`*gtjjM9;;I(4uR4}pMhciMZ0`|X2v_aN2*G9G+A+18W6{S!(&L_FVn1AT{| zInedQ*Qs)1BL|d@oJu2nV`tk{oGL&o9ZFBaR*0wUG(*xXtzLx`_B%Z}l>~HfUPKus z`!7jRt7Ao!W$e3Wm$T7rn;!J zrOMxe@pqaT*inbxZ*T=~kLMhPzXR9JzkTRnK0mU5E}sU)Q#f=g^m_}vOH9H?!G(6^ zG=NzDv;}P@7E}UqYQklOM;r+i!yyX1IEo+dN}ig0Z01xhPy_>`H<*l15wsmlDn{Wm z0IexA0~kB{mVaXOO-s+z+G;sk%h3mvqs#4(mZPzET8Z{PV~FsivCc5H1CQ$B*#)uD zOd7@?T|^eoPaNu@<*x~J97M*;CxOL#;&VD0EuMV|Orv0sXd8t#_m|LU5<5&bh<94R zmnK%u%lDLC521A(pTsG$94KoT#O71hmR~MW%YK*m(P|p|7CJp*$kpzUfe4+xAqD6( zl@y{CPEkos%S6uk(&hU`B&6LlMX~xl;}re;Z1Yx80gVrc-%@rR)wZvqb;LpFpQ~70 ztQiNeQqPDt*SWSd-lKfbA+^H#ti|J%;W<>1fA4Fm-94S3->;m^v!#ruT~xc`3PD@O zsjKjuMejAuo1-v%U3}$we8|n&H0mmf4Vl_9skvIQWwNB?v}F=|r(>DKOQ~)4KyZ|t zQa1PMfe-Dj$f0=-w`F%bMHL?g2r_GO>6N~HAl_S3Ukn)d;sQFi9V9HDOduwK$z~dE zC#X0S#Cg22Jg~Nsr!Qu)Ii9XAOf3r}W>~9?+s|AJB~pE1)t|hus;EL!oE_X_k*j8- zxq+nn&L66Bl^q<6_+>_HPM z-bD>hktI|P6G(=)FK1cgvS$J%`F=B)w?WX@rBAMM9P;ab3$zK(KPR;{H&dw z6_G%ttf{QvsY)tk)V?KEJ?ryq-EL9g7Ma9#j(Fu%<`{%BcE6Afva@9GIaMiNO))_% zZ26G{(nKrp8JpN9HOcsTx3I#8pM?G8=dl8no z?>opIM{c0AnTsrr>{B?uLbs6FiRaOIC$-NNavf+PTcYSliA_gulF($!cW53UjQEaI zQW;WFp`%7DaH*tWYwYyZfRkz2Dw0c|<4fbdDu~2qssIM-Uq+Ckq|#|+X)>t_LZLyu zqiu^#tlNCC%S*Z%V;cujS#+HZP_OE z>@cT#V8vAK{PgXY#*3r=g+_Mv>Wu6qoKi{H%eg(YQkBKQmy1Z@IQB}1gGa5Stzz6j z$49_aA@!Q==0T@ng5%&SP~^Zl=yh6U-J%LWo&By3rs-5#0MFU{Ph;clH*%^qeSwZs zxr%bEv!+w%rSXC*SB4jD%^3KC4XVN`wMCQj-?kGHTj%bnZ-?LXzHIJ+ySwjq{}%uN N|NjdmZ0;lS008OX!tek9 diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index 0138f28c17ff4fd91e898511a9452d3fe977e5e8..75b4eeaaf87c49d4acc624efd2e3735e7f39a040 100644 GIT binary patch delta 12279 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 AiU0rr diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index 90167b6e09ec40c5a7dd6f5a19b1b5c28082a2fa..d73bda90317ed7ea9db5e25e1406858fd053f91b 100644 GIT binary patch delta 4522 zcmV;b5moMpDU2zw4Fi9#sjN+D?!gS}44a(PBg~b@Jn~qCdKilcYi)`|>>9P<5ZT;e zS4q$*tSax8)I=#>r0Y&2t#IAKbqm*Bi|f|49M^3>63d2WFczViae47n0lZVmiEUf{ zym0}Yn`9y;C}aC~$roR312O@5-G55l#*iSZW1<)Bv&4BVfz& zAxP?&?^QCtl1inrCoGS(9qQ}LuMrOyruJQ&hoFVY%tP)2HqeRZSLmI1ovG4OwN6jf z^u8oZ|3uJ4t|y(6rDd&|E;^7h4t=pCx!A6ek|3WKYivp$bsEf&r>DZsp zTB3|MS^Ahn%CLXuws|+Bz7D&wM4?r+R*)eg(BL=vM+K7UG@9hPg6m&wKDL zAUFAZB+Q&mLV_OS;2b+q4ki~_b{~S&QIM;psx;_ltI|IZHRha(~cXGPtxzxsfQ>VDOHyxfA`G)y^hCj zaP<17#4>-~9@JN@&niZO2;ddK``UnaG%N<*a4f1JZjkv{P#cumG{$b*D8RL4rYgWy zfU5vk0j|db*YPMDT)!ZKTu4Lg_!nCJ!?hO`;!1MM;e}iSo82>Pasq8`^-W=JQF{ga zw#=B@0KcJL?_cfqjf7BeZX!bQ6lbh_pJ5ZYta^VB5y~92hpcHQNHf7?78o3%0Gg(Y zJP(-wZ%gZfbIRQM)OHuh1d|nj;LqR-CK*6*W}Cy$6t(0D^BU)f{^BZhSHRNjhPA4yP-1@)H^eYLA{dAFMQ}4d_Jk?$N^e z+x~y?A7{C;7tY_4#T2cknm)zaay3{kk*+@I(ps!j3q%))?j!m@85bk^UznKom?#eHx4qgv?sv(0|v&hdY>5n)x?ON0p~v%{G1riACB!kHBK=FVY-b|b}? zV!j*U3#f0Z=&Fo2(oxSE4l3xbpu2+Z3c8y`cV91cOu6k0qfDnLWrkebu(FLDjmFiW zaxLXUS}&Uqos+4}Nq|_E><^`q2V$_4MQntDJpUTqtjMy%^M4r8Ljm@DLvJ`pnBz;4Ri}}jK{wJrpDzgXI9#hHi zkE=)M#Qxa5J-fK}f?r?!UpH|9?h;iwwntAMl#@q)?&)mIRtYCF-_XKlO;r_rBun4m zkNATx7uVMmTli=2CGu&{Pji0(U51ht_7)kBzFb^Or;03nf*#7M;mjt+(sdD`(y6kR zrCvgmkv19)l(;n8XEh2GttTmynvkid47H)&8>xCstlprf40`HN8`LV>KncIh^>G-EvS9keJ z+g$zu0@X1aC>YWMBujtPw$J

R2BShU$0_6E6Dr`GiaQ{!xE49&37kti}g4^7#3L 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 IL2oeu0L9hTivR!s delta 4518 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 E0ORPNRR910 diff --git a/gen/main.go b/gen/main.go index b7aaa0a9a..02548e18f 100644 --- a/gen/main.go +++ b/gen/main.go @@ -104,7 +104,7 @@ func main() { err = gen.WriteMapEncodersToFile("./storage/sealer/storiface/cbor_gen.go", "storiface", storiface.CallID{}, storiface.SecDataHttpHeader{}, - storiface.SectorData{}, + storiface.SectorLocation{}, ) if err != nil { fmt.Println(err) diff --git a/itests/sector_import_full_test.go b/itests/sector_import_full_test.go index 00a29b82b..35fc3e623 100644 --- a/itests/sector_import_full_test.go +++ b/itests/sector_import_full_test.go @@ -113,7 +113,7 @@ func TestSectorImport(t *testing.T) { }) require.NoError(t, err) - // CRETE THE UNSEALED FILE + // CREATE THE UNSEALED FILE // create a reader for all-zero (CC) data dataReader := bytes.NewReader(bytes.Repeat([]byte{0}, int(pieceSize.Unpadded()))) @@ -194,15 +194,15 @@ func TestSectorImport(t *testing.T) { CommD: &scids.Unsealed, CommR: &scids.Sealed, - DataUnsealed: &storiface.SectorData{ + DataUnsealed: &storiface.SectorLocation{ Local: false, URL: unsealedURL, }, - DataSealed: &storiface.SectorData{ + DataSealed: &storiface.SectorLocation{ Local: false, URL: sealedURL, }, - DataCache: &storiface.SectorData{ + DataCache: &storiface.SectorLocation{ Local: false, URL: cacheURL, }, diff --git a/itests/sector_import_simple_test.go b/itests/sector_import_simple_test.go index 94c1e6810..0cf7e098b 100644 --- a/itests/sector_import_simple_test.go +++ b/itests/sector_import_simple_test.go @@ -87,7 +87,7 @@ func TestSectorImportAfterPC2(t *testing.T) { }) require.NoError(t, err) - // CRETE THE UNSEALED FILE + // CREATE THE UNSEALED FILE // create a reader for all-zero (CC) data dataReader := bytes.NewReader(bytes.Repeat([]byte{0}, int(pieceSize.Unpadded()))) @@ -169,15 +169,15 @@ func TestSectorImportAfterPC2(t *testing.T) { CommD: &scids.Unsealed, CommR: &scids.Sealed, - DataUnsealed: &storiface.SectorData{ + DataUnsealed: &storiface.SectorLocation{ Local: false, URL: unsealedURL, }, - DataSealed: &storiface.SectorData{ + DataSealed: &storiface.SectorLocation{ Local: false, URL: sealedURL, }, - DataCache: &storiface.SectorData{ + DataCache: &storiface.SectorLocation{ Local: false, URL: cacheURL, }, diff --git a/node/config/doc_gen.go b/node/config/doc_gen.go index 7bd739f99..20b175ccb 100644 --- a/node/config/doc_gen.go +++ b/node/config/doc_gen.go @@ -797,7 +797,7 @@ This parameter is ONLY applicable if the retrieval pricing policy strategy has b Comment: ``, }, { - Num: "AllowSectorDownload", + Name: "AllowSectorDownload", Type: "bool", Comment: ``, diff --git a/storage/paths/fetch.go b/storage/paths/fetch.go index 4c2a62290..2d87380bd 100644 --- a/storage/paths/fetch.go +++ b/storage/paths/fetch.go @@ -72,6 +72,7 @@ func fetch(ctx context.Context, url, outname string, header http.Header) (rerr e } // FetchWithTemp fetches data into a temp 'fetching' directory, then moves the file to destination +// The set of URLs must refer to the same object, if one fails, another one will be tried. func FetchWithTemp(ctx context.Context, urls []string, dest string, header http.Header) (string, error) { var merr error for _, url := range urls { diff --git a/storage/pipeline/cbor_gen.go b/storage/pipeline/cbor_gen.go index f4dbbd3ee..88dac5d64 100644 --- a/storage/pipeline/cbor_gen.go +++ b/storage/pipeline/cbor_gen.go @@ -31,7 +31,7 @@ func (t *SectorInfo) MarshalCBOR(w io.Writer) error { cw := cbg.NewCborWriter(w) - if _, err := cw.Write([]byte{184, 39}); err != nil { + if _, err := cw.Write([]byte{184, 38}); err != nil { return err } @@ -655,7 +655,7 @@ func (t *SectorInfo) MarshalCBOR(w io.Writer) error { } } - // t.RemoteDataUnsealed (storiface.SectorData) (struct) + // t.RemoteDataUnsealed (storiface.SectorLocation) (struct) if len("RemoteDataUnsealed") > cbg.MaxLength { return xerrors.Errorf("Value in field \"RemoteDataUnsealed\" was too long") } @@ -671,7 +671,7 @@ func (t *SectorInfo) MarshalCBOR(w io.Writer) error { return err } - // t.RemoteDataSealed (storiface.SectorData) (struct) + // t.RemoteDataSealed (storiface.SectorLocation) (struct) if len("RemoteDataSealed") > cbg.MaxLength { return xerrors.Errorf("Value in field \"RemoteDataSealed\" was too long") } @@ -687,7 +687,7 @@ func (t *SectorInfo) MarshalCBOR(w io.Writer) error { return err } - // t.RemoteDataCache (storiface.SectorData) (struct) + // t.RemoteDataCache (storiface.SectorLocation) (struct) if len("RemoteDataCache") > cbg.MaxLength { return xerrors.Errorf("Value in field \"RemoteDataCache\" was too long") } @@ -1488,7 +1488,7 @@ func (t *SectorInfo) UnmarshalCBOR(r io.Reader) (err error) { t.TerminatedAt = abi.ChainEpoch(extraI) } - // t.RemoteDataUnsealed (storiface.SectorData) (struct) + // t.RemoteDataUnsealed (storiface.SectorLocation) (struct) case "RemoteDataUnsealed": { @@ -1501,14 +1501,14 @@ func (t *SectorInfo) UnmarshalCBOR(r io.Reader) (err error) { if err := cr.UnreadByte(); err != nil { return err } - t.RemoteDataUnsealed = new(storiface.SectorData) + t.RemoteDataUnsealed = new(storiface.SectorLocation) if err := t.RemoteDataUnsealed.UnmarshalCBOR(cr); err != nil { return xerrors.Errorf("unmarshaling t.RemoteDataUnsealed pointer: %w", err) } } } - // t.RemoteDataSealed (storiface.SectorData) (struct) + // t.RemoteDataSealed (storiface.SectorLocation) (struct) case "RemoteDataSealed": { @@ -1521,14 +1521,14 @@ func (t *SectorInfo) UnmarshalCBOR(r io.Reader) (err error) { if err := cr.UnreadByte(); err != nil { return err } - t.RemoteDataSealed = new(storiface.SectorData) + t.RemoteDataSealed = new(storiface.SectorLocation) if err := t.RemoteDataSealed.UnmarshalCBOR(cr); err != nil { return xerrors.Errorf("unmarshaling t.RemoteDataSealed pointer: %w", err) } } } - // t.RemoteDataCache (storiface.SectorData) (struct) + // t.RemoteDataCache (storiface.SectorLocation) (struct) case "RemoteDataCache": { @@ -1541,7 +1541,7 @@ func (t *SectorInfo) UnmarshalCBOR(r io.Reader) (err error) { if err := cr.UnreadByte(); err != nil { return err } - t.RemoteDataCache = new(storiface.SectorData) + t.RemoteDataCache = new(storiface.SectorLocation) if err := t.RemoteDataCache.UnmarshalCBOR(cr); err != nil { return xerrors.Errorf("unmarshaling t.RemoteDataCache pointer: %w", err) } diff --git a/storage/pipeline/receive.go b/storage/pipeline/receive.go index e5eec5ab9..b1b0ce99f 100644 --- a/storage/pipeline/receive.go +++ b/storage/pipeline/receive.go @@ -91,8 +91,13 @@ func (m *Sealing) checkSectorMeta(ctx context.Context, meta api.RemoteSectorMeta switch SectorState(meta.State) { case Proving, Available: - // todo possibly check - info.CommitMessage = meta.CommitMessage + if meta.CommitMessage != nil { + if err := checkMessagePrefix(*meta.CommitMessage); err != nil { + return SectorInfo{}, xerrors.Errorf("commit message prefix: %w", err) + } + + info.CommitMessage = meta.CommitMessage + } fallthrough case SubmitCommit: @@ -100,10 +105,14 @@ func (m *Sealing) checkSectorMeta(ctx context.Context, meta api.RemoteSectorMeta return SectorInfo{}, xerrors.Errorf("sector PreCommitDeposit was null") } - info.PreCommitInfo = meta.PreCommitInfo info.PreCommitDeposit = *meta.PreCommitDeposit - info.PreCommitMessage = meta.PreCommitMessage info.PreCommitTipSet = meta.PreCommitTipSet + if info.PreCommitMessage != nil { + if err := checkMessagePrefix(*meta.PreCommitMessage); err != nil { + return SectorInfo{}, xerrors.Errorf("commit message prefix: %w", err) + } + info.PreCommitMessage = meta.PreCommitMessage + } // check provided seed if len(meta.SeedValue) != abi.RandomnessLength { @@ -256,9 +265,9 @@ func (m *Sealing) checkSectorMeta(ctx context.Context, meta api.RemoteSectorMeta } func (m *Sealing) handleReceiveSector(ctx statemachine.Context, sector SectorInfo) error { - toFetch := map[storiface.SectorFileType]storiface.SectorData{} + toFetch := map[storiface.SectorFileType]storiface.SectorLocation{} - for fileType, data := range map[storiface.SectorFileType]*storiface.SectorData{ + for fileType, data := range map[storiface.SectorFileType]*storiface.SectorLocation{ storiface.FTUnsealed: sector.RemoteDataUnsealed, storiface.FTSealed: sector.RemoteDataSealed, storiface.FTCache: sector.RemoteDataCache, @@ -285,3 +294,11 @@ func (m *Sealing) handleReceiveSector(ctx statemachine.Context, sector SectorInf return ctx.Send(SectorReceived{}) } + +func checkMessagePrefix(c cid.Cid) error { + p := c.Prefix() + if p.Version != 1 || p.MhLength != 32 || p.MhType != multihash.BLAKE2B_MIN+31 || p.Codec != cid.DagCBOR { + return xerrors.New("invalid message prefix") + } + return nil +} diff --git a/storage/pipeline/types.go b/storage/pipeline/types.go index cb1d84383..6329b5666 100644 --- a/storage/pipeline/types.go +++ b/storage/pipeline/types.go @@ -94,9 +94,9 @@ type SectorInfo struct { TerminatedAt abi.ChainEpoch // Remote import - RemoteDataUnsealed *storiface.SectorData - RemoteDataSealed *storiface.SectorData - RemoteDataCache *storiface.SectorData + RemoteDataUnsealed *storiface.SectorLocation + RemoteDataSealed *storiface.SectorLocation + RemoteDataCache *storiface.SectorLocation RemoteCommit1Endpoint string RemoteCommit2Endpoint string RemoteSealingDoneEndpoint string diff --git a/storage/sealer/ffiwrapper/sealer_cgo.go b/storage/sealer/ffiwrapper/sealer_cgo.go index d73b72787..f4ecc2e7b 100644 --- a/storage/sealer/ffiwrapper/sealer_cgo.go +++ b/storage/sealer/ffiwrapper/sealer_cgo.go @@ -1169,7 +1169,7 @@ func (sb *Sealer) Remove(ctx context.Context, sector storiface.SectorRef) error return xerrors.Errorf("not supported at this layer") // happens in localworker } -func (sb *Sealer) DownloadSectorData(ctx context.Context, sector storiface.SectorRef, finalized bool, src map[storiface.SectorFileType]storiface.SectorData) error { +func (sb *Sealer) DownloadSectorData(ctx context.Context, sector storiface.SectorRef, finalized bool, src map[storiface.SectorFileType]storiface.SectorLocation) error { var todo storiface.SectorFileType for fileType := range src { todo |= fileType diff --git a/storage/sealer/manager.go b/storage/sealer/manager.go index a4d31e21b..b0c023b09 100644 --- a/storage/sealer/manager.go +++ b/storage/sealer/manager.go @@ -1089,7 +1089,7 @@ func (m *Manager) ProveReplicaUpdate2(ctx context.Context, sector storiface.Sect return out, waitErr } -func (m *Manager) DownloadSectorData(ctx context.Context, sector storiface.SectorRef, finalized bool, src map[storiface.SectorFileType]storiface.SectorData) error { +func (m *Manager) DownloadSectorData(ctx context.Context, sector storiface.SectorRef, finalized bool, src map[storiface.SectorFileType]storiface.SectorLocation) error { ctx, cancel := context.WithCancel(ctx) defer cancel() @@ -1098,7 +1098,7 @@ func (m *Manager) DownloadSectorData(ctx context.Context, sector storiface.Secto // get a sorted list of sectors files to make a consistent work key from ents := make([]struct { T storiface.SectorFileType - S storiface.SectorData + S storiface.SectorLocation }, 0, len(src)) for fileType, data := range src { if len(fileType.AllSet()) != 1 { @@ -1109,7 +1109,7 @@ func (m *Manager) DownloadSectorData(ctx context.Context, sector storiface.Secto ents = append(ents, struct { T storiface.SectorFileType - S storiface.SectorData + S storiface.SectorLocation }{T: fileType, S: data}) } sort.Slice(ents, func(i, j int) bool { diff --git a/storage/sealer/mock/mock.go b/storage/sealer/mock/mock.go index 173a4ddf2..0797bf549 100644 --- a/storage/sealer/mock/mock.go +++ b/storage/sealer/mock/mock.go @@ -517,7 +517,7 @@ func (mgr *SectorMgr) ReleaseSectorKey(ctx context.Context, sector storiface.Sec return nil } -func (mgr *SectorMgr) DownloadSectorData(ctx context.Context, sector storiface.SectorRef, finalized bool, src map[storiface.SectorFileType]storiface.SectorData) error { +func (mgr *SectorMgr) DownloadSectorData(ctx context.Context, sector storiface.SectorRef, finalized bool, src map[storiface.SectorFileType]storiface.SectorLocation) error { return xerrors.Errorf("not supported") } diff --git a/storage/sealer/sched_test.go b/storage/sealer/sched_test.go index bf4b90b19..89a286bdc 100644 --- a/storage/sealer/sched_test.go +++ b/storage/sealer/sched_test.go @@ -67,7 +67,7 @@ type schedTestWorker struct { ignoreResources bool } -func (s *schedTestWorker) DownloadSectorData(ctx context.Context, sector storiface.SectorRef, finalized bool, src map[storiface.SectorFileType]storiface.SectorData) (storiface.CallID, error) { +func (s *schedTestWorker) DownloadSectorData(ctx context.Context, sector storiface.SectorRef, finalized bool, src map[storiface.SectorFileType]storiface.SectorLocation) (storiface.CallID, error) { panic("implement me") } diff --git a/storage/sealer/storiface/cbor_gen.go b/storage/sealer/storiface/cbor_gen.go index 6fec11557..73a299dec 100644 --- a/storage/sealer/storiface/cbor_gen.go +++ b/storage/sealer/storiface/cbor_gen.go @@ -282,7 +282,7 @@ func (t *SecDataHttpHeader) UnmarshalCBOR(r io.Reader) (err error) { return nil } -func (t *SectorData) MarshalCBOR(w io.Writer) error { +func (t *SectorLocation) MarshalCBOR(w io.Writer) error { if t == nil { _, err := w.Write(cbg.CborNull) return err @@ -360,8 +360,8 @@ func (t *SectorData) MarshalCBOR(w io.Writer) error { return nil } -func (t *SectorData) UnmarshalCBOR(r io.Reader) (err error) { - *t = SectorData{} +func (t *SectorLocation) UnmarshalCBOR(r io.Reader) (err error) { + *t = SectorLocation{} cr := cbg.NewCborReader(r) @@ -380,7 +380,7 @@ func (t *SectorData) UnmarshalCBOR(r io.Reader) (err error) { } if extra > cbg.MaxLength { - return fmt.Errorf("SectorData: map struct too large (%d)", extra) + return fmt.Errorf("SectorLocation: map struct too large (%d)", extra) } var name string diff --git a/storage/sealer/storiface/storage.go b/storage/sealer/storiface/storage.go index 5246a1a1a..6d6063c54 100644 --- a/storage/sealer/storiface/storage.go +++ b/storage/sealer/storiface/storage.go @@ -87,7 +87,7 @@ type Sealer interface { FinalizeReplicaUpdate(ctx context.Context, sector SectorRef, keepUnsealed []Range) error - DownloadSectorData(ctx context.Context, sector SectorRef, finalized bool, src map[SectorFileType]SectorData) error + DownloadSectorData(ctx context.Context, sector SectorRef, finalized bool, src map[SectorFileType]SectorLocation) error } type Unsealer interface { @@ -123,7 +123,7 @@ type Prover interface { AggregateSealProofs(aggregateInfo proof.AggregateSealVerifyProofAndInfos, proofs [][]byte) ([]byte, error) } -type SectorData struct { +type SectorLocation struct { // Local when set to true indicates to lotus that sector data is already // available locally; When set lotus will skip fetching sector data, and // only check that sector data exists in sector storage @@ -140,7 +140,7 @@ type SectorData struct { Headers []SecDataHttpHeader } -func (sd *SectorData) HttpHeaders() http.Header { +func (sd *SectorLocation) HttpHeaders() http.Header { out := http.Header{} for _, header := range sd.Headers { out[header.Key] = append(out[header.Key], header.Value) diff --git a/storage/sealer/storiface/worker.go b/storage/sealer/storiface/worker.go index 11a4d265d..51a7901b0 100644 --- a/storage/sealer/storiface/worker.go +++ b/storage/sealer/storiface/worker.go @@ -134,7 +134,7 @@ type WorkerCalls interface { MoveStorage(ctx context.Context, sector SectorRef, types SectorFileType) (CallID, error) UnsealPiece(context.Context, SectorRef, UnpaddedByteIndex, abi.UnpaddedPieceSize, abi.SealRandomness, cid.Cid) (CallID, error) Fetch(context.Context, SectorRef, SectorFileType, PathType, AcquireMode) (CallID, error) - DownloadSectorData(ctx context.Context, sector SectorRef, finalized bool, src map[SectorFileType]SectorData) (CallID, error) + DownloadSectorData(ctx context.Context, sector SectorRef, finalized bool, src map[SectorFileType]SectorLocation) (CallID, error) // sync GenerateWinningPoSt(ctx context.Context, ppt abi.RegisteredPoStProof, mid abi.ActorID, sectors []PostSectorChallenge, randomness abi.PoStRandomness) ([]proof.PoStProof, error) diff --git a/storage/sealer/teststorage_test.go b/storage/sealer/teststorage_test.go index ee200d9bb..4b30d5fff 100644 --- a/storage/sealer/teststorage_test.go +++ b/storage/sealer/teststorage_test.go @@ -21,7 +21,7 @@ type testExec struct { apch chan chan apres } -func (t *testExec) DownloadSectorData(ctx context.Context, sector storiface.SectorRef, finalized bool, src map[storiface.SectorFileType]storiface.SectorData) error { +func (t *testExec) DownloadSectorData(ctx context.Context, sector storiface.SectorRef, finalized bool, src map[storiface.SectorFileType]storiface.SectorLocation) error { panic("implement me") } diff --git a/storage/sealer/worker_local.go b/storage/sealer/worker_local.go index 2e8846ab1..326f38366 100644 --- a/storage/sealer/worker_local.go +++ b/storage/sealer/worker_local.go @@ -588,7 +588,7 @@ func (l *LocalWorker) UnsealPiece(ctx context.Context, sector storiface.SectorRe }) } -func (l *LocalWorker) DownloadSectorData(ctx context.Context, sector storiface.SectorRef, finalized bool, src map[storiface.SectorFileType]storiface.SectorData) (storiface.CallID, error) { +func (l *LocalWorker) DownloadSectorData(ctx context.Context, sector storiface.SectorRef, finalized bool, src map[storiface.SectorFileType]storiface.SectorLocation) (storiface.CallID, error) { sb, err := l.executor() if err != nil { return storiface.UndefCall, err From 015139d451a5a17488b98dc4d4cb18907f521dba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 19 Sep 2022 12:16:11 +0200 Subject: [PATCH 170/185] sealing pipeline: Clarify maybeNotifyRemoteDone --- storage/pipeline/fsm.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/storage/pipeline/fsm.go b/storage/pipeline/fsm.go index 46c0fd9b5..0a75d88c8 100644 --- a/storage/pipeline/fsm.go +++ b/storage/pipeline/fsm.go @@ -826,6 +826,9 @@ func planOneOrIgnore(ts ...func() (mut mutator, next func(*SectorInfo) (more boo } } +// maybeNotifyRemoteDone will send sealing-done notification to the RemoteSealingDone +// if the RemoteSealingDoneEndpoint is set. If RemoteSealingDoneEndpoint is not set, +// this is no-op func maybeNotifyRemoteDone(success bool, state string) func(*SectorInfo) { return func(sector *SectorInfo) { if sector.RemoteSealingDoneEndpoint == "" { From 291a8895955988948e0e8b2795ee618e4aa255ee Mon Sep 17 00:00:00 2001 From: Aayush Date: Mon, 19 Sep 2022 10:42:41 -0400 Subject: [PATCH 171/185] chore: deps: update FFI --- extern/filecoin-ffi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extern/filecoin-ffi b/extern/filecoin-ffi index c70caaf14..f0a7de699 160000 --- a/extern/filecoin-ffi +++ b/extern/filecoin-ffi @@ -1 +1 @@ -Subproject commit c70caaf14f8ff5b15eb5166093d9e57055e571f8 +Subproject commit f0a7de6991e037a7c355fdb62a0f1ae7fb7324e7 From 66ad2b810237382e2365092ec606004ecd97acb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 19 Sep 2022 17:32:02 +0200 Subject: [PATCH 172/185] sealing: Avoid panicking in handleUpdateActivating on startup --- storage/pipeline/states_replica_update.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/storage/pipeline/states_replica_update.go b/storage/pipeline/states_replica_update.go index a78d6dee8..9170f5fb5 100644 --- a/storage/pipeline/states_replica_update.go +++ b/storage/pipeline/states_replica_update.go @@ -240,6 +240,10 @@ func (m *Sealing) handleFinalizeReplicaUpdate(ctx statemachine.Context, sector S } func (m *Sealing) handleUpdateActivating(ctx statemachine.Context, sector SectorInfo) error { + if sector.ReplicaUpdateMessage == nil { + return xerrors.Errorf("nil sector.ReplicaUpdateMessage!") + } + try := func() error { mw, err := m.Api.StateWaitMsg(ctx.Context(), *sector.ReplicaUpdateMessage, build.MessageConfidence, api.LookbackNoLimit, true) if err != nil { From 9be712de99c3f2fe9196d0b8324e536b862badbf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 20 Sep 2022 17:30:07 +0200 Subject: [PATCH 173/185] deps: Use latest cbor-gen --- chain/vm/cbor_gen.go | 8 ++++---- go.mod | 2 +- go.sum | 3 ++- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/chain/vm/cbor_gen.go b/chain/vm/cbor_gen.go index c2bb4fa79..edcf06560 100644 --- a/chain/vm/cbor_gen.go +++ b/chain/vm/cbor_gen.go @@ -57,7 +57,7 @@ func (t *FvmExecutionTrace) MarshalCBOR(w io.Writer) error { } // t.GasCharges ([]vm.FvmGasCharge) (slice) - if len(t.GasCharges) > cbg.MaxLength { + if len(t.GasCharges) > 1000000000 { return xerrors.Errorf("Slice value in field t.GasCharges was too long") } @@ -71,7 +71,7 @@ func (t *FvmExecutionTrace) MarshalCBOR(w io.Writer) error { } // t.Subcalls ([]vm.FvmExecutionTrace) (slice) - if len(t.Subcalls) > cbg.MaxLength { + if len(t.Subcalls) > 1000000000 { return xerrors.Errorf("Slice value in field t.Subcalls was too long") } @@ -164,7 +164,7 @@ func (t *FvmExecutionTrace) UnmarshalCBOR(r io.Reader) (err error) { return err } - if extra > cbg.MaxLength { + if extra > 1000000000 { return fmt.Errorf("t.GasCharges: array too large (%d)", extra) } @@ -193,7 +193,7 @@ func (t *FvmExecutionTrace) UnmarshalCBOR(r io.Reader) (err error) { return err } - if extra > cbg.MaxLength { + if extra > 1000000000 { return fmt.Errorf("t.Subcalls: array too large (%d)", extra) } diff --git a/go.mod b/go.mod index efd792e98..62404cf5c 100644 --- a/go.mod +++ b/go.mod @@ -135,7 +135,7 @@ require ( github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 github.com/urfave/cli/v2 v2.8.1 github.com/whyrusleeping/bencher v0.0.0-20190829221104-bb6607aa8bba - github.com/whyrusleeping/cbor-gen v0.0.0-20220323183124-98fa8256a799 + github.com/whyrusleeping/cbor-gen v0.0.0-20220514204315-f29c37e9c44c github.com/whyrusleeping/ledger-filecoin-go v0.9.1-0.20201010031517-c3dcc1bddce4 github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 github.com/xorcare/golden v0.6.1-0.20191112154924-b87f686d7542 diff --git a/go.sum b/go.sum index 9d9ed1fe3..86ebfd96d 100644 --- a/go.sum +++ b/go.sum @@ -1744,8 +1744,9 @@ github.com/whyrusleeping/cbor-gen v0.0.0-20200812213548-958ddffe352c/go.mod h1:f github.com/whyrusleeping/cbor-gen v0.0.0-20200826160007-0b9f6c5fb163/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20210118024343-169e9d70c0c2/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20210303213153-67a261a1d291/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= -github.com/whyrusleeping/cbor-gen v0.0.0-20220323183124-98fa8256a799 h1:DOOT2B85S0tHoLGTzV+FakaSSihgRCVwZkjqKQP5L/w= github.com/whyrusleeping/cbor-gen v0.0.0-20220323183124-98fa8256a799/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= +github.com/whyrusleeping/cbor-gen v0.0.0-20220514204315-f29c37e9c44c h1:6VPKXBDRt7mDUyiHx9X8ROnPYFDf3L7OfEuKCI5dZDI= +github.com/whyrusleeping/cbor-gen v0.0.0-20220514204315-f29c37e9c44c/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f h1:jQa4QT2UP9WYv2nzyawpKMOCl+Z/jW7djv2/J50lj9E= github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f/go.mod h1:p9UJB6dDgdPgMJZs7UjUOdulKyRr9fqkS+6JKAInPy8= github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 h1:EKhdznlJHPMoKr0XTrX+IlJs1LH3lyx2nfr1dOlZ79k= From 2d82527ee970706c23c39e4722ca9d20396e17bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 20 Sep 2022 17:40:24 +0200 Subject: [PATCH 174/185] cli: Fix compute-state --html --- cli/state.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cli/state.go b/cli/state.go index 51c3b3911..c88df8da2 100644 --- a/cli/state.go +++ b/cli/state.go @@ -1247,7 +1247,7 @@ var compStateMsg = `

Gas Trace - + {{define "virt" -}} {{- if . -}} +({{.}}) @@ -1259,7 +1259,7 @@ var compStateMsg = ` {{- end}} {{range .GasCharges}} - + {{template "gasC" .}}
NumTotal/Compute/StorageTime TakenLocation
NameTotal/Compute/StorageTime TakenLocation
{{.Num}}{{if .Extra}}:{{.Extra}}{{end}}
{{.Name}}{{if .Extra}}:{{.Extra}}{{end}}{{if PrintTiming}}{{.TimeTaken}}{{end}} From 1f804714794dcc683ca4328851038a0be26710d9 Mon Sep 17 00:00:00 2001 From: Aayush Date: Tue, 20 Sep 2022 11:57:18 -0400 Subject: [PATCH 175/185] Update to go-state-types v0.1.12-beta --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 62404cf5c..dd603bcad 100644 --- a/go.mod +++ b/go.mod @@ -42,7 +42,7 @@ require ( github.com/filecoin-project/go-legs v0.4.4 github.com/filecoin-project/go-padreader v0.0.1 github.com/filecoin-project/go-paramfetch v0.0.4 - github.com/filecoin-project/go-state-types v0.1.12-alpha + github.com/filecoin-project/go-state-types v0.1.12-beta github.com/filecoin-project/go-statemachine v1.0.2 github.com/filecoin-project/go-statestore v0.2.0 github.com/filecoin-project/go-storedcounter v0.1.0 diff --git a/go.sum b/go.sum index 86ebfd96d..ee452c5fe 100644 --- a/go.sum +++ b/go.sum @@ -343,8 +343,8 @@ github.com/filecoin-project/go-state-types v0.1.0/go.mod h1:ezYnPf0bNkTsDibL/psS github.com/filecoin-project/go-state-types v0.1.6/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q= github.com/filecoin-project/go-state-types v0.1.8/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q= github.com/filecoin-project/go-state-types v0.1.10/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q= -github.com/filecoin-project/go-state-types v0.1.12-alpha h1:6BbnnrFqCOkiogZd6CTe7Bf1nRKrJDE6CP/I/dqM4C8= -github.com/filecoin-project/go-state-types v0.1.12-alpha/go.mod h1:n/kujdC9JphvYTrmaD1+vJpvDPy/DwzckoMzP0nBKWI= +github.com/filecoin-project/go-state-types v0.1.12-beta h1:QZE00g75shqwhPn0/bZL38sFxVAqnXC7zjmYltRdhxI= +github.com/filecoin-project/go-state-types v0.1.12-beta/go.mod h1:n/kujdC9JphvYTrmaD1+vJpvDPy/DwzckoMzP0nBKWI= github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig= github.com/filecoin-project/go-statemachine v1.0.2 h1:421SSWBk8GIoCoWYYTE/d+qCWccgmRH0uXotXRDjUbc= github.com/filecoin-project/go-statemachine v1.0.2/go.mod h1:jZdXXiHa61n4NmgWFG4w8tnqgvZVHYbJ3yW7+y8bF54= From 3ffedead7a50c30ecf1ce00e03c1348d1d658057 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 20 Sep 2022 18:31:06 +0200 Subject: [PATCH 176/185] v1.17.2-rc1 --- build/openrpc/full.json.gz | Bin 28424 -> 28425 bytes build/openrpc/gateway.json.gz | Bin 5080 -> 5079 bytes build/openrpc/miner.json.gz | Bin 16025 -> 16025 bytes build/openrpc/worker.json.gz | Bin 5260 -> 5260 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 +- 8 files changed, 4 insertions(+), 4 deletions(-) diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index a8f16011a9c1b9424393842c633d5ddaabae5853..5ba5c948256e8f7c3469cffb5749e43332b4aaf3 100644 GIT binary patch literal 28425 zcmb5VLzEy*xUO5aZM(W`8(p?-+qP}nwr$(CZP)34@4N0g(~~)gnB^qnix&@mBm}_! zJik}no{pPs3E&^favi=>2@2dk!+*UjFH`W{-A4aKum9$LXaVC33B){5ylCwIS-k}YGA+2!#36_^ zXs~AvPQw9P>NLp`Jrj0fzXc^gW7@M^P}Zc=sKlWzP*}btv3L zN?%3<|266h5CE+F5g`^fiU>Fh(NS&wdydc*UJ#q4JESj89OEVb82T1lv$eIKX!m%I z`fe}s^Kn_*Z`XIQ4kP;5|C1NNzDxuhHG_a55W+*itH~T_zzB#lp9ah;qL;MNNffwG z5QLaj4jD~+A1wNKN@%R+1N5!o)o(i}5Tu4U|P!TG`V z@U}M^do;d!G~bGEVCOr^F6g5$E~X#EJvN-k0E6)%e{aRk?|Sixt0=3Gi2u$tReBF0 zY$nP91W2~}?<->h`hWB$+{a#gf4zw!t=ybmKGklcPxXaCwR^!0a=&?@&dy#jjc`PI z2N8bpM4xPae36A&$)0{Wwl_T5$w!nL2V+XcI%iTOT4_|wiX39ctCczvp=gwBi&HX- zrIZJ4D3K5f#I4}K2moaXGLdbuKluWWJjedjl1HqVWfGnF8zuvVN_>gj$B{N(WcA)@7j!cwcpAbSKr zaI$e)HT=%2LN$vaR}>Xz2a(GNP803y4u}WtF$&9;RuEqVNL28Jf|vjRh5FyxshE&D z#}=*mcViI@$H3XGt%0-b{4fzR)nPFL_)u{$fgobaV!7{*Tq3$D`-Vmhf+KlN?EC7; zcX;9RU8BF6(Ca;OfW*B3`oZNbpw^uX>8B!#cZa+B@4Y;q;GYn-+KqplYHp6b;-0g(1G?0*s`@1NkGI zvnFSpGcRMoQDPsPChGp4a?;)q25a-{2N?nO8F+uP@-lOy$KE!y!;;Yb>;Cidr@)DO z4gZS`lJ)oW!0sacH><$+d(;=A`d-?Pd%lzQ(fbZGkr)e^cg>eaOX(d!AU1(5NK6gc zLB{X^{>8O5G|+HN-?-aWXnq{Cd#~fVb{Bl4R&~(->(XvUq;MHFt6%)jFfU(|#RK#} zA|?J6JS+HMzvs81rK6=IHKjeF-8o0GgUja`m-!p80gTKX#{&W!$7QYiwp}a@UXBiq z6d7U$e~fTtszV~Pw^KcdX_!4b^zuVo(C-)}C(97X4jrqdpHdNHOKrt($KF6{RYz$ha2)Io-ne($s&q+Tllrx9r`q@4Q` zn<4a`q@5AhC7@G>I>{6PRw zaR!|FacR*a))4G)m-Cj?Cvb;dR_YSV6=f^h_iS67z&d=cI5AMnD?iY*8QY~K|63zOnyq!MY-=^y= zP9Bb~4yKP$->2j{P#qf5Vf~Tl9h5$p0o|A*;!>r`6%8y;8-m>yrn>YbJQ`ScNptvTJm*C})KjYZwT*ENG;^wPSy zBj;d7nZEY|xjXT%sEGr$l8i~+*x5NbXfN*y<c_!v)a%a|$hPR)!-(J(K zc4NAIUrg9G7csj}T8V#euy(E+`r#Rx(Z`@`9S>LdNEkid6zOrqjm7W5xTu9^b@w1X zd2AY5R^T1yU4e5fNSl_`qMGOOD|8fD`B$}!tUV=G3Z?lxfYtPEyIVRlXw5$3&v@25 zGzI`Z7@o?Cf5x1bfJU!d&SA)|TPijyCT*9qP_%rBuMQh|udG-!@plLVFm7yI=bkIK zIiB;6Na5&$(7M;g@-#1(yW-^6tdzt*SZBA$KhhPJQeUAbrNy@~Z9Y~+zvUX@hXnHA zg%@keEmlJ-7LA=B57j{L& znx{%!oE)+?%4))#dYN(PvSlX*n~RT9Tyg0pbvEf6#q`+CN=>oLobH zrCSEAadx()3$blI0>SutszHQQ$CsV_lT7Bl3|V}E=$@}3-^8yz9|A3*H&<0sV0q4I zveP)%k5jHH#(53?7y&a=VUK^O@Ce?qjpGrDa!z93SILZ&$r7LpCeq*Wjh{Co(iTkX zC<{s(b?=>pUtY494pup-+Y!49*IG!ht{dZ$zRoOcEZ~cMGk>&h1z#%#$Ykm`KZnun z+VpzOcU?cq5NBiZ_oNSt7O2oO?Y>R$o0!8y5}NoofW=lJU;!Y{)i+=#dpBjRpXp~r z<8(RSt@Lj$kGHEz3y>+uWbde{$;^;WuZ^{L38<|$rF#5TjaH~_h$S`3W8l@qOj}4F z>!Wa|FOerhpeETzEq_n}OI1v2&ezTWoe*8W}h1ojq$G1x3n{U5&sqfd@L-mk*HyBtdL;!vtgpY&ei_iW2lFAjO zcCRnoVmfHeWE6XW9M+N`k*s+67h1coBXVJBy`jwfd}kBKgU{=} zwXvOGOFsHCw;Dic`8u{<(^Ib^p*x4Ih?#CB-|4mlx+F!J#XfeS{-rdJU1fCxa_YUY zCMMsiyG5S@+%SfSM`-dMt+1Gr6bsGiIrHBnMb8svRpQ#8Qi%X?miuo-7+OZ~w)ELozf z*ti0Z7>)ta;Hrdcv`WmCy5af0!oZU+N`}rh?BCRaLnq5q4}A_(&jRe+dWmgZU&?s-g=$zI&AMV zImBnKI}jZW(YaSx$Ak{q5fHHKQ!bLAT%e~NfW1sM7LCi{j<=X*uEgU%2%V+Sk!)mv$ z$y!A~Q+xjGpBuF3-NIJq;2exYs{a9uX_9kh1CKp7GIwpAQK#(-yCcSM6LVtavYh35ct#JkNEn_$ z$0G1k#`4ZC8*%ir~wexka>$SCQk`v$k7}?d66@Bky=~_E8JhfJE8YYIZ z-M5F)|8Ui$@711i!LFNxlF@&Lbq_25agUrE&9iWQYcc>u>-<(wYIWAi+IWDY-<@x5b)nDJOA z8G0tiJ@UdOYBR?&G69mu7 zd#%bbC|UDsI$IALH$AsPYxHAj(~&tvg>n9t1B*@xN4eU^X*j6|^oP=9RQ!jSwK2_> zc&$BZS%L>+41HoYS+QU3B&txoSM<&4#wR@a^KCENLdC`rg&=m(tgbd@!gqJ)$af8N<|hDc&`!}vQBs@a?BEq-v9&^g!rb^#JS4Ce6i3QWslW^OS85_MEEGk|O0-a!-ad+OBR1Oh-79mOhlD`JUiKo9`N49x} z3mwB6>A>zpt%83=1BYeyo659Msl~WeGX_6ry*1YoK+^*4T7Q9Bu%~3?8110#G*P3< zB^QQ}BX-`kRLx3!X`Q~d@Cgvoc1>pxvA{ByaEzX+DS>i3T(E_=Si#&-p`Aae5X)LD zDKY5`nC3+cd03u!S7h2@#xBkdz0XpkIW3yepmy^bY%r*^ZH|3H22qfm> z3=EOA{=NBZW6_zx_L5nvnCl^TbEJ%i6xLLl%)?YDuoOs7YPk55bvH>^NUYu-^9*>t zy~>CF>J8>&G-_q6nK&klhxAjK5Y*pjl5tcuW9^x~fIqb{h#sjJ&=u`se+yh}1|mbZpH5l_b2_WBAwy5hpu{*Q3Hu*$fMq{*8Z6r{k%pS>Wxn0!u^ z^D?wtVl;(<9;;C@5E?GNB@c1$^Jo#m-AZdTru3yJga)795lE&ILFqNfPJRomi`QJ{ zmy)u9JcZ6vzI*cmUDxakBPfzd6v=!#yapSb0_T~BEwVRWxiNl@^TJat?rJ$d*qFtW zB0ggb>Ss49M!ZU_>?;6w8_n8i46x9H9V-U!5ff`M6B|VpbH#PEY7fgI2wE0vtLcc= zbuvqasVark#Jw#aD@)jk>!*nOGMbHO`u0ldjVbG^7_@?rM~mSFAD3QbQlxsrMqKIe zd~2vReadJf&(CY=~Mg)xa6Ffg~+S?0mAJs6$jHYuKQ^LLXn9IExw;7dji) z&e=%&^7&u%T+ph^pH0iI#a}$e^S3qoOVVY}v5^GJ+S;H$B1Gud%}u{kZC+d=4+h>R zsQV5<8@(lq#yAyibjNyy%V?cvRBb1_ z+FC4mQa+Mdud} zms0-T4XhiO?btJvvwlw9TWgjbl2jzDem%-5qKj1nRLj_jrg9U#g3ZeaQReDMxiBIU z0Rm%L3ID%d>Ly^`Nk!@kY|}jJ6A$l9jr}TsajY?3Gl{eA4;-?*r{kweLC=Q>l4lSz z<+B{m9L_W4jxyPfGT#5YE$taSTzc)RQre8}uaIF_G~J(ED|do+PN90F%2pCUHsYhmXDDh-Tm?4AeT&6VtlU~U+>3CFl3=z zEJGKlZ9PnN8(`oaZ>w%RB)fGP43HT}bns4?2zes^#_;uZJ~R@^wGA;1v1bJr46U4` zJUtHtFn&J*eSgPW@cE?QausBGFqc7SF0zK}_OJ{>X&7va5En79z{ec+SVg5c#+W>T z(V*@OSQW%PUYH?blaE3tYNt&(#GHe7`gwSAZE= z&Q%gYJH(g}n))dsl)nO0Ozn?5`Dsp-B3+kZIGjHw8k$??FW!nmqUW(UxbN&3(`>Rj*VfP1 zq`9h~)1EYuYN03&-=e~evc~`!W81!>{G0d@9PtY%>&~r>=qv$441y8cZMiop-V_qu z)2HV2V)xCEC1~IA>`=+zVcdYx%fGcvmChpHTD-`@6*$jwfE|Iad22QA)T^n6Y}u(w z3fPL^c%G?mhLRP42!w}vnf{6{((BQqV%p`@GD+&P=3*Gt3~jC_ls$M<`h5Aa(%3YV zuB9PpEt`#qPI+a%jmP4Wcp!rP=aMfeb*`8zkv*Id{<(tE!GTyKc-*_EN{?ASW66hZZz69-(H%&`?5%u`}pG)34lA@ z4ZX5VyQ*M-t$}bx3&UD@W?;0oi%UtzM5UFuV_l>|#deeRA+ps%YTV^BSinQFC>EDq_d<6TKh+ zZY;2rQlF~-D+^gXK=24oo!ijdZoO6-;!_PnI(yf_UBnHqv&qoNdGUA3wy$Zjut##9^n%jdlSVsn_(~RcgzeajM zm>9$$+!!yVo<}BY3XgLMjP|&U@n4%^GgG_xl=n@tbGZ(ZR9!!C4T{`@UUk13KXcHO z-tK7mm@%f|tOW1*FegPUMc@6tiF%K|v~Z<(@3WL2tG-{OdhBH|56oD>yct`mnVn$}Rt8MxQW%y0NPAZqR zzy~HN83Lxg31qGZ%O@K?+kwzd>#1#h8P>#4&jy7Q41RW@((b}8t~I(cE(S=1zqzT0 zTn$|BuaVifzM(facfI2-ZPA0Bo#sx5(zZ@0^SOsrdQfQ@;ZnL9d%4r7!QE<#aSshA zU{!=-iaPBeQhzth0F@^0goV(lwGy1vqNP~5fDjEarc(_nDaL{0(&+`R4XA1_D)C zR+}FmX!I#20YSDUaD~H=Cq*bVLYhoSY+XO=EsdV4)>`7R+st{ z8ALJk;Q?8T?e_u^719i)hyiNFfymiG72N{+P-II8`c^6W6eYa*M*)!O!a#e0)BJkJ z#B-j)LVW>I6l^Cx0`cxGUXO2HBy1{bvYA{9720d6{+)DFHQ9ZR5qGokPPLW+)EHAL z)S|a~pP#(R)lG6Cx##%kVQ=V!4;Ct$($}!Tsqg0NQlFz=g)IW(|yLrbK zvKDc2jk)7{Tj1nz??E^ zzbFovdLxmA5QunF0!c~|2>|Eq?rnno>Xn~6^P4PymP-@dVt@fK&d}1zHU+RllY{LW zoutPyDc$-Ce_a|ARX`ErKjQgYohoBa&b!9QZSh^?D4@xcSk|&`QpV3$Dzh{CIFFAv z(vgj%zo?97i}Xn^boAp|pmbwsr~e@B5PttT3VsutAYVz>D81&ezRkDr>|{ZdLz(;t zcwdU$vlcUtQ~Fg-AUO9WRp`UWss<51Z(sJMM@aOWD6Tr@Pk5TZ1X#_`AV z7m<#G#0(P&B|?y@?3SZomb+Xa+tn#h$Ka1)lx2B;1I}b-{1L?Ob}Ls#(6PO}oXq{h z2HDa>HLNCUN{`f8-`c#BsySq57v61&%5ggT*lLPcd{{B)gPAPe{l)thFpd}swpzYPe^f`{wvHRZd^})yJ)frEdb@F0AEpuq`X_}r$(-jJ_RSvx~&hEm0 z%CO##(|cn&`fgkpZ-xd*v1&&no@O-~oj2L+-1KX#-n>@C?A&e#;YiJkp%oB)#^L%_ z=O&IuT+7hICR<>^&;=6OP??e&m^~C$e$*Qy$|TiEQQlTlr~!=3HXiHU3E7FwwGEuK z0J^;NQi*2KrpvonN-k;VPXsXAzLynQ zO|9)RR#`&prN`3rWTY2ngHiwc9V|!4j88I#NyTch+_G9oe1L6oJ5N&nEPKE^Z5YWZM;FQRTUyR(9FBiO3e( z@pqLOYWw(t5`jWv-RJ64CD-_TJIvXF|7zwL#M#*NkH3`Ln1p)1}PrbLg#nX-9;AgwK55u=_G^?m;-8JD2Iipa{ z_In%q)Y}t+Y0D_yDg`xEDEjdIPQjuiDv)m-gAGZZXEJ$Q{x={UOrczk zZyNu8$&M{hAOsxg_|$d{*8$^pGAx30S_d?FndQ-c$@1o^?MJ=UaexqBWANUeRYPLh zN{b#Iaq1X5K;Fqj^aAle24Fy({dh2bfn;Xk%kq8OCh0$-wbcFY5i~77^<7nYFv1QWUqxHRw~Iv=~>maNxN=;v*kq z5eu=k587}cfv;-Y(Lw*)AR}(d-zvFn`hJ$%cvquJs1AS=iLZxhKuhQkii0k9PAN1$ zRR1neMpg>7i8iJ%X?%R})U&hbr2Q15`j|yP<*K?$BoVeqW56QN;q>mls<^zAc zS|ROCFkt7e^BOY*cMx9YR3bjjPP&Gb2}`d# zpfS+Kl%!K{rk&1wmhhENT@v$}a}C3nXB;_pt5m7vsn)4KXjFo=NFR5A-uKur;IlW1 z5N5p!tTJ7O1C}MYGh+vL`ckq1%nnnw24&b{$Z6U@gtfPg=BR-7&ZILqg!Vzx$I|EJ zyZbKFvu*GDB?t%IJsekpl096f>|Ty-qIF>Rjhy2+N{cwf<{Io*M?rQHHs4#+WL(?b zl=@BWpOR&x5R5v+R02k1(dXBnJbI)~O*U@Ih>h@2jnomw1-*^c*#X#<9wH%x`8eE34ZiMENgwQ5fU(7L%F%P(5 zCwOp8;LQjgLk?R3he5;_!B#ygeDh#@ZbGDnp4!s_TgD;;;Kfn{aii8$uw||UyxXuj$b5%b{_3hk8o{f zW=hYGr@%>>ASO=H5~;H(&KAfSX~$G(fMYY2%cZDefH(rA14u47P^`Vm8IZFkMY0bo zVu@?V<0NE^=kXeV%Ogz*{Bc?Rr+MNeT6US{fk!Yvd4cH#kJxh76Kls%--)PMr%;YF=7*GweU z8#O^#CKnsQ;-|7GTng604ag(1DO^l!O<#1dn5@}E2s`=x)grR{5-KduhbgMJ5B&st zS~s@~<(=P=aj+Ka)z!LL$r~=In=`NwEN>x(Lv)0riNsbBf8IDDrliAKkU; zXAKK^Wa(ro$2T^1*3K_(uW;z_LD^kmQvc2BtbZG7gmoE3g2u?>n?4=pE&pi_LZekS z^liXivmTI5EOlcL+Bzv?T&5v)ms?F;7tpK}+TjLv7~ra>kd{|{>zKpsVpZ4k=Tj{Y z=XoHRRyNm51Ahi?j=S$b`lvH$@X%^4=Si*>g+Lm2M1{OF zQBZa<6 z(j}5pEb`HgKGgB#u!>INGnMQp;rG*4#i3I1Z9^3<-M9oRZtdXzPs9MFxgiF?yjNt0 zdWy8mpX!)exZcd8UPN8|n^Vp?hv=^n8{I5WI7-Qec^iDy+Gqizresv)gm$MHGdho# zS1i{|@LQ%qy{hQ&Qu>p`;@nCr?tcJ#D!L84dO=cDpPnI)7ZFtn-$hYs&F_!+F8%gV zNwo>OfY0HIxZ-*Q<8Jh71H0i~IM*)qY*p7j8)%)1fDBEc4xNU(J3bovTEDDZF`FvO zFOY9cfN2i4MXNI93i3&iiBa>EJ-fxiEmeRtRl^)uAi<`bDOU2=noC-uba3&U+~)QL zLcwwIt|Gv7mqD@7{ERW_LSJa%%G(=30J!#hdbUxiyiu{{bP^p09;Z^$_*;j{*fW6f z1P1cRO|Y|YUIPFZf1s=<1tDdW5SUee;|*Fq^(H&P*QNo~8y8gAhqK+{s{Kg(?-hqu)Ef-&Z zhsB2w&<<&A@&m)BVheCrUxriffT&MZm*3Wb7b^BMaKpSS!>)+btjin4cZ(?4wsbD*XT7pPA|-lQQYVukf^QfAwWNljlwt|OsZou zDmh55o&8TRbN=klZS7>X>ni%p?o1@tOguyB2l_g6t`u)^hQndt_sGIeFnJqa5e~Sj7*YFJ+>o0!L(gPJ-)()RxjykyP{67 zSK@|s(K%|hsMZ#OzV(0ywZUJuShc#K>6PxWgN{~YnXax_ zDQ7OfsE6(GsqC6%`=6WecxIf3qG$HVpQXRq@kXzuqa=-Uyc*dhLy5mdkl;Zh_RxU< z_L4lL-BzjFy^0Y+0-JI%v=1ivG6`}N|8$ziYF{idrV^9?*99qAnjwZCB23VaJ}Q$? zbZt?Y6alb)Pzat1tbDPz*)5XdCDwSG{NU5sJVpRN?ZLbG6drH7J*NZa;d{XM%$YsTh`~qs)Wj}o#qFT*ZP-TEH5yg2VzCuEgT%kbkeS-X|0>tem}h- z38CN)RNur}Fs7Cdmk_f!L(M}xzQpm*2M{jt^Y(P8V2;98hC+Uv6Zm=fFFq#_MlA8+ zYxThlMFgiP+F||$LfrMb60Sw=ZW)EKS;&%ka|BtR49P;s*f(HozbhGw4V+PF7G#<{ z4=a$~&MQV?>aamD746h6R`-cg(J+YTRczTVbL|tuIq;+G)X-6M!pc63i)1gVuakUC z^EGw6axKszMdIpI*rWx4P%u6Ce7N&qfBW-I6Vu!o?6dVSRkfz7`8-TADLP2C(AAMt zcu57X!vZ3yOQzr-AxvTHyfmyu9_HHXa<~u;lDo zI5@1UD;f1;M+CPGZra~KoZN}MpH-5znB(12XThOJim zBu1v)-TykEcdbZpT=o~R%dhHSakr0O-PuVl(_YxL-AVi+3djQwies`Hk-!bCHohZ@ zKG-M#fK&(>)>JKPk(y|)-9jLg95uWAL7jnqA&Aho%&_HR+g^nJz8<_-gz9gUFfl(x zs&yEmIC-#n&{`5$PdplBUMqzlFUB+==~+adUxX-q?n%cg(}S9|#--G?cdy^|0vX4j z^SYwJ1UN~Tp@dCM*!f>N8~rw^3zEX02&OUB?e=Rzok9k`9RgDyg$>PU=?p5v4^vS^ zc_o1*)RNsQSdm`#NiWAeuW%OX23NF34^Fjqm!*!Zhu#6su9>Bsz_us2W3HrIxgMc+ zc*J8{wjo7y3j6T13-#yR$otNN_Z-8z(-7U@lgxN8p+9p}IJ=d);+^8zk^5c1S8#P) zeLlH>oq>IDKwJ=41b0F~eO$1JkDz@TBd{A~y-=y)IdQhTJ+trfo1ZdiO+_`xS7;&m z{B@gH)D1)6?2$Qjj8mE}CN60&fCd}RB`Y;GBoK9zR`GcWhaITgE(bPrY?o%4T zgH;x|WJ@)5>iuLWsmT^?S6QeQ&Z`_^6$I5-UD`78K}JDTf*fhYa0KbVu`?!NcO+-Z z8JoU^~$EV~F zgArjQtO@zU7`z>Sj~kDK9?`}Ka9Di$(79_>YCtvz8ja~jR~HC153FwSqS$@T)jd$ z1s7e%&{8%+U1YF+P#jiNhPs4U%vvIY=;!4^FZAWz%*{dnlGQ!Y^h8qwL3Nx*Ptl)f@E31a3g=<~2mXoeXZ@!ab# zw$E0yrMX>-U1J3XiTc_n)@uL-7`3`Su+LDvp5k4|#R&;W=H*>y=$VYKAUHb5^X;eg3 z7O`nmoZ__5E-(T0jCXI^WJH};F$B9VUJoyEF-KF#ZgQK~sHW17XZ)jG^U@wHN&TvS z+_Sx2-HuPg_aNrvS@N`HBgt9WTg9_~$>z=Oj!1O-4_uIHwKV1%8#|kgio@P8aBNn5 zU5VOg=t$KxaQQm=+~e19YAPHd&B<51(Dv;kkF6T=bORgEWt@JK>YB`sLt+rORSi-&4-q;1J?yxuXBG2q(YM0%v z0J_P_t}A4&P-=rs(NJl7q+1o=m)TZv=!Qy3d^~N~%0M5BMDT@QZ~Az6b-;FJk9!S1 z0_8uP@Q4X7ioD_Z$8yc4fklvcm{4OO>OTEvoHrbQ?kUtnT#MG+H(H^tgMZ}ImFEr= zJ6QJDw^5;$rX;{NO04L%%9`!QJ{Nyg?4N;0p#GGtN%4e&(yxn*-llFg)0jAwixjpA zwQ~HJ8`SJ~a$cI2^mmtq>k}-aMC)>z+g8~8!bMbUE5DJKpm4nkpXRicl&m`&6MIUp zZgY(YGF-H@*;_7YOi5x17CJFpss#zTOW_=;FRs#cH7!6=?jzEeoBqQob1a-Is}&4d z*09`6zg-l2Zy!T^*PV`aDy_hM#A=VKe6S~P8|9X^;{;~Cw}V)JV@`1XiZuk(I_%6_ z0k)2nS@7ex!)Y+ZZS`GuP2o`qnK!|zdSAGNkeVLU)89886wk~YT>Y7uc{scJ^Nm*k zDPT?RDe+a&D6xEm-_EL&rTo^xzm=iTQv>m$tY`%rP5B>h*#m)izh72KSk+M8V_*I8 zNa@B{z+5NN;GR$+Q2n8UYj0&f1-HN{eo0Ur*z~`P>stS&-k<`iw+ch2--y2L%ZR_a zY@ksL0?9BK6JXz^QL}s;Z=D zk-&||itw@E*gLrXftZ&3O`Yo~FI4^jj8!8Jdg83}U=YW$F^j@Svi*ss?X0uMTv;1HrEuWridgpyFafjz ze$f-Sw)Rb+d2p0mMOSeThC&nYECf$CDvCoq(?p%4e)L#%u4z9X)gNB#aCNjWsPg9Y zR}qHKV_B{&2`*n)n>zDbyXzolR({o1ete%;-M}1hN9=KqwgNMO(NImDizxDRkcmjK zCT<*Ag&At;o^= z?>5p`>(FoG?!a zVt_AwEE%Qkyk!&G4E_HOuEfKq_cT#ILb@bsZxng}<;1J_5?_ic6isLoI(eYT>8Jr* z)?>u=?RFoI_3*zzU%omqw_`U)yL2utU$`BegTG{(`>b%cHzo7YY~2FD=7e7yE&Axy zo#Zj^1!R5oJBL}Kf_}LFC|7t}MVo>Y+ZcL*uYUmzwuS>QsH_S7S4GeQ8?>ZIdn1^M zx=jak?-YF1&s0eObE4q{xD$*X!q{#h1~?8ffC%g`Dbq`NDdbj}`9-W^N>AU!mR*a^ z%Xx_6PZDVWRiv7ll&~-1(LrJEu~TNW>G8COF2NBo9B5moDl!!PW*$C4zv0l^{P;c6 z)r?s&>Zs-LNtBF7%lHcHP{?4q5^9=O05J5Ib%`ar=;@PQDfsKqxz36(wGuW91g~B| zK`T9+o2pu>WugD1^_Z2Jt>A^U<ya5RgQz*jy)=xRio`_Q}61-Rt;w6nq2cOlx~{`*QL- z2W~sxFJ=2#1$RjTx=JH?YO8xesY)!T@8u0zk!C&TwmeD`SGxyD3`DI(fRea;hG~>w!CHZJV zWn_L4r3+ztpqw7|2&hiFAftfQVT4wEl`%#LplHQ?k$N_$n*H-G282F|9~^QrYu_=7 zc6e3Oe zEiosPFLvp-?*M`5N8K;3QK?(VyWVf}*F9Q3F@_1m#RHu+#x^)B;)JX1cm{7>xY-rroh-+SqpVLBn`;`rJU;CIfM1j@ zm5~1sN>j3)JImpw|5MpHMaT7q|30?WVA9x5v_KTym8dY$mH|otyc-|L%Cw2F<$N$f0Y8tbGo?RS7^f+fwFK?f{ptx>42x0e)~3kr_%TOTk@NImTq0x1h_l7ls`Q%R-wjIn*@Qm#dVc*IN=#CG5`e zDpW^Yg5N)#CRbSwwlnHEFq$`ks9BK$Y)=g<>@OUPi3xmUx5de-5_!?Om~JC3<)~V1 zIqx}7#cIpOYoq(g+>H{v0osKxkC)$o=<9&}BT2R#re`b)e)Cq9@dO?-lh-Dc7_?q7 zNy5Avor;++Q@pbzA2CJ&!hrSv4t`kvU6o0&@RhMW!ZvXi7-l1Y(AU@bMbng*%ZIc> zO^FK5lbQcsy4LQC9di!l)s-(x)&XHpdvkXqXF{av$M^Ve+hnT;e-e$BfBphb5rE11 z8`IGr)SdcTm}TcT(j6%JFHnK?=Y=(c6Z>0`P~x{Nb}O8e(V@g|un8ut=t0{s*nsT&~>A-`74{zRQ8 zWv^qvw9xcJJ}?#dK2UW(HP!1ugBrWWigZ2WD=JRiAr?=Z=&fN-fYHHkDL zhD(A5gc6(si=|T0I+#J-Rd?i^LLQ9RHY9p6q&+B9d@QO z*nJlTb`9VoQEj1wjleSmgpR|y{TgNy-Zd{7rnS(2^S7>5O36;+SF4$^@@JNMwRi<Wo&6S=fAVqn~> zNZEc+C+S#>IVb!e?|C2N+Hty^ki7w!e`1p3&EdC$Q$P!}4~$^`P%#O@=-Ciq77($xC?i@7vVrjNh(J@n|H(gIWcQJB*(Vsd!X)J~^-!;(vfq<&QWkxqWY zbkhw*gynk5o$AW~(VE~`(wn4-liMFkt~6*XpV6QYn_wHaK-b{db2KWjh?W{_i1P!b zo_Zi`l^exSHQCJh0SU9Q_fwF%eFx&#f_(L6X>@Nt{=};tLu)! zp;hNWb4sb(4Yvm;%w{aOhe_WSt|RTecKPh(a9}6Pu02v40c0FrE#VJ$P8j^nduyRN z5tqY_nz2%A9)5rb3NLKcRO=jNJvd-5)`hJ<*!|FexPAUqvy=eSAs!t`KF(~uzQG{I zu5N=bs1nXiCljLc-9&BiEJPb73HBgjx+s7XG{R7O)ojZ7LWPWE9_O2HRsBnNQbUF9 zQp59Uz_#~byEpc*;0<_OGcznsqz|}Plm9%3>(SLc_VF_?)dPYiynRI)nK*2^u73Wg zxc@S!q_}|jjAudzB#!3Q!!vIfKcW{4T(47zufky8IBH~TU0pFw;PJQd2g-H)B40Iw z3$f4O$a>c#J3z1(q+wX(CgTrJ*siAh)sbv*$E1!#agCu6D8pf6@>YiMmGwb&Vwk>b z0a~^*_p*@~URMg6$$ z14}Npi&?rEA&#@@f1I4~(1;1izgLVBM)?dWOMssVE^LUYS@lc?hfHkL;4DyNqpT9= za9&(P7*^6(FXX9tSoY2s><(8-Fk8Gw9C~t<$*FY8Rx1qf)yY|p&I^XJ#a@%Wjk10% ztL?i%a3$R(SP}Dz-6@8wI(3oj$~cl=<|($>gF1d~R4&KV=*@y)zx6neC(x^#R|*iw z8W%I2MSm;9B{pDTh^!P)w?h}BpcR=dh3a{s4QGbaDk8ou%QuW;6ZLN#F0UHe$qp}Z zhq0M!!cy0l+#Z>!tdDs_XpB_XCoxD}9AP90955IMQ|LXG&fYp7-f-C}a#;Qa!Gw7eXHHd?u;qh10nypQ zL*zZB5nRO=j(@?WrVt}#)@1H6``rk6?{GN3ylH2R5dI|kq9phx&X{NW3b-)^KxW50 zu={DbBdBQxaqk=cLPP%>PvkR7R3ZfKdJ2hmNs1UlTxpPqetRlg2F{5F>xh*v;fC59 zl*n0qHBRc@s#M%qZkYYww*Dq#w_r7D&cnlQ?fjj{#b+z!?Urz#NNqRCOqLUytc7@kGA(>w=167WXPqUTI83uF!u z3z`O-cJe%2I9`MHi9EHT%t=lyfwqh}n|pm2E2)Wdjc|0~uf;Cj-)P)-%Ix+ZCvt->DAHX$e|0=LJ(VFDM>s(68)i zD{U`wB_-r8X0YPdpcu%AFb683i#qK79u_9Y%k%TRoF1A8@!NA2V{!vyn38K)Djo80 z&(2$uMwTI@(jMkdcXcdVx}V2m&HM4%g_6DabDuj|LBZdxe9Ib#L_^~ePRH^{e;!EM z>i7yrSi-Jt)>h89jH_aypUk<93s`ev|FX$hL_BJen-oVpa?c=$h*#QU5VFMfFOpWK zR~%YcbYw~K*OX5(7($J-^?#1eVJmu1^}%_s%*%l$wk*njZ9rcH;*7}1Brh}S{6v($ zNz9hRR=82=?O66!!v(pkT9;W`-{U!fnD$;>s|@N|Z-F{F)eF>suJ&Bf-4cy6$g;XD@>WfEs{aO@Y>=MiVqsqWM%s5wPZzw^|R<~a)_?K zep44ayULM3>Vws5E|7GKmH#Cs)aVP6emKU0D;4B3gf_0Fi5sRVUU6Dw$2C>i5EK z7R;1o%u#mXBQL>n;PzuHnCKY)6}yT>qVI3JsZ-Z7(hr4F`11jfmw~EV=*14p&UFsb z78Gv*-rr-9AHssDlzELjSyeLt&hVg4+-tv(}{qxHL${bzbEn_O12#yF8No*ibUg4TIT7wO`9@o=89u+qpH-#;dC z6={TTuK!%X-)y&6fvp^{nAS&sH$1E_+~N5X*cKi&NzZPSMh-T8wy*$#eoH1$A#t;7 zmVMhz+#!1!W)dK-lucif&qNQtr-$2t-fvIV2558nCw`Qlf&)B}lm4n@-?F5t< zYj7L6`pkqo=%UgM`wxJ=>jhx9&sy|Xc;s+q;--t>mfE;jB11{c>_`j z3PgfgOukBPO>aAn>WD$?pDI(3(AJ#U$rHzuY^GN`0qv-=}V zP{R{kyT_I6OEH7b3xcw8)`i;j*=`3ktC{uUR2P=ls?zAnzL}>I?(0YltyJA{VA)2# zTC?wc_Kh*kClS%3Zd-Ra)})1OPo%yIBjVVyEnsOg$u(-?Z8SH3x4U0Au&k&6*U}M? zi~5^->I=~PBm0C8}d-lVt_MWSLl16S~U(+9&E)}@5V3C7*oBV($Uj%I^B zh8@L4>o7I3VmG8m1H|K8a_yafVthbg@XL?c77W+ootykAiz zF_Ya~B%rZ68+tU4_~RewEnnQb373FGEAuVl3}(IE^8e%&4=ZVSGV)W>4(00E)oxMQ z(lJ3E*z?@Ju&_Q`R--YQ{(_aBoo3&AxMi&DMBX18%uo<=1#gqm+tx^_`J%=c=xR5h z8Ru@uur<>HTtMDISvk=NXkCXVYanTk0;j*KxT~`V@7}aR&?`WbM^hAg#DM!@Wike( zLN+;q3;j7va_j&kN-JYM>yZ#Kb<$i8WGSYI#R5w*8Y>UV7^Mai%C9dpA4ZxqbdB`| zGjjyrf|Ktv?Nw3$c>9)})^~-EQ;t`V;{51nFSv%V8RzlHBCRXy&LyAMn$GI3C_ln2 z_jZn;qWY!NFf06p+|j<~sbSZ}r)~48P0r>K5FvhB6dnhz>U+nT2B@S%-uiFLL0a9H zxK0DZ2gf1Z2W%4B=nZL4g&O=wJd=rb=y@q)gznz7K}aBJePjvt50qL-P=Db_Yj&YT zUaOyJ+7Qn&SFRviVH+`@VEi#K*{5c8Y0C=kuT7d4E#IIpf=#HQYgr?^tQqPx?`g&! zVv%wa?a4M6VKEwFy*LkYjol?Iry4;^xxUY{qGkP}ldQhAFd2nQ@>`&eqf} z@yib0;;uHXKY;FGapo}nH$>R1{!3UzqW1sB2L*i0X)2h!%nSqbq9 zzsED^q%5iewoZNu5$?G7&iu{vxd>z1S>^Kg@1XDkEzxWp(*iFM_7kYU$5>0p1ktWB zCPKAOON23~qn{)*Xi@U-Ak?DGo979tbZ^(&$z`6v=Si=_?AzD=US~HXj^F2u$koKw z+hFUrjjJ_+*UMYRS4Z!=k${^UL#~7yKHxyj6zUB$X5M!09AYkI#ezN5yov1V`^CS@ zF3%6=lcnkHN?mANriD&5C*sSEtZ$rzp0$gn4|P7>@b`pGGC zwso2(pL)BH$|eexyQ<}yw#)}ris7m)Yr8J9idMBXmlo$_HEg=eyB0D=+kmX46qbae zZ_Q&)cCYrvLk#B@**g`+BcYlk$J(CQ0%%ivZYKE*&=N?!6ocsgcxD9+K#teYv&M{L zpxU}v+rosCIdWp<&!wt7yooN%*rKeHY|T{gKlD&tRjS5=79_Vt9;)6*6)`{KRr|~J zoYEA#PqB6O*ftuosw{5-I9IBv*%oxf#})%v+^Y)NiaPxxdB;-g>iq7GW^CryrJe#U zHwKe_rS4k~37rshK@7DV1R~?`>N&x)X44T3;_HFQ|0Q&FLPUG~WeA!f zN%4?lbHT0Z<7UY?7db2k^JiSq;2KAymbKhP0JNrD|G&tp2u|eCEW?4VKk?`8lFEpq>EEc5Wli4Oozv^N60mrgO(# za{(}ff4jr~K~laZ@;zHyw2dy+Hk_TnE*2bN^j9Cr+GC_~UY(Raf5sgK;T;;-al-f| zPcYTw zUc`fhoboK=<`v&{;#6H3nTq#@SY)5tL*Xkwy07ATtt@Z^S1;!4eZdm#Z>J>nt&pSO zg+HJYcK=}L_TA$cM3BmU&_P7zK~hK^ouDHW(U4dHR0ed}SVwffWnwkxsdLaAZm$Wp z7IHS<_{jjC&mu|}ugWf< zF6Oc`P$F*cTurAc`%7<#p&i0Dssh{C&0|5=TKzJT-Jrv7%M@N~g}z$zE%OEY z;DRy6I~DLwk8MkAbC|9xI@R$7pRVL$(k#XS6B^A_EPkey-I?(hExI$~^?dC#IuyOm zm3jQTFdUAy^`PP&oI?gq9)9vegmUyIC3cgli^jumo}2kw&5hN9=tVD;L%kn?BVfm5 z2oSn>D%bVaen7JZ)^9Z{(;?>?(O}XO8oKv`z(z`MR(>PrK;K@kmx<85*2QhbAjh<$ zgND@a!YG!tRUEcD?%mYSf%dIrIMeZSI7nHCzbSd9s?NAVyEAb25ZPrcA|`Z$BKzap zv)|*;*P-dkCWw_itxS4(ft-@Rr&9*YUUj@2D?D|pV|1j*mRpM2_107-)QK{;4weS` zbS5m4&k`g`Xlp#C9-@xsC*FgHSdUUzA8~tF|H$_5CQ5^~fXkICns8=PGc&BZ7bCzEi8NPKr*vKvi=-djBP zAaPTJY0QCN1~v)mv>L$s7j6m{*`(NkbsU9lKyLCqAZIL-(^#ydq27~xS2A1NS(FH# zY2dy|K;^OvRjgzd@@gwaRo5DV=pA=sV@~VdPJZ&<>fN?QAS^mLRlusRkg2mv>#;AC z*P}lVWFBfqEhebj!s+lFoGv@dzk3`NrxtJWOee=W=7`z`aJ~|Pf`D;@{2(skQk@37 z^|G`UOASM7CRs^!dd^J7ate_hI}nOnVpij&nzz27=`{&u1eWKD-GIJmf${B*l|#bF z={P|tAs&#nNfTzw+{==xd0C$s0bsJ-gU@F8YA9!Tnm#5ck@{VN1Szp7@l$_gzWiDT zc3RHTy3(8Suyye?^T%VQ!(AQIWY4xe0wW3gtCvPD(_ifY`LXMt|B-eLm|roSMY>(u z!RfiWPsZghasbqAfr)-{W1JhI>)L9Oih4zj~l9EKOUx zlUU8@7_Q(4fo@@YAKC5un#8AKuDHljE7j|4_xJ(acz?$55NryV0|E=4KKk4Qs1^Ot z&w!HD*$9TgJ{Z{F?hL)O%V~9m!+M)#uYf6L$)Hw1i3IG4t3&he0GJc!-{Zd!qhN#n ztqCdakdz5O;}vm@n5?3bPLe*WGKl?t-Di^#@xf+9q?tMkg*DMt;^N;1)hBT9*Nves zn|#A$3)##X-`}sts`2*R{|!>e#ddKprol?V&~YSqB1t+zzM~#@RQ8$-nI@o_5TBxW zu}Jh}K5{=_zw9e>N0sByo(>@8_nP2FOwYd?8drn3#0OEn{k|1(rOXQqvDA4umS~tV zWPJTlFf>9xxW45<^}`9ei)sGzil}!2K;5Oxx)y}*f_TE^RpdRmaM$b*XrO=%^eHzY z`pwZgUzxu5?6a~jE$#jdu2?Vu2xb+nAOMm*w}oKr4bjLbH3qTAqFDGy6v6UIaDlp< zm{5VYG*OEl!n#N2N875dU%%$KZfCFfjRBZeY=rvg!ja)&6%YgvL*22Z@{u|$j#i>R znS)Hr91Ib6`T)AhkL`5lpe-6m77MXY{3wB7bsikrMKTK6tcshZ)v34qfX%Kr7yI>1| zGF?nvNx4gCnrBw?YenENo^0F{k_Zd-@`|^JaO{lx7gD#_sp1?(u5X9X9KrC7?5+Mm zXoo>GTuP0|TA>V}Bs}9FgPdWaj>j5{mVAzYCYPBa9bGjlNC)FlWsPl(9Whd7-80Jl915_v4$neZeJVcQCWKT@K zEDy+dJrNh^o{M+5cbP_X9oLCeZtjYZfG8>M8eu?cWkx_0dEsgTIB(#xIAw)+%Snn+ zru`r5af9Qxd@e>aKW*kCrTb91%?LvbtM`K&nFhluf^%c2_Kh;bDbDvAhyQ0juFFQ5pV;vinO@n+g~NngDXJkNWVN$UNNnU{keH+bBdjqifOftNbvz}_ z81u~+l1=$`dJKtww{SElnRJenWkf+n<%exfD?R#R4rLGPmMZNvE2ZYTsv0(O^`F!~ z+p}Oiwppen>zBc*)m9d#Gd3jEopRV|%VX=biv^GRZqfqQIx~vJX{a85GwMx-{a6oB zls>=nVFp-IMf1x2@nk}a=_)s*%R%|J@RxA<+tCsg*8ssSZE#Ev8`K^nt`h#J;G?ax z^qCugk}7_4m`Q_(sn)&+4G&{^6Vg$pc)BOAeobh8s5vyP2A!8_f--X6((MI;*DZjXq+RY z_8CR3;=QjEjWPApOR>Pi#7rW(F~jN3vYwBknJU_OQ6%4ibHeEZ8dQd%ta%SG8?h^B zFl8jj_r)q#kLN3=V{;TUUBHrjJc^^=N-XAWaFs~&+gzQDzFzWrwYRske?U_-fBFU# zDVJAC8jXmerx>QIBm;$Z@tY?v{M-H@d?!;_6T})kw_|t$j)RJYuhN?7WkpvD=cdsQ zDbwbd2Qqw;v2?wv>x5k7mDVqBzE4^s8+K88HH@5Zp$fBjxN3!V68Hf z?;%YWAAG@qpL#h#absMJXMZnn;(%fiS*n9{M4*f)#jb@L-*T#W%d~U5XkXBZhmn5}tlI?r3 z1AVoG201&?o*)l5TE&6xuG4fBIkKeHrDtm1Nt7>^4J&eJqQd!)5Em;E=^tQQ@=k^c zo&`uM1t-Xk<(r%N0N6t?qchADHF?o0>+B#MERx+hEx1s37TJ%hTei)C@l9bcOhGb( zb{nzL_@7X?pH#>Yzj3-qrHXFJC0p+y>Ebk9O{QaS9mXv-@}x_f6tBZa@Q24inpy}J z4$Gdojiwwj!8>vEWdM`bAZ?7<&#V#AM%MCgSiO7OwZJW^CIZ5i%`<7Sm5Vzy7T<@i`Kq?XX;Q! zHNTnHua~*sQ(qmESxc=;s>fc<@*tLu)QDDHQ-`NL1g_jEII$-d4KvOH&QNFs*IQCh zwv4$*;^VtW1`n4ps)Y1J(ZG3^?f{H^7qCC?HY_Y{#=+?t9P{qP2!NjZ!B@Q9{IY(^ z<>MKL8)ZMsVqVB4EsW5da;vps=jESRf%1^7YU_)WhmO_iRB@?q`owtG*?@kRE|n;#t?-Q-GhMt`r~OaW|q|2nnJInek2?Kfoi_; zl~N~tOyjVjbet_Y@)J7Z+A>%7T!vsDWHJ@C(o6~z5k!-AQ zig-v?oMWG#37g*i<1mE;eoTuA56QB}HG1?JsPxML?Z?2Q;C=|aa*z$V#}uo!S4vEM zd_;I)yfFWkqfwBqCh<2M%c((#b~w&+^t}?K&6IcT-%N8L07-VFuI~45=_9}+Cnqmm z-CToG|BGdyeh%i9Bypq2X{$zW%sAp=ZRu|0Yga5!>YRSFyc>HPev@*=Efz<{z*G%| zsu>8ik`m)}@)!L+IVP0n@{GCOpd2X-Jvb)mb5aH+v05vWZA;L}eqjXXF;92>_q3&x z+}c!h2eaWA2Ojp>M&=+>UfqkoE)T&iuw}0i^Doz%RSdLwg&0A2KrdHi| z{=~RKoqu2cy9r5UuoO||9H@wJvy>PTDWfk_j=57XF6)7igUufvd=rI;j)D5Thq!@q z{Jh9*d#L8K!p?OhNXDD{q>m*D49c#?W)aClUj-;V!!!p&u_2GtF8(D_hfuCD9i50j zZjKmj#rvZKq?z>qas$^vF3;^1ZOS;EL`v3G3K8|)e?_Sj5J@?3JF*oxIZxtk8(1w7 z2?1T>fFvN}q4bB;FFW|1Su7E3Qs!@QpqnbxDB@7KKdYttri{}$cRBl!ao2+JL6iVK znwlp<{#{DmZGe@u_3Z9Uvfj=m<58ILCH6Oci08UM43sfA;2blbWix%bfX7i%oEba< zgb_#7*C)FaC)dYy*hw=J8aU?Qc^~G*x6)+je3MTddopgb5x11r_qH03ucTn0se0pl zUnrLGoPvS{)wPS8_bZ0~=a1j=+qXE47vB&?WE)A2(&KAeHkb|R*|}tTZ*wNSF^`E{ z45di6nWBUkjCY1au<~Y!2keH)Rif3%$YMw@qy>GeT`e>(6OHozY^J;OU`YGytvUmz z%}XnESzx|*s$nS_YX4wn8mYwUr+RmVc=9Fpj~Av!Z~B9!ezH=HJ09<@^slO}(IgX1 z4gir3I2`gMGLOqLzRq+>#(e7M|M)(Vak)kkU$bC(QrphSF3;x^`rBql8S`NW6bI2& zI1Q(IQtCn2M7Ee^%G-%dSt{WS1XqdpQ)r#I{K_6-K-HPis(p#q)i){!>WaugvJ}t2 zyAGQupCA{MxoyVN_>7jCN3_1fL+D;;yS7k}$x=tP2-6t( z_~C(Q4LcMxoj=7%xR^w{zXMd}o>?6fdf}vAdLG?JFgiD4{RSW((#I!g8V`uZ%N;YK zs~O*9?g?(eZ3sLh)gV^0N~(!LpRBY3vf0$)a)>#T;#S-=<&RI1=XYdyZo~QFceZR# zn%F5y0};8L!odEs5G0Qb#8@-O&Jn6Kh^fRt6~3`cUF6&8&&itB{*BUs|WwM-7NDF7?#>~TICwfV6uN1@8Zx=v2AZMApTE@H#5J6R6b z3QdUR6^1e2=`TmseKAOB^WDS~>RkFVPj!poch+YtVtyFd{*4k$+Io z&`@)8Dr736r0JN>p^BX}-b}GEEQ!JMatH&lgLFlF^)c#24#2Rst0hQv4XC|;IzM{G z%PvhlNwym1hMkoWTa6i$E7YTstg38Wh%DV1I&MBQ`FS)F?lrEzK^$dZoLi5vBsq;!_f`6P_slCO<)%s%lRH6#);=R~xae&d~c zyr&-Fa_i5eY~p(V?-Nqu65PSCmaNF04_qYb7){u0HfnsZs0@d1DSh+kluu^^t2#6^hUF0@ilXHW|LG7f+;kB<6+XM}L6x$we z0$+V=*j!WL(W^3Dy=pJxC)-rIYxJJ9n0w`N7vWnC?OYn(QoD^${;xm%-C~2$5I7p| zSbbB|r)kMm!VNum1N?h_OMU%>uRl4s_o3g0lnxs1gewh-9`JphHX_&=8$)+)`c-A+-@dp>-qK02>z)i=x(2S+~@$bOzY>#iY z0yqXQpqQh#`FjXQ2e{Q4`x8HjY5I5u>qg9Y1t%Ac<&dZ3l4GKO{Ubx5v} zK`xhZBC5-8KXuD`E}y<+dy7`cn-%_D)13N|bZ8A-U%h0Fe6OBW)gn~4r^h?lHap4= zVR!h`I`>BBa#rB@sfcT5W3fe|0Eh1ibR~{VX8JJm2)mFGTo-(2BCb})6fXC_NP%+_ zJ$BdChbyLoom;8j1=q%fOwI8&JGTdD<$&#NRtdV+?4(||R zPM+1lJLv6j1%WGe&xDB{xV_>VxBI1768(%A0ncz-fPCv2s(L6pV1bU#a;>@!>f6eh z*7c+u-1dT-`1=WGR@Oy8!0_FN!c)M>+=DM61wn^_7bk)1U5xDK_jN^_ZEs8SqWf(a z5#ZB86;RiA_K(7NZ}+szkg?6tbEF$vD%pqLD}e*)M?=TV18%d$^BDdRv<{b~(6$6A?m=q4X09Y-K9< ze$w(t1j+@Vq>Qu8+RD%%#eqRM|8_2%|M2A#5-FU+zJhCEZ((}{9RMUT;$HjV+fM_t ztm9`Z;xXI%x`M#X%7P6Iz(!(}ima}Cb~Jo%i?ave4-LRPP`+&F|6ctC3}9Axp@oYV zXWZb(6q1GmzSLosC3Yt2#DMc2?uH1{Zh2kP^OHG8#T*+3mcwv=WrGWhTNX#>iRAr3 zQEq-9*#^NQ#o2j?A%3}2x;F+Js*4s+m+mzfRA33k`}i?}kVjcKr+o7jt>wT2Zgn8q zMZ!={0RK7S2N(#T@);o>J_`3Y1KC+^{&j}f6S)928Cum&r7*Y}eb&9+Pc6f=W}CK$p)$fL~^WXu4FHJ=8|BVzb-rIRpV zk1z-^yBs{4@FrCB{uIwd!yn*F+q>U(Kp;c|*RBrnVWbM*^^9p1WkQU^-%Xh*xWLsJ z)WjfQxznG(zP`7)`~DzhXLFp0T~p2#1ir;<$)G2=DlC0s{=@yWE`(C!hP}JGO$nVj}Jf_jJh} zgovdGCjcPn>fbHJ2lV|IPI!zz`+oTnMA>+_K7FeHjy^FI2G;HYH_Z9sgE~Kd!Z5`a z?iqyp!4rG3|Mo!=VIzP1X4~5IY$F?0ZWxFw9qX7$m29C=vnY0q9jjLENQR(Qwkb}{ zD3(?lw4p#kD3Gv$1IPQ5$InEt$50e7dO?*!fO$jlC;-b7vB!{azU4TKKVeJ2uoj?4 zpEg=cd!v9lNs|FYx$p=FPsy}5JcoW_fD2wAUxsb`NUE|U(%=5w^nGbGu)!|^aCo+O zzO$|3s?lx84I|hF!h2`^3V-zTl69^uq5E`CRJqFn$ z0E(53)uQcpULC4g1i7lHI6Ht;j(?Km;CMhhaF13{w!DJ)BtWW)BOJu^_b<@@(oVsQ z&^f+f%fAy3XFLYZZfymW<>-eApQ#3e8OVc*g#iQ+Ulzx6cjO+~MbSSrY8Vv7Z{pZr zN4Cogo9`0y-Hcl2l>;Q<^WP7mU=6YEWW+cfS-dmc-FNTh{Q&obxZP&*>tx>x;P&!v z9;#iS`C{++abM*Hz%!7h4tH*<@2JABv0DcZTo+6jm^pHNjfTySjSnziq2dHGNQ zHggYaKYrQ45LWae)N_B7mZsQ>FWDnLFES@AmBy+wMFRn^5iAnC1qw}g&G8>Wfd@h( zlCv&nnlmSF!C7h-moDn|mU`0G7zS(e>jx1H`W|q1vhp%>W5Cfiyu+H<{pIoVLQ~+v zyN3VC0?GPya^QFw_mf@d`}ZpaufCB9)P+UuH6A2tyLWe{J3zO6)s$Y&FYh+8s_0^vc7{J zOeDjFYzE2Fh zRjbOj(7-xvT03CSR#N@xgEt)?dyGRQW610y#CstP2tqVAmzzyhjbH^wR3gMTrb!=e zO4z>YEdI%%oU7o{*>u_iPcOp!%viqS-Hq}71`tEco;tvo+UJw@i_mK&;5sVBg`9JD zVn2lTGIt=xgl?v^ddv`WR=`S6)q^%|V#x&pK3DAtylExw6{2yr*q7p3(h*BA1O1EK z+mh8nL_R?JBHmOBDBpLFPVi@Esb;40Xs*q?l0c`Q~0;o!6AZ&!T!d5$u`Yyq_2~KXLKp+Gl zCc&7)ATd2!$OeKF2J=AJ|HTdlJT3^loc`)Jre za{}Yr>D>fRx0k2w4{t}e=f?$xe#h^_#|xInm;1xc;SJ2E*UbrL$Db4AW=BUa$JYyt zzpJf{)9vL1D9aZJZ13=TdVYK}fylx0?fe{O{_uwU_I9DTJjLquF4?TV%E$HX{dKC& z>g3_*`f&Of>1|4}1I4*99V!5c!Aa$l3BZFTIzCl8EIyHzH00!(3~niIaoSR{#`c;t z;kCXuY#?KaU|ifep7i=o)3No~h{HPAeqNFs+*_ zY94x&;d?Kby9584k|0Po*@(o0gOh`k=JK{c@w{+MwmHy+XL6n@cV_)~c>6*3SCJSY6+yyQL$8-ux}`oNKK^ zYXI<#;km5ncg$rOaOAq>43^}owPLe!(q<_ORojR7`k;aD+L~Dde}^ClZS9I*%38kDfx>S*gMQ|aaUNR zX{yA{#VKo}tR~W_hZUPPOMY^&spvS>6`N*KXOq4`%z)Fp)P(!!I?nCsp8q@&n-XnG zeyj*oXA zd;E|z*wq7hH~6e68I&usTR+@3gv)kQ>iUJ-*){Y_ zwspV;cXwO55X0Uh7=*v48dy+uY}qOBr^&pxA(KBK?c){1o8;B!eV`@e#)^6>H1|1G zRyya}QOb427@rZX5fCdS=Gb=%kMJ$aI1Yh0=Oo5mmE35V93k>R65}oJ_<0ioeZjPj zs(`Ff*Zz6<U(x-mA<%gn;&BCg06>s#w~(3MKCOs1~Wb2!be zO|RE{_tm2;VHSp9Z`zPpfjT|I&fA2bi6wLdp-Dg^NL&>H)*td*eIsU)PjlA#nPEl@ zZkNmbYX9c)c)O~U0GYB(){cgT{4CMb`dE9HpxSCvs;9V0tU_&L42fwTBd-QV`a;@R zKbZ$(i2^wsHSs=D*@HT0igI#uo^A%vGy+u|0uzivaE{YQ7E%$fN3neN@sJ~d3l9dU z-vZWH@{0P-P;waYHAlp^AF0D}OL_dP(@}NtV+QxsP!{|%YiOWDJ7LA~7S}j0gW%o8 zjWWf>)FZmUvzanGzIXd3EsWYBdXHgHc8mr978;;?Us0p?WT8rUN)05C8<&U@gRJbcRN zgPO=##PtpYX|jw03&>?a*mm7#;~N$5(l5KzFYvdA=&>Fjz}KDt@7L}z9UpIe5Ijr` zL~Y%Y)2@29V`@Fy)V?<%!#p5y+7p7X^M`2@sr6sdC9{I+I=M>o?@L`$+{vf`yUgie1))Z)@wW4YP+&IYarzxQox zLmT0?eDq~b6`=C+b!@$cmqBGhcMe-I6a7lQ(`^Y^h-l+ zOukijiy=9PQ9L2H;KV&@K@m4AfVjHT4_VPp6S$e%5wGYIm7(Bk|C+!pqt<`X3QTOi zE47}pXDmm1N>&3E>8Z&<)De9KQs&lQEe#(_tre1VZUn^`R{%jEmPq9}lEkeA8ClNH zn&CGAJXl&|D9Sm&V1jpFL`^(_rAqUhzVEGzv*2~~flDRK1 zh}@^n-v@iha;QrwQgx<%28<98LJZKgd-K6^tm+QEZr7%h zjvA}#jOmJYt4TAZ2Q-VzPE&OE8~`40dI%xdIb73q`Qi?Q7YlfV;XA;2XS*Hk<{5m6MMcJ2_}L8WZ{jDJ(t{8uFjee9t>#|P zO3#{e%oRD&3 zM$A44U>q3WBgdy-0L*gQN!frAL)il=;vezp;5UU$F@KLwZ+RIamK>=q^@nG$q=~K~ zA~oC~n+1kgK6Uhj#DwhjU43y5VhrU}QQjp8sZ63G!^ z%0TBIuyMaX*ex+KX z_7f(B1xRDbk?y2vFi)3n$XYlyow2D_Lx08fHhD!(up;}lvgllRvaN+Eo5j%$uid&P zZ50Me>80K~GiufU4ONwcdpHiJNewhbhb^49ZtCHoi8cZ}o=G@f(7=fD@vZWWvrwLI z?GmYRQE$VqwxWy5jF8sTEbq(;8gp)J?$SD=LDv^~Lxkxj=E}-xIm3Pbh!SRK}j9SOU_h=}hv?vfExd_U2! zJRuxh2>bpQ4nqNp1#{i9Q)hEsl|NgA75$jCDH};4*PFx{p3yr#nm>xFV0K~gjC@QH zG9fMgr22U@$+FbXWVV5u+97%cdL*{R)&~FXOYkDi?RWe8Y3%pwFRbUU9*=jMTYur) zugAGhhnL^mtKlcFm++p>t|-2&-On36->oh4-1zRhsIK1ZsC#Eim)e=3sr7=>Fmbf4 zzJ0X5hwCOoueOv+HvJ!{8GYxNw@?Z%N9&0rN8aa&sblzyTEe+nvb3Mg2L2{7T7n^{^7i*}kTQ zui1T`{CPF5<*NgM+69q-t<9Dq=?0tjJUs8LdN!p)N+4`8+X*rczBcIC~PAnl?NPZEsG^X1S zueC=lOYmThp-;{xEA(lcMi;8}h`qVo`i3WcyzgaMsoOZA;>Rpl*44yM`t0n!fAAVF z?k?AETfbN_EHnA@&$$H55KD}18h>O$Hu+GU+??%o;e1M0_P)_+-~EZ2v>uPY#;J%3 zRiaD1TSmwZT$s49#ZvOhpej3Yh@DN%Wm=_sa%$fB^HTdhA(Mur(Ilhl%B)m(SQT|r zN@sT{HHCt$S32mVM&Hqp^-BG3$wU$_*>2dG6F$tA$gA|&cx3eciF^#};;%(BRI zrD0qn9oU_yRS2kTWVgtASDh9pwHUW*!Vu)Fx8hm?Xj-6O>nl_b_LPVkryaDJCTLW> z;6@j8z|Ompsa=gLt=H2LIRQr4uIUUW>LQ5@i8I(^odwNv zP=D83{f&Mfja(6DDTV>-A@f`&3@H{%Jcg=nq|>v{fN=f&BzV92H|>bC4l6z|k<01z zc0ebLCHUb~Rr8!6i6bI8c}AFQWo2b)&7J(}+1lPt{r=(?B!~PQ3Y9q*p7WF>Ir5{) ze7(IMWd(OVgME6~++a9T6hHs`6+D#D%1JQ>rK-{f_+vGL3v7D_2Yz<18agStyn+AC zZIRyTSO{4z(e(#?mam2)0Z-=o*7_p#uhj@SFf|9?lDD|`d9*P8ZiOu>L)y|4LZeUbC>T?zfb2S0hk%vtvJ zOG(*4zGCMo?~P@lu1i*i2{h3pvSc0|UV|NOfy>Op7TFu0!Z<(sdBKS;SCyh4Y|O%G zF^?%a#ghjWGfpK&*43Y)9t~H&{sHv5hxs9@_xxzY1wTD#^BrTJz)pTUb zI;jQ2RJCGC(%zQ8wFT_N)pNvs8SO?aeR~Df=9JA<99m(>qs7pIziY1&DPp~0Berzd zQi-oo1~n6kuuEp^aGoDt9)Glx9@wOf^J536BSWWsG?U{I$#%r!YugnORe7-0hul(T z%l5{k+huqYD}Ha((PDz8^0@H;FS!Cl)tX941iE11x}LLWc91gjc#7kXRQ z&e=%&^7(Jn9MG!E?+xqjg&%x|v-frTOX4N3vC%}!nwn55Q9{(K=BA&ic5e=mM+4sz z)W2B{ElP`v6x`{i@;dqfeih@+u`xM)@@j{y)R9T+&@rg8yB~j_@}H80$|G*gsHGt4 z#d9JRp*<|`Jm+3&%PyhkuTC%$$Swf!t{gHfXUEBL=C8}tQ!-WToow3s@!rO(eD|1a zj?04TxgFBT~BXw3?iQ^ICg8T{Wm=Jg3F7y zODSK^2G%X~R@@otSwE-lZ!4Bvq7-C|em#mQ;)_*7WQ(}TrZO|b!i|e4aptNhg$QCI zL3|^5Nk2(14Ra9RpGBIAtkYa;llQNT4gD$r32bq`vxzgF_iXaKr(-9o!4HRUQfH8} z<+JRMY_79q&azp~GQR&kD(xLPTzcuNR^E*2tCXc*G~JtAD|d!)Nu_w&n3XNcuxeH+ zXT-WzMz4ydRt6^nFwZtu`NJXf7dOG=5#a=cE5iMgLN(w`E3n{Uk3v!;FX37K33%%` zY$H1h0gmQ49;lJI>SQZ$;NswCD)g!IEs0=NBGxj&nbF;mX^ziTN_L5qUeRQCIiv2x zhD*hqq^Sqw8pJL%q_hThfOA+j#&jL2+>hxv-%;z)f@(b~Jd;o>86#f${2dKy_63Jt z+@I}Ga@%z_H}3Vng&2@kOsQ&|`)Y*_Hf-q|FiVc&)L8@pImGY>S;Mnr_&I{teW>GN zJRQY2V22T8GnmRbf-X6*l|utr*dpyPGTR&9L~YR4!_EfO8X4HxybnK{D%lgq4x7lV zb`6aP>WbUuNRtPNaOCt-8A+X@S}d?aD&GA+OJ?Imw6K4dppFkE*e+bUVj2#O-B&}y z`&}b-3Q{_=NIpiFLSt{Jh^0*#=iH{#&uoZt(LL?t0n?zobn%L91~-TTBIqDu)=x+5 zQ}EIwG#4>e?6xNd)#|(IDthcylV*A-`-{6W+wc-LrY0P9j9-0;o7n9SQWZ9I07 zOzd17rbP|!AoaT>uK$uEefoq>dBrp+kr4Cgui-j4D)zt;Ts6NVVW8`8D%~G%fR-U< z=L5U;V4#reyto5zOihkwe5&mAEd!{66=*FdDuKEyP{nH5qnv~rUA z@H7z2`0)t%`H^VB@0+i+WmxR{;^KIWjuCN{+>&g>bK z3T0=&rZDE=(i|R>bQCf{H+}jc>7hViuizhr1DNntFr;0s@I1=ZB&ngHUx}XO16Jy3 z9YOG_Yr}qrJ8F;&O*ZcVouXN}CCPWp0LfUNfGaE^opg|e%TUNtziw6H`?=|;0^G=Y zu95)CDc%&%+)o+4>;<55dT-3tPkX8q;i?SN@%%o~(99~2`SM3v(N3%V)T-K=|IT@5 zHb(zkSHHb6QYTs&cZ86-$Pt~$_! z6!*Ej8k2>76uHx_I`$+!5-;haWCDOm(oogZ+>%R$1GVT@&R}Zpls*DErOBps5+)Z@ z=!DU_2er9nLdmBpapuVvLlF5;>obXFQs>sX;O`t-r=?Ztu7?f(0zE^Z>ZY<|W0AEg zWpC?2tc8d_92zut-alzK*}Y=}!-hE_J#9g|3Wz*-AwD0*y{_1=g?b4W~2 zpN7k;{Rcy~fMdtAV+Es!Nh4a1;MO)}IGn+14?MYhI= zv!#}Le%%5li7==bB)s9IUu<=>5Tn7cT=AJ(2zRLwZ_ zEje<979AAW8>$1YX~+o7JKQum`~-U>IJ_jc-BKrENiHpq{^#y~|2%Ha?AOiR{^9g@ z7LINYSj5&|B!Y*xJpeJZ2mmm&y`L+3Hh!9(ZFyjrppU4KJ;RBn=+QM2;$9yi9M9=! zSXwckmqskUqO%9EI4`$qDT7C@O}DqaBkCKjkv;kd^Z5Lqa9#iXO4lM^6%u}7jLqd4 z_&k|hVOAnn>gg6S1U>vK@Km-R;prGoPF~D7saNqEsvtZK z+{+U+4>Q&zf*t=Q59YLpwfM8&Ct3f_j~=EJ_jQKyeZ~J{#DJp==7AL>gfC-Th}(Uo z5NiAGJWED@TYERyH)j0ldi~wR-nEfCd(PU2`|h@OZ<_|Y=?PPz&^F>Y+Rm-K@?;jI zHUnvM<6V5VTZ;ePaHH+9?DoZ%PKZB6$~Fih_QXD1)VsfYNX*pSX0^@0xD3Au$W`^S z2I#;nHIv_@Cz-_kVCiJjcRK*uc`c=_Khui%;n|>&j3LlIRLVot#l1#P&dnGR|2sGJ zfV+|N^*J&d+b8Vi_O@rty*+xcv%}K)P|D5~c|PZ$$^a@oBT`CFdp~y?IjCDrDdC~v z1iTtwL|LZ|R7zsg3_xY#URV%?N+-!xEk>4w8xYPIeJa(Ul6)K>F`c|igYYX2t5pea zaW3EMAS%m&A&kS|KW0Jr;;-a?8;|~kXEee=b5tKa#B>#HfP;zb1+bq zd9~^Bp30DX0uX3h0!K6)aZ-pvE3Cis-LK5`df?NZBo@A4#r+uy2L3Pg%m3Z{#0=J{-6QDBZ7T zOd{twJk$pORl#oZEg0wC^6BX2Mar(SHk;93lXmxj(+24t@o3RNCb|gfruN$Z3}f&=Oln&(j)ZNN{FOIpo7$M~M~>n~5{1Hoah8mXVEd37 z0YI;!BhAdeV@Blyu&;!BH%0{DmHmu*Yn??a|Foso!cLMzWh-|=^gG5o?BfU;&4dc7 z$$VprwCWN5!eK<&$$xZgOac>wUVX5vhBx`6Q++5n@77~zk0>z?))axpViVNw+KKmv@@iXihTj>@Z>=I zW+%~+d}^1Wf~0FhvMMlK;#(qLt5Ze%$yxU}sSTc+A~^(k63bfFZR*(hYDHE?Kj+c$ zW*V}Q%r~XcY_T56rH(;DD}-J=%@hstF5VaIQRs{K1o=w3X6ZG%^{;$O&rT);MWl(( zfcK^NeQObmMCC7)Wc+g<5~V)OtSV6P^Y$e_M!2NFiQ=jwfu!dNjK7sk4Kk!G36FBZ zeIeO+FwAhFFd{_hiY^5TR=JBsk{$g54Ge*JMp>r!SAYx_re8svZuc@3L|xn8mlL_v zED$Zd6vOH=W{ilP^)1c2DOy90_Tk-@$n2-H_pPSzMTZrGzUV*2y1w|{1IOW`BAm!H zj)kw*+u{1VKq1?s$yl)7Q3MU*ZBFRiXPHe{1ED4d;0)#kV?`|pZq`>RvERs zT#R>jLoq%v#x%Wpm_A1_`u3lDy*~J8y*lG*axT7XCuL48{!LSp={mxpwo2i*M%i6> z&zV+x35GAs#~+Q0<4sT?saEZ%1XJwBBlD)49h?4*)tlFf=$%{bz-%db@ic-W&)A$F zn%sm@2y2;oSmX<=X!-y`8){REgENQ1N)HC(gc&6IsY+WK$~FIyS*Bw>JK?*rxwZil z)_@lmzN%3#Y?v=RLA{!VNSL|SbY_8Eg2QU=XK!Km;4OnW`gEEg+Yj+iizGdST37s1e*o`Bdtd?-%;dw(Dg< z($H+bj8T!&dF{0@J00zXUC>L8e-=}swU@#+{|U}j8MX|uidBC@1azR>{C?>@>~KeiW(!LFnO%Pb*1lGC;1oqn#Cr;MWDv&@U;@X> znK@2X;Co63L_P93a_Cez?){k*`jD{lkFxu$vI{tKa}b3IKJ>aWI$`#t{?`=$ODqr{ zwy|`w;p>b`e^q{kOsD3q*DPbV_!fUl^CILalCvS5B0aVti z^ycR594s-Hh;eaoz zX>r1*gDW_=HP1~2%y9-YBNFo?WTPrqObg=lqr|`Dce%x2u%ef< z7xm=j;7f1wtqU_@MbY@D*-dRikx*ek8~tPNZ{6bQ#xU^n9sT>E+gIupRJHD!h{l{z zNGFH=&3%fk3E{M5BpjHOm|Zyfivz6h+yk(LZPT=8FAWz14AmFm6N0KJ}^r zF-?Va53d+iyd5C#WCB`&1dS0GFh?IAtRJ}!Gap1CX3IP?w!4p@9ToXjUY!-{6B%rM z?U))|I4l~6NfX-Gm~N&q>ufSW0`;?cpM`aVCVgh@4u~xIuj3l@DG)l$D|=XwoF9pi z53=aRnA$rX_|Sk?^{v?8|0c)~H|1@Y+%|taDQ>)JP$yIc!wSdMK{cQ!^o7Plmbs=D znjflt7b+nuh1*7%P?|P8-gy}~T6EIBiBZ4J!XfaMfh(z+jq_lQG4)l>pUn=c9@TC1 zRTI{^nn{PkzyTpt-cjr*gD^mly@SS&q;U_|yN#Y=XV5pkWOe?eC%5;SwR?#)Q{U`XL2s@2%@Xy!dOy)Fs%cU5SZE;B-Gsw*g z@^HOM)RSbyAyDT#ZUE*iw8X7MblOecq_fe#NOmQojA978o=5&QVdW~C79^T{1tTAp zR)0WisEsa3tJX|Ao$)N`E0?+?<~!#ej-$Xla_m;ATFF(dQ-9E?1Z$Z#?g+8xwQ0!X zU=k(5eidA8vJ49#M{sA!2IlgmYV(&Ju51m&xW$muya^9&ZyUu~3F)0dZ+HOZk79^n z$isj0RjzN--uH_i4!nCXrV1&0xK7@^6xT%O%kxxwY5Pw*duo3Ydsa8SIegjc0 zKy=hA$8PSP>$a|=!;abQ|C4e)IcaR;HRKcxxwqAFVBUCO8QQuLl0zCy7k_Or$27(w z=!S#v&Mk>QBXkTYas?b39#eTAl+OVtBPo7>DuA!U(LL|O>=p8JZ4fFZ{9jxO}TnyqX+H3a+g&3 z`-FU3YD%ox4}z44B%eg+4Qhl`ytkKoLMM{d#eJ$hlOvqcM98h?M234kz?$V*wSR|GBKp{c#nFN zb2BqjdTuNQPSzAIX^NguomF9`K+#Aiu2K^elc7v8MFSJa=`Zb1YQc$e?M2amj6Eru zeMkvgTq^-5Ib$r3-w;Frc}jrRb@gxNks#f=%Qy!#iU!I9#2|dcp1YneDCe7>K_5|SPsQ`K(c2S0`Tv55n^ zY#GvoW93|Ko*pQQ3V#J4D%99$&Z)g|wjpQDUbgRi<*KsRk~x_540kp~J+1~PZk4fa zDyiO}4a_{b&PxP)JR2sj-Z}^n z?rq)NE|hnELBhpctkYEQW|j|^AO-?3!=1MuejvpFkm({s#Q-oQ*v>5?d!oqSZNBr= zuAen5#^ts+Qd{d0immxHpXHe(scc;q3;5cl}at z>*+KHEZfTJa%t$t$i;d45yTLCE)5z|t?fL))v6ds&AahGKDBArdiW3>Y2wB8Jd&i8 zcP;|TCho+iuRG)+*{sD#!-&W5Cuk3qJfjS})GGiCL+l)2F&)5xFcrdl90<6RY9XD} z?vdr#zsI6n!BFp& z*`c1o?Q*9&<`(Y1=TI(UF7Jnbx#k|CyhLwyu|VM}CmH2$@>c1f2acGLQ<4zcon*}F z-d$cZUo*gOnFsf(qQFb*PY_A)sIGWY0rXaM8GH4Brl>zYf*&u!tKz+hBiEYUAM;%L z?;{iG5OxEc!548Q^av%~>emKz!M$*=UFzGYuYEMoxfBB$m_r;o4|R2XH1@T8Tf1O3 zSCn5M-I@Z>9&CwMWhfTp6C)C!<|})4i-uXL18S&6Ix<0kPq|R8CVWn;Yt{4M-KT1^T-$f+PQt9~UIw|wePc7U%>{gZ%Y;W#+=p8*1vR!wyf zj-+4pb`$>AOR*d&B7gUnZzdU^82SDa27;y77aR-HG`i~g*X)Wo#ijC@c&mE{G}yFU zeu@oA3?ZN$w1f<#-q=`zen+JHn-NczfUXzUBFYMbhH=Q-K@KSlsaEruKy(pTkYU*R zOA^9EV_6O4@v?&u6AN1+Gm?scP-%*mR-qEAy#rndV zoHgOBzjTO?4-l}|x}WMyE~OZ?ITIZ$E2XW|X?vVrnjN8dFhC+uTRDP(z8#rFa6Ot< z#b;J<5?v)cMOEirN?W}{?Vzx^71{j)f^N9xE~dOXrgT-dsn8h)Z7roXmDkKMWyxK* zDwZU3WIqsG7Hc{Mo?zrs?agiPX141n`^@Z4{-~XJhSU%6cj&@9i+PnGi4Xo?-vD6F!!a=&9(DHA1^Ao|S0)Trx`3FvqWvRXUvTTMPykI%*FQ z^lvZ8P1J3jy4|B3Daf~>5J&fDk|&p>K>0VP^;qqXCBRf>2>8ArAx|^H^h1CN{nkfj z6pX4VDwD+rFbwMM{TcD`=QcShZ05cuDlaQvmc}6gpH7-BC}8}OW>i%Hv+!>9Ys=xeM5O1_V`76 zs=y!60x}0t4~Ot8K6SfAlF$gs09w>k!f36fc@`B8{&fq_t3a{T;Vi4|#TokgxXCcT zW#V>e*3arZJ5_cGG3~mawhmUUW+J3Mh?k7yI+9Q+sX(rF3baFD3?!h$o&b9zc{4SU z!60Oa4Z7}4;zyyK8Tgl>6`+8i$jCpB>}L>R08%2k)VK8o9`?(ANEC zdP53Q!4sgaiLGETLF9?o2}Q@cpRFGfwo6{gv#7pa z;xXOV#QDmtP>U3iqf=pn4g^xc{NUr^&Wq!n`hzyMxg*4H>tU*TT~+g8m}pXDfNG(u zGr8cB0$zs|SVE6X*;B@F0g7LFxh`Abw7QG*SLh=)Ul*Uxr-539GxWpK)~EVdNSyPs zvuoktu&$0&%#Q;x>^7)Le^X?3=E6Gc>ZNZt(V(&qV%`*phcn-60t%= zg5)W-VTj_SK^7tFKfrquQ7H3TD1`XYr~XLJqWS`&#OZQQJ6D(<)oe8`rLVnu{jL^C zIH}I+iw2Tmq}+xRH#MQ>zvyiY+GH+?3VtJ)$5pr6uLyMu7y@?j%>0x$HKSxQDU9FD zMHLj41eZ`tcB`R$v)TbN)Mm`rrY$Ag%~+ghKl{q2cd9`m{%2Hp_Y;QzCNXZFYNSU*$JGzm_^)? zo~dST`WBFhK3w>GVe$F@PKssgOh=Sa|3j0`r>cacaSJKQdf&9{(Sr-Clix<@E;M+c z7_xlzk=g!3-C&~W;(#r8sn+?zfHTFqtcH4egceHSFb&HQ9%*G|72c1|)?eOeN$dN+ zYoop|D8it6+9@=}&fl5fZA-XRc%wQ^%{f6+RhjMnu~+t9*WAuXfd8vpCXs&FN`JdS)DXpf#lGG6mvRjZ^!^^fW>D)!-_m+v z*k((94WF!2X8W^@+7#f}d8_Z2Pdqpy#HVK34;3Y{tLq>#fg#R(j6dDp%69JGxDgbW zoJ|~Bm{q9=IZ(o`M{tTBZcigg?0^6R{x6zi&Gtwh(?c0Ki};Ah6mAaxxD3*)BKcHg zr`46!P{@&GbCs1>X0@{|ezh*~^J$tW>_|H}5J9gS+Yqt9)D_f#wE4O>VXV+Hp9;_J znFqQxmAPJsy8UHOm-<0^Biv7FL+e1dl6Eg8p^<{X61s^~bW;E|{OO{6G~9-~C+p4q z;KM)sw<Y#1a|=2Gr=BN(Lesa*Jmph2JP<7UaAw}i&Rh=FU53wROXFW>j?YTP*Z#8AV(|R z(gYZHJ|HSI%?V_KUGozfb;j?6|9l3$da^`0K^XhUA(;7#iP;_^%$gb2cv@oU2fxt@ zk+}Rq5yt+*F-}kb|KT{-DEyMV1Wz~7#wge%LmFg&9wNftSPSkCnh6`eEnNt{8*@&Rs8~eRH^KXUG%m-P;y(fgmU3n?nCetOX+7$zbVQl=7 zFVd^KZN}|z2#8K#3ywWhImr0BhyVc6&C7*f>M6RLn*&LZ)j!boMo|Ih2GS^r{6n*C zys_d+pu_qj9pNeB@GvJe%<_-=gBXPu|BAOI2B#Y#VU!jkA>Rkf0~pDg#T&^jW=ioX)$rE-46*g5k|9d1Yc2z{p?J=VG7G4l_08 zzSUoBo2h6^cfS<5#s~@(^|eo^(*g=MZgG3yn5BF=!Mjk57vz)5&%4SnG#OikcW{Z% z=edOnTR^+CQ!rKpkdv}BV{8}Ku&-Z7zV_3#kKv3=!n)6by+YgQtH89-c(3Vj)KPYA zR76w~wQW$E;ZV#5E zeAYYe-CnP5$ED)G6L<0|dD^y-=B((g=H9<#@nv^IB>Y9;@hIJDX~Z`+el`;uhqYoRC!popR5(JKo2PuK<=0Ono0ZBN=z87&m!?BVI~V8oa2g}t z_y`!YFutT1Em<}iH&{to#+N$&vv%CJ!l&rD^;{CV+DgrO8T*&+#x6*8r=77kX=W#5 zyUbPv&}~+BT>(plY8y<7mU{a=&8pbG%$B-C7j$ak-ATiC2Krbuyf4gJ)92l*BZdoS z{8Q)=DBr<^cT8ka^e^5&mdi{USQMGJ2{k61-t(VuPPOsx!jx(wuEc9^8m*Dnz&>*8 z%W?;b9WDFn+Ne=VQWK#Xq*rxYDPrvf2VFX(U?1z z3l+8tws3w~7}xG~a$cC1_H~zs8R9J?N9l8#*;U&7z(rSXslJevB6GY7o#eEYmaaP+ z6M9OoZgGtYFkG~@+gUAXPf1}56gtygXa);-$lxBUFRsvaH7|mb@557@oBrXHaxI-J zs+5dc*09}8zFif2e?5l!tUDd+R9b=iiqsrc`(jT1YEWF-j_05C+6ra)i95v>6Kf2p zao(A?`fC|0v*yQXgV$h6*zUXPn!=|Puxy4_@wsphB{Dy#r@L!DD4Ll$xT2Yvc{sbK z`ob>+=eH*DlKQS_lvqB-X=BsRQhDnT*ve4qseyb}QnrSUqWp)q)C&%OvtM38P~A}8 zYghe#N8!O#z*;BT;E`O(SM{lje+5SY6cGlS= zvZmItan28pV&ssMS`3xo;>Y^ror&wspS`?D9eJ>_l@RNG3m}ufxUx0@N?}1!lre7@ zV1j7`{bDDvZ5*3G@?puiimnpx4TL9QSO}hORg{OhrU^Sn0vNFC+|qvEsy@Be;Ogk1 zk>xBHt|JYe#~Oo=(C$as=c;ESXN4^7 z6tJuP-fd*B*PvlIxbC?K%YON<0kzOCTX{u#hxb4cl{Z5A=pQ-?0N0P_ncpx`$`xoC z)AER;MF3v=STjr7_{t}>>HGg4t_g<^Z)xKGc=X8>J}3U)` zQ?UcMtjF-{TkXE=>tPb1AAb5VH)FTQJ9KXDAGn>J1HYsjd+abbx25yZtlj*8W`rM{ zt@^0d9po`@1>}A8I|o@}!v25JuC1^(N_K@QcJXuqU#X%iSX$1!KyqdbUlpN?tdNqz zZ4KZi8upzKy;E>iKT{>a%n8O5U@kBQh~qnjXy8~#|H9D2M9k0SB@o+XmX|R~DLs7? zTMjMyPv;>@zeyy)6j2%)vcf(D$A^VE$IhA2rbp8rdW1*BFre+7DoD_Dn|b*7eMZBt z^J8~NSF`5D$fFiRCoyu~E#oUN!=VG|N+@Z%fdJ4Swk1}aA}7!Kr68|EXL_qb)XEqv z5PSx~1uYElZtCi(mWBQkHeYPcye#Mz`2 zdtQnqp~SOuIut92^EIX!qL*%t#CI%4K){kU;&UBf60(YXI;Vdv-RH6ID7Xgh+1B>v z_T}VPcIh=#im|zAZfv|`_ z*!zx=wGxUb%o!@`Er-B=a-FdF)&>b@7@{K@JB0v8bB!EDmAAf2=4bruwx+1DG^dK* zq%0p}+Yoay`eK%T_ze(D&Gc*hUzbKxE$D_+Te;MI7qb_SEG$=4K^oz2-Fgr zPk<1$4^_t7)tvezN1H<_oe9ZLg)U!$^GB`=ZKdtw2^EFqf2{$+){qF~_%ucw*RY6e zTk)6fSvJn+gD8L3>@+9+Oz0KF`!?xbONbagoL|CoOW-cLsIG1d2b7nGIp;x=37dI8 z#HguISF)gb>gp#5@kI3Iq`P8ebXZYmD4y*d_tHbjj108H*y3`eW}^=E$RxVipj2bd z`>nfS(tV%hxLO$}dlSLIP*NWbH*#f$uTr*bse`1USm9hox1v@P<4957;@v&ftC<1^ z(n2O#mzhs$&v=TCse+OcOG6O4Li{`smqofk(b|=tVx{SRv;2aPx^p@ejitGADZp}F z{2{;T5l*RWpHtB5o5ScL#nyU46(>~vYA<+lfFR9%^*qf3=S*BY3+Z)EqAY(JP!-y? z-?|V?vmyI6^*%>sUTa}+JDRbYpUGc2>*4+!z6WKAaBKHFZ3@F944I&QozhS|vyRbI z9a1!8o46oq`h|A!*t;&mVYHJtIXjB~^1p*0l;DQa$fy7O;08f6pA$5NAu8wl`_XCb zsH4@ZkX>b-GW?yX`(~Wx=7TLoHvZYUD`oN)VS8h3YZYfiq|7UN81@?J;&x_);T*pY zXpF#L#!+;0r)Nv@b9S<+YhO!%*r|s+HOr|nsU_{RCubylGK~dR(qL~S9CU;+6>1dM zp#wq9tOy}aal;39H&V(iG6W{G1~VA7-K-5N)w&%NsuXh>WciuNv*?<;%^x39OBsSe zDI`kp&JgH;w0b&{+K%#1@Do^AAf}Ij7dHS&63?4>tW*rtr!|I1cyy2vGy%;1R6d(V z^wv<7CtkaS|CsRDZDwyw&r4VN?dWK`Js}9t)ue<%`|nbS3w9sDc5ZTvmS?rwi@H_l zO0iYwEXj~QTMvH-{XW%#yl)1xY4Urrh^y3siYd12hkW zVzT`YmAhN603a8HEJP}ec+dejhA5#!e=Z??Y$6+G1^q>v5GtIivoi|$ zlFpE`bPc_dyuiW4Z5T$d&QhvW@v4dd3VTBEywjz!^u|A`Z$lw_5cHKC6ofK8NEpZ?J%_T>>O%jl&HmH$zUp{7R&%*B{zUEO8f;O z=c^vl?|ElH9fFuylztHLs0<(Wy1Wn7&mi@Vdo!K}s4R6>c6Fce&Sh-_t@H(R8V#cS zZs|)Z?j`v}%kLKq*F%P67rL*8ILExU1P$!;j!;~QE*rV@YO$y|+wdux8ppQX0fAY_ zm?%Ry7Nmkp{wrxD@qw*CK+@nsTAF|ppg4u z^N6e6L`jxDZ>iC;n4FkV=j>^Sg+qP8S=hmEUi!r9F!es=y3KiAJs;=7!?*Ucrj6js zeAZ~YCckUgyj35YZ+ppT#{s<>@@Z$>v4Z13bE{M|an|qI#I#|D*oXukj#!Su`gsA~ z%B?ZyB$xBfa``}k6^|f_C^!>z>1f>~eg!D%W{5LQN09rDK1S2jp<+HVw0Rf`f_#|i zRCSeph;79(t4ArIjaJ6@-&ZZw*@GZ0=%~M~i1A!^`cDayz@u_S#^=|oFJu3w-b&eN zNgy2# zL)+3J0Q}E`iUfyXD*X|~4w0^Iap%D6-xdAA9Kqw@`z`Pau6GZ6=!Rkm z|F^5G`ia=PcR-bElntS`1DK&-#3~u915``>&xO7$35Ud{cs})>AP9p#W88XDzxkyu zH6p0a3jtc%0|a0!H{5naAA)fFqe->fN;R;tMo7CN^D?nTFEr4cv{&RD0{kb*I?x*T zq3NpL*eivit}sHSMT*(*GS3)O78T;HU;` zxu|Mb^@cee)>=1ShXBjT^dBduUueMa_oH)iKEn+9m{}D52xnU0*yKtw{T&8&f)A!2 zl0j;|V*n4XUMNf9vq#*R91J^WXj=0#h5uEiU3yi~;^-J!X~TI^z|yFUd#fo!(Hzgw zwptON#)amM0NA{i0*r`hiIyZoD(#AhB_(WuH?t($)NUo;Mm(o|LWnw{&qNi@{b9(` znz?*nteTk&XPz`=fVdh=Xs)?@!iL{pNT|8Gv%V@GDE&!cw30wib8@xAu;?92J9CQ~ zHnROQTw!eH3eW^qh1a_}%F6@pf%5$&)zPGaCp+lT>|1ok-Z;8<1(OItRj?1qcXoIS zXzGP!PjCIRw7fBzD!pYM<;Vfu6ZGX27h%HEJ}DfHc~3a(#VO1u0Z?IH#K|Ki1?(B; z5CY;8`MaQ-5`DN54;-gn1twp8#YQA<(Oa!RIWI6+Azri-hQJwdK1lJd5o2cAuI#qt zZeZD=x3n%A?m()F9$Z@np%AFY;b`82U-LOYTo1l*&avR4F^knBP_7PS3qCj@pd2tW z`E9}5JtOH$&W1?s>m_rmiVRc#b?cvnO{Xjd%y^mDtenx&t({h5p05bE(Ns30OhxH> z)M#+BHuaiVII>CQGt~6daqAPKcMd1Y@v3YRI~ao$>a_`Dw5uPylGTzRydStwd{5p1`)`qg{lf5=EvNaAO?Wi7t?~$2+laMK+ z6apDtL_#LPx__B(P8=>j{lqktp3G5t1%c+o39B2ue?!6HV|hPRuD97%rgTWg^jUMU z%fzXR=I5OcBMT1r{aN#|32uJQ+a@WT`N%6t)+e5@*5@5fA3oP$gm)ehHLAS62jnVg zMqr9`-MI5BTa=CuulhV+7-kTw!Y!qr!C&D=d7yn_!O=hYDT{E&B#~CL1x@|q9N3G9 zZ(jI$Bhfc9c)SW{vp{!g%h^R3U_q_UmM9VE7@d*MPMbw0;fK`Df;emD$zhWeX6WAG zWv`bjd3s)#O{J=uzbwzv%-aE-ci5Klts{x*inKN{=&Z04Re;GkSu1(=Zmf013C03+ zG+2u&nMo>$jXW2D1ds>kiqIzUkOy>s6 ziudqqF8%`?Ciiq1HTEAh3n5g_7>x0WEsweI%5e#z47;3nKJtjD7-!f4g0WQq1b4g# z+~&uKc0@czXTuY>Og49A*$_dchXFPq#`>VR;+-%X%^RUv&JfV`8L+j47dH#S^mo za)>i~qEeHSTtR-(lX2Lvg-=T4~M&2LW1V>xzG%~p=62W zl*MMbh=)gwQGIjY-{Wqk4mY$c>slU%qV+ow8#$vq1acq$uzrlcR)1KQo5dLz=W$vV zMEEm-6PLu4TKo~TtW($1Jtv;$a_}*yS53oCh@E8PQgXSMCDcpyxu+d`f5n_@iUv*+ z-#U$&AD^?Yr_hoiMOu{FPbBp*&{pFgoWM|Y8tH&_nxB%H6-CLQIBn?hfg?@~h>UhH zq0WdyI!a)&?6bfPj%&g+v*^pqUC=yF(nJrZ??E^7XkDO}S9tbRPA!=pgS0OcBr1iy z=b$K!*R_Sv9HnPB0hN(_@#L6`kS^Z(j-F%45NQ+$^n%gmla#!bFCi(?moFpD&8nV2 zr4@m5^+_lEQ@;w{ckxou0e>iuO8{|U2{LZb7iS;wJe9+X-x9q6-d~CC+A`=V8*YlJ1I1sWS z_ewX{o0zSz@9_lIt@d%WasbZQ495Kl98r-^-dDcQHZ>a>DE$mu#` z^b-_2v0%}$Ud!mcDX$~(c28o}8SOOGhVN)^yRDMu!CD1jE|yRS31P&V7eC|%u@TX) zg3n|cxHn5}(06~bsCMg2C~9a*fhRdgUw7wr=iY0@gfV1@@zy`c9mB2om)~h{+y30l z=Gc9DNv~?p3D`Yi(JT?2=3il@M1`ua`$;m{~;Or>WBTO8!4Ob2c7V%#_PRBZUbR zQqL)!f!bhU@iwhPispIfUdP#ET1 zm#!L|iW{q=m%apUcAXSvz)$Zyc5FTT7c86?XQeJ_oHf55*O^Zh>T}iKMGh9DQJ9Lt z<@G}oMCtF_ytq!TlW3>aeAoY>XI zdu*;%-y~U6n6dVk<;`(HyjO$U%OO`@cmM5<*`_8`f{Du=AE8Z(etkQl8wg~m$y>v~ z%as!XD2N_uWgz~P)l(n`axq>{M|2|iVqc6I+4&lnuYt#*D{SZg^DEvhqT)&ak(9bC zT1lgNg-jcV{?WibOl*mW=+h?EYLTi>8>-l7biRZeM2ilmXBtEMFwSS-tWbEHYD(6e zRBH9w*mP;cxNDNGjMw*0gRFzk@5{S2E(4HOW7G$MlAIS^RhxaZu2=%;Xv}+3=Hf(QfJSQ$76haXP<;qzR^*xW zA&eN>MEQJ}T70a)$aU(rOUMy;`4k^iw}cH*43&_=u{Jg3U3^&$Guvg5R2Q`5kWXoj zC$$zA>>?C-Ie%gceY9#Ox!(|*8x|eqY+Cr0tlqT9Y3=+XB(8J9!$4GBuQ*asi-|#3 z|8+SK7PllWQb3VFut>HDS5b|0dX-0g)u|&7g@f$d9*W6+T34*#BQYB9n1cL01?J-A z9ysG`obf>yE5>V<`7+Fui?QZu`t^p%Sh_|#Wh~BYsX+X+vC{zZ)#ClIC~7(u6*BXR zJ|5GKy0l*Au@?YOn(hz->6|#n#v26j>z9 zaKHP93o2*$g`sTf*}V0ri^&~i*)00Q#DLMF z^IM73s0jJ!;Uro~GpeYo`>dR(YtAlX$H`77;WTRtTz>w|xDNkA4D5f$*&ZUzhrxR9 zqAVQZ#9If+QB>Y6fd+neSuw^?0P-&#@0v!>j(f;L?X6Gy=V^lP`)&4jGXIBhQj?UNp?iUvZ+!2>7J>BJ_;1|D8IqT^Ya5OQ%F8HAN#gq`bncf0PLXOxL$ntn{qK33 zF=1BdM@G!pmkIBkD^0yhYjLHn%H}GXlWt|m`b$=gY+Fo=>tz?58m*&cVQ9~;>qr<) z-IHcxm?L-LYX>cCp6rZ!Nsr7^)=IVeLKTSiv>jmtAxAfDj5A4oBthG8yHMQ`O!BLG zIG=qFYSQ<6RF}jXr-vN%K_iP~rgSzHmqoy#Pr>d_GInRUZ(FUVy}DtGqf?tfcS6L7aM zVKcudbP%k+&>wXvv|qW2d;gs}*o^?1Lfa|sNm5CVBsv5umlZr=G8R!IvFwrf&!Jl> zNUYsm7`X-<8xbTr?bDztb`pzYhSQ)sW6T8=u)6>ITnmN*IoMYWhIHXgbrt-3ldtNT z`=~2JOt_7jN)vm+S=rtN5v-J|auchd&{WIAEsDp@KOlgJy< z_|UpIGF{(7qnQD#a(|je*m*F4+d9gxVap7Tj4TkUvvS9Q7Ob(P`(QD)f=H^DMnUk= zUHdmy@MUj79?^9VO_qr_oHN_$ZCYuACtYD|cf z>0ck-#&U*SatQtik6Xe|z$l;M_#TbSng?eps}J{}X0vvoJ4<$C?9k)s&-V%*-ePw> zaCg;BIR0Iuhsml0(Xj{X)~9!S^+ltPOry*4t?KC>{TmOK2^i<{PT(Gk$;?CC`W^p! z)Gu@Bf4m7LWd_=gOfAUNu9@>$#{5tSNR_-+hk`m)>~f#G62IqGDkg!z+juZtYzY-A zVIN{v)`1UvX0brTZ~j2j>9~c{iy#$!q4^F>`^FXA-9v%TCB(2qQR>oRr|MV1%D}AB zQKzHYU0dX=%i{tbfC>+(>E3qt)KGY_vKcr9y0$w$4*PC2 z%&bcUIL7a6S0#TDK{lu;<22E>YoU4wG_NDU9uJ$q2Fct>qhuN_Ib`%{Nk`lSrWG;| z7*_QR>1evP71URL_UVgGz2Ub zt1G5^wm=0-IRzAf*fRjD_k9cU%InyZ>vyXhx0>()vD7y&2O(q;B9eD+hd398{ z8H^6uo;!KVcUgvJ#DP}?I{L}9R)clRTM^B%jRU?rj9m!LL}s{_D^+UT~OkbvGbEB~kB?LWZ%&0a!=jd?KW|5f1BS zFYy(dt(0T4nip1JE+=VBBF!(2PZ>*_k3~17>G@@loRohoWva@ndrAcFgJwRb(WB3q zCV#qOrRUdh*pE<*h#^Q_p$apmY^O-lJgdrxL}4`DfK4TNuP!9H8{5al6i6!s`I4OF z<5!!XD!x>L9+R;&D)FM+X_z@oV!bamyRKjuXiqj#SMAMp05cR9Q?b9YK&3^bm|6*i*AkWB;9q-G z#c>E$4xr9!!=cjzuVf5uZ&hJbczJFoekSC^Hn7mfKWSR1aFWac#7)6yNc+vjZALvN z@eoEthv1GB5^b4xT#pwI+fv*?MOZWkU5J@&MmP~;Q!j>EPia^oLiYeLrlE6K4X(s8E(PgleeV0byY!UwGiXts#Zt zflAC4mOS3cT?})>#5?Zoq!lJVCBmQqguwqFh78y}Wn&>kmuCOZL?xcYQZx(qs>1?_ zSm1;J1(tEsgVKnEJV2N1gllsV+B_|M0&SJ_KumUCYBb8^@PS%)Dyn6AaeVL08lWU3 z>HjN{(eSHKX#jh4>2RV2#A(r~7nABgBk5{ow!WuOz}#bC5stB;433Taf>l!tnnKQ#Cap@n`2Z;t7s_ z*po1`RzDD;zX?hxHwbmpOe%fn1b4$ohIPKb!a$#&@#dlq9&m+%wul`{PLSpJHgitk z_g%^C!HViwIM>AK5loFe^AG)xWWO~xICdvBp}A6*oy^Q|qm9NhxEbycX+r4-!(_SbTd zqVR;BR*NO)c>Ci26(23h0QL851b^$En~H?}d!0+lzyl{YQsVM0$Mi%Rp%?eq zy3kee=GCE3*PMQ<&oosfi9cF}Q^zM)+Le<2CscYhO=%=SoynqTr&>{=xnQBtSeBKA z1ue~t{joLy!fTRYQm}LuEL&<|emHK7S=uaukvcc9L^G3jujVQwXsk3Y`8yuW?KrW* zxX+hr8%*K-D=U=0A$~Bk=uZa*l<1aXO`>dYxalLparoUC3hpkvE1ICFHnyJ)Mg#@C z0iin^XW;`E0!9{3k>Z2%iwVL+$MkOs3y$Ck3h4hcSV9c;Q9y($DiK;LY&BR2O@q-% z&Q!vVJ!dc`6vFSzZF``i`iXq6Q-=Mq%Sz3_{})SrcRPQW?nx*|L;WiV<~a6@u-pUR z6+kG?FNodSys>Bh%0t_Fn`^^og3I$SHa}j!r#R+>1h8)-Gd*IB|KzP81`y7lwdaMb zldql1q4EYKQ1aeZ0z!|ncqnGuYwPj{)h1e88&tF6*5U!2XGAm2>4z;}em`Lt6qT>; zx_vfzHKt_vKYU?| z_3z<(xr)V<5(XlGB;@_X#aQcY<4E-*C;p8;;L)+g7KCBDk4;JMdWJv2LQm2PDaEQE}w20nYykTjV zT0=sQ;FdA76onEu3_UfK}&LJwIl%_->4k+a@ zLjOqU524OAzzp{-NxhNHCd#c#sk`Bt8YtM8Avl&DC2+xj;wRd*VQE+4*sjSaPz=sK z=wU1{<7^;~=We|NfF3$H{BT2^3}t`Ka^U!-)PeIag zSmyK5qTP=MdZ@dO6hAQ%|H~*|Bh$>ExBnUYX9!({%g zj+CJwt+3{?ifTb4o~FRo->YX~+`QI(6T;UxVtmb?ia*b}-1lutO!xE!j8GVXn$Le^ z-VMnQeXj*yPN~;9&`7(vc_`uTC}CR;V=foK@_k!cZ^Nj1Ng#NQ-k_OiXT&ZTN{W9v3#tG zIT*xwN$O1PHZb7JWIpVq57NS`qm` z=fqZTG!h>S)63)QzR6%G?ElmoDkVb`&;h^6Hb6nQXiAXT;@SZ#gvKtP zX>>k=1BoX6y_2TN^z z>uQ2EG3O{J3}g+;FFu@K&t1Ln`%2HL2)Tfz|xxsJxk`=F)D(lxcD zs>kOfn&%7a;SY}WRTeqQCW|;nkq%`95g5kSbJnSzr+c{mtQUbXp`ytQlINupCxM(-( zH-K8mOCE9pgR|jyW(&JsIr!;qw}M;76woCw!5#cHn|SVGihf{>GmvuAx%svCc~bSR zU$CmGKJX?{a)NzoENpx;(`*z3WST$Q+=i_QuTH7t3WFoP zYqX49#`J?)ksRu5)_s2J|YbsS)!3iv&!LUKGlbPm!rFs zHg0Gsx;O&-!>ln#4@8as&h9k-w8RnH`wrWoZ`R-dTr{j|buW5agv8vBO}?*BK-rO`(e-(|zgT{Loa=qzvDTreIwnA6U_H%!@AuN5X;oH&vXTelNzR zhSd;=fS_fFFsg@PSNQe2uPMOVBrF#ODFs&S=cbA>WU*k}Z)MUQquOztoAe!s2n)eT z?M&?~)a7>s0-Ja|>nIjdR+F3K(JE`_WIJKT=P+1$U=LLR=wO3@Jrhj)2KA(c>~=ee z;W{vIUk02(@9(q%oD46Q{`)nI5TDRp$DPop@cB`Y8OCqg=Gct7eJ)8)FU{q4Z;4(# zrgAmY9U++7lj7ofl$Ta6UQcNL?^J1WYuE7Ar|>|cqSctY@nMy9OH76&?2JO~S6QP@ z==*5SngYaYjKLiATI)TcFgX*%T{iu=(!sJ=B+*zWQo=6fHfEaVk(%j0S5n+~(1o2g z7Oi^5^$JQ=n4r;{R4^0_l~^gs`$}OuC|+E??tIAIVnhj0Yky$M@6VOt4#nCjoRn8q z8D&Dq5PYQ&?DRT*F%Qcyx=gl?hQ8}$dqwL@KVQU%Et}TeFK?t{lV^4IO*C4UhQ3|@ z*g>kuANu3pDYU__f|yT|r>{lE%;s@=d?*KI5EWawu$pw8ts`$ZlD>7ES0hkep8cz zn1e)a1KYjY$Nh2l!j)AOXtg0lbUy&s4M)Ym7+2}a*2^xXp#M(O1g>(TR;@kColR7+1SiSvq zsK_xfsGR&s`Ud~%(-_HJKm~juGp`);^T`$#2h|ywoeS1ulvs%w$76jHd3*&0;4+;4 z^}?3zNEkATug)!+lJD7h5Dem;2pnQ+5fVYWn+$4(TGNfUmIsrDN>Lu8O~@um1}cnu zpRP6dLF=SNBFrl$YBO_GBhHktQ&27}X|=cER?^OtOU}z%t0F&ZDf z(o6JiaxAXOd63`9<@xsEHp4r}*LfI?;#(E-$2BhNIHqyxhC*oZ8`BZJktfa7cGgY& zt(!gFB-xIq`Vx#ELLVvN>@RJJPwIZLj9KSSg{73|>?Od_!y$1t0F5Wyd`0LWW#GI4 z7#sEs^fwMO*sP|2WBiwcICyo#5IJTtIS1Lz)eUv5xZ@pSih-#(;+&u!dkSAx|2MlE z`&XGl>^`^ho;7hz{@)cs`hk>Tp9;piFytuna_r&Ga+R5(lsh3x#Htn!vW;cemsa9^ z|LaNi7xJ}0MI{E&=)`i7HUDae1X(i@H!0G1)cfnbqqUB;F_Oe#mFVpZ3EQd>xshb90SMiYI~~j0A|Cqj1q5EYWuqnXmH}bjm*8YHbZ%TbIBDkxe++Rk zXPOTgq=V_^(RG}rTe#JLUrWm%fQUH)j`MSKlKE!jagB5vg69zOaS*+9h~*GHWB*)% zfPp`dP$7`hvWuijfWpLNN58q2a?d&#XqFhC=_!PsFo7x}KKjs=Tw5TR>m?GTDtgpT zd`|Zcv7)mh_W}(Dxqb)5m<9vJxZ;&y#Ea6)r`$7F1`aC^On7F;rL=4+JL8wGH$*(b znAe>w8*|_xvSTjUZ{=zGLFxy_oD`|Be{h2nF$yPWt@i!!&iIDc!My{%Q}%g( zlPte*4YyUnpRfKH6^UQ&OxPnKDn#fCuTP3>d%;1VidKNiVxz(X0VbMZC3Vns1t=ag z6D9>;2v0YgdU2{3RD+thS$Oyd>Ao2!{R_HG1HmP6wBj0hj!ty%do+>m`&B-Xui@2p zkgwZ6v%PmNU^0&S0T-lO+hrby_SYy?7U(>Qp*IUfPyJS_nijPH%ZUWjYWLAqDfwBx-&`0?ieyX(y}=^+I&o+MN@4tQ(zjxoCxOGLv!EaV~q{FwlijsN%vZR2u=4E02 z>t^kryZ3Ioq({ehGDCj2t#!<)SKDa!F~F5J7W+l_8Oe_HZhceZQNNwFaCYOQ5~DiU z`Iruo4xEwg8~w%S{}X2V2yM9kiA zlOg6nvuA!F%=e6|{;_e`KQ|lZ4Wu3-IOx&Z+iJh2R?EC=m{Z6m#P-bI*WV@vQ{MG0 za-c;J-a4KDgwG&5a)@<(0X+|lp=UNs8+sN+E)(#6{P-~@-|)!Cmhr+fUY!93Z^3-P zsBf{CMlO&SZqu*`W^l%~j>W$X!)+NBvbTKH+=UE z|M>C4Y?z)uodP;Hd*-JJq|g8q8kjI+4w(V)+_1=W3NiDH5upZ~AkPq3-!dDf3n-Wh zT=|q^e>i{b5)TE)4PPg|j@!z7fe>qnneZRh1WtiW6alI+GtO;@85$u-Gq8@4ZBXb^ z=mj$dh6kO|Ytd$i@K}5{%nV@L6nY-C4YYu^Wt=ku1?!wb+ZfIbVEiozuVDb=nAp%V zUffQQH8Bvjkp&p!V@!RAA&b9#?E>o>+KW-x+=VXU2k_Kmqltz8HGzM< zd1E%rZGH+UwB0aI00ViW->v-%93y*;OvWJs z+YZDVaQc+EkTS$SZNNU7@P+G(EuSRVM!Ok`6e0ugcjpSlxU$s*N~=S z!HfOrFc7w3>+ttolE`#Nis(^goR9%jnntw!+nhoh1(IlpFrf2OY!RDFMotJG-0kw# zVfRpG-U&w3T}jB3+T9`nuzXo}Io-ntfKo6II42-=iOe3SYAn_Ena`C*LQ3LRV>(Gl z*Q{Ez>gueT(1IEyCG=!f^aKy8OnAApxr@!su!)+vne&Vr!@^@ZAy$suIzw#Y4-E>Z zgh9hW_}XlkK6T8VIbqE8dfVIMpvjg+rrV>?`+MzD!soT^a8Gi3=#b&|6nG5MZQ!D9 zmy+51|Hlw-jmiIg=(GGt|K5mVZeO)x9U;>7!hh8wbt?{47BP_&l|sSEsF_ zyRM)Gk;_)pT@e%&-IX-B!=CDzEE=j*ljV-Ff?ku>SL?M}uPxDQxzv}V<%-%V>Ace! zVjQPtuh}rK0{YF@7H7cw?C~idRG0PfV2a+B7*VBhH1$e;&@&L@-Oe&G&L-7`H=7iR zY&mB89?lzv+fF|d;`|*1_VEN@Rd<9<%0+h!ucE*X*2LGq=e$XxI)y$}PG5^zn=u#N zjyGWxcRSa65N&>L%V1I<8y+(XDcMq0Z@ z+G?sN=AJx-lX$Cy$4|1rHEsgeCU9{=yL{;;O?9QS*bhxx_TlI{QLJa6D0aH#ilSh1 zPEl2e-ipei$|k93xzC*)={_B{wqX<46 zm=s-???DX-ahA$G0W4qG2~_HeyT$Z2%^j_`kTz@!i4$lBv*E+#5{Hi@&4%}b06%h> zaj;(|Ga#_5Nel?=btL(7IP0^E!dcac{m(%gcAI5KS^7S!strZgB5gPfP`?#?ftP~3 z3#nT`%BOEl(q2qz({!MW4>d|IrczFUm1X~>?__0v_)yZw3m?I89y$GY%5rS4Ah4@4 zK-gC$Cuulm%XhCsc%{479FYFDbv)BeV~g4}+%VHnkXX*%Zuoe);L7F*Rh{3aN|bIv z=Hm(SEOL`WnM64XZ`$B2q zr^urhVD=V9>~`UeKl{k$zxKqR*ExShe@sp4kA~7Ft!P$-<&|=GX+2b8o0H z+%GuL5ps7Q;=l%|CIiFXtBJm^-(PWXpD4f{uvnlmmkPje+fU%bLv=+#2+ zL5m-xs5h?yLbiz#M!8FTkd6_^fdEC<{?K(Px#0_msj7N~gczFYy$Kl)iKXsi5WfF% z7gEPFeJt+g(=QUyJt#PO6Uy$tp~oj&O|^;6D`>WY+zU-ZUrgg3&HKeVH#PC1)^Sfk z$JP75wKw$VHO5Y};NX=c3=tj=tO>Mzr)p#<1!Xnwh{Fs4Dyj=<=n}ml!L6z`l54E} zqgr=7oEVhIH-pFIJC$A3bBq`QP81LpPSAh>%0!WbUQo@TVSdIAv93>i3dB&sW6f>B z^jNyifIKY~e+NZj&CgwA(ibZ{D+_F;_NuXMC zKD)YFz}Eu);RJm4%WnFY-%#n-DY$AaVDJ+dAm9eskRB7q0Sr>$91$Pe+J{$`0xYZZ z)CaZ=?LLAQ9H3v~G>fQgk{dI8E0LmkW9f_1C5YMB=u7t7++)e8PWxUe zMmjS=i z*A4H)qm*VitsLM=u*&5gbLxweOyv zR1+>?=ZB3YN2A_nBw1QnZQItiZ5>B`bW(4x;1F@Z-WPygLss!XO%}q6DHAfNrP43a zx-4NrZl^B*)9b6HU@Zk7FkPaQKhtkjeEd_-qU1J=qkbUPHMFZZ(h(S4KRO!mc?VSY z3r;#p5@)~&1><1*X$83~K`GnC!)>Q~ zPaAHvXx0e6#%z&O(oBA*B9{3~i6^cU4R&mE>t9q2p2mB?y;if+4k{X;5rTFw!*JQh z4uY7;M~k9;Z~55=Focd+N=~BPDYlajLVoR2WWhe9;mbhzWOvoW7h)o*$0CD{1#!^< zv>2f|!+!uC`|R5M)1{{20B<5c(k%)ie;;jINFYELnT%I-ULGoR=yR2`9cba4Z5l-!VCY9wM24I0fdjnW!3JgC%5;=_lm zO|q$m;6cGDZ(;Eu4Cy%@k!l8D)O$szJOZ=a_KRAUIpa~A3XZt6o{hBoYA5`OT6)EN zD8Es$@;=_;q&4-0(Cg%rOL&`o$k~<>CnT*j>4^5?M*XDO(}$3rbN{~8KIyzC%*z4?fcJ~t<0A<0~6Ky@QxqnQs2eIdSZ-MWy zQwO*n|2pA z32zIAy@aUXm%o5Qg{m=%zKukag{hoF(f7f}|CzSO6iy zbSEi&!iu4zL^4M%jj2pO%ZY0%dLT2K1hi7Mf;4PNs_0HLlv&z#cPM&(=h*&*tX84w zM2fAlW^yi*Y1U5{&^}kxgZV5nF;GEk0cUS z*S1L%Ki-u*HT~EsC=?(N?| zKA;|r*&(Y(6YrGHwfK}m%+j$jiijO-U@V@UV;jyy9O|PB;~37dLp&J&ngGXvcpN_o z;t0n+Bcsvc*_XgI3I>VTC=79Z37sa+VWL5@(*nM5u?k*(Amn-otn1_?PN3xg;esaS zqp8WIB`QTl1b&p7CccGAj|6g+JLDijrEf?9Doq82DD7U#q^9H|7kp{`z7Yv2_smeN zde0<9KR@5RT~@E=60%!DucNCZs#qOK5bDR67WddD0W7sMlFe0a2~PIV-{Z@yus+)K zcy)LIRTN*doN0GYWX_`Zitf!}m@UGVC-yIfT%S)P zucF+MsXdcgs+D^tF(qd`lf*j}&m>v7aJ}d6qg*iU&E$tYBflhN?Kxadzq?abU}XRS zwI&yy_GKT*-ir2OAix**J-VIXe8BMpARM@C4a4mQ1-^oP9&aqphc1=ri&?BsrppVH zt8nod)+XcT3)fPORNoKxC+~+VD~Og92lrT0uGMU<;fzc74;7Wm-yDqOWzOE9^h)#o z*!5ToSI~mUWg?{uF`>(w{5hAt`S-}20q=8=IdyOsH9Ub9H#r)n5O`~&<#ma&hWQSn z@q|?ii$;Cb?xtCMAw7dg`Vv}sc+p2wybkuWa?V>s0+n*n@-|OpQqeK{Vyb%9$47T} z%jzVFB(5{aDxVxkK+y5~xo!}hg?KM00{d!;Fr;D2k2ugKN*kYviLKL;Os;ohYq~zF zphB7$?#)y}&p^DLyAgA6z!yJg>%w!avIRFl{*LrYP9ORbH zTpwBt-6RwIb8`N9w=bcs5JYz5vwVpc;jI#V2ijv8A5VZ5gZ2rSU%^{I?bP$=c%j_q z3c3!kpe;~zDD6#0Z_?02%lB{|APoDCqiGDus8BH@7Pyp>+Z8x{IpB1%yNqP*W3yS@ zR|S#!OclUr<&vi;Njt49OD0u8NHnN+l61kus?8T%t{G}fkbJe?k@QiSY97}=Z_9PB ztOQ?#E^+vsKk}>9`pg5g;{H`&&4diCl-Qm(hxM7P1uLwR^y;m!2Q>TAOp&$sa$3}v z8>WTgep!XSF95Nsdp}{{BGDJ`^0W;fVYb^{--b^(^!g-Typ~Pg?5X!HHe=r+E7%2r z-&+u(yN-ff^=?bO+fwhg)VnS9Zp$W_X9oqvIxD7f7pHH(G+rF`&lR$>muF#;?p-+KLY}3_yUw`WaP5rKK zu?2>W$=2}%VR8oS$g+*=3vgXD23K$BCb$O04&(5C{P;1pzmbtg4DE%hy*fh-Zqaj`_b0&1q={Hn)zk`BHoFD$%~70i`y5sr~*&zA-$~+^uuM zfD&Zo&r*ByMkCnb?Y}V!%%jAA($G#Ry|mfDa~zv8F#QI1{$F96WsqMuO@FE{zmdCd z`@pnztEZGUlI+Fb$a|1=j^r!wYCz+Bws3u+Ax%+HkHR?Qc$a4Gn3>wh4yz z;&y_KiH3=Z4aC47W9nH98~)qZ4l=I6T#Ulz4!qP5F*T%J_^l?$o%ncz8Jap4aMW!3 zctfLkd-w|(fI7FXIoX|eP-mA7JMJ}1ouBsXAIF>9Q|IS!I)eGA(;eZCH{bO<=(caV z`rY@2?hmH-zUnTcn2h!BcMYAwKOUxF>ODq1@R8+E@TYC+y%Dlp@cU74J&XB>4!_Z> za*oNoF8FMTH6B^+qKE(c?}(wh?S}rz)_eM>*=l#XdP9Fp?Wy?t(k2G*hJPc=^Jm!9 z8~Pb?Kj0~5dha0k@fP41Iq}Org(>!?;e(5SWc6OFq4z_g)c-@Q=6?rA6NCI~0)M@E zqc`;9^AmsS$uBY-Iwp*7Xa{!<+l5;;nY-hi+4ao%XGGe!BjeZZ^rk(T+SlxMXwI(D ztn2D`K57SGIM<1Fhd=y5o&gFP`T&m!;)u*-tlwtqV2He!p9pO=m=zr^&!8G`f0tikCOS*8**X`j?Fqn@-ffg!s4QVPC zyu_Oh17RDs4u9VziA;5*h#qCe2^m19X++z<^(mM*kVHdF5S^bA!!~`%=o5kqyIsF^ z*gce)cbpMbR}%81a<@nTEML}LPWSKuq7=;o&Iw3eAhXA*8cVf(=5wWykdnC7m`)JV zHLKRFx;m>Sw4ee>aXncTJ;8%26J9QD?qYK@Y$9iF<~;L_VeYY<*hY@rI>T(@4K)f= zn}KFwa;-OXk6L<9pD^aQz3uIB&}7T7r`w~@`+MzB+n?9A<$IFbL(3j+Pm#-jZX*Y8 zJJg=d|9=c*Yi$4Dhfe$8z+Y3b4|xUzTwK|E47=y}jlQqwW76IFgq;B}8CNlcwpJ%G zp5a5ghPfVyh?1-Wl6ouSe{khUJj-h6f&a4j^$zfO!t`Eqsd4v|D8AEbmQ#GB11nN| z*j*x0!aru%UWWX`rfVhtc)E3T60@v zJMC7v((NM(gsr+)k%Y2b1%Lgnpna3T^Of)`0=F^LmsJ#UW(~DouJv-MUS7~!2EF2& z<=U7#3t7EaZH0|z7V*FP{=E^!+`cNsIzptYh5xEW>Q)@8EMg)kDuK9p)Z}sNu1;G< zcU^%2*kLQ`t_X^Z?n)ZmVNZEY77bOZ$#Tb7L9YqxtMyu~*OutDTxpl2Y)yPaiXoK30=Z#F3s z*<#H0J2|L7#vPAPFn{fhW~4j*xzp*G9lP6M|B$xR#?EXup*P0l2J}FH+(XDcMq0Z@ z+G?sN=AJx-lXxqI$4{cb)oudUCU9{=yL{;;O?9QS*bhxx_TlI%QLJa6D0aH#ilSh1 zPEu9y-jd3q$|fmqxzYPOm!LB)n` zYKyRzo=;19?(ND*&!hP|L}vu$Psq(^?0XQJ!m?_KSxd}XVm@t&xxZH;G2bEgiOIVk-41u(IsG^sKDx4<8B|dEp~i)+49?PFara6(F-J z1B88La*~E~wtV+Ggjc$I?E_NZwvK1IX>3uOh8t!YauUng+YKKt7hKsKp{n!SREg3p z$b3A(u3_KgQ05Y867|cs6p@3u8T8Qsa@9XRu?^4X$ufBoK`fCaMPQYri!k#|uqKPv zl#RF*Hj}^tKwt@&RG(<3Xho`cM3At&X9ZRGCV~L!W76eq@0JG3#3Tpr_ZiB zZS7U~V*tb)IAAn1r&Am=mpFHmJE67shDA$_LgxO|H_3LWPgd3^E9;Y$fBIx)*}hO( z_(}5U1)9Buh}|yS@n;X4{;xg$=XK6s(H~ur`lF$gNh_LFVR@z8-MHn%HAS;?4zRV` z(5ILPzt&W8CH`WadMB?w_+P81T0K2o^|YZr%Wgq3^@U^GR^M}#kK8OeF7ZtUcuc^I zPU34X!T?;E$FTri5>1GLohtr@IOR=?OXguq)_QqX=ez%WMc2BHW37VfI*w{}9M@p| z#ydClj?TvH=xnOFvsZ8eIu z$q^o(m+!R{3|?X^iICMSrowe@WLk3)&2pQEp+Qui1K#Awhe*H$h+Mps_~y-f`rI2T z4EGBTbcEd92NKu-)ns7Udo|Jb_4_Ly+$V~NiwqWM%%uV_9J##sLJDjZ=@+lC7J9YN zd(h$sDeBFufRJq>g;C!nK1jz1#6Wr+63JEbZ*?SW*9uiC4$H0C6 z<$sd39rT_k}j z$@%Q+Y5`vh_=gkl*)O~4Uw%WSU#H-zwSd7-AV9zkHh~`7mW3ElWF6TaF_jOmECpCr z=c$iO6U;sa0|xjPKh44`o8(4O{9)4Im&(ktxs^!Kys^|p=@P_jZ1g4jZSJvTRHuC} z6{8-g*hn4XSdZw>W4H`L3mQq~Okxu4bD&x9KlO7Q6|&zjSw{%}F{`3(L2-mYK%N0R zG?=Y?o;lHZH6uLC!wn!U)h5x9YdH;>UPNtc*S7Y9pDoH~ztl^qsz~AGD(ktzEU1UI zHfTcXyBO|K)Bu&EH|cw46x8^k{N-N{eWF|feFxR4o=)%{`!Eg z-&Mmq@hGJkPAdm^606y?V==V|SIHMz7BI#UIVLmpe74p#gqvV)Kck} zXkC^tA+}Q&fa&$sQm~eS511}d%Ae`CGCuyPYf$?(jH7LLg_R|V-S%6Zui|4;TKPif?a!`I7Nuex^y1poD-hwt#7%%X7ZyRnq z-Fw<_t3|Uy@HJ+OoRVhZI~lR;&(wDLm7>9pZEpRGs=?EE54hKAcG^Kj13bcD1~Uwo zeQaSMOgvf??R$&QKA<63d?`7JcBjNlJ_z}>Pq6`gpyA6v`DAz1!xwxasmDBnjsrX=4wc<^>SjLCSExE7@aWXpUxbdJPP8YDkvC{ z1L+cO3x>UfTM_If+-4xhhwYE%2`HQZ1R1{ZAA}6W)px`s#cJOEl3sBX@)XO+3pTS&+i=DzmU}` zRGmn%Rn|<-WwN|xX+Bq7af`*l`G|@j##U>Y|068;ZRppUH z!s^;KiQ>n*lBcF0TLpze1jRt@8%)M0fJ_UMib*dyfL7F*0gNsAKwE0`b!*Se+G;&o z>(K|)qcJ;V^=RUq)VUUqQXniH8>84ZgAI(uvvXp?jK`rqIuOTjjxF1T_}2tk7LalL zB#0v%d(0k<7SFx}u2C>Z#71F=>r3b~`5eX@Bs(qOa~G@N?u5^bSM9B0FDL|$vrx2;#OOe#1T;zf;t==~xA?cnO zik0t~r0D18o43pA)m#F*wdr+ql|&V*BMCzO7}Me&+a!Rcc1E(f%q_vm9_o91nHAPY zn;x$YFQAIzYnC(Z?x|eGUgg}m4HZ1yvQjZufJ~kiQbp!0davl-9ERBeCkT_kWou|oHz@EG?DM!|em-=mOkd1meKK8K zm{^6&pJ8n>ZoY6W)kyXIaDVcCxUzz1NpWzGHRW2()*8;ZbpKFMx%|z+NM7db4GOOm z?~h%NwQvOnV2AOPF3h+tZ~D)D>6?F#%o%b&2bog`cTvL=Fnp7vp>u(^HddP zICFhyFnp6t@XyKl_q%-wZG|ARBcA0;ya;cV=v!cpAwHe}1_Sd1&9C4VQ8V>CI$kLD zxdO*R2ACX0hr-@;^d=3Bw|o!t0Aa+lEJb5TM1_nQvB0H}+%CcC%K@j8-9;oTADhkM zzAA{+XQ}{3DVID&Ny=$uSu&{#LZCsplcWnKmTkV^a>Y<%g5<09j--#wRP(t0d0Vb~ zWhM9`bn(OQ{v)qitBzYFk!ph^=ybBhZ>%DGUH7qIs zl;L-AFv+0O0(b%QKMls)YZeqo`+_X1a?$ccXUU+@OYH>{Zs;##%>?)o1{L8cv1oe! un|4BC Date: Fri, 23 Sep 2022 11:20:02 -0400 Subject: [PATCH 177/185] fix: miner: init: only get sector-size once --- cmd/lotus-miner/init.go | 11 +++-------- documentation/en/cli-lotus-miner.md | 2 +- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/cmd/lotus-miner/init.go b/cmd/lotus-miner/init.go index ce69fad5b..ee458f686 100644 --- a/cmd/lotus-miner/init.go +++ b/cmd/lotus-miner/init.go @@ -541,7 +541,7 @@ func storageMinerInit(ctx context.Context, cctx *cli.Context, api v1api.FullNode addr = a } else { - a, err := createStorageMiner(ctx, api, peerid, gasPrice, cctx) + a, err := createStorageMiner(ctx, api, ssize, peerid, gasPrice, cctx) if err != nil { return xerrors.Errorf("creating miner failed: %w", err) } @@ -621,7 +621,7 @@ func configureStorageMiner(ctx context.Context, api v1api.FullNode, addr address return nil } -func createStorageMiner(ctx context.Context, api v1api.FullNode, peerid peer.ID, gasPrice types.BigInt, cctx *cli.Context) (address.Address, error) { +func createStorageMiner(ctx context.Context, api v1api.FullNode, ssize abi.SectorSize, peerid peer.ID, gasPrice types.BigInt, cctx *cli.Context) (address.Address, error) { var err error var owner address.Address if cctx.String("owner") != "" { @@ -633,11 +633,6 @@ func createStorageMiner(ctx context.Context, api v1api.FullNode, peerid peer.ID, return address.Undef, err } - ssize, err := units.RAMInBytes(cctx.String("sector-size")) - if err != nil { - return address.Undef, fmt.Errorf("failed to parse sector size: %w", err) - } - worker := owner if cctx.String("worker") != "" { worker, err = address.NewFromString(cctx.String("worker")) @@ -712,7 +707,7 @@ func createStorageMiner(ctx context.Context, api v1api.FullNode, peerid peer.ID, } // Note: the correct thing to do would be to call SealProofTypeFromSectorSize if actors version is v3 or later, but this still works - spt, err := miner.WindowPoStProofTypeFromSectorSize(abi.SectorSize(ssize)) + spt, err := miner.WindowPoStProofTypeFromSectorSize(ssize) if err != nil { return address.Undef, xerrors.Errorf("getting post proof type: %w", err) } diff --git a/documentation/en/cli-lotus-miner.md b/documentation/en/cli-lotus-miner.md index e8b568948..9f27d7327 100644 --- a/documentation/en/cli-lotus-miner.md +++ b/documentation/en/cli-lotus-miner.md @@ -71,7 +71,7 @@ OPTIONS: --create-worker-key create separate worker key (default: false) --worker value, -w value worker key to use (overrides --create-worker-key) --owner value, -o value owner key to use - --sector-size value specify sector size to use (default: "2KiB") + --sector-size value specify sector size to use --pre-sealed-sectors value specify set of presealed sectors for starting as a genesis miner (accepts multiple inputs) --pre-sealed-metadata value specify the metadata file for the presealed sectors --nosync don't check full-node sync status (default: false) From 27030aa1e8bba3949dc5ca7315e97ab20976cd45 Mon Sep 17 00:00:00 2001 From: Aayush Date: Fri, 23 Sep 2022 10:53:17 -0400 Subject: [PATCH 178/185] fix: miner: init miner's with 32GiB sectors by default --- cmd/lotus-miner/init.go | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/cmd/lotus-miner/init.go b/cmd/lotus-miner/init.go index ee458f686..f0f84eb67 100644 --- a/cmd/lotus-miner/init.go +++ b/cmd/lotus-miner/init.go @@ -90,7 +90,6 @@ var initCmd = &cli.Command{ &cli.StringFlag{ Name: "sector-size", Usage: "specify sector size to use", - Value: units.BytesSize(float64(abi.SectorSize(2048))), }, &cli.StringSliceFlag{ Name: "pre-sealed-sectors", @@ -129,11 +128,18 @@ var initCmd = &cli.Command{ Action: func(cctx *cli.Context) error { log.Info("Initializing lotus miner") - sectorSizeInt, err := units.RAMInBytes(cctx.String("sector-size")) + ssize, err := abi.RegisteredSealProof_StackedDrg32GiBV1.SectorSize() if err != nil { - return err + return xerrors.Errorf("failed to calculate default sector size: %w", err) + } + + if cctx.IsSet("sector-size") { + sectorSizeInt, err := units.RAMInBytes(cctx.String("sector-size")) + if err != nil { + return err + } + ssize = abi.SectorSize(sectorSizeInt) } - ssize := abi.SectorSize(sectorSizeInt) gasPrice, err := types.BigFromString(cctx.String("gas-premium")) if err != nil { From b4ec045bc0f5c4f6b6346c1d1b5a306766f128b8 Mon Sep 17 00:00:00 2001 From: Aayush Date: Thu, 22 Sep 2022 11:42:06 -0400 Subject: [PATCH 179/185] fix: build: set PropagationDelaySecs correctly --- build/params_calibnet.go | 9 ++++++--- build/params_mainnet.go | 4 ++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/build/params_calibnet.go b/build/params_calibnet.go index cdf8dc6e9..faedd3ea8 100644 --- a/build/params_calibnet.go +++ b/build/params_calibnet.go @@ -89,13 +89,16 @@ func init() { Devnet = true + // NOTE: DO NOT change this unless you REALLY know what you're doing. This is not consensus critical, however, + //set this value too high may impacts your block submission; set this value too low may cause you miss + //parent tipsets for blocking forming and mining. if len(os.Getenv("PROPAGATION_DELAY_SECS")) != 0 { - PropagationDelaySecs, err := strconv.ParseUint(os.Getenv("PROPAGATION_DELAY_SECS"), 10, 64) + pds, err := strconv.ParseUint(os.Getenv("PROPAGATION_DELAY_SECS"), 10, 64) if err != nil { - PropagationDelaySecs = uint64(10) log.Warnw("Error setting PROPAGATION_DELAY_SECS, %v, proceed with default value %s", err, PropagationDelaySecs) } else { + PropagationDelaySecs = pds log.Warnw(" !!WARNING!! propagation delay is set to be %s second, "+ "this value impacts your message republish interval and block forming - monitor with caution!!", PropagationDelaySecs) } @@ -107,7 +110,7 @@ func init() { const BlockDelaySecs = uint64(builtin2.EpochDurationSeconds) -const PropagationDelaySecs = uint64(10) +var PropagationDelaySecs = uint64(10) // BootstrapPeerThreshold is the minimum number peers we need to track for a sync worker to start const BootstrapPeerThreshold = 4 diff --git a/build/params_mainnet.go b/build/params_mainnet.go index 45ceb89bd..c3864ffd2 100644 --- a/build/params_mainnet.go +++ b/build/params_mainnet.go @@ -103,12 +103,12 @@ func init() { //set this value too high may impacts your block submission; set this value too low may cause you miss //parent tipsets for blocking forming and mining. if len(os.Getenv("PROPAGATION_DELAY_SECS")) != 0 { - PropagationDelaySecs, err := strconv.ParseUint(os.Getenv("PROPAGATION_DELAY_SECS"), 10, 64) + pds, err := strconv.ParseUint(os.Getenv("PROPAGATION_DELAY_SECS"), 10, 64) if err != nil { - PropagationDelaySecs = uint64(10) log.Warnw("Error setting PROPAGATION_DELAY_SECS, %v, proceed with default value %s", err, PropagationDelaySecs) } else { + PropagationDelaySecs = pds log.Warnw(" !!WARNING!! propagation delay is set to be %s second, "+ "this value impacts your message republish interval and block forming - monitor with caution!!", PropagationDelaySecs) } From f228bf484ee57b0e74f61321f7beec445d969230 Mon Sep 17 00:00:00 2001 From: Ian Davis Date: Wed, 21 Sep 2022 12:20:26 -0400 Subject: [PATCH 180/185] Don't publish new homebrew releases for RC builds --- .circleci/config.yml | 7 +++++-- .circleci/template.yml | 7 +++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 7fcd20677..66f30e7d5 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1129,12 +1129,15 @@ workflows: - /.*/ tags: only: - - /^v\d+\.\d+\.\d+(-rc\d+)?$/ + - /^v\d+\.\d+\.\d+$/ - build-macos: filters: branches: only: - /^release\/v\d+\.\d+\.\d+(-rc\d+)?$/ + tags: + only: + - /^v\d+\.\d+\.\d+-rc\d+$/ - build-appimage: filters: branches: @@ -1265,4 +1268,4 @@ workflows: only: - master jobs: - - publish-packer-snap \ No newline at end of file + - publish-packer-snap diff --git a/.circleci/template.yml b/.circleci/template.yml index 9843463df..6e7a44364 100644 --- a/.circleci/template.yml +++ b/.circleci/template.yml @@ -854,12 +854,15 @@ workflows: - /.*/ tags: only: - - /^v\d+\.\d+\.\d+(-rc\d+)?$/ + - /^v\d+\.\d+\.\d+$/ - build-macos: filters: branches: only: - /^release\/v\d+\.\d+\.\d+(-rc\d+)?$/ + tags: + only: + - /^v\d+\.\d+\.\d+-rc\d+$/ - build-appimage: filters: branches: @@ -990,4 +993,4 @@ workflows: only: - master jobs: - - publish-packer-snap \ No newline at end of file + - publish-packer-snap From bb8c3bad86c4d3f7e8a80cb5a88fd41853635afe Mon Sep 17 00:00:00 2001 From: Ian Davis Date: Tue, 27 Sep 2022 20:59:11 +0100 Subject: [PATCH 181/185] Use golang 1.18.1 to build appimage --- .circleci/config.yml | 6 ++++++ .circleci/template.yml | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 66f30e7d5..fdfcafe7c 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -424,6 +424,12 @@ jobs: - checkout - attach_workspace: at: "." + - run: + name: Update Go + command: | + curl -L https://golang.org/dl/go1.18.1.linux-amd64.tar.gz -o /tmp/go.tar.gz && \ + sudo tar -C /usr/local -xvf /tmp/go.tar.gz + - run: go version - run: name: install appimage-builder command: | diff --git a/.circleci/template.yml b/.circleci/template.yml index 6e7a44364..4fe4e4bd3 100644 --- a/.circleci/template.yml +++ b/.circleci/template.yml @@ -424,6 +424,12 @@ jobs: - checkout - attach_workspace: at: "." + - run: + name: Update Go + command: | + curl -L https://golang.org/dl/go1.18.1.linux-amd64.tar.gz -o /tmp/go.tar.gz && \ + sudo tar -C /usr/local -xvf /tmp/go.tar.gz + - run: go version - run: name: install appimage-builder command: | From 310f20e81badfff12bd0287733109d157dfa24e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 29 Sep 2022 15:08:09 +0000 Subject: [PATCH 182/185] v1.17.2-rc2 --- build/openrpc/full.json.gz | Bin 28425 -> 28425 bytes build/openrpc/gateway.json.gz | Bin 5079 -> 5079 bytes build/openrpc/miner.json.gz | Bin 16025 -> 16025 bytes build/openrpc/worker.json.gz | Bin 5260 -> 5260 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 +- 8 files changed, 4 insertions(+), 4 deletions(-) diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 5ba5c948256e8f7c3469cffb5749e43332b4aaf3..4ab58f84d2bf4c7dd535bb661aa09aaee3da7ac6 100644 GIT binary patch delta 23 fcmeCY$Jlv~aY8R6`^LWFJdTZT))!7`Wn};WeEtdf delta 23 fcmeCY$Jlv~aY8R6+s3})JdVf*$;+m+vN8Ywc^wIT diff --git a/build/openrpc/gateway.json.gz b/build/openrpc/gateway.json.gz index 953cd71f6b51a62da16ba4acd8ffb8a710af5811..4c5fadbebbb9bcbaf8b0af025d39bd9c14124729 100644 GIT binary patch delta 21 dcmcbveqDV+6XWfT%|5~$ma%V~CVgdK003y`2+;rl delta 21 dcmcbveqDV+6XWTP%|5~$*Jk~$pY)Z10RV6%3FiO+ diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index 292409bb6e65f5d9d4ff50882275b11a18fc453c..0c0e13c9adc063e3cbefcd8dee1781f40b661ed8 100644 GIT binary patch delta 21 ccmbPPJF|8|7h~_nZZx+Af|# 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 diff --git a/build/version.go b/build/version.go index 578358b43..f262ab849 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.17.2-rc1" +const BuildVersion = "1.17.2-rc2" 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 9f27d7327..316cf96c5 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.17.2-rc1 + 1.17.2-rc2 COMMANDS: init Initialize a lotus miner repo diff --git a/documentation/en/cli-lotus-worker.md b/documentation/en/cli-lotus-worker.md index 77dde5a36..ebc865dac 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.17.2-rc1 + 1.17.2-rc2 COMMANDS: run Start lotus worker diff --git a/documentation/en/cli-lotus.md b/documentation/en/cli-lotus.md index 0d511e656..e0aecbf90 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.17.2-rc1 + 1.17.2-rc2 COMMANDS: daemon Start a lotus daemon process From 258001c6aaa57f3ea6c68870e107c20bd6044196 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 29 Sep 2022 15:16:57 +0000 Subject: [PATCH 183/185] changelog: Add v1.17.2-rc2 entry --- CHANGELOG.md | 109 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1e84bb02b..5e21f3ddd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,114 @@ # Lotus changelog +# v1.17.2-rc2 / 2022-09-29 + +This is the second release candidate of the upcoming OPTIONAL release Lotus v1.17.2 + +## New features +- feat: sealing: Partially sealed sector import ([filecoin-project/lotus#9210](https://github.com/filecoin-project/lotus/pull/9210)) + - feat: sealing: Use bitfields to manage sector numbers ([filecoin-project/lotus#9183](https://github.com/filecoin-project/lotus/pull/9183)) +- feat: env: propagation delay ([filecoin-project/lotus#9290](https://github.com/filecoin-project/lotus/pull/9290)) +- feat: cli: lotus info cmd ([filecoin-project/lotus#9233](https://github.com/filecoin-project/lotus/pull/9233)) +- feat: proving: Introduce manual sector fault recovery (#9144) ([filecoin-project/lotus#9144](https://github.com/filecoin-project/lotus/pull/9144)) +- feat: cli: print beneficiary info in state miner-info ([filecoin-project/lotus#9308](https://github.com/filecoin-project/lotus/pull/9308)) +- feat: api/cli: change beneficiary propose and confirm for actors and multisigs. ([filecoin-project/lotus#9307](https://github.com/filecoin-project/lotus/pull/9307)) +- feat: api/cli: beneficiary withdraw api and cli ([filecoin-project/lotus#9296](https://github.com/filecoin-project/lotus/pull/9296)) +- feat: network: add nv17 and integrate the corresponding go state type ([filecoin-project/lotus#9267](https://github.com/filecoin-project/lotus/pull/9267)) +- feat: api: Reintroduce StateActorManifestCID ([filecoin-project/lotus#9201](https://github.com/filecoin-project/lotus/pull/9201)) +- feat: message: Add retries to mpool push message from lotus miner ([filecoin-project/lotus#9177](https://github.com/filecoin-project/lotus/pull/9177)) +- feat: message: Add uuid to mpool message sent to chain node from miner ([filecoin-project/lotus#9174](https://github.com/filecoin-project/lotus/pull/9174)) + +## Enhancements +- feat: sectors renew --only-cc ([filecoin-project/lotus#9184](https://github.com/filecoin-project/lotus/pull/9184)) +- feat: miner: display updated & update-cache for storage list ([filecoin-project/lotus#9323](https://github.com/filecoin-project/lotus/pull/9323)) +- feat: add descriptive errors to markets event handler ([filecoin-project/lotus#9326](https://github.com/filecoin-project/lotus/pull/9326)) +- feat: cli: Add option to terminate sectors from worker address ([filecoin-project/lotus#9291](https://github.com/filecoin-project/lotus/pull/9291)) +- fix: sealing: Make DataCid resource env vars make more sense ([filecoin-project/lotus#9231](https://github.com/filecoin-project/lotus/pull/9231)) +- fix: cli: actor-cids cli command now defaults to current network ([filecoin-project/lotus#9321](https://github.com/filecoin-project/lotus/pull/9321)) +- fix: worker: Close all storage paths on worker shutdown ([filecoin-project/lotus#9153](https://github.com/filecoin-project/lotus/pull/9153)) +- fix: ux: Output bytes in `lotus client commP` cmd ([filecoin-project/lotus#9189](https://github.com/filecoin-project/lotus/pull/9189)) +- fix: ux: exclude negative available balance from spendable amount ([filecoin-project/lotus#9182](https://github.com/filecoin-project/lotus/pull/9182)) +- fix: sealing: Add information on what worker a job was assigned to in logs ([filecoin-project/lotus#9151](https://github.com/filecoin-project/lotus/pull/9151)) +- refactor: sealing pipeline: Remove useless storage adapter code ([filecoin-project/lotus#9142](https://github.com/filecoin-project/lotus/pull/9142) + +## Bug fixes +- fix: ffiwrapper: Close readers in AddPiece ([filecoin-project/lotus#9328](https://github.com/filecoin-project/lotus/pull/9328)) +- fix: sealing: Drop unused PreCommitInfo from pipeline.SectorInfo ([filecoin-project/lotus#9325](https://github.com/filecoin-project/lotus/pull/9325)) +- fix: cli: fix panic in `lotus-miner actor control list` ([filecoin-project/lotus#9241](https://github.com/filecoin-project/lotus/pull/9241)) +- fix: sealing: Abort upgrades in sectors with no deals ([filecoin-project/lotus#9310](https://github.com/filecoin-project/lotus/pull/9310)) +- fix: cli: Option to specify --from msg sender ([filecoin-project/lotus#9237](https://github.com/filecoin-project/lotus/pull/9237)) +- fix: ux: better ledger rejection error ([filecoin-project/lotus#9242](https://github.com/filecoin-project/lotus/pull/9242)) +- fix: ux: msg receipt for actor withdrawal ([filecoin-project/lotus#9155](https://github.com/filecoin-project/lotus/pull/9155)) +- fix: sealing: Avoid panicking in handleUpdateActivating on startup ([filecoin-project/lotus#9331](https://github.com/filecoin-project/lotus/pull/9331)) +- fix: api: DataCid - ensure reader is closed ([filecoin-project/lotus#9230](https://github.com/filecoin-project/lotus/pull/9230)) +- fix: verifreg: serialize RmDcProposalID as int, not tuple ([filecoin-project/lotus#9206](https://github.com/filecoin-project/lotus/pull/9206)) +- fix: api: Ignore uuid check for messages with uuid not set ([filecoin-project/lotus#9303](https://github.com/filecoin-project/lotus/pull/9303)) +- fix: cgroupV1: memory.memsw.usage_in_bytes: no such file or directory ([filecoin-project/lotus#9202](https://github.com/filecoin-project/lotus/pull/9202)) +- fix: miner: init miner's with 32GiB sectors by default ([filecoin-project/lotus#9364](https://github.com/filecoin-project/lotus/pull/9364)) +- fix: build: set PropagationDelaySecs correctly ([filecoin-project/lotus#9358](https://github.com/filecoin-project/lotus/pull/9358)) + +## Dependency updates +- github.com/filecoin-project/go-fil-markets (v1.23.1 -> v1.24.0) +- github.com/filecoin-project/go-jsonrpc (v0.1.5 -> v0.1.7) +- github.com/filecoin-project/go-state-types (v0.1.10 -> v0.1.12-beta) +- github.com/filecoin-project/go-commp-utils/nonffi (null -> v0.0.0-20220905160352-62059082a837) +- deps: go-libp2p-pubsub v0.8.0 ([filecoin-project/lotus#9229](https://github.com/filecoin-project/lotus/pull/9229)) +- deps: libp2p v0.22 ([filecoin-project/lotus#9216](https://github.com/filecoin-project/lotus/pull/9216)) +- deps: Use latest cbor-gen ([filecoin-project/lotus#9335](https://github.com/filecoin-project/lotus/pull/9335)) +- chore: update bitswap and some libp2p packages ([filecoin-project/lotus#9279](https://github.com/filecoin-project/lotus/pull/9279)) + +## Others +- chore: merge releases into master after v1.17.1 release ([filecoin-project/lotus#9283](https://github.com/filecoin-project/lotus/pull/9283)) +- chore: docs: Fix dead links to docs.filecoin.io ([filecoin-project/lotus#9304](https://github.com/filecoin-project/lotus/pull/9304)) +- chore: deps: update FFI ([filecoin-project/lotus#9330](https://github.com/filecoin-project/lotus/pull/9330)) +- chore: seed: add cmd for adding signers to rkh to genesis ([filecoin-project/lotus#9198](https://github.com/filecoin-project/lotus/pull/9198)) +- chore: fix typo in comment ([filecoin-project/lotus#9161](https://github.com/filecoin-project/lotus/pull/9161)) +- chore: cli: cleanup and standardize cli ([filecoin-project/lotus#9317](https://github.com/filecoin-project/lotus/pull/9317)) +- chore: versioning: Bump version to v1.17.2-dev ([filecoin-project/lotus#9147](https://github.com/filecoin-project/lotus/pull/9147)) +- chore: release: v1.17.2-rc1 ([filecoin-project/lotus#9339](https://github.com/filecoin-project/lotus/pull/9339)) +- feat: shed: add a --max-size flag to vlog2car ([filecoin-project/lotus#9212](https://github.com/filecoin-project/lotus/pull/9212)) +- fix: docsgen: revert rename of API Name to Num ([filecoin-project/lotus#9315](https://github.com/filecoin-project/lotus/pull/9315)) +- fix: ffi: Revert accidental filecoin-ffi downgrade from #9144 ([filecoin-project/lotus#9277](https://github.com/filecoin-project/lotus/pull/9277)) +- fix: miner: Call SyncBasefeeCheck from `lotus info` ([filecoin-project/lotus#9281](https://github.com/filecoin-project/lotus/pull/9281)) +- fix: mock sealer: grab lock in ReadPiece ([filecoin-project/lotus#9207](https://github.com/filecoin-project/lotus/pull/9207)) +- refactor: use `os.ReadDir` for lightweight directory reading ([filecoin-project/lotus#9282](https://github.com/filecoin-project/lotus/pull/9282)) +- tests: cli: Don't panic with no providers in client retrieve ([filecoin-project/lotus#9232](https://github.com/filecoin-project/lotus/pull/9232)) +- build: artifacts: butterfly ([filecoin-project/lotus#9027](https://github.com/filecoin-project/lotus/pull/9027)) +- build: Use lotus snap (and fix typo) for packer builds ([filecoin-project/lotus#9152](https://github.com/filecoin-project/lotus/pull/9152)) +- build: Update xcode version for macos builds ([filecoin-project/lotus#9170](https://github.com/filecoin-project/lotus/pull/9170)) +- ci: build: Snap daemon autorun disable ([filecoin-project/lotus#9167](https://github.com/filecoin-project/lotus/pull/9167)) +- ci: Use golang 1.18.1 to build appimage ([filecoin-project/lotus#9389](https://github.com/filecoin-project/lotus/pull/9389)) +- ci: Don't publish new homebrew releases for RC builds ([filecoin-project/lotus#9350](https://github.com/filecoin-project/lotus/pull/9350)) +- Merge branch 'deps/go-libp2p-v0.21' + +Contributors + +| Contributor | Commits | Lines ± | Files Changed | +|-------------|---------|---------|---------------| +| Aayush Rajasekaran | 8 | +23010/-2122 | 109 | +| Aayush | 15 | +6168/-2679 | 360 | +| Łukasz Magiera | 69 | +6462/-2137 | 606 | +| Geoff Stuart | 19 | +3080/-1177 | 342 | +| Marco Munizaga | 16 | +543/-424 | 41 | +| Shrenuj Bansal | 30 | +485/-419 | 88 | +| LexLuthr | 3 | +498/-12 | 19 | +| Phi | 15 | +330/-70 | 17 | +| Jennifer Wang | 7 | +132/-12 | 11 | +| TippyFlitsUK | 1 | +43/-45 | 12 | +| Steven Allen | 1 | +18/-28 | 2 | +| Frrist | 1 | +19/-11 | 2 | +| Eng Zer Jun | 1 | +14/-11 | 6 | +| Dirk McCormick | 2 | +23/-1 | 3 | +| Ian Davis | 3 | +7/-9 | 3 | +| Masih H. Derkani | 1 | +11/-0 | 1 | +| Anton Evangelatov | 1 | +11/-0 | 1 | +| Yu | 2 | +4/-4 | 5 | +| Hannah Howard | 1 | +4/-4 | 1 | +| Phi-rjan | 1 | +1/-2 | 1 | +| Jiaying Wang | 1 | +3/-0 | 1 | +| nujz | 1 | +1/-1 | 1 | +| Rob Quist | 1 | +1/-1 | 1 | + # v1.17.1 / 2022-09-06 This is an optional release of Lotus. This release introduces the [Splitstore v2 - beta](https://github.com/filecoin-project/lotus/blob/master/blockstore/splitstore/README.md)(beta). Splitstore aims to reduce the node performance impact that's caused by the Filecoin's very large, and continuously growing datastore. Splitstore v2 introduces the coldstore auto prune/GC feature & some improvements for the hotstore. We welcome all lotus users to join the early testers and try the new Splitstore out, you can leave any feedback or report issues in [this discussion](https://github.com/filecoin-project/lotus/discussions/9179) or create an issue. As always, multiple small bug fixes, new features & improvements are also included in this release. From 396f5d610e17e664c8c1a484a30a6065886f163b Mon Sep 17 00:00:00 2001 From: Phi Date: Fri, 30 Sep 2022 10:39:41 +0200 Subject: [PATCH 184/185] fix: renew --only-cc with sectorfile Add the ability to extend/renew only CC-sectors with the `--only-cc` when using a sector-file. --- cmd/lotus-miner/sectors.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cmd/lotus-miner/sectors.go b/cmd/lotus-miner/sectors.go index bcd60acf2..44bce55bc 100644 --- a/cmd/lotus-miner/sectors.go +++ b/cmd/lotus-miner/sectors.go @@ -918,6 +918,9 @@ var sectorsRenewCmd = &cli.Command{ } si, found := activeSectorsInfo[abi.SectorNumber(id)] + if len(si.DealIDs) > 0 && cctx.Bool("only-cc") { + continue + } if !found { return xerrors.Errorf("sector %d is not active", id) } From d468c36216c19b748082b94a5c89cabe9bb5f93a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 5 Oct 2022 16:56:23 +0000 Subject: [PATCH 185/185] release v1.17.2 --- CHANGELOG.md | 49 +++++++++++++++++++++------ build/openrpc/full.json.gz | Bin 28425 -> 28421 bytes build/openrpc/gateway.json.gz | Bin 5079 -> 5076 bytes build/openrpc/miner.json.gz | Bin 16025 -> 16021 bytes build/openrpc/worker.json.gz | Bin 5260 -> 5256 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, 43 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5e21f3ddd..a690f3bad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,51 +1,80 @@ # Lotus changelog -# v1.17.2-rc2 / 2022-09-29 +# v1.17.2 / 2022-10-05 -This is the second release candidate of the upcoming OPTIONAL release Lotus v1.17.2 +This is an OPTIONAL release of Lotus. This feature release introduces new sector number management APIs in Lotus that enables all the Sealing-as-a-Service and Lotus interactions needed to function. The default propagation delay setting for storage providers has also been changed, as well as numerous other features and enhancements. Check out the sub-bullet points in the feature and enhancement section to get a short description about each feature and enhancements. + +### Highlights + +🦭 **SaaS** 🦭 +New sector management APIs makes it possible to import partially sealed sectors into Lotus. This release implements all SaaS<->Lotus interactions needed for such services to work. Deep dive into the new APIs here: https://github.com/filecoin-project/lotus/discussions/9079#discussioncomment-3652044 + +⏳ **Propagation delay** ⌛️ +In v1.17.2 the default PropagationDelay has been raised from 6 seconds -> 10 seconds, and you can tune this yourself with the `PROPAGATION_DELAY_SECS` environment variable. This means you will now wait for 10 seconds for other blocks to arrive from the network before computing a winningPoSt (if eligible). In your `lotus-miner` logs that means you will see this "baseDeltaSeconds": 10 as default. + +⚠️ **Please note that Lotus v1.17.2 will require a Go-version of v1.18.1 or higher!** ## New features - feat: sealing: Partially sealed sector import ([filecoin-project/lotus#9210](https://github.com/filecoin-project/lotus/pull/9210)) - - feat: sealing: Use bitfields to manage sector numbers ([filecoin-project/lotus#9183](https://github.com/filecoin-project/lotus/pull/9183)) + - Implements support for importing (partially) sealed sectors which is needed for enabling external sealing services. +- feat: sealing: Use bitfields to manage sector numbers ([filecoin-project/lotus#9183](https://github.com/filecoin-project/lotus/pull/9183)) + - Needed for Sealing-as-a-Service. Move sector number assigning logic to use stored bitfields instead of stored counters. Makes it possible to reserve ranges of sector numbers, see the sector assigner state and view sector number reservations. - feat: env: propagation delay ([filecoin-project/lotus#9290](https://github.com/filecoin-project/lotus/pull/9290)) + - The default propagation delay is raised to 10 seconds from 6 seconds. Ability to set it yourself with the `PROPAGATION_DELAY_SECS` environment variable. - feat: cli: lotus info cmd ([filecoin-project/lotus#9233](https://github.com/filecoin-project/lotus/pull/9233)) + - A new `lotus info` command that prints useful node information in one place. - feat: proving: Introduce manual sector fault recovery (#9144) ([filecoin-project/lotus#9144](https://github.com/filecoin-project/lotus/pull/9144)) + - Allow users to declare fault recovery messages manually with the `lotus-miner proving recover-faults` command, rather than waiting for it to happen automatically before windowPost. +- feat: api: Reintroduce StateActorManifestCID ([filecoin-project/lotus#9201](https://github.com/filecoin-project/lotus/pull/9201)) + - Adds ability to retrieve the Actor Manifest CID through the api. +- feat: message: Add uuid to mpool message sent to chain node from miner ([filecoin-project/lotus#9174](https://github.com/filecoin-project/lotus/pull/9174)) + - Adds a UUID to each message sent by the `lotus-miner` to the daemon. A requirement needed for https://github.com/filecoin-project/lotus/issues/9130 +- feat: message: Add retries to mpool push message from lotus-miner ([filecoin-project/lotus#9177](https://github.com/filecoin-project/lotus/pull/9177)) + - Retries to mpool push message API in case of unavailability of the lotus chain node. + +**Network 17 related features :** +- feat: network: add nv17 and integrate the corresponding go state type ([filecoin-project/lotus#9267](https://github.com/filecoin-project/lotus/pull/9267)) - feat: cli: print beneficiary info in state miner-info ([filecoin-project/lotus#9308](https://github.com/filecoin-project/lotus/pull/9308)) - feat: api/cli: change beneficiary propose and confirm for actors and multisigs. ([filecoin-project/lotus#9307](https://github.com/filecoin-project/lotus/pull/9307)) - feat: api/cli: beneficiary withdraw api and cli ([filecoin-project/lotus#9296](https://github.com/filecoin-project/lotus/pull/9296)) -- feat: network: add nv17 and integrate the corresponding go state type ([filecoin-project/lotus#9267](https://github.com/filecoin-project/lotus/pull/9267)) -- feat: api: Reintroduce StateActorManifestCID ([filecoin-project/lotus#9201](https://github.com/filecoin-project/lotus/pull/9201)) -- feat: message: Add retries to mpool push message from lotus miner ([filecoin-project/lotus#9177](https://github.com/filecoin-project/lotus/pull/9177)) -- feat: message: Add uuid to mpool message sent to chain node from miner ([filecoin-project/lotus#9174](https://github.com/filecoin-project/lotus/pull/9174)) ## Enhancements - feat: sectors renew --only-cc ([filecoin-project/lotus#9184](https://github.com/filecoin-project/lotus/pull/9184)) + - Exlude extending deal-related sectors with the `--only-cc` option when using the `lotus-miner sectors renew` - feat: miner: display updated & update-cache for storage list ([filecoin-project/lotus#9323](https://github.com/filecoin-project/lotus/pull/9323)) + - Show amount of `updated` & `update-cache` sectors in each storage path in the `lotus-miner storage list` output - feat: add descriptive errors to markets event handler ([filecoin-project/lotus#9326](https://github.com/filecoin-project/lotus/pull/9326)) + - More descriptive market error logs - feat: cli: Add option to terminate sectors from worker address ([filecoin-project/lotus#9291](https://github.com/filecoin-project/lotus/pull/9291)) -- fix: sealing: Make DataCid resource env vars make more sense ([filecoin-project/lotus#9231](https://github.com/filecoin-project/lotus/pull/9231)) + - Adds a flag to allow either owner address or worker address to send terminate sectors message. - fix: cli: actor-cids cli command now defaults to current network ([filecoin-project/lotus#9321](https://github.com/filecoin-project/lotus/pull/9321)) -- fix: worker: Close all storage paths on worker shutdown ([filecoin-project/lotus#9153](https://github.com/filecoin-project/lotus/pull/9153)) + - Makes the command defaults to the current network. - fix: ux: Output bytes in `lotus client commP` cmd ([filecoin-project/lotus#9189](https://github.com/filecoin-project/lotus/pull/9189)) -- fix: ux: exclude negative available balance from spendable amount ([filecoin-project/lotus#9182](https://github.com/filecoin-project/lotus/pull/9182)) + - Adds an additional line that outputs bytes in the `lotus client commP` command. - fix: sealing: Add information on what worker a job was assigned to in logs ([filecoin-project/lotus#9151](https://github.com/filecoin-project/lotus/pull/9151)) + - Adds the worker hostname into the assignment logs. - refactor: sealing pipeline: Remove useless storage adapter code ([filecoin-project/lotus#9142](https://github.com/filecoin-project/lotus/pull/9142) + - Remove proxy code in `storage/miner.go` / `storage/miner_sealing.go`, call the pipeline directly instead. ## Bug fixes - fix: ffiwrapper: Close readers in AddPiece ([filecoin-project/lotus#9328](https://github.com/filecoin-project/lotus/pull/9328)) - fix: sealing: Drop unused PreCommitInfo from pipeline.SectorInfo ([filecoin-project/lotus#9325](https://github.com/filecoin-project/lotus/pull/9325)) - fix: cli: fix panic in `lotus-miner actor control list` ([filecoin-project/lotus#9241](https://github.com/filecoin-project/lotus/pull/9241)) - fix: sealing: Abort upgrades in sectors with no deals ([filecoin-project/lotus#9310](https://github.com/filecoin-project/lotus/pull/9310)) +- fix: sealing: Make DataCid resource env vars make more sense ([filecoin-project/lotus#9231](https://github.com/filecoin-project/lotus/pull/9231)) - fix: cli: Option to specify --from msg sender ([filecoin-project/lotus#9237](https://github.com/filecoin-project/lotus/pull/9237)) - fix: ux: better ledger rejection error ([filecoin-project/lotus#9242](https://github.com/filecoin-project/lotus/pull/9242)) - fix: ux: msg receipt for actor withdrawal ([filecoin-project/lotus#9155](https://github.com/filecoin-project/lotus/pull/9155)) +- fix: ux: exclude negative available balance from spendable amount ([filecoin-project/lotus#9182](https://github.com/filecoin-project/lotus/pull/9182)) - fix: sealing: Avoid panicking in handleUpdateActivating on startup ([filecoin-project/lotus#9331](https://github.com/filecoin-project/lotus/pull/9331)) - fix: api: DataCid - ensure reader is closed ([filecoin-project/lotus#9230](https://github.com/filecoin-project/lotus/pull/9230)) - fix: verifreg: serialize RmDcProposalID as int, not tuple ([filecoin-project/lotus#9206](https://github.com/filecoin-project/lotus/pull/9206)) - fix: api: Ignore uuid check for messages with uuid not set ([filecoin-project/lotus#9303](https://github.com/filecoin-project/lotus/pull/9303)) - fix: cgroupV1: memory.memsw.usage_in_bytes: no such file or directory ([filecoin-project/lotus#9202](https://github.com/filecoin-project/lotus/pull/9202)) - fix: miner: init miner's with 32GiB sectors by default ([filecoin-project/lotus#9364](https://github.com/filecoin-project/lotus/pull/9364)) +- fix: worker: Close all storage paths on worker shutdown ([filecoin-project/lotus#9153](https://github.com/filecoin-project/lotus/pull/9153)) - fix: build: set PropagationDelaySecs correctly ([filecoin-project/lotus#9358](https://github.com/filecoin-project/lotus/pull/9358)) +- fix: renew --only-cc with sectorfile ([filecoin-project/lotus#9428](https://github.com/filecoin-project/lotus/pull/9428)) ## Dependency updates - github.com/filecoin-project/go-fil-markets (v1.23.1 -> v1.24.0) diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 4ab58f84d2bf4c7dd535bb661aa09aaee3da7ac6..e714ebdecbbc8e32091c10962e48ab44427abb6b 100644 GIT binary patch literal 28421 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 diff --git a/build/openrpc/gateway.json.gz b/build/openrpc/gateway.json.gz index 4c5fadbebbb9bcbaf8b0af025d39bd9c14124729..902567d5209887489455a12285a7fcf28cc9191c 100644 GIT binary patch delta 4994 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 M|CJRO(2n&00A0V+i~s-t delta 4997 zcmV;06MF2_C)X#Ce}BKGR@=O5m{Z6m#P-bI*WV@vQ{MG0a-c;J-a4KDgwG&5a)@<( z0X+|lp=UNs8+sN+E)(#6{P-~@-|)!Cmhr+fUY!93Z^3-PsBf{CMlO&SZqu*`W^l%~ zj>W$X!)+NBvbT-l)gNQP|vtFAacg0~i;))dYAGjyE_1Q-9Zi0yWzlZ(uZU4}Sp*g3hgH zPj=@W(Aj0fj&}{G?oTrN$MxrA>i!%~M{qvsbVsP;&v$(vcH1{y^X_}YLucpT+ z!ejIMUBjgCA0JU@n>|K-$dTnz$fs?ay%BIc$oo;~`3~cV4!_Z>a*oNoF8FMTH6A(M zq6h!|cYnmt-FCzLM9iK!YPQ;)uGui(QZki)UlMFV(eQ8J_Kmqltz8HGzMAJ(-egc006Z*I?H5%sYkMGl-#wDtnJ%_Z+{G`-&Ws-qt7N4j@x;6+>uibrRzlKD29?>wkgB zD9Jh?skbWrhft2#cbtY9_%DlJ?;sjanAvMCHSV4g#dliGa*B_1U`2`#yDLOW#K#QV ztB`-#bgkqcPq&Va{CN{_v!f#kf-MqG@oN?7^bA4)dY*G_OV_qEeR5`Ir`;-7x_v+) zW~=U1B%v%dPt$IkSdZFV}jxR4*^+ErVY9&2nuloQ163 ztG2?%GmH4&egEEwVs2lxVjUsU^}>JEB6TYcRTeRk6qQ8WB5LxubyugYqPwo31(C~E z)Lju272TCIxWk_6nk*WsRFmb7v4UQc)>rGbTCXk9Yq`{yqveX)De1h^8Gm9Nr)IC& zFs}mo&DR!Z!29g+DIZjq_3>be-j*0qrExU%N`BBY5aZp>GBM63)rB{k6p3s(X8Rt_ z8;09XKNI5o9R&9A1YlKngiXptcMPwhzz){L*TCnzNuoN1K2=U%i&>j77u}9GVH9^e z*L&lRk14c&?Tu!*JN~)T>3`TA((SN+aNBJocQ%{Q8*6d{%|L+ML&!ZwTDwNtYN{vZ zo;-zIA%<2GB7YK~B6$LaNQ{2! z5^GXmdsY-N((v~nZIX-IL@P9j+vRbCh3l3Ca~VA54nHs!O(Z^RHCxS=q+-K1wMAG< z&!;6l_jXmJ=h1u}qBDZ>C*)={_B{wqX<46m=s-? z??DX-ahA$G0W4qG34c`Tio3=1Hq9Naw~#h$3yBkG2D9PA~$phb2#g>i^5seiT%$(8+MyzM_KwltEvq}*CK5=3{bxne1VsOybGyY zK+30YP10UWYSVO}j1M(RE~ZjWft6+drSD{AfA~<+$O|9Aaep2;{ddZ8Y_A}&t1>{? zS0yKDIA_auuS0mHyVo3${CD&faeLc)8%p<_J}t-=<2GZb9bb z3Gys*lS7$Hq)F5--%ef&XZ;GB!XBXONzj1Nf&A6n_x{AttlIE zD{iP_W9n3=YJYFFw#N`d%BlEGyV-8OZna*w+n<{Iy>`3TZNF~r_L|LP@v85QOie7# ztuA03@%=;^!`7?fWCg)l3b_i8nH_fuGT6?5cj_@T1q_BMkY_+U4>=b|k;+e>U3J^W ztMJDFVte31t6{jE;+VO@xtrVxt;IJiT51$B=TqM#+kc@xSy`W~tWQ?{>64XZ`$B2q zr^urhVD=V9>~`UeKl{k$zxKqR*ExShe@sp4kA~7Ft!P$-<&|=Gm(0VKs`c`$&UgR$imr7X$65u|bsY8TIIh9^ zjdyP99i5HY(b-gUXRqJ{$c2Z-XOJD<0OWw71CM|MxRlW~e)7Q-W-$wD**X;e7NjwY zCr4;}UcT2-FnEcvBtzD-mw3yG zaZf?V)%(D;H}vN<#!j=~;FTl{5gre$3ABBuYGfz{Wi{`J!wdl`stal861^e8t*SPX zYpngFT6a907?j92gU94Mm0i?xj2Hq=6n_vFPSAh>%0!WbUQo@TVSdIAv93>i3dB&s zW6f>B^jNyifIKY~e+NZj&CgwA(ibZ{D+_F;_ zNuXMCKD)YFz}Eu);RJm4%WnFY-%#n-DY$AaVDJ+dAm9eskRB7q0Sr>$91$Pe+JA>v zmI5rR^VA2n4edUH795~o;xvn>Y?2#A;lrfCFO`{Pb1RXed1L8|(j|!5*yv04+uUQx zs80J{Dn>m}v5`8&u^!Q%$8Z^h7Bo`InM63+=K!s2R~bs&wi!1<%T?BM zg;`J!Yi-b^)OR`Dqp1NZM{m;i&Zyn~6`??{mvRpEQ`0j$1tl{ADf;hp(t2sDv zclGN7zJAvY@5G~&W;m@J;7P1z(~iZ|B3vh5Xj#A{uZ03W7aCkWt>=lSoqz1?7L))H z97V{r@1CDj6E0!rhm9piquysESz1|b+t#*i9Y=n2Qg5%|5OKiX7l2+vR`Ebh7Q%`t z6Edi!(l61vEMY=!r!N50>#L<;Ed?JiU80mf({ELL{8P`OejwI0w5vGM5g1)R zIvVkL2UPb9PC7~wXTS&r<9}fLX$83~K`GnC!)>Q~PaAHvXx0e6#%z&O(oBA*B9{3~i6^cU4R&mE>t9q2p2mB?y;if+4k{X; z5rTFw!*JQh4uY7;M~k9;Z~55=Focd+N=~BPDYlajLVoR2WWhe9;eX3O`DAz1!xv&A zsmCINjs+E-S_Y)leWx>}IZ9TEM ze@w6kvFCelf$y+W2e=;pI^lwjAciAkA%W-xex%2rAPq{K{pFLOwj4JoKYP%Yf1l1= zlspQ;Q56)7$bW%!32zIAy@aUXm%o5Qg{m=%zKukag{h zoF(f7f}|CzSO6iybSEi&!iu4zL^4M%jj2pO%ZY0%dLT2K1hi7Mf;4PNs_0HLlv&z# zcPM&(=h*&*tX84wM2fAlW^yi*ne{V5?0r?NfbZcl{_{5*eWO#A}Iz+ZV(=yKwvuvS4?`z0kopd3}9@j z2ij7juUmU&)>iA$T8}=U9*x-{t49;>l+LyIltRqXu`!B>9c*AMo}FVG&O{vQqYL90 z&ap#082_38$ANepKMCRp$37#Y(c;;cz%>d6iGSEA3~_x4ohHs*OR(pydGJf+pspsmY}!Dn&&Eew3OfzJ*GU1ag%-c^NC_t+)@EVVO| z&3{#H2~PIV-{Z@yus+)Kcy)LIRTN*doN0GYWX_`Z zitf!}m@UGVC-yIfT%S)PucF+MsXdcgs+D^tF(qd`lf*j}&m>v7aJ}d6qg*iU&E$tY zBflhN?Kxadzq?abU}XRSwI&yy_GKT*-hYbrVj#d5_dU9u;C#UG1Rxx^Yz@Qh1_i!? zeI9Qt&WA3Q>5EycPo~QYldEv?8P+D_<_p(Sja1(c_b2a%D=UbW6bJWMQ?Au)t>KJI z_YW17%ikP~3o)U~oBTPKzWMjaoB{81kU4d57k@Q8 zffhG88m16@8)br?gq1@*Rx(=|QEl_kQ?M+8-($GZ9_i!E{4Ev6wX@3mKs8BH@ z7Pyp>+Z8x{IpB1%yNqP*W3yS@R|S#!OclUr<&vi;Njt49OD0u8NHnN+l61kus?8T% zt{G}fkbJe?k@QiSY97}=Z_9PBtOQ?#E^+vsKk}>9`pg5g;{H`&&4diCl-Qm(hxM7P z1uLwR^y;m!2Q>TAOp&$sa(`OXmm8*q;(l3$zApf=s(U|S-y+c$@A9+_A7QrJUEhXJ zIQ04?Uc8n~-t4LOEjDA{A}iPhf!|vYqPvcQT=i~Cz1vdnw$!^V^=`{1nP&$D#X2jd zau=s>zcgMP_RkfvvzKRN$8fZgu;aNsv{98O!Q(|_aGZFhBEh595q_%}H^A|s*^nXi zTAkK@x7jd{f}3}t1LkJ0+tv+>N&r>(T^>v^sI&lH!2C~x@%EYp#nHY1$EjSjJkeP( zDD={J!K54d%UCl3zJx(#cv>u)p8uwukl46zPo89vv0o4ZTD+{|6=}X~?U{FX-|zkx P00960IbG~RlJx)pl*_jH diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index 0c0e13c9adc063e3cbefcd8dee1781f40b661ed8..4ed31a8bb2a3c39086b12a66d8e124971e3f81b3 100644 GIT binary patch delta 16019 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

k3nLh{l<65 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 N|Nqa&3S1`^0|0>+I&J^} delta 16023 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 z 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 delta 4177 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 b4?d+*N78zIxBmYC00960)^ZE|Z!rM?q;xss diff --git a/build/version.go b/build/version.go index f262ab849..c924a0aa8 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.17.2-rc2" +const BuildVersion = "1.17.2" 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 316cf96c5..9921769e0 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.17.2-rc2 + 1.17.2 COMMANDS: init Initialize a lotus miner repo diff --git a/documentation/en/cli-lotus-worker.md b/documentation/en/cli-lotus-worker.md index ebc865dac..ffe7acc56 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.17.2-rc2 + 1.17.2 COMMANDS: run Start lotus worker diff --git a/documentation/en/cli-lotus.md b/documentation/en/cli-lotus.md index e0aecbf90..066416c83 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.17.2-rc2 + 1.17.2 COMMANDS: daemon Start a lotus daemon process

uYP<3bFuA^(3)Wol9@8ZX_h<60j*Wln zS&ZIWH#O z7dH?`$qm`1MxrfJf=1JuMr)0!J*d@7*@yR8n`B!R!B;tdr@W=cg9&2iWJIeefKl%? zjq(W0YTYktS!9eyZ7LYz%6hg^@2idQN2=-N??d&Cj+XcFhQzh0FO*%ypL{?!>4#$5 zGU|k+l_VY6Uf!r5S9|&hv2$VHH(Mv|ca(lP`!)OZ?(hFzqqqOz?pgQHW1s(ZWPO>v zJ$f@}z4cB@>Di|lyLf;7?mv74Oc2yB5`>+5Wy2RtY5oV zy?3zRe%0>2igkdD2VYON^<;4Wm=X^W&-dOy-{Gf|Fb+Qr>E&!3QlO5HI!axI@o&W28_Ir$BBl%5zl^$tuhkkw-8C`^Ke4zf3Tl24v2RStn3S{z@i zW$jIHI&(3LKN8)(lb8_{9dza*izE94&M(moWOm|tblyqrbBSCBTF90tI#iR%5nKVM zlO_@?0^OsNQxZRa%n8xiM1`O_+EPbb>S#+HZK}QR`@{7}wD85inIqy=J@ls?#vRQE(L~ za^M{FI<2y9Q3asRepd(6bSf=?=WPB*vhfabsx^Iqj#IfligK*8rc>y-@r)~1h8Jzk x82Ew>s=_O^MU(U2wi6Ot=kBR*hu`qN+;1F!+uQHA{|f*B|Nq_zVFe@d005V(ghc=V delta 4356 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 bS~Gsu)1IDgpZ;F}00960a;gQbrt1O#br#6s diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index 020bc9d1b70debe22a19c0b2034b8ecf3b8fd3a8..5d62a0c56fccb3bcd8554874a97907de3011fc14 100644 GIT binary patch delta 3512 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%0DZE+yWIXt`cC`!_D4$U z8ZYq|>|e0|m(2e4UN-x`L>7V`y7q(nk;%#Y6S;X=e{{F?5|SBj&{U%OrU-nxl_Gem zW#-xj!k*IRvQYznPNyECY@}3Omagzm6#TBfyT2*1Ot%O1J?p-_09XOAuLKQXd;ODO z4q1Oc$TP0Usw%gQMe_19SEig77#ZlCOl@x78mYQD)*5f0;H>Si|CVvqm>!p9tQ(H1 zsj}o}9tWLV$MREk)*F?iaG@_1ohmr6;J|_d9}LrjVKz)(A!v>L>j-!QEh9O3Av$1> z(7N=af(i0Ge|MQZ_AwF~6hEL;3O$MKiM@a4ppr2*d3T&6O=$}9jF7MXxuli(bYqd5@dkuD5GsH4a=x4nzk2#;n*Pbh zylNBAoj*NyF_{%9QoNjl^(iG*zUQrN9__CtmSPmKv$5+u-0jV2bwB5G#ZUo0BMOcA z$Ba%XrPkZ*oL(`JyC!XpO4G>c@^4Oi207p3#X9@|w-_nlP|p}Cs#bLp{_$07_%QEN zmOuv%(Cs{}eh+`%EueF=Tc$hzd>4#c;W9;}(1Nv!oRaxgF5>bx;z@JlO!ahrx-x5; zrEcgrlTJ-Y;i&`Z++VmXxFoNpu;aEG!zeFwG|-4kWFo_Y?jcqYFC)+C{}LT@f1hgK zazs|?HQ_)?5rm3L(LZ8BBVkiK-fUWwa>V za}moL&t;>-Zj&YwI3R~;xSA6s!Nw$50^3v zlhzV?f7#24Aqs7olWc~$vL|X=_mEHZ!XyPWFHFJ3?sif&veT2-RlDa6;i%Rf>PlrK zZK*=`bApt;9F%iG_GwcbF@~b-xGiCbn%AdEhW} zwg(P+jKksXL^*hpmSy*>F{#c8AMUqrrX>;2$nqgbUbZUr6eU}genZrlb1IUbhj;BE z`J73>W`zFY!|vq;r1S7`bmifr;dlI3+eDny!56kE;;`unvGgF89!e0RxPRt1N9}6h zb?KFbw2hY1I>|%O!ek~zgz~8CKdEz_AmSm)$+fT_P-US6+Z1f`m9foUx0^!|Fo72S zi7t_2VFO+}CZxPO7MW%6Z(r=*TtYJArUF?)G)4__T3o!sASl9{qzEa^F1Ii7B>g#^ zdWf=-QgvDK7mWPh>-csBM?9}@N-WduL4DQwtm5W}0A2ySuMK!rwHSEAv8aZ)LFQvY zZBS~{7`ttw0N0k8ssL93t^!;IxE>E&H7%2Z1nYmU>&1xv4HMITys)omMJV4DP!#5N ziDsC|h)kB!_p?5Zvv(hvHZb6JwAfVo!uDvOD&sk{EJS9(MmHv`+@7D8m39ez4PqUb+#6>NZImG73{GR)t;0sb=pt&=U<{z5G_qH` zN9TXbPQb5_??vsYbT-`h*e#sM{%d581K(c<%F5DC#IqY+y_2PIw=0N4tUT|J6k9h+ zrIBdcXQfsdqJ3D%#KNp0{a7c*qfBL+&V1Uu+Qe4Xxrk91FMtVc&YD!M24m`FdV)A8 zlnZe9^!VX})S9nWikWBpXLVn zuQ~eHhY!B0-($yNZMn%Mw|AV3H7-w;jOA=D+O{WYflTc8%>)zZu6`wkZ8CFazSBc} zJ>pR|hMqO6-1bMro3)SlCY|GJBf`DjULs5|nH|Q2Hzhn570#r(&xq}!OXS&0*Vuo22P#XE2T#&hw78hBJZwNqI@48|J-GImN``-2 zJwhk;$L{U;;@S&-eer+Y#09uZROQ$nJ$+D4AN{$fvoTvGoXmVh3!61nRrH}OeT6^b z558PnUsG)1pD^gMuAk-tx(p>P>@6}LeYv=n&JV(-W{rXOssCdtMt3-KvBVA8Os1Aqv zNa+rTL#18``@=zZq!0T3*kpf5*lUjg^jl~EgH{{Bu=NHoYPkWdC|aKcfmUgK5&~MJ^$`Ft?8O4p({8;0ka~1%04OWa^8-Lx$v6R^ zRl?Ok{+ko7J^(ma>+1%9I<&qS0H|r~YM2EyCtMA4fTn~?1ArBoHnUKnRkN%lPP9t6Bw(~k zxEHl#)GFbUDA6k6lDN?-;gSH-D&bz#YEp}Yi=f8TKaDv9GrEdC><#*fiBI^f##v7` zGf0BOaivL5BaSIedg17p(xg|4jwwyj(H~cuq-Q^_H0im(F{OV=F9aP^n)J%g@uZ1( zXU9d&Ecd^O{obL{)0F;ZYFBaft~}uGG-jX2?kin&)YH|j9-oHC=6dzZR?>m1irO0~ zLtPyvI!+tt+Hlm<^g-P_Uj^cc-CnK*p4RAm(!aM#=Tq*!O*)_H{|{O1&k!?b`RRxN zP+Fpf*ZU6?cekvWBVNsGiJVI~dCRe}=g%l#eNb??`qzyGwWxm$tNjhCe~R(9 zO#PFf&@T0lp@RK@+~AgnrT@jRhz6<=97Hsbhz4p0D2QmFV+!{&qJc8NKtu*T%S=H; z2DLaaLPQ3M$RH6J6hMTFW{7zHVM6z4B{mX{G*ftsQ9yq!`h-SoC5R8lo+;F)MOq(& zfyg95pnyODfdT>r1PZ({6j&1WOSpe-_urbx3K2~tqKQN_QHylG-O)trHRnAMyE9Us z(q~eqj!8`)HJv!gl;;$0|76rMhZBDZQ*Mv?P6?VkwmWuqYndvx$GLJO4vu>*nW22* z_{p%4QsjSZ6_IluRBo9{xPOb(PA-(>(?E z<5hd|N-h%_46+Z;{%Sv*4DCox-n(#<&zUrT`Il{SU5*=(psDL{GvDk_()k*CWN#mAa3`cLRg|v^yFOCnspCDJQx)KqnIo87Cvy zR|ivl0()>M$*WSn>7vFRg(2K zypew>Id6)zA>-|)wbg*_mEHa_8s!+eYa7V(u8`*iI?ZMAvCP?~zg%LobA4S*MdJk( zSpBv%K08m!nQibvMuu#zeYsnIL z=Zyw7J7aA6mrd?|>zm)4)5i>fnwmytxBXe~krdO)mo=>nb$b6SGV^-Fcv)j?0+&_q zAwrp}^N=+?3DQg$aWcX(plQ0u^NWWMSJHRd$G2!dQc~A=iN9d~g8jc__OGeg?Eey32zuz+ z5AH`MC-YC_=4JiS-PTJ;X1qaDiRzmo@aa~H;Hj3GYa0lAN}J0@4g5KsdWf=-QgvCn z!aq^)yZY|_ro=Mc9@O`&`|<){1;D;GfYr5=Uk+J+r{@`0WL1^h#v*z7nJZJy3ychO zPNp_DZ;e#l9BYlYPjJ?D*ni77YfO*JGS&@8)l^yXGmnE#u4DPBI_r%}Qn=8UicS?A zSa4v$fe(i1elHuQuMo7x{&fVrftHb+ybv9*M`&I8QNaXxp1-@y9{U&x4T>L7DutfJ z_Qc+Qb5O|`o4h;Dk)|{S`SIQoJIn(73&B5aA>|_1KRtf<&`e}{rRejbt=d9sf8ni7 zZ+{9lcPutna_@5o9wi;)c3-BZ;b45I&hj|D@vd^d5sh{OPtH0QT?9E7Z0jO46-YDUOc|6J0_e7dp7&3FUF0$R&|EVKJ_OoG9kj zFI-f8MQWG1rbVg4wv*x_H3^2XhDXFNE5pEnl5-|rwZrg} zH4rZW)RScpegQ3$-?-tOx*)7wZf4&RG zt#FwlQfR?iMNY|lD;IJ38}Xz$a;ADZKV6wM%~CgXoJpr9r0~>%bnY))7F?27Q`m7^ zjbWG#E)JhHzBt4t1q6lD1SKdpSW$-yo*{T4F>wRdSn;FMwm4 z?a&plX#Lshx2tMm*~YyGmV{yp&^dAufGz?g2-fs~yClR9@f1-Wd`i{Vr1ko4{r>>~ P0RR6}1qRdRVkiLs4J*Bi diff --git a/cmd/lotus-miner/proving.go b/cmd/lotus-miner/proving.go index 5ff49c25f..85bc48e78 100644 --- a/cmd/lotus-miner/proving.go +++ b/cmd/lotus-miner/proving.go @@ -7,10 +7,12 @@ import ( "os" "strconv" "strings" + "sync" "text/tabwriter" "time" "github.com/fatih/color" + "github.com/ipfs/go-cid" "github.com/urfave/cli/v2" "golang.org/x/xerrors" @@ -19,6 +21,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/lotus/blockstore" + "github.com/filecoin-project/lotus/build" "github.com/filecoin-project/lotus/chain/actors/builtin/miner" "github.com/filecoin-project/lotus/chain/store" "github.com/filecoin-project/lotus/chain/types" @@ -37,6 +40,7 @@ var provingCmd = &cli.Command{ provingCheckProvableCmd, workersCmd(false), provingComputeCmd, + provingRecoverFaultsCmd, }, } @@ -644,3 +648,82 @@ It will not send any messages to the chain.`, return nil }, } + +var provingRecoverFaultsCmd = &cli.Command{ + Name: "recover-faults", + Usage: "Manually recovers faulty sectors on chain", + ArgsUsage: "", + Flags: []cli.Flag{ + &cli.IntFlag{ + Name: "confidence", + Usage: "number of block confirmations to wait for", + Value: int(build.MessageConfidence), + }, + }, + Action: func(cctx *cli.Context) error { + if cctx.Args().Len() < 1 { + return xerrors.Errorf("must pass at least 1 sector number") + } + + arglist := cctx.Args().Slice() + var sectors []abi.SectorNumber + for _, v := range arglist { + s, err := strconv.ParseUint(v, 10, 64) + if err != nil { + return xerrors.Errorf("failed to convert sectors, please check the arguments: %w", err) + } + sectors = append(sectors, abi.SectorNumber(s)) + } + + nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx) + if err != nil { + return err + } + defer closer() + + api, acloser, err := lcli.GetFullNodeAPI(cctx) + if err != nil { + return err + } + defer acloser() + + ctx := lcli.ReqContext(cctx) + + msgs, err := nodeApi.RecoverFault(ctx, sectors) + if err != nil { + return err + } + + // wait for msgs to get mined into a block + var wg sync.WaitGroup + wg.Add(len(msgs)) + results := make(chan error, len(msgs)) + for _, msg := range msgs { + go func(m cid.Cid) { + defer wg.Done() + wait, err := api.StateWaitMsg(ctx, m, uint64(cctx.Int("confidence"))) + if err != nil { + results <- xerrors.Errorf("Timeout waiting for message to land on chain %s", wait.Message) + return + } + + if wait.Receipt.ExitCode != 0 { + results <- xerrors.Errorf("Failed to execute message %s: %w", wait.Message, wait.Receipt.ExitCode.Error()) + return + } + results <- nil + return + }(msg) + } + + wg.Wait() + close(results) + + for v := range results { + if v != nil { + fmt.Println("Failed to execute the message %w", v) + } + } + return nil + }, +} diff --git a/documentation/en/api-v0-methods-miner.md b/documentation/en/api-v0-methods-miner.md index 6eb1e5121..e5147340d 100644 --- a/documentation/en/api-v0-methods-miner.md +++ b/documentation/en/api-v0-methods-miner.md @@ -106,6 +106,8 @@ * [PiecesListPieces](#PiecesListPieces) * [Pledge](#Pledge) * [PledgeSector](#PledgeSector) +* [Recover](#Recover) + * [RecoverFault](#RecoverFault) * [Return](#Return) * [ReturnAddPiece](#ReturnAddPiece) * [ReturnDataCid](#ReturnDataCid) @@ -2265,6 +2267,36 @@ Response: } ``` +## Recover + + +### RecoverFault +RecoverFault can be used to declare recoveries manually. It sends messages +to the miner actor with details of recovered sectors and returns the CID of messages. It honors the +maxPartitionsPerRecoveryMessage from the config + + +Perms: admin + +Inputs: +```json +[ + [ + 123, + 124 + ] +] +``` + +Response: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + ## Return diff --git a/documentation/en/cli-lotus-miner.md b/documentation/en/cli-lotus-miner.md index 88c4d4141..ec266311b 100644 --- a/documentation/en/cli-lotus-miner.md +++ b/documentation/en/cli-lotus-miner.md @@ -2093,14 +2093,15 @@ USAGE: lotus-miner proving command [command options] [arguments...] COMMANDS: - info View current state information - deadlines View the current proving period deadlines information - deadline View the current proving period deadline information by its index - faults View the currently known proving faulty sectors information - check Check sectors provable - workers list workers - compute Compute simulated proving tasks - help, h Shows a list of commands or help for one command + info View current state information + deadlines View the current proving period deadlines information + deadline View the current proving period deadline information by its index + faults View the currently known proving faulty sectors information + check Check sectors provable + workers list workers + compute Compute simulated proving tasks + recover-faults Manually recovers faulty sectors on chain + help, h Shows a list of commands or help for one command OPTIONS: --help, -h show help (default: false) @@ -2210,6 +2211,19 @@ OPTIONS: ``` ``` +### lotus-miner proving recover-faults +``` +NAME: + lotus-miner proving recover-faults - Manually recovers faulty sectors on chain + +USAGE: + lotus-miner proving recover-faults [command options] + +OPTIONS: + --confidence value number of block confirmations to wait for (default: 5) + +``` + ## lotus-miner storage ``` NAME: diff --git a/extern/filecoin-ffi b/extern/filecoin-ffi index f997fe6c7..32afd6e1f 160000 --- a/extern/filecoin-ffi +++ b/extern/filecoin-ffi @@ -1 +1 @@ -Subproject commit f997fe6c77632c0bc58d0b1fdf53ee7a93f6027c +Subproject commit 32afd6e1f1419b6bb7d0f4b3944287fde593ca64 diff --git a/itests/wdpost_config_test.go b/itests/wdpost_config_test.go index 61b64387d..984650ae6 100644 --- a/itests/wdpost_config_test.go +++ b/itests/wdpost_config_test.go @@ -300,3 +300,170 @@ func TestWindowPostMaxSectorsRecoveryConfig(t *testing.T) { sectors = p.MinerPower.RawBytePower.Uint64() / uint64(ssz) require.Equal(t, nSectors+kit.DefaultPresealsPerBootstrapMiner-1, int(sectors)) // -1 not recovered sector } + +func TestWindowPostManualSectorsRecovery(t *testing.T) { + oldVal := wdpost.RecoveringSectorLimit + defer func() { + wdpost.RecoveringSectorLimit = oldVal + }() + wdpost.RecoveringSectorLimit = 1 + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + client, miner, ens := kit.EnsembleMinimal(t, + kit.LatestActorsAt(-1), + kit.MockProofs()) + ens.InterconnectAll().BeginMining(2 * time.Millisecond) + + nSectors := 10 + + miner.PledgeSectors(ctx, nSectors, 0, nil) + + maddr, err := miner.ActorAddress(ctx) + require.NoError(t, err) + di, err := client.StateMinerProvingDeadline(ctx, maddr, types.EmptyTSK) + require.NoError(t, err) + + mid, err := address.IDFromAddress(maddr) + require.NoError(t, err) + + t.Log("Running one proving period") + waitUntil := di.Open + di.WPoStProvingPeriod + t.Logf("End for head.Height > %d", waitUntil) + + ts := client.WaitTillChain(ctx, kit.HeightAtLeast(waitUntil)) + t.Logf("Now head.Height = %d", ts.Height()) + + p, err := client.StateMinerPower(ctx, maddr, types.EmptyTSK) + require.NoError(t, err) + + ssz, err := miner.ActorSectorSize(ctx, maddr) + require.NoError(t, err) + + require.Equal(t, p.MinerPower, p.TotalPower) + require.Equal(t, p.MinerPower.RawBytePower, types.NewInt(uint64(ssz)*uint64(nSectors+kit.DefaultPresealsPerBootstrapMiner))) + + failed, err := client.StateMinerFaults(ctx, maddr, types.TipSetKey{}) + require.NoError(t, err) + failedCount, err := failed.Count() + require.NoError(t, err) + + require.Equal(t, failedCount, uint64(0)) + + t.Log("Drop some sectors") + + // Drop 2 sectors from deadline 2 partition 0 (full partition / deadline) + parts, err := client.StateMinerPartitions(ctx, maddr, 2, types.EmptyTSK) + require.NoError(t, err) + require.Greater(t, len(parts), 0) + + secs := parts[0].AllSectors + n, err := secs.Count() + require.NoError(t, err) + require.Equal(t, uint64(2), n) + + var failedSectors []abi.SectorNumber + + // Drop the partition + err = secs.ForEach(func(sid uint64) error { + failedSectors = append(failedSectors, abi.SectorNumber(sid)) + return miner.StorageMiner.(*impl.StorageMinerAPI).IStorageMgr.(*mock.SectorMgr).MarkFailed(storiface.SectorRef{ + ID: abi.SectorID{ + Miner: abi.ActorID(mid), + Number: abi.SectorNumber(sid), + }, + }, true) + }) + require.NoError(t, err) + + di, err = client.StateMinerProvingDeadline(ctx, maddr, types.EmptyTSK) + require.NoError(t, err) + + t.Log("Go through another PP, wait for sectors to become faulty") + waitUntil = di.Open + di.WPoStProvingPeriod + t.Logf("End for head.Height > %d", waitUntil) + + ts = client.WaitTillChain(ctx, kit.HeightAtLeast(waitUntil)) + t.Logf("Now head.Height = %d", ts.Height()) + + failed, err = client.StateMinerFaults(ctx, maddr, types.TipSetKey{}) + require.NoError(t, err) + failedCount, err = failed.Count() + require.NoError(t, err) + + require.Equal(t, failedCount, uint64(2)) + + recovered, err := client.StateMinerRecoveries(ctx, maddr, types.TipSetKey{}) + require.NoError(t, err) + recoveredCount, err := recovered.Count() + require.NoError(t, err) + + require.Equal(t, recoveredCount, uint64(0)) + + p, err = client.StateMinerPower(ctx, maddr, types.EmptyTSK) + require.NoError(t, err) + + require.Equal(t, p.MinerPower, p.TotalPower) + + t.Log("Make the sectors recoverable") + + err = secs.ForEach(func(sid uint64) error { + return miner.StorageMiner.(*impl.StorageMinerAPI).IStorageMgr.(*mock.SectorMgr).MarkFailed(storiface.SectorRef{ + ID: abi.SectorID{ + Miner: abi.ActorID(mid), + Number: abi.SectorNumber(sid), + }, + }, false) + }) + require.NoError(t, err) + + // Try to manually recover the sector + t.Log("Send recovery message") + _, err = miner.RecoverFault(ctx, failedSectors) + require.NoError(t, err) + + currentHeight, err := client.ChainHead(ctx) + require.NoError(t, err) + + ts = client.WaitTillChain(ctx, kit.HeightAtLeast(currentHeight.Height()+abi.ChainEpoch(10))) + t.Logf("Now head.Height = %d", ts.Height()) + + failed, err = client.StateMinerFaults(ctx, maddr, types.TipSetKey{}) + require.NoError(t, err) + failedCount, err = failed.Count() + require.NoError(t, err) + + require.Equal(t, failedCount, uint64(2)) + + recovered, err = client.StateMinerRecoveries(ctx, maddr, types.TipSetKey{}) + require.NoError(t, err) + recoveredCount, err = recovered.Count() + require.NoError(t, err) + + require.Equal(t, recoveredCount, uint64(2)) + + di, err = client.StateMinerProvingDeadline(ctx, maddr, types.EmptyTSK) + require.NoError(t, err) + + t.Log("Go through another PP, wait for sectors to become faulty") + waitUntil = di.Open + di.WPoStProvingPeriod + t.Logf("End for head.Height > %d", waitUntil) + + ts = client.WaitTillChain(ctx, kit.HeightAtLeast(waitUntil)) + t.Logf("Now head.Height = %d", ts.Height()) + + failed, err = client.StateMinerFaults(ctx, maddr, types.TipSetKey{}) + require.NoError(t, err) + failedCount, err = failed.Count() + require.NoError(t, err) + + require.Equal(t, failedCount, uint64(0)) + + recovered, err = client.StateMinerRecoveries(ctx, maddr, types.TipSetKey{}) + require.NoError(t, err) + recoveredCount, err = recovered.Count() + require.NoError(t, err) + + require.Equal(t, recoveredCount, uint64(0)) +} diff --git a/node/impl/storminer.go b/node/impl/storminer.go index bab72d631..f054f627e 100644 --- a/node/impl/storminer.go +++ b/node/impl/storminer.go @@ -1323,6 +1323,27 @@ func (sm *StorageMinerAPI) ComputeProof(ctx context.Context, ssi []builtin.Exten return sm.Epp.ComputeProof(ctx, ssi, rand, poStEpoch, nv) } +func (sm *StorageMinerAPI) RecoverFault(ctx context.Context, sectors []abi.SectorNumber) ([]cid.Cid, error) { + allsectors, err := sm.Miner.ListSectors() + if err != nil { + return nil, xerrors.Errorf("could not get a list of all sectors from the miner: %w", err) + } + var found bool + for _, v := range sectors { + found = false + for _, s := range allsectors { + if v == s.SectorNumber { + found = true + break + } + } + if !found { + return nil, xerrors.Errorf("sectors %d not found in the sector list for miner", v) + } + } + return sm.WdPoSt.ManualFaultRecovery(ctx, sm.Miner.Address(), sectors) +} + func (sm *StorageMinerAPI) RuntimeSubsystems(context.Context) (res api.MinerSubsystems, err error) { return sm.EnabledSubsystems, nil } diff --git a/storage/wdpost/wdpost_run.go b/storage/wdpost/wdpost_run.go index 0e715f101..0501923b0 100644 --- a/storage/wdpost/wdpost_run.go +++ b/storage/wdpost/wdpost_run.go @@ -717,3 +717,7 @@ func (s *WindowPoStScheduler) ComputePoSt(ctx context.Context, dlIdx uint64, ts return s.runPoStCycle(ctx, true, *dl, ts) } + +func (s *WindowPoStScheduler) ManualFaultRecovery(ctx context.Context, maddr address.Address, sectors []abi.SectorNumber) ([]cid.Cid, error) { + return s.declareManualRecoveries(ctx, maddr, sectors, types.TipSetKey{}) +} diff --git a/storage/wdpost/wdpost_run_faults.go b/storage/wdpost/wdpost_run_faults.go index 0b7a33238..9e9854a7c 100644 --- a/storage/wdpost/wdpost_run_faults.go +++ b/storage/wdpost/wdpost_run_faults.go @@ -10,6 +10,7 @@ import ( "go.opencensus.io/trace" "golang.org/x/xerrors" + "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-bitfield" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/builtin" @@ -345,3 +346,111 @@ func (s *WindowPoStScheduler) asyncFaultRecover(di dline.Info, ts *types.TipSet) } }() } + +// declareRecoveries identifies sectors that were previously marked as faulty +// for our miner, but are now recovered (i.e. are now provable again) and +// still not reported as such. +// +// It then reports the recovery on chain via a `DeclareFaultsRecovered` +// message to our miner actor. +// +// This is always invoked ahead of time, before the deadline for the evaluated +// sectors arrives. That way, recoveries are declared in preparation for those +// sectors to be proven. +// +// If a declaration is made, it awaits for build.MessageConfidence confirmations +// on chain before returning. +func (s *WindowPoStScheduler) declareManualRecoveries(ctx context.Context, maddr address.Address, sectors []abi.SectorNumber, tsk types.TipSetKey) ([]cid.Cid, error) { + + var RecoveryDecls []miner.RecoveryDeclaration + var RecoveryBatches [][]miner.RecoveryDeclaration + + type ptx struct { + deadline uint64 + partition uint64 + } + + smap := make(map[ptx][]uint64) + + var mcids []cid.Cid + + for _, sector := range sectors { + ptxID, err := s.api.StateSectorPartition(ctx, maddr, sector, types.TipSetKey{}) + if err != nil { + return nil, xerrors.Errorf("failed to fetch partition and deadline details for sector %d: %w", sector, err) + } + ptxinfo := ptx{ + deadline: ptxID.Deadline, + partition: ptxID.Partition, + } + + slist := smap[ptxinfo] + sn := uint64(sector) + slist = append(slist, sn) + smap[ptxinfo] = slist + } + + for i, v := range smap { + sectorinbit := bitfield.NewFromSet(v) + RecoveryDecls = append(RecoveryDecls, miner.RecoveryDeclaration{ + Deadline: i.deadline, + Partition: i.partition, + Sectors: sectorinbit, + }) + } + + // Batch if maxPartitionsPerRecoveryMessage is set + if s.maxPartitionsPerRecoveryMessage > 0 { + + // Create batched + for len(RecoveryDecls) > s.maxPartitionsPerPostMessage { + Batch := RecoveryDecls[len(RecoveryDecls)-s.maxPartitionsPerRecoveryMessage:] + RecoveryDecls = RecoveryDecls[:len(RecoveryDecls)-s.maxPartitionsPerPostMessage] + RecoveryBatches = append(RecoveryBatches, Batch) + } + + // Add remaining as new batch + RecoveryBatches = append(RecoveryBatches, RecoveryDecls) + } else { + RecoveryBatches = append(RecoveryBatches, RecoveryDecls) + } + + for _, Batch := range RecoveryBatches { + msg, err := s.manualRecoveryMsg(ctx, Batch) + if err != nil { + return nil, err + } + + mcids = append(mcids, msg) + } + + return mcids, nil +} + +func (s *WindowPoStScheduler) manualRecoveryMsg(ctx context.Context, Recovery []miner.RecoveryDeclaration) (cid.Cid, error) { + params := &miner.DeclareFaultsRecoveredParams{ + Recoveries: Recovery, + } + + enc, aerr := actors.SerializeParams(params) + if aerr != nil { + return cid.Undef, xerrors.Errorf("could not serialize declare recoveries parameters: %w", aerr) + } + + msg := &types.Message{ + To: s.actor, + Method: builtin.MethodsMiner.DeclareFaultsRecovered, + Params: enc, + Value: types.NewInt(0), + } + spec := &api.MessageSendSpec{MaxFee: abi.TokenAmount(s.feeCfg.MaxWindowPoStGasFee)} + if err := s.prepareMessage(ctx, msg, spec); err != nil { + return cid.Undef, err + } + sm, err := s.api.MpoolPushMessage(ctx, msg, &api.MessageSendSpec{MaxFee: abi.TokenAmount(s.feeCfg.MaxWindowPoStGasFee)}) + if err != nil { + return cid.Undef, xerrors.Errorf("pushing message to mpool: %w", err) + } + + return sm.Cid(), nil +} diff --git a/storage/wdpost/wdpost_sched.go b/storage/wdpost/wdpost_sched.go index 2739bc386..66722e283 100644 --- a/storage/wdpost/wdpost_sched.go +++ b/storage/wdpost/wdpost_sched.go @@ -19,6 +19,7 @@ import ( "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/build" + lminer "github.com/filecoin-project/lotus/chain/actors/builtin/miner" "github.com/filecoin-project/lotus/chain/store" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/journal" @@ -44,6 +45,7 @@ type NodeAPI interface { StateMinerPartitions(context.Context, address.Address, uint64, types.TipSetKey) ([]api.Partition, error) StateLookupID(context.Context, address.Address, types.TipSetKey) (address.Address, error) StateAccountKey(context.Context, address.Address, types.TipSetKey) (address.Address, error) + StateSectorPartition(ctx context.Context, maddr address.Address, sectorNumber abi.SectorNumber, tok types.TipSetKey) (*lminer.SectorLocation, error) MpoolPushMessage(context.Context, *types.Message, *api.MessageSendSpec) (*types.SignedMessage, error) From f9e19500bec6bdc91d99e597d582df626ce496b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 8 Sep 2022 11:53:52 +0200 Subject: [PATCH 105/185] ffi: Revert accidental update from #9144 --- extern/filecoin-ffi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extern/filecoin-ffi b/extern/filecoin-ffi index 32afd6e1f..f997fe6c7 160000 --- a/extern/filecoin-ffi +++ b/extern/filecoin-ffi @@ -1 +1 @@ -Subproject commit 32afd6e1f1419b6bb7d0f4b3944287fde593ca64 +Subproject commit f997fe6c77632c0bc58d0b1fdf53ee7a93f6027c From ca965d1c6cdd07866e5bcdd4ef983cf4b9cb4993 Mon Sep 17 00:00:00 2001 From: Phi Date: Fri, 9 Sep 2022 13:42:34 +0200 Subject: [PATCH 106/185] Call SyncBasefeeCheck from `lotus info` Call SyncBasefeeCheck from `lotus info` to not duplicate logic. Also switches to V1 api. --- cmd/lotus-miner/info.go | 33 +++++---------------------------- 1 file changed, 5 insertions(+), 28 deletions(-) diff --git a/cmd/lotus-miner/info.go b/cmd/lotus-miner/info.go index 398d030a5..408482a89 100644 --- a/cmd/lotus-miner/info.go +++ b/cmd/lotus-miner/info.go @@ -25,7 +25,7 @@ import ( "github.com/filecoin-project/specs-actors/actors/builtin" "github.com/filecoin-project/lotus/api" - "github.com/filecoin-project/lotus/api/v0api" + "github.com/filecoin-project/lotus/api/v1api" "github.com/filecoin-project/lotus/blockstore" "github.com/filecoin-project/lotus/build" "github.com/filecoin-project/lotus/chain/actors/adt" @@ -70,7 +70,7 @@ func infoCmdAct(cctx *cli.Context) error { } defer closer() - fullapi, acloser, err := lcli.GetFullNodeAPI(cctx) + fullapi, acloser, err := lcli.GetFullNodeAPIV1(cctx) if err != nil { return err } @@ -94,34 +94,11 @@ func infoCmdAct(cctx *cli.Context) error { fmt.Print("Chain: ") - head, err := fullapi.ChainHead(ctx) + err = lcli.SyncBasefeeCheck(ctx, fullapi) if err != nil { return err } - switch { - case time.Now().Unix()-int64(head.MinTimestamp()) < int64(build.BlockDelaySecs*3/2): // within 1.5 epochs - fmt.Printf("[%s]", color.GreenString("sync ok")) - case time.Now().Unix()-int64(head.MinTimestamp()) < int64(build.BlockDelaySecs*5): // within 5 epochs - fmt.Printf("[%s]", color.YellowString("sync slow (%s behind)", time.Now().Sub(time.Unix(int64(head.MinTimestamp()), 0)).Truncate(time.Second))) - default: - fmt.Printf("[%s]", color.RedString("sync behind! (%s behind)", time.Now().Sub(time.Unix(int64(head.MinTimestamp()), 0)).Truncate(time.Second))) - } - - basefee := head.MinTicketBlock().ParentBaseFee - gasCol := []color.Attribute{color.FgBlue} - switch { - case basefee.GreaterThan(big.NewInt(7000_000_000)): // 7 nFIL - gasCol = []color.Attribute{color.BgRed, color.FgBlack} - case basefee.GreaterThan(big.NewInt(3000_000_000)): // 3 nFIL - gasCol = []color.Attribute{color.FgRed} - case basefee.GreaterThan(big.NewInt(750_000_000)): // 750 uFIL - gasCol = []color.Attribute{color.FgYellow} - case basefee.GreaterThan(big.NewInt(100_000_000)): // 100 uFIL - gasCol = []color.Attribute{color.FgGreen} - } - fmt.Printf(" [basefee %s]", color.New(gasCol...).Sprint(types.FIL(basefee).Short())) - fmt.Println() alerts, err := minerApi.LogAlerts(ctx) @@ -152,7 +129,7 @@ func infoCmdAct(cctx *cli.Context) error { return nil } -func handleMiningInfo(ctx context.Context, cctx *cli.Context, fullapi v0api.FullNode, nodeApi api.StorageMiner) error { +func handleMiningInfo(ctx context.Context, cctx *cli.Context, fullapi v1api.FullNode, nodeApi api.StorageMiner) error { maddr, err := getActorAddress(ctx, cctx) if err != nil { return err @@ -615,7 +592,7 @@ func colorTokenAmount(format string, amount abi.TokenAmount) { } } -func producedBlocks(ctx context.Context, count int, maddr address.Address, napi v0api.FullNode) error { +func producedBlocks(ctx context.Context, count int, maddr address.Address, napi v1api.FullNode) error { var err error head, err := napi.ChainHead(ctx) if err != nil { From abef90423d0a9b12fb3f4fb2313d2afd35a35d1e Mon Sep 17 00:00:00 2001 From: Eng Zer Jun Date: Fri, 9 Sep 2022 19:53:40 +0800 Subject: [PATCH 107/185] refactor: use `os.ReadDir` for lightweight directory reading `os.ReadDir` was added in Go 1.16 as part of the deprecation of `ioutil` package. It is a more efficient implementation than `ioutil.ReadDir`. Reference: https://pkg.go.dev/io/ioutil#ReadDir Signed-off-by: Eng Zer Jun --- lib/backupds/backupds_test.go | 3 ++- lib/backupds/log.go | 3 +-- storage/paths/local.go | 2 +- storage/sealer/ffiwrapper/sealer_test.go | 4 ++-- storage/sealer/tarutil/systar.go | 10 +++++++--- testplans/lotus-soup/sanity.go | 3 +-- 6 files changed, 14 insertions(+), 11 deletions(-) diff --git a/lib/backupds/backupds_test.go b/lib/backupds/backupds_test.go index 48b2a8d25..b76799bfb 100644 --- a/lib/backupds/backupds_test.go +++ b/lib/backupds/backupds_test.go @@ -6,6 +6,7 @@ import ( "context" "fmt" "io/ioutil" + "os" "path/filepath" "strings" "testing" @@ -72,7 +73,7 @@ func TestLogRestore(t *testing.T) { require.NoError(t, bds.Close()) - fls, err := ioutil.ReadDir(logdir) + fls, err := os.ReadDir(logdir) require.NoError(t, err) require.Equal(t, 1, len(fls)) diff --git a/lib/backupds/log.go b/lib/backupds/log.go index eb1174b46..13ff7227f 100644 --- a/lib/backupds/log.go +++ b/lib/backupds/log.go @@ -4,7 +4,6 @@ import ( "context" "fmt" "io" - "io/ioutil" "os" "path/filepath" "strconv" @@ -23,7 +22,7 @@ func (d *Datastore) startLog(logdir string) error { return xerrors.Errorf("mkdir logdir ('%s'): %w", logdir, err) } - files, err := ioutil.ReadDir(logdir) + files, err := os.ReadDir(logdir) if err != nil { return xerrors.Errorf("read logdir ('%s'): %w", logdir, err) } diff --git a/storage/paths/local.go b/storage/paths/local.go index 552b1738d..ec146ba5a 100644 --- a/storage/paths/local.go +++ b/storage/paths/local.go @@ -370,7 +370,7 @@ func (st *Local) declareSectors(ctx context.Context, p string, id storiface.ID, } for _, t := range storiface.PathTypes { - ents, err := ioutil.ReadDir(filepath.Join(p, t.String())) + ents, err := os.ReadDir(filepath.Join(p, t.String())) if err != nil { if os.IsNotExist(err) { if err := os.MkdirAll(filepath.Join(p, t.String()), 0755); err != nil { // nolint diff --git a/storage/sealer/ffiwrapper/sealer_test.go b/storage/sealer/ffiwrapper/sealer_test.go index fb6a2249c..71fd7c4a0 100644 --- a/storage/sealer/ffiwrapper/sealer_test.go +++ b/storage/sealer/ffiwrapper/sealer_test.go @@ -585,7 +585,7 @@ func BenchmarkWriteWithAlignment(b *testing.B) { } func openFDs(t *testing.T) int { - dent, err := ioutil.ReadDir("/proc/self/fd") + dent, err := os.ReadDir("/proc/self/fd") require.NoError(t, err) var skip int @@ -611,7 +611,7 @@ func requireFDsClosed(t *testing.T, start int) { openNow := openFDs(t) if start != openNow { - dent, err := ioutil.ReadDir("/proc/self/fd") + dent, err := os.ReadDir("/proc/self/fd") require.NoError(t, err) for _, info := range dent { diff --git a/storage/sealer/tarutil/systar.go b/storage/sealer/tarutil/systar.go index 2d7bc34a5..4cd2e2bbb 100644 --- a/storage/sealer/tarutil/systar.go +++ b/storage/sealer/tarutil/systar.go @@ -3,7 +3,6 @@ package tarutil import ( "archive/tar" "io" - "io/ioutil" "os" "path/filepath" @@ -52,13 +51,18 @@ func ExtractTar(body io.Reader, dir string, buf []byte) error { func TarDirectory(dir string, w io.Writer, buf []byte) error { tw := tar.NewWriter(w) - files, err := ioutil.ReadDir(dir) + files, err := os.ReadDir(dir) if err != nil { return err } for _, file := range files { - h, err := tar.FileInfoHeader(file, "") + info, err := file.Info() + if err != nil { + return xerrors.Errorf("getting file info for file %s: %w", file.Name(), err) + } + + h, err := tar.FileInfoHeader(info, "") if err != nil { return xerrors.Errorf("getting header for file %s: %w", file.Name(), err) } diff --git a/testplans/lotus-soup/sanity.go b/testplans/lotus-soup/sanity.go index b06a653c5..ca9799a50 100644 --- a/testplans/lotus-soup/sanity.go +++ b/testplans/lotus-soup/sanity.go @@ -2,7 +2,6 @@ package main import ( "fmt" - "io/ioutil" "os" ) @@ -24,7 +23,7 @@ func sanityCheck() { panic(enhanceMsg("/var/tmp/filecoin-proof-parameters is not a directory; aborting")) } - files, err := ioutil.ReadDir(dir) + files, err := os.ReadDir(dir) if err != nil { panic(enhanceMsg("failed list directory /var/tmp/filecoin-proof-parameters: %s", err)) } From 0efca4d2660f80f6aa202f18c80055af45c2f0a2 Mon Sep 17 00:00:00 2001 From: Aayush Date: Tue, 6 Sep 2022 11:49:29 -0400 Subject: [PATCH 108/185] introduce v9 actors and nv17 --- api/api_full.go | 2 +- api/api_gateway.go | 2 +- api/api_storage.go | 2 +- api/cbor_gen.go | 7 +- api/mocks/mock_full.go | 40 +- api/proxy_gen.go | 20 +- api/v0api/full.go | 2 +- api/v0api/gateway.go | 2 +- api/v0api/proxy_gen.go | 12 +- api/v0api/v0mocks/mock_full.go | 20 +- api/v0api/v1_wrapper.go | 2 +- build/builtin_actors.go | 14 +- build/builtin_actors_test.go | 8 +- build/params_2k.go | 7 +- build/params_butterfly.go | 11 +- build/params_calibnet.go | 6 +- build/params_interop.go | 17 +- build/params_mainnet.go | 13 +- build/params_shared_vals.go | 2 +- build/params_testground.go | 9 +- chain/actors/actor_cids.go | 161 ++--- chain/actors/agen/main.go | 45 +- chain/actors/builtin/account/account.go | 55 +- .../actors/builtin/account/actor.go.template | 11 +- chain/actors/builtin/account/v0.go | 6 +- chain/actors/builtin/account/v2.go | 6 +- chain/actors/builtin/account/v3.go | 6 +- chain/actors/builtin/account/v4.go | 6 +- chain/actors/builtin/account/v5.go | 6 +- chain/actors/builtin/account/v6.go | 6 +- chain/actors/builtin/account/v7.go | 6 +- chain/actors/builtin/account/v8.go | 6 +- chain/actors/builtin/account/v9.go | 40 ++ chain/actors/builtin/builtin.go | 34 +- chain/actors/builtin/builtin.go.template | 4 + chain/actors/builtin/cron/actor.go.template | 10 +- chain/actors/builtin/cron/cron.go | 59 +- chain/actors/builtin/cron/v0.go | 4 +- chain/actors/builtin/cron/v2.go | 4 +- chain/actors/builtin/cron/v3.go | 4 +- chain/actors/builtin/cron/v4.go | 4 +- chain/actors/builtin/cron/v5.go | 4 +- chain/actors/builtin/cron/v6.go | 4 +- chain/actors/builtin/cron/v7.go | 4 +- chain/actors/builtin/cron/v8.go | 4 +- chain/actors/builtin/cron/v9.go | 35 ++ chain/actors/builtin/init/actor.go.template | 10 +- chain/actors/builtin/init/init.go | 59 +- chain/actors/builtin/init/v0.go | 10 +- chain/actors/builtin/init/v2.go | 10 +- chain/actors/builtin/init/v3.go | 13 +- chain/actors/builtin/init/v4.go | 13 +- chain/actors/builtin/init/v5.go | 13 +- chain/actors/builtin/init/v6.go | 13 +- chain/actors/builtin/init/v7.go | 13 +- chain/actors/builtin/init/v8.go | 10 +- chain/actors/builtin/init/v9.go | 113 ++++ chain/actors/builtin/market/actor.go.template | 46 +- chain/actors/builtin/market/market.go | 92 +-- chain/actors/builtin/market/state.go.template | 28 +- chain/actors/builtin/market/v0.go | 11 +- chain/actors/builtin/market/v2.go | 11 +- chain/actors/builtin/market/v3.go | 11 +- chain/actors/builtin/market/v4.go | 11 +- chain/actors/builtin/market/v5.go | 11 +- chain/actors/builtin/market/v6.go | 10 +- chain/actors/builtin/market/v7.go | 10 +- chain/actors/builtin/market/v8.go | 32 +- chain/actors/builtin/market/v9.go | 326 ++++++++++ chain/actors/builtin/miner/actor.go.template | 4 +- chain/actors/builtin/miner/miner.go | 55 +- chain/actors/builtin/miner/state.go.template | 14 +- chain/actors/builtin/miner/v0.go | 31 +- chain/actors/builtin/miner/v2.go | 30 +- chain/actors/builtin/miner/v3.go | 31 +- chain/actors/builtin/miner/v4.go | 31 +- chain/actors/builtin/miner/v5.go | 31 +- chain/actors/builtin/miner/v6.go | 31 +- chain/actors/builtin/miner/v7.go | 31 +- chain/actors/builtin/miner/v8.go | 30 +- chain/actors/builtin/miner/v9.go | 562 ++++++++++++++++++ .../actors/builtin/multisig/actor.go.template | 17 +- .../builtin/multisig/message.go.template | 12 +- chain/actors/builtin/multisig/message0.go | 4 +- chain/actors/builtin/multisig/message2.go | 4 +- chain/actors/builtin/multisig/message3.go | 4 +- chain/actors/builtin/multisig/message4.go | 4 +- chain/actors/builtin/multisig/message5.go | 4 +- chain/actors/builtin/multisig/message6.go | 4 +- chain/actors/builtin/multisig/message7.go | 4 +- chain/actors/builtin/multisig/message8.go | 12 +- chain/actors/builtin/multisig/message9.go | 77 +++ chain/actors/builtin/multisig/multisig.go | 75 ++- chain/actors/builtin/multisig/v0.go | 8 +- chain/actors/builtin/multisig/v2.go | 8 +- chain/actors/builtin/multisig/v3.go | 9 +- chain/actors/builtin/multisig/v4.go | 9 +- chain/actors/builtin/multisig/v5.go | 9 +- chain/actors/builtin/multisig/v6.go | 9 +- chain/actors/builtin/multisig/v7.go | 9 +- chain/actors/builtin/multisig/v8.go | 8 +- chain/actors/builtin/multisig/v9.go | 117 ++++ chain/actors/builtin/paych/actor.go.template | 7 +- .../actors/builtin/paych/message.go.template | 37 +- chain/actors/builtin/paych/message0.go | 2 + chain/actors/builtin/paych/message2.go | 2 + chain/actors/builtin/paych/message3.go | 2 + chain/actors/builtin/paych/message4.go | 2 + chain/actors/builtin/paych/message5.go | 2 + chain/actors/builtin/paych/message6.go | 2 + chain/actors/builtin/paych/message7.go | 2 + chain/actors/builtin/paych/message8.go | 7 +- chain/actors/builtin/paych/message9.go | 111 ++++ chain/actors/builtin/paych/paych.go | 41 +- chain/actors/builtin/paych/v0.go | 5 +- chain/actors/builtin/paych/v2.go | 5 +- chain/actors/builtin/paych/v3.go | 5 +- chain/actors/builtin/paych/v4.go | 5 +- chain/actors/builtin/paych/v5.go | 5 +- chain/actors/builtin/paych/v6.go | 5 +- chain/actors/builtin/paych/v7.go | 5 +- chain/actors/builtin/paych/v8.go | 5 +- chain/actors/builtin/paych/v9.go | 114 ++++ chain/actors/builtin/power/actor.go.template | 10 +- chain/actors/builtin/power/power.go | 61 +- chain/actors/builtin/power/v0.go | 10 +- chain/actors/builtin/power/v2.go | 10 +- chain/actors/builtin/power/v3.go | 13 +- chain/actors/builtin/power/v4.go | 13 +- chain/actors/builtin/power/v5.go | 13 +- chain/actors/builtin/power/v6.go | 13 +- chain/actors/builtin/power/v7.go | 13 +- chain/actors/builtin/power/v8.go | 10 +- chain/actors/builtin/power/v9.go | 186 ++++++ chain/actors/builtin/registry.go | 78 +++ chain/actors/builtin/registry.go.template | 69 +++ chain/actors/builtin/reward/actor.go.template | 10 +- chain/actors/builtin/reward/reward.go | 47 +- chain/actors/builtin/reward/v0.go | 10 +- chain/actors/builtin/reward/v2.go | 10 +- chain/actors/builtin/reward/v3.go | 10 +- chain/actors/builtin/reward/v4.go | 10 +- chain/actors/builtin/reward/v5.go | 10 +- chain/actors/builtin/reward/v6.go | 10 +- chain/actors/builtin/reward/v7.go | 10 +- chain/actors/builtin/reward/v8.go | 10 +- chain/actors/builtin/reward/v9.go | 98 +++ chain/actors/builtin/system/actor.go.template | 10 +- chain/actors/builtin/system/system.go | 60 +- chain/actors/builtin/system/v0.go | 4 +- chain/actors/builtin/system/v2.go | 4 +- chain/actors/builtin/system/v3.go | 4 +- chain/actors/builtin/system/v4.go | 4 +- chain/actors/builtin/system/v5.go | 4 +- chain/actors/builtin/system/v6.go | 4 +- chain/actors/builtin/system/v7.go | 4 +- chain/actors/builtin/system/v8.go | 4 +- chain/actors/builtin/system/v9.go | 43 ++ .../actors/builtin/verifreg/actor.go.template | 10 +- chain/actors/builtin/verifreg/v0.go | 8 +- chain/actors/builtin/verifreg/v2.go | 8 +- chain/actors/builtin/verifreg/v3.go | 11 +- chain/actors/builtin/verifreg/v4.go | 11 +- chain/actors/builtin/verifreg/v5.go | 11 +- chain/actors/builtin/verifreg/v6.go | 11 +- chain/actors/builtin/verifreg/v7.go | 11 +- chain/actors/builtin/verifreg/v8.go | 10 +- chain/actors/builtin/verifreg/v9.go | 83 +++ chain/actors/builtin/verifreg/verifreg.go | 42 +- chain/actors/manifest.go | 19 +- chain/actors/policy/policy.go | 237 ++++---- chain/actors/policy/policy.go.template | 50 +- chain/actors/version.go | 35 +- chain/consensus/filcns/compute_state.go | 48 +- chain/consensus/filcns/upgrades.go | 128 +++- chain/exchange/cbor_gen.go | 3 +- chain/gen/genesis/f00_system.go | 5 +- chain/gen/genesis/f01_init.go | 3 +- chain/gen/genesis/f02_reward.go | 3 +- chain/gen/genesis/f03_cron.go | 3 +- chain/gen/genesis/f04_power.go | 3 +- chain/gen/genesis/f05_market.go | 3 +- chain/gen/genesis/f06_vreg.go | 3 +- chain/gen/genesis/genesis.go | 9 +- chain/gen/genesis/miners.go | 22 +- chain/state/statetree.go | 2 +- chain/stmgr/actors.go | 3 +- chain/stmgr/forks_test.go | 7 +- chain/sync_test.go | 4 + chain/types/cbor_gen.go | 7 +- chain/vm/cbor_gen.go | 3 +- chain/vm/fvm.go | 9 +- chain/vm/invoker.go | 34 +- chain/vm/mkactor.go | 21 +- chain/vm/runtime.go | 3 +- cli/chain.go | 4 +- cli/multisig.go | 2 +- cli/servicesmock_test.go | 4 +- cli/state.go | 9 +- cmd/lotus-miner/init.go | 3 +- cmd/lotus-miner/precommits-info.go | 2 +- cmd/lotus-miner/sectors.go | 2 +- cmd/lotus-pcr/main.go | 2 +- cmd/lotus-shed/msg.go | 2 +- cmd/lotus-sim/info.go | 2 +- .../simulation/blockbuilder/blockbuilder.go | 6 +- cmd/lotus-sim/simulation/node.go | 2 +- .../simulation/stages/commit_queue.go | 2 +- .../simulation/stages/commit_queue_test.go | 2 +- cmd/lotus-sim/simulation/stages/interface.go | 2 +- .../simulation/stages/precommit_stage.go | 2 +- .../simulation/stages/provecommit_stage.go | 2 +- cmd/lotus-wallet/interactive.go | 4 +- cmd/tvx/extract_many.go | 2 +- conformance/chaos/cbor_gen.go | 7 +- conformance/driver.go | 4 +- documentation/en/cli-lotus-miner.md | 2 +- documentation/en/cli-lotus.md | 2 +- gen/api/proxygen.go | 26 +- gen/inlinegen-data.json | 8 +- go.mod | 3 +- go.sum | 7 +- itests/kit/ensemble_opts_nv.go | 6 +- itests/lite_migration_test.go | 4 +- journal/mockjournal/journal.go | 3 +- lib/retry/retry.go | 3 +- lotuspond/front/src/chain/methodgen.go | 2 +- markets/dagstore/mocks/mock_lotus_accessor.go | 3 +- .../ondealsectorcommitted_test.go | 2 +- node/bundle/bundle.go | 6 +- node/config/cfgdocgen/gen.go | 4 +- node/hello/cbor_gen.go | 3 +- node/impl/full/multisig.go | 3 +- node/impl/full/state.go | 7 +- node/impl/storminer.go | 2 +- paychmgr/cbor_gen.go | 5 +- paychmgr/paych.go | 4 +- storage/paths/mocks/index.go | 4 +- storage/paths/mocks/pf.go | 4 +- storage/paths/mocks/store.go | 4 +- storage/pipeline/cbor_gen.go | 8 +- storage/pipeline/commit_batch.go | 6 +- storage/pipeline/commit_batch_test.go | 2 +- storage/pipeline/fsm_events.go | 2 +- storage/pipeline/mocks/api.go | 8 +- storage/pipeline/mocks/mock_commit_batcher.go | 6 +- .../pipeline/mocks/mock_precommit_batcher.go | 4 +- storage/pipeline/precommit_batch.go | 11 +- storage/pipeline/precommit_batch_test.go | 2 +- storage/pipeline/sealing.go | 2 +- storage/pipeline/states_failed.go | 2 +- storage/pipeline/states_replica_update.go | 2 +- storage/pipeline/states_sealing.go | 10 +- storage/pipeline/types.go | 2 +- storage/sealer/cbor_gen.go | 3 +- storage/wdpost/wdpost_changehandler.go | 2 +- storage/wdpost/wdpost_changehandler_test.go | 2 +- storage/wdpost/wdpost_journal.go | 2 +- storage/wdpost/wdpost_run.go | 2 +- storage/wdpost/wdpost_run_faults.go | 2 +- storage/wdpost/wdpost_run_test.go | 5 +- storage/wdpost/wdpost_sched.go | 2 +- 262 files changed, 3930 insertions(+), 1370 deletions(-) create mode 100644 chain/actors/builtin/account/v9.go create mode 100644 chain/actors/builtin/cron/v9.go create mode 100644 chain/actors/builtin/init/v9.go create mode 100644 chain/actors/builtin/market/v9.go create mode 100644 chain/actors/builtin/miner/v9.go create mode 100644 chain/actors/builtin/multisig/message9.go create mode 100644 chain/actors/builtin/multisig/v9.go create mode 100644 chain/actors/builtin/paych/message9.go create mode 100644 chain/actors/builtin/paych/v9.go create mode 100644 chain/actors/builtin/power/v9.go create mode 100644 chain/actors/builtin/registry.go create mode 100644 chain/actors/builtin/registry.go.template create mode 100644 chain/actors/builtin/reward/v9.go create mode 100644 chain/actors/builtin/system/v9.go create mode 100644 chain/actors/builtin/verifreg/v9.go diff --git a/api/api_full.go b/api/api_full.go index 2c98eaa53..155601fc8 100644 --- a/api/api_full.go +++ b/api/api_full.go @@ -18,8 +18,8 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-state-types/builtin/v8/market" - "github.com/filecoin-project/go-state-types/builtin/v8/miner" "github.com/filecoin-project/go-state-types/builtin/v8/paych" + "github.com/filecoin-project/go-state-types/builtin/v9/miner" "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/go-state-types/dline" abinetwork "github.com/filecoin-project/go-state-types/network" diff --git a/api/api_gateway.go b/api/api_gateway.go index 7d84e807c..b95299493 100644 --- a/api/api_gateway.go +++ b/api/api_gateway.go @@ -8,7 +8,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/builtin/v8/miner" + "github.com/filecoin-project/go-state-types/builtin/v9/miner" "github.com/filecoin-project/go-state-types/dline" apitypes "github.com/filecoin-project/lotus/api/types" diff --git a/api/api_storage.go b/api/api_storage.go index 4d05419d6..1caf459d6 100644 --- a/api/api_storage.go +++ b/api/api_storage.go @@ -18,7 +18,7 @@ import ( "github.com/filecoin-project/go-jsonrpc/auth" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/builtin/v8/market" - "github.com/filecoin-project/go-state-types/builtin/v8/miner" + "github.com/filecoin-project/go-state-types/builtin/v9/miner" abinetwork "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/lotus/chain/actors/builtin" diff --git a/api/cbor_gen.go b/api/cbor_gen.go index 66655fd75..40982779e 100644 --- a/api/cbor_gen.go +++ b/api/cbor_gen.go @@ -8,13 +8,12 @@ import ( "math" "sort" - cid "github.com/ipfs/go-cid" - cbg "github.com/whyrusleeping/cbor-gen" - xerrors "golang.org/x/xerrors" - abi "github.com/filecoin-project/go-state-types/abi" market "github.com/filecoin-project/go-state-types/builtin/v8/market" paych "github.com/filecoin-project/go-state-types/builtin/v8/paych" + cid "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + xerrors "golang.org/x/xerrors" ) var _ = xerrors.Errorf diff --git a/api/mocks/mock_full.go b/api/mocks/mock_full.go index 2640d6032..fd2d5520c 100644 --- a/api/mocks/mock_full.go +++ b/api/mocks/mock_full.go @@ -10,6 +10,25 @@ import ( reflect "reflect" time "time" + address "github.com/filecoin-project/go-address" + bitfield "github.com/filecoin-project/go-bitfield" + datatransfer "github.com/filecoin-project/go-data-transfer" + retrievalmarket "github.com/filecoin-project/go-fil-markets/retrievalmarket" + auth "github.com/filecoin-project/go-jsonrpc/auth" + abi "github.com/filecoin-project/go-state-types/abi" + big "github.com/filecoin-project/go-state-types/big" + paych "github.com/filecoin-project/go-state-types/builtin/v8/paych" + miner "github.com/filecoin-project/go-state-types/builtin/v9/miner" + crypto "github.com/filecoin-project/go-state-types/crypto" + dline "github.com/filecoin-project/go-state-types/dline" + network "github.com/filecoin-project/go-state-types/network" + api "github.com/filecoin-project/lotus/api" + apitypes "github.com/filecoin-project/lotus/api/types" + miner0 "github.com/filecoin-project/lotus/chain/actors/builtin/miner" + types "github.com/filecoin-project/lotus/chain/types" + alerting "github.com/filecoin-project/lotus/journal/alerting" + dtypes "github.com/filecoin-project/lotus/node/modules/dtypes" + imports "github.com/filecoin-project/lotus/node/repo/imports" gomock "github.com/golang/mock/gomock" uuid "github.com/google/uuid" blocks "github.com/ipfs/go-block-format" @@ -18,27 +37,6 @@ import ( network0 "github.com/libp2p/go-libp2p/core/network" peer "github.com/libp2p/go-libp2p/core/peer" protocol "github.com/libp2p/go-libp2p/core/protocol" - - address "github.com/filecoin-project/go-address" - bitfield "github.com/filecoin-project/go-bitfield" - datatransfer "github.com/filecoin-project/go-data-transfer" - retrievalmarket "github.com/filecoin-project/go-fil-markets/retrievalmarket" - auth "github.com/filecoin-project/go-jsonrpc/auth" - abi "github.com/filecoin-project/go-state-types/abi" - big "github.com/filecoin-project/go-state-types/big" - miner "github.com/filecoin-project/go-state-types/builtin/v8/miner" - paych "github.com/filecoin-project/go-state-types/builtin/v8/paych" - crypto "github.com/filecoin-project/go-state-types/crypto" - dline "github.com/filecoin-project/go-state-types/dline" - network "github.com/filecoin-project/go-state-types/network" - - api "github.com/filecoin-project/lotus/api" - apitypes "github.com/filecoin-project/lotus/api/types" - miner0 "github.com/filecoin-project/lotus/chain/actors/builtin/miner" - types "github.com/filecoin-project/lotus/chain/types" - alerting "github.com/filecoin-project/lotus/journal/alerting" - dtypes "github.com/filecoin-project/lotus/node/modules/dtypes" - imports "github.com/filecoin-project/lotus/node/repo/imports" ) // MockFullNode is a mock of FullNode interface. diff --git a/api/proxy_gen.go b/api/proxy_gen.go index 4c428d2b9..ce8f27b6b 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -7,15 +7,6 @@ import ( "encoding/json" "time" - "github.com/google/uuid" - blocks "github.com/ipfs/go-block-format" - "github.com/ipfs/go-cid" - "github.com/libp2p/go-libp2p/core/metrics" - "github.com/libp2p/go-libp2p/core/network" - "github.com/libp2p/go-libp2p/core/peer" - "github.com/libp2p/go-libp2p/core/protocol" - "golang.org/x/xerrors" - "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-bitfield" datatransfer "github.com/filecoin-project/go-data-transfer" @@ -24,13 +15,12 @@ import ( "github.com/filecoin-project/go-fil-markets/storagemarket" "github.com/filecoin-project/go-jsonrpc/auth" "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/builtin/v8/miner" "github.com/filecoin-project/go-state-types/builtin/v8/paych" + "github.com/filecoin-project/go-state-types/builtin/v9/miner" "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/go-state-types/dline" abinetwork "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/go-state-types/proof" - apitypes "github.com/filecoin-project/lotus/api/types" "github.com/filecoin-project/lotus/chain/actors/builtin" lminer "github.com/filecoin-project/lotus/chain/actors/builtin/miner" @@ -42,6 +32,14 @@ import ( "github.com/filecoin-project/lotus/storage/sealer/fsutil" "github.com/filecoin-project/lotus/storage/sealer/sealtasks" "github.com/filecoin-project/lotus/storage/sealer/storiface" + "github.com/google/uuid" + blocks "github.com/ipfs/go-block-format" + "github.com/ipfs/go-cid" + "github.com/libp2p/go-libp2p/core/metrics" + "github.com/libp2p/go-libp2p/core/network" + "github.com/libp2p/go-libp2p/core/peer" + "github.com/libp2p/go-libp2p/core/protocol" + "golang.org/x/xerrors" ) var ErrNotSupported = xerrors.New("method not supported") diff --git a/api/v0api/full.go b/api/v0api/full.go index cca358ada..3600663b4 100644 --- a/api/v0api/full.go +++ b/api/v0api/full.go @@ -14,8 +14,8 @@ import ( "github.com/filecoin-project/go-fil-markets/retrievalmarket" "github.com/filecoin-project/go-fil-markets/storagemarket" "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/builtin/v8/miner" "github.com/filecoin-project/go-state-types/builtin/v8/paych" + "github.com/filecoin-project/go-state-types/builtin/v9/miner" "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/go-state-types/dline" abinetwork "github.com/filecoin-project/go-state-types/network" diff --git a/api/v0api/gateway.go b/api/v0api/gateway.go index ab374b59c..bd55917c7 100644 --- a/api/v0api/gateway.go +++ b/api/v0api/gateway.go @@ -8,7 +8,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/builtin/v8/miner" + "github.com/filecoin-project/go-state-types/builtin/v9/miner" "github.com/filecoin-project/go-state-types/dline" abinetwork "github.com/filecoin-project/go-state-types/network" diff --git a/api/v0api/proxy_gen.go b/api/v0api/proxy_gen.go index b568fe156..3d4744fce 100644 --- a/api/v0api/proxy_gen.go +++ b/api/v0api/proxy_gen.go @@ -5,23 +5,17 @@ package v0api import ( "context" - blocks "github.com/ipfs/go-block-format" - "github.com/ipfs/go-cid" - "github.com/libp2p/go-libp2p/core/peer" - "golang.org/x/xerrors" - "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-bitfield" datatransfer "github.com/filecoin-project/go-data-transfer" "github.com/filecoin-project/go-fil-markets/retrievalmarket" "github.com/filecoin-project/go-fil-markets/storagemarket" "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/builtin/v8/miner" "github.com/filecoin-project/go-state-types/builtin/v8/paych" + "github.com/filecoin-project/go-state-types/builtin/v9/miner" "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/go-state-types/dline" abinetwork "github.com/filecoin-project/go-state-types/network" - "github.com/filecoin-project/lotus/api" apitypes "github.com/filecoin-project/lotus/api/types" lminer "github.com/filecoin-project/lotus/chain/actors/builtin/miner" @@ -29,6 +23,10 @@ import ( marketevents "github.com/filecoin-project/lotus/markets/loggers" "github.com/filecoin-project/lotus/node/modules/dtypes" "github.com/filecoin-project/lotus/node/repo/imports" + blocks "github.com/ipfs/go-block-format" + "github.com/ipfs/go-cid" + "github.com/libp2p/go-libp2p/core/peer" + "golang.org/x/xerrors" ) var ErrNotSupported = xerrors.New("method not supported") diff --git a/api/v0api/v0mocks/mock_full.go b/api/v0api/v0mocks/mock_full.go index 7dc9c0d63..4f65c0672 100644 --- a/api/v0api/v0mocks/mock_full.go +++ b/api/v0api/v0mocks/mock_full.go @@ -9,15 +9,6 @@ import ( reflect "reflect" time "time" - gomock "github.com/golang/mock/gomock" - uuid "github.com/google/uuid" - blocks "github.com/ipfs/go-block-format" - cid "github.com/ipfs/go-cid" - metrics "github.com/libp2p/go-libp2p/core/metrics" - network0 "github.com/libp2p/go-libp2p/core/network" - peer "github.com/libp2p/go-libp2p/core/peer" - protocol "github.com/libp2p/go-libp2p/core/protocol" - address "github.com/filecoin-project/go-address" bitfield "github.com/filecoin-project/go-bitfield" datatransfer "github.com/filecoin-project/go-data-transfer" @@ -26,12 +17,11 @@ import ( auth "github.com/filecoin-project/go-jsonrpc/auth" abi "github.com/filecoin-project/go-state-types/abi" big "github.com/filecoin-project/go-state-types/big" - miner "github.com/filecoin-project/go-state-types/builtin/v8/miner" paych "github.com/filecoin-project/go-state-types/builtin/v8/paych" + miner "github.com/filecoin-project/go-state-types/builtin/v9/miner" crypto "github.com/filecoin-project/go-state-types/crypto" dline "github.com/filecoin-project/go-state-types/dline" network "github.com/filecoin-project/go-state-types/network" - api "github.com/filecoin-project/lotus/api" apitypes "github.com/filecoin-project/lotus/api/types" v0api "github.com/filecoin-project/lotus/api/v0api" @@ -41,6 +31,14 @@ import ( marketevents "github.com/filecoin-project/lotus/markets/loggers" dtypes "github.com/filecoin-project/lotus/node/modules/dtypes" imports "github.com/filecoin-project/lotus/node/repo/imports" + gomock "github.com/golang/mock/gomock" + uuid "github.com/google/uuid" + blocks "github.com/ipfs/go-block-format" + cid "github.com/ipfs/go-cid" + metrics "github.com/libp2p/go-libp2p/core/metrics" + network0 "github.com/libp2p/go-libp2p/core/network" + peer "github.com/libp2p/go-libp2p/core/peer" + protocol "github.com/libp2p/go-libp2p/core/protocol" ) // MockFullNode is a mock of FullNode interface. diff --git a/api/v0api/v1_wrapper.go b/api/v0api/v1_wrapper.go index d2b58ccb8..f58b0420f 100644 --- a/api/v0api/v1_wrapper.go +++ b/api/v0api/v1_wrapper.go @@ -12,7 +12,7 @@ import ( "github.com/filecoin-project/go-fil-markets/storagemarket" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" - "github.com/filecoin-project/go-state-types/builtin/v8/miner" + "github.com/filecoin-project/go-state-types/builtin/v9/miner" "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/lotus/api" diff --git a/build/builtin_actors.go b/build/builtin_actors.go index ba61fc70e..4d283919e 100644 --- a/build/builtin_actors.go +++ b/build/builtin_actors.go @@ -18,6 +18,8 @@ import ( "github.com/ipld/go-car" "golang.org/x/xerrors" + actorstypes "github.com/filecoin-project/go-state-types/actors" + "github.com/filecoin-project/lotus/blockstore" "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/adt" @@ -28,14 +30,14 @@ var embeddedBuiltinActorReleases embed.FS func init() { if BundleOverrides == nil { - BundleOverrides = make(map[actors.Version]string) + BundleOverrides = make(map[actorstypes.Version]string) } for _, av := range actors.Versions { path := os.Getenv(fmt.Sprintf("LOTUS_BUILTIN_ACTORS_V%d_BUNDLE", av)) if path == "" { continue } - BundleOverrides[actors.Version(av)] = path + BundleOverrides[actorstypes.Version(av)] = path } if err := loadManifests(NetworkBundle); err != nil { panic(err) @@ -55,7 +57,7 @@ func UseNetworkBundle(netw string) error { } func loadManifests(netw string) error { - overridden := make(map[actors.Version]struct{}) + overridden := make(map[actorstypes.Version]struct{}) var newMetadata []*BuiltinActorsMetadata // First, prefer overrides. for av, path := range BundleOverrides { @@ -94,7 +96,7 @@ func loadManifests(netw string) error { type BuiltinActorsMetadata struct { Network string - Version actors.Version + Version actorstypes.Version ManifestCid cid.Cid Actors map[string]cid.Cid } @@ -182,7 +184,7 @@ func readEmbeddedBuiltinActorsMetadata(bundle string) ([]*BuiltinActorsMetadata, } bundles = append(bundles, &BuiltinActorsMetadata{ Network: name, - Version: actors.Version(version), + Version: actorstypes.Version(version), ManifestCid: root, Actors: actorCids, }) @@ -229,7 +231,7 @@ func readBundleManifest(r io.Reader) (cid.Cid, map[string]cid.Cid, error) { } // GetEmbeddedBuiltinActorsBundle returns the builtin-actors bundle for the given actors version. -func GetEmbeddedBuiltinActorsBundle(version actors.Version) ([]byte, bool) { +func GetEmbeddedBuiltinActorsBundle(version actorstypes.Version) ([]byte, bool) { fi, err := embeddedBuiltinActorReleases.Open(fmt.Sprintf("actors/v%d.tar.zst", version)) if err != nil { return nil, false diff --git a/build/builtin_actors_test.go b/build/builtin_actors_test.go index 7a5c0936d..489f0ad7d 100644 --- a/build/builtin_actors_test.go +++ b/build/builtin_actors_test.go @@ -5,6 +5,8 @@ import ( "github.com/stretchr/testify/require" + actorstypes "github.com/filecoin-project/go-state-types/actors" + "github.com/filecoin-project/lotus/build" "github.com/filecoin-project/lotus/chain/actors" ) @@ -19,16 +21,16 @@ func TestEmbeddedMetadata(t *testing.T) { // Test that we're registering the manifest correctly. func TestRegistration(t *testing.T) { - manifestCid, found := actors.GetManifest(actors.Version8) + manifestCid, found := actors.GetManifest(actorstypes.Version8) require.True(t, found) require.True(t, manifestCid.Defined()) for _, key := range actors.GetBuiltinActorsKeys() { - actorCid, found := actors.GetActorCodeID(actors.Version8, key) + actorCid, found := actors.GetActorCodeID(actorstypes.Version8, key) require.True(t, found) name, version, found := actors.GetActorMetaByCode(actorCid) require.True(t, found) - require.Equal(t, actors.Version8, version) + require.Equal(t, actorstypes.Version8, version) require.Equal(t, key, name) } } diff --git a/build/params_2k.go b/build/params_2k.go index 476d4fba1..aaab3f835 100644 --- a/build/params_2k.go +++ b/build/params_2k.go @@ -10,9 +10,9 @@ import ( "github.com/ipfs/go-cid" "github.com/filecoin-project/go-state-types/abi" + actorstypes "github.com/filecoin-project/go-state-types/actors" "github.com/filecoin-project/go-state-types/network" - "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/policy" ) @@ -20,7 +20,7 @@ const BootstrappersFile = "" const GenesisFile = "" var NetworkBundle = "devnet" -var BundleOverrides map[actors.Version]string +var BundleOverrides map[actorstypes.Version]string const GenesisNetworkVersion = network.Version16 @@ -56,6 +56,8 @@ var UpgradeOhSnapHeight = abi.ChainEpoch(-18) var UpgradeSkyrHeight = abi.ChainEpoch(-19) +var UpgradeV17Height = abi.ChainEpoch(99999999999999) + var DrandSchedule = map[abi.ChainEpoch]DrandEnum{ 0: DrandMainnet, } @@ -107,6 +109,7 @@ func init() { UpgradeChocolateHeight = getUpgradeHeight("LOTUS_CHOCOLATE_HEIGHT", UpgradeChocolateHeight) UpgradeOhSnapHeight = getUpgradeHeight("LOTUS_OHSNAP_HEIGHT", UpgradeOhSnapHeight) UpgradeSkyrHeight = getUpgradeHeight("LOTUS_SKYR_HEIGHT", UpgradeSkyrHeight) + UpgradeV17Height = getUpgradeHeight("LOTUS_V17_HEIGHT", UpgradeV17Height) BuildType |= Build2k diff --git a/build/params_butterfly.go b/build/params_butterfly.go index f43c30778..59318a1c3 100644 --- a/build/params_butterfly.go +++ b/build/params_butterfly.go @@ -8,10 +8,10 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" + actorstypes "github.com/filecoin-project/go-state-types/actors" "github.com/filecoin-project/go-state-types/network" builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" - "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/policy" ) @@ -19,10 +19,10 @@ var DrandSchedule = map[abi.ChainEpoch]DrandEnum{ 0: DrandMainnet, } -const GenesisNetworkVersion = network.Version15 +const GenesisNetworkVersion = network.Version16 var NetworkBundle = "butterflynet" -var BundleOverrides map[actors.Version]string +var BundleOverrides map[actorstypes.Version]string const BootstrappersFile = "butterflynet.pi" const GenesisFile = "butterflynet.car" @@ -47,10 +47,9 @@ const UpgradeNorwegianHeight = -14 const UpgradeTurboHeight = -15 const UpgradeHyperdriveHeight = -16 const UpgradeChocolateHeight = -17 - const UpgradeOhSnapHeight = -18 - -const UpgradeSkyrHeight = abi.ChainEpoch(50) +const UpgradeSkyrHeight = -19 +const UpgradeV17Height = abi.ChainEpoch(99999999999999) var SupportedProofTypes = []abi.RegisteredSealProof{ abi.RegisteredSealProof_StackedDrg512MiBV1, diff --git a/build/params_calibnet.go b/build/params_calibnet.go index 9ecfc048d..eeb707fca 100644 --- a/build/params_calibnet.go +++ b/build/params_calibnet.go @@ -8,10 +8,10 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" + actorstypes "github.com/filecoin-project/go-state-types/actors" "github.com/filecoin-project/go-state-types/network" builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" - "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/policy" ) @@ -22,7 +22,7 @@ var DrandSchedule = map[abi.ChainEpoch]DrandEnum{ const GenesisNetworkVersion = network.Version0 var NetworkBundle = "calibrationnet" -var BundleOverrides map[actors.Version]string +var BundleOverrides map[actorstypes.Version]string const BootstrappersFile = "calibnet.pi" const GenesisFile = "calibnet.car" @@ -66,6 +66,8 @@ const UpgradeOhSnapHeight = 682006 // 2022-06-16T17:30:00Z const UpgradeSkyrHeight = 1044660 +var UpgradeV17Height = abi.ChainEpoch(99999999999999) + var SupportedProofTypes = []abi.RegisteredSealProof{ abi.RegisteredSealProof_StackedDrg32GiBV1, abi.RegisteredSealProof_StackedDrg64GiBV1, diff --git a/build/params_interop.go b/build/params_interop.go index f3af7aed4..2e089dcd6 100644 --- a/build/params_interop.go +++ b/build/params_interop.go @@ -11,20 +11,20 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" + actorstypes "github.com/filecoin-project/go-state-types/actors" "github.com/filecoin-project/go-state-types/network" builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" - "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/policy" ) var NetworkBundle = "caterpillarnet" -var BundleOverrides map[actors.Version]string +var BundleOverrides map[actorstypes.Version]string const BootstrappersFile = "interopnet.pi" const GenesisFile = "interopnet.car" -const GenesisNetworkVersion = network.Version15 +const GenesisNetworkVersion = network.Version16 var UpgradeBreezeHeight = abi.ChainEpoch(-1) @@ -34,26 +34,22 @@ var UpgradeSmokeHeight = abi.ChainEpoch(-1) var UpgradeIgnitionHeight = abi.ChainEpoch(-2) var UpgradeRefuelHeight = abi.ChainEpoch(-3) var UpgradeTapeHeight = abi.ChainEpoch(-4) - var UpgradeAssemblyHeight = abi.ChainEpoch(-5) var UpgradeLiftoffHeight = abi.ChainEpoch(-6) - var UpgradeKumquatHeight = abi.ChainEpoch(-7) var UpgradeCalicoHeight = abi.ChainEpoch(-9) var UpgradePersianHeight = abi.ChainEpoch(-10) var UpgradeOrangeHeight = abi.ChainEpoch(-11) var UpgradeClausHeight = abi.ChainEpoch(-12) - var UpgradeTrustHeight = abi.ChainEpoch(-13) - var UpgradeNorwegianHeight = abi.ChainEpoch(-14) - var UpgradeTurboHeight = abi.ChainEpoch(-15) - var UpgradeHyperdriveHeight = abi.ChainEpoch(-16) var UpgradeChocolateHeight = abi.ChainEpoch(-17) var UpgradeOhSnapHeight = abi.ChainEpoch(-18) -var UpgradeSkyrHeight = abi.ChainEpoch(100) +var UpgradeSkyrHeight = abi.ChainEpoch(-19) + +const UpgradeV17Height = abi.ChainEpoch(99999999999999) var DrandSchedule = map[abi.ChainEpoch]DrandEnum{ 0: DrandMainnet, @@ -107,6 +103,7 @@ func init() { UpgradeChocolateHeight = getUpgradeHeight("LOTUS_CHOCOLATE_HEIGHT", UpgradeChocolateHeight) UpgradeOhSnapHeight = getUpgradeHeight("LOTUS_OHSNAP_HEIGHT", UpgradeOhSnapHeight) UpgradeSkyrHeight = getUpgradeHeight("LOTUS_SKYR_HEIGHT", UpgradeSkyrHeight) + UpgradeV17Height = getUpgradeHeight("LOTUS_V17_HEIGHT", UpgradeV17Height) BuildType |= BuildInteropnet SetAddressNetwork(address.Testnet) diff --git a/build/params_mainnet.go b/build/params_mainnet.go index 7a532c174..a681d4c59 100644 --- a/build/params_mainnet.go +++ b/build/params_mainnet.go @@ -9,10 +9,9 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" + actorstypes "github.com/filecoin-project/go-state-types/actors" "github.com/filecoin-project/go-state-types/network" builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" - - "github.com/filecoin-project/lotus/chain/actors" ) var DrandSchedule = map[abi.ChainEpoch]DrandEnum{ @@ -23,7 +22,7 @@ var DrandSchedule = map[abi.ChainEpoch]DrandEnum{ var NetworkBundle = "mainnet" // NOTE: DO NOT change this unless you REALLY know what you're doing. This is consensus critical. -var BundleOverrides map[actors.Version]string +var BundleOverrides map[actorstypes.Version]string const GenesisNetworkVersion = network.Version0 @@ -77,7 +76,9 @@ const UpgradeChocolateHeight = 1231620 const UpgradeOhSnapHeight = 1594680 // 2022-07-06T14:00:00Z -var UpgradeSkyrHeight = abi.ChainEpoch(1960320) +const UpgradeSkyrHeight = 1960320 + +var UpgradeV17Height = abi.ChainEpoch(99999999999999) var SupportedProofTypes = []abi.RegisteredSealProof{ abi.RegisteredSealProof_StackedDrg32GiBV1, @@ -92,8 +93,8 @@ func init() { SetAddressNetwork(address.Mainnet) } - if os.Getenv("LOTUS_DISABLE_SKYR") == "1" { - UpgradeSkyrHeight = math.MaxInt64 + if os.Getenv("LOTUS_DISABLE_V17") == "1" { + UpgradeV17Height = math.MaxInt64 } Devnet = false diff --git a/build/params_shared_vals.go b/build/params_shared_vals.go index 6f59189a6..a77feb9d8 100644 --- a/build/params_shared_vals.go +++ b/build/params_shared_vals.go @@ -33,7 +33,7 @@ const NewestNetworkVersion = network.Version{{.latestNetworkVersion}} /* inline-gen start */ -const NewestNetworkVersion = network.Version16 +const NewestNetworkVersion = network.Version17 /* inline-gen end */ diff --git a/build/params_testground.go b/build/params_testground.go index 9d708781d..bcbc32b94 100644 --- a/build/params_testground.go +++ b/build/params_testground.go @@ -13,10 +13,10 @@ import ( "github.com/ipfs/go-cid" "github.com/filecoin-project/go-state-types/abi" + actorstypes "github.com/filecoin-project/go-state-types/actors" "github.com/filecoin-project/go-state-types/network" builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" - "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/policy" ) @@ -107,6 +107,7 @@ var ( UpgradeChocolateHeight abi.ChainEpoch = -16 UpgradeOhSnapHeight abi.ChainEpoch = -17 UpgradeSkyrHeight abi.ChainEpoch = -18 + UpgradeV17Height abi.ChainEpoch = -19 DrandSchedule = map[abi.ChainEpoch]DrandEnum{ 0: DrandMainnet, @@ -114,10 +115,10 @@ var ( GenesisNetworkVersion = network.Version0 NetworkBundle = "devnet" - BundleOverrides map[actors.Version]string + BundleOverrides map[actorstypes.Version]string - NewestNetworkVersion = network.Version15 - ActorUpgradeNetworkVersion = network.Version15 + NewestNetworkVersion = network.Version16 + ActorUpgradeNetworkVersion = network.Version16 Devnet = true ZeroAddress = MustParseAddress("f3yaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaby2smx7a") diff --git a/chain/actors/actor_cids.go b/chain/actors/actor_cids.go index 9612983dc..598d3d8f7 100644 --- a/chain/actors/actor_cids.go +++ b/chain/actors/actor_cids.go @@ -4,6 +4,7 @@ import ( "github.com/ipfs/go-cid" "golang.org/x/xerrors" + actorstypes "github.com/filecoin-project/go-state-types/actors" builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" @@ -14,10 +15,10 @@ import ( ) // GetActorCodeID looks up a builtin actor's code CID by actor version and canonical actor name. -func GetActorCodeID(av Version, name string) (cid.Cid, bool) { +func GetActorCodeID(av actorstypes.Version, name string) (cid.Cid, bool) { // Actors V8 and above - if av >= Version8 { + if av >= actorstypes.Version8 { if cids, ok := GetActorCodeIDsFromManifest(av); ok { c, ok := cids[name] return c, ok @@ -30,275 +31,275 @@ func GetActorCodeID(av Version, name string) (cid.Cid, bool) { case AccountKey: switch av { - case Version0: + case actorstypes.Version0: return builtin0.AccountActorCodeID, true - case Version2: + case actorstypes.Version2: return builtin2.AccountActorCodeID, true - case Version3: + case actorstypes.Version3: return builtin3.AccountActorCodeID, true - case Version4: + case actorstypes.Version4: return builtin4.AccountActorCodeID, true - case Version5: + case actorstypes.Version5: return builtin5.AccountActorCodeID, true - case Version6: + case actorstypes.Version6: return builtin6.AccountActorCodeID, true - case Version7: + case actorstypes.Version7: return builtin7.AccountActorCodeID, true } case CronKey: switch av { - case Version0: + case actorstypes.Version0: return builtin0.CronActorCodeID, true - case Version2: + case actorstypes.Version2: return builtin2.CronActorCodeID, true - case Version3: + case actorstypes.Version3: return builtin3.CronActorCodeID, true - case Version4: + case actorstypes.Version4: return builtin4.CronActorCodeID, true - case Version5: + case actorstypes.Version5: return builtin5.CronActorCodeID, true - case Version6: + case actorstypes.Version6: return builtin6.CronActorCodeID, true - case Version7: + case actorstypes.Version7: return builtin7.CronActorCodeID, true } case InitKey: switch av { - case Version0: + case actorstypes.Version0: return builtin0.InitActorCodeID, true - case Version2: + case actorstypes.Version2: return builtin2.InitActorCodeID, true - case Version3: + case actorstypes.Version3: return builtin3.InitActorCodeID, true - case Version4: + case actorstypes.Version4: return builtin4.InitActorCodeID, true - case Version5: + case actorstypes.Version5: return builtin5.InitActorCodeID, true - case Version6: + case actorstypes.Version6: return builtin6.InitActorCodeID, true - case Version7: + case actorstypes.Version7: return builtin7.InitActorCodeID, true } case MarketKey: switch av { - case Version0: + case actorstypes.Version0: return builtin0.StorageMarketActorCodeID, true - case Version2: + case actorstypes.Version2: return builtin2.StorageMarketActorCodeID, true - case Version3: + case actorstypes.Version3: return builtin3.StorageMarketActorCodeID, true - case Version4: + case actorstypes.Version4: return builtin4.StorageMarketActorCodeID, true - case Version5: + case actorstypes.Version5: return builtin5.StorageMarketActorCodeID, true - case Version6: + case actorstypes.Version6: return builtin6.StorageMarketActorCodeID, true - case Version7: + case actorstypes.Version7: return builtin7.StorageMarketActorCodeID, true } case MinerKey: switch av { - case Version0: + case actorstypes.Version0: return builtin0.StorageMinerActorCodeID, true - case Version2: + case actorstypes.Version2: return builtin2.StorageMinerActorCodeID, true - case Version3: + case actorstypes.Version3: return builtin3.StorageMinerActorCodeID, true - case Version4: + case actorstypes.Version4: return builtin4.StorageMinerActorCodeID, true - case Version5: + case actorstypes.Version5: return builtin5.StorageMinerActorCodeID, true - case Version6: + case actorstypes.Version6: return builtin6.StorageMinerActorCodeID, true - case Version7: + case actorstypes.Version7: return builtin7.StorageMinerActorCodeID, true } case MultisigKey: switch av { - case Version0: + case actorstypes.Version0: return builtin0.MultisigActorCodeID, true - case Version2: + case actorstypes.Version2: return builtin2.MultisigActorCodeID, true - case Version3: + case actorstypes.Version3: return builtin3.MultisigActorCodeID, true - case Version4: + case actorstypes.Version4: return builtin4.MultisigActorCodeID, true - case Version5: + case actorstypes.Version5: return builtin5.MultisigActorCodeID, true - case Version6: + case actorstypes.Version6: return builtin6.MultisigActorCodeID, true - case Version7: + case actorstypes.Version7: return builtin7.MultisigActorCodeID, true } case PaychKey: switch av { - case Version0: + case actorstypes.Version0: return builtin0.PaymentChannelActorCodeID, true - case Version2: + case actorstypes.Version2: return builtin2.PaymentChannelActorCodeID, true - case Version3: + case actorstypes.Version3: return builtin3.PaymentChannelActorCodeID, true - case Version4: + case actorstypes.Version4: return builtin4.PaymentChannelActorCodeID, true - case Version5: + case actorstypes.Version5: return builtin5.PaymentChannelActorCodeID, true - case Version6: + case actorstypes.Version6: return builtin6.PaymentChannelActorCodeID, true - case Version7: + case actorstypes.Version7: return builtin7.PaymentChannelActorCodeID, true } case PowerKey: switch av { - case Version0: + case actorstypes.Version0: return builtin0.StoragePowerActorCodeID, true - case Version2: + case actorstypes.Version2: return builtin2.StoragePowerActorCodeID, true - case Version3: + case actorstypes.Version3: return builtin3.StoragePowerActorCodeID, true - case Version4: + case actorstypes.Version4: return builtin4.StoragePowerActorCodeID, true - case Version5: + case actorstypes.Version5: return builtin5.StoragePowerActorCodeID, true - case Version6: + case actorstypes.Version6: return builtin6.StoragePowerActorCodeID, true - case Version7: + case actorstypes.Version7: return builtin7.StoragePowerActorCodeID, true } case RewardKey: switch av { - case Version0: + case actorstypes.Version0: return builtin0.RewardActorCodeID, true - case Version2: + case actorstypes.Version2: return builtin2.RewardActorCodeID, true - case Version3: + case actorstypes.Version3: return builtin3.RewardActorCodeID, true - case Version4: + case actorstypes.Version4: return builtin4.RewardActorCodeID, true - case Version5: + case actorstypes.Version5: return builtin5.RewardActorCodeID, true - case Version6: + case actorstypes.Version6: return builtin6.RewardActorCodeID, true - case Version7: + case actorstypes.Version7: return builtin7.RewardActorCodeID, true } case SystemKey: switch av { - case Version0: + case actorstypes.Version0: return builtin0.SystemActorCodeID, true - case Version2: + case actorstypes.Version2: return builtin2.SystemActorCodeID, true - case Version3: + case actorstypes.Version3: return builtin3.SystemActorCodeID, true - case Version4: + case actorstypes.Version4: return builtin4.SystemActorCodeID, true - case Version5: + case actorstypes.Version5: return builtin5.SystemActorCodeID, true - case Version6: + case actorstypes.Version6: return builtin6.SystemActorCodeID, true - case Version7: + case actorstypes.Version7: return builtin7.SystemActorCodeID, true } case VerifregKey: switch av { - case Version0: + case actorstypes.Version0: return builtin0.VerifiedRegistryActorCodeID, true - case Version2: + case actorstypes.Version2: return builtin2.VerifiedRegistryActorCodeID, true - case Version3: + case actorstypes.Version3: return builtin3.VerifiedRegistryActorCodeID, true - case Version4: + case actorstypes.Version4: return builtin4.VerifiedRegistryActorCodeID, true - case Version5: + case actorstypes.Version5: return builtin5.VerifiedRegistryActorCodeID, true - case Version6: + case actorstypes.Version6: return builtin6.VerifiedRegistryActorCodeID, true - case Version7: + case actorstypes.Version7: return builtin7.VerifiedRegistryActorCodeID, true } } @@ -307,7 +308,7 @@ func GetActorCodeID(av Version, name string) (cid.Cid, bool) { } // GetActorCodeIDs looks up all builtin actor's code CIDs by actor version. -func GetActorCodeIDs(av Version) (map[string]cid.Cid, error) { +func GetActorCodeIDs(av actorstypes.Version) (map[string]cid.Cid, error) { cids, ok := GetActorCodeIDsFromManifest(av) if ok { return cids, nil diff --git a/chain/actors/agen/main.go b/chain/actors/agen/main.go index ba88c54d1..bb2ca8bd3 100644 --- a/chain/actors/agen/main.go +++ b/chain/actors/agen/main.go @@ -44,6 +44,11 @@ func main() { fmt.Println(err) return } + + if err := generateRegistry("chain/actors/builtin/registry.go"); err != nil { + fmt.Println(err) + return + } } func generateAdapters() error { @@ -108,8 +113,9 @@ func generateState(actDir string) error { var b bytes.Buffer err := tpl.Execute(&b, map[string]interface{}{ - "v": version, - "import": getVersionImports()[version], + "v": version, + "import": getVersionImports()[version], + "latestVersion": lotusactors.LatestVersion, }) if err != nil { return err @@ -139,8 +145,9 @@ func generateMessages(actDir string) error { var b bytes.Buffer err := tpl.Execute(&b, map[string]interface{}{ - "v": version, - "import": getVersionImports()[version], + "v": version, + "import": getVersionImports()[version], + "latestVersion": lotusactors.LatestVersion, }) if err != nil { return err @@ -216,6 +223,36 @@ func generateBuiltin(builtinPath string) error { return nil } +func generateRegistry(registryPath string) error { + + bf, err := ioutil.ReadFile(registryPath + ".template") + if err != nil { + if os.IsNotExist(err) { + return nil // skip + } + + return xerrors.Errorf("loading builtin template file: %w", err) + } + + tpl := template.Must(template.New("").Funcs(template.FuncMap{ + "import": func(v int) string { return getVersionImports()[v] }, + }).Parse(string(bf))) + var b bytes.Buffer + + err = tpl.Execute(&b, map[string]interface{}{ + "versions": lotusactors.Versions, + }) + if err != nil { + return err + } + + if err := ioutil.WriteFile(registryPath, b.Bytes(), 0666); err != nil { + return err + } + + return nil +} + func getVersionImports() map[int]string { versionImports := make(map[int]string, lotusactors.LatestVersion) for _, v := range lotusactors.Versions { diff --git a/chain/actors/builtin/account/account.go b/chain/actors/builtin/account/account.go index f233f173c..64aef1588 100644 --- a/chain/actors/builtin/account/account.go +++ b/chain/actors/builtin/account/account.go @@ -1,25 +1,34 @@ package account import ( + actorstypes "github.com/filecoin-project/go-state-types/actors" + "github.com/filecoin-project/lotus/chain/actors" "golang.org/x/xerrors" "github.com/filecoin-project/go-address" - builtin8 "github.com/filecoin-project/go-state-types/builtin" "github.com/filecoin-project/go-state-types/cbor" - builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" - builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" - builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" - builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" - builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" - builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" - builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" - "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/types" + + builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" + + builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" + + builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" + + builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" + + builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" + + builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + + builtin9 "github.com/filecoin-project/go-state-types/builtin" ) -var Methods = builtin8.MethodsAccount +var Methods = builtin9.MethodsAccount func Load(store adt.Store, act *types.Actor) (State, error) { if name, av, ok := actors.GetActorMetaByCode(act.Code); ok { @@ -29,9 +38,12 @@ func Load(store adt.Store, act *types.Actor) (State, error) { switch av { - case actors.Version8: + case actorstypes.Version8: return load8(store, act.Head) + case actorstypes.Version9: + return load9(store, act.Head) + } } @@ -63,33 +75,36 @@ func Load(store adt.Store, act *types.Actor) (State, error) { return nil, xerrors.Errorf("unknown actor code %s", act.Code) } -func MakeState(store adt.Store, av actors.Version, addr address.Address) (State, error) { +func MakeState(store adt.Store, av actorstypes.Version, addr address.Address) (State, error) { switch av { - case actors.Version0: + case actorstypes.Version0: return make0(store, addr) - case actors.Version2: + case actorstypes.Version2: return make2(store, addr) - case actors.Version3: + case actorstypes.Version3: return make3(store, addr) - case actors.Version4: + case actorstypes.Version4: return make4(store, addr) - case actors.Version5: + case actorstypes.Version5: return make5(store, addr) - case actors.Version6: + case actorstypes.Version6: return make6(store, addr) - case actors.Version7: + case actorstypes.Version7: return make7(store, addr) - case actors.Version8: + case actorstypes.Version8: return make8(store, addr) + case actorstypes.Version9: + return make9(store, addr) + } return nil, xerrors.Errorf("unknown actor version %d", av) } diff --git a/chain/actors/builtin/account/actor.go.template b/chain/actors/builtin/account/actor.go.template index 7aff20d42..07b4cc94b 100644 --- a/chain/actors/builtin/account/actor.go.template +++ b/chain/actors/builtin/account/actor.go.template @@ -1,6 +1,7 @@ package account import ( + actorstypes "github.com/filecoin-project/go-state-types/actors" "github.com/filecoin-project/lotus/chain/actors" "golang.org/x/xerrors" @@ -9,13 +10,13 @@ import ( "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/types" + {{range .versions}} {{if (le . 7)}} builtin{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin" - {{else}} - builtin{{.}} "github.com/filecoin-project/go-state-types/builtin" {{end}} {{end}} + builtin{{.latestVersion}} "github.com/filecoin-project/go-state-types/builtin" ) var Methods = builtin{{.latestVersion}}.MethodsAccount @@ -29,7 +30,7 @@ func Load(store adt.Store, act *types.Actor) (State, error) { switch av { {{range .versions}} {{if (ge . 8)}} - case actors.Version{{.}}: + case actorstypes.Version{{.}}: return load{{.}}(store, act.Head) {{end}} {{end}} @@ -48,10 +49,10 @@ func Load(store adt.Store, act *types.Actor) (State, error) { return nil, xerrors.Errorf("unknown actor code %s", act.Code) } -func MakeState(store adt.Store, av actors.Version, addr address.Address) (State, error) { +func MakeState(store adt.Store, av actorstypes.Version, addr address.Address) (State, error) { switch av { {{range .versions}} - case actors.Version{{.}}: + case actorstypes.Version{{.}}: return make{{.}}(store, addr) {{end}} } diff --git a/chain/actors/builtin/account/v0.go b/chain/actors/builtin/account/v0.go index 314bd4b29..bdfca2fd7 100644 --- a/chain/actors/builtin/account/v0.go +++ b/chain/actors/builtin/account/v0.go @@ -1,12 +1,12 @@ package account import ( + "github.com/filecoin-project/go-address" "github.com/ipfs/go-cid" - "github.com/filecoin-project/go-address" - account0 "github.com/filecoin-project/specs-actors/actors/builtin/account" - "github.com/filecoin-project/lotus/chain/actors/adt" + + account0 "github.com/filecoin-project/specs-actors/actors/builtin/account" ) var _ State = (*state0)(nil) diff --git a/chain/actors/builtin/account/v2.go b/chain/actors/builtin/account/v2.go index 605065424..66618e06a 100644 --- a/chain/actors/builtin/account/v2.go +++ b/chain/actors/builtin/account/v2.go @@ -1,12 +1,12 @@ package account import ( + "github.com/filecoin-project/go-address" "github.com/ipfs/go-cid" - "github.com/filecoin-project/go-address" - account2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/account" - "github.com/filecoin-project/lotus/chain/actors/adt" + + account2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/account" ) var _ State = (*state2)(nil) diff --git a/chain/actors/builtin/account/v3.go b/chain/actors/builtin/account/v3.go index d070476ea..dbe100a4f 100644 --- a/chain/actors/builtin/account/v3.go +++ b/chain/actors/builtin/account/v3.go @@ -1,12 +1,12 @@ package account import ( + "github.com/filecoin-project/go-address" "github.com/ipfs/go-cid" - "github.com/filecoin-project/go-address" - account3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/account" - "github.com/filecoin-project/lotus/chain/actors/adt" + + account3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/account" ) var _ State = (*state3)(nil) diff --git a/chain/actors/builtin/account/v4.go b/chain/actors/builtin/account/v4.go index f4d9f7a06..53f71dcc5 100644 --- a/chain/actors/builtin/account/v4.go +++ b/chain/actors/builtin/account/v4.go @@ -1,12 +1,12 @@ package account import ( + "github.com/filecoin-project/go-address" "github.com/ipfs/go-cid" - "github.com/filecoin-project/go-address" - account4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/account" - "github.com/filecoin-project/lotus/chain/actors/adt" + + account4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/account" ) var _ State = (*state4)(nil) diff --git a/chain/actors/builtin/account/v5.go b/chain/actors/builtin/account/v5.go index 5e01ce152..538f56987 100644 --- a/chain/actors/builtin/account/v5.go +++ b/chain/actors/builtin/account/v5.go @@ -1,12 +1,12 @@ package account import ( + "github.com/filecoin-project/go-address" "github.com/ipfs/go-cid" - "github.com/filecoin-project/go-address" - account5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/account" - "github.com/filecoin-project/lotus/chain/actors/adt" + + account5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/account" ) var _ State = (*state5)(nil) diff --git a/chain/actors/builtin/account/v6.go b/chain/actors/builtin/account/v6.go index 85135dcda..a0d157ae5 100644 --- a/chain/actors/builtin/account/v6.go +++ b/chain/actors/builtin/account/v6.go @@ -1,12 +1,12 @@ package account import ( + "github.com/filecoin-project/go-address" "github.com/ipfs/go-cid" - "github.com/filecoin-project/go-address" - account6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/account" - "github.com/filecoin-project/lotus/chain/actors/adt" + + account6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/account" ) var _ State = (*state6)(nil) diff --git a/chain/actors/builtin/account/v7.go b/chain/actors/builtin/account/v7.go index 4ae979b82..883776cf8 100644 --- a/chain/actors/builtin/account/v7.go +++ b/chain/actors/builtin/account/v7.go @@ -1,12 +1,12 @@ package account import ( + "github.com/filecoin-project/go-address" "github.com/ipfs/go-cid" - "github.com/filecoin-project/go-address" - account7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/account" - "github.com/filecoin-project/lotus/chain/actors/adt" + + account7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/account" ) var _ State = (*state7)(nil) diff --git a/chain/actors/builtin/account/v8.go b/chain/actors/builtin/account/v8.go index 211deea33..d8ef52c00 100644 --- a/chain/actors/builtin/account/v8.go +++ b/chain/actors/builtin/account/v8.go @@ -1,12 +1,12 @@ package account import ( + "github.com/filecoin-project/go-address" "github.com/ipfs/go-cid" - "github.com/filecoin-project/go-address" - account8 "github.com/filecoin-project/go-state-types/builtin/v8/account" - "github.com/filecoin-project/lotus/chain/actors/adt" + + account8 "github.com/filecoin-project/go-state-types/builtin/v8/account" ) var _ State = (*state8)(nil) diff --git a/chain/actors/builtin/account/v9.go b/chain/actors/builtin/account/v9.go new file mode 100644 index 000000000..f44e192b6 --- /dev/null +++ b/chain/actors/builtin/account/v9.go @@ -0,0 +1,40 @@ +package account + +import ( + "github.com/filecoin-project/go-address" + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/lotus/chain/actors/adt" + + account9 "github.com/filecoin-project/go-state-types/builtin/v9/account" +) + +var _ State = (*state9)(nil) + +func load9(store adt.Store, root cid.Cid) (State, error) { + out := state9{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make9(store adt.Store, addr address.Address) (State, error) { + out := state9{store: store} + out.State = account9.State{Address: addr} + return &out, nil +} + +type state9 struct { + account9.State + store adt.Store +} + +func (s *state9) PubkeyAddress() (address.Address, error) { + return s.Address, nil +} + +func (s *state9) GetState() interface{} { + return &s.State +} diff --git a/chain/actors/builtin/builtin.go b/chain/actors/builtin/builtin.go index fb95a28d6..c80215c61 100644 --- a/chain/actors/builtin/builtin.go +++ b/chain/actors/builtin/builtin.go @@ -3,24 +3,31 @@ package builtin import ( "fmt" + "github.com/filecoin-project/go-address" "github.com/ipfs/go-cid" - "github.com/filecoin-project/go-address" + builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" + + builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" + + builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" + + builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" + + builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" + + builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/builtin" - miner8 "github.com/filecoin-project/go-state-types/builtin/v8/miner" - smoothingtypes "github.com/filecoin-project/go-state-types/builtin/v8/util/smoothing" "github.com/filecoin-project/go-state-types/proof" - builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" - builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" - builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" - builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" - builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" - builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" - builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" - builtin8 "github.com/filecoin-project/specs-actors/v8/actors/builtin" "github.com/filecoin-project/lotus/chain/actors" + + miner9 "github.com/filecoin-project/go-state-types/builtin/v8/miner" + smoothingtypes "github.com/filecoin-project/go-state-types/builtin/v8/util/smoothing" ) var SystemActorAddr = builtin.SystemActorAddr @@ -53,7 +60,7 @@ type PoStProof = proof.PoStProof type FilterEstimate = smoothingtypes.FilterEstimate func QAPowerForWeight(size abi.SectorSize, duration abi.ChainEpoch, dealWeight, verifiedWeight abi.DealWeight) abi.StoragePower { - return miner8.QAPowerForWeight(size, duration, dealWeight, verifiedWeight) + return miner9.QAPowerForWeight(size, duration, dealWeight, verifiedWeight) } func ActorNameByCode(c cid.Cid) string { @@ -84,9 +91,6 @@ func ActorNameByCode(c cid.Cid) string { case builtin7.IsBuiltinActor(c): return builtin7.ActorNameByCode(c) - case builtin8.IsBuiltinActor(c): - return builtin8.ActorNameByCode(c) - default: return "" } diff --git a/chain/actors/builtin/builtin.go.template b/chain/actors/builtin/builtin.go.template index d536eff36..5dcdbbafa 100644 --- a/chain/actors/builtin/builtin.go.template +++ b/chain/actors/builtin/builtin.go.template @@ -7,7 +7,9 @@ import ( "github.com/ipfs/go-cid" {{range .versions}} + {{if (le . 7)}} builtin{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin" + {{end}} {{end}} "github.com/filecoin-project/go-state-types/abi" @@ -60,8 +62,10 @@ func ActorNameByCode(c cid.Cid) string { switch { {{range .versions}} + {{if (le . 7)}} case builtin{{.}}.IsBuiltinActor(c): return builtin{{.}}.ActorNameByCode(c) + {{end}} {{end}} default: return "" diff --git a/chain/actors/builtin/cron/actor.go.template b/chain/actors/builtin/cron/actor.go.template index fb70f314a..67c781fb2 100644 --- a/chain/actors/builtin/cron/actor.go.template +++ b/chain/actors/builtin/cron/actor.go.template @@ -1,6 +1,7 @@ package cron import ( + actorstypes "github.com/filecoin-project/go-state-types/actors" "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/adt" "golang.org/x/xerrors" @@ -9,10 +10,9 @@ import ( {{range .versions}} {{if (le . 7)}} builtin{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin" - {{else}} - builtin{{.}} "github.com/filecoin-project/go-state-types/builtin" {{end}} {{end}} + builtin{{.latestVersion}} "github.com/filecoin-project/go-state-types/builtin" ) func Load(store adt.Store, act *types.Actor) (State, error) { @@ -24,7 +24,7 @@ func Load(store adt.Store, act *types.Actor) (State, error) { switch av { {{range .versions}} {{if (ge . 8)}} - case actors.Version{{.}}: + case actorstypes.Version{{.}}: return load{{.}}(store, act.Head) {{end}} {{end}} @@ -43,10 +43,10 @@ func Load(store adt.Store, act *types.Actor) (State, error) { return nil, xerrors.Errorf("unknown actor code %s", act.Code) } -func MakeState(store adt.Store, av actors.Version) (State, error) { +func MakeState(store adt.Store, av actorstypes.Version) (State, error) { switch av { {{range .versions}} - case actors.Version{{.}}: + case actorstypes.Version{{.}}: return make{{.}}(store) {{end}} } diff --git a/chain/actors/builtin/cron/cron.go b/chain/actors/builtin/cron/cron.go index 00264e3b4..165059aa4 100644 --- a/chain/actors/builtin/cron/cron.go +++ b/chain/actors/builtin/cron/cron.go @@ -1,20 +1,27 @@ package cron import ( - "golang.org/x/xerrors" - - builtin8 "github.com/filecoin-project/go-state-types/builtin" - builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" - builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" - builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" - builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" - builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" - builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" - builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" - + actorstypes "github.com/filecoin-project/go-state-types/actors" "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/types" + "golang.org/x/xerrors" + + builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" + + builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" + + builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" + + builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" + + builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" + + builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + + builtin9 "github.com/filecoin-project/go-state-types/builtin" ) func Load(store adt.Store, act *types.Actor) (State, error) { @@ -25,9 +32,12 @@ func Load(store adt.Store, act *types.Actor) (State, error) { switch av { - case actors.Version8: + case actorstypes.Version8: return load8(store, act.Head) + case actorstypes.Version9: + return load9(store, act.Head) + } } @@ -59,40 +69,43 @@ func Load(store adt.Store, act *types.Actor) (State, error) { return nil, xerrors.Errorf("unknown actor code %s", act.Code) } -func MakeState(store adt.Store, av actors.Version) (State, error) { +func MakeState(store adt.Store, av actorstypes.Version) (State, error) { switch av { - case actors.Version0: + case actorstypes.Version0: return make0(store) - case actors.Version2: + case actorstypes.Version2: return make2(store) - case actors.Version3: + case actorstypes.Version3: return make3(store) - case actors.Version4: + case actorstypes.Version4: return make4(store) - case actors.Version5: + case actorstypes.Version5: return make5(store) - case actors.Version6: + case actorstypes.Version6: return make6(store) - case actors.Version7: + case actorstypes.Version7: return make7(store) - case actors.Version8: + case actorstypes.Version8: return make8(store) + case actorstypes.Version9: + return make9(store) + } return nil, xerrors.Errorf("unknown actor version %d", av) } var ( - Address = builtin8.CronActorAddr - Methods = builtin8.MethodsCron + Address = builtin9.CronActorAddr + Methods = builtin9.MethodsCron ) type State interface { diff --git a/chain/actors/builtin/cron/v0.go b/chain/actors/builtin/cron/v0.go index baa81aac3..6147b858c 100644 --- a/chain/actors/builtin/cron/v0.go +++ b/chain/actors/builtin/cron/v0.go @@ -3,9 +3,9 @@ package cron import ( "github.com/ipfs/go-cid" - cron0 "github.com/filecoin-project/specs-actors/actors/builtin/cron" - "github.com/filecoin-project/lotus/chain/actors/adt" + + cron0 "github.com/filecoin-project/specs-actors/actors/builtin/cron" ) var _ State = (*state0)(nil) diff --git a/chain/actors/builtin/cron/v2.go b/chain/actors/builtin/cron/v2.go index d6ee35935..51ca179d9 100644 --- a/chain/actors/builtin/cron/v2.go +++ b/chain/actors/builtin/cron/v2.go @@ -3,9 +3,9 @@ package cron import ( "github.com/ipfs/go-cid" - cron2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/cron" - "github.com/filecoin-project/lotus/chain/actors/adt" + + cron2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/cron" ) var _ State = (*state2)(nil) diff --git a/chain/actors/builtin/cron/v3.go b/chain/actors/builtin/cron/v3.go index 356d385cd..ff74d511d 100644 --- a/chain/actors/builtin/cron/v3.go +++ b/chain/actors/builtin/cron/v3.go @@ -3,9 +3,9 @@ package cron import ( "github.com/ipfs/go-cid" - cron3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/cron" - "github.com/filecoin-project/lotus/chain/actors/adt" + + cron3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/cron" ) var _ State = (*state3)(nil) diff --git a/chain/actors/builtin/cron/v4.go b/chain/actors/builtin/cron/v4.go index 3db3c95aa..1cff8cc28 100644 --- a/chain/actors/builtin/cron/v4.go +++ b/chain/actors/builtin/cron/v4.go @@ -3,9 +3,9 @@ package cron import ( "github.com/ipfs/go-cid" - cron4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/cron" - "github.com/filecoin-project/lotus/chain/actors/adt" + + cron4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/cron" ) var _ State = (*state4)(nil) diff --git a/chain/actors/builtin/cron/v5.go b/chain/actors/builtin/cron/v5.go index 5d99af1fd..2bb00dc21 100644 --- a/chain/actors/builtin/cron/v5.go +++ b/chain/actors/builtin/cron/v5.go @@ -3,9 +3,9 @@ package cron import ( "github.com/ipfs/go-cid" - cron5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/cron" - "github.com/filecoin-project/lotus/chain/actors/adt" + + cron5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/cron" ) var _ State = (*state5)(nil) diff --git a/chain/actors/builtin/cron/v6.go b/chain/actors/builtin/cron/v6.go index c86cd6c42..8bbadd79f 100644 --- a/chain/actors/builtin/cron/v6.go +++ b/chain/actors/builtin/cron/v6.go @@ -3,9 +3,9 @@ package cron import ( "github.com/ipfs/go-cid" - cron6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/cron" - "github.com/filecoin-project/lotus/chain/actors/adt" + + cron6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/cron" ) var _ State = (*state6)(nil) diff --git a/chain/actors/builtin/cron/v7.go b/chain/actors/builtin/cron/v7.go index db9f8f9e2..e5538c89f 100644 --- a/chain/actors/builtin/cron/v7.go +++ b/chain/actors/builtin/cron/v7.go @@ -3,9 +3,9 @@ package cron import ( "github.com/ipfs/go-cid" - cron7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/cron" - "github.com/filecoin-project/lotus/chain/actors/adt" + + cron7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/cron" ) var _ State = (*state7)(nil) diff --git a/chain/actors/builtin/cron/v8.go b/chain/actors/builtin/cron/v8.go index 00567acf9..00b22fcbf 100644 --- a/chain/actors/builtin/cron/v8.go +++ b/chain/actors/builtin/cron/v8.go @@ -3,9 +3,9 @@ package cron import ( "github.com/ipfs/go-cid" - cron8 "github.com/filecoin-project/go-state-types/builtin/v8/cron" - "github.com/filecoin-project/lotus/chain/actors/adt" + + cron8 "github.com/filecoin-project/go-state-types/builtin/v8/cron" ) var _ State = (*state8)(nil) diff --git a/chain/actors/builtin/cron/v9.go b/chain/actors/builtin/cron/v9.go new file mode 100644 index 000000000..94530e181 --- /dev/null +++ b/chain/actors/builtin/cron/v9.go @@ -0,0 +1,35 @@ +package cron + +import ( + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/lotus/chain/actors/adt" + + cron9 "github.com/filecoin-project/go-state-types/builtin/v9/cron" +) + +var _ State = (*state9)(nil) + +func load9(store adt.Store, root cid.Cid) (State, error) { + out := state9{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make9(store adt.Store) (State, error) { + out := state9{store: store} + out.State = *cron9.ConstructState(cron9.BuiltInEntries()) + return &out, nil +} + +type state9 struct { + cron9.State + store adt.Store +} + +func (s *state9) GetState() interface{} { + return &s.State +} diff --git a/chain/actors/builtin/init/actor.go.template b/chain/actors/builtin/init/actor.go.template index e27c66fbb..43bb70c4c 100644 --- a/chain/actors/builtin/init/actor.go.template +++ b/chain/actors/builtin/init/actor.go.template @@ -1,6 +1,7 @@ package init import ( + actorstypes "github.com/filecoin-project/go-state-types/actors" "github.com/filecoin-project/lotus/chain/actors" "golang.org/x/xerrors" @@ -15,10 +16,9 @@ import ( {{range .versions}} {{if (le . 7)}} builtin{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin" - {{else}} - builtin{{.}} "github.com/filecoin-project/go-state-types/builtin" {{end}} {{end}} + builtin{{.latestVersion}} "github.com/filecoin-project/go-state-types/builtin" ) var ( @@ -35,7 +35,7 @@ func Load(store adt.Store, act *types.Actor) (State, error) { switch av { {{range .versions}} {{if (ge . 8)}} - case actors.Version{{.}}: + case actorstypes.Version{{.}}: return load{{.}}(store, act.Head) {{end}} {{end}} @@ -54,10 +54,10 @@ func Load(store adt.Store, act *types.Actor) (State, error) { return nil, xerrors.Errorf("unknown actor code %s", act.Code) } -func MakeState(store adt.Store, av actors.Version, networkName string) (State, error) { +func MakeState(store adt.Store, av actorstypes.Version, networkName string) (State, error) { switch av { {{range .versions}} - case actors.Version{{.}}: + case actorstypes.Version{{.}}: return make{{.}}(store, networkName) {{end}} } diff --git a/chain/actors/builtin/init/init.go b/chain/actors/builtin/init/init.go index c7e0f7b82..10cac5e35 100644 --- a/chain/actors/builtin/init/init.go +++ b/chain/actors/builtin/init/init.go @@ -1,30 +1,39 @@ package init import ( - "github.com/ipfs/go-cid" + actorstypes "github.com/filecoin-project/go-state-types/actors" + "github.com/filecoin-project/lotus/chain/actors" "golang.org/x/xerrors" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - builtin8 "github.com/filecoin-project/go-state-types/builtin" "github.com/filecoin-project/go-state-types/cbor" - builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" - builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" - builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" - builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" - builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" - builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" - builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + "github.com/ipfs/go-cid" - "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/node/modules/dtypes" + + builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" + + builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" + + builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" + + builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" + + builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" + + builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + + builtin9 "github.com/filecoin-project/go-state-types/builtin" ) var ( - Address = builtin8.InitActorAddr - Methods = builtin8.MethodsInit + Address = builtin9.InitActorAddr + Methods = builtin9.MethodsInit ) func Load(store adt.Store, act *types.Actor) (State, error) { @@ -35,9 +44,12 @@ func Load(store adt.Store, act *types.Actor) (State, error) { switch av { - case actors.Version8: + case actorstypes.Version8: return load8(store, act.Head) + case actorstypes.Version9: + return load9(store, act.Head) + } } @@ -69,33 +81,36 @@ func Load(store adt.Store, act *types.Actor) (State, error) { return nil, xerrors.Errorf("unknown actor code %s", act.Code) } -func MakeState(store adt.Store, av actors.Version, networkName string) (State, error) { +func MakeState(store adt.Store, av actorstypes.Version, networkName string) (State, error) { switch av { - case actors.Version0: + case actorstypes.Version0: return make0(store, networkName) - case actors.Version2: + case actorstypes.Version2: return make2(store, networkName) - case actors.Version3: + case actorstypes.Version3: return make3(store, networkName) - case actors.Version4: + case actorstypes.Version4: return make4(store, networkName) - case actors.Version5: + case actorstypes.Version5: return make5(store, networkName) - case actors.Version6: + case actorstypes.Version6: return make6(store, networkName) - case actors.Version7: + case actorstypes.Version7: return make7(store, networkName) - case actors.Version8: + case actorstypes.Version8: return make8(store, networkName) + case actorstypes.Version9: + return make9(store, networkName) + } return nil, xerrors.Errorf("unknown actor version %d", av) } diff --git a/chain/actors/builtin/init/v0.go b/chain/actors/builtin/init/v0.go index 2f6b213c0..ddd2dab94 100644 --- a/chain/actors/builtin/init/v0.go +++ b/chain/actors/builtin/init/v0.go @@ -1,17 +1,17 @@ package init import ( + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - init0 "github.com/filecoin-project/specs-actors/actors/builtin/init" - adt0 "github.com/filecoin-project/specs-actors/actors/util/adt" - "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/node/modules/dtypes" + + init0 "github.com/filecoin-project/specs-actors/actors/builtin/init" + adt0 "github.com/filecoin-project/specs-actors/actors/util/adt" ) var _ State = (*state0)(nil) diff --git a/chain/actors/builtin/init/v2.go b/chain/actors/builtin/init/v2.go index d780a1fe9..72e2d56a5 100644 --- a/chain/actors/builtin/init/v2.go +++ b/chain/actors/builtin/init/v2.go @@ -1,17 +1,17 @@ package init import ( + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - init2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/init" - adt2 "github.com/filecoin-project/specs-actors/v2/actors/util/adt" - "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/node/modules/dtypes" + + init2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/init" + adt2 "github.com/filecoin-project/specs-actors/v2/actors/util/adt" ) var _ State = (*state2)(nil) diff --git a/chain/actors/builtin/init/v3.go b/chain/actors/builtin/init/v3.go index b2f713b1f..4609c94a3 100644 --- a/chain/actors/builtin/init/v3.go +++ b/chain/actors/builtin/init/v3.go @@ -1,18 +1,19 @@ package init import ( + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" - init3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/init" - adt3 "github.com/filecoin-project/specs-actors/v3/actors/util/adt" - "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/node/modules/dtypes" + + builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" + + init3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/init" + adt3 "github.com/filecoin-project/specs-actors/v3/actors/util/adt" ) var _ State = (*state3)(nil) diff --git a/chain/actors/builtin/init/v4.go b/chain/actors/builtin/init/v4.go index 9de02816f..dc56d1f19 100644 --- a/chain/actors/builtin/init/v4.go +++ b/chain/actors/builtin/init/v4.go @@ -1,18 +1,19 @@ package init import ( + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" - init4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/init" - adt4 "github.com/filecoin-project/specs-actors/v4/actors/util/adt" - "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/node/modules/dtypes" + + builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" + + init4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/init" + adt4 "github.com/filecoin-project/specs-actors/v4/actors/util/adt" ) var _ State = (*state4)(nil) diff --git a/chain/actors/builtin/init/v5.go b/chain/actors/builtin/init/v5.go index f9c59f83a..107366de5 100644 --- a/chain/actors/builtin/init/v5.go +++ b/chain/actors/builtin/init/v5.go @@ -1,18 +1,19 @@ package init import ( + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" - init5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/init" - adt5 "github.com/filecoin-project/specs-actors/v5/actors/util/adt" - "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/node/modules/dtypes" + + builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" + + init5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/init" + adt5 "github.com/filecoin-project/specs-actors/v5/actors/util/adt" ) var _ State = (*state5)(nil) diff --git a/chain/actors/builtin/init/v6.go b/chain/actors/builtin/init/v6.go index 494b6aaa0..a5bd9edfb 100644 --- a/chain/actors/builtin/init/v6.go +++ b/chain/actors/builtin/init/v6.go @@ -1,18 +1,19 @@ package init import ( + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" - init6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/init" - adt6 "github.com/filecoin-project/specs-actors/v6/actors/util/adt" - "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/node/modules/dtypes" + + builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + + init6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/init" + adt6 "github.com/filecoin-project/specs-actors/v6/actors/util/adt" ) var _ State = (*state6)(nil) diff --git a/chain/actors/builtin/init/v7.go b/chain/actors/builtin/init/v7.go index bc378a141..341aa52cd 100644 --- a/chain/actors/builtin/init/v7.go +++ b/chain/actors/builtin/init/v7.go @@ -1,18 +1,19 @@ package init import ( + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" - init7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/init" - adt7 "github.com/filecoin-project/specs-actors/v7/actors/util/adt" - "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/node/modules/dtypes" + + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + + init7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/init" + adt7 "github.com/filecoin-project/specs-actors/v7/actors/util/adt" ) var _ State = (*state7)(nil) diff --git a/chain/actors/builtin/init/v8.go b/chain/actors/builtin/init/v8.go index 63b058e57..919819549 100644 --- a/chain/actors/builtin/init/v8.go +++ b/chain/actors/builtin/init/v8.go @@ -1,18 +1,18 @@ package init import ( + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/lotus/chain/actors/adt" + "github.com/filecoin-project/lotus/node/modules/dtypes" + builtin8 "github.com/filecoin-project/go-state-types/builtin" init8 "github.com/filecoin-project/go-state-types/builtin/v8/init" adt8 "github.com/filecoin-project/go-state-types/builtin/v8/util/adt" - - "github.com/filecoin-project/lotus/chain/actors/adt" - "github.com/filecoin-project/lotus/node/modules/dtypes" ) var _ State = (*state8)(nil) diff --git a/chain/actors/builtin/init/v9.go b/chain/actors/builtin/init/v9.go new file mode 100644 index 000000000..e6406b2dd --- /dev/null +++ b/chain/actors/builtin/init/v9.go @@ -0,0 +1,113 @@ +package init + +import ( + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + "golang.org/x/xerrors" + + "github.com/filecoin-project/lotus/chain/actors/adt" + "github.com/filecoin-project/lotus/node/modules/dtypes" + + builtin9 "github.com/filecoin-project/go-state-types/builtin" + init9 "github.com/filecoin-project/go-state-types/builtin/v9/init" + adt9 "github.com/filecoin-project/go-state-types/builtin/v9/util/adt" +) + +var _ State = (*state9)(nil) + +func load9(store adt.Store, root cid.Cid) (State, error) { + out := state9{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make9(store adt.Store, networkName string) (State, error) { + out := state9{store: store} + + s, err := init9.ConstructState(store, networkName) + if err != nil { + return nil, err + } + + out.State = *s + + return &out, nil +} + +type state9 struct { + init9.State + store adt.Store +} + +func (s *state9) ResolveAddress(address address.Address) (address.Address, bool, error) { + return s.State.ResolveAddress(s.store, address) +} + +func (s *state9) MapAddressToNewID(address address.Address) (address.Address, error) { + return s.State.MapAddressToNewID(s.store, address) +} + +func (s *state9) ForEachActor(cb func(id abi.ActorID, address address.Address) error) error { + addrs, err := adt9.AsMap(s.store, s.State.AddressMap, builtin9.DefaultHamtBitwidth) + if err != nil { + return err + } + var actorID cbg.CborInt + return addrs.ForEach(&actorID, func(key string) error { + addr, err := address.NewFromBytes([]byte(key)) + if err != nil { + return err + } + return cb(abi.ActorID(actorID), addr) + }) +} + +func (s *state9) NetworkName() (dtypes.NetworkName, error) { + return dtypes.NetworkName(s.State.NetworkName), nil +} + +func (s *state9) SetNetworkName(name string) error { + s.State.NetworkName = name + return nil +} + +func (s *state9) SetNextID(id abi.ActorID) error { + s.State.NextID = id + return nil +} + +func (s *state9) Remove(addrs ...address.Address) (err error) { + m, err := adt9.AsMap(s.store, s.State.AddressMap, builtin9.DefaultHamtBitwidth) + if err != nil { + return err + } + for _, addr := range addrs { + if err = m.Delete(abi.AddrKey(addr)); err != nil { + return xerrors.Errorf("failed to delete entry for address: %s; err: %w", addr, err) + } + } + amr, err := m.Root() + if err != nil { + return xerrors.Errorf("failed to get address map root: %w", err) + } + s.State.AddressMap = amr + return nil +} + +func (s *state9) SetAddressMap(mcid cid.Cid) error { + s.State.AddressMap = mcid + return nil +} + +func (s *state9) AddressMap() (adt.Map, error) { + return adt9.AsMap(s.store, s.State.AddressMap, builtin9.DefaultHamtBitwidth) +} + +func (s *state9) GetState() interface{} { + return &s.State +} diff --git a/chain/actors/builtin/market/actor.go.template b/chain/actors/builtin/market/actor.go.template index 66298a18a..0b34fbf75 100644 --- a/chain/actors/builtin/market/actor.go.template +++ b/chain/actors/builtin/market/actor.go.template @@ -1,7 +1,8 @@ package market import ( - "unicode/utf8" + actorstypes "github.com/filecoin-project/go-state-types/actors" + "unicode/utf8" "github.com/filecoin-project/go-state-types/network" "golang.org/x/xerrors" @@ -12,23 +13,23 @@ import ( "github.com/filecoin-project/go-state-types/cbor" cbg "github.com/whyrusleeping/cbor-gen" - market{{.latestVersion}} "github.com/filecoin-project/go-state-types/builtin{{import .latestVersion}}market" + markettypes "github.com/filecoin-project/go-state-types/builtin/v8/market" {{range .versions}} {{if (le . 7)}} builtin{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin" - {{else}} - builtin{{.}} "github.com/filecoin-project/go-state-types/builtin" {{end}} {{end}} + builtintypes "github.com/filecoin-project/go-state-types/builtin" + "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/types" ) var ( - Address = builtin{{.latestVersion}}.StorageMarketActorAddr - Methods = builtin{{.latestVersion}}.MethodsMarket + Address = builtintypes.StorageMarketActorAddr + Methods = builtintypes.MethodsMarket ) func Load(store adt.Store, act *types.Actor) (State, error) { @@ -40,7 +41,7 @@ func Load(store adt.Store, act *types.Actor) (State, error) { switch av { {{range .versions}} {{if (ge . 8)}} - case actors.Version{{.}}: + case actorstypes.Version{{.}}: return load{{.}}(store, act.Head) {{end}} {{end}} @@ -59,10 +60,10 @@ func Load(store adt.Store, act *types.Actor) (State, error) { return nil, xerrors.Errorf("unknown actor code %s", act.Code) } -func MakeState(store adt.Store, av actors.Version) (State, error) { +func MakeState(store adt.Store, av actorstypes.Version) (State, error) { switch av { {{range .versions}} - case actors.Version{{.}}: + case actorstypes.Version{{.}}: return make{{.}}(store) {{end}} } @@ -100,11 +101,11 @@ type DealStates interface { } type DealProposals interface { - ForEach(cb func(id abi.DealID, dp market{{.latestVersion}}.DealProposal) error) error - Get(id abi.DealID) (*market{{.latestVersion}}.DealProposal, bool, error) + ForEach(cb func(id abi.DealID, dp markettypes.DealProposal) error) error + Get(id abi.DealID) (*markettypes.DealProposal, bool, error) array() adt.Array - decode(*cbg.Deferred) (*market{{.latestVersion}}.DealProposal, error) + decode(*cbg.Deferred) (*markettypes.DealProposal, error) } @@ -115,23 +116,24 @@ type PublishStorageDealsReturn interface { } func DecodePublishStorageDealsReturn(b []byte, nv network.Version) (PublishStorageDealsReturn, error) { - av, err := actors.VersionForNetwork(nv) + av, err := actorstypes.VersionForNetwork(nv) if err != nil { return nil, err } switch av { {{range .versions}} - case actors.Version{{.}}: + case actorstypes.Version{{.}}: return decodePublishStorageDealsReturn{{.}}(b) {{end}} } return nil, xerrors.Errorf("unknown actor version %d", av) } -type DealProposal = market{{.latestVersion}}.DealProposal +type DealProposal = markettypes.DealProposal +type DealLabel = markettypes.DealLabel -type DealState = market{{.latestVersion}}.DealState +type DealState = markettypes.DealState type DealStateChanges struct { Added []DealIDState @@ -158,7 +160,7 @@ type DealProposalChanges struct { type ProposalIDState struct { ID abi.DealID - Proposal market{{.latestVersion}}.DealProposal + Proposal markettypes.DealProposal } func EmptyDealState() *DealState { @@ -170,7 +172,7 @@ func EmptyDealState() *DealState { } // returns the earned fees and pending fees for a given deal -func GetDealFees(deal market{{.latestVersion}}.DealProposal, height abi.ChainEpoch) (abi.TokenAmount, abi.TokenAmount) { +func GetDealFees(deal markettypes.DealProposal, height abi.ChainEpoch) (abi.TokenAmount, abi.TokenAmount) { tf := big.Mul(deal.StoragePricePerEpoch, big.NewInt(int64(deal.EndEpoch-deal.StartEpoch))) ef := big.Mul(deal.StoragePricePerEpoch, big.NewInt(int64(height-deal.StartEpoch))) @@ -185,14 +187,14 @@ func GetDealFees(deal market{{.latestVersion}}.DealProposal, height abi.ChainEpo return ef, big.Sub(tf, ef) } -func IsDealActive(state market{{.latestVersion}}.DealState) bool { +func IsDealActive(state markettypes.DealState) bool { return state.SectorStartEpoch > -1 && state.SlashEpoch == -1 } -func labelFromGoString(s string) (market{{.latestVersion}}.DealLabel, error) { +func labelFromGoString(s string) (markettypes.DealLabel, error) { if utf8.ValidString(s) { - return market{{.latestVersion}}.NewLabelFromString(s) + return markettypes.NewLabelFromString(s) } else { - return market{{.latestVersion}}.NewLabelFromBytes([]byte(s)) + return markettypes.NewLabelFromBytes([]byte(s)) } } diff --git a/chain/actors/builtin/market/market.go b/chain/actors/builtin/market/market.go index 8c0e4e91a..4c5d67aad 100644 --- a/chain/actors/builtin/market/market.go +++ b/chain/actors/builtin/market/market.go @@ -1,34 +1,44 @@ package market import ( + actorstypes "github.com/filecoin-project/go-state-types/actors" "unicode/utf8" - cbg "github.com/whyrusleeping/cbor-gen" + "github.com/filecoin-project/go-state-types/network" "golang.org/x/xerrors" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" - builtin8 "github.com/filecoin-project/go-state-types/builtin" - market8 "github.com/filecoin-project/go-state-types/builtin/v8/market" "github.com/filecoin-project/go-state-types/cbor" - "github.com/filecoin-project/go-state-types/network" + cbg "github.com/whyrusleeping/cbor-gen" + + markettypes "github.com/filecoin-project/go-state-types/builtin/v8/market" + builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" + builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" + builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" + builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" + builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" + builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + builtintypes "github.com/filecoin-project/go-state-types/builtin" + "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/types" ) var ( - Address = builtin8.StorageMarketActorAddr - Methods = builtin8.MethodsMarket + Address = builtintypes.StorageMarketActorAddr + Methods = builtintypes.MethodsMarket ) func Load(store adt.Store, act *types.Actor) (State, error) { @@ -39,9 +49,12 @@ func Load(store adt.Store, act *types.Actor) (State, error) { switch av { - case actors.Version8: + case actorstypes.Version8: return load8(store, act.Head) + case actorstypes.Version9: + return load9(store, act.Head) + } } @@ -73,33 +86,36 @@ func Load(store adt.Store, act *types.Actor) (State, error) { return nil, xerrors.Errorf("unknown actor code %s", act.Code) } -func MakeState(store adt.Store, av actors.Version) (State, error) { +func MakeState(store adt.Store, av actorstypes.Version) (State, error) { switch av { - case actors.Version0: + case actorstypes.Version0: return make0(store) - case actors.Version2: + case actorstypes.Version2: return make2(store) - case actors.Version3: + case actorstypes.Version3: return make3(store) - case actors.Version4: + case actorstypes.Version4: return make4(store) - case actors.Version5: + case actorstypes.Version5: return make5(store) - case actors.Version6: + case actorstypes.Version6: return make6(store) - case actors.Version7: + case actorstypes.Version7: return make7(store) - case actors.Version8: + case actorstypes.Version8: return make8(store) + case actorstypes.Version9: + return make9(store) + } return nil, xerrors.Errorf("unknown actor version %d", av) } @@ -135,11 +151,11 @@ type DealStates interface { } type DealProposals interface { - ForEach(cb func(id abi.DealID, dp market8.DealProposal) error) error - Get(id abi.DealID) (*market8.DealProposal, bool, error) + ForEach(cb func(id abi.DealID, dp markettypes.DealProposal) error) error + Get(id abi.DealID) (*markettypes.DealProposal, bool, error) array() adt.Array - decode(*cbg.Deferred) (*market8.DealProposal, error) + decode(*cbg.Deferred) (*markettypes.DealProposal, error) } type PublishStorageDealsReturn interface { @@ -149,44 +165,48 @@ type PublishStorageDealsReturn interface { } func DecodePublishStorageDealsReturn(b []byte, nv network.Version) (PublishStorageDealsReturn, error) { - av, err := actors.VersionForNetwork(nv) + av, err := actorstypes.VersionForNetwork(nv) if err != nil { return nil, err } switch av { - case actors.Version0: + case actorstypes.Version0: return decodePublishStorageDealsReturn0(b) - case actors.Version2: + case actorstypes.Version2: return decodePublishStorageDealsReturn2(b) - case actors.Version3: + case actorstypes.Version3: return decodePublishStorageDealsReturn3(b) - case actors.Version4: + case actorstypes.Version4: return decodePublishStorageDealsReturn4(b) - case actors.Version5: + case actorstypes.Version5: return decodePublishStorageDealsReturn5(b) - case actors.Version6: + case actorstypes.Version6: return decodePublishStorageDealsReturn6(b) - case actors.Version7: + case actorstypes.Version7: return decodePublishStorageDealsReturn7(b) - case actors.Version8: + case actorstypes.Version8: return decodePublishStorageDealsReturn8(b) + case actorstypes.Version9: + return decodePublishStorageDealsReturn9(b) + } return nil, xerrors.Errorf("unknown actor version %d", av) } -type DealProposal = market8.DealProposal +type DealProposal = markettypes.DealProposal +type DealLabel = markettypes.DealLabel -type DealState = market8.DealState +type DealState = markettypes.DealState type DealStateChanges struct { Added []DealIDState @@ -213,7 +233,7 @@ type DealProposalChanges struct { type ProposalIDState struct { ID abi.DealID - Proposal market8.DealProposal + Proposal markettypes.DealProposal } func EmptyDealState() *DealState { @@ -225,7 +245,7 @@ func EmptyDealState() *DealState { } // returns the earned fees and pending fees for a given deal -func GetDealFees(deal market8.DealProposal, height abi.ChainEpoch) (abi.TokenAmount, abi.TokenAmount) { +func GetDealFees(deal markettypes.DealProposal, height abi.ChainEpoch) (abi.TokenAmount, abi.TokenAmount) { tf := big.Mul(deal.StoragePricePerEpoch, big.NewInt(int64(deal.EndEpoch-deal.StartEpoch))) ef := big.Mul(deal.StoragePricePerEpoch, big.NewInt(int64(height-deal.StartEpoch))) @@ -240,14 +260,14 @@ func GetDealFees(deal market8.DealProposal, height abi.ChainEpoch) (abi.TokenAmo return ef, big.Sub(tf, ef) } -func IsDealActive(state market8.DealState) bool { +func IsDealActive(state markettypes.DealState) bool { return state.SectorStartEpoch > -1 && state.SlashEpoch == -1 } -func labelFromGoString(s string) (market8.DealLabel, error) { +func labelFromGoString(s string) (markettypes.DealLabel, error) { if utf8.ValidString(s) { - return market8.NewLabelFromString(s) + return markettypes.NewLabelFromString(s) } else { - return market8.NewLabelFromBytes([]byte(s)) + return markettypes.NewLabelFromBytes([]byte(s)) } } diff --git a/chain/actors/builtin/market/state.go.template b/chain/actors/builtin/market/state.go.template index 1ed2fc4fc..475381e82 100644 --- a/chain/actors/builtin/market/state.go.template +++ b/chain/actors/builtin/market/state.go.template @@ -22,6 +22,7 @@ import ( adt{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/util/adt" {{else}} market{{.v}} "github.com/filecoin-project/go-state-types/builtin{{.import}}market" + markettypes "github.com/filecoin-project/go-state-types/builtin/v8/market" adt{{.v}} "github.com/filecoin-project/go-state-types/builtin/v8/util/adt" {{end}} ) @@ -258,12 +259,12 @@ func (s *dealProposals{{.v}}) array() adt.Array { func fromV{{.v}}DealProposal(v{{.v}} market{{.v}}.DealProposal) (DealProposal, error) { {{if (le .v 7)}} label, err := labelFromGoString(v{{.v}}.Label) - if err != nil { - return DealProposal{}, xerrors.Errorf("error setting deal label: %w", err) - } {{else}} - label := v{{.v}}.Label + label, err := fromV{{.v}}Label(v{{.v}}.Label) {{end}} + if err != nil { + return DealProposal{}, xerrors.Errorf("error setting deal label: %w", err) + } return DealProposal{ PieceCID: v{{.v}}.PieceCID, @@ -283,6 +284,25 @@ func fromV{{.v}}DealProposal(v{{.v}} market{{.v}}.DealProposal) (DealProposal, e }, nil } +{{if (ge .v 8)}} + func fromV{{.v}}Label(v{{.v}} market{{.v}}.DealLabel) (DealLabel, error) { + if v{{.v}}.IsString() { + str, err := v{{.v}}.ToString() + if err != nil { + return markettypes.EmptyDealLabel, xerrors.Errorf("failed to convert string label to string: %w", err) + } + return markettypes.NewLabelFromString(str) + } + + bs, err := v{{.v}}.ToBytes() + if err != nil { + return markettypes.EmptyDealLabel, xerrors.Errorf("failed to convert bytes label to bytes: %w", err) + } + return markettypes.NewLabelFromBytes(bs) + } +{{end}} + + func (s *state{{.v}}) GetState() interface{} { return &s.State diff --git a/chain/actors/builtin/market/v0.go b/chain/actors/builtin/market/v0.go index 38e92f12d..9ede96cd9 100644 --- a/chain/actors/builtin/market/v0.go +++ b/chain/actors/builtin/market/v0.go @@ -3,17 +3,17 @@ package market import ( "bytes" + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - market0 "github.com/filecoin-project/specs-actors/actors/builtin/market" - adt0 "github.com/filecoin-project/specs-actors/actors/util/adt" - "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/types" + + market0 "github.com/filecoin-project/specs-actors/actors/builtin/market" + adt0 "github.com/filecoin-project/specs-actors/actors/util/adt" ) var _ State = (*state0)(nil) @@ -241,6 +241,7 @@ func (s *dealProposals0) array() adt.Array { func fromV0DealProposal(v0 market0.DealProposal) (DealProposal, error) { label, err := labelFromGoString(v0.Label) + if err != nil { return DealProposal{}, xerrors.Errorf("error setting deal label: %w", err) } diff --git a/chain/actors/builtin/market/v2.go b/chain/actors/builtin/market/v2.go index 5a399e68c..6de3a3a6d 100644 --- a/chain/actors/builtin/market/v2.go +++ b/chain/actors/builtin/market/v2.go @@ -3,17 +3,17 @@ package market import ( "bytes" + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - market2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/market" - adt2 "github.com/filecoin-project/specs-actors/v2/actors/util/adt" - "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/types" + + market2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/market" + adt2 "github.com/filecoin-project/specs-actors/v2/actors/util/adt" ) var _ State = (*state2)(nil) @@ -241,6 +241,7 @@ func (s *dealProposals2) array() adt.Array { func fromV2DealProposal(v2 market2.DealProposal) (DealProposal, error) { label, err := labelFromGoString(v2.Label) + if err != nil { return DealProposal{}, xerrors.Errorf("error setting deal label: %w", err) } diff --git a/chain/actors/builtin/market/v3.go b/chain/actors/builtin/market/v3.go index a953429fc..bd2ca7b0c 100644 --- a/chain/actors/builtin/market/v3.go +++ b/chain/actors/builtin/market/v3.go @@ -3,17 +3,17 @@ package market import ( "bytes" + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - market3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/market" - adt3 "github.com/filecoin-project/specs-actors/v3/actors/util/adt" - "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/types" + + market3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/market" + adt3 "github.com/filecoin-project/specs-actors/v3/actors/util/adt" ) var _ State = (*state3)(nil) @@ -236,6 +236,7 @@ func (s *dealProposals3) array() adt.Array { func fromV3DealProposal(v3 market3.DealProposal) (DealProposal, error) { label, err := labelFromGoString(v3.Label) + if err != nil { return DealProposal{}, xerrors.Errorf("error setting deal label: %w", err) } diff --git a/chain/actors/builtin/market/v4.go b/chain/actors/builtin/market/v4.go index 8e6b3cd34..11f62a5f4 100644 --- a/chain/actors/builtin/market/v4.go +++ b/chain/actors/builtin/market/v4.go @@ -3,17 +3,17 @@ package market import ( "bytes" + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - market4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/market" - adt4 "github.com/filecoin-project/specs-actors/v4/actors/util/adt" - "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/types" + + market4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/market" + adt4 "github.com/filecoin-project/specs-actors/v4/actors/util/adt" ) var _ State = (*state4)(nil) @@ -236,6 +236,7 @@ func (s *dealProposals4) array() adt.Array { func fromV4DealProposal(v4 market4.DealProposal) (DealProposal, error) { label, err := labelFromGoString(v4.Label) + if err != nil { return DealProposal{}, xerrors.Errorf("error setting deal label: %w", err) } diff --git a/chain/actors/builtin/market/v5.go b/chain/actors/builtin/market/v5.go index 5cf904e04..378bc23bb 100644 --- a/chain/actors/builtin/market/v5.go +++ b/chain/actors/builtin/market/v5.go @@ -3,17 +3,17 @@ package market import ( "bytes" + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - market5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/market" - adt5 "github.com/filecoin-project/specs-actors/v5/actors/util/adt" - "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/types" + + market5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/market" + adt5 "github.com/filecoin-project/specs-actors/v5/actors/util/adt" ) var _ State = (*state5)(nil) @@ -236,6 +236,7 @@ func (s *dealProposals5) array() adt.Array { func fromV5DealProposal(v5 market5.DealProposal) (DealProposal, error) { label, err := labelFromGoString(v5.Label) + if err != nil { return DealProposal{}, xerrors.Errorf("error setting deal label: %w", err) } diff --git a/chain/actors/builtin/market/v6.go b/chain/actors/builtin/market/v6.go index 03862ac09..6c1b6c497 100644 --- a/chain/actors/builtin/market/v6.go +++ b/chain/actors/builtin/market/v6.go @@ -3,19 +3,20 @@ package market import ( "bytes" + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-bitfield" rlepluslazy "github.com/filecoin-project/go-bitfield/rle" - "github.com/filecoin-project/go-state-types/abi" - market6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/market" - adt6 "github.com/filecoin-project/specs-actors/v6/actors/util/adt" "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/types" + + market6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/market" + adt6 "github.com/filecoin-project/specs-actors/v6/actors/util/adt" ) var _ State = (*state6)(nil) @@ -238,6 +239,7 @@ func (s *dealProposals6) array() adt.Array { func fromV6DealProposal(v6 market6.DealProposal) (DealProposal, error) { label, err := labelFromGoString(v6.Label) + if err != nil { return DealProposal{}, xerrors.Errorf("error setting deal label: %w", err) } diff --git a/chain/actors/builtin/market/v7.go b/chain/actors/builtin/market/v7.go index 2c2664110..faf178307 100644 --- a/chain/actors/builtin/market/v7.go +++ b/chain/actors/builtin/market/v7.go @@ -3,19 +3,20 @@ package market import ( "bytes" + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-bitfield" rlepluslazy "github.com/filecoin-project/go-bitfield/rle" - "github.com/filecoin-project/go-state-types/abi" - market7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/market" - adt7 "github.com/filecoin-project/specs-actors/v7/actors/util/adt" "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/types" + + market7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/market" + adt7 "github.com/filecoin-project/specs-actors/v7/actors/util/adt" ) var _ State = (*state7)(nil) @@ -238,6 +239,7 @@ func (s *dealProposals7) array() adt.Array { func fromV7DealProposal(v7 market7.DealProposal) (DealProposal, error) { label, err := labelFromGoString(v7.Label) + if err != nil { return DealProposal{}, xerrors.Errorf("error setting deal label: %w", err) } diff --git a/chain/actors/builtin/market/v8.go b/chain/actors/builtin/market/v8.go index 8afbf39de..ea65ec705 100644 --- a/chain/actors/builtin/market/v8.go +++ b/chain/actors/builtin/market/v8.go @@ -3,19 +3,21 @@ package market import ( "bytes" + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-bitfield" rlepluslazy "github.com/filecoin-project/go-bitfield/rle" - "github.com/filecoin-project/go-state-types/abi" - market8 "github.com/filecoin-project/go-state-types/builtin/v8/market" - adt8 "github.com/filecoin-project/go-state-types/builtin/v8/util/adt" "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/types" + + market8 "github.com/filecoin-project/go-state-types/builtin/v8/market" + markettypes "github.com/filecoin-project/go-state-types/builtin/v8/market" + adt8 "github.com/filecoin-project/go-state-types/builtin/v8/util/adt" ) var _ State = (*state8)(nil) @@ -237,7 +239,11 @@ func (s *dealProposals8) array() adt.Array { func fromV8DealProposal(v8 market8.DealProposal) (DealProposal, error) { - label := v8.Label + label, err := fromV8Label(v8.Label) + + if err != nil { + return DealProposal{}, xerrors.Errorf("error setting deal label: %w", err) + } return DealProposal{ PieceCID: v8.PieceCID, @@ -257,6 +263,22 @@ func fromV8DealProposal(v8 market8.DealProposal) (DealProposal, error) { }, nil } +func fromV8Label(v8 market8.DealLabel) (DealLabel, error) { + if v8.IsString() { + str, err := v8.ToString() + if err != nil { + return markettypes.EmptyDealLabel, xerrors.Errorf("failed to convert string label to string: %w", err) + } + return markettypes.NewLabelFromString(str) + } + + bs, err := v8.ToBytes() + if err != nil { + return markettypes.EmptyDealLabel, xerrors.Errorf("failed to convert bytes label to bytes: %w", err) + } + return markettypes.NewLabelFromBytes(bs) +} + func (s *state8) GetState() interface{} { return &s.State } diff --git a/chain/actors/builtin/market/v9.go b/chain/actors/builtin/market/v9.go new file mode 100644 index 000000000..8984a1b75 --- /dev/null +++ b/chain/actors/builtin/market/v9.go @@ -0,0 +1,326 @@ +package market + +import ( + "bytes" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-bitfield" + rlepluslazy "github.com/filecoin-project/go-bitfield/rle" + + "github.com/filecoin-project/lotus/chain/actors/adt" + "github.com/filecoin-project/lotus/chain/types" + + markettypes "github.com/filecoin-project/go-state-types/builtin/v8/market" + adt9 "github.com/filecoin-project/go-state-types/builtin/v8/util/adt" + market9 "github.com/filecoin-project/go-state-types/builtin/v9/market" +) + +var _ State = (*state9)(nil) + +func load9(store adt.Store, root cid.Cid) (State, error) { + out := state9{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make9(store adt.Store) (State, error) { + out := state9{store: store} + + s, err := market9.ConstructState(store) + if err != nil { + return nil, err + } + + out.State = *s + + return &out, nil +} + +type state9 struct { + market9.State + store adt.Store +} + +func (s *state9) TotalLocked() (abi.TokenAmount, error) { + fml := types.BigAdd(s.TotalClientLockedCollateral, s.TotalProviderLockedCollateral) + fml = types.BigAdd(fml, s.TotalClientStorageFee) + return fml, nil +} + +func (s *state9) BalancesChanged(otherState State) (bool, error) { + otherState9, ok := otherState.(*state9) + if !ok { + // there's no way to compare different versions of the state, so let's + // just say that means the state of balances has changed + return true, nil + } + return !s.State.EscrowTable.Equals(otherState9.State.EscrowTable) || !s.State.LockedTable.Equals(otherState9.State.LockedTable), nil +} + +func (s *state9) StatesChanged(otherState State) (bool, error) { + otherState9, ok := otherState.(*state9) + if !ok { + // there's no way to compare different versions of the state, so let's + // just say that means the state of balances has changed + return true, nil + } + return !s.State.States.Equals(otherState9.State.States), nil +} + +func (s *state9) States() (DealStates, error) { + stateArray, err := adt9.AsArray(s.store, s.State.States, market9.StatesAmtBitwidth) + if err != nil { + return nil, err + } + return &dealStates9{stateArray}, nil +} + +func (s *state9) ProposalsChanged(otherState State) (bool, error) { + otherState9, ok := otherState.(*state9) + if !ok { + // there's no way to compare different versions of the state, so let's + // just say that means the state of balances has changed + return true, nil + } + return !s.State.Proposals.Equals(otherState9.State.Proposals), nil +} + +func (s *state9) Proposals() (DealProposals, error) { + proposalArray, err := adt9.AsArray(s.store, s.State.Proposals, market9.ProposalsAmtBitwidth) + if err != nil { + return nil, err + } + return &dealProposals9{proposalArray}, nil +} + +func (s *state9) EscrowTable() (BalanceTable, error) { + bt, err := adt9.AsBalanceTable(s.store, s.State.EscrowTable) + if err != nil { + return nil, err + } + return &balanceTable9{bt}, nil +} + +func (s *state9) LockedTable() (BalanceTable, error) { + bt, err := adt9.AsBalanceTable(s.store, s.State.LockedTable) + if err != nil { + return nil, err + } + return &balanceTable9{bt}, nil +} + +func (s *state9) VerifyDealsForActivation( + minerAddr address.Address, deals []abi.DealID, currEpoch, sectorExpiry abi.ChainEpoch, +) (weight, verifiedWeight abi.DealWeight, err error) { + w, vw, _, err := market9.ValidateDealsForActivation(&s.State, s.store, deals, minerAddr, sectorExpiry, currEpoch) + return w, vw, err +} + +func (s *state9) NextID() (abi.DealID, error) { + return s.State.NextID, nil +} + +type balanceTable9 struct { + *adt9.BalanceTable +} + +func (bt *balanceTable9) ForEach(cb func(address.Address, abi.TokenAmount) error) error { + asMap := (*adt9.Map)(bt.BalanceTable) + var ta abi.TokenAmount + return asMap.ForEach(&ta, func(key string) error { + a, err := address.NewFromBytes([]byte(key)) + if err != nil { + return err + } + return cb(a, ta) + }) +} + +type dealStates9 struct { + adt.Array +} + +func (s *dealStates9) Get(dealID abi.DealID) (*DealState, bool, error) { + var deal9 market9.DealState + found, err := s.Array.Get(uint64(dealID), &deal9) + if err != nil { + return nil, false, err + } + if !found { + return nil, false, nil + } + deal := fromV9DealState(deal9) + return &deal, true, nil +} + +func (s *dealStates9) ForEach(cb func(dealID abi.DealID, ds DealState) error) error { + var ds9 market9.DealState + return s.Array.ForEach(&ds9, func(idx int64) error { + return cb(abi.DealID(idx), fromV9DealState(ds9)) + }) +} + +func (s *dealStates9) decode(val *cbg.Deferred) (*DealState, error) { + var ds9 market9.DealState + if err := ds9.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { + return nil, err + } + ds := fromV9DealState(ds9) + return &ds, nil +} + +func (s *dealStates9) array() adt.Array { + return s.Array +} + +func fromV9DealState(v9 market9.DealState) DealState { + return (DealState)(v9) +} + +type dealProposals9 struct { + adt.Array +} + +func (s *dealProposals9) Get(dealID abi.DealID) (*DealProposal, bool, error) { + var proposal9 market9.DealProposal + found, err := s.Array.Get(uint64(dealID), &proposal9) + if err != nil { + return nil, false, err + } + if !found { + return nil, false, nil + } + + proposal, err := fromV9DealProposal(proposal9) + if err != nil { + return nil, true, xerrors.Errorf("decoding proposal: %w", err) + } + + return &proposal, true, nil +} + +func (s *dealProposals9) ForEach(cb func(dealID abi.DealID, dp DealProposal) error) error { + var dp9 market9.DealProposal + return s.Array.ForEach(&dp9, func(idx int64) error { + dp, err := fromV9DealProposal(dp9) + if err != nil { + return xerrors.Errorf("decoding proposal: %w", err) + } + + return cb(abi.DealID(idx), dp) + }) +} + +func (s *dealProposals9) decode(val *cbg.Deferred) (*DealProposal, error) { + var dp9 market9.DealProposal + if err := dp9.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { + return nil, err + } + + dp, err := fromV9DealProposal(dp9) + if err != nil { + return nil, err + } + + return &dp, nil +} + +func (s *dealProposals9) array() adt.Array { + return s.Array +} + +func fromV9DealProposal(v9 market9.DealProposal) (DealProposal, error) { + + label, err := fromV9Label(v9.Label) + + if err != nil { + return DealProposal{}, xerrors.Errorf("error setting deal label: %w", err) + } + + return DealProposal{ + PieceCID: v9.PieceCID, + PieceSize: v9.PieceSize, + VerifiedDeal: v9.VerifiedDeal, + Client: v9.Client, + Provider: v9.Provider, + + Label: label, + + StartEpoch: v9.StartEpoch, + EndEpoch: v9.EndEpoch, + StoragePricePerEpoch: v9.StoragePricePerEpoch, + + ProviderCollateral: v9.ProviderCollateral, + ClientCollateral: v9.ClientCollateral, + }, nil +} + +func fromV9Label(v9 market9.DealLabel) (DealLabel, error) { + if v9.IsString() { + str, err := v9.ToString() + if err != nil { + return markettypes.EmptyDealLabel, xerrors.Errorf("failed to convert string label to string: %w", err) + } + return markettypes.NewLabelFromString(str) + } + + bs, err := v9.ToBytes() + if err != nil { + return markettypes.EmptyDealLabel, xerrors.Errorf("failed to convert bytes label to bytes: %w", err) + } + return markettypes.NewLabelFromBytes(bs) +} + +func (s *state9) GetState() interface{} { + return &s.State +} + +var _ PublishStorageDealsReturn = (*publishStorageDealsReturn9)(nil) + +func decodePublishStorageDealsReturn9(b []byte) (PublishStorageDealsReturn, error) { + var retval market9.PublishStorageDealsReturn + if err := retval.UnmarshalCBOR(bytes.NewReader(b)); err != nil { + return nil, xerrors.Errorf("failed to unmarshal PublishStorageDealsReturn: %w", err) + } + + return &publishStorageDealsReturn9{retval}, nil +} + +type publishStorageDealsReturn9 struct { + market9.PublishStorageDealsReturn +} + +func (r *publishStorageDealsReturn9) IsDealValid(index uint64) (bool, int, error) { + + set, err := r.ValidDeals.IsSet(index) + if err != nil || !set { + return false, -1, err + } + maskBf, err := bitfield.NewFromIter(&rlepluslazy.RunSliceIterator{ + Runs: []rlepluslazy.Run{rlepluslazy.Run{Val: true, Len: index}}}) + if err != nil { + return false, -1, err + } + before, err := bitfield.IntersectBitField(maskBf, r.ValidDeals) + if err != nil { + return false, -1, err + } + outIdx, err := before.Count() + if err != nil { + return false, -1, err + } + return set, int(outIdx), nil + +} + +func (r *publishStorageDealsReturn9) DealIDs() ([]abi.DealID, error) { + return r.IDs, nil +} diff --git a/chain/actors/builtin/miner/actor.go.template b/chain/actors/builtin/miner/actor.go.template index 731af6255..751ab698f 100644 --- a/chain/actors/builtin/miner/actor.go.template +++ b/chain/actors/builtin/miner/actor.go.template @@ -1,6 +1,7 @@ package miner import ( + actorstypes "github.com/filecoin-project/go-state-types/actors" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/lotus/chain/actors" @@ -33,7 +34,7 @@ func Load(store adt.Store, act *types.Actor) (State, error) { switch av { {{range .versions}} {{if (ge . 8)}} - case actors.Version{{.}}: + case actorstypes.Version{{.}}: return load{{.}}(store, act.Head) {{end}} {{end}} @@ -201,6 +202,7 @@ func WinningPoStProofTypeFromWindowPoStProofType(nver network.Version, proof abi type MinerInfo = miner{{.latestVersion}}.MinerInfo type WorkerKeyChange = miner{{.latestVersion}}.WorkerKeyChange +type SectorPreCommitOnChainInfo = miner{{.latestVersion}}.SectorPreCommitOnChainInfo type WindowPostVerifyInfo = proof.WindowPoStVerifyInfo type SectorExpiration struct { diff --git a/chain/actors/builtin/miner/miner.go b/chain/actors/builtin/miner/miner.go index 820be35a4..2184194ea 100644 --- a/chain/actors/builtin/miner/miner.go +++ b/chain/actors/builtin/miner/miner.go @@ -1,28 +1,36 @@ package miner import ( + actorstypes "github.com/filecoin-project/go-state-types/actors" + "github.com/filecoin-project/go-state-types/big" + "github.com/filecoin-project/go-state-types/network" + "github.com/filecoin-project/lotus/chain/actors" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" "github.com/filecoin-project/go-bitfield" "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/big" - miner8 "github.com/filecoin-project/go-state-types/builtin/v8/miner" "github.com/filecoin-project/go-state-types/cbor" "github.com/filecoin-project/go-state-types/dline" - "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/go-state-types/proof" - builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" - builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" - builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" - builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" - builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" - builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" - builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" - "github.com/filecoin-project/lotus/chain/actors" + miner9 "github.com/filecoin-project/go-state-types/builtin/v9/miner" "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/types" + + builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" + + builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" + + builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" + + builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" + + builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" + + builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" ) func Load(store adt.Store, act *types.Actor) (State, error) { @@ -33,9 +41,12 @@ func Load(store adt.Store, act *types.Actor) (State, error) { switch av { - case actors.Version8: + case actorstypes.Version8: return load8(store, act.Head) + case actorstypes.Version9: + return load9(store, act.Head) + } } @@ -94,6 +105,9 @@ func MakeState(store adt.Store, av actors.Version) (State, error) { case actors.Version8: return make8(store) + case actors.Version9: + return make9(store) + } return nil, xerrors.Errorf("unknown actor version %d", av) } @@ -112,8 +126,8 @@ type State interface { GetSector(abi.SectorNumber) (*SectorOnChainInfo, error) FindSector(abi.SectorNumber) (*SectorLocation, error) GetSectorExpiration(abi.SectorNumber) (*SectorExpiration, error) - GetPrecommittedSector(abi.SectorNumber) (*miner8.SectorPreCommitOnChainInfo, error) - ForEachPrecommittedSector(func(miner8.SectorPreCommitOnChainInfo) error) error + GetPrecommittedSector(abi.SectorNumber) (*miner9.SectorPreCommitOnChainInfo, error) + ForEachPrecommittedSector(func(miner9.SectorPreCommitOnChainInfo) error) error LoadSectors(sectorNos *bitfield.BitField) ([]*SectorOnChainInfo, error) NumLiveSectors() (uint64, error) IsAllocated(abi.SectorNumber) (bool, error) @@ -142,7 +156,7 @@ type State interface { sectors() (adt.Array, error) decodeSectorOnChainInfo(*cbg.Deferred) (SectorOnChainInfo, error) precommits() (adt.Map, error) - decodeSectorPreCommitOnChainInfo(*cbg.Deferred) (miner8.SectorPreCommitOnChainInfo, error) + decodeSectorPreCommitOnChainInfo(*cbg.Deferred) (miner9.SectorPreCommitOnChainInfo, error) GetState() interface{} } @@ -180,7 +194,7 @@ type Partition interface { UnprovenSectors() (bitfield.BitField, error) } -type SectorOnChainInfo = miner8.SectorOnChainInfo +type SectorOnChainInfo = miner9.SectorOnChainInfo func PreferredSealProofTypeFromWindowPoStType(nver network.Version, proof abi.RegisteredPoStProof) (abi.RegisteredSealProof, error) { // We added support for the new proofs in network version 7, and removed support for the old @@ -235,8 +249,9 @@ func WinningPoStProofTypeFromWindowPoStProofType(nver network.Version, proof abi } } -type MinerInfo = miner8.MinerInfo -type WorkerKeyChange = miner8.WorkerKeyChange +type MinerInfo = miner9.MinerInfo +type WorkerKeyChange = miner9.WorkerKeyChange +type SectorPreCommitOnChainInfo = miner9.SectorPreCommitOnChainInfo type WindowPostVerifyInfo = proof.WindowPoStVerifyInfo type SectorExpiration struct { @@ -264,8 +279,8 @@ type SectorExtensions struct { } type PreCommitChanges struct { - Added []miner8.SectorPreCommitOnChainInfo - Removed []miner8.SectorPreCommitOnChainInfo + Added []miner9.SectorPreCommitOnChainInfo + Removed []miner9.SectorPreCommitOnChainInfo } type LockedFunds struct { diff --git a/chain/actors/builtin/miner/state.go.template b/chain/actors/builtin/miner/state.go.template index 53c4b446a..e24188fa0 100644 --- a/chain/actors/builtin/miner/state.go.template +++ b/chain/actors/builtin/miner/state.go.template @@ -15,7 +15,7 @@ import ( "golang.org/x/xerrors" "github.com/filecoin-project/lotus/chain/actors/adt" - minertypes "github.com/filecoin-project/go-state-types/builtin/v8/miner" + minertypes "github.com/filecoin-project/go-state-types/builtin/v{{.latestVersion}}/miner" {{if (le .v 7)}} {{if (ge .v 3)}} @@ -581,11 +581,17 @@ func fromV{{.v}}SectorOnChainInfo(v{{.v}} miner{{.v}}.SectorOnChainInfo) SectorO func fromV{{.v}}SectorPreCommitOnChainInfo(v{{.v}} miner{{.v}}.SectorPreCommitOnChainInfo) minertypes.SectorPreCommitOnChainInfo { return minertypes.SectorPreCommitOnChainInfo{ - Info: (minertypes.SectorPreCommitInfo)(v{{.v}}.Info), + Info: minertypes.SectorPreCommitInfo{ + SealProof: v{{.v}}.Info.SealProof, + SectorNumber: v{{.v}}.Info.SectorNumber, + SealedCID: v{{.v}}.Info.SealedCID, + SealRandEpoch: v{{.v}}.Info.SealRandEpoch, + DealIDs: v{{.v}}.Info.DealIDs, + Expiration: v{{.v}}.Info.Expiration, + UnsealedCid: nil, + }, PreCommitDeposit: v{{.v}}.PreCommitDeposit, PreCommitEpoch: v{{.v}}.PreCommitEpoch, - DealWeight: v{{.v}}.DealWeight, - VerifiedDealWeight: v{{.v}}.VerifiedDealWeight, } } diff --git a/chain/actors/builtin/miner/v0.go b/chain/actors/builtin/miner/v0.go index daa0a6bfd..d8f450381 100644 --- a/chain/actors/builtin/miner/v0.go +++ b/chain/actors/builtin/miner/v0.go @@ -4,20 +4,21 @@ import ( "bytes" "errors" - "github.com/ipfs/go-cid" - cbg "github.com/whyrusleeping/cbor-gen" - "golang.org/x/xerrors" + "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-bitfield" rle "github.com/filecoin-project/go-bitfield/rle" "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/big" - minertypes "github.com/filecoin-project/go-state-types/builtin/v8/miner" "github.com/filecoin-project/go-state-types/dline" + "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + "golang.org/x/xerrors" + + minertypes "github.com/filecoin-project/go-state-types/builtin/v9/miner" + "github.com/filecoin-project/lotus/chain/actors/adt" + miner0 "github.com/filecoin-project/specs-actors/actors/builtin/miner" adt0 "github.com/filecoin-project/specs-actors/actors/util/adt" - - "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state0)(nil) @@ -511,11 +512,17 @@ func fromV0SectorOnChainInfo(v0 miner0.SectorOnChainInfo) SectorOnChainInfo { func fromV0SectorPreCommitOnChainInfo(v0 miner0.SectorPreCommitOnChainInfo) minertypes.SectorPreCommitOnChainInfo { return minertypes.SectorPreCommitOnChainInfo{ - Info: (minertypes.SectorPreCommitInfo)(v0.Info), - PreCommitDeposit: v0.PreCommitDeposit, - PreCommitEpoch: v0.PreCommitEpoch, - DealWeight: v0.DealWeight, - VerifiedDealWeight: v0.VerifiedDealWeight, + Info: minertypes.SectorPreCommitInfo{ + SealProof: v0.Info.SealProof, + SectorNumber: v0.Info.SectorNumber, + SealedCID: v0.Info.SealedCID, + SealRandEpoch: v0.Info.SealRandEpoch, + DealIDs: v0.Info.DealIDs, + Expiration: v0.Info.Expiration, + UnsealedCid: nil, + }, + PreCommitDeposit: v0.PreCommitDeposit, + PreCommitEpoch: v0.PreCommitEpoch, } } diff --git a/chain/actors/builtin/miner/v2.go b/chain/actors/builtin/miner/v2.go index 7741b5426..e5bc784fe 100644 --- a/chain/actors/builtin/miner/v2.go +++ b/chain/actors/builtin/miner/v2.go @@ -4,19 +4,19 @@ import ( "bytes" "errors" + "github.com/filecoin-project/go-bitfield" + rle "github.com/filecoin-project/go-bitfield/rle" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/dline" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - "github.com/filecoin-project/go-bitfield" - rle "github.com/filecoin-project/go-bitfield/rle" - "github.com/filecoin-project/go-state-types/abi" - minertypes "github.com/filecoin-project/go-state-types/builtin/v8/miner" - "github.com/filecoin-project/go-state-types/dline" + minertypes "github.com/filecoin-project/go-state-types/builtin/v9/miner" + "github.com/filecoin-project/lotus/chain/actors/adt" + miner2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/miner" adt2 "github.com/filecoin-project/specs-actors/v2/actors/util/adt" - - "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state2)(nil) @@ -542,11 +542,17 @@ func fromV2SectorOnChainInfo(v2 miner2.SectorOnChainInfo) SectorOnChainInfo { func fromV2SectorPreCommitOnChainInfo(v2 miner2.SectorPreCommitOnChainInfo) minertypes.SectorPreCommitOnChainInfo { return minertypes.SectorPreCommitOnChainInfo{ - Info: (minertypes.SectorPreCommitInfo)(v2.Info), - PreCommitDeposit: v2.PreCommitDeposit, - PreCommitEpoch: v2.PreCommitEpoch, - DealWeight: v2.DealWeight, - VerifiedDealWeight: v2.VerifiedDealWeight, + Info: minertypes.SectorPreCommitInfo{ + SealProof: v2.Info.SealProof, + SectorNumber: v2.Info.SectorNumber, + SealedCID: v2.Info.SealedCID, + SealRandEpoch: v2.Info.SealRandEpoch, + DealIDs: v2.Info.DealIDs, + Expiration: v2.Info.Expiration, + UnsealedCid: nil, + }, + PreCommitDeposit: v2.PreCommitDeposit, + PreCommitEpoch: v2.PreCommitEpoch, } } diff --git a/chain/actors/builtin/miner/v3.go b/chain/actors/builtin/miner/v3.go index 8cb1c4004..670df7f1b 100644 --- a/chain/actors/builtin/miner/v3.go +++ b/chain/actors/builtin/miner/v3.go @@ -4,20 +4,21 @@ import ( "bytes" "errors" + "github.com/filecoin-project/go-bitfield" + rle "github.com/filecoin-project/go-bitfield/rle" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/dline" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - "github.com/filecoin-project/go-bitfield" - rle "github.com/filecoin-project/go-bitfield/rle" - "github.com/filecoin-project/go-state-types/abi" - minertypes "github.com/filecoin-project/go-state-types/builtin/v8/miner" - "github.com/filecoin-project/go-state-types/dline" + minertypes "github.com/filecoin-project/go-state-types/builtin/v9/miner" + "github.com/filecoin-project/lotus/chain/actors/adt" + builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" + miner3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/miner" adt3 "github.com/filecoin-project/specs-actors/v3/actors/util/adt" - - "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state3)(nil) @@ -542,11 +543,17 @@ func fromV3SectorOnChainInfo(v3 miner3.SectorOnChainInfo) SectorOnChainInfo { func fromV3SectorPreCommitOnChainInfo(v3 miner3.SectorPreCommitOnChainInfo) minertypes.SectorPreCommitOnChainInfo { return minertypes.SectorPreCommitOnChainInfo{ - Info: (minertypes.SectorPreCommitInfo)(v3.Info), - PreCommitDeposit: v3.PreCommitDeposit, - PreCommitEpoch: v3.PreCommitEpoch, - DealWeight: v3.DealWeight, - VerifiedDealWeight: v3.VerifiedDealWeight, + Info: minertypes.SectorPreCommitInfo{ + SealProof: v3.Info.SealProof, + SectorNumber: v3.Info.SectorNumber, + SealedCID: v3.Info.SealedCID, + SealRandEpoch: v3.Info.SealRandEpoch, + DealIDs: v3.Info.DealIDs, + Expiration: v3.Info.Expiration, + UnsealedCid: nil, + }, + PreCommitDeposit: v3.PreCommitDeposit, + PreCommitEpoch: v3.PreCommitEpoch, } } diff --git a/chain/actors/builtin/miner/v4.go b/chain/actors/builtin/miner/v4.go index dc8b7a1d1..740e748ba 100644 --- a/chain/actors/builtin/miner/v4.go +++ b/chain/actors/builtin/miner/v4.go @@ -4,20 +4,21 @@ import ( "bytes" "errors" + "github.com/filecoin-project/go-bitfield" + rle "github.com/filecoin-project/go-bitfield/rle" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/dline" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - "github.com/filecoin-project/go-bitfield" - rle "github.com/filecoin-project/go-bitfield/rle" - "github.com/filecoin-project/go-state-types/abi" - minertypes "github.com/filecoin-project/go-state-types/builtin/v8/miner" - "github.com/filecoin-project/go-state-types/dline" + minertypes "github.com/filecoin-project/go-state-types/builtin/v9/miner" + "github.com/filecoin-project/lotus/chain/actors/adt" + builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" + miner4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/miner" adt4 "github.com/filecoin-project/specs-actors/v4/actors/util/adt" - - "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state4)(nil) @@ -542,11 +543,17 @@ func fromV4SectorOnChainInfo(v4 miner4.SectorOnChainInfo) SectorOnChainInfo { func fromV4SectorPreCommitOnChainInfo(v4 miner4.SectorPreCommitOnChainInfo) minertypes.SectorPreCommitOnChainInfo { return minertypes.SectorPreCommitOnChainInfo{ - Info: (minertypes.SectorPreCommitInfo)(v4.Info), - PreCommitDeposit: v4.PreCommitDeposit, - PreCommitEpoch: v4.PreCommitEpoch, - DealWeight: v4.DealWeight, - VerifiedDealWeight: v4.VerifiedDealWeight, + Info: minertypes.SectorPreCommitInfo{ + SealProof: v4.Info.SealProof, + SectorNumber: v4.Info.SectorNumber, + SealedCID: v4.Info.SealedCID, + SealRandEpoch: v4.Info.SealRandEpoch, + DealIDs: v4.Info.DealIDs, + Expiration: v4.Info.Expiration, + UnsealedCid: nil, + }, + PreCommitDeposit: v4.PreCommitDeposit, + PreCommitEpoch: v4.PreCommitEpoch, } } diff --git a/chain/actors/builtin/miner/v5.go b/chain/actors/builtin/miner/v5.go index f5ec6087b..f120e78b6 100644 --- a/chain/actors/builtin/miner/v5.go +++ b/chain/actors/builtin/miner/v5.go @@ -4,20 +4,21 @@ import ( "bytes" "errors" + "github.com/filecoin-project/go-bitfield" + rle "github.com/filecoin-project/go-bitfield/rle" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/dline" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - "github.com/filecoin-project/go-bitfield" - rle "github.com/filecoin-project/go-bitfield/rle" - "github.com/filecoin-project/go-state-types/abi" - minertypes "github.com/filecoin-project/go-state-types/builtin/v8/miner" - "github.com/filecoin-project/go-state-types/dline" + minertypes "github.com/filecoin-project/go-state-types/builtin/v9/miner" + "github.com/filecoin-project/lotus/chain/actors/adt" + builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" + miner5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/miner" adt5 "github.com/filecoin-project/specs-actors/v5/actors/util/adt" - - "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state5)(nil) @@ -542,11 +543,17 @@ func fromV5SectorOnChainInfo(v5 miner5.SectorOnChainInfo) SectorOnChainInfo { func fromV5SectorPreCommitOnChainInfo(v5 miner5.SectorPreCommitOnChainInfo) minertypes.SectorPreCommitOnChainInfo { return minertypes.SectorPreCommitOnChainInfo{ - Info: (minertypes.SectorPreCommitInfo)(v5.Info), - PreCommitDeposit: v5.PreCommitDeposit, - PreCommitEpoch: v5.PreCommitEpoch, - DealWeight: v5.DealWeight, - VerifiedDealWeight: v5.VerifiedDealWeight, + Info: minertypes.SectorPreCommitInfo{ + SealProof: v5.Info.SealProof, + SectorNumber: v5.Info.SectorNumber, + SealedCID: v5.Info.SealedCID, + SealRandEpoch: v5.Info.SealRandEpoch, + DealIDs: v5.Info.DealIDs, + Expiration: v5.Info.Expiration, + UnsealedCid: nil, + }, + PreCommitDeposit: v5.PreCommitDeposit, + PreCommitEpoch: v5.PreCommitEpoch, } } diff --git a/chain/actors/builtin/miner/v6.go b/chain/actors/builtin/miner/v6.go index 78445b2ba..d0ea06e80 100644 --- a/chain/actors/builtin/miner/v6.go +++ b/chain/actors/builtin/miner/v6.go @@ -4,20 +4,21 @@ import ( "bytes" "errors" + "github.com/filecoin-project/go-bitfield" + rle "github.com/filecoin-project/go-bitfield/rle" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/dline" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - "github.com/filecoin-project/go-bitfield" - rle "github.com/filecoin-project/go-bitfield/rle" - "github.com/filecoin-project/go-state-types/abi" - minertypes "github.com/filecoin-project/go-state-types/builtin/v8/miner" - "github.com/filecoin-project/go-state-types/dline" + minertypes "github.com/filecoin-project/go-state-types/builtin/v9/miner" + "github.com/filecoin-project/lotus/chain/actors/adt" + builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + miner6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/miner" adt6 "github.com/filecoin-project/specs-actors/v6/actors/util/adt" - - "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state6)(nil) @@ -542,11 +543,17 @@ func fromV6SectorOnChainInfo(v6 miner6.SectorOnChainInfo) SectorOnChainInfo { func fromV6SectorPreCommitOnChainInfo(v6 miner6.SectorPreCommitOnChainInfo) minertypes.SectorPreCommitOnChainInfo { return minertypes.SectorPreCommitOnChainInfo{ - Info: (minertypes.SectorPreCommitInfo)(v6.Info), - PreCommitDeposit: v6.PreCommitDeposit, - PreCommitEpoch: v6.PreCommitEpoch, - DealWeight: v6.DealWeight, - VerifiedDealWeight: v6.VerifiedDealWeight, + Info: minertypes.SectorPreCommitInfo{ + SealProof: v6.Info.SealProof, + SectorNumber: v6.Info.SectorNumber, + SealedCID: v6.Info.SealedCID, + SealRandEpoch: v6.Info.SealRandEpoch, + DealIDs: v6.Info.DealIDs, + Expiration: v6.Info.Expiration, + UnsealedCid: nil, + }, + PreCommitDeposit: v6.PreCommitDeposit, + PreCommitEpoch: v6.PreCommitEpoch, } } diff --git a/chain/actors/builtin/miner/v7.go b/chain/actors/builtin/miner/v7.go index c91fceb7b..19a4eb7af 100644 --- a/chain/actors/builtin/miner/v7.go +++ b/chain/actors/builtin/miner/v7.go @@ -4,20 +4,21 @@ import ( "bytes" "errors" + "github.com/filecoin-project/go-bitfield" + rle "github.com/filecoin-project/go-bitfield/rle" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/dline" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - "github.com/filecoin-project/go-bitfield" - rle "github.com/filecoin-project/go-bitfield/rle" - "github.com/filecoin-project/go-state-types/abi" - minertypes "github.com/filecoin-project/go-state-types/builtin/v8/miner" - "github.com/filecoin-project/go-state-types/dline" + minertypes "github.com/filecoin-project/go-state-types/builtin/v9/miner" + "github.com/filecoin-project/lotus/chain/actors/adt" + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + miner7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/miner" adt7 "github.com/filecoin-project/specs-actors/v7/actors/util/adt" - - "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state7)(nil) @@ -543,11 +544,17 @@ func fromV7SectorOnChainInfo(v7 miner7.SectorOnChainInfo) SectorOnChainInfo { func fromV7SectorPreCommitOnChainInfo(v7 miner7.SectorPreCommitOnChainInfo) minertypes.SectorPreCommitOnChainInfo { return minertypes.SectorPreCommitOnChainInfo{ - Info: (minertypes.SectorPreCommitInfo)(v7.Info), - PreCommitDeposit: v7.PreCommitDeposit, - PreCommitEpoch: v7.PreCommitEpoch, - DealWeight: v7.DealWeight, - VerifiedDealWeight: v7.VerifiedDealWeight, + Info: minertypes.SectorPreCommitInfo{ + SealProof: v7.Info.SealProof, + SectorNumber: v7.Info.SectorNumber, + SealedCID: v7.Info.SealedCID, + SealRandEpoch: v7.Info.SealRandEpoch, + DealIDs: v7.Info.DealIDs, + Expiration: v7.Info.Expiration, + UnsealedCid: nil, + }, + PreCommitDeposit: v7.PreCommitDeposit, + PreCommitEpoch: v7.PreCommitEpoch, } } diff --git a/chain/actors/builtin/miner/v8.go b/chain/actors/builtin/miner/v8.go index 817a073a2..52b6b6196 100644 --- a/chain/actors/builtin/miner/v8.go +++ b/chain/actors/builtin/miner/v8.go @@ -4,20 +4,20 @@ import ( "bytes" "errors" + "github.com/filecoin-project/go-bitfield" + rle "github.com/filecoin-project/go-bitfield/rle" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/dline" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - "github.com/filecoin-project/go-bitfield" - rle "github.com/filecoin-project/go-bitfield/rle" - "github.com/filecoin-project/go-state-types/abi" + minertypes "github.com/filecoin-project/go-state-types/builtin/v9/miner" + "github.com/filecoin-project/lotus/chain/actors/adt" + builtin8 "github.com/filecoin-project/go-state-types/builtin" miner8 "github.com/filecoin-project/go-state-types/builtin/v8/miner" - minertypes "github.com/filecoin-project/go-state-types/builtin/v8/miner" adt8 "github.com/filecoin-project/go-state-types/builtin/v8/util/adt" - "github.com/filecoin-project/go-state-types/dline" - - "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state8)(nil) @@ -543,11 +543,17 @@ func fromV8SectorOnChainInfo(v8 miner8.SectorOnChainInfo) SectorOnChainInfo { func fromV8SectorPreCommitOnChainInfo(v8 miner8.SectorPreCommitOnChainInfo) minertypes.SectorPreCommitOnChainInfo { return minertypes.SectorPreCommitOnChainInfo{ - Info: (minertypes.SectorPreCommitInfo)(v8.Info), - PreCommitDeposit: v8.PreCommitDeposit, - PreCommitEpoch: v8.PreCommitEpoch, - DealWeight: v8.DealWeight, - VerifiedDealWeight: v8.VerifiedDealWeight, + Info: minertypes.SectorPreCommitInfo{ + SealProof: v8.Info.SealProof, + SectorNumber: v8.Info.SectorNumber, + SealedCID: v8.Info.SealedCID, + SealRandEpoch: v8.Info.SealRandEpoch, + DealIDs: v8.Info.DealIDs, + Expiration: v8.Info.Expiration, + UnsealedCid: nil, + }, + PreCommitDeposit: v8.PreCommitDeposit, + PreCommitEpoch: v8.PreCommitEpoch, } } diff --git a/chain/actors/builtin/miner/v9.go b/chain/actors/builtin/miner/v9.go new file mode 100644 index 000000000..79872fd8d --- /dev/null +++ b/chain/actors/builtin/miner/v9.go @@ -0,0 +1,562 @@ +package miner + +import ( + "bytes" + "errors" + + "github.com/filecoin-project/go-bitfield" + rle "github.com/filecoin-project/go-bitfield/rle" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/dline" + "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + "golang.org/x/xerrors" + + minertypes "github.com/filecoin-project/go-state-types/builtin/v9/miner" + "github.com/filecoin-project/lotus/chain/actors/adt" + + builtin9 "github.com/filecoin-project/go-state-types/builtin" + miner9 "github.com/filecoin-project/go-state-types/builtin/v9/miner" + adt9 "github.com/filecoin-project/go-state-types/builtin/v9/util/adt" +) + +var _ State = (*state9)(nil) + +func load9(store adt.Store, root cid.Cid) (State, error) { + out := state9{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make9(store adt.Store) (State, error) { + out := state9{store: store} + out.State = miner9.State{} + return &out, nil +} + +type state9 struct { + miner9.State + store adt.Store +} + +type deadline9 struct { + miner9.Deadline + store adt.Store +} + +type partition9 struct { + miner9.Partition + store adt.Store +} + +func (s *state9) AvailableBalance(bal abi.TokenAmount) (available abi.TokenAmount, err error) { + defer func() { + if r := recover(); r != nil { + err = xerrors.Errorf("failed to get available balance: %w", r) + available = abi.NewTokenAmount(0) + } + }() + // this panics if the miner doesnt have enough funds to cover their locked pledge + available, err = s.GetAvailableBalance(bal) + return available, err +} + +func (s *state9) VestedFunds(epoch abi.ChainEpoch) (abi.TokenAmount, error) { + return s.CheckVestedFunds(s.store, epoch) +} + +func (s *state9) LockedFunds() (LockedFunds, error) { + return LockedFunds{ + VestingFunds: s.State.LockedFunds, + InitialPledgeRequirement: s.State.InitialPledge, + PreCommitDeposits: s.State.PreCommitDeposits, + }, nil +} + +func (s *state9) FeeDebt() (abi.TokenAmount, error) { + return s.State.FeeDebt, nil +} + +func (s *state9) InitialPledge() (abi.TokenAmount, error) { + return s.State.InitialPledge, nil +} + +func (s *state9) PreCommitDeposits() (abi.TokenAmount, error) { + return s.State.PreCommitDeposits, nil +} + +func (s *state9) GetSector(num abi.SectorNumber) (*SectorOnChainInfo, error) { + info, ok, err := s.State.GetSector(s.store, num) + if !ok || err != nil { + return nil, err + } + + ret := fromV9SectorOnChainInfo(*info) + return &ret, nil +} + +func (s *state9) FindSector(num abi.SectorNumber) (*SectorLocation, error) { + dlIdx, partIdx, err := s.State.FindSector(s.store, num) + if err != nil { + return nil, err + } + return &SectorLocation{ + Deadline: dlIdx, + Partition: partIdx, + }, nil +} + +func (s *state9) NumLiveSectors() (uint64, error) { + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return 0, err + } + var total uint64 + if err := dls.ForEach(s.store, func(dlIdx uint64, dl *miner9.Deadline) error { + total += dl.LiveSectors + return nil + }); err != nil { + return 0, err + } + return total, nil +} + +// GetSectorExpiration returns the effective expiration of the given sector. +// +// If the sector does not expire early, the Early expiration field is 0. +func (s *state9) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, error) { + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return nil, err + } + // NOTE: this can be optimized significantly. + // 1. If the sector is non-faulty, it will expire on-time (can be + // learned from the sector info). + // 2. If it's faulty, it will expire early within the first 42 entries + // of the expiration queue. + + stopErr := errors.New("stop") + out := SectorExpiration{} + err = dls.ForEach(s.store, func(dlIdx uint64, dl *miner9.Deadline) error { + partitions, err := dl.PartitionsArray(s.store) + if err != nil { + return err + } + quant := s.State.QuantSpecForDeadline(dlIdx) + var part miner9.Partition + return partitions.ForEach(&part, func(partIdx int64) error { + if found, err := part.Sectors.IsSet(uint64(num)); err != nil { + return err + } else if !found { + return nil + } + if found, err := part.Terminated.IsSet(uint64(num)); err != nil { + return err + } else if found { + // already terminated + return stopErr + } + + q, err := miner9.LoadExpirationQueue(s.store, part.ExpirationsEpochs, quant, miner9.PartitionExpirationAmtBitwidth) + if err != nil { + return err + } + var exp miner9.ExpirationSet + return q.ForEach(&exp, func(epoch int64) error { + if early, err := exp.EarlySectors.IsSet(uint64(num)); err != nil { + return err + } else if early { + out.Early = abi.ChainEpoch(epoch) + return nil + } + if onTime, err := exp.OnTimeSectors.IsSet(uint64(num)); err != nil { + return err + } else if onTime { + out.OnTime = abi.ChainEpoch(epoch) + return stopErr + } + return nil + }) + }) + }) + if err == stopErr { + err = nil + } + if err != nil { + return nil, err + } + if out.Early == 0 && out.OnTime == 0 { + return nil, xerrors.Errorf("failed to find sector %d", num) + } + return &out, nil +} + +func (s *state9) GetPrecommittedSector(num abi.SectorNumber) (*minertypes.SectorPreCommitOnChainInfo, error) { + info, ok, err := s.State.GetPrecommittedSector(s.store, num) + if !ok || err != nil { + return nil, err + } + + ret := fromV9SectorPreCommitOnChainInfo(*info) + + return &ret, nil +} + +func (s *state9) ForEachPrecommittedSector(cb func(minertypes.SectorPreCommitOnChainInfo) error) error { + precommitted, err := adt9.AsMap(s.store, s.State.PreCommittedSectors, builtin9.DefaultHamtBitwidth) + if err != nil { + return err + } + + var info miner9.SectorPreCommitOnChainInfo + if err := precommitted.ForEach(&info, func(_ string) error { + return cb(fromV9SectorPreCommitOnChainInfo(info)) + }); err != nil { + return err + } + + return nil +} + +func (s *state9) LoadSectors(snos *bitfield.BitField) ([]*SectorOnChainInfo, error) { + sectors, err := miner9.LoadSectors(s.store, s.State.Sectors) + if err != nil { + return nil, err + } + + // If no sector numbers are specified, load all. + if snos == nil { + infos := make([]*SectorOnChainInfo, 0, sectors.Length()) + var info9 miner9.SectorOnChainInfo + if err := sectors.ForEach(&info9, func(_ int64) error { + info := fromV9SectorOnChainInfo(info9) + infos = append(infos, &info) + return nil + }); err != nil { + return nil, err + } + return infos, nil + } + + // Otherwise, load selected. + infos9, err := sectors.Load(*snos) + if err != nil { + return nil, err + } + infos := make([]*SectorOnChainInfo, len(infos9)) + for i, info9 := range infos9 { + info := fromV9SectorOnChainInfo(*info9) + infos[i] = &info + } + return infos, nil +} + +func (s *state9) loadAllocatedSectorNumbers() (bitfield.BitField, error) { + var allocatedSectors bitfield.BitField + err := s.store.Get(s.store.Context(), s.State.AllocatedSectors, &allocatedSectors) + return allocatedSectors, err +} + +func (s *state9) IsAllocated(num abi.SectorNumber) (bool, error) { + allocatedSectors, err := s.loadAllocatedSectorNumbers() + if err != nil { + return false, err + } + + return allocatedSectors.IsSet(uint64(num)) +} + +func (s *state9) GetProvingPeriodStart() (abi.ChainEpoch, error) { + return s.State.ProvingPeriodStart, nil +} + +func (s *state9) UnallocatedSectorNumbers(count int) ([]abi.SectorNumber, error) { + allocatedSectors, err := s.loadAllocatedSectorNumbers() + if err != nil { + return nil, err + } + + allocatedRuns, err := allocatedSectors.RunIterator() + if err != nil { + return nil, err + } + + unallocatedRuns, err := rle.Subtract( + &rle.RunSliceIterator{Runs: []rle.Run{{Val: true, Len: abi.MaxSectorNumber}}}, + allocatedRuns, + ) + if err != nil { + return nil, err + } + + iter, err := rle.BitsFromRuns(unallocatedRuns) + if err != nil { + return nil, err + } + + sectors := make([]abi.SectorNumber, 0, count) + for iter.HasNext() && len(sectors) < count { + nextNo, err := iter.Next() + if err != nil { + return nil, err + } + sectors = append(sectors, abi.SectorNumber(nextNo)) + } + + return sectors, nil +} + +func (s *state9) GetAllocatedSectors() (*bitfield.BitField, error) { + var allocatedSectors bitfield.BitField + if err := s.store.Get(s.store.Context(), s.State.AllocatedSectors, &allocatedSectors); err != nil { + return nil, err + } + + return &allocatedSectors, nil +} + +func (s *state9) LoadDeadline(idx uint64) (Deadline, error) { + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return nil, err + } + dl, err := dls.LoadDeadline(s.store, idx) + if err != nil { + return nil, err + } + return &deadline9{*dl, s.store}, nil +} + +func (s *state9) ForEachDeadline(cb func(uint64, Deadline) error) error { + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return err + } + return dls.ForEach(s.store, func(i uint64, dl *miner9.Deadline) error { + return cb(i, &deadline9{*dl, s.store}) + }) +} + +func (s *state9) NumDeadlines() (uint64, error) { + return miner9.WPoStPeriodDeadlines, nil +} + +func (s *state9) DeadlinesChanged(other State) (bool, error) { + other9, ok := other.(*state9) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + + return !s.State.Deadlines.Equals(other9.Deadlines), nil +} + +func (s *state9) MinerInfoChanged(other State) (bool, error) { + other0, ok := other.(*state9) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + return !s.State.Info.Equals(other0.State.Info), nil +} + +func (s *state9) Info() (MinerInfo, error) { + info, err := s.State.GetInfo(s.store) + if err != nil { + return MinerInfo{}, err + } + + mi := MinerInfo{ + Owner: info.Owner, + Worker: info.Worker, + ControlAddresses: info.ControlAddresses, + + PendingWorkerKey: (*WorkerKeyChange)(info.PendingWorkerKey), + + PeerId: info.PeerId, + Multiaddrs: info.Multiaddrs, + WindowPoStProofType: info.WindowPoStProofType, + SectorSize: info.SectorSize, + WindowPoStPartitionSectors: info.WindowPoStPartitionSectors, + ConsensusFaultElapsed: info.ConsensusFaultElapsed, + } + + return mi, nil +} + +func (s *state9) DeadlineInfo(epoch abi.ChainEpoch) (*dline.Info, error) { + return s.State.RecordedDeadlineInfo(epoch), nil +} + +func (s *state9) DeadlineCronActive() (bool, error) { + return s.State.DeadlineCronActive, nil +} + +func (s *state9) sectors() (adt.Array, error) { + return adt9.AsArray(s.store, s.Sectors, miner9.SectorsAmtBitwidth) +} + +func (s *state9) decodeSectorOnChainInfo(val *cbg.Deferred) (SectorOnChainInfo, error) { + var si miner9.SectorOnChainInfo + err := si.UnmarshalCBOR(bytes.NewReader(val.Raw)) + if err != nil { + return SectorOnChainInfo{}, err + } + + return fromV9SectorOnChainInfo(si), nil +} + +func (s *state9) precommits() (adt.Map, error) { + return adt9.AsMap(s.store, s.PreCommittedSectors, builtin9.DefaultHamtBitwidth) +} + +func (s *state9) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (minertypes.SectorPreCommitOnChainInfo, error) { + var sp miner9.SectorPreCommitOnChainInfo + err := sp.UnmarshalCBOR(bytes.NewReader(val.Raw)) + if err != nil { + return minertypes.SectorPreCommitOnChainInfo{}, err + } + + return fromV9SectorPreCommitOnChainInfo(sp), nil +} + +func (s *state9) EraseAllUnproven() error { + + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return err + } + + err = dls.ForEach(s.store, func(dindx uint64, dl *miner9.Deadline) error { + ps, err := dl.PartitionsArray(s.store) + if err != nil { + return err + } + + var part miner9.Partition + err = ps.ForEach(&part, func(pindx int64) error { + _ = part.ActivateUnproven() + err = ps.Set(uint64(pindx), &part) + return nil + }) + + if err != nil { + return err + } + + dl.Partitions, err = ps.Root() + if err != nil { + return err + } + + return dls.UpdateDeadline(s.store, dindx, dl) + }) + if err != nil { + return err + } + + return s.State.SaveDeadlines(s.store, dls) + +} + +func (d *deadline9) LoadPartition(idx uint64) (Partition, error) { + p, err := d.Deadline.LoadPartition(d.store, idx) + if err != nil { + return nil, err + } + return &partition9{*p, d.store}, nil +} + +func (d *deadline9) ForEachPartition(cb func(uint64, Partition) error) error { + ps, err := d.Deadline.PartitionsArray(d.store) + if err != nil { + return err + } + var part miner9.Partition + return ps.ForEach(&part, func(i int64) error { + return cb(uint64(i), &partition9{part, d.store}) + }) +} + +func (d *deadline9) PartitionsChanged(other Deadline) (bool, error) { + other9, ok := other.(*deadline9) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + + return !d.Deadline.Partitions.Equals(other9.Deadline.Partitions), nil +} + +func (d *deadline9) PartitionsPoSted() (bitfield.BitField, error) { + return d.Deadline.PartitionsPoSted, nil +} + +func (d *deadline9) DisputableProofCount() (uint64, error) { + + ops, err := d.OptimisticProofsSnapshotArray(d.store) + if err != nil { + return 0, err + } + + return ops.Length(), nil + +} + +func (p *partition9) AllSectors() (bitfield.BitField, error) { + return p.Partition.Sectors, nil +} + +func (p *partition9) FaultySectors() (bitfield.BitField, error) { + return p.Partition.Faults, nil +} + +func (p *partition9) RecoveringSectors() (bitfield.BitField, error) { + return p.Partition.Recoveries, nil +} + +func (p *partition9) UnprovenSectors() (bitfield.BitField, error) { + return p.Partition.Unproven, nil +} + +func fromV9SectorOnChainInfo(v9 miner9.SectorOnChainInfo) SectorOnChainInfo { + info := SectorOnChainInfo{ + SectorNumber: v9.SectorNumber, + SealProof: v9.SealProof, + SealedCID: v9.SealedCID, + DealIDs: v9.DealIDs, + Activation: v9.Activation, + Expiration: v9.Expiration, + DealWeight: v9.DealWeight, + VerifiedDealWeight: v9.VerifiedDealWeight, + InitialPledge: v9.InitialPledge, + ExpectedDayReward: v9.ExpectedDayReward, + ExpectedStoragePledge: v9.ExpectedStoragePledge, + + SectorKeyCID: v9.SectorKeyCID, + } + return info +} + +func fromV9SectorPreCommitOnChainInfo(v9 miner9.SectorPreCommitOnChainInfo) minertypes.SectorPreCommitOnChainInfo { + return minertypes.SectorPreCommitOnChainInfo{ + Info: minertypes.SectorPreCommitInfo{ + SealProof: v9.Info.SealProof, + SectorNumber: v9.Info.SectorNumber, + SealedCID: v9.Info.SealedCID, + SealRandEpoch: v9.Info.SealRandEpoch, + DealIDs: v9.Info.DealIDs, + Expiration: v9.Info.Expiration, + UnsealedCid: nil, + }, + PreCommitDeposit: v9.PreCommitDeposit, + PreCommitEpoch: v9.PreCommitEpoch, + } +} + +func (s *state9) GetState() interface{} { + return &s.State +} diff --git a/chain/actors/builtin/multisig/actor.go.template b/chain/actors/builtin/multisig/actor.go.template index bd6d4d77a..a02a986aa 100644 --- a/chain/actors/builtin/multisig/actor.go.template +++ b/chain/actors/builtin/multisig/actor.go.template @@ -1,6 +1,7 @@ package multisig import ( + actorstypes "github.com/filecoin-project/go-state-types/actors" "fmt" "github.com/minio/blake2b-simd" @@ -15,11 +16,11 @@ import ( {{range .versions}} {{if (le . 7)}} builtin{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin" - {{else}} - builtin{{.}} "github.com/filecoin-project/go-state-types/builtin" {{end}} {{end}} + builtintypes "github.com/filecoin-project/go-state-types/builtin" + "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/types" @@ -34,7 +35,7 @@ func Load(store adt.Store, act *types.Actor) (State, error) { switch av { {{range .versions}} {{if (ge . 8)}} - case actors.Version{{.}}: + case actorstypes.Version{{.}}: return load{{.}}(store, act.Head) {{end}} {{end}} @@ -53,10 +54,10 @@ func Load(store adt.Store, act *types.Actor) (State, error) { return nil, xerrors.Errorf("unknown actor code %s", act.Code) } -func MakeState(store adt.Store, av actors.Version, signers []address.Address, threshold uint64, startEpoch abi.ChainEpoch, unlockDuration abi.ChainEpoch, initialBalance abi.TokenAmount) (State, error) { +func MakeState(store adt.Store, av actorstypes.Version, signers []address.Address, threshold uint64, startEpoch abi.ChainEpoch, unlockDuration abi.ChainEpoch, initialBalance abi.TokenAmount) (State, error) { switch av { {{range .versions}} - case actors.Version{{.}}: + case actorstypes.Version{{.}}: return make{{.}}(store, signers, threshold, startEpoch, unlockDuration, initialBalance) {{end}} } @@ -83,12 +84,12 @@ type State interface { type Transaction = msig{{.latestVersion}}.Transaction -var Methods = builtin{{.latestVersion}}.MethodsMultisig +var Methods = builtintypes.MethodsMultisig -func Message(version actors.Version, from address.Address) MessageBuilder { +func Message(version actorstypes.Version, from address.Address) MessageBuilder { switch version { {{range .versions}} - case actors.Version{{.}}: + case actorstypes.Version{{.}}: return message{{.}}{{"{"}}{{if (ge . 2)}}message0{from}{{else}}from{{end}}} {{end}} default: panic(fmt.Sprintf("unsupported actors version: %d", version)) diff --git a/chain/actors/builtin/multisig/message.go.template b/chain/actors/builtin/multisig/message.go.template index 5542f4eec..499ed7467 100644 --- a/chain/actors/builtin/multisig/message.go.template +++ b/chain/actors/builtin/multisig/message.go.template @@ -10,10 +10,12 @@ import ( builtin{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin" init{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin/init" multisig{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin/multisig" + builtin{{.latestVersion}} "github.com/filecoin-project/go-state-types/builtin" {{else}} - builtin{{.v}} "github.com/filecoin-project/go-state-types/builtin" + actorstypes "github.com/filecoin-project/go-state-types/actors" multisig{{.v}} "github.com/filecoin-project/go-state-types/builtin/v8/multisig" - init{{.v}} "github.com/filecoin-project/go-state-types/builtin/v8/init" + init{{.latestVersion}} "github.com/filecoin-project/go-state-types/builtin/v{{.latestVersion}}/init" + builtin{{.latestVersion}} "github.com/filecoin-project/go-state-types/builtin" {{end}} @@ -68,13 +70,13 @@ func (m message{{.v}}) Create( ConstructorParams: enc, } {{else}} - code, ok := actors.GetActorCodeID(actors.Version{{.v}}, actors.MultisigKey) + code, ok := actors.GetActorCodeID(actorstypes.Version{{.v}}, actors.MultisigKey) if !ok { return nil, xerrors.Errorf("failed to get multisig code ID") } // new actors are created by invoking 'exec' on the init actor with the constructor params - execParams := &init8.ExecParams{ + execParams := &init{{.latestVersion}}.ExecParams{ CodeCID: code, ConstructorParams: enc, } @@ -88,7 +90,7 @@ func (m message{{.v}}) Create( return &types.Message{ To: init_.Address, From: m.from, - Method: builtin{{.v}}.MethodsInit.Exec, + Method: builtin{{.latestVersion}}.MethodsInit.Exec, Params: enc, Value: initialAmount, }, nil diff --git a/chain/actors/builtin/multisig/message0.go b/chain/actors/builtin/multisig/message0.go index ac538d5b0..8d7070c8b 100644 --- a/chain/actors/builtin/multisig/message0.go +++ b/chain/actors/builtin/multisig/message0.go @@ -5,6 +5,8 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" + + builtin9 "github.com/filecoin-project/go-state-types/builtin" builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" init0 "github.com/filecoin-project/specs-actors/actors/builtin/init" multisig0 "github.com/filecoin-project/specs-actors/actors/builtin/multisig" @@ -66,7 +68,7 @@ func (m message0) Create( return &types.Message{ To: init_.Address, From: m.from, - Method: builtin0.MethodsInit.Exec, + Method: builtin9.MethodsInit.Exec, Params: enc, Value: initialAmount, }, nil diff --git a/chain/actors/builtin/multisig/message2.go b/chain/actors/builtin/multisig/message2.go index 6667479b1..af454f298 100644 --- a/chain/actors/builtin/multisig/message2.go +++ b/chain/actors/builtin/multisig/message2.go @@ -5,6 +5,8 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" + + builtin9 "github.com/filecoin-project/go-state-types/builtin" builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" init2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/init" multisig2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/multisig" @@ -63,7 +65,7 @@ func (m message2) Create( return &types.Message{ To: init_.Address, From: m.from, - Method: builtin2.MethodsInit.Exec, + Method: builtin9.MethodsInit.Exec, Params: enc, Value: initialAmount, }, nil diff --git a/chain/actors/builtin/multisig/message3.go b/chain/actors/builtin/multisig/message3.go index b2e5880ba..2317c5133 100644 --- a/chain/actors/builtin/multisig/message3.go +++ b/chain/actors/builtin/multisig/message3.go @@ -5,6 +5,8 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" + + builtin9 "github.com/filecoin-project/go-state-types/builtin" builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" init3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/init" multisig3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/multisig" @@ -63,7 +65,7 @@ func (m message3) Create( return &types.Message{ To: init_.Address, From: m.from, - Method: builtin3.MethodsInit.Exec, + Method: builtin9.MethodsInit.Exec, Params: enc, Value: initialAmount, }, nil diff --git a/chain/actors/builtin/multisig/message4.go b/chain/actors/builtin/multisig/message4.go index c62ae3da5..53f447dcd 100644 --- a/chain/actors/builtin/multisig/message4.go +++ b/chain/actors/builtin/multisig/message4.go @@ -5,6 +5,8 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" + + builtin9 "github.com/filecoin-project/go-state-types/builtin" builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" init4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/init" multisig4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/multisig" @@ -63,7 +65,7 @@ func (m message4) Create( return &types.Message{ To: init_.Address, From: m.from, - Method: builtin4.MethodsInit.Exec, + Method: builtin9.MethodsInit.Exec, Params: enc, Value: initialAmount, }, nil diff --git a/chain/actors/builtin/multisig/message5.go b/chain/actors/builtin/multisig/message5.go index d1ae532ea..abca500fd 100644 --- a/chain/actors/builtin/multisig/message5.go +++ b/chain/actors/builtin/multisig/message5.go @@ -5,6 +5,8 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" + + builtin9 "github.com/filecoin-project/go-state-types/builtin" builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" init5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/init" multisig5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/multisig" @@ -63,7 +65,7 @@ func (m message5) Create( return &types.Message{ To: init_.Address, From: m.from, - Method: builtin5.MethodsInit.Exec, + Method: builtin9.MethodsInit.Exec, Params: enc, Value: initialAmount, }, nil diff --git a/chain/actors/builtin/multisig/message6.go b/chain/actors/builtin/multisig/message6.go index 896ea7212..84ee57741 100644 --- a/chain/actors/builtin/multisig/message6.go +++ b/chain/actors/builtin/multisig/message6.go @@ -5,6 +5,8 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" + + builtin9 "github.com/filecoin-project/go-state-types/builtin" builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" init6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/init" multisig6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/multisig" @@ -63,7 +65,7 @@ func (m message6) Create( return &types.Message{ To: init_.Address, From: m.from, - Method: builtin6.MethodsInit.Exec, + Method: builtin9.MethodsInit.Exec, Params: enc, Value: initialAmount, }, nil diff --git a/chain/actors/builtin/multisig/message7.go b/chain/actors/builtin/multisig/message7.go index b05952279..aaaabfe57 100644 --- a/chain/actors/builtin/multisig/message7.go +++ b/chain/actors/builtin/multisig/message7.go @@ -5,6 +5,8 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" + + builtin9 "github.com/filecoin-project/go-state-types/builtin" builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" init7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/init" multisig7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/multisig" @@ -63,7 +65,7 @@ func (m message7) Create( return &types.Message{ To: init_.Address, From: m.from, - Method: builtin7.MethodsInit.Exec, + Method: builtin9.MethodsInit.Exec, Params: enc, Value: initialAmount, }, nil diff --git a/chain/actors/builtin/multisig/message8.go b/chain/actors/builtin/multisig/message8.go index 23bee19d0..55d153b76 100644 --- a/chain/actors/builtin/multisig/message8.go +++ b/chain/actors/builtin/multisig/message8.go @@ -5,9 +5,11 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - builtin8 "github.com/filecoin-project/go-state-types/builtin" - init8 "github.com/filecoin-project/go-state-types/builtin/v8/init" + + actorstypes "github.com/filecoin-project/go-state-types/actors" + builtin9 "github.com/filecoin-project/go-state-types/builtin" multisig8 "github.com/filecoin-project/go-state-types/builtin/v8/multisig" + init9 "github.com/filecoin-project/go-state-types/builtin/v9/init" "github.com/filecoin-project/lotus/chain/actors" init_ "github.com/filecoin-project/lotus/chain/actors/builtin/init" @@ -49,13 +51,13 @@ func (m message8) Create( return nil, actErr } - code, ok := actors.GetActorCodeID(actors.Version8, actors.MultisigKey) + code, ok := actors.GetActorCodeID(actorstypes.Version8, actors.MultisigKey) if !ok { return nil, xerrors.Errorf("failed to get multisig code ID") } // new actors are created by invoking 'exec' on the init actor with the constructor params - execParams := &init8.ExecParams{ + execParams := &init9.ExecParams{ CodeCID: code, ConstructorParams: enc, } @@ -68,7 +70,7 @@ func (m message8) Create( return &types.Message{ To: init_.Address, From: m.from, - Method: builtin8.MethodsInit.Exec, + Method: builtin9.MethodsInit.Exec, Params: enc, Value: initialAmount, }, nil diff --git a/chain/actors/builtin/multisig/message9.go b/chain/actors/builtin/multisig/message9.go new file mode 100644 index 000000000..83a46cb8d --- /dev/null +++ b/chain/actors/builtin/multisig/message9.go @@ -0,0 +1,77 @@ +package multisig + +import ( + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + + actorstypes "github.com/filecoin-project/go-state-types/actors" + builtin9 "github.com/filecoin-project/go-state-types/builtin" + multisig9 "github.com/filecoin-project/go-state-types/builtin/v8/multisig" + init9 "github.com/filecoin-project/go-state-types/builtin/v9/init" + + "github.com/filecoin-project/lotus/chain/actors" + init_ "github.com/filecoin-project/lotus/chain/actors/builtin/init" + "github.com/filecoin-project/lotus/chain/types" +) + +type message9 struct{ message0 } + +func (m message9) Create( + signers []address.Address, threshold uint64, + unlockStart, unlockDuration abi.ChainEpoch, + initialAmount abi.TokenAmount, +) (*types.Message, error) { + + lenAddrs := uint64(len(signers)) + + if lenAddrs < threshold { + return nil, xerrors.Errorf("cannot require signing of more addresses than provided for multisig") + } + + if threshold == 0 { + threshold = lenAddrs + } + + if m.from == address.Undef { + return nil, xerrors.Errorf("must provide source address") + } + + // Set up constructor parameters for multisig + msigParams := &multisig9.ConstructorParams{ + Signers: signers, + NumApprovalsThreshold: threshold, + UnlockDuration: unlockDuration, + StartEpoch: unlockStart, + } + + enc, actErr := actors.SerializeParams(msigParams) + if actErr != nil { + return nil, actErr + } + + code, ok := actors.GetActorCodeID(actorstypes.Version9, actors.MultisigKey) + if !ok { + return nil, xerrors.Errorf("failed to get multisig code ID") + } + + // new actors are created by invoking 'exec' on the init actor with the constructor params + execParams := &init9.ExecParams{ + CodeCID: code, + ConstructorParams: enc, + } + + enc, actErr = actors.SerializeParams(execParams) + if actErr != nil { + return nil, actErr + } + + return &types.Message{ + To: init_.Address, + From: m.from, + Method: builtin9.MethodsInit.Exec, + Params: enc, + Value: initialAmount, + }, nil +} diff --git a/chain/actors/builtin/multisig/multisig.go b/chain/actors/builtin/multisig/multisig.go index 1b2fa7948..b29153b70 100644 --- a/chain/actors/builtin/multisig/multisig.go +++ b/chain/actors/builtin/multisig/multisig.go @@ -2,6 +2,7 @@ package multisig import ( "fmt" + actorstypes "github.com/filecoin-project/go-state-types/actors" "github.com/minio/blake2b-simd" cbg "github.com/whyrusleeping/cbor-gen" @@ -9,17 +10,26 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - builtin8 "github.com/filecoin-project/go-state-types/builtin" - msig8 "github.com/filecoin-project/go-state-types/builtin/v8/multisig" "github.com/filecoin-project/go-state-types/cbor" + + msig9 "github.com/filecoin-project/go-state-types/builtin/v9/multisig" + builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" + builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" + builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" + builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" + builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" + builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + builtintypes "github.com/filecoin-project/go-state-types/builtin" + "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/types" @@ -33,9 +43,12 @@ func Load(store adt.Store, act *types.Actor) (State, error) { switch av { - case actors.Version8: + case actorstypes.Version8: return load8(store, act.Head) + case actorstypes.Version9: + return load9(store, act.Head) + } } @@ -67,33 +80,36 @@ func Load(store adt.Store, act *types.Actor) (State, error) { return nil, xerrors.Errorf("unknown actor code %s", act.Code) } -func MakeState(store adt.Store, av actors.Version, signers []address.Address, threshold uint64, startEpoch abi.ChainEpoch, unlockDuration abi.ChainEpoch, initialBalance abi.TokenAmount) (State, error) { +func MakeState(store adt.Store, av actorstypes.Version, signers []address.Address, threshold uint64, startEpoch abi.ChainEpoch, unlockDuration abi.ChainEpoch, initialBalance abi.TokenAmount) (State, error) { switch av { - case actors.Version0: + case actorstypes.Version0: return make0(store, signers, threshold, startEpoch, unlockDuration, initialBalance) - case actors.Version2: + case actorstypes.Version2: return make2(store, signers, threshold, startEpoch, unlockDuration, initialBalance) - case actors.Version3: + case actorstypes.Version3: return make3(store, signers, threshold, startEpoch, unlockDuration, initialBalance) - case actors.Version4: + case actorstypes.Version4: return make4(store, signers, threshold, startEpoch, unlockDuration, initialBalance) - case actors.Version5: + case actorstypes.Version5: return make5(store, signers, threshold, startEpoch, unlockDuration, initialBalance) - case actors.Version6: + case actorstypes.Version6: return make6(store, signers, threshold, startEpoch, unlockDuration, initialBalance) - case actors.Version7: + case actorstypes.Version7: return make7(store, signers, threshold, startEpoch, unlockDuration, initialBalance) - case actors.Version8: + case actorstypes.Version8: return make8(store, signers, threshold, startEpoch, unlockDuration, initialBalance) + case actorstypes.Version9: + return make9(store, signers, threshold, startEpoch, unlockDuration, initialBalance) + } return nil, xerrors.Errorf("unknown actor version %d", av) } @@ -116,36 +132,39 @@ type State interface { GetState() interface{} } -type Transaction = msig8.Transaction +type Transaction = msig9.Transaction -var Methods = builtin8.MethodsMultisig +var Methods = builtintypes.MethodsMultisig -func Message(version actors.Version, from address.Address) MessageBuilder { +func Message(version actorstypes.Version, from address.Address) MessageBuilder { switch version { - case actors.Version0: + case actorstypes.Version0: return message0{from} - case actors.Version2: + case actorstypes.Version2: return message2{message0{from}} - case actors.Version3: + case actorstypes.Version3: return message3{message0{from}} - case actors.Version4: + case actorstypes.Version4: return message4{message0{from}} - case actors.Version5: + case actorstypes.Version5: return message5{message0{from}} - case actors.Version6: + case actorstypes.Version6: return message6{message0{from}} - case actors.Version7: + case actorstypes.Version7: return message7{message0{from}} - case actors.Version8: + case actorstypes.Version8: return message8{message0{from}} + + case actorstypes.Version9: + return message9{message0{from}} default: panic(fmt.Sprintf("unsupported actors version: %d", version)) } @@ -169,13 +188,13 @@ type MessageBuilder interface { } // this type is the same between v0 and v2 -type ProposalHashData = msig8.ProposalHashData -type ProposeReturn = msig8.ProposeReturn -type ProposeParams = msig8.ProposeParams -type ApproveReturn = msig8.ApproveReturn +type ProposalHashData = msig9.ProposalHashData +type ProposeReturn = msig9.ProposeReturn +type ProposeParams = msig9.ProposeParams +type ApproveReturn = msig9.ApproveReturn func txnParams(id uint64, data *ProposalHashData) ([]byte, error) { - params := msig8.TxnIDParams{ID: msig8.TxnID(id)} + params := msig9.TxnIDParams{ID: msig9.TxnID(id)} if data != nil { if data.Requester.Protocol() != address.ID { return nil, xerrors.Errorf("proposer address must be an ID address, was %s", data.Requester) diff --git a/chain/actors/builtin/multisig/v0.go b/chain/actors/builtin/multisig/v0.go index 9f4d09dc1..ccd9a9e37 100644 --- a/chain/actors/builtin/multisig/v0.go +++ b/chain/actors/builtin/multisig/v0.go @@ -4,16 +4,16 @@ import ( "bytes" "encoding/binary" + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/lotus/chain/actors/adt" + msig0 "github.com/filecoin-project/specs-actors/actors/builtin/multisig" adt0 "github.com/filecoin-project/specs-actors/actors/util/adt" - - "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state0)(nil) diff --git a/chain/actors/builtin/multisig/v2.go b/chain/actors/builtin/multisig/v2.go index 14e895680..c3579b3e2 100644 --- a/chain/actors/builtin/multisig/v2.go +++ b/chain/actors/builtin/multisig/v2.go @@ -4,16 +4,16 @@ import ( "bytes" "encoding/binary" + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/lotus/chain/actors/adt" + msig2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/multisig" adt2 "github.com/filecoin-project/specs-actors/v2/actors/util/adt" - - "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state2)(nil) diff --git a/chain/actors/builtin/multisig/v3.go b/chain/actors/builtin/multisig/v3.go index 5cde148c1..80682808e 100644 --- a/chain/actors/builtin/multisig/v3.go +++ b/chain/actors/builtin/multisig/v3.go @@ -4,17 +4,18 @@ import ( "bytes" "encoding/binary" + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/lotus/chain/actors/adt" + builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" + msig3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/multisig" adt3 "github.com/filecoin-project/specs-actors/v3/actors/util/adt" - - "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state3)(nil) diff --git a/chain/actors/builtin/multisig/v4.go b/chain/actors/builtin/multisig/v4.go index 87936661d..f065f9f8c 100644 --- a/chain/actors/builtin/multisig/v4.go +++ b/chain/actors/builtin/multisig/v4.go @@ -4,17 +4,18 @@ import ( "bytes" "encoding/binary" + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/lotus/chain/actors/adt" + builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" + msig4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/multisig" adt4 "github.com/filecoin-project/specs-actors/v4/actors/util/adt" - - "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state4)(nil) diff --git a/chain/actors/builtin/multisig/v5.go b/chain/actors/builtin/multisig/v5.go index d50638ca5..783e3987f 100644 --- a/chain/actors/builtin/multisig/v5.go +++ b/chain/actors/builtin/multisig/v5.go @@ -4,17 +4,18 @@ import ( "bytes" "encoding/binary" + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/lotus/chain/actors/adt" + builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" + msig5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/multisig" adt5 "github.com/filecoin-project/specs-actors/v5/actors/util/adt" - - "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state5)(nil) diff --git a/chain/actors/builtin/multisig/v6.go b/chain/actors/builtin/multisig/v6.go index 9246eeaa9..71ea3c00c 100644 --- a/chain/actors/builtin/multisig/v6.go +++ b/chain/actors/builtin/multisig/v6.go @@ -4,17 +4,18 @@ import ( "bytes" "encoding/binary" + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/lotus/chain/actors/adt" + builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + msig6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/multisig" adt6 "github.com/filecoin-project/specs-actors/v6/actors/util/adt" - - "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state6)(nil) diff --git a/chain/actors/builtin/multisig/v7.go b/chain/actors/builtin/multisig/v7.go index a6b630179..8ed1caacd 100644 --- a/chain/actors/builtin/multisig/v7.go +++ b/chain/actors/builtin/multisig/v7.go @@ -4,17 +4,18 @@ import ( "bytes" "encoding/binary" + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/lotus/chain/actors/adt" + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + msig7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/multisig" adt7 "github.com/filecoin-project/specs-actors/v7/actors/util/adt" - - "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state7)(nil) diff --git a/chain/actors/builtin/multisig/v8.go b/chain/actors/builtin/multisig/v8.go index 6311583b3..5b76f662e 100644 --- a/chain/actors/builtin/multisig/v8.go +++ b/chain/actors/builtin/multisig/v8.go @@ -4,17 +4,17 @@ import ( "bytes" "encoding/binary" + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/lotus/chain/actors/adt" + builtin8 "github.com/filecoin-project/go-state-types/builtin" msig8 "github.com/filecoin-project/go-state-types/builtin/v8/multisig" adt8 "github.com/filecoin-project/go-state-types/builtin/v8/util/adt" - - "github.com/filecoin-project/lotus/chain/actors/adt" ) var _ State = (*state8)(nil) diff --git a/chain/actors/builtin/multisig/v9.go b/chain/actors/builtin/multisig/v9.go new file mode 100644 index 000000000..cf6df9316 --- /dev/null +++ b/chain/actors/builtin/multisig/v9.go @@ -0,0 +1,117 @@ +package multisig + +import ( + "bytes" + "encoding/binary" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + "golang.org/x/xerrors" + + "github.com/filecoin-project/lotus/chain/actors/adt" + + builtin9 "github.com/filecoin-project/go-state-types/builtin" + msig9 "github.com/filecoin-project/go-state-types/builtin/v9/multisig" + adt9 "github.com/filecoin-project/go-state-types/builtin/v9/util/adt" +) + +var _ State = (*state9)(nil) + +func load9(store adt.Store, root cid.Cid) (State, error) { + out := state9{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make9(store adt.Store, signers []address.Address, threshold uint64, startEpoch abi.ChainEpoch, unlockDuration abi.ChainEpoch, initialBalance abi.TokenAmount) (State, error) { + out := state9{store: store} + out.State = msig9.State{} + out.State.Signers = signers + out.State.NumApprovalsThreshold = threshold + out.State.StartEpoch = startEpoch + out.State.UnlockDuration = unlockDuration + out.State.InitialBalance = initialBalance + + em, err := adt9.StoreEmptyMap(store, builtin9.DefaultHamtBitwidth) + if err != nil { + return nil, err + } + + out.State.PendingTxns = em + + return &out, nil +} + +type state9 struct { + msig9.State + store adt.Store +} + +func (s *state9) LockedBalance(currEpoch abi.ChainEpoch) (abi.TokenAmount, error) { + return s.State.AmountLocked(currEpoch - s.State.StartEpoch), nil +} + +func (s *state9) StartEpoch() (abi.ChainEpoch, error) { + return s.State.StartEpoch, nil +} + +func (s *state9) UnlockDuration() (abi.ChainEpoch, error) { + return s.State.UnlockDuration, nil +} + +func (s *state9) InitialBalance() (abi.TokenAmount, error) { + return s.State.InitialBalance, nil +} + +func (s *state9) Threshold() (uint64, error) { + return s.State.NumApprovalsThreshold, nil +} + +func (s *state9) Signers() ([]address.Address, error) { + return s.State.Signers, nil +} + +func (s *state9) ForEachPendingTxn(cb func(id int64, txn Transaction) error) error { + arr, err := adt9.AsMap(s.store, s.State.PendingTxns, builtin9.DefaultHamtBitwidth) + if err != nil { + return err + } + var out msig9.Transaction + return arr.ForEach(&out, func(key string) error { + txid, n := binary.Varint([]byte(key)) + if n <= 0 { + return xerrors.Errorf("invalid pending transaction key: %v", key) + } + return cb(txid, (Transaction)(out)) //nolint:unconvert + }) +} + +func (s *state9) PendingTxnChanged(other State) (bool, error) { + other9, ok := other.(*state9) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + return !s.State.PendingTxns.Equals(other9.PendingTxns), nil +} + +func (s *state9) transactions() (adt.Map, error) { + return adt9.AsMap(s.store, s.PendingTxns, builtin9.DefaultHamtBitwidth) +} + +func (s *state9) decodeTransaction(val *cbg.Deferred) (Transaction, error) { + var tx msig9.Transaction + if err := tx.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { + return Transaction{}, err + } + return Transaction(tx), nil +} + +func (s *state9) GetState() interface{} { + return &s.State +} diff --git a/chain/actors/builtin/paych/actor.go.template b/chain/actors/builtin/paych/actor.go.template index a815c880e..1308d4ea4 100644 --- a/chain/actors/builtin/paych/actor.go.template +++ b/chain/actors/builtin/paych/actor.go.template @@ -1,6 +1,7 @@ package paych import ( + actorstypes "github.com/filecoin-project/go-state-types/actors" "encoding/base64" "fmt" @@ -35,7 +36,7 @@ func Load(store adt.Store, act *types.Actor) (State, error) { switch av { {{range .versions}} {{if (ge . 8)}} - case actors.Version{{.}}: + case actorstypes.Version{{.}}: return load{{.}}(store, act.Head) {{end}} {{end}} @@ -99,10 +100,10 @@ func DecodeSignedVoucher(s string) (*paychtypes.SignedVoucher, error) { return &sv, nil } -func Message(version actors.Version, from address.Address) MessageBuilder { +func Message(version actorstypes.Version, from address.Address) MessageBuilder { switch version { {{range .versions}} - case actors.Version{{.}}: + case actorstypes.Version{{.}}: return message{{.}}{from} {{end}} default: diff --git a/chain/actors/builtin/paych/message.go.template b/chain/actors/builtin/paych/message.go.template index 9e92bf748..79aed1692 100644 --- a/chain/actors/builtin/paych/message.go.template +++ b/chain/actors/builtin/paych/message.go.template @@ -14,9 +14,10 @@ import ( init{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin/init" paych{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin/paych" {{else}} + actorstypes "github.com/filecoin-project/go-state-types/actors" builtin{{.v}} "github.com/filecoin-project/go-state-types/builtin" - paych{{.v}} "github.com/filecoin-project/go-state-types/builtin/v8/paych" - init{{.v}} "github.com/filecoin-project/go-state-types/builtin/v8/init" + paych{{.v}} "github.com/filecoin-project/go-state-types/builtin/v{{.v}}/paych" + init{{.v}} "github.com/filecoin-project/go-state-types/builtin/v{{.v}}/init" {{end}} @@ -31,7 +32,7 @@ func (m message{{.v}}) Create(to address.Address, initialAmount abi.TokenAmount) {{if (le .v 7)}} actorCodeID := builtin{{.v}}.PaymentChannelActorCodeID {{else}} - actorCodeID, ok := actors.GetActorCodeID(actors.Version{{.v}}, "paymentchannel") + actorCodeID, ok := actors.GetActorCodeID(actorstypes.Version{{.v}}, "paymentchannel") if !ok { return nil, xerrors.Errorf("error getting actor paymentchannel code id for actor version %d", {{.v}}) } @@ -62,8 +63,10 @@ func (m message{{.v}}) Update(paych address.Address, sv *paychtypes.SignedVouche params, aerr := actors.SerializeParams(&paych{{.v}}.UpdateChannelStateParams{ {{if (le .v 6)}} Sv: toV0SignedVoucher(*sv), - {{else}} + {{else if (le .v 8)}} Sv: *sv, + {{else}} + Sv: toV{{.v}}SignedVoucher(*sv), {{end}} Secret: secret, }) @@ -80,6 +83,32 @@ func (m message{{.v}}) Update(paych address.Address, sv *paychtypes.SignedVouche }, nil } +{{if (ge .v 9)}} + func toV{{.v}}SignedVoucher(sv paychtypes.SignedVoucher) paych{{.v}}.SignedVoucher { + merges := make([]paych{{.v}}.Merge, len(sv.Merges)) + for i := range sv.Merges { + merges[i] = paych{{.v}}.Merge{ + Lane: sv.Merges[i].Lane, + Nonce: sv.Merges[i].Nonce, + } + } + + return paych{{.v}}.SignedVoucher{ + ChannelAddr: sv.ChannelAddr, + TimeLockMin: sv.TimeLockMin, + TimeLockMax: sv.TimeLockMax, + SecretHash: sv.SecretHash, + Extra: (*paych{{.v}}.ModVerifyParams)(sv.Extra), + Lane: sv.Lane, + Nonce: sv.Nonce, + Amount: sv.Amount, + MinSettleHeight: sv.MinSettleHeight, + Merges: merges, + Signature: sv.Signature, + } + } +{{end}} + func (m message{{.v}}) Settle(paych address.Address) (*types.Message, error) { return &types.Message{ To: paych, diff --git a/chain/actors/builtin/paych/message0.go b/chain/actors/builtin/paych/message0.go index d5a112d43..2daa0301b 100644 --- a/chain/actors/builtin/paych/message0.go +++ b/chain/actors/builtin/paych/message0.go @@ -3,7 +3,9 @@ package paych import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" + paychtypes "github.com/filecoin-project/go-state-types/builtin/v8/paych" + builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" init0 "github.com/filecoin-project/specs-actors/actors/builtin/init" paych0 "github.com/filecoin-project/specs-actors/actors/builtin/paych" diff --git a/chain/actors/builtin/paych/message2.go b/chain/actors/builtin/paych/message2.go index 89a6e74ce..925ad0ed9 100644 --- a/chain/actors/builtin/paych/message2.go +++ b/chain/actors/builtin/paych/message2.go @@ -3,7 +3,9 @@ package paych import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" + paychtypes "github.com/filecoin-project/go-state-types/builtin/v8/paych" + builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" init2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/init" paych2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/paych" diff --git a/chain/actors/builtin/paych/message3.go b/chain/actors/builtin/paych/message3.go index 47f8e7e9e..e8ae585fc 100644 --- a/chain/actors/builtin/paych/message3.go +++ b/chain/actors/builtin/paych/message3.go @@ -3,7 +3,9 @@ package paych import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" + paychtypes "github.com/filecoin-project/go-state-types/builtin/v8/paych" + builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" init3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/init" paych3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/paych" diff --git a/chain/actors/builtin/paych/message4.go b/chain/actors/builtin/paych/message4.go index 65e63149d..b32b0fa57 100644 --- a/chain/actors/builtin/paych/message4.go +++ b/chain/actors/builtin/paych/message4.go @@ -3,7 +3,9 @@ package paych import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" + paychtypes "github.com/filecoin-project/go-state-types/builtin/v8/paych" + builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" init4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/init" paych4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/paych" diff --git a/chain/actors/builtin/paych/message5.go b/chain/actors/builtin/paych/message5.go index ede1c8ceb..897bebe7a 100644 --- a/chain/actors/builtin/paych/message5.go +++ b/chain/actors/builtin/paych/message5.go @@ -3,7 +3,9 @@ package paych import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" + paychtypes "github.com/filecoin-project/go-state-types/builtin/v8/paych" + builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" init5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/init" paych5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/paych" diff --git a/chain/actors/builtin/paych/message6.go b/chain/actors/builtin/paych/message6.go index 009e8641f..11bd3a8a5 100644 --- a/chain/actors/builtin/paych/message6.go +++ b/chain/actors/builtin/paych/message6.go @@ -3,7 +3,9 @@ package paych import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" + paychtypes "github.com/filecoin-project/go-state-types/builtin/v8/paych" + builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" init6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/init" paych6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/paych" diff --git a/chain/actors/builtin/paych/message7.go b/chain/actors/builtin/paych/message7.go index 430fb9341..446e54ead 100644 --- a/chain/actors/builtin/paych/message7.go +++ b/chain/actors/builtin/paych/message7.go @@ -3,7 +3,9 @@ package paych import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" + paychtypes "github.com/filecoin-project/go-state-types/builtin/v8/paych" + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" init7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/init" paych7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/paych" diff --git a/chain/actors/builtin/paych/message8.go b/chain/actors/builtin/paych/message8.go index 3fb743bc9..6d9df4f4c 100644 --- a/chain/actors/builtin/paych/message8.go +++ b/chain/actors/builtin/paych/message8.go @@ -5,10 +5,13 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" + + paychtypes "github.com/filecoin-project/go-state-types/builtin/v8/paych" + + actorstypes "github.com/filecoin-project/go-state-types/actors" builtin8 "github.com/filecoin-project/go-state-types/builtin" init8 "github.com/filecoin-project/go-state-types/builtin/v8/init" paych8 "github.com/filecoin-project/go-state-types/builtin/v8/paych" - paychtypes "github.com/filecoin-project/go-state-types/builtin/v8/paych" "github.com/filecoin-project/lotus/chain/actors" init_ "github.com/filecoin-project/lotus/chain/actors/builtin/init" @@ -19,7 +22,7 @@ type message8 struct{ from address.Address } func (m message8) Create(to address.Address, initialAmount abi.TokenAmount) (*types.Message, error) { - actorCodeID, ok := actors.GetActorCodeID(actors.Version8, "paymentchannel") + actorCodeID, ok := actors.GetActorCodeID(actorstypes.Version8, "paymentchannel") if !ok { return nil, xerrors.Errorf("error getting actor paymentchannel code id for actor version %d", 8) } diff --git a/chain/actors/builtin/paych/message9.go b/chain/actors/builtin/paych/message9.go new file mode 100644 index 000000000..c0e68a4c3 --- /dev/null +++ b/chain/actors/builtin/paych/message9.go @@ -0,0 +1,111 @@ +package paych + +import ( + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + + paychtypes "github.com/filecoin-project/go-state-types/builtin/v8/paych" + + actorstypes "github.com/filecoin-project/go-state-types/actors" + builtin9 "github.com/filecoin-project/go-state-types/builtin" + init9 "github.com/filecoin-project/go-state-types/builtin/v9/init" + paych9 "github.com/filecoin-project/go-state-types/builtin/v9/paych" + + "github.com/filecoin-project/lotus/chain/actors" + init_ "github.com/filecoin-project/lotus/chain/actors/builtin/init" + "github.com/filecoin-project/lotus/chain/types" +) + +type message9 struct{ from address.Address } + +func (m message9) Create(to address.Address, initialAmount abi.TokenAmount) (*types.Message, error) { + + actorCodeID, ok := actors.GetActorCodeID(actorstypes.Version9, "paymentchannel") + if !ok { + return nil, xerrors.Errorf("error getting actor paymentchannel code id for actor version %d", 9) + } + + params, aerr := actors.SerializeParams(&paych9.ConstructorParams{From: m.from, To: to}) + if aerr != nil { + return nil, aerr + } + enc, aerr := actors.SerializeParams(&init9.ExecParams{ + CodeCID: actorCodeID, + ConstructorParams: params, + }) + if aerr != nil { + return nil, aerr + } + + return &types.Message{ + To: init_.Address, + From: m.from, + Value: initialAmount, + Method: builtin9.MethodsInit.Exec, + Params: enc, + }, nil +} + +func (m message9) Update(paych address.Address, sv *paychtypes.SignedVoucher, secret []byte) (*types.Message, error) { + params, aerr := actors.SerializeParams(&paych9.UpdateChannelStateParams{ + + Sv: toV9SignedVoucher(*sv), + + Secret: secret, + }) + if aerr != nil { + return nil, aerr + } + + return &types.Message{ + To: paych, + From: m.from, + Value: abi.NewTokenAmount(0), + Method: builtin9.MethodsPaych.UpdateChannelState, + Params: params, + }, nil +} + +func toV9SignedVoucher(sv paychtypes.SignedVoucher) paych9.SignedVoucher { + merges := make([]paych9.Merge, len(sv.Merges)) + for i := range sv.Merges { + merges[i] = paych9.Merge{ + Lane: sv.Merges[i].Lane, + Nonce: sv.Merges[i].Nonce, + } + } + + return paych9.SignedVoucher{ + ChannelAddr: sv.ChannelAddr, + TimeLockMin: sv.TimeLockMin, + TimeLockMax: sv.TimeLockMax, + SecretHash: sv.SecretHash, + Extra: (*paych9.ModVerifyParams)(sv.Extra), + Lane: sv.Lane, + Nonce: sv.Nonce, + Amount: sv.Amount, + MinSettleHeight: sv.MinSettleHeight, + Merges: merges, + Signature: sv.Signature, + } +} + +func (m message9) Settle(paych address.Address) (*types.Message, error) { + return &types.Message{ + To: paych, + From: m.from, + Value: abi.NewTokenAmount(0), + Method: builtin9.MethodsPaych.Settle, + }, nil +} + +func (m message9) Collect(paych address.Address) (*types.Message, error) { + return &types.Message{ + To: paych, + From: m.from, + Value: abi.NewTokenAmount(0), + Method: builtin9.MethodsPaych.Collect, + }, nil +} diff --git a/chain/actors/builtin/paych/paych.go b/chain/actors/builtin/paych/paych.go index 20d9d2552..2fc2eca81 100644 --- a/chain/actors/builtin/paych/paych.go +++ b/chain/actors/builtin/paych/paych.go @@ -3,22 +3,31 @@ package paych import ( "encoding/base64" "fmt" + actorstypes "github.com/filecoin-project/go-state-types/actors" - ipldcbor "github.com/ipfs/go-ipld-cbor" "golang.org/x/xerrors" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" - paychtypes "github.com/filecoin-project/go-state-types/builtin/v8/paych" "github.com/filecoin-project/go-state-types/cbor" - builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" + ipldcbor "github.com/ipfs/go-ipld-cbor" + + paychtypes "github.com/filecoin-project/go-state-types/builtin/v8/paych" paych0 "github.com/filecoin-project/specs-actors/actors/builtin/paych" + + builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" + builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" + builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" + builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" + builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" + builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" "github.com/filecoin-project/lotus/chain/actors" @@ -35,9 +44,12 @@ func Load(store adt.Store, act *types.Actor) (State, error) { switch av { - case actors.Version8: + case actorstypes.Version8: return load8(store, act.Head) + case actorstypes.Version9: + return load9(store, act.Head) + } } @@ -114,33 +126,36 @@ func DecodeSignedVoucher(s string) (*paychtypes.SignedVoucher, error) { return &sv, nil } -func Message(version actors.Version, from address.Address) MessageBuilder { +func Message(version actorstypes.Version, from address.Address) MessageBuilder { switch version { - case actors.Version0: + case actorstypes.Version0: return message0{from} - case actors.Version2: + case actorstypes.Version2: return message2{from} - case actors.Version3: + case actorstypes.Version3: return message3{from} - case actors.Version4: + case actorstypes.Version4: return message4{from} - case actors.Version5: + case actorstypes.Version5: return message5{from} - case actors.Version6: + case actorstypes.Version6: return message6{from} - case actors.Version7: + case actorstypes.Version7: return message7{from} - case actors.Version8: + case actorstypes.Version8: return message8{from} + case actorstypes.Version9: + return message9{from} + default: panic(fmt.Sprintf("unsupported actors version: %d", version)) } diff --git a/chain/actors/builtin/paych/v0.go b/chain/actors/builtin/paych/v0.go index 727525c50..e9bc30e3d 100644 --- a/chain/actors/builtin/paych/v0.go +++ b/chain/actors/builtin/paych/v0.go @@ -6,10 +6,11 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" - paych0 "github.com/filecoin-project/specs-actors/actors/builtin/paych" - adt0 "github.com/filecoin-project/specs-actors/actors/util/adt" "github.com/filecoin-project/lotus/chain/actors/adt" + + paych0 "github.com/filecoin-project/specs-actors/actors/builtin/paych" + adt0 "github.com/filecoin-project/specs-actors/actors/util/adt" ) var _ State = (*state0)(nil) diff --git a/chain/actors/builtin/paych/v2.go b/chain/actors/builtin/paych/v2.go index 5852c9a64..400305e2f 100644 --- a/chain/actors/builtin/paych/v2.go +++ b/chain/actors/builtin/paych/v2.go @@ -6,10 +6,11 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" - paych2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/paych" - adt2 "github.com/filecoin-project/specs-actors/v2/actors/util/adt" "github.com/filecoin-project/lotus/chain/actors/adt" + + paych2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/paych" + adt2 "github.com/filecoin-project/specs-actors/v2/actors/util/adt" ) var _ State = (*state2)(nil) diff --git a/chain/actors/builtin/paych/v3.go b/chain/actors/builtin/paych/v3.go index 5297e9d10..1d7c2f94b 100644 --- a/chain/actors/builtin/paych/v3.go +++ b/chain/actors/builtin/paych/v3.go @@ -6,10 +6,11 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" - paych3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/paych" - adt3 "github.com/filecoin-project/specs-actors/v3/actors/util/adt" "github.com/filecoin-project/lotus/chain/actors/adt" + + paych3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/paych" + adt3 "github.com/filecoin-project/specs-actors/v3/actors/util/adt" ) var _ State = (*state3)(nil) diff --git a/chain/actors/builtin/paych/v4.go b/chain/actors/builtin/paych/v4.go index be10061bf..b7d1e52a5 100644 --- a/chain/actors/builtin/paych/v4.go +++ b/chain/actors/builtin/paych/v4.go @@ -6,10 +6,11 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" - paych4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/paych" - adt4 "github.com/filecoin-project/specs-actors/v4/actors/util/adt" "github.com/filecoin-project/lotus/chain/actors/adt" + + paych4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/paych" + adt4 "github.com/filecoin-project/specs-actors/v4/actors/util/adt" ) var _ State = (*state4)(nil) diff --git a/chain/actors/builtin/paych/v5.go b/chain/actors/builtin/paych/v5.go index 37a917273..b331a1500 100644 --- a/chain/actors/builtin/paych/v5.go +++ b/chain/actors/builtin/paych/v5.go @@ -6,10 +6,11 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" - paych5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/paych" - adt5 "github.com/filecoin-project/specs-actors/v5/actors/util/adt" "github.com/filecoin-project/lotus/chain/actors/adt" + + paych5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/paych" + adt5 "github.com/filecoin-project/specs-actors/v5/actors/util/adt" ) var _ State = (*state5)(nil) diff --git a/chain/actors/builtin/paych/v6.go b/chain/actors/builtin/paych/v6.go index 36676d9de..0d60b1f03 100644 --- a/chain/actors/builtin/paych/v6.go +++ b/chain/actors/builtin/paych/v6.go @@ -6,10 +6,11 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" - paych6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/paych" - adt6 "github.com/filecoin-project/specs-actors/v6/actors/util/adt" "github.com/filecoin-project/lotus/chain/actors/adt" + + paych6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/paych" + adt6 "github.com/filecoin-project/specs-actors/v6/actors/util/adt" ) var _ State = (*state6)(nil) diff --git a/chain/actors/builtin/paych/v7.go b/chain/actors/builtin/paych/v7.go index 88b6f2b84..ce09ea2e4 100644 --- a/chain/actors/builtin/paych/v7.go +++ b/chain/actors/builtin/paych/v7.go @@ -6,10 +6,11 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" - paych7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/paych" - adt7 "github.com/filecoin-project/specs-actors/v7/actors/util/adt" "github.com/filecoin-project/lotus/chain/actors/adt" + + paych7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/paych" + adt7 "github.com/filecoin-project/specs-actors/v7/actors/util/adt" ) var _ State = (*state7)(nil) diff --git a/chain/actors/builtin/paych/v8.go b/chain/actors/builtin/paych/v8.go index 1961e69ec..7936b76e1 100644 --- a/chain/actors/builtin/paych/v8.go +++ b/chain/actors/builtin/paych/v8.go @@ -6,10 +6,11 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" - paych8 "github.com/filecoin-project/go-state-types/builtin/v8/paych" - adt8 "github.com/filecoin-project/go-state-types/builtin/v8/util/adt" "github.com/filecoin-project/lotus/chain/actors/adt" + + paych8 "github.com/filecoin-project/go-state-types/builtin/v8/paych" + adt8 "github.com/filecoin-project/go-state-types/builtin/v8/util/adt" ) var _ State = (*state8)(nil) diff --git a/chain/actors/builtin/paych/v9.go b/chain/actors/builtin/paych/v9.go new file mode 100644 index 000000000..02493ac99 --- /dev/null +++ b/chain/actors/builtin/paych/v9.go @@ -0,0 +1,114 @@ +package paych + +import ( + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/big" + + "github.com/filecoin-project/lotus/chain/actors/adt" + + paych9 "github.com/filecoin-project/go-state-types/builtin/v9/paych" + adt9 "github.com/filecoin-project/go-state-types/builtin/v9/util/adt" +) + +var _ State = (*state9)(nil) + +func load9(store adt.Store, root cid.Cid) (State, error) { + out := state9{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make9(store adt.Store) (State, error) { + out := state9{store: store} + out.State = paych9.State{} + return &out, nil +} + +type state9 struct { + paych9.State + store adt.Store + lsAmt *adt9.Array +} + +// Channel owner, who has funded the actor +func (s *state9) From() (address.Address, error) { + return s.State.From, nil +} + +// Recipient of payouts from channel +func (s *state9) To() (address.Address, error) { + return s.State.To, nil +} + +// Height at which the channel can be `Collected` +func (s *state9) SettlingAt() (abi.ChainEpoch, error) { + return s.State.SettlingAt, nil +} + +// Amount successfully redeemed through the payment channel, paid out on `Collect()` +func (s *state9) ToSend() (abi.TokenAmount, error) { + return s.State.ToSend, nil +} + +func (s *state9) getOrLoadLsAmt() (*adt9.Array, error) { + if s.lsAmt != nil { + return s.lsAmt, nil + } + + // Get the lane state from the chain + lsamt, err := adt9.AsArray(s.store, s.State.LaneStates, paych9.LaneStatesAmtBitwidth) + if err != nil { + return nil, err + } + + s.lsAmt = lsamt + return lsamt, nil +} + +// Get total number of lanes +func (s *state9) LaneCount() (uint64, error) { + lsamt, err := s.getOrLoadLsAmt() + if err != nil { + return 0, err + } + return lsamt.Length(), nil +} + +func (s *state9) GetState() interface{} { + return &s.State +} + +// Iterate lane states +func (s *state9) ForEachLaneState(cb func(idx uint64, dl LaneState) error) error { + // Get the lane state from the chain + lsamt, err := s.getOrLoadLsAmt() + if err != nil { + return err + } + + // Note: we use a map instead of an array to store laneStates because the + // client sets the lane ID (the index) and potentially they could use a + // very large index. + var ls paych9.LaneState + return lsamt.ForEach(&ls, func(i int64) error { + return cb(uint64(i), &laneState9{ls}) + }) +} + +type laneState9 struct { + paych9.LaneState +} + +func (ls *laneState9) Redeemed() (big.Int, error) { + return ls.LaneState.Redeemed, nil +} + +func (ls *laneState9) Nonce() (uint64, error) { + return ls.LaneState.Nonce, nil +} diff --git a/chain/actors/builtin/power/actor.go.template b/chain/actors/builtin/power/actor.go.template index af9190357..93fe70370 100644 --- a/chain/actors/builtin/power/actor.go.template +++ b/chain/actors/builtin/power/actor.go.template @@ -1,6 +1,7 @@ package power import ( + actorstypes "github.com/filecoin-project/go-state-types/actors" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/lotus/chain/actors" @@ -17,10 +18,9 @@ import ( {{range .versions}} {{if (le . 7)}} builtin{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin" - {{else}} - builtin{{.}} "github.com/filecoin-project/go-state-types/builtin" {{end}} {{end}} + builtin{{.latestVersion}} "github.com/filecoin-project/go-state-types/builtin" ) var ( @@ -37,7 +37,7 @@ func Load(store adt.Store, act *types.Actor) (State, error) { switch av { {{range .versions}} {{if (ge . 8)}} - case actors.Version{{.}}: + case actorstypes.Version{{.}}: return load{{.}}(store, act.Head) {{end}} {{end}} @@ -56,10 +56,10 @@ func Load(store adt.Store, act *types.Actor) (State, error) { return nil, xerrors.Errorf("unknown actor code %s", act.Code) } -func MakeState(store adt.Store, av actors.Version) (State, error) { +func MakeState(store adt.Store, av actorstypes.Version) (State, error) { switch av { {{range .versions}} - case actors.Version{{.}}: + case actorstypes.Version{{.}}: return make{{.}}(store) {{end}} } diff --git a/chain/actors/builtin/power/power.go b/chain/actors/builtin/power/power.go index 2f1cfa22f..1d8563d5a 100644 --- a/chain/actors/builtin/power/power.go +++ b/chain/actors/builtin/power/power.go @@ -1,31 +1,40 @@ package power import ( + "github.com/filecoin-project/go-address" + actorstypes "github.com/filecoin-project/go-state-types/actors" + "github.com/filecoin-project/go-state-types/big" + "github.com/filecoin-project/lotus/chain/actors" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/big" - builtin8 "github.com/filecoin-project/go-state-types/builtin" "github.com/filecoin-project/go-state-types/cbor" - builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" - builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" - builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" - builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" - builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" - builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" - builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" - "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/builtin" "github.com/filecoin-project/lotus/chain/types" + + builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" + + builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" + + builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" + + builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" + + builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" + + builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + + builtin9 "github.com/filecoin-project/go-state-types/builtin" ) var ( - Address = builtin8.StoragePowerActorAddr - Methods = builtin8.MethodsPower + Address = builtin9.StoragePowerActorAddr + Methods = builtin9.MethodsPower ) func Load(store adt.Store, act *types.Actor) (State, error) { @@ -36,9 +45,12 @@ func Load(store adt.Store, act *types.Actor) (State, error) { switch av { - case actors.Version8: + case actorstypes.Version8: return load8(store, act.Head) + case actorstypes.Version9: + return load9(store, act.Head) + } } @@ -70,33 +82,36 @@ func Load(store adt.Store, act *types.Actor) (State, error) { return nil, xerrors.Errorf("unknown actor code %s", act.Code) } -func MakeState(store adt.Store, av actors.Version) (State, error) { +func MakeState(store adt.Store, av actorstypes.Version) (State, error) { switch av { - case actors.Version0: + case actorstypes.Version0: return make0(store) - case actors.Version2: + case actorstypes.Version2: return make2(store) - case actors.Version3: + case actorstypes.Version3: return make3(store) - case actors.Version4: + case actorstypes.Version4: return make4(store) - case actors.Version5: + case actorstypes.Version5: return make5(store) - case actors.Version6: + case actorstypes.Version6: return make6(store) - case actors.Version7: + case actorstypes.Version7: return make7(store) - case actors.Version8: + case actorstypes.Version8: return make8(store) + case actorstypes.Version9: + return make9(store) + } return nil, xerrors.Errorf("unknown actor version %d", av) } diff --git a/chain/actors/builtin/power/v0.go b/chain/actors/builtin/power/v0.go index 5ae42b4df..e114ac219 100644 --- a/chain/actors/builtin/power/v0.go +++ b/chain/actors/builtin/power/v0.go @@ -3,16 +3,16 @@ package power import ( "bytes" + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - power0 "github.com/filecoin-project/specs-actors/actors/builtin/power" - adt0 "github.com/filecoin-project/specs-actors/actors/util/adt" - "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/builtin" + + power0 "github.com/filecoin-project/specs-actors/actors/builtin/power" + adt0 "github.com/filecoin-project/specs-actors/actors/util/adt" ) var _ State = (*state0)(nil) diff --git a/chain/actors/builtin/power/v2.go b/chain/actors/builtin/power/v2.go index 485819e3e..405bad8ba 100644 --- a/chain/actors/builtin/power/v2.go +++ b/chain/actors/builtin/power/v2.go @@ -3,16 +3,16 @@ package power import ( "bytes" + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - power2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/power" - adt2 "github.com/filecoin-project/specs-actors/v2/actors/util/adt" - "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/builtin" + + power2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/power" + adt2 "github.com/filecoin-project/specs-actors/v2/actors/util/adt" ) var _ State = (*state2)(nil) diff --git a/chain/actors/builtin/power/v3.go b/chain/actors/builtin/power/v3.go index e33ee2bb5..0ff06f617 100644 --- a/chain/actors/builtin/power/v3.go +++ b/chain/actors/builtin/power/v3.go @@ -3,17 +3,18 @@ package power import ( "bytes" + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" - power3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/power" - adt3 "github.com/filecoin-project/specs-actors/v3/actors/util/adt" - "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/builtin" + + builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" + + power3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/power" + adt3 "github.com/filecoin-project/specs-actors/v3/actors/util/adt" ) var _ State = (*state3)(nil) diff --git a/chain/actors/builtin/power/v4.go b/chain/actors/builtin/power/v4.go index e5c446f07..f121e3b2f 100644 --- a/chain/actors/builtin/power/v4.go +++ b/chain/actors/builtin/power/v4.go @@ -3,17 +3,18 @@ package power import ( "bytes" + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" - power4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/power" - adt4 "github.com/filecoin-project/specs-actors/v4/actors/util/adt" - "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/builtin" + + builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" + + power4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/power" + adt4 "github.com/filecoin-project/specs-actors/v4/actors/util/adt" ) var _ State = (*state4)(nil) diff --git a/chain/actors/builtin/power/v5.go b/chain/actors/builtin/power/v5.go index aaf248058..851522e50 100644 --- a/chain/actors/builtin/power/v5.go +++ b/chain/actors/builtin/power/v5.go @@ -3,17 +3,18 @@ package power import ( "bytes" + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" - power5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/power" - adt5 "github.com/filecoin-project/specs-actors/v5/actors/util/adt" - "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/builtin" + + builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" + + power5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/power" + adt5 "github.com/filecoin-project/specs-actors/v5/actors/util/adt" ) var _ State = (*state5)(nil) diff --git a/chain/actors/builtin/power/v6.go b/chain/actors/builtin/power/v6.go index 072def6e2..083b85f45 100644 --- a/chain/actors/builtin/power/v6.go +++ b/chain/actors/builtin/power/v6.go @@ -3,17 +3,18 @@ package power import ( "bytes" + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" - power6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/power" - adt6 "github.com/filecoin-project/specs-actors/v6/actors/util/adt" - "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/builtin" + + builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + + power6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/power" + adt6 "github.com/filecoin-project/specs-actors/v6/actors/util/adt" ) var _ State = (*state6)(nil) diff --git a/chain/actors/builtin/power/v7.go b/chain/actors/builtin/power/v7.go index 0c60b03a0..af626cf3a 100644 --- a/chain/actors/builtin/power/v7.go +++ b/chain/actors/builtin/power/v7.go @@ -3,17 +3,18 @@ package power import ( "bytes" + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" - power7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/power" - adt7 "github.com/filecoin-project/specs-actors/v7/actors/util/adt" - "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/builtin" + + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + + power7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/power" + adt7 "github.com/filecoin-project/specs-actors/v7/actors/util/adt" ) var _ State = (*state7)(nil) diff --git a/chain/actors/builtin/power/v8.go b/chain/actors/builtin/power/v8.go index c23da6904..177d3bc3d 100644 --- a/chain/actors/builtin/power/v8.go +++ b/chain/actors/builtin/power/v8.go @@ -3,17 +3,17 @@ package power import ( "bytes" + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/lotus/chain/actors/adt" + "github.com/filecoin-project/lotus/chain/actors/builtin" + builtin8 "github.com/filecoin-project/go-state-types/builtin" power8 "github.com/filecoin-project/go-state-types/builtin/v8/power" adt8 "github.com/filecoin-project/go-state-types/builtin/v8/util/adt" - - "github.com/filecoin-project/lotus/chain/actors/adt" - "github.com/filecoin-project/lotus/chain/actors/builtin" ) var _ State = (*state8)(nil) diff --git a/chain/actors/builtin/power/v9.go b/chain/actors/builtin/power/v9.go new file mode 100644 index 000000000..30dbefe7a --- /dev/null +++ b/chain/actors/builtin/power/v9.go @@ -0,0 +1,186 @@ +package power + +import ( + "bytes" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + + "github.com/filecoin-project/lotus/chain/actors/adt" + "github.com/filecoin-project/lotus/chain/actors/builtin" + + builtin9 "github.com/filecoin-project/go-state-types/builtin" + adt9 "github.com/filecoin-project/go-state-types/builtin/v8/util/adt" + power9 "github.com/filecoin-project/go-state-types/builtin/v9/power" +) + +var _ State = (*state9)(nil) + +func load9(store adt.Store, root cid.Cid) (State, error) { + out := state9{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make9(store adt.Store) (State, error) { + out := state9{store: store} + + s, err := power9.ConstructState(store) + if err != nil { + return nil, err + } + + out.State = *s + + return &out, nil +} + +type state9 struct { + power9.State + store adt.Store +} + +func (s *state9) TotalLocked() (abi.TokenAmount, error) { + return s.TotalPledgeCollateral, nil +} + +func (s *state9) TotalPower() (Claim, error) { + return Claim{ + RawBytePower: s.TotalRawBytePower, + QualityAdjPower: s.TotalQualityAdjPower, + }, nil +} + +// Committed power to the network. Includes miners below the minimum threshold. +func (s *state9) TotalCommitted() (Claim, error) { + return Claim{ + RawBytePower: s.TotalBytesCommitted, + QualityAdjPower: s.TotalQABytesCommitted, + }, nil +} + +func (s *state9) MinerPower(addr address.Address) (Claim, bool, error) { + claims, err := s.claims() + if err != nil { + return Claim{}, false, err + } + var claim power9.Claim + ok, err := claims.Get(abi.AddrKey(addr), &claim) + if err != nil { + return Claim{}, false, err + } + return Claim{ + RawBytePower: claim.RawBytePower, + QualityAdjPower: claim.QualityAdjPower, + }, ok, nil +} + +func (s *state9) MinerNominalPowerMeetsConsensusMinimum(a address.Address) (bool, error) { + return s.State.MinerNominalPowerMeetsConsensusMinimum(s.store, a) +} + +func (s *state9) TotalPowerSmoothed() (builtin.FilterEstimate, error) { + return builtin.FilterEstimate(s.State.ThisEpochQAPowerSmoothed), nil +} + +func (s *state9) MinerCounts() (uint64, uint64, error) { + return uint64(s.State.MinerAboveMinPowerCount), uint64(s.State.MinerCount), nil +} + +func (s *state9) ListAllMiners() ([]address.Address, error) { + claims, err := s.claims() + if err != nil { + return nil, err + } + + var miners []address.Address + err = claims.ForEach(nil, func(k string) error { + a, err := address.NewFromBytes([]byte(k)) + if err != nil { + return err + } + miners = append(miners, a) + return nil + }) + if err != nil { + return nil, err + } + + return miners, nil +} + +func (s *state9) ForEachClaim(cb func(miner address.Address, claim Claim) error) error { + claims, err := s.claims() + if err != nil { + return err + } + + var claim power9.Claim + return claims.ForEach(&claim, func(k string) error { + a, err := address.NewFromBytes([]byte(k)) + if err != nil { + return err + } + return cb(a, Claim{ + RawBytePower: claim.RawBytePower, + QualityAdjPower: claim.QualityAdjPower, + }) + }) +} + +func (s *state9) ClaimsChanged(other State) (bool, error) { + other9, ok := other.(*state9) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + return !s.State.Claims.Equals(other9.State.Claims), nil +} + +func (s *state9) SetTotalQualityAdjPower(p abi.StoragePower) error { + s.State.TotalQualityAdjPower = p + return nil +} + +func (s *state9) SetTotalRawBytePower(p abi.StoragePower) error { + s.State.TotalRawBytePower = p + return nil +} + +func (s *state9) SetThisEpochQualityAdjPower(p abi.StoragePower) error { + s.State.ThisEpochQualityAdjPower = p + return nil +} + +func (s *state9) SetThisEpochRawBytePower(p abi.StoragePower) error { + s.State.ThisEpochRawBytePower = p + return nil +} + +func (s *state9) GetState() interface{} { + return &s.State +} + +func (s *state9) claims() (adt.Map, error) { + return adt9.AsMap(s.store, s.Claims, builtin9.DefaultHamtBitwidth) +} + +func (s *state9) decodeClaim(val *cbg.Deferred) (Claim, error) { + var ci power9.Claim + if err := ci.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { + return Claim{}, err + } + return fromV9Claim(ci), nil +} + +func fromV9Claim(v9 power9.Claim) Claim { + return Claim{ + RawBytePower: v9.RawBytePower, + QualityAdjPower: v9.QualityAdjPower, + } +} diff --git a/chain/actors/builtin/registry.go b/chain/actors/builtin/registry.go new file mode 100644 index 000000000..20df77678 --- /dev/null +++ b/chain/actors/builtin/registry.go @@ -0,0 +1,78 @@ +package builtin + +import ( + actorstypes "github.com/filecoin-project/go-state-types/actors" + "github.com/ipfs/go-cid" + + account8 "github.com/filecoin-project/go-state-types/builtin/v8/account" + + account9 "github.com/filecoin-project/go-state-types/builtin/v9/account" + + "github.com/filecoin-project/go-state-types/cbor" + rtt "github.com/filecoin-project/go-state-types/rt" + "github.com/filecoin-project/lotus/chain/actors" +) + +var _ rtt.VMActor = (*RegistryEntry)(nil) + +type RegistryEntry struct { + state cbor.Er + code cid.Cid + methods []interface{} +} + +func (r RegistryEntry) State() cbor.Er { + return r.state +} + +func (r RegistryEntry) Exports() []interface{} { + return r.methods +} + +func (r RegistryEntry) Code() cid.Cid { + return r.code +} + +func MakeRegistry(av actorstypes.Version) []rtt.VMActor { + if av < actorstypes.Version8 { + panic("expected version v8 and up only, use specs-actors for v0-7") + } + registry := make([]rtt.VMActor, 0) + + codeIDs, err := actors.GetActorCodeIDs(av) + if err != nil { + panic(err) + } + + switch av { + + case actorstypes.Version8: + for key, codeID := range codeIDs { + switch key { + case actors.AccountKey: + registry = append(registry, RegistryEntry{ + code: codeID, + methods: account8.Methods, + state: new(account8.State), + }) + } + } + + case actorstypes.Version9: + for key, codeID := range codeIDs { + switch key { + case actors.AccountKey: + registry = append(registry, RegistryEntry{ + code: codeID, + methods: account9.Methods, + state: new(account9.State), + }) + } + } + + default: + panic("expected version v8 and up only, use specs-actors for v0-7") + } + + return registry +} diff --git a/chain/actors/builtin/registry.go.template b/chain/actors/builtin/registry.go.template new file mode 100644 index 000000000..56a177330 --- /dev/null +++ b/chain/actors/builtin/registry.go.template @@ -0,0 +1,69 @@ +package builtin + +import ( + actorstypes "github.com/filecoin-project/go-state-types/actors" + "github.com/ipfs/go-cid" + {{range .versions}} + {{if (ge . 8)}} + account{{.}} "github.com/filecoin-project/go-state-types/builtin/v{{.}}/account" + {{end}} + {{end}} + "github.com/filecoin-project/go-state-types/cbor" + rtt "github.com/filecoin-project/go-state-types/rt" + "github.com/filecoin-project/lotus/chain/actors" +) + +var _ rtt.VMActor = (*RegistryEntry)(nil) + +type RegistryEntry struct { + state cbor.Er + code cid.Cid + methods []interface{} +} + +func (r RegistryEntry) State() cbor.Er { + return r.state +} + +func (r RegistryEntry) Exports() []interface{} { + return r.methods +} + +func (r RegistryEntry) Code() cid.Cid { + return r.code +} + +func MakeRegistry(av actorstypes.Version) []rtt.VMActor { + if av < actorstypes.Version8 { + panic("expected version v8 and up only, use specs-actors for v0-7") + } + registry := make([]rtt.VMActor, 0) + + codeIDs, err := actors.GetActorCodeIDs(av) + if err != nil { + panic(err) + } + + switch av { + {{range .versions}} + {{if (ge . 8)}} + case actorstypes.Version{{.}}: + for key, codeID := range codeIDs { + switch key { + case actors.AccountKey: + registry = append(registry, RegistryEntry{ + code: codeID, + methods: account{{.}}.Methods, + state: new(account{{.}}.State), + }) + } + } + {{end}} + {{end}} + + default: + panic("expected version v8 and up only, use specs-actors for v0-7") + } + + return registry +} diff --git a/chain/actors/builtin/reward/actor.go.template b/chain/actors/builtin/reward/actor.go.template index 3e0e859a3..165f9efdf 100644 --- a/chain/actors/builtin/reward/actor.go.template +++ b/chain/actors/builtin/reward/actor.go.template @@ -1,6 +1,7 @@ package reward import ( + actorstypes "github.com/filecoin-project/go-state-types/actors" "github.com/filecoin-project/go-state-types/abi" reward0 "github.com/filecoin-project/specs-actors/actors/builtin/reward" "github.com/filecoin-project/lotus/chain/actors" @@ -10,10 +11,9 @@ import ( {{range .versions}} {{if (le . 7)}} builtin{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin" - {{else}} - builtin{{.}} "github.com/filecoin-project/go-state-types/builtin" {{end}} {{end}} + builtin{{.latestVersion}} "github.com/filecoin-project/go-state-types/builtin" "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/builtin" @@ -34,7 +34,7 @@ func Load(store adt.Store, act *types.Actor) (State, error) { switch av { {{range .versions}} {{if (ge . 8)}} - case actors.Version{{.}}: + case actorstypes.Version{{.}}: return load{{.}}(store, act.Head) {{end}} {{end}} @@ -53,10 +53,10 @@ func Load(store adt.Store, act *types.Actor) (State, error) { return nil, xerrors.Errorf("unknown actor code %s", act.Code) } -func MakeState(store adt.Store, av actors.Version, currRealizedPower abi.StoragePower) (State, error) { +func MakeState(store adt.Store, av actorstypes.Version, currRealizedPower abi.StoragePower) (State, error) { switch av { {{range .versions}} - case actors.Version{{.}}: + case actorstypes.Version{{.}}: return make{{.}}(store, currRealizedPower) {{end}} } diff --git a/chain/actors/builtin/reward/reward.go b/chain/actors/builtin/reward/reward.go index 943386f6a..2c4856bc8 100644 --- a/chain/actors/builtin/reward/reward.go +++ b/chain/actors/builtin/reward/reward.go @@ -1,29 +1,38 @@ package reward import ( + "github.com/filecoin-project/go-state-types/abi" + actorstypes "github.com/filecoin-project/go-state-types/actors" + "github.com/filecoin-project/lotus/chain/actors" + reward0 "github.com/filecoin-project/specs-actors/actors/builtin/reward" "golang.org/x/xerrors" - "github.com/filecoin-project/go-state-types/abi" - builtin8 "github.com/filecoin-project/go-state-types/builtin" "github.com/filecoin-project/go-state-types/cbor" + builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" - reward0 "github.com/filecoin-project/specs-actors/actors/builtin/reward" + builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" + builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" + builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" + builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" + builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" - "github.com/filecoin-project/lotus/chain/actors" + builtin9 "github.com/filecoin-project/go-state-types/builtin" + "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/builtin" "github.com/filecoin-project/lotus/chain/types" ) var ( - Address = builtin8.RewardActorAddr - Methods = builtin8.MethodsReward + Address = builtin9.RewardActorAddr + Methods = builtin9.MethodsReward ) func Load(store adt.Store, act *types.Actor) (State, error) { @@ -34,9 +43,12 @@ func Load(store adt.Store, act *types.Actor) (State, error) { switch av { - case actors.Version8: + case actorstypes.Version8: return load8(store, act.Head) + case actorstypes.Version9: + return load9(store, act.Head) + } } @@ -68,33 +80,36 @@ func Load(store adt.Store, act *types.Actor) (State, error) { return nil, xerrors.Errorf("unknown actor code %s", act.Code) } -func MakeState(store adt.Store, av actors.Version, currRealizedPower abi.StoragePower) (State, error) { +func MakeState(store adt.Store, av actorstypes.Version, currRealizedPower abi.StoragePower) (State, error) { switch av { - case actors.Version0: + case actorstypes.Version0: return make0(store, currRealizedPower) - case actors.Version2: + case actorstypes.Version2: return make2(store, currRealizedPower) - case actors.Version3: + case actorstypes.Version3: return make3(store, currRealizedPower) - case actors.Version4: + case actorstypes.Version4: return make4(store, currRealizedPower) - case actors.Version5: + case actorstypes.Version5: return make5(store, currRealizedPower) - case actors.Version6: + case actorstypes.Version6: return make6(store, currRealizedPower) - case actors.Version7: + case actorstypes.Version7: return make7(store, currRealizedPower) - case actors.Version8: + case actorstypes.Version8: return make8(store, currRealizedPower) + case actorstypes.Version9: + return make9(store, currRealizedPower) + } return nil, xerrors.Errorf("unknown actor version %d", av) } diff --git a/chain/actors/builtin/reward/v0.go b/chain/actors/builtin/reward/v0.go index 12bdee054..646ab3a9a 100644 --- a/chain/actors/builtin/reward/v0.go +++ b/chain/actors/builtin/reward/v0.go @@ -1,15 +1,15 @@ package reward import ( - "github.com/ipfs/go-cid" - "github.com/filecoin-project/go-state-types/abi" - miner0 "github.com/filecoin-project/specs-actors/actors/builtin/miner" - reward0 "github.com/filecoin-project/specs-actors/actors/builtin/reward" - smoothing0 "github.com/filecoin-project/specs-actors/actors/util/smoothing" + "github.com/ipfs/go-cid" "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/builtin" + + miner0 "github.com/filecoin-project/specs-actors/actors/builtin/miner" + reward0 "github.com/filecoin-project/specs-actors/actors/builtin/reward" + smoothing0 "github.com/filecoin-project/specs-actors/actors/util/smoothing" ) var _ State = (*state0)(nil) diff --git a/chain/actors/builtin/reward/v2.go b/chain/actors/builtin/reward/v2.go index ed2481635..08e9a7bc3 100644 --- a/chain/actors/builtin/reward/v2.go +++ b/chain/actors/builtin/reward/v2.go @@ -1,15 +1,15 @@ package reward import ( - "github.com/ipfs/go-cid" - "github.com/filecoin-project/go-state-types/abi" - miner2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/miner" - reward2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/reward" - smoothing2 "github.com/filecoin-project/specs-actors/v2/actors/util/smoothing" + "github.com/ipfs/go-cid" "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/builtin" + + miner2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/miner" + reward2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/reward" + smoothing2 "github.com/filecoin-project/specs-actors/v2/actors/util/smoothing" ) var _ State = (*state2)(nil) diff --git a/chain/actors/builtin/reward/v3.go b/chain/actors/builtin/reward/v3.go index d9f4bf369..fd9fa56e2 100644 --- a/chain/actors/builtin/reward/v3.go +++ b/chain/actors/builtin/reward/v3.go @@ -1,15 +1,15 @@ package reward import ( - "github.com/ipfs/go-cid" - "github.com/filecoin-project/go-state-types/abi" - miner3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/miner" - reward3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/reward" - smoothing3 "github.com/filecoin-project/specs-actors/v3/actors/util/smoothing" + "github.com/ipfs/go-cid" "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/builtin" + + miner3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/miner" + reward3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/reward" + smoothing3 "github.com/filecoin-project/specs-actors/v3/actors/util/smoothing" ) var _ State = (*state3)(nil) diff --git a/chain/actors/builtin/reward/v4.go b/chain/actors/builtin/reward/v4.go index 160c72ce7..310ca04e8 100644 --- a/chain/actors/builtin/reward/v4.go +++ b/chain/actors/builtin/reward/v4.go @@ -1,15 +1,15 @@ package reward import ( - "github.com/ipfs/go-cid" - "github.com/filecoin-project/go-state-types/abi" - miner4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/miner" - reward4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/reward" - smoothing4 "github.com/filecoin-project/specs-actors/v4/actors/util/smoothing" + "github.com/ipfs/go-cid" "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/builtin" + + miner4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/miner" + reward4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/reward" + smoothing4 "github.com/filecoin-project/specs-actors/v4/actors/util/smoothing" ) var _ State = (*state4)(nil) diff --git a/chain/actors/builtin/reward/v5.go b/chain/actors/builtin/reward/v5.go index 838ec8f21..7200f7d11 100644 --- a/chain/actors/builtin/reward/v5.go +++ b/chain/actors/builtin/reward/v5.go @@ -1,15 +1,15 @@ package reward import ( - "github.com/ipfs/go-cid" - "github.com/filecoin-project/go-state-types/abi" - miner5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/miner" - reward5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/reward" - smoothing5 "github.com/filecoin-project/specs-actors/v5/actors/util/smoothing" + "github.com/ipfs/go-cid" "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/builtin" + + miner5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/miner" + reward5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/reward" + smoothing5 "github.com/filecoin-project/specs-actors/v5/actors/util/smoothing" ) var _ State = (*state5)(nil) diff --git a/chain/actors/builtin/reward/v6.go b/chain/actors/builtin/reward/v6.go index e056b22f6..010a3a870 100644 --- a/chain/actors/builtin/reward/v6.go +++ b/chain/actors/builtin/reward/v6.go @@ -1,15 +1,15 @@ package reward import ( - "github.com/ipfs/go-cid" - "github.com/filecoin-project/go-state-types/abi" - miner6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/miner" - reward6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/reward" - smoothing6 "github.com/filecoin-project/specs-actors/v6/actors/util/smoothing" + "github.com/ipfs/go-cid" "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/builtin" + + miner6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/miner" + reward6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/reward" + smoothing6 "github.com/filecoin-project/specs-actors/v6/actors/util/smoothing" ) var _ State = (*state6)(nil) diff --git a/chain/actors/builtin/reward/v7.go b/chain/actors/builtin/reward/v7.go index 5fedaa43c..368bb3abd 100644 --- a/chain/actors/builtin/reward/v7.go +++ b/chain/actors/builtin/reward/v7.go @@ -1,15 +1,15 @@ package reward import ( - "github.com/ipfs/go-cid" - "github.com/filecoin-project/go-state-types/abi" - miner7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/miner" - reward7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/reward" - smoothing7 "github.com/filecoin-project/specs-actors/v7/actors/util/smoothing" + "github.com/ipfs/go-cid" "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/builtin" + + miner7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/miner" + reward7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/reward" + smoothing7 "github.com/filecoin-project/specs-actors/v7/actors/util/smoothing" ) var _ State = (*state7)(nil) diff --git a/chain/actors/builtin/reward/v8.go b/chain/actors/builtin/reward/v8.go index ecc5a94ba..3d49063df 100644 --- a/chain/actors/builtin/reward/v8.go +++ b/chain/actors/builtin/reward/v8.go @@ -1,15 +1,15 @@ package reward import ( - "github.com/ipfs/go-cid" - "github.com/filecoin-project/go-state-types/abi" - miner8 "github.com/filecoin-project/go-state-types/builtin/v8/miner" - reward8 "github.com/filecoin-project/go-state-types/builtin/v8/reward" - smoothing8 "github.com/filecoin-project/go-state-types/builtin/v8/util/smoothing" + "github.com/ipfs/go-cid" "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/builtin" + + miner8 "github.com/filecoin-project/go-state-types/builtin/v8/miner" + reward8 "github.com/filecoin-project/go-state-types/builtin/v8/reward" + smoothing8 "github.com/filecoin-project/go-state-types/builtin/v8/util/smoothing" ) var _ State = (*state8)(nil) diff --git a/chain/actors/builtin/reward/v9.go b/chain/actors/builtin/reward/v9.go new file mode 100644 index 000000000..6dbfdd2e6 --- /dev/null +++ b/chain/actors/builtin/reward/v9.go @@ -0,0 +1,98 @@ +package reward + +import ( + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/lotus/chain/actors/adt" + "github.com/filecoin-project/lotus/chain/actors/builtin" + + miner9 "github.com/filecoin-project/go-state-types/builtin/v9/miner" + reward9 "github.com/filecoin-project/go-state-types/builtin/v9/reward" + smoothing9 "github.com/filecoin-project/go-state-types/builtin/v9/util/smoothing" +) + +var _ State = (*state9)(nil) + +func load9(store adt.Store, root cid.Cid) (State, error) { + out := state9{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make9(store adt.Store, currRealizedPower abi.StoragePower) (State, error) { + out := state9{store: store} + out.State = *reward9.ConstructState(currRealizedPower) + return &out, nil +} + +type state9 struct { + reward9.State + store adt.Store +} + +func (s *state9) ThisEpochReward() (abi.TokenAmount, error) { + return s.State.ThisEpochReward, nil +} + +func (s *state9) ThisEpochRewardSmoothed() (builtin.FilterEstimate, error) { + + return builtin.FilterEstimate{ + PositionEstimate: s.State.ThisEpochRewardSmoothed.PositionEstimate, + VelocityEstimate: s.State.ThisEpochRewardSmoothed.VelocityEstimate, + }, nil + +} + +func (s *state9) ThisEpochBaselinePower() (abi.StoragePower, error) { + return s.State.ThisEpochBaselinePower, nil +} + +func (s *state9) TotalStoragePowerReward() (abi.TokenAmount, error) { + return s.State.TotalStoragePowerReward, nil +} + +func (s *state9) EffectiveBaselinePower() (abi.StoragePower, error) { + return s.State.EffectiveBaselinePower, nil +} + +func (s *state9) EffectiveNetworkTime() (abi.ChainEpoch, error) { + return s.State.EffectiveNetworkTime, nil +} + +func (s *state9) CumsumBaseline() (reward9.Spacetime, error) { + return s.State.CumsumBaseline, nil +} + +func (s *state9) CumsumRealized() (reward9.Spacetime, error) { + return s.State.CumsumRealized, nil +} + +func (s *state9) InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount) (abi.TokenAmount, error) { + return miner9.InitialPledgeForPower( + qaPower, + s.State.ThisEpochBaselinePower, + s.State.ThisEpochRewardSmoothed, + smoothing9.FilterEstimate{ + PositionEstimate: networkQAPower.PositionEstimate, + VelocityEstimate: networkQAPower.VelocityEstimate, + }, + circSupply, + ), nil +} + +func (s *state9) PreCommitDepositForPower(networkQAPower builtin.FilterEstimate, sectorWeight abi.StoragePower) (abi.TokenAmount, error) { + return miner9.PreCommitDepositForPower(s.State.ThisEpochRewardSmoothed, + smoothing9.FilterEstimate{ + PositionEstimate: networkQAPower.PositionEstimate, + VelocityEstimate: networkQAPower.VelocityEstimate, + }, + sectorWeight), nil +} + +func (s *state9) GetState() interface{} { + return &s.State +} diff --git a/chain/actors/builtin/system/actor.go.template b/chain/actors/builtin/system/actor.go.template index c5e1af3e4..12ba9935c 100644 --- a/chain/actors/builtin/system/actor.go.template +++ b/chain/actors/builtin/system/actor.go.template @@ -1,6 +1,7 @@ package system import ( + actorstypes "github.com/filecoin-project/go-state-types/actors" "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/types" @@ -11,10 +12,9 @@ import ( {{range .versions}} {{if (le . 7)}} builtin{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin" - {{else}} - builtin{{.}} "github.com/filecoin-project/go-state-types/builtin" {{end}} {{end}} + builtin{{.latestVersion}} "github.com/filecoin-project/go-state-types/builtin" ) var ( @@ -30,7 +30,7 @@ func Load(store adt.Store, act *types.Actor) (State, error) { switch av { {{range .versions}} {{if (ge . 8)}} - case actors.Version{{.}}: + case actorstypes.Version{{.}}: return load{{.}}(store, act.Head) {{end}} {{end}} @@ -49,10 +49,10 @@ func Load(store adt.Store, act *types.Actor) (State, error) { return nil, xerrors.Errorf("unknown actor code %s", act.Code) } -func MakeState(store adt.Store, av actors.Version, builtinActors cid.Cid) (State, error) { +func MakeState(store adt.Store, av actorstypes.Version, builtinActors cid.Cid) (State, error) { switch av { {{range .versions}} - case actors.Version{{.}}: + case actorstypes.Version{{.}}: return make{{.}}(store{{if (ge . 8)}}, builtinActors{{end}}) {{end}} } diff --git a/chain/actors/builtin/system/system.go b/chain/actors/builtin/system/system.go index 24cf47d55..a67374805 100644 --- a/chain/actors/builtin/system/system.go +++ b/chain/actors/builtin/system/system.go @@ -1,25 +1,33 @@ package system import ( - "github.com/ipfs/go-cid" - "golang.org/x/xerrors" - - builtin8 "github.com/filecoin-project/go-state-types/builtin" - builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" - builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" - builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" - builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" - builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" - builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" - builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" - + actorstypes "github.com/filecoin-project/go-state-types/actors" "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/types" + "github.com/ipfs/go-cid" + + "golang.org/x/xerrors" + + builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" + + builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" + + builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" + + builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" + + builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" + + builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + + builtin9 "github.com/filecoin-project/go-state-types/builtin" ) var ( - Address = builtin8.SystemActorAddr + Address = builtin9.SystemActorAddr ) func Load(store adt.Store, act *types.Actor) (State, error) { @@ -30,9 +38,12 @@ func Load(store adt.Store, act *types.Actor) (State, error) { switch av { - case actors.Version8: + case actorstypes.Version8: return load8(store, act.Head) + case actorstypes.Version9: + return load9(store, act.Head) + } } @@ -64,33 +75,36 @@ func Load(store adt.Store, act *types.Actor) (State, error) { return nil, xerrors.Errorf("unknown actor code %s", act.Code) } -func MakeState(store adt.Store, av actors.Version, builtinActors cid.Cid) (State, error) { +func MakeState(store adt.Store, av actorstypes.Version, builtinActors cid.Cid) (State, error) { switch av { - case actors.Version0: + case actorstypes.Version0: return make0(store) - case actors.Version2: + case actorstypes.Version2: return make2(store) - case actors.Version3: + case actorstypes.Version3: return make3(store) - case actors.Version4: + case actorstypes.Version4: return make4(store) - case actors.Version5: + case actorstypes.Version5: return make5(store) - case actors.Version6: + case actorstypes.Version6: return make6(store) - case actors.Version7: + case actorstypes.Version7: return make7(store) - case actors.Version8: + case actorstypes.Version8: return make8(store, builtinActors) + case actorstypes.Version9: + return make9(store, builtinActors) + } return nil, xerrors.Errorf("unknown actor version %d", av) } diff --git a/chain/actors/builtin/system/v0.go b/chain/actors/builtin/system/v0.go index efa0741ce..a5aa8e8fa 100644 --- a/chain/actors/builtin/system/v0.go +++ b/chain/actors/builtin/system/v0.go @@ -3,9 +3,9 @@ package system import ( "github.com/ipfs/go-cid" - system0 "github.com/filecoin-project/specs-actors/actors/builtin/system" - "github.com/filecoin-project/lotus/chain/actors/adt" + + system0 "github.com/filecoin-project/specs-actors/actors/builtin/system" ) var _ State = (*state0)(nil) diff --git a/chain/actors/builtin/system/v2.go b/chain/actors/builtin/system/v2.go index e4fefd08d..aea9eff7b 100644 --- a/chain/actors/builtin/system/v2.go +++ b/chain/actors/builtin/system/v2.go @@ -3,9 +3,9 @@ package system import ( "github.com/ipfs/go-cid" - system2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/system" - "github.com/filecoin-project/lotus/chain/actors/adt" + + system2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/system" ) var _ State = (*state2)(nil) diff --git a/chain/actors/builtin/system/v3.go b/chain/actors/builtin/system/v3.go index d2b59c8a8..fd5f0cd50 100644 --- a/chain/actors/builtin/system/v3.go +++ b/chain/actors/builtin/system/v3.go @@ -3,9 +3,9 @@ package system import ( "github.com/ipfs/go-cid" - system3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/system" - "github.com/filecoin-project/lotus/chain/actors/adt" + + system3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/system" ) var _ State = (*state3)(nil) diff --git a/chain/actors/builtin/system/v4.go b/chain/actors/builtin/system/v4.go index 9528c1779..fbdec7e93 100644 --- a/chain/actors/builtin/system/v4.go +++ b/chain/actors/builtin/system/v4.go @@ -3,9 +3,9 @@ package system import ( "github.com/ipfs/go-cid" - system4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/system" - "github.com/filecoin-project/lotus/chain/actors/adt" + + system4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/system" ) var _ State = (*state4)(nil) diff --git a/chain/actors/builtin/system/v5.go b/chain/actors/builtin/system/v5.go index adc1d4553..3d3c27a12 100644 --- a/chain/actors/builtin/system/v5.go +++ b/chain/actors/builtin/system/v5.go @@ -3,9 +3,9 @@ package system import ( "github.com/ipfs/go-cid" - system5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/system" - "github.com/filecoin-project/lotus/chain/actors/adt" + + system5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/system" ) var _ State = (*state5)(nil) diff --git a/chain/actors/builtin/system/v6.go b/chain/actors/builtin/system/v6.go index 0cebadce0..314308845 100644 --- a/chain/actors/builtin/system/v6.go +++ b/chain/actors/builtin/system/v6.go @@ -3,9 +3,9 @@ package system import ( "github.com/ipfs/go-cid" - system6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/system" - "github.com/filecoin-project/lotus/chain/actors/adt" + + system6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/system" ) var _ State = (*state6)(nil) diff --git a/chain/actors/builtin/system/v7.go b/chain/actors/builtin/system/v7.go index 0009773da..3987db8dd 100644 --- a/chain/actors/builtin/system/v7.go +++ b/chain/actors/builtin/system/v7.go @@ -3,9 +3,9 @@ package system import ( "github.com/ipfs/go-cid" - system7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/system" - "github.com/filecoin-project/lotus/chain/actors/adt" + + system7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/system" ) var _ State = (*state7)(nil) diff --git a/chain/actors/builtin/system/v8.go b/chain/actors/builtin/system/v8.go index 48f150fb9..a30d5fa30 100644 --- a/chain/actors/builtin/system/v8.go +++ b/chain/actors/builtin/system/v8.go @@ -3,9 +3,9 @@ package system import ( "github.com/ipfs/go-cid" - system8 "github.com/filecoin-project/go-state-types/builtin/v8/system" - "github.com/filecoin-project/lotus/chain/actors/adt" + + system8 "github.com/filecoin-project/go-state-types/builtin/v8/system" ) var _ State = (*state8)(nil) diff --git a/chain/actors/builtin/system/v9.go b/chain/actors/builtin/system/v9.go new file mode 100644 index 000000000..6edbd72b9 --- /dev/null +++ b/chain/actors/builtin/system/v9.go @@ -0,0 +1,43 @@ +package system + +import ( + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/lotus/chain/actors/adt" + + system9 "github.com/filecoin-project/go-state-types/builtin/v9/system" +) + +var _ State = (*state9)(nil) + +func load9(store adt.Store, root cid.Cid) (State, error) { + out := state9{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make9(store adt.Store, builtinActors cid.Cid) (State, error) { + out := state9{store: store} + out.State = system9.State{ + BuiltinActors: builtinActors, + } + return &out, nil +} + +type state9 struct { + system9.State + store adt.Store +} + +func (s *state9) GetState() interface{} { + return &s.State +} + +func (s *state9) GetBuiltinActors() cid.Cid { + + return s.State.BuiltinActors + +} diff --git a/chain/actors/builtin/verifreg/actor.go.template b/chain/actors/builtin/verifreg/actor.go.template index 3df256004..3501dd528 100644 --- a/chain/actors/builtin/verifreg/actor.go.template +++ b/chain/actors/builtin/verifreg/actor.go.template @@ -1,6 +1,7 @@ package verifreg import ( + actorstypes "github.com/filecoin-project/go-state-types/actors" "golang.org/x/xerrors" "github.com/filecoin-project/go-address" @@ -10,10 +11,9 @@ import ( {{range .versions}} {{if (le . 7)}} builtin{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin" - {{else}} - builtin{{.}} "github.com/filecoin-project/go-state-types/builtin" {{end}} {{end}} + builtin{{.latestVersion}} "github.com/filecoin-project/go-state-types/builtin" "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors" @@ -34,7 +34,7 @@ func Load(store adt.Store, act *types.Actor) (State, error) { switch av { {{range .versions}} {{if (ge . 8)}} - case actors.Version{{.}}: + case actorstypes.Version{{.}}: return load{{.}}(store, act.Head) {{end}} {{end}} @@ -53,10 +53,10 @@ func Load(store adt.Store, act *types.Actor) (State, error) { return nil, xerrors.Errorf("unknown actor code %s", act.Code) } -func MakeState(store adt.Store, av actors.Version, rootKeyAddress address.Address) (State, error) { +func MakeState(store adt.Store, av actorstypes.Version, rootKeyAddress address.Address) (State, error) { switch av { {{range .versions}} - case actors.Version{{.}}: + case actorstypes.Version{{.}}: return make{{.}}(store, rootKeyAddress) {{end}} } diff --git a/chain/actors/builtin/verifreg/v0.go b/chain/actors/builtin/verifreg/v0.go index 8eaf83120..dcd34c72a 100644 --- a/chain/actors/builtin/verifreg/v0.go +++ b/chain/actors/builtin/verifreg/v0.go @@ -1,15 +1,15 @@ package verifreg import ( - "github.com/ipfs/go-cid" - "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - verifreg0 "github.com/filecoin-project/specs-actors/actors/builtin/verifreg" - adt0 "github.com/filecoin-project/specs-actors/actors/util/adt" + "github.com/ipfs/go-cid" "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/adt" + + verifreg0 "github.com/filecoin-project/specs-actors/actors/builtin/verifreg" + adt0 "github.com/filecoin-project/specs-actors/actors/util/adt" ) var _ State = (*state0)(nil) diff --git a/chain/actors/builtin/verifreg/v2.go b/chain/actors/builtin/verifreg/v2.go index 1857a02e4..dfe25f054 100644 --- a/chain/actors/builtin/verifreg/v2.go +++ b/chain/actors/builtin/verifreg/v2.go @@ -1,15 +1,15 @@ package verifreg import ( - "github.com/ipfs/go-cid" - "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - verifreg2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/verifreg" - adt2 "github.com/filecoin-project/specs-actors/v2/actors/util/adt" + "github.com/ipfs/go-cid" "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/adt" + + verifreg2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/verifreg" + adt2 "github.com/filecoin-project/specs-actors/v2/actors/util/adt" ) var _ State = (*state2)(nil) diff --git a/chain/actors/builtin/verifreg/v3.go b/chain/actors/builtin/verifreg/v3.go index 98f529a61..b7ab18080 100644 --- a/chain/actors/builtin/verifreg/v3.go +++ b/chain/actors/builtin/verifreg/v3.go @@ -1,16 +1,17 @@ package verifreg import ( - "github.com/ipfs/go-cid" - "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" - verifreg3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/verifreg" - adt3 "github.com/filecoin-project/specs-actors/v3/actors/util/adt" + "github.com/ipfs/go-cid" "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/adt" + + builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" + + verifreg3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/verifreg" + adt3 "github.com/filecoin-project/specs-actors/v3/actors/util/adt" ) var _ State = (*state3)(nil) diff --git a/chain/actors/builtin/verifreg/v4.go b/chain/actors/builtin/verifreg/v4.go index 08aac0c7d..aee3fbdca 100644 --- a/chain/actors/builtin/verifreg/v4.go +++ b/chain/actors/builtin/verifreg/v4.go @@ -1,16 +1,17 @@ package verifreg import ( - "github.com/ipfs/go-cid" - "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" - verifreg4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/verifreg" - adt4 "github.com/filecoin-project/specs-actors/v4/actors/util/adt" + "github.com/ipfs/go-cid" "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/adt" + + builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" + + verifreg4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/verifreg" + adt4 "github.com/filecoin-project/specs-actors/v4/actors/util/adt" ) var _ State = (*state4)(nil) diff --git a/chain/actors/builtin/verifreg/v5.go b/chain/actors/builtin/verifreg/v5.go index 303b10cd1..4a74e1ea8 100644 --- a/chain/actors/builtin/verifreg/v5.go +++ b/chain/actors/builtin/verifreg/v5.go @@ -1,16 +1,17 @@ package verifreg import ( - "github.com/ipfs/go-cid" - "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" - verifreg5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/verifreg" - adt5 "github.com/filecoin-project/specs-actors/v5/actors/util/adt" + "github.com/ipfs/go-cid" "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/adt" + + builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" + + verifreg5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/verifreg" + adt5 "github.com/filecoin-project/specs-actors/v5/actors/util/adt" ) var _ State = (*state5)(nil) diff --git a/chain/actors/builtin/verifreg/v6.go b/chain/actors/builtin/verifreg/v6.go index c1bcd0071..a776f1149 100644 --- a/chain/actors/builtin/verifreg/v6.go +++ b/chain/actors/builtin/verifreg/v6.go @@ -1,16 +1,17 @@ package verifreg import ( - "github.com/ipfs/go-cid" - "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" - verifreg6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/verifreg" - adt6 "github.com/filecoin-project/specs-actors/v6/actors/util/adt" + "github.com/ipfs/go-cid" "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/adt" + + builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + + verifreg6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/verifreg" + adt6 "github.com/filecoin-project/specs-actors/v6/actors/util/adt" ) var _ State = (*state6)(nil) diff --git a/chain/actors/builtin/verifreg/v7.go b/chain/actors/builtin/verifreg/v7.go index edce5f560..39d72a15d 100644 --- a/chain/actors/builtin/verifreg/v7.go +++ b/chain/actors/builtin/verifreg/v7.go @@ -1,16 +1,17 @@ package verifreg import ( - "github.com/ipfs/go-cid" - "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" - verifreg7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/verifreg" - adt7 "github.com/filecoin-project/specs-actors/v7/actors/util/adt" + "github.com/ipfs/go-cid" "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/adt" + + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + + verifreg7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/verifreg" + adt7 "github.com/filecoin-project/specs-actors/v7/actors/util/adt" ) var _ State = (*state7)(nil) diff --git a/chain/actors/builtin/verifreg/v8.go b/chain/actors/builtin/verifreg/v8.go index 00e0636ef..95fdf2e6d 100644 --- a/chain/actors/builtin/verifreg/v8.go +++ b/chain/actors/builtin/verifreg/v8.go @@ -1,16 +1,16 @@ package verifreg import ( - "github.com/ipfs/go-cid" - "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - builtin8 "github.com/filecoin-project/go-state-types/builtin" - adt8 "github.com/filecoin-project/go-state-types/builtin/v8/util/adt" - verifreg8 "github.com/filecoin-project/go-state-types/builtin/v8/verifreg" + "github.com/ipfs/go-cid" "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/adt" + + builtin8 "github.com/filecoin-project/go-state-types/builtin" + adt8 "github.com/filecoin-project/go-state-types/builtin/v8/util/adt" + verifreg8 "github.com/filecoin-project/go-state-types/builtin/v8/verifreg" ) var _ State = (*state8)(nil) diff --git a/chain/actors/builtin/verifreg/v9.go b/chain/actors/builtin/verifreg/v9.go new file mode 100644 index 000000000..0430b0a14 --- /dev/null +++ b/chain/actors/builtin/verifreg/v9.go @@ -0,0 +1,83 @@ +package verifreg + +import ( + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/lotus/chain/actors" + "github.com/filecoin-project/lotus/chain/actors/adt" + + builtin9 "github.com/filecoin-project/go-state-types/builtin" + adt9 "github.com/filecoin-project/go-state-types/builtin/v9/util/adt" + verifreg9 "github.com/filecoin-project/go-state-types/builtin/v9/verifreg" +) + +var _ State = (*state9)(nil) + +func load9(store adt.Store, root cid.Cid) (State, error) { + out := state9{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make9(store adt.Store, rootKeyAddress address.Address) (State, error) { + out := state9{store: store} + + s, err := verifreg9.ConstructState(store, rootKeyAddress) + if err != nil { + return nil, err + } + + out.State = *s + + return &out, nil +} + +type state9 struct { + verifreg9.State + store adt.Store +} + +func (s *state9) RootKey() (address.Address, error) { + return s.State.RootKey, nil +} + +func (s *state9) VerifiedClientDataCap(addr address.Address) (bool, abi.StoragePower, error) { + return getDataCap(s.store, actors.Version9, s.verifiedClients, addr) +} + +func (s *state9) VerifierDataCap(addr address.Address) (bool, abi.StoragePower, error) { + return getDataCap(s.store, actors.Version9, s.verifiers, addr) +} + +func (s *state9) RemoveDataCapProposalID(verifier address.Address, client address.Address) (bool, uint64, error) { + return getRemoveDataCapProposalID(s.store, actors.Version9, s.removeDataCapProposalIDs, verifier, client) +} + +func (s *state9) ForEachVerifier(cb func(addr address.Address, dcap abi.StoragePower) error) error { + return forEachCap(s.store, actors.Version9, s.verifiers, cb) +} + +func (s *state9) ForEachClient(cb func(addr address.Address, dcap abi.StoragePower) error) error { + return forEachCap(s.store, actors.Version9, s.verifiedClients, cb) +} + +func (s *state9) verifiedClients() (adt.Map, error) { + return adt9.AsMap(s.store, s.VerifiedClients, builtin9.DefaultHamtBitwidth) +} + +func (s *state9) verifiers() (adt.Map, error) { + return adt9.AsMap(s.store, s.Verifiers, builtin9.DefaultHamtBitwidth) +} + +func (s *state9) removeDataCapProposalIDs() (adt.Map, error) { + return adt9.AsMap(s.store, s.RemoveDataCapProposalIDs, builtin9.DefaultHamtBitwidth) +} + +func (s *state9) GetState() interface{} { + return &s.State +} diff --git a/chain/actors/builtin/verifreg/verifreg.go b/chain/actors/builtin/verifreg/verifreg.go index 0e35af648..41d6d6b49 100644 --- a/chain/actors/builtin/verifreg/verifreg.go +++ b/chain/actors/builtin/verifreg/verifreg.go @@ -1,28 +1,38 @@ package verifreg import ( + actorstypes "github.com/filecoin-project/go-state-types/actors" "golang.org/x/xerrors" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - builtin8 "github.com/filecoin-project/go-state-types/builtin" + "github.com/filecoin-project/go-state-types/cbor" + builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" + builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" + builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" + builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" + builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" + builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + builtin9 "github.com/filecoin-project/go-state-types/builtin" + "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/types" ) var ( - Address = builtin8.VerifiedRegistryActorAddr - Methods = builtin8.MethodsVerifiedRegistry + Address = builtin9.VerifiedRegistryActorAddr + Methods = builtin9.MethodsVerifiedRegistry ) func Load(store adt.Store, act *types.Actor) (State, error) { @@ -33,9 +43,12 @@ func Load(store adt.Store, act *types.Actor) (State, error) { switch av { - case actors.Version8: + case actorstypes.Version8: return load8(store, act.Head) + case actorstypes.Version9: + return load9(store, act.Head) + } } @@ -67,33 +80,36 @@ func Load(store adt.Store, act *types.Actor) (State, error) { return nil, xerrors.Errorf("unknown actor code %s", act.Code) } -func MakeState(store adt.Store, av actors.Version, rootKeyAddress address.Address) (State, error) { +func MakeState(store adt.Store, av actorstypes.Version, rootKeyAddress address.Address) (State, error) { switch av { - case actors.Version0: + case actorstypes.Version0: return make0(store, rootKeyAddress) - case actors.Version2: + case actorstypes.Version2: return make2(store, rootKeyAddress) - case actors.Version3: + case actorstypes.Version3: return make3(store, rootKeyAddress) - case actors.Version4: + case actorstypes.Version4: return make4(store, rootKeyAddress) - case actors.Version5: + case actorstypes.Version5: return make5(store, rootKeyAddress) - case actors.Version6: + case actorstypes.Version6: return make6(store, rootKeyAddress) - case actors.Version7: + case actorstypes.Version7: return make7(store, rootKeyAddress) - case actors.Version8: + case actorstypes.Version8: return make8(store, rootKeyAddress) + case actorstypes.Version9: + return make9(store, rootKeyAddress) + } return nil, xerrors.Errorf("unknown actor version %d", av) } diff --git a/chain/actors/manifest.go b/chain/actors/manifest.go index 52ed3e77d..cb118e1f3 100644 --- a/chain/actors/manifest.go +++ b/chain/actors/manifest.go @@ -9,13 +9,14 @@ import ( cbor "github.com/ipfs/go-ipld-cbor" "golang.org/x/xerrors" + actorstypes "github.com/filecoin-project/go-state-types/actors" "github.com/filecoin-project/go-state-types/manifest" "github.com/filecoin-project/lotus/chain/actors/adt" ) -var manifestCids map[Version]cid.Cid = make(map[Version]cid.Cid) -var manifests map[Version]map[string]cid.Cid = make(map[Version]map[string]cid.Cid) +var manifestCids map[actorstypes.Version]cid.Cid = make(map[actorstypes.Version]cid.Cid) +var manifests map[actorstypes.Version]map[string]cid.Cid = make(map[actorstypes.Version]map[string]cid.Cid) var actorMeta map[cid.Cid]actorEntry = make(map[cid.Cid]actorEntry) const ( @@ -54,7 +55,7 @@ var ( type actorEntry struct { name string - version Version + version actorstypes.Version } // ClearManifest clears all known manifests. This is usually used in tests that need to switch networks. @@ -62,13 +63,13 @@ func ClearManifests() { manifestMx.Lock() defer manifestMx.Unlock() - manifestCids = make(map[Version]cid.Cid) - manifests = make(map[Version]map[string]cid.Cid) + manifestCids = make(map[actorstypes.Version]cid.Cid) + manifests = make(map[actorstypes.Version]map[string]cid.Cid) actorMeta = make(map[cid.Cid]actorEntry) } // RegisterManifest registers an actors manifest with lotus. -func RegisterManifest(av Version, manifestCid cid.Cid, entries map[string]cid.Cid) { +func RegisterManifest(av actorstypes.Version, manifestCid cid.Cid, entries map[string]cid.Cid) { manifestMx.Lock() defer manifestMx.Unlock() @@ -81,7 +82,7 @@ func RegisterManifest(av Version, manifestCid cid.Cid, entries map[string]cid.Ci } // GetManifest gets a loaded manifest. -func GetManifest(av Version) (cid.Cid, bool) { +func GetManifest(av actorstypes.Version) (cid.Cid, bool) { manifestMx.RLock() defer manifestMx.RUnlock() @@ -114,7 +115,7 @@ func ReadManifest(ctx context.Context, store cbor.IpldStore, mfCid cid.Cid) (map } // GetActorCodeIDsFromManifest looks up all builtin actor's code CIDs by actor version for versions that have a manifest. -func GetActorCodeIDsFromManifest(av Version) (map[string]cid.Cid, bool) { +func GetActorCodeIDsFromManifest(av actorstypes.Version) (map[string]cid.Cid, bool) { manifestMx.RLock() defer manifestMx.RUnlock() @@ -137,7 +138,7 @@ func LoadManifest(ctx context.Context, mfCid cid.Cid, adtStore adt.Store) (*mani return &mf, nil } -func GetActorMetaByCode(c cid.Cid) (string, Version, bool) { +func GetActorMetaByCode(c cid.Cid) (string, actorstypes.Version, bool) { manifestMx.RLock() defer manifestMx.RUnlock() diff --git a/chain/actors/policy/policy.go b/chain/actors/policy/policy.go index 746b19287..f65859bb2 100644 --- a/chain/actors/policy/policy.go +++ b/chain/actors/policy/policy.go @@ -1,55 +1,74 @@ package policy import ( - "sort" + actorstypes "github.com/filecoin-project/go-state-types/actors" + "github.com/filecoin-project/go-state-types/big" "golang.org/x/xerrors" "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/big" - builtin8 "github.com/filecoin-project/go-state-types/builtin" - market8 "github.com/filecoin-project/go-state-types/builtin/v8/market" - miner8 "github.com/filecoin-project/go-state-types/builtin/v8/miner" - paych8 "github.com/filecoin-project/go-state-types/builtin/v8/paych" - verifreg8 "github.com/filecoin-project/go-state-types/builtin/v8/verifreg" "github.com/filecoin-project/go-state-types/network" + market0 "github.com/filecoin-project/specs-actors/actors/builtin/market" miner0 "github.com/filecoin-project/specs-actors/actors/builtin/miner" - power0 "github.com/filecoin-project/specs-actors/actors/builtin/power" verifreg0 "github.com/filecoin-project/specs-actors/actors/builtin/verifreg" + + power0 "github.com/filecoin-project/specs-actors/actors/builtin/power" + builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" + market2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/market" miner2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/miner" verifreg2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/verifreg" + builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" + market3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/market" miner3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/miner" verifreg3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/verifreg" + builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" + market4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/market" miner4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/miner" verifreg4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/verifreg" + builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" + market5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/market" miner5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/miner" verifreg5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/verifreg" + builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + market6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/market" miner6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/miner" verifreg6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/verifreg" + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + market7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/market" miner7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/miner" verifreg7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/verifreg" - "github.com/filecoin-project/lotus/chain/actors" + builtin8 "github.com/filecoin-project/go-state-types/builtin" + market8 "github.com/filecoin-project/go-state-types/builtin/v8/market" + miner8 "github.com/filecoin-project/go-state-types/builtin/v8/miner" + verifreg8 "github.com/filecoin-project/go-state-types/builtin/v8/verifreg" + + builtin9 "github.com/filecoin-project/go-state-types/builtin" + market9 "github.com/filecoin-project/go-state-types/builtin/v9/market" + miner9 "github.com/filecoin-project/go-state-types/builtin/v9/miner" + verifreg9 "github.com/filecoin-project/go-state-types/builtin/v9/verifreg" + + paych9 "github.com/filecoin-project/go-state-types/builtin/v9/paych" ) const ( - ChainFinality = miner8.ChainFinality + ChainFinality = miner9.ChainFinality SealRandomnessLookback = ChainFinality - PaychSettleDelay = paych8.SettleDelay - MaxPreCommitRandomnessLookback = builtin8.EpochsInDay + SealRandomnessLookback + PaychSettleDelay = paych9.SettleDelay + MaxPreCommitRandomnessLookback = builtin9.EpochsInDay + SealRandomnessLookback ) // SetSupportedProofTypes sets supported proof types, across all actor versions. @@ -76,8 +95,6 @@ func SetSupportedProofTypes(types ...abi.RegisteredSealProof) { miner7.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) - miner8.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) - AddSupportedProofTypes(types...) } @@ -134,15 +151,6 @@ func AddSupportedProofTypes(types ...abi.RegisteredSealProof) { miner7.WindowPoStProofTypes[wpp] = struct{}{} - miner8.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} - wpp, err = t.RegisteredWindowPoStProof() - if err != nil { - // Fine to panic, this is a test-only method - panic(err) - } - - miner8.WindowPoStProofTypes[wpp] = struct{}{} - } } @@ -167,11 +175,13 @@ func SetPreCommitChallengeDelay(delay abi.ChainEpoch) { miner8.PreCommitChallengeDelay = delay + miner9.PreCommitChallengeDelay = delay + } // TODO: this function shouldn't really exist. Instead, the API should expose the precommit delay. func GetPreCommitChallengeDelay() abi.ChainEpoch { - return miner8.PreCommitChallengeDelay + return miner9.PreCommitChallengeDelay } // SetConsensusMinerMinPower sets the minimum power of an individual miner must @@ -209,6 +219,10 @@ func SetConsensusMinerMinPower(p abi.StoragePower) { policy.ConsensusMinerMinPower = p } + for _, policy := range builtin9.PoStProofPolicies { + policy.ConsensusMinerMinPower = p + } + } // SetMinVerifiedDealSize sets the minimum size of a verified deal. This should @@ -231,43 +245,49 @@ func SetMinVerifiedDealSize(size abi.StoragePower) { verifreg8.MinVerifiedDealSize = size + verifreg9.MinVerifiedDealSize = size + } -func GetMaxProveCommitDuration(ver actors.Version, t abi.RegisteredSealProof) (abi.ChainEpoch, error) { +func GetMaxProveCommitDuration(ver actorstypes.Version, t abi.RegisteredSealProof) (abi.ChainEpoch, error) { switch ver { - case actors.Version0: + case actorstypes.Version0: return miner0.MaxSealDuration[t], nil - case actors.Version2: + case actorstypes.Version2: return miner2.MaxProveCommitDuration[t], nil - case actors.Version3: + case actorstypes.Version3: return miner3.MaxProveCommitDuration[t], nil - case actors.Version4: + case actorstypes.Version4: return miner4.MaxProveCommitDuration[t], nil - case actors.Version5: + case actorstypes.Version5: return miner5.MaxProveCommitDuration[t], nil - case actors.Version6: + case actorstypes.Version6: return miner6.MaxProveCommitDuration[t], nil - case actors.Version7: + case actorstypes.Version7: return miner7.MaxProveCommitDuration[t], nil - case actors.Version8: + case actorstypes.Version8: return miner8.MaxProveCommitDuration[t], nil + case actorstypes.Version9: + + return miner9.MaxProveCommitDuration[t], nil + default: return 0, xerrors.Errorf("unsupported actors version") } @@ -313,6 +333,11 @@ func SetProviderCollateralSupplyTarget(num, denom big.Int) { Denominator: denom, } + market9.ProviderCollateralSupplyTarget = builtin9.BigFrac{ + Numerator: num, + Denominator: denom, + } + } func DealProviderCollateralBounds( @@ -320,59 +345,64 @@ func DealProviderCollateralBounds( rawBytePower, qaPower, baselinePower abi.StoragePower, circulatingFil abi.TokenAmount, nwVer network.Version, ) (min, max abi.TokenAmount, err error) { - v, err := actors.VersionForNetwork(nwVer) + v, err := actorstypes.VersionForNetwork(nwVer) if err != nil { return big.Zero(), big.Zero(), err } switch v { - case actors.Version0: + case actorstypes.Version0: min, max := market0.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil, nwVer) return min, max, nil - case actors.Version2: + case actorstypes.Version2: min, max := market2.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) return min, max, nil - case actors.Version3: + case actorstypes.Version3: min, max := market3.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) return min, max, nil - case actors.Version4: + case actorstypes.Version4: min, max := market4.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) return min, max, nil - case actors.Version5: + case actorstypes.Version5: min, max := market5.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) return min, max, nil - case actors.Version6: + case actorstypes.Version6: min, max := market6.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) return min, max, nil - case actors.Version7: + case actorstypes.Version7: min, max := market7.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) return min, max, nil - case actors.Version8: + case actorstypes.Version8: min, max := market8.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) return min, max, nil + case actorstypes.Version9: + + min, max := market9.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) + return min, max, nil + default: return big.Zero(), big.Zero(), xerrors.Errorf("unsupported actors version") } } func DealDurationBounds(pieceSize abi.PaddedPieceSize) (min, max abi.ChainEpoch) { - return market8.DealDurationBounds(pieceSize) + return market9.DealDurationBounds(pieceSize) } // Sets the challenge window and scales the proving period to match (such that @@ -427,6 +457,13 @@ func SetWPoStChallengeWindow(period abi.ChainEpoch) { // scale it if we're scaling the challenge period. miner8.WPoStDisputeWindow = period * 30 + miner9.WPoStChallengeWindow = period + miner9.WPoStProvingPeriod = period * abi.ChainEpoch(miner9.WPoStPeriodDeadlines) + + // by default, this is 2x finality which is 30 periods. + // scale it if we're scaling the challenge period. + miner9.WPoStDisputeWindow = period * 30 + } func GetWinningPoStSectorSetLookback(nwVer network.Version) abi.ChainEpoch { @@ -439,15 +476,15 @@ func GetWinningPoStSectorSetLookback(nwVer network.Version) abi.ChainEpoch { } func GetMaxSectorExpirationExtension() abi.ChainEpoch { - return miner8.MaxSectorExpirationExtension + return miner9.MaxSectorExpirationExtension } func GetMinSectorExpiration() abi.ChainEpoch { - return miner8.MinSectorExpiration + return miner9.MinSectorExpiration } func GetMaxPoStPartitions(nv network.Version, p abi.RegisteredPoStProof) (int, error) { - sectorsPerPart, err := builtin8.PoStProofWindowPoStPartitionSectors(p) + sectorsPerPart, err := builtin9.PoStProofWindowPoStPartitionSectors(p) if err != nil { return 0, err } @@ -458,25 +495,6 @@ func GetMaxPoStPartitions(nv network.Version, p abi.RegisteredPoStProof) (int, e return int(uint64(maxSectors) / sectorsPerPart), nil } -func GetDefaultSectorSize() abi.SectorSize { - // supported sector sizes are the same across versions. - szs := make([]abi.SectorSize, 0, len(miner8.PreCommitSealProofTypesV8)) - for spt := range miner8.PreCommitSealProofTypesV8 { - ss, err := spt.SectorSize() - if err != nil { - panic(err) - } - - szs = append(szs, ss) - } - - sort.Slice(szs, func(i, j int) bool { - return szs[i] < szs[j] - }) - - return szs[0] -} - func GetDefaultAggregationProof() abi.RegisteredAggregationProof { return abi.RegisteredAggregationProof_SnarkPackV1 } @@ -486,173 +504,188 @@ func GetSectorMaxLifetime(proof abi.RegisteredSealProof, nwVer network.Version) return builtin4.SealProofPoliciesV0[proof].SectorMaxLifetime } - return builtin8.SealProofPoliciesV11[proof].SectorMaxLifetime + return builtin9.SealProofPoliciesV11[proof].SectorMaxLifetime } func GetAddressedSectorsMax(nwVer network.Version) (int, error) { - v, err := actors.VersionForNetwork(nwVer) + v, err := actorstypes.VersionForNetwork(nwVer) if err != nil { return 0, err } switch v { - case actors.Version0: + case actorstypes.Version0: return miner0.AddressedSectorsMax, nil - case actors.Version2: + case actorstypes.Version2: return miner2.AddressedSectorsMax, nil - case actors.Version3: + case actorstypes.Version3: return miner3.AddressedSectorsMax, nil - case actors.Version4: + case actorstypes.Version4: return miner4.AddressedSectorsMax, nil - case actors.Version5: + case actorstypes.Version5: return miner5.AddressedSectorsMax, nil - case actors.Version6: + case actorstypes.Version6: return miner6.AddressedSectorsMax, nil - case actors.Version7: + case actorstypes.Version7: return miner7.AddressedSectorsMax, nil - case actors.Version8: + case actorstypes.Version8: return miner8.AddressedSectorsMax, nil + case actorstypes.Version9: + return miner9.AddressedSectorsMax, nil + default: return 0, xerrors.Errorf("unsupported network version") } } func GetDeclarationsMax(nwVer network.Version) (int, error) { - v, err := actors.VersionForNetwork(nwVer) + v, err := actorstypes.VersionForNetwork(nwVer) if err != nil { return 0, err } switch v { - case actors.Version0: + case actorstypes.Version0: // TODO: Should we instead error here since the concept doesn't exist yet? return miner0.AddressedPartitionsMax, nil - case actors.Version2: + case actorstypes.Version2: return miner2.DeclarationsMax, nil - case actors.Version3: + case actorstypes.Version3: return miner3.DeclarationsMax, nil - case actors.Version4: + case actorstypes.Version4: return miner4.DeclarationsMax, nil - case actors.Version5: + case actorstypes.Version5: return miner5.DeclarationsMax, nil - case actors.Version6: + case actorstypes.Version6: return miner6.DeclarationsMax, nil - case actors.Version7: + case actorstypes.Version7: return miner7.DeclarationsMax, nil - case actors.Version8: + case actorstypes.Version8: return miner8.DeclarationsMax, nil + case actorstypes.Version9: + + return miner9.DeclarationsMax, nil + default: return 0, xerrors.Errorf("unsupported network version") } } func AggregateProveCommitNetworkFee(nwVer network.Version, aggregateSize int, baseFee abi.TokenAmount) (abi.TokenAmount, error) { - v, err := actors.VersionForNetwork(nwVer) + v, err := actorstypes.VersionForNetwork(nwVer) if err != nil { return big.Zero(), err } switch v { - case actors.Version0: + case actorstypes.Version0: return big.Zero(), nil - case actors.Version2: + case actorstypes.Version2: return big.Zero(), nil - case actors.Version3: + case actorstypes.Version3: return big.Zero(), nil - case actors.Version4: + case actorstypes.Version4: return big.Zero(), nil - case actors.Version5: + case actorstypes.Version5: return miner5.AggregateNetworkFee(aggregateSize, baseFee), nil - case actors.Version6: + case actorstypes.Version6: return miner6.AggregateProveCommitNetworkFee(aggregateSize, baseFee), nil - case actors.Version7: + case actorstypes.Version7: return miner7.AggregateProveCommitNetworkFee(aggregateSize, baseFee), nil - case actors.Version8: + case actorstypes.Version8: return miner8.AggregateProveCommitNetworkFee(aggregateSize, baseFee), nil + case actorstypes.Version9: + + return miner9.AggregateProveCommitNetworkFee(aggregateSize, baseFee), nil + default: return big.Zero(), xerrors.Errorf("unsupported network version") } } func AggregatePreCommitNetworkFee(nwVer network.Version, aggregateSize int, baseFee abi.TokenAmount) (abi.TokenAmount, error) { - v, err := actors.VersionForNetwork(nwVer) + v, err := actorstypes.VersionForNetwork(nwVer) if err != nil { return big.Zero(), err } switch v { - case actors.Version0: + case actorstypes.Version0: return big.Zero(), nil - case actors.Version2: + case actorstypes.Version2: return big.Zero(), nil - case actors.Version3: + case actorstypes.Version3: return big.Zero(), nil - case actors.Version4: + case actorstypes.Version4: return big.Zero(), nil - case actors.Version5: + case actorstypes.Version5: return big.Zero(), nil - case actors.Version6: + case actorstypes.Version6: return miner6.AggregatePreCommitNetworkFee(aggregateSize, baseFee), nil - case actors.Version7: + case actorstypes.Version7: return miner7.AggregatePreCommitNetworkFee(aggregateSize, baseFee), nil - case actors.Version8: + case actorstypes.Version8: return miner8.AggregatePreCommitNetworkFee(aggregateSize, baseFee), nil + case actorstypes.Version9: + + return miner9.AggregatePreCommitNetworkFee(aggregateSize, baseFee), nil + default: return big.Zero(), xerrors.Errorf("unsupported network version") } diff --git a/chain/actors/policy/policy.go.template b/chain/actors/policy/policy.go.template index 090e91165..f5178500a 100644 --- a/chain/actors/policy/policy.go.template +++ b/chain/actors/policy/policy.go.template @@ -1,14 +1,13 @@ package policy import ( - "sort" + actorstypes "github.com/filecoin-project/go-state-types/actors" "github.com/filecoin-project/go-state-types/big" "golang.org/x/xerrors" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/network" - "github.com/filecoin-project/lotus/chain/actors" {{range .versions}} {{if (ge . 8)}} @@ -50,7 +49,7 @@ func SetSupportedProofTypes(types ...abi.RegisteredSealProof) { miner{{.}}.PreCommitSealProofTypesV0 = make(map[abi.RegisteredSealProof]struct{}, len(types)) miner{{.}}.PreCommitSealProofTypesV7 = make(map[abi.RegisteredSealProof]struct{}, len(types)*2) miner{{.}}.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) - {{else}} + {{else if (le . 7)}} miner{{.}}.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) {{end}} {{end}} @@ -84,7 +83,7 @@ func AddSupportedProofTypes(types ...abi.RegisteredSealProof) { } miner{{.}}.WindowPoStProofTypes[wpp] = struct{}{} - {{else}} + {{else if (le . 7)}} miner{{.}}.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} wpp, err = t.RegisteredWindowPoStProof() if err != nil { @@ -139,10 +138,10 @@ func SetMinVerifiedDealSize(size abi.StoragePower) { {{end}} } -func GetMaxProveCommitDuration(ver actors.Version, t abi.RegisteredSealProof) (abi.ChainEpoch, error) { +func GetMaxProveCommitDuration(ver actorstypes.Version, t abi.RegisteredSealProof) (abi.ChainEpoch, error) { switch ver { {{range .versions}} - case actors.Version{{.}}: + case actorstypes.Version{{.}}: {{if (eq . 0)}} return miner{{.}}.MaxSealDuration[t], nil {{else}} @@ -173,13 +172,13 @@ func DealProviderCollateralBounds( rawBytePower, qaPower, baselinePower abi.StoragePower, circulatingFil abi.TokenAmount, nwVer network.Version, ) (min, max abi.TokenAmount, err error) { - v, err := actors.VersionForNetwork(nwVer) + v, err := actorstypes.VersionForNetwork(nwVer) if err != nil { return big.Zero(), big.Zero(), err } switch v { {{range .versions}} - case actors.Version{{.}}: + case actorstypes.Version{{.}}: {{if (eq . 0)}} min, max := market{{.}}.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil, nwVer) return min, max, nil @@ -240,25 +239,6 @@ func GetMaxPoStPartitions(nv network.Version, p abi.RegisteredPoStProof) (int, e return int(uint64(maxSectors) / sectorsPerPart), nil } -func GetDefaultSectorSize() abi.SectorSize { - // supported sector sizes are the same across versions. - szs := make([]abi.SectorSize, 0, len(miner{{.latestVersion}}.PreCommitSealProofTypesV8)) - for spt := range miner{{.latestVersion}}.PreCommitSealProofTypesV8 { - ss, err := spt.SectorSize() - if err != nil { - panic(err) - } - - szs = append(szs, ss) - } - - sort.Slice(szs, func(i, j int) bool { - return szs[i] < szs[j] - }) - - return szs[0] -} - func GetDefaultAggregationProof() abi.RegisteredAggregationProof { return abi.RegisteredAggregationProof_SnarkPackV1 } @@ -272,13 +252,13 @@ func GetSectorMaxLifetime(proof abi.RegisteredSealProof, nwVer network.Version) } func GetAddressedSectorsMax(nwVer network.Version) (int, error) { - v, err := actors.VersionForNetwork(nwVer) + v, err := actorstypes.VersionForNetwork(nwVer) if err != nil { return 0, err } switch v { {{range .versions}} - case actors.Version{{.}}: + case actorstypes.Version{{.}}: return miner{{.}}.AddressedSectorsMax, nil {{end}} default: @@ -287,13 +267,13 @@ func GetAddressedSectorsMax(nwVer network.Version) (int, error) { } func GetDeclarationsMax(nwVer network.Version) (int, error) { - v, err := actors.VersionForNetwork(nwVer) + v, err := actorstypes.VersionForNetwork(nwVer) if err != nil { return 0, err } switch v { {{range .versions}} - case actors.Version{{.}}: + case actorstypes.Version{{.}}: {{if (eq . 0)}} // TODO: Should we instead error here since the concept doesn't exist yet? return miner{{.}}.AddressedPartitionsMax, nil @@ -307,13 +287,13 @@ func GetDeclarationsMax(nwVer network.Version) (int, error) { } func AggregateProveCommitNetworkFee(nwVer network.Version, aggregateSize int, baseFee abi.TokenAmount) (abi.TokenAmount, error) { - v, err := actors.VersionForNetwork(nwVer) + v, err := actorstypes.VersionForNetwork(nwVer) if err != nil { return big.Zero(), err } switch v { {{range .versions}} - case actors.Version{{.}}: + case actorstypes.Version{{.}}: {{if (ge . 6)}} return miner{{.}}.AggregateProveCommitNetworkFee(aggregateSize, baseFee), nil {{else if (eq . 5)}} @@ -328,13 +308,13 @@ func AggregateProveCommitNetworkFee(nwVer network.Version, aggregateSize int, ba } func AggregatePreCommitNetworkFee(nwVer network.Version, aggregateSize int, baseFee abi.TokenAmount) (abi.TokenAmount, error) { - v, err := actors.VersionForNetwork(nwVer) + v, err := actorstypes.VersionForNetwork(nwVer) if err != nil { return big.Zero(), err } switch v { {{range .versions}} - case actors.Version{{.}}: + case actorstypes.Version{{.}}: {{if (ge . 6)}} return miner{{.}}.AggregatePreCommitNetworkFee(aggregateSize, baseFee), nil {{else}} diff --git a/chain/actors/version.go b/chain/actors/version.go index 1a17a6972..b9f4c2034 100644 --- a/chain/actors/version.go +++ b/chain/actors/version.go @@ -1,11 +1,5 @@ package actors -import ( - "fmt" - - "github.com/filecoin-project/go-state-types/network" -) - type Version int /* inline-gen template @@ -20,9 +14,9 @@ const ({{range .actorVersions}} /* inline-gen start */ -var LatestVersion = 8 +var LatestVersion = 9 -var Versions = []int{0, 2, 3, 4, 5, 6, 7, 8} +var Versions = []int{0, 2, 3, 4, 5, 6, 7, 8, 9} const ( Version0 Version = 0 @@ -33,30 +27,7 @@ const ( Version6 Version = 6 Version7 Version = 7 Version8 Version = 8 + Version9 Version = 9 ) /* inline-gen end */ - -// Converts a network version into an actors adt version. -func VersionForNetwork(version network.Version) (Version, error) { - switch version { - case network.Version0, network.Version1, network.Version2, network.Version3: - return Version0, nil - case network.Version4, network.Version5, network.Version6, network.Version7, network.Version8, network.Version9: - return Version2, nil - case network.Version10, network.Version11: - return Version3, nil - case network.Version12: - return Version4, nil - case network.Version13: - return Version5, nil - case network.Version14: - return Version6, nil - case network.Version15: - return Version7, nil - case network.Version16: - return Version8, nil - default: - return -1, fmt.Errorf("unsupported network version %d", version) - } -} diff --git a/chain/consensus/filcns/compute_state.go b/chain/consensus/filcns/compute_state.go index e735f362e..9837e265f 100644 --- a/chain/consensus/filcns/compute_state.go +++ b/chain/consensus/filcns/compute_state.go @@ -4,20 +4,6 @@ import ( "context" "sync/atomic" - /* inline-gen template - {{range .actorVersions}} - exported{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin/exported"{{end}} - /* inline-gen start */ - exported0 "github.com/filecoin-project/specs-actors/actors/builtin/exported" - exported2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/exported" - exported3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/exported" - exported4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/exported" - exported5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/exported" - exported6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/exported" - exported7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/exported" - exported8 "github.com/filecoin-project/specs-actors/v8/actors/builtin/exported" - - /* inline-gen end */ "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "go.opencensus.io/stats" @@ -25,8 +11,16 @@ import ( "golang.org/x/xerrors" "github.com/filecoin-project/go-state-types/abi" + actorstypes "github.com/filecoin-project/go-state-types/actors" "github.com/filecoin-project/go-state-types/big" + exported0 "github.com/filecoin-project/specs-actors/actors/builtin/exported" blockadt "github.com/filecoin-project/specs-actors/actors/util/adt" + exported2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/exported" + exported3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/exported" + exported4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/exported" + exported5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/exported" + exported6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/exported" + exported7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/exported" "github.com/filecoin-project/lotus/blockstore" "github.com/filecoin-project/lotus/build" @@ -45,23 +39,15 @@ import ( func NewActorRegistry() *vm.ActorRegistry { inv := vm.NewActorRegistry() - /* inline-gen template - {{range .actorVersions}} - inv.Register(actors.Version{{.}}, vm.ActorsVersionPredicate(actors.Version{{.}}), exported{{.}}.BuiltinActors()...){{end}} - - - /* inline-gen start */ - - inv.Register(actors.Version0, vm.ActorsVersionPredicate(actors.Version0), exported0.BuiltinActors()...) - inv.Register(actors.Version2, vm.ActorsVersionPredicate(actors.Version2), exported2.BuiltinActors()...) - inv.Register(actors.Version3, vm.ActorsVersionPredicate(actors.Version3), exported3.BuiltinActors()...) - inv.Register(actors.Version4, vm.ActorsVersionPredicate(actors.Version4), exported4.BuiltinActors()...) - inv.Register(actors.Version5, vm.ActorsVersionPredicate(actors.Version5), exported5.BuiltinActors()...) - inv.Register(actors.Version6, vm.ActorsVersionPredicate(actors.Version6), exported6.BuiltinActors()...) - inv.Register(actors.Version7, vm.ActorsVersionPredicate(actors.Version7), exported7.BuiltinActors()...) - inv.Register(actors.Version8, vm.ActorsVersionPredicate(actors.Version8), exported8.BuiltinActors()...) - - /* inline-gen end */ + inv.Register(actorstypes.Version0, vm.ActorsVersionPredicate(actorstypes.Version0), exported0.BuiltinActors()...) + inv.Register(actorstypes.Version2, vm.ActorsVersionPredicate(actorstypes.Version2), exported2.BuiltinActors()...) + inv.Register(actorstypes.Version3, vm.ActorsVersionPredicate(actorstypes.Version3), exported3.BuiltinActors()...) + inv.Register(actorstypes.Version4, vm.ActorsVersionPredicate(actorstypes.Version4), exported4.BuiltinActors()...) + inv.Register(actorstypes.Version5, vm.ActorsVersionPredicate(actorstypes.Version5), exported5.BuiltinActors()...) + inv.Register(actorstypes.Version6, vm.ActorsVersionPredicate(actorstypes.Version6), exported6.BuiltinActors()...) + inv.Register(actorstypes.Version7, vm.ActorsVersionPredicate(actorstypes.Version7), exported7.BuiltinActors()...) + inv.Register(actorstypes.Version8, vm.ActorsVersionPredicate(actorstypes.Version8), builtin.MakeRegistry(actorstypes.Version8)...) + inv.Register(actorstypes.Version9, vm.ActorsVersionPredicate(actorstypes.Version9), builtin.MakeRegistry(actorstypes.Version9)...) return inv } diff --git a/chain/consensus/filcns/upgrades.go b/chain/consensus/filcns/upgrades.go index d5e6b45fd..10dc9a126 100644 --- a/chain/consensus/filcns/upgrades.go +++ b/chain/consensus/filcns/upgrades.go @@ -14,7 +14,9 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" + actorstypes "github.com/filecoin-project/go-state-types/actors" "github.com/filecoin-project/go-state-types/big" + nv17 "github.com/filecoin-project/go-state-types/builtin/v9/migration" "github.com/filecoin-project/go-state-types/manifest" "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/go-state-types/rt" @@ -189,6 +191,17 @@ func DefaultUpgradeSchedule() stmgr.UpgradeSchedule { StopWithin: 5, }}, Expensive: true, + }, { + Height: build.UpgradeV17Height, + Network: network.Version17, + Migration: UpgradeActorsV9, + PreMigrations: []stmgr.PreMigration{{ + PreMigration: PreUpgradeActorsV9, + StartWithin: 180, + DontStartWithin: 60, + StopWithin: 5, + }}, + Expensive: true, }, } @@ -1377,7 +1390,7 @@ func upgradeActorsV8Common( store := store.ActorStore(ctx, buf) // ensure that the manifest is loaded in the blockstore - if err := bundle.LoadBundles(ctx, buf, actors.Version8); err != nil { + if err := bundle.LoadBundles(ctx, buf, actorstypes.Version8); err != nil { return cid.Undef, xerrors.Errorf("failed to load manifest bundle: %w", err) } @@ -1394,7 +1407,7 @@ func upgradeActorsV8Common( ) } - manifest, ok := actors.GetManifest(actors.Version8) + manifest, ok := actors.GetManifest(actorstypes.Version8) if !ok { return cid.Undef, xerrors.Errorf("no manifest CID for v8 upgrade") } @@ -1429,6 +1442,115 @@ func upgradeActorsV8Common( return newRoot, nil } +func UpgradeActorsV9(ctx context.Context, sm *stmgr.StateManager, cache stmgr.MigrationCache, cb stmgr.ExecMonitor, + root cid.Cid, epoch abi.ChainEpoch, ts *types.TipSet) (cid.Cid, error) { + // Use all the CPUs except 3. + workerCount := runtime.NumCPU() - 3 + if workerCount <= 0 { + workerCount = 1 + } + + config := nv17.Config{ + MaxWorkers: uint(workerCount), + JobQueueSize: 1000, + ResultQueueSize: 100, + ProgressLogPeriod: 10 * time.Second, + } + + newRoot, err := upgradeActorsV9Common(ctx, sm, cache, root, epoch, ts, config) + if err != nil { + return cid.Undef, xerrors.Errorf("migrating actors v8 state: %w", err) + } + + fmt.Print(fvmLiftoffBanner) + + return newRoot, nil +} + +func PreUpgradeActorsV9(ctx context.Context, sm *stmgr.StateManager, cache stmgr.MigrationCache, root cid.Cid, + epoch abi.ChainEpoch, ts *types.TipSet) error { + // Use half the CPUs for pre-migration, but leave at least 3. + workerCount := runtime.NumCPU() + if workerCount <= 4 { + workerCount = 1 + } else { + workerCount /= 2 + } + + lbts, lbRoot, err := stmgr.GetLookbackTipSetForRound(ctx, sm, ts, epoch) + if err != nil { + return xerrors.Errorf("error getting lookback ts for premigration: %w", err) + } + + config := nv17.Config{MaxWorkers: uint(workerCount), + ProgressLogPeriod: time.Minute * 5} + + _, err = upgradeActorsV9Common(ctx, sm, cache, lbRoot, epoch, lbts, config) + return err +} + +func upgradeActorsV9Common( + ctx context.Context, sm *stmgr.StateManager, cache stmgr.MigrationCache, + root cid.Cid, epoch abi.ChainEpoch, ts *types.TipSet, + config nv17.Config, +) (cid.Cid, error) { + buf := blockstore.NewTieredBstore(sm.ChainStore().StateBlockstore(), blockstore.NewMemorySync()) + store := store.ActorStore(ctx, buf) + + // ensure that the manifest is loaded in the blockstore + if err := bundle.LoadBundles(ctx, buf, actorstypes.Version9); err != nil { + return cid.Undef, xerrors.Errorf("failed to load manifest bundle: %w", err) + } + + // Load the state root. + var stateRoot types.StateRoot + if err := store.Get(ctx, root, &stateRoot); err != nil { + return cid.Undef, xerrors.Errorf("failed to decode state root: %w", err) + } + + if stateRoot.Version != types.StateTreeVersion4 { + return cid.Undef, xerrors.Errorf( + "expected state root version 4 for actors v9 upgrade, got %d", + stateRoot.Version, + ) + } + + manifest, ok := actors.GetManifest(actorstypes.Version9) + if !ok { + return cid.Undef, xerrors.Errorf("no manifest CID for v9 upgrade") + } + + // Perform the migration + newHamtRoot, err := nv17.MigrateStateTree(ctx, store, manifest, stateRoot.Actors, epoch, config, + migrationLogger{}, cache) + if err != nil { + return cid.Undef, xerrors.Errorf("upgrading to actors v9: %w", err) + } + + // Persist the result. + newRoot, err := store.Put(ctx, &types.StateRoot{ + Version: types.StateTreeVersion4, + Actors: newHamtRoot, + Info: stateRoot.Info, + }) + if err != nil { + return cid.Undef, xerrors.Errorf("failed to persist new state root: %w", err) + } + + // Persist the new tree. + + { + from := buf + to := buf.Read() + + if err := vm.Copy(ctx, from, to, newRoot); err != nil { + return cid.Undef, xerrors.Errorf("copying migrated tree: %w", err) + } + } + + return newRoot, nil +} + // Example upgrade function if upgrade requires only code changes //func UpgradeActorsV9(ctx context.Context, sm *stmgr.StateManager, _ stmgr.MigrationCache, _ stmgr.ExecMonitor, root cid.Cid, _ abi.ChainEpoch, _ *types.TipSet) (cid.Cid, error) { // buf := blockstore.NewTieredBstore(sm.ChainStore().StateBlockstore(), blockstore.NewMemorySync()) @@ -1453,7 +1575,7 @@ func upgradeActorsV8Common( // return LiteMigration(ctx, bstore, newActorsManifestCid, root, av, types.StateTreeVersion4, newStateTreeVersion) //} -func LiteMigration(ctx context.Context, bstore blockstore.Blockstore, newActorsManifestCid cid.Cid, root cid.Cid, av actors.Version, oldStateTreeVersion types.StateTreeVersion, newStateTreeVersion types.StateTreeVersion) (cid.Cid, error) { +func LiteMigration(ctx context.Context, bstore blockstore.Blockstore, newActorsManifestCid cid.Cid, root cid.Cid, av actorstypes.Version, oldStateTreeVersion types.StateTreeVersion, newStateTreeVersion types.StateTreeVersion) (cid.Cid, error) { buf := blockstore.NewTieredBstore(bstore, blockstore.NewMemorySync()) store := store.ActorStore(ctx, buf) adtStore := gstStore.WrapStore(ctx, store) diff --git a/chain/exchange/cbor_gen.go b/chain/exchange/cbor_gen.go index d1eb271e9..9c7f68ab8 100644 --- a/chain/exchange/cbor_gen.go +++ b/chain/exchange/cbor_gen.go @@ -8,11 +8,10 @@ import ( "math" "sort" + types "github.com/filecoin-project/lotus/chain/types" cid "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" xerrors "golang.org/x/xerrors" - - types "github.com/filecoin-project/lotus/chain/types" ) var _ = xerrors.Errorf diff --git a/chain/gen/genesis/f00_system.go b/chain/gen/genesis/f00_system.go index 1cd50f5e1..209b6db7d 100644 --- a/chain/gen/genesis/f00_system.go +++ b/chain/gen/genesis/f00_system.go @@ -7,6 +7,7 @@ import ( cbor "github.com/ipfs/go-ipld-cbor" "golang.org/x/xerrors" + actorstypes "github.com/filecoin-project/go-state-types/actors" "github.com/filecoin-project/go-state-types/big" systemtypes "github.com/filecoin-project/go-state-types/builtin/v8/system" "github.com/filecoin-project/go-state-types/manifest" @@ -18,7 +19,7 @@ import ( "github.com/filecoin-project/lotus/chain/types" ) -func SetupSystemActor(ctx context.Context, bs bstore.Blockstore, av actors.Version) (*types.Actor, error) { +func SetupSystemActor(ctx context.Context, bs bstore.Blockstore, av actorstypes.Version) (*types.Actor, error) { cst := cbor.NewCborStore(bs) // TODO pass in built-in actors cid for V8 and later @@ -27,7 +28,7 @@ func SetupSystemActor(ctx context.Context, bs bstore.Blockstore, av actors.Versi return nil, err } - if av >= actors.Version8 { + if av >= actorstypes.Version8 { mfCid, ok := actors.GetManifest(av) if !ok { return nil, xerrors.Errorf("missing manifest for actors version %d", av) diff --git a/chain/gen/genesis/f01_init.go b/chain/gen/genesis/f01_init.go index ddb448de9..26062cf27 100644 --- a/chain/gen/genesis/f01_init.go +++ b/chain/gen/genesis/f01_init.go @@ -11,6 +11,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" + actorstypes "github.com/filecoin-project/go-state-types/actors" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/specs-actors/actors/util/adt" @@ -21,7 +22,7 @@ import ( "github.com/filecoin-project/lotus/genesis" ) -func SetupInitActor(ctx context.Context, bs bstore.Blockstore, netname string, initialActors []genesis.Actor, rootVerifier genesis.Actor, remainder genesis.Actor, av actors.Version) (int64, *types.Actor, map[address.Address]address.Address, error) { +func SetupInitActor(ctx context.Context, bs bstore.Blockstore, netname string, initialActors []genesis.Actor, rootVerifier genesis.Actor, remainder genesis.Actor, av actorstypes.Version) (int64, *types.Actor, map[address.Address]address.Address, error) { if len(initialActors) > MaxAccounts { return 0, nil, nil, xerrors.New("too many initial actors") } diff --git a/chain/gen/genesis/f02_reward.go b/chain/gen/genesis/f02_reward.go index 0d0c1db0f..4a5ac9fa1 100644 --- a/chain/gen/genesis/f02_reward.go +++ b/chain/gen/genesis/f02_reward.go @@ -6,6 +6,7 @@ import ( cbor "github.com/ipfs/go-ipld-cbor" "golang.org/x/xerrors" + actorstypes "github.com/filecoin-project/go-state-types/actors" "github.com/filecoin-project/go-state-types/big" bstore "github.com/filecoin-project/lotus/blockstore" @@ -16,7 +17,7 @@ import ( "github.com/filecoin-project/lotus/chain/types" ) -func SetupRewardActor(ctx context.Context, bs bstore.Blockstore, qaPower big.Int, av actors.Version) (*types.Actor, error) { +func SetupRewardActor(ctx context.Context, bs bstore.Blockstore, qaPower big.Int, av actorstypes.Version) (*types.Actor, error) { cst := cbor.NewCborStore(bs) rst, err := reward.MakeState(adt.WrapStore(ctx, cst), av, qaPower) if err != nil { diff --git a/chain/gen/genesis/f03_cron.go b/chain/gen/genesis/f03_cron.go index c9fe7c118..16396c437 100644 --- a/chain/gen/genesis/f03_cron.go +++ b/chain/gen/genesis/f03_cron.go @@ -6,6 +6,7 @@ import ( cbor "github.com/ipfs/go-ipld-cbor" "golang.org/x/xerrors" + actorstypes "github.com/filecoin-project/go-state-types/actors" "github.com/filecoin-project/go-state-types/big" bstore "github.com/filecoin-project/lotus/blockstore" @@ -15,7 +16,7 @@ import ( "github.com/filecoin-project/lotus/chain/types" ) -func SetupCronActor(ctx context.Context, bs bstore.Blockstore, av actors.Version) (*types.Actor, error) { +func SetupCronActor(ctx context.Context, bs bstore.Blockstore, av actorstypes.Version) (*types.Actor, error) { cst := cbor.NewCborStore(bs) st, err := cron.MakeState(adt.WrapStore(ctx, cbor.NewCborStore(bs)), av) if err != nil { diff --git a/chain/gen/genesis/f04_power.go b/chain/gen/genesis/f04_power.go index 20232c9b2..f05b0c746 100644 --- a/chain/gen/genesis/f04_power.go +++ b/chain/gen/genesis/f04_power.go @@ -6,6 +6,7 @@ import ( cbor "github.com/ipfs/go-ipld-cbor" "golang.org/x/xerrors" + actorstypes "github.com/filecoin-project/go-state-types/actors" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/specs-actors/actors/util/adt" @@ -15,7 +16,7 @@ import ( "github.com/filecoin-project/lotus/chain/types" ) -func SetupStoragePowerActor(ctx context.Context, bs bstore.Blockstore, av actors.Version) (*types.Actor, error) { +func SetupStoragePowerActor(ctx context.Context, bs bstore.Blockstore, av actorstypes.Version) (*types.Actor, error) { cst := cbor.NewCborStore(bs) pst, err := power.MakeState(adt.WrapStore(ctx, cbor.NewCborStore(bs)), av) diff --git a/chain/gen/genesis/f05_market.go b/chain/gen/genesis/f05_market.go index 9109e2784..28a258c40 100644 --- a/chain/gen/genesis/f05_market.go +++ b/chain/gen/genesis/f05_market.go @@ -6,6 +6,7 @@ import ( cbor "github.com/ipfs/go-ipld-cbor" "golang.org/x/xerrors" + actorstypes "github.com/filecoin-project/go-state-types/actors" "github.com/filecoin-project/go-state-types/big" bstore "github.com/filecoin-project/lotus/blockstore" @@ -15,7 +16,7 @@ import ( "github.com/filecoin-project/lotus/chain/types" ) -func SetupStorageMarketActor(ctx context.Context, bs bstore.Blockstore, av actors.Version) (*types.Actor, error) { +func SetupStorageMarketActor(ctx context.Context, bs bstore.Blockstore, av actorstypes.Version) (*types.Actor, error) { cst := cbor.NewCborStore(bs) mst, err := market.MakeState(adt.WrapStore(ctx, cbor.NewCborStore(bs)), av) if err != nil { diff --git a/chain/gen/genesis/f06_vreg.go b/chain/gen/genesis/f06_vreg.go index 381a115d4..1b3582d4d 100644 --- a/chain/gen/genesis/f06_vreg.go +++ b/chain/gen/genesis/f06_vreg.go @@ -7,6 +7,7 @@ import ( "golang.org/x/xerrors" "github.com/filecoin-project/go-address" + actorstypes "github.com/filecoin-project/go-state-types/actors" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/specs-actors/actors/util/adt" @@ -28,7 +29,7 @@ func init() { RootVerifierID = idk } -func SetupVerifiedRegistryActor(ctx context.Context, bs bstore.Blockstore, av actors.Version) (*types.Actor, error) { +func SetupVerifiedRegistryActor(ctx context.Context, bs bstore.Blockstore, av actorstypes.Version) (*types.Actor, error) { cst := cbor.NewCborStore(bs) vst, err := verifreg.MakeState(adt.WrapStore(ctx, cbor.NewCborStore(bs)), av, RootVerifierID) if err != nil { diff --git a/chain/gen/genesis/genesis.go b/chain/gen/genesis/genesis.go index 4eaed56aa..34f12db6d 100644 --- a/chain/gen/genesis/genesis.go +++ b/chain/gen/genesis/genesis.go @@ -14,6 +14,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" + actorstypes "github.com/filecoin-project/go-state-types/actors" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/go-state-types/network" @@ -137,7 +138,7 @@ func MakeInitialStateTree(ctx context.Context, bs bstore.Blockstore, template ge return nil, nil, xerrors.Errorf("making new state tree: %w", err) } - av, err := actors.VersionForNetwork(template.NetworkVersion) + av, err := actorstypes.VersionForNetwork(template.NetworkVersion) if err != nil { return nil, nil, xerrors.Errorf("getting network version: %w", err) } @@ -356,7 +357,7 @@ func MakeInitialStateTree(ctx context.Context, bs bstore.Blockstore, template ge return state, keyIDs, nil } -func MakeAccountActor(ctx context.Context, cst cbor.IpldStore, av actors.Version, addr address.Address, bal types.BigInt) (*types.Actor, error) { +func MakeAccountActor(ctx context.Context, cst cbor.IpldStore, av actorstypes.Version, addr address.Address, bal types.BigInt) (*types.Actor, error) { ast, err := account.MakeState(adt.WrapStore(ctx, cst), av, addr) if err != nil { return nil, err @@ -381,7 +382,7 @@ func MakeAccountActor(ctx context.Context, cst cbor.IpldStore, av actors.Version return act, nil } -func CreateAccountActor(ctx context.Context, cst cbor.IpldStore, state *state.StateTree, info genesis.Actor, keyIDs map[address.Address]address.Address, av actors.Version) error { +func CreateAccountActor(ctx context.Context, cst cbor.IpldStore, state *state.StateTree, info genesis.Actor, keyIDs map[address.Address]address.Address, av actorstypes.Version) error { var ainfo genesis.AccountMeta if err := json.Unmarshal(info.Meta, &ainfo); err != nil { return xerrors.Errorf("unmarshaling account meta: %w", err) @@ -404,7 +405,7 @@ func CreateAccountActor(ctx context.Context, cst cbor.IpldStore, state *state.St return nil } -func CreateMultisigAccount(ctx context.Context, cst cbor.IpldStore, state *state.StateTree, ida address.Address, info genesis.Actor, keyIDs map[address.Address]address.Address, av actors.Version) error { +func CreateMultisigAccount(ctx context.Context, cst cbor.IpldStore, state *state.StateTree, ida address.Address, info genesis.Actor, keyIDs map[address.Address]address.Address, av actorstypes.Version) error { if info.Type != genesis.TMultisig { return fmt.Errorf("can only call CreateMultisigAccount with multisig Actor info") } diff --git a/chain/gen/genesis/miners.go b/chain/gen/genesis/miners.go index a4f43e7fa..0397d38b1 100644 --- a/chain/gen/genesis/miners.go +++ b/chain/gen/genesis/miners.go @@ -14,6 +14,7 @@ import ( "github.com/filecoin-project/go-address" cborutil "github.com/filecoin-project/go-cbor-util" "github.com/filecoin-project/go-state-types/abi" + actorstypes "github.com/filecoin-project/go-state-types/actors" "github.com/filecoin-project/go-state-types/big" builtintypes "github.com/filecoin-project/go-state-types/builtin" markettypes "github.com/filecoin-project/go-state-types/builtin/v8/market" @@ -34,7 +35,6 @@ import ( builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" runtime7 "github.com/filecoin-project/specs-actors/v7/actors/runtime" - "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/builtin" "github.com/filecoin-project/lotus/chain/actors/builtin/market" @@ -81,7 +81,7 @@ func mkFakedSigSyscalls(base vm.SyscallBuilder) vm.SyscallBuilder { func SetupStorageMiners(ctx context.Context, cs *store.ChainStore, sys vm.SyscallBuilder, sroot cid.Cid, miners []genesis.Miner, nv network.Version) (cid.Cid, error) { cst := cbor.NewCborStore(cs.StateBlockstore()) - av, err := actors.VersionForNetwork(nv) + av, err := actorstypes.VersionForNetwork(nv) if err != nil { return cid.Undef, xerrors.Errorf("failed to get network version: %w", err) } @@ -234,7 +234,7 @@ func SetupStorageMiners(ctx context.Context, cs *store.ChainStore, sys vm.Syscal ClientSignature: crypto.Signature{Type: crypto.SigTypeBLS}, } - if av >= actors.Version8 { + if av >= actorstypes.Version8 { buf, err := cborutil.Dump(&preseal.Deal) if err != nil { return cid.Undef, fmt.Errorf("failed to marshal proposal: %w", err) @@ -464,7 +464,7 @@ func SetupStorageMiners(ctx context.Context, cs *store.ChainStore, sys vm.Syscal // Commit one-by-one, otherwise pledge math tends to explode var paramBytes []byte - if av >= actors.Version6 { + if av >= actorstypes.Version6 { // TODO: fixup confirmParams := &builtin6.ConfirmSectorProofsParams{ Sectors: []abi.SectorNumber{preseal.SectorID}, @@ -484,7 +484,7 @@ func SetupStorageMiners(ctx context.Context, cs *store.ChainStore, sys vm.Syscal return cid.Undef, xerrors.Errorf("failed to confirm presealed sectors: %w", err) } - if av >= actors.Version2 { + if av >= actorstypes.Version2 { // post v0, we need to explicitly Claim this power since ConfirmSectorProofsValid doesn't do it anymore claimParams := &power4.UpdateClaimedPowerParams{ RawByteDelta: types.NewInt(uint64(m.SectorSize)), @@ -617,9 +617,9 @@ func currentTotalPower(ctx context.Context, vm vm.Interface, maddr address.Addre return &pwr, nil } -func dealWeight(ctx context.Context, vm vm.Interface, maddr address.Address, dealIDs []abi.DealID, sectorStart, sectorExpiry abi.ChainEpoch, av actors.Version) (abi.DealWeight, abi.DealWeight, error) { +func dealWeight(ctx context.Context, vm vm.Interface, maddr address.Address, dealIDs []abi.DealID, sectorStart, sectorExpiry abi.ChainEpoch, av actorstypes.Version) (abi.DealWeight, abi.DealWeight, error) { // TODO: This hack should move to market actor wrapper - if av <= actors.Version2 { + if av <= actorstypes.Version2 { params := &market0.VerifyDealsForActivationParams{ DealIDs: dealIDs, SectorStart: sectorStart, @@ -637,7 +637,7 @@ func dealWeight(ctx context.Context, vm vm.Interface, maddr address.Address, dea return big.Zero(), big.Zero(), err } var weight, verifiedWeight abi.DealWeight - if av < actors.Version2 { + if av < actorstypes.Version2 { var dealWeights market0.VerifyDealsForActivationReturn err = dealWeights.UnmarshalCBOR(bytes.NewReader(ret)) weight = dealWeights.DealWeight @@ -677,7 +677,7 @@ func dealWeight(ctx context.Context, vm vm.Interface, maddr address.Address, dea return dealWeights.Sectors[0].DealWeight, dealWeights.Sectors[0].VerifiedDealWeight, nil } -func currentEpochBlockReward(ctx context.Context, vm vm.Interface, maddr address.Address, av actors.Version) (abi.StoragePower, builtin.FilterEstimate, error) { +func currentEpochBlockReward(ctx context.Context, vm vm.Interface, maddr address.Address, av actorstypes.Version) (abi.StoragePower, builtin.FilterEstimate, error) { rwret, err := doExecValue(ctx, vm, reward.Address, maddr, big.Zero(), reward.Methods.ThisEpochReward, nil) if err != nil { return big.Zero(), builtin.FilterEstimate{}, err @@ -685,7 +685,7 @@ func currentEpochBlockReward(ctx context.Context, vm vm.Interface, maddr address // TODO: This hack should move to reward actor wrapper switch av { - case actors.Version0: + case actorstypes.Version0: var epochReward reward0.ThisEpochRewardReturn if err := epochReward.UnmarshalCBOR(bytes.NewReader(rwret)); err != nil { @@ -693,7 +693,7 @@ func currentEpochBlockReward(ctx context.Context, vm vm.Interface, maddr address } return epochReward.ThisEpochBaselinePower, builtin.FilterEstimate(*epochReward.ThisEpochRewardSmoothed), nil - case actors.Version2: + case actorstypes.Version2: var epochReward reward2.ThisEpochRewardReturn if err := epochReward.UnmarshalCBOR(bytes.NewReader(rwret)); err != nil { diff --git a/chain/state/statetree.go b/chain/state/statetree.go index 970ac3c72..ff921a04d 100644 --- a/chain/state/statetree.go +++ b/chain/state/statetree.go @@ -158,7 +158,7 @@ func VersionForNetwork(ver network.Version) (types.StateTreeVersion, error) { /* inline-gen start */ - case network.Version13, network.Version14, network.Version15, network.Version16: + case network.Version13, network.Version14, network.Version15, network.Version16, network.Version17: /* inline-gen end */ return types.StateTreeVersion4, nil diff --git a/chain/stmgr/actors.go b/chain/stmgr/actors.go index 3ef5a3af9..fa51306a6 100644 --- a/chain/stmgr/actors.go +++ b/chain/stmgr/actors.go @@ -12,7 +12,6 @@ import ( "github.com/filecoin-project/go-bitfield" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" - miner_types "github.com/filecoin-project/go-state-types/builtin/v8/miner" "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/go-state-types/network" @@ -89,7 +88,7 @@ func GetPowerRaw(ctx context.Context, sm *StateManager, st cid.Cid, maddr addres return mpow, tpow, minpow, nil } -func PreCommitInfo(ctx context.Context, sm *StateManager, maddr address.Address, sid abi.SectorNumber, ts *types.TipSet) (*miner_types.SectorPreCommitOnChainInfo, error) { +func PreCommitInfo(ctx context.Context, sm *StateManager, maddr address.Address, sid abi.SectorNumber, ts *types.TipSet) (*miner.SectorPreCommitOnChainInfo, error) { act, err := sm.LoadActor(ctx, maddr, ts) if err != nil { return nil, xerrors.Errorf("(get sset) failed to load miner actor: %w", err) diff --git a/chain/stmgr/forks_test.go b/chain/stmgr/forks_test.go index 7eb63566c..d46d0befe 100644 --- a/chain/stmgr/forks_test.go +++ b/chain/stmgr/forks_test.go @@ -17,6 +17,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" + actorstypes "github.com/filecoin-project/go-state-types/actors" "github.com/filecoin-project/go-state-types/cbor" "github.com/filecoin-project/go-state-types/network" builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" @@ -167,7 +168,7 @@ func TestForkHeightTriggers(t *testing.T) { } inv := filcns.NewActorRegistry() - inv.Register(actors.Version0, nil, testActor{}) + inv.Register(actorstypes.Version0, nil, testActor{}) sm.SetVMConstructor(func(ctx context.Context, vmopt *vm.VMOpts) (vm.Interface, error) { nvm, err := vm.NewLegacyVM(ctx, vmopt) @@ -284,7 +285,7 @@ func testForkRefuseCall(t *testing.T, nullsBefore, nullsAfter int) { } inv := filcns.NewActorRegistry() - inv.Register(actors.Version0, nil, testActor{}) + inv.Register(actorstypes.Version0, nil, testActor{}) sm.SetVMConstructor(func(ctx context.Context, vmopt *vm.VMOpts) (vm.Interface, error) { nvm, err := vm.NewLegacyVM(ctx, vmopt) @@ -505,7 +506,7 @@ func TestForkPreMigration(t *testing.T) { }() inv := filcns.NewActorRegistry() - inv.Register(actors.Version0, nil, testActor{}) + inv.Register(actorstypes.Version0, nil, testActor{}) sm.SetVMConstructor(func(ctx context.Context, vmopt *vm.VMOpts) (vm.Interface, error) { nvm, err := vm.NewLegacyVM(ctx, vmopt) diff --git a/chain/sync_test.go b/chain/sync_test.go index b1be0b590..18520a07f 100644 --- a/chain/sync_test.go +++ b/chain/sync_test.go @@ -147,6 +147,10 @@ func prepSyncTestWithV5Height(t testing.TB, h int, v5height abi.ChainEpoch) *syn Network: network.Version16, Height: v5height + 20, Migration: filcns.UpgradeActorsV8, + }, { + Network: network.Version17, + Height: v5height + 25, + Migration: filcns.UpgradeActorsV9, }} g, err := gen.NewGeneratorWithUpgradeSchedule(sched) diff --git a/chain/types/cbor_gen.go b/chain/types/cbor_gen.go index 78a3449ee..79ff5d19c 100644 --- a/chain/types/cbor_gen.go +++ b/chain/types/cbor_gen.go @@ -8,14 +8,13 @@ import ( "math" "sort" - cid "github.com/ipfs/go-cid" - cbg "github.com/whyrusleeping/cbor-gen" - xerrors "golang.org/x/xerrors" - abi "github.com/filecoin-project/go-state-types/abi" crypto "github.com/filecoin-project/go-state-types/crypto" exitcode "github.com/filecoin-project/go-state-types/exitcode" proof "github.com/filecoin-project/go-state-types/proof" + cid "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + xerrors "golang.org/x/xerrors" ) var _ = xerrors.Errorf diff --git a/chain/vm/cbor_gen.go b/chain/vm/cbor_gen.go index 64b623f63..0e1677c95 100644 --- a/chain/vm/cbor_gen.go +++ b/chain/vm/cbor_gen.go @@ -8,11 +8,10 @@ import ( "math" "sort" + types "github.com/filecoin-project/lotus/chain/types" cid "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" xerrors "golang.org/x/xerrors" - - types "github.com/filecoin-project/lotus/chain/types" ) var _ = xerrors.Errorf diff --git a/chain/vm/fvm.go b/chain/vm/fvm.go index 7ae6bf203..b87830a3c 100644 --- a/chain/vm/fvm.go +++ b/chain/vm/fvm.go @@ -21,6 +21,7 @@ import ( ffi_cgo "github.com/filecoin-project/filecoin-ffi/cgo" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" + actorstypes "github.com/filecoin-project/go-state-types/actors" "github.com/filecoin-project/go-state-types/exitcode" "github.com/filecoin-project/lotus/blockstore" @@ -295,7 +296,7 @@ func NewFVM(ctx context.Context, opts *VMOpts) (*FVM, error) { } if os.Getenv("LOTUS_USE_FVM_CUSTOM_BUNDLE") == "1" { - av, err := actors.VersionForNetwork(opts.NetworkVersion) + av, err := actorstypes.VersionForNetwork(opts.NetworkVersion) if err != nil { return nil, xerrors.Errorf("mapping network version to actors version: %w", err) } @@ -367,7 +368,7 @@ func NewDebugFVM(ctx context.Context, opts *VMOpts) (*FVM, error) { // create actor redirect mapping actorRedirect := make(map[cid.Cid]cid.Cid) for _, key := range actors.GetBuiltinActorsKeys() { - from, ok := actors.GetActorCodeID(actors.Version8, key) + from, ok := actors.GetActorCodeID(actorstypes.Version8, key) if !ok { log.Warnf("actor missing in the from manifest %s", key) continue @@ -393,13 +394,13 @@ func NewDebugFVM(ctx context.Context, opts *VMOpts) (*FVM, error) { return nil } - av, err := actors.VersionForNetwork(opts.NetworkVersion) + av, err := actorstypes.VersionForNetwork(opts.NetworkVersion) if err != nil { return nil, xerrors.Errorf("error determining actors version for network version %d: %w", opts.NetworkVersion, err) } switch av { - case actors.Version8: + case actorstypes.Version8: if debugBundleV8path != "" { if err := createMapping(debugBundleV8path); err != nil { log.Errorf("failed to create v8 debug mapping") diff --git a/chain/vm/invoker.go b/chain/vm/invoker.go index ad04639e5..8d9caad3e 100644 --- a/chain/vm/invoker.go +++ b/chain/vm/invoker.go @@ -5,14 +5,14 @@ import ( "encoding/hex" "fmt" "reflect" - "runtime" - "strings" + "strconv" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" "github.com/filecoin-project/go-state-types/abi" + actorstypes "github.com/filecoin-project/go-state-types/actors" "github.com/filecoin-project/go-state-types/exitcode" "github.com/filecoin-project/go-state-types/network" rtt "github.com/filecoin-project/go-state-types/rt" @@ -25,7 +25,7 @@ import ( ) type MethodMeta struct { - Name string + Num string Params reflect.Type Ret reflect.Type @@ -40,9 +40,9 @@ type ActorRegistry struct { // An ActorPredicate returns an error if the given actor is not valid for the given runtime environment (e.g., chain height, version, etc.). type ActorPredicate func(vmr.Runtime, rtt.VMActor) error -func ActorsVersionPredicate(ver actors.Version) ActorPredicate { +func ActorsVersionPredicate(ver actorstypes.Version) ActorPredicate { return func(rt vmr.Runtime, v rtt.VMActor) error { - aver, err := actors.VersionForNetwork(rt.NetworkVersion()) + aver, err := actorstypes.VersionForNetwork(rt.NetworkVersion()) if err != nil { return xerrors.Errorf("unsupported network version: %w", err) } @@ -86,7 +86,7 @@ func (ar *ActorRegistry) Invoke(codeCid cid.Cid, rt vmr.Runtime, method abi.Meth } -func (ar *ActorRegistry) Register(av actors.Version, pred ActorPredicate, vmactors ...rtt.VMActor) { +func (ar *ActorRegistry) Register(av actorstypes.Version, pred ActorPredicate, vmactors ...rtt.VMActor) { if pred == nil { pred = func(vmr.Runtime, rtt.VMActor) error { return nil } } @@ -108,7 +108,7 @@ func (ar *ActorRegistry) Register(av actors.Version, pred ActorPredicate, vmacto // necessary to make stuff work var realCode cid.Cid - if av >= actors.Version8 { + if av >= actorstypes.Version8 { name := actors.CanonicalName(builtin.ActorNameByCode(ac)) var ok bool @@ -124,7 +124,7 @@ func (ar *ActorRegistry) Register(av actors.Version, pred ActorPredicate, vmacto // Explicitly add send, it's special. methods[builtin.MethodSend] = MethodMeta{ - Name: "Send", + Num: "0", Params: reflect.TypeOf(new(abi.EmptyValue)), Ret: reflect.TypeOf(new(abi.EmptyValue)), } @@ -139,24 +139,8 @@ func (ar *ActorRegistry) Register(av actors.Version, pred ActorPredicate, vmacto ev := reflect.ValueOf(export) et := ev.Type() - // Extract the method names using reflection. These - // method names always match the field names in the - // `builtin.Method*` structs (tested in the specs-actors - // tests). - fnName := runtime.FuncForPC(ev.Pointer()).Name() - fnName = strings.TrimSuffix(fnName[strings.LastIndexByte(fnName, '.')+1:], "-fm") - - switch abi.MethodNum(number) { - case builtin.MethodSend: - panic("method 0 is reserved for Send") - case builtin.MethodConstructor: - if fnName != "Constructor" { - panic("method 1 is reserved for Constructor") - } - } - methods[abi.MethodNum(number)] = MethodMeta{ - Name: fnName, + Num: strconv.Itoa(number), Params: et.In(1), Ret: et.Out(0), } diff --git a/chain/vm/mkactor.go b/chain/vm/mkactor.go index 7e27ee811..3a0ee6699 100644 --- a/chain/vm/mkactor.go +++ b/chain/vm/mkactor.go @@ -7,6 +7,7 @@ import ( cbor "github.com/ipfs/go-ipld-cbor" "github.com/filecoin-project/go-address" + actorstypes "github.com/filecoin-project/go-state-types/actors" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-state-types/exitcode" "github.com/filecoin-project/go-state-types/network" @@ -53,7 +54,7 @@ func TryCreateAccountActor(rt *Runtime, addr address.Address) (*types.Actor, add return nil, address.Undef, aerrors.Escalate(err, "registering actor address") } - av, err := actors.VersionForNetwork(rt.NetworkVersion()) + av, err := actorstypes.VersionForNetwork(rt.NetworkVersion()) if err != nil { return nil, address.Undef, aerrors.Escalate(err, "unsupported network version") } @@ -85,7 +86,7 @@ func TryCreateAccountActor(rt *Runtime, addr address.Address) (*types.Actor, add return act, addrID, nil } -func makeAccountActor(ver actors.Version, addr address.Address) (*types.Actor, aerrors.ActorError) { +func makeAccountActor(ver actorstypes.Version, addr address.Address) (*types.Actor, aerrors.ActorError) { switch addr.Protocol() { case address.BLS, address.SECP256K1: return newAccountActor(ver), nil @@ -98,23 +99,23 @@ func makeAccountActor(ver actors.Version, addr address.Address) (*types.Actor, a } } -func newAccountActor(ver actors.Version) *types.Actor { +func newAccountActor(ver actorstypes.Version) *types.Actor { // TODO: ActorsUpgrade use a global actor registry? var code cid.Cid switch ver { - case actors.Version0: + case actorstypes.Version0: code = builtin0.AccountActorCodeID - case actors.Version2: + case actorstypes.Version2: code = builtin2.AccountActorCodeID - case actors.Version3: + case actorstypes.Version3: code = builtin3.AccountActorCodeID - case actors.Version4: + case actorstypes.Version4: code = builtin4.AccountActorCodeID - case actors.Version5: + case actorstypes.Version5: code = builtin5.AccountActorCodeID - case actors.Version6: + case actorstypes.Version6: code = builtin6.AccountActorCodeID - case actors.Version7: + case actorstypes.Version7: code = builtin7.AccountActorCodeID default: panic("unsupported actors version") diff --git a/chain/vm/runtime.go b/chain/vm/runtime.go index ce9349a1d..05f8de2f0 100644 --- a/chain/vm/runtime.go +++ b/chain/vm/runtime.go @@ -16,6 +16,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" + actorstypes "github.com/filecoin-project/go-state-types/actors" "github.com/filecoin-project/go-state-types/cbor" "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/go-state-types/exitcode" @@ -373,7 +374,7 @@ func (rt *Runtime) ValidateImmediateCallerType(ts ...cid.Cid) { // this really only for genesis in tests; nv16 will be running on FVM anyway. if nv := rt.NetworkVersion(); nv >= network.Version16 { - av, err := actors.VersionForNetwork(nv) + av, err := actorstypes.VersionForNetwork(nv) if err != nil { panic(aerrors.Fatalf("failed to get actors version for network version %d", nv)) } diff --git a/cli/chain.go b/cli/chain.go index 48fbb849d..39f1608f5 100644 --- a/cli/chain.go +++ b/cli/chain.go @@ -494,8 +494,8 @@ var ChainInspectUsage = &cli.Command{ mm := filcns.NewActorRegistry().Methods[code][m.Message.Method] // TODO: use remote map - byMethod[mm.Name] += m.Message.GasLimit - byMethodC[mm.Name]++ + byMethod[mm.Num] += m.Message.GasLimit + byMethodC[mm.Num]++ } type keyGasPair struct { diff --git a/cli/multisig.go b/cli/multisig.go index f4b67e14d..67c833397 100644 --- a/cli/multisig.go +++ b/cli/multisig.go @@ -341,7 +341,7 @@ var msigInspectCmd = &cli.Command{ paramStr = string(b) } - fmt.Fprintf(w, "%d\t%s\t%d\t%s\t%s\t%s(%d)\t%s\n", txid, "pending", len(tx.Approved), target, types.FIL(tx.Value), method.Name, tx.Method, paramStr) + fmt.Fprintf(w, "%d\t%s\t%d\t%s\t%s\t%s(%d)\t%s\n", txid, "pending", len(tx.Approved), target, types.FIL(tx.Value), method.Num, tx.Method, paramStr) } } if err := w.Flush(); err != nil { diff --git a/cli/servicesmock_test.go b/cli/servicesmock_test.go index 11260ab08..5bae52a5e 100644 --- a/cli/servicesmock_test.go +++ b/cli/servicesmock_test.go @@ -8,14 +8,12 @@ import ( context "context" reflect "reflect" - gomock "github.com/golang/mock/gomock" - go_address "github.com/filecoin-project/go-address" abi "github.com/filecoin-project/go-state-types/abi" big "github.com/filecoin-project/go-state-types/big" - api "github.com/filecoin-project/lotus/api" types "github.com/filecoin-project/lotus/chain/types" + gomock "github.com/golang/mock/gomock" ) // MockServicesAPI is a mock of ServicesAPI interface. diff --git a/cli/state.go b/cli/state.go index f18beb0fb..bea7ed0df 100644 --- a/cli/state.go +++ b/cli/state.go @@ -29,6 +29,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" + actorstypes "github.com/filecoin-project/go-state-types/actors" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-state-types/exitcode" "github.com/filecoin-project/go-state-types/network" @@ -1231,7 +1232,7 @@ var compStateMsg = `