From 9297e1b90d45ba5ea28e0cff370b25b40710473b Mon Sep 17 00:00:00 2001 From: TheMenko Date: Sun, 31 Oct 2021 12:24:07 +0100 Subject: [PATCH 001/393] annotated repo_test --- node/repo/repo_test.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/node/repo/repo_test.go b/node/repo/repo_test.go index 444fab267af..6c69b4cb3be 100644 --- a/node/repo/repo_test.go +++ b/node/repo/repo_test.go @@ -1,3 +1,4 @@ +//stm: #unit package repo import ( @@ -14,17 +15,20 @@ import ( ) func basicTest(t *testing.T, repo Repo) { + //stm: @REPO_NET_001 apima, err := repo.APIEndpoint() if assert.Error(t, err) { assert.Equal(t, ErrNoAPIEndpoint, err) } assert.Nil(t, apima, "with no api endpoint, return should be nil") + //stm: @REPO_MUT_001 lrepo, err := repo.Lock(FullNode) assert.NoError(t, err, "should be able to lock once") assert.NotNil(t, lrepo, "locked repo shouldn't be nil") { + //stm: @REPO_MUT_002 lrepo2, err := repo.Lock(FullNode) if assert.Error(t, err) { assert.Equal(t, ErrRepoAlreadyLocked, err) @@ -32,6 +36,7 @@ func basicTest(t *testing.T, repo Repo) { assert.Nil(t, lrepo2, "with locked repo errors, nil should be returned") } + //stm: @REPO_MUT_003 err = lrepo.Close() assert.NoError(t, err, "should be able to unlock") @@ -42,6 +47,7 @@ func basicTest(t *testing.T, repo Repo) { ma, err := multiaddr.NewMultiaddr("/ip4/127.0.0.1/tcp/43244") assert.NoError(t, err, "creating multiaddr shouldn't error") + //stm: @REPO_NET_002 err = lrepo.SetAPIEndpoint(ma) assert.NoError(t, err, "setting multiaddr shouldn't error") @@ -69,6 +75,7 @@ func basicTest(t *testing.T, repo Repo) { err = lrepo.Close() assert.NoError(t, err, "should be able to close") + //stm: @REPO_NET_003 apima, err = repo.APIEndpoint() if assert.Error(t, err) { @@ -83,22 +90,27 @@ func basicTest(t *testing.T, repo Repo) { assert.NoError(t, err, "should be able to relock") assert.NotNil(t, lrepo, "locked repo shouldn't be nil") + //stm: @REPO_KEYSTR_001 kstr, err := lrepo.KeyStore() assert.NoError(t, err, "should be able to get keystore") assert.NotNil(t, lrepo, "keystore shouldn't be nil") + //stm: @REPO_KEYSTR_002 list, err := kstr.List() assert.NoError(t, err, "should be able to list key") assert.Empty(t, list, "there should be no keys") + //stm: @REPO_KEYSTR_003 err = kstr.Put("k1", k1) assert.NoError(t, err, "should be able to put k1") + //stm: @REPO_KEYSTR_004 err = kstr.Put("k1", k1) if assert.Error(t, err, "putting key under the same name should error") { assert.True(t, xerrors.Is(err, types.ErrKeyExists), "returned error is ErrKeyExists") } + //stm: @REPO_KEYSTR_005 k1prim, err := kstr.Get("k1") assert.NoError(t, err, "should be able to get k1") assert.Equal(t, k1, k1prim, "returned key should be the same") @@ -116,6 +128,7 @@ func basicTest(t *testing.T, repo Repo) { assert.NoError(t, err, "should be able to list keys") assert.ElementsMatch(t, []string{"k1", "k2"}, list, "returned elements match") + //stm: @REPO_KEYSTR_006 err = kstr.Delete("k2") assert.NoError(t, err, "should be able to delete key") From fb911a45428327eca361921554864cde99a71ded Mon Sep 17 00:00:00 2001 From: TheMenko Date: Mon, 1 Nov 2021 01:24:26 +0100 Subject: [PATCH 002/393] annotated repo_test --- node/config/def_test.go | 2 ++ node/config/load_test.go | 3 +++ node/impl/client/client_test.go | 6 ++++++ node/impl/client/import_test.go | 7 +++++++ node/impl/full/gas_test.go | 2 ++ node/repo/fsrepo_test.go | 4 ++++ node/repo/memrepo_test.go | 2 ++ 7 files changed, 26 insertions(+) diff --git a/node/config/def_test.go b/node/config/def_test.go index d45bc6ec8f3..6b4546c5a6c 100644 --- a/node/config/def_test.go +++ b/node/config/def_test.go @@ -24,6 +24,7 @@ func TestDefaultFullNodeRoundtrip(t *testing.T) { s = buf.String() } + //stm: @NODE_CONFIG_003 c2, err := FromReader(strings.NewReader(s), DefaultFullNode()) require.NoError(t, err) @@ -45,6 +46,7 @@ func TestDefaultMinerRoundtrip(t *testing.T) { s = buf.String() } + //stm: @NODE_CONFIG_004 c2, err := FromReader(strings.NewReader(s), DefaultStorageMiner()) require.NoError(t, err) diff --git a/node/config/load_test.go b/node/config/load_test.go index 9abe8a54b7b..c8e8aef194d 100644 --- a/node/config/load_test.go +++ b/node/config/load_test.go @@ -1,3 +1,4 @@ +//stm: #unit package config import ( @@ -14,6 +15,7 @@ func TestDecodeNothing(t *testing.T) { assert := assert.New(t) { + //stm: @NODE_CONFIG_001 cfg, err := FromFile(os.DevNull, DefaultFullNode()) assert.Nil(err, "error should be nil") assert.Equal(DefaultFullNode(), cfg, @@ -21,6 +23,7 @@ func TestDecodeNothing(t *testing.T) { } { + //stm: @NODE_CONFIG_002 cfg, err := FromFile("./does-not-exist.toml", DefaultFullNode()) assert.Nil(err, "error should be nil") assert.Equal(DefaultFullNode(), cfg, diff --git a/node/impl/client/client_test.go b/node/impl/client/client_test.go index 834c980ab14..642ae572a23 100644 --- a/node/impl/client/client_test.go +++ b/node/impl/client/client_test.go @@ -1,3 +1,4 @@ +//stm: #unit package client import ( @@ -44,10 +45,12 @@ func TestImportLocal(t *testing.T) { b, err := testdata.ReadFile("testdata/payload.txt") require.NoError(t, err) + //stm: @CLIENT_IMPORT_003 root, err := a.ClientImportLocal(ctx, bytes.NewReader(b)) require.NoError(t, err) require.NotEqual(t, cid.Undef, root) + //stm: @CLIENT_IMPORT_004 list, err := a.ClientListImports(ctx) require.NoError(t, err) require.Len(t, list, 1) @@ -68,6 +71,7 @@ func TestImportLocal(t *testing.T) { // retrieve as UnixFS. out1 := filepath.Join(dir, "retrieval1.data") // as unixfs out2 := filepath.Join(dir, "retrieval2.data") // as car + //stm: @CLIENT_IMPORT_005 err = a.ClientRetrieve(ctx, order, &api.FileRef{ Path: out1, }) @@ -84,6 +88,7 @@ func TestImportLocal(t *testing.T) { require.NoError(t, err) // open the CARv2 being custodied by the import manager + //stm: @CLIENT_IMPORT_006 orig, err := carv2.OpenReader(it.CARPath) require.NoError(t, err) @@ -94,6 +99,7 @@ func TestImportLocal(t *testing.T) { require.EqualValues(t, 1, exported.Version) require.EqualValues(t, 2, orig.Version) + //stm: @CLIENT_IMPORT_007 origRoots, err := orig.Roots() require.NoError(t, err) require.Len(t, origRoots, 1) diff --git a/node/impl/client/import_test.go b/node/impl/client/import_test.go index adf6531d088..93041d22e8c 100644 --- a/node/impl/client/import_test.go +++ b/node/impl/client/import_test.go @@ -1,3 +1,4 @@ +//stm: #unit package client import ( @@ -35,11 +36,13 @@ func TestRoundtripUnixFS_Dense(t *testing.T) { defer os.Remove(carv2File) //nolint:errcheck // import a file to a Unixfs DAG using a CARv2 read/write blockstore. + //stm: @CLIENT_IMPORT_001, @CLIENT_BLOCKSTORE_001 bs, err := blockstore.OpenReadWrite(carv2File, nil, carv2.ZeroLengthSectionAsEOF(true), blockstore.UseWholeCIDs(true)) require.NoError(t, err) + //stm: @CLIENT_IMPORT_001 root, err := buildUnixFS(ctx, bytes.NewBuffer(inputContents), bs, false) require.NoError(t, err) require.NotEqual(t, cid.Undef, root) @@ -85,11 +88,13 @@ func TestRoundtripUnixFS_Filestore(t *testing.T) { dst := newTmpFile(t) defer os.Remove(dst) //nolint:errcheck + //stm: @CLIENT_FS_001 root, err := a.createUnixFSFilestore(ctx, inputPath, dst) require.NoError(t, err) require.NotEqual(t, cid.Undef, root) // convert the CARv2 to a normal file again and ensure the contents match + //stm: @CLIENT_FS_002 fs, err := stores.ReadOnlyFilestore(dst) require.NoError(t, err) defer fs.Close() //nolint:errcheck @@ -116,6 +121,7 @@ func TestRoundtripUnixFS_Filestore(t *testing.T) { } func newTmpFile(t *testing.T) string { + //stm: @CLIENT_FS_003 f, err := os.CreateTemp("", "") require.NoError(t, err) require.NoError(t, f.Close()) @@ -123,6 +129,7 @@ func newTmpFile(t *testing.T) string { } func genInputFile(t *testing.T) (filepath string, contents []byte) { + //stm: @CLIENT_FS_004 s := strings.Repeat("abcde", 100) tmp, err := os.CreateTemp("", "") require.NoError(t, err) diff --git a/node/impl/full/gas_test.go b/node/impl/full/gas_test.go index 028e039ce4f..854a2c4798d 100644 --- a/node/impl/full/gas_test.go +++ b/node/impl/full/gas_test.go @@ -1,3 +1,4 @@ +//stm: #unit package full import ( @@ -12,6 +13,7 @@ import ( ) func TestMedian(t *testing.T) { + //stm: @REPO_GAS_001 require.Equal(t, types.NewInt(5), medianGasPremium([]GasMeta{ {big.NewInt(5), build.BlockGasTarget}, }, 1)) diff --git a/node/repo/fsrepo_test.go b/node/repo/fsrepo_test.go index bd03cc084ea..dcf44778b9d 100644 --- a/node/repo/fsrepo_test.go +++ b/node/repo/fsrepo_test.go @@ -1,3 +1,4 @@ +//stm: #unit package repo import ( @@ -12,11 +13,13 @@ func genFsRepo(t *testing.T) (*FsRepo, func()) { t.Fatal(err) } + //stm: @REPO_FS_001 repo, err := NewFS(path) if err != nil { t.Fatal(err) } + //stm: @REPO_FS_002 err = repo.Init(FullNode) if err != ErrRepoExists && err != nil { t.Fatal(err) @@ -29,5 +32,6 @@ func genFsRepo(t *testing.T) (*FsRepo, func()) { func TestFsBasic(t *testing.T) { repo, closer := genFsRepo(t) defer closer() + //stm: @REPO_FS_003 basicTest(t, repo) } diff --git a/node/repo/memrepo_test.go b/node/repo/memrepo_test.go index 965bc02c195..457a4b6d986 100644 --- a/node/repo/memrepo_test.go +++ b/node/repo/memrepo_test.go @@ -1,3 +1,4 @@ +//stm: #unit package repo import ( @@ -6,5 +7,6 @@ import ( func TestMemBasic(t *testing.T) { repo := NewMemory(nil) + //stm: @REPO_MEM_001 basicTest(t, repo) } From b45924a234638bfe87c920506a9f2ef968ab12be Mon Sep 17 00:00:00 2001 From: TheMenko Date: Mon, 1 Nov 2021 10:49:30 +0100 Subject: [PATCH 003/393] annotated repo_test --- node/shutdown_test.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/node/shutdown_test.go b/node/shutdown_test.go index 15e2af93e5e..58c79a34e53 100644 --- a/node/shutdown_test.go +++ b/node/shutdown_test.go @@ -15,6 +15,7 @@ func TestMonitorShutdown(t *testing.T) { // Three shutdown handlers. var wg sync.WaitGroup wg.Add(3) + //stm: @NODE_SHUTDOWN_001 h := ShutdownHandler{ Component: "handler", StopFunc: func(_ context.Context) error { @@ -23,6 +24,7 @@ func TestMonitorShutdown(t *testing.T) { }, } + //stm: @NODE_SHUTDOWN_002 finishCh := MonitorShutdown(signalCh, h, h, h) // Nothing here after 10ms. From ad16bafa667edc759b6577190965639337594c0f Mon Sep 17 00:00:00 2001 From: TheMenko Date: Wed, 3 Nov 2021 21:31:33 +0100 Subject: [PATCH 004/393] annotated paych_test --- paychmgr/paych_test.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/paychmgr/paych_test.go b/paychmgr/paych_test.go index ab04ad7e0ea..1edb840cc5e 100644 --- a/paychmgr/paych_test.go +++ b/paychmgr/paych_test.go @@ -1,3 +1,4 @@ +//stm: #unit package paychmgr import ( @@ -196,6 +197,7 @@ func TestCheckVoucherValid(t *testing.T) { for _, tcase := range tcases { tcase := tcase + //stm: @PAYMENT_CHANNEL_VOUCHER_001, PAYMENT_CHANNEL_VOUCHER_002, PAYMENT_CHANNEL_VOUCHER_003, PAYMENT_CHANNEL_VOUCHER_004 t.Run(tcase.name, func(t *testing.T) { // Create an actor for the channel with the test case balance act := &types.Actor{ From 1449644c343340a60d80688931cd709d85220686 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Thu, 4 Nov 2021 15:59:29 +0000 Subject: [PATCH 005/393] Integrate v7 actors --- build/openrpc/full.json.gz | Bin 25453 -> 25453 bytes build/params_2k.go | 2 + build/params_butterfly.go | 1 + build/params_calibnet.go | 2 + build/params_interop.go | 1 + build/params_mainnet.go | 10 +- build/params_shared_vals.go | 2 +- build/params_testground.go | 1 + chain/actors/builtin/account/account.go | 15 + chain/actors/builtin/account/v7.go | 40 ++ chain/actors/builtin/builtin.go | 60 +- chain/actors/builtin/cron/cron.go | 12 +- chain/actors/builtin/cron/v7.go | 35 ++ chain/actors/builtin/init/init.go | 19 +- chain/actors/builtin/init/v7.go | 114 ++++ chain/actors/builtin/market/market.go | 22 +- chain/actors/builtin/market/v7.go | 252 ++++++++ chain/actors/builtin/miner/miner.go | 17 +- chain/actors/builtin/miner/v7.go | 570 ++++++++++++++++++ chain/actors/builtin/multisig/message7.go | 71 +++ chain/actors/builtin/multisig/multisig.go | 32 +- chain/actors/builtin/multisig/v7.go | 119 ++++ chain/actors/builtin/paych/message7.go | 74 +++ chain/actors/builtin/paych/paych.go | 20 +- chain/actors/builtin/paych/v7.go | 114 ++++ chain/actors/builtin/power/power.go | 19 +- chain/actors/builtin/power/v7.go | 187 ++++++ chain/actors/builtin/reward/reward.go | 19 +- chain/actors/builtin/reward/v7.go | 98 +++ chain/actors/builtin/system/system.go | 10 +- chain/actors/builtin/system/v7.go | 35 ++ chain/actors/builtin/verifreg/v7.go | 75 +++ chain/actors/builtin/verifreg/verifreg.go | 19 +- chain/actors/policy/policy.go | 84 ++- chain/actors/version.go | 7 +- chain/consensus/filcns/compute_state.go | 2 + chain/consensus/filcns/upgrades.go | 108 +++- chain/gen/gen.go | 6 + chain/gen/genesis/miners.go | 7 +- chain/state/statetree.go | 2 +- chain/vm/gas.go | 31 +- chain/vm/gas_v0.go | 15 +- chain/vm/invoker.go | 2 +- chain/vm/mkactor.go | 3 + chain/vm/runtime.go | 8 +- chain/vm/syscalls.go | 40 +- cmd/lotus-bench/caching_verifier.go | 9 +- cmd/lotus-sim/simulation/mock/mock.go | 8 + documentation/en/api-v0-methods.md | 2 +- documentation/en/api-v1-unstable-methods.md | 2 +- extern/sector-storage/ffiwrapper/types.go | 3 + .../sector-storage/ffiwrapper/verifier_cgo.go | 7 + extern/sector-storage/mock/mock.go | 7 + gen/inlinegen-data.json | 8 +- go.mod | 1 + go.sum | 5 + itests/kit/ensemble_opts_nv.go | 6 +- lotuspond/front/src/chain/methods.json | 107 ++++ storage/wdpost_run_test.go | 18 +- testplans/lotus-soup/go.mod | 20 +- testplans/lotus-soup/go.sum | 131 ++++ 61 files changed, 2595 insertions(+), 121 deletions(-) create mode 100644 chain/actors/builtin/account/v7.go create mode 100644 chain/actors/builtin/cron/v7.go create mode 100644 chain/actors/builtin/init/v7.go create mode 100644 chain/actors/builtin/market/v7.go create mode 100644 chain/actors/builtin/miner/v7.go create mode 100644 chain/actors/builtin/multisig/message7.go create mode 100644 chain/actors/builtin/multisig/v7.go create mode 100644 chain/actors/builtin/paych/message7.go create mode 100644 chain/actors/builtin/paych/v7.go create mode 100644 chain/actors/builtin/power/v7.go create mode 100644 chain/actors/builtin/reward/v7.go create mode 100644 chain/actors/builtin/system/v7.go create mode 100644 chain/actors/builtin/verifreg/v7.go diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 1578d746536613ea03a22c6165e5561d65e3df7a..8f71ee8a973b9f29d91d16893c3cbe8bf3db8356 100644 GIT binary patch delta 5087 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 B;#2?t delta 5127 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 diff --git a/build/params_2k.go b/build/params_2k.go index b9db0a46703..84023c38c6d 100644 --- a/build/params_2k.go +++ b/build/params_2k.go @@ -47,6 +47,8 @@ var UpgradeHyperdriveHeight = abi.ChainEpoch(-16) var UpgradeChocolateHeight = abi.ChainEpoch(-17) +var UpgradeSnapDealsHeight = abi.ChainEpoch(-18) + var DrandSchedule = map[abi.ChainEpoch]DrandEnum{ 0: DrandMainnet, } diff --git a/build/params_butterfly.go b/build/params_butterfly.go index 9a0018e73a2..e26fd78fa8f 100644 --- a/build/params_butterfly.go +++ b/build/params_butterfly.go @@ -41,6 +41,7 @@ const UpgradeNorwegianHeight = -14 const UpgradeTurboHeight = -15 const UpgradeHyperdriveHeight = -16 const UpgradeChocolateHeight = 6360 +const UpgradeSnapDealsHeight = 99999999 func init() { policy.SetConsensusMinerMinPower(abi.NewStoragePower(2 << 30)) diff --git a/build/params_calibnet.go b/build/params_calibnet.go index 8cd99d642cc..16d77c7e6fa 100644 --- a/build/params_calibnet.go +++ b/build/params_calibnet.go @@ -54,6 +54,8 @@ const UpgradeHyperdriveHeight = 420 const UpgradeChocolateHeight = 312746 +const UpgradeSnapDealsHeight = 99999999 + func init() { policy.SetConsensusMinerMinPower(abi.NewStoragePower(32 << 30)) policy.SetSupportedProofTypes( diff --git a/build/params_interop.go b/build/params_interop.go index de5ee9a12c8..66033937cc3 100644 --- a/build/params_interop.go +++ b/build/params_interop.go @@ -47,6 +47,7 @@ var UpgradeTurboHeight = abi.ChainEpoch(-15) var UpgradeHyperdriveHeight = abi.ChainEpoch(-16) var UpgradeChocolateHeight = abi.ChainEpoch(-17) +var UpgradeSnapDealsHeight = abi.ChainEpoch(-18) var DrandSchedule = map[abi.ChainEpoch]DrandEnum{ 0: DrandMainnet, diff --git a/build/params_mainnet.go b/build/params_mainnet.go index 0c8c53ba8cf..a4781f1ff1d 100644 --- a/build/params_mainnet.go +++ b/build/params_mainnet.go @@ -62,18 +62,20 @@ const UpgradeNorwegianHeight = 665280 const UpgradeTurboHeight = 712320 // 2021-06-30T22:00:00Z -var UpgradeHyperdriveHeight = abi.ChainEpoch(892800) +const UpgradeHyperdriveHeight = 892800 // 2021-10-26T13:30:00Z -var UpgradeChocolateHeight = abi.ChainEpoch(1231620) +const UpgradeChocolateHeight = 1231620 + +var UpgradeSnapDealsHeight = abi.ChainEpoch(999999999999) func init() { if os.Getenv("LOTUS_USE_TEST_ADDRESSES") != "1" { SetAddressNetwork(address.Mainnet) } - if os.Getenv("LOTUS_DISABLE_CHOCOLATE") == "1" { - UpgradeChocolateHeight = math.MaxInt64 + if os.Getenv("LOTUS_DISABLE_SNAPDEALS") == "1" { + UpgradeSnapDealsHeight = math.MaxInt64 } Devnet = false diff --git a/build/params_shared_vals.go b/build/params_shared_vals.go index 0a242f6f211..704c84639e2 100644 --- a/build/params_shared_vals.go +++ b/build/params_shared_vals.go @@ -34,7 +34,7 @@ const NewestNetworkVersion = network.Version{{.latestNetworkVersion}} /* inline-gen start */ -const NewestNetworkVersion = network.Version14 +const NewestNetworkVersion = network.Version15 /* inline-gen end */ diff --git a/build/params_testground.go b/build/params_testground.go index 48b76f82ca6..539e06b4541 100644 --- a/build/params_testground.go +++ b/build/params_testground.go @@ -99,6 +99,7 @@ var ( UpgradeTurboHeight abi.ChainEpoch = -14 UpgradeHyperdriveHeight abi.ChainEpoch = -15 UpgradeChocolateHeight abi.ChainEpoch = -16 + UpgradeSnapDealsHeight abi.ChainEpoch = -17 DrandSchedule = map[abi.ChainEpoch]DrandEnum{ 0: DrandMainnet, diff --git a/chain/actors/builtin/account/account.go b/chain/actors/builtin/account/account.go index 249ce133fd2..57ea510bb3d 100644 --- a/chain/actors/builtin/account/account.go +++ b/chain/actors/builtin/account/account.go @@ -23,6 +23,8 @@ import ( 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 init() { @@ -50,6 +52,10 @@ func init() { builtin.RegisterActorState(builtin6.AccountActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load6(store, root) }) + + builtin.RegisterActorState(builtin7.AccountActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load7(store, root) + }) } var Methods = builtin4.MethodsAccount @@ -75,6 +81,9 @@ func Load(store adt.Store, act *types.Actor) (State, error) { case builtin6.AccountActorCodeID: return load6(store, act.Head) + case builtin7.AccountActorCodeID: + return load7(store, act.Head) + } return nil, xerrors.Errorf("unknown actor code %s", act.Code) } @@ -100,6 +109,9 @@ func MakeState(store adt.Store, av actors.Version, addr address.Address) (State, case actors.Version6: return make6(store, addr) + case actors.Version7: + return make7(store, addr) + } return nil, xerrors.Errorf("unknown actor version %d", av) } @@ -125,6 +137,9 @@ func GetActorCodeID(av actors.Version) (cid.Cid, error) { case actors.Version6: return builtin6.AccountActorCodeID, nil + case actors.Version7: + return builtin7.AccountActorCodeID, nil + } return cid.Undef, xerrors.Errorf("unknown actor version %d", av) diff --git a/chain/actors/builtin/account/v7.go b/chain/actors/builtin/account/v7.go new file mode 100644 index 00000000000..883776cf8f0 --- /dev/null +++ b/chain/actors/builtin/account/v7.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" + + account7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/account" +) + +var _ State = (*state7)(nil) + +func load7(store adt.Store, root cid.Cid) (State, error) { + out := state7{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make7(store adt.Store, addr address.Address) (State, error) { + out := state7{store: store} + out.State = account7.State{Address: addr} + return &out, nil +} + +type state7 struct { + account7.State + store adt.Store +} + +func (s *state7) PubkeyAddress() (address.Address, error) { + return s.Address, nil +} + +func (s *state7) GetState() interface{} { + return &s.State +} diff --git a/chain/actors/builtin/builtin.go b/chain/actors/builtin/builtin.go index ebfe2df2e12..d9373299939 100644 --- a/chain/actors/builtin/builtin.go +++ b/chain/actors/builtin/builtin.go @@ -23,46 +23,49 @@ import ( builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" smoothing6 "github.com/filecoin-project/specs-actors/v6/actors/util/smoothing" + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + smoothing7 "github.com/filecoin-project/specs-actors/v7/actors/util/smoothing" + "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/cbor" "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/types" - miner6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/miner" - proof6 "github.com/filecoin-project/specs-actors/v6/actors/runtime/proof" + miner7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/miner" + proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" ) -var SystemActorAddr = builtin6.SystemActorAddr -var BurntFundsActorAddr = builtin6.BurntFundsActorAddr -var CronActorAddr = builtin6.CronActorAddr +var SystemActorAddr = builtin7.SystemActorAddr +var BurntFundsActorAddr = builtin7.BurntFundsActorAddr +var CronActorAddr = builtin7.CronActorAddr var SaftAddress = makeAddress("t0122") var ReserveAddress = makeAddress("t090") var RootVerifierAddress = makeAddress("t080") var ( - ExpectedLeadersPerEpoch = builtin6.ExpectedLeadersPerEpoch + ExpectedLeadersPerEpoch = builtin7.ExpectedLeadersPerEpoch ) const ( - EpochDurationSeconds = builtin6.EpochDurationSeconds - EpochsInDay = builtin6.EpochsInDay - SecondsInDay = builtin6.SecondsInDay + EpochDurationSeconds = builtin7.EpochDurationSeconds + EpochsInDay = builtin7.EpochsInDay + SecondsInDay = builtin7.SecondsInDay ) const ( - MethodSend = builtin6.MethodSend - MethodConstructor = builtin6.MethodConstructor + MethodSend = builtin7.MethodSend + MethodConstructor = builtin7.MethodConstructor ) // These are all just type aliases across actor versions. In the future, that might change // and we might need to do something fancier. -type SectorInfo = proof6.SectorInfo -type PoStProof = proof6.PoStProof +type SectorInfo = proof7.SectorInfo +type PoStProof = proof7.PoStProof type FilterEstimate = smoothing0.FilterEstimate func QAPowerForWeight(size abi.SectorSize, duration abi.ChainEpoch, dealWeight, verifiedWeight abi.DealWeight) abi.StoragePower { - return miner6.QAPowerForWeight(size, duration, dealWeight, verifiedWeight) + return miner7.QAPowerForWeight(size, duration, dealWeight, verifiedWeight) } func FromV0FilterEstimate(v0 smoothing0.FilterEstimate) FilterEstimate { @@ -101,6 +104,12 @@ func FromV6FilterEstimate(v6 smoothing6.FilterEstimate) FilterEstimate { } +func FromV7FilterEstimate(v7 smoothing7.FilterEstimate) FilterEstimate { + + return (FilterEstimate)(v7) + +} + type ActorStateLoader func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) var ActorStateLoaders = make(map[cid.Cid]ActorStateLoader) @@ -138,6 +147,9 @@ func ActorNameByCode(c cid.Cid) string { case builtin6.IsBuiltinActor(c): return builtin6.ActorNameByCode(c) + case builtin7.IsBuiltinActor(c): + return builtin7.ActorNameByCode(c) + default: return "" } @@ -169,6 +181,10 @@ func IsBuiltinActor(c cid.Cid) bool { return true } + if builtin7.IsBuiltinActor(c) { + return true + } + return false } @@ -198,6 +214,10 @@ func IsAccountActor(c cid.Cid) bool { return true } + if c == builtin7.AccountActorCodeID { + return true + } + return false } @@ -227,6 +247,10 @@ func IsStorageMinerActor(c cid.Cid) bool { return true } + if c == builtin7.StorageMinerActorCodeID { + return true + } + return false } @@ -256,6 +280,10 @@ func IsMultisigActor(c cid.Cid) bool { return true } + if c == builtin7.MultisigActorCodeID { + return true + } + return false } @@ -285,6 +313,10 @@ func IsPaymentChannelActor(c cid.Cid) bool { return true } + if c == builtin7.PaymentChannelActorCodeID { + return true + } + return false } diff --git a/chain/actors/builtin/cron/cron.go b/chain/actors/builtin/cron/cron.go index 9178a44abc4..f27a14ac791 100644 --- a/chain/actors/builtin/cron/cron.go +++ b/chain/actors/builtin/cron/cron.go @@ -17,6 +17,8 @@ import ( 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 MakeState(store adt.Store, av actors.Version) (State, error) { @@ -40,6 +42,9 @@ func MakeState(store adt.Store, av actors.Version) (State, error) { case actors.Version6: return make6(store) + case actors.Version7: + return make7(store) + } return nil, xerrors.Errorf("unknown actor version %d", av) } @@ -65,14 +70,17 @@ func GetActorCodeID(av actors.Version) (cid.Cid, error) { case actors.Version6: return builtin6.CronActorCodeID, nil + case actors.Version7: + return builtin7.CronActorCodeID, nil + } return cid.Undef, xerrors.Errorf("unknown actor version %d", av) } var ( - Address = builtin6.CronActorAddr - Methods = builtin6.MethodsCron + Address = builtin7.CronActorAddr + Methods = builtin7.MethodsCron ) type State interface { diff --git a/chain/actors/builtin/cron/v7.go b/chain/actors/builtin/cron/v7.go new file mode 100644 index 00000000000..e5538c89ff6 --- /dev/null +++ b/chain/actors/builtin/cron/v7.go @@ -0,0 +1,35 @@ +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" +) + +var _ State = (*state7)(nil) + +func load7(store adt.Store, root cid.Cid) (State, error) { + out := state7{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make7(store adt.Store) (State, error) { + out := state7{store: store} + out.State = *cron7.ConstructState(cron7.BuiltInEntries()) + return &out, nil +} + +type state7 struct { + cron7.State + store adt.Store +} + +func (s *state7) GetState() interface{} { + return &s.State +} diff --git a/chain/actors/builtin/init/init.go b/chain/actors/builtin/init/init.go index ee06eeab792..737241ffea0 100644 --- a/chain/actors/builtin/init/init.go +++ b/chain/actors/builtin/init/init.go @@ -25,6 +25,8 @@ import ( 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 init() { @@ -52,11 +54,15 @@ func init() { builtin.RegisterActorState(builtin6.InitActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load6(store, root) }) + + builtin.RegisterActorState(builtin7.InitActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load7(store, root) + }) } var ( - Address = builtin6.InitActorAddr - Methods = builtin6.MethodsInit + Address = builtin7.InitActorAddr + Methods = builtin7.MethodsInit ) func Load(store adt.Store, act *types.Actor) (State, error) { @@ -80,6 +86,9 @@ func Load(store adt.Store, act *types.Actor) (State, error) { case builtin6.InitActorCodeID: return load6(store, act.Head) + case builtin7.InitActorCodeID: + return load7(store, act.Head) + } return nil, xerrors.Errorf("unknown actor code %s", act.Code) } @@ -105,6 +114,9 @@ func MakeState(store adt.Store, av actors.Version, networkName string) (State, e case actors.Version6: return make6(store, networkName) + case actors.Version7: + return make7(store, networkName) + } return nil, xerrors.Errorf("unknown actor version %d", av) } @@ -130,6 +142,9 @@ func GetActorCodeID(av actors.Version) (cid.Cid, error) { case actors.Version6: return builtin6.InitActorCodeID, nil + case actors.Version7: + return builtin7.InitActorCodeID, nil + } return cid.Undef, xerrors.Errorf("unknown actor version %d", av) diff --git a/chain/actors/builtin/init/v7.go b/chain/actors/builtin/init/v7.go new file mode 100644 index 00000000000..341aa52cdb0 --- /dev/null +++ b/chain/actors/builtin/init/v7.go @@ -0,0 +1,114 @@ +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" + + 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) + +func load7(store adt.Store, root cid.Cid) (State, error) { + out := state7{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make7(store adt.Store, networkName string) (State, error) { + out := state7{store: store} + + s, err := init7.ConstructState(store, networkName) + if err != nil { + return nil, err + } + + out.State = *s + + return &out, nil +} + +type state7 struct { + init7.State + store adt.Store +} + +func (s *state7) ResolveAddress(address address.Address) (address.Address, bool, error) { + return s.State.ResolveAddress(s.store, address) +} + +func (s *state7) MapAddressToNewID(address address.Address) (address.Address, error) { + return s.State.MapAddressToNewID(s.store, address) +} + +func (s *state7) ForEachActor(cb func(id abi.ActorID, address address.Address) error) error { + addrs, err := adt7.AsMap(s.store, s.State.AddressMap, builtin7.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 *state7) NetworkName() (dtypes.NetworkName, error) { + return dtypes.NetworkName(s.State.NetworkName), nil +} + +func (s *state7) SetNetworkName(name string) error { + s.State.NetworkName = name + return nil +} + +func (s *state7) SetNextID(id abi.ActorID) error { + s.State.NextID = id + return nil +} + +func (s *state7) Remove(addrs ...address.Address) (err error) { + m, err := adt7.AsMap(s.store, s.State.AddressMap, builtin7.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 *state7) SetAddressMap(mcid cid.Cid) error { + s.State.AddressMap = mcid + return nil +} + +func (s *state7) AddressMap() (adt.Map, error) { + return adt7.AsMap(s.store, s.State.AddressMap, builtin7.DefaultHamtBitwidth) +} + +func (s *state7) GetState() interface{} { + return &s.State +} diff --git a/chain/actors/builtin/market/market.go b/chain/actors/builtin/market/market.go index 7e35f39191a..6781b55e360 100644 --- a/chain/actors/builtin/market/market.go +++ b/chain/actors/builtin/market/market.go @@ -25,6 +25,8 @@ import ( 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" @@ -56,11 +58,15 @@ func init() { builtin.RegisterActorState(builtin6.StorageMarketActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load6(store, root) }) + + builtin.RegisterActorState(builtin7.StorageMarketActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load7(store, root) + }) } var ( - Address = builtin6.StorageMarketActorAddr - Methods = builtin6.MethodsMarket + Address = builtin7.StorageMarketActorAddr + Methods = builtin7.MethodsMarket ) func Load(store adt.Store, act *types.Actor) (State, error) { @@ -84,6 +90,9 @@ func Load(store adt.Store, act *types.Actor) (State, error) { case builtin6.StorageMarketActorCodeID: return load6(store, act.Head) + case builtin7.StorageMarketActorCodeID: + return load7(store, act.Head) + } return nil, xerrors.Errorf("unknown actor code %s", act.Code) } @@ -109,6 +118,9 @@ func MakeState(store adt.Store, av actors.Version) (State, error) { case actors.Version6: return make6(store) + case actors.Version7: + return make7(store) + } return nil, xerrors.Errorf("unknown actor version %d", av) } @@ -134,6 +146,9 @@ func GetActorCodeID(av actors.Version) (cid.Cid, error) { case actors.Version6: return builtin6.StorageMarketActorCodeID, nil + case actors.Version7: + return builtin7.StorageMarketActorCodeID, nil + } return cid.Undef, xerrors.Errorf("unknown actor version %d", av) @@ -211,6 +226,9 @@ func DecodePublishStorageDealsReturn(b []byte, nv network.Version) (PublishStora case actors.Version6: return decodePublishStorageDealsReturn6(b) + case actors.Version7: + return decodePublishStorageDealsReturn7(b) + } return nil, xerrors.Errorf("unknown actor version %d", av) } diff --git a/chain/actors/builtin/market/v7.go b/chain/actors/builtin/market/v7.go new file mode 100644 index 00000000000..55391314622 --- /dev/null +++ b/chain/actors/builtin/market/v7.go @@ -0,0 +1,252 @@ +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" + + 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) + +func load7(store adt.Store, root cid.Cid) (State, error) { + out := state7{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make7(store adt.Store) (State, error) { + out := state7{store: store} + + s, err := market7.ConstructState(store) + if err != nil { + return nil, err + } + + out.State = *s + + return &out, nil +} + +type state7 struct { + market7.State + store adt.Store +} + +func (s *state7) TotalLocked() (abi.TokenAmount, error) { + fml := types.BigAdd(s.TotalClientLockedCollateral, s.TotalProviderLockedCollateral) + fml = types.BigAdd(fml, s.TotalClientStorageFee) + return fml, nil +} + +func (s *state7) BalancesChanged(otherState State) (bool, error) { + otherState7, ok := otherState.(*state7) + 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(otherState7.State.EscrowTable) || !s.State.LockedTable.Equals(otherState7.State.LockedTable), nil +} + +func (s *state7) StatesChanged(otherState State) (bool, error) { + otherState7, ok := otherState.(*state7) + 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(otherState7.State.States), nil +} + +func (s *state7) States() (DealStates, error) { + stateArray, err := adt7.AsArray(s.store, s.State.States, market7.StatesAmtBitwidth) + if err != nil { + return nil, err + } + return &dealStates7{stateArray}, nil +} + +func (s *state7) ProposalsChanged(otherState State) (bool, error) { + otherState7, ok := otherState.(*state7) + 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(otherState7.State.Proposals), nil +} + +func (s *state7) Proposals() (DealProposals, error) { + proposalArray, err := adt7.AsArray(s.store, s.State.Proposals, market7.ProposalsAmtBitwidth) + if err != nil { + return nil, err + } + return &dealProposals7{proposalArray}, nil +} + +func (s *state7) EscrowTable() (BalanceTable, error) { + bt, err := adt7.AsBalanceTable(s.store, s.State.EscrowTable) + if err != nil { + return nil, err + } + return &balanceTable7{bt}, nil +} + +func (s *state7) LockedTable() (BalanceTable, error) { + bt, err := adt7.AsBalanceTable(s.store, s.State.LockedTable) + if err != nil { + return nil, err + } + return &balanceTable7{bt}, nil +} + +func (s *state7) VerifyDealsForActivation( + minerAddr address.Address, deals []abi.DealID, currEpoch, sectorExpiry abi.ChainEpoch, +) (weight, verifiedWeight abi.DealWeight, err error) { + w, vw, _, err := market7.ValidateDealsForActivation(&s.State, s.store, deals, minerAddr, sectorExpiry, currEpoch) + return w, vw, err +} + +func (s *state7) NextID() (abi.DealID, error) { + return s.State.NextID, nil +} + +type balanceTable7 struct { + *adt7.BalanceTable +} + +func (bt *balanceTable7) ForEach(cb func(address.Address, abi.TokenAmount) error) error { + asMap := (*adt7.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 dealStates7 struct { + adt.Array +} + +func (s *dealStates7) Get(dealID abi.DealID) (*DealState, bool, error) { + var deal7 market7.DealState + found, err := s.Array.Get(uint64(dealID), &deal7) + if err != nil { + return nil, false, err + } + if !found { + return nil, false, nil + } + deal := fromV7DealState(deal7) + return &deal, true, nil +} + +func (s *dealStates7) ForEach(cb func(dealID abi.DealID, ds DealState) error) error { + var ds7 market7.DealState + return s.Array.ForEach(&ds7, func(idx int64) error { + return cb(abi.DealID(idx), fromV7DealState(ds7)) + }) +} + +func (s *dealStates7) decode(val *cbg.Deferred) (*DealState, error) { + var ds7 market7.DealState + if err := ds7.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { + return nil, err + } + ds := fromV7DealState(ds7) + return &ds, nil +} + +func (s *dealStates7) array() adt.Array { + return s.Array +} + +func fromV7DealState(v7 market7.DealState) DealState { + return (DealState)(v7) +} + +type dealProposals7 struct { + adt.Array +} + +func (s *dealProposals7) Get(dealID abi.DealID) (*DealProposal, bool, error) { + var proposal7 market7.DealProposal + found, err := s.Array.Get(uint64(dealID), &proposal7) + if err != nil { + return nil, false, err + } + if !found { + return nil, false, nil + } + proposal := fromV7DealProposal(proposal7) + return &proposal, true, nil +} + +func (s *dealProposals7) ForEach(cb func(dealID abi.DealID, dp DealProposal) error) error { + var dp7 market7.DealProposal + return s.Array.ForEach(&dp7, func(idx int64) error { + return cb(abi.DealID(idx), fromV7DealProposal(dp7)) + }) +} + +func (s *dealProposals7) decode(val *cbg.Deferred) (*DealProposal, error) { + var dp7 market7.DealProposal + if err := dp7.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { + return nil, err + } + dp := fromV7DealProposal(dp7) + return &dp, nil +} + +func (s *dealProposals7) array() adt.Array { + return s.Array +} + +func fromV7DealProposal(v7 market7.DealProposal) DealProposal { + return (DealProposal)(v7) +} + +func (s *state7) GetState() interface{} { + return &s.State +} + +var _ PublishStorageDealsReturn = (*publishStorageDealsReturn7)(nil) + +func decodePublishStorageDealsReturn7(b []byte) (PublishStorageDealsReturn, error) { + var retval market7.PublishStorageDealsReturn + if err := retval.UnmarshalCBOR(bytes.NewReader(b)); err != nil { + return nil, xerrors.Errorf("failed to unmarshal PublishStorageDealsReturn: %w", err) + } + + return &publishStorageDealsReturn7{retval}, nil +} + +type publishStorageDealsReturn7 struct { + market7.PublishStorageDealsReturn +} + +func (r *publishStorageDealsReturn7) IsDealValid(index uint64) (bool, error) { + + return r.ValidDeals.IsSet(index) + +} + +func (r *publishStorageDealsReturn7) DealIDs() ([]abi.DealID, error) { + return r.IDs, nil +} diff --git a/chain/actors/builtin/miner/miner.go b/chain/actors/builtin/miner/miner.go index 1c7f47e1151..f6d63388014 100644 --- a/chain/actors/builtin/miner/miner.go +++ b/chain/actors/builtin/miner/miner.go @@ -35,6 +35,8 @@ import ( 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 init() { @@ -63,9 +65,13 @@ func init() { return load6(store, root) }) + builtin.RegisterActorState(builtin7.StorageMinerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load7(store, root) + }) + } -var Methods = builtin6.MethodsMiner +var Methods = builtin7.MethodsMiner // Unchanged between v0, v2, v3, v4, and v5 actors var WPoStProvingPeriod = miner0.WPoStProvingPeriod @@ -102,6 +108,9 @@ func Load(store adt.Store, act *types.Actor) (State, error) { case builtin6.StorageMinerActorCodeID: return load6(store, act.Head) + case builtin7.StorageMinerActorCodeID: + return load7(store, act.Head) + } return nil, xerrors.Errorf("unknown actor code %s", act.Code) } @@ -127,6 +136,9 @@ func MakeState(store adt.Store, av actors.Version) (State, error) { case actors.Version6: return make6(store) + case actors.Version7: + return make7(store) + } return nil, xerrors.Errorf("unknown actor version %d", av) } @@ -152,6 +164,9 @@ func GetActorCodeID(av actors.Version) (cid.Cid, error) { case actors.Version6: return builtin6.StorageMinerActorCodeID, nil + case actors.Version7: + return builtin7.StorageMinerActorCodeID, nil + } return cid.Undef, xerrors.Errorf("unknown actor version %d", av) diff --git a/chain/actors/builtin/miner/v7.go b/chain/actors/builtin/miner/v7.go new file mode 100644 index 00000000000..c7096a78149 --- /dev/null +++ b/chain/actors/builtin/miner/v7.go @@ -0,0 +1,570 @@ +package miner + +import ( + "bytes" + "errors" + + "github.com/filecoin-project/go-address" + "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" + "github.com/libp2p/go-libp2p-core/peer" + cbg "github.com/whyrusleeping/cbor-gen" + "golang.org/x/xerrors" + + "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" +) + +var _ State = (*state7)(nil) + +func load7(store adt.Store, root cid.Cid) (State, error) { + out := state7{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make7(store adt.Store) (State, error) { + out := state7{store: store} + out.State = miner7.State{} + return &out, nil +} + +type state7 struct { + miner7.State + store adt.Store +} + +type deadline7 struct { + miner7.Deadline + store adt.Store +} + +type partition7 struct { + miner7.Partition + store adt.Store +} + +func (s *state7) 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 *state7) VestedFunds(epoch abi.ChainEpoch) (abi.TokenAmount, error) { + return s.CheckVestedFunds(s.store, epoch) +} + +func (s *state7) LockedFunds() (LockedFunds, error) { + return LockedFunds{ + VestingFunds: s.State.LockedFunds, + InitialPledgeRequirement: s.State.InitialPledge, + PreCommitDeposits: s.State.PreCommitDeposits, + }, nil +} + +func (s *state7) FeeDebt() (abi.TokenAmount, error) { + return s.State.FeeDebt, nil +} + +func (s *state7) InitialPledge() (abi.TokenAmount, error) { + return s.State.InitialPledge, nil +} + +func (s *state7) PreCommitDeposits() (abi.TokenAmount, error) { + return s.State.PreCommitDeposits, nil +} + +func (s *state7) GetSector(num abi.SectorNumber) (*SectorOnChainInfo, error) { + info, ok, err := s.State.GetSector(s.store, num) + if !ok || err != nil { + return nil, err + } + + ret := fromV7SectorOnChainInfo(*info) + return &ret, nil +} + +func (s *state7) 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 *state7) 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 *miner7.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 *state7) 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 either expire on-time (can be + // learned from the sector info), or in the next quantized expiration + // epoch (i.e., the first element in the partition's expiration queue. + // 2. If it's faulty, it will expire early within the first 14 entries + // of the expiration queue. + stopErr := errors.New("stop") + out := SectorExpiration{} + err = dls.ForEach(s.store, func(dlIdx uint64, dl *miner7.Deadline) error { + partitions, err := dl.PartitionsArray(s.store) + if err != nil { + return err + } + quant := s.State.QuantSpecForDeadline(dlIdx) + var part miner7.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 := miner7.LoadExpirationQueue(s.store, part.ExpirationsEpochs, quant, miner7.PartitionExpirationAmtBitwidth) + if err != nil { + return err + } + var exp miner7.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 *state7) GetPrecommittedSector(num abi.SectorNumber) (*SectorPreCommitOnChainInfo, error) { + info, ok, err := s.State.GetPrecommittedSector(s.store, num) + if !ok || err != nil { + return nil, err + } + + ret := fromV7SectorPreCommitOnChainInfo(*info) + + return &ret, nil +} + +func (s *state7) ForEachPrecommittedSector(cb func(SectorPreCommitOnChainInfo) error) error { + precommitted, err := adt7.AsMap(s.store, s.State.PreCommittedSectors, builtin7.DefaultHamtBitwidth) + if err != nil { + return err + } + + var info miner7.SectorPreCommitOnChainInfo + if err := precommitted.ForEach(&info, func(_ string) error { + return cb(fromV7SectorPreCommitOnChainInfo(info)) + }); err != nil { + return err + } + + return nil +} + +func (s *state7) LoadSectors(snos *bitfield.BitField) ([]*SectorOnChainInfo, error) { + sectors, err := miner7.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 info7 miner7.SectorOnChainInfo + if err := sectors.ForEach(&info7, func(_ int64) error { + info := fromV7SectorOnChainInfo(info7) + infos = append(infos, &info) + return nil + }); err != nil { + return nil, err + } + return infos, nil + } + + // Otherwise, load selected. + infos7, err := sectors.Load(*snos) + if err != nil { + return nil, err + } + infos := make([]*SectorOnChainInfo, len(infos7)) + for i, info7 := range infos7 { + info := fromV7SectorOnChainInfo(*info7) + infos[i] = &info + } + return infos, nil +} + +func (s *state7) loadAllocatedSectorNumbers() (bitfield.BitField, error) { + var allocatedSectors bitfield.BitField + err := s.store.Get(s.store.Context(), s.State.AllocatedSectors, &allocatedSectors) + return allocatedSectors, err +} + +func (s *state7) IsAllocated(num abi.SectorNumber) (bool, error) { + allocatedSectors, err := s.loadAllocatedSectorNumbers() + if err != nil { + return false, err + } + + return allocatedSectors.IsSet(uint64(num)) +} + +func (s *state7) GetProvingPeriodStart() (abi.ChainEpoch, error) { + return s.State.ProvingPeriodStart, nil +} + +func (s *state7) 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 *state7) 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 *state7) 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 &deadline7{*dl, s.store}, nil +} + +func (s *state7) 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 *miner7.Deadline) error { + return cb(i, &deadline7{*dl, s.store}) + }) +} + +func (s *state7) NumDeadlines() (uint64, error) { + return miner7.WPoStPeriodDeadlines, nil +} + +func (s *state7) DeadlinesChanged(other State) (bool, error) { + other7, ok := other.(*state7) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + + return !s.State.Deadlines.Equals(other7.Deadlines), nil +} + +func (s *state7) MinerInfoChanged(other State) (bool, error) { + other0, ok := other.(*state7) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + return !s.State.Info.Equals(other0.State.Info), nil +} + +func (s *state7) Info() (MinerInfo, error) { + info, err := s.State.GetInfo(s.store) + if err != nil { + return MinerInfo{}, err + } + + var pid *peer.ID + if peerID, err := peer.IDFromBytes(info.PeerId); err == nil { + pid = &peerID + } + + mi := MinerInfo{ + Owner: info.Owner, + Worker: info.Worker, + ControlAddresses: info.ControlAddresses, + + NewWorker: address.Undef, + WorkerChangeEpoch: -1, + + PeerId: pid, + Multiaddrs: info.Multiaddrs, + WindowPoStProofType: info.WindowPoStProofType, + SectorSize: info.SectorSize, + WindowPoStPartitionSectors: info.WindowPoStPartitionSectors, + ConsensusFaultElapsed: info.ConsensusFaultElapsed, + } + + if info.PendingWorkerKey != nil { + mi.NewWorker = info.PendingWorkerKey.NewWorker + mi.WorkerChangeEpoch = info.PendingWorkerKey.EffectiveAt + } + + return mi, nil +} + +func (s *state7) DeadlineInfo(epoch abi.ChainEpoch) (*dline.Info, error) { + return s.State.RecordedDeadlineInfo(epoch), nil +} + +func (s *state7) DeadlineCronActive() (bool, error) { + return s.State.DeadlineCronActive, nil +} + +func (s *state7) sectors() (adt.Array, error) { + return adt7.AsArray(s.store, s.Sectors, miner7.SectorsAmtBitwidth) +} + +func (s *state7) decodeSectorOnChainInfo(val *cbg.Deferred) (SectorOnChainInfo, error) { + var si miner7.SectorOnChainInfo + err := si.UnmarshalCBOR(bytes.NewReader(val.Raw)) + if err != nil { + return SectorOnChainInfo{}, err + } + + return fromV7SectorOnChainInfo(si), nil +} + +func (s *state7) precommits() (adt.Map, error) { + return adt7.AsMap(s.store, s.PreCommittedSectors, builtin7.DefaultHamtBitwidth) +} + +func (s *state7) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (SectorPreCommitOnChainInfo, error) { + var sp miner7.SectorPreCommitOnChainInfo + err := sp.UnmarshalCBOR(bytes.NewReader(val.Raw)) + if err != nil { + return SectorPreCommitOnChainInfo{}, err + } + + return fromV7SectorPreCommitOnChainInfo(sp), nil +} + +func (s *state7) EraseAllUnproven() error { + + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return err + } + + err = dls.ForEach(s.store, func(dindx uint64, dl *miner7.Deadline) error { + ps, err := dl.PartitionsArray(s.store) + if err != nil { + return err + } + + var part miner7.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 *deadline7) LoadPartition(idx uint64) (Partition, error) { + p, err := d.Deadline.LoadPartition(d.store, idx) + if err != nil { + return nil, err + } + return &partition7{*p, d.store}, nil +} + +func (d *deadline7) ForEachPartition(cb func(uint64, Partition) error) error { + ps, err := d.Deadline.PartitionsArray(d.store) + if err != nil { + return err + } + var part miner7.Partition + return ps.ForEach(&part, func(i int64) error { + return cb(uint64(i), &partition7{part, d.store}) + }) +} + +func (d *deadline7) PartitionsChanged(other Deadline) (bool, error) { + other7, ok := other.(*deadline7) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + + return !d.Deadline.Partitions.Equals(other7.Deadline.Partitions), nil +} + +func (d *deadline7) PartitionsPoSted() (bitfield.BitField, error) { + return d.Deadline.PartitionsPoSted, nil +} + +func (d *deadline7) DisputableProofCount() (uint64, error) { + + ops, err := d.OptimisticProofsSnapshotArray(d.store) + if err != nil { + return 0, err + } + + return ops.Length(), nil + +} + +func (p *partition7) AllSectors() (bitfield.BitField, error) { + return p.Partition.Sectors, nil +} + +func (p *partition7) FaultySectors() (bitfield.BitField, error) { + return p.Partition.Faults, nil +} + +func (p *partition7) RecoveringSectors() (bitfield.BitField, error) { + return p.Partition.Recoveries, nil +} + +func (p *partition7) UnprovenSectors() (bitfield.BitField, error) { + return p.Partition.Unproven, nil +} + +func fromV7SectorOnChainInfo(v7 miner7.SectorOnChainInfo) SectorOnChainInfo { + + return SectorOnChainInfo{ + SectorNumber: v7.SectorNumber, + SealProof: v7.SealProof, + SealedCID: v7.SealedCID, + DealIDs: v7.DealIDs, + Activation: v7.Activation, + Expiration: v7.Expiration, + DealWeight: v7.DealWeight, + VerifiedDealWeight: v7.VerifiedDealWeight, + InitialPledge: v7.InitialPledge, + ExpectedDayReward: v7.ExpectedDayReward, + ExpectedStoragePledge: v7.ExpectedStoragePledge, + } + +} + +func fromV7SectorPreCommitOnChainInfo(v7 miner7.SectorPreCommitOnChainInfo) SectorPreCommitOnChainInfo { + + return SectorPreCommitOnChainInfo{ + Info: (SectorPreCommitInfo)(v7.Info), + PreCommitDeposit: v7.PreCommitDeposit, + PreCommitEpoch: v7.PreCommitEpoch, + DealWeight: v7.DealWeight, + VerifiedDealWeight: v7.VerifiedDealWeight, + } + +} + +func (s *state7) GetState() interface{} { + return &s.State +} diff --git a/chain/actors/builtin/multisig/message7.go b/chain/actors/builtin/multisig/message7.go new file mode 100644 index 00000000000..e7fb83e9bd0 --- /dev/null +++ b/chain/actors/builtin/multisig/message7.go @@ -0,0 +1,71 @@ +package multisig + +import ( + "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" + multisig7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/multisig" + + "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 message7 struct{ message0 } + +func (m message7) 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 := &multisig7.ConstructorParams{ + Signers: signers, + NumApprovalsThreshold: threshold, + UnlockDuration: unlockDuration, + StartEpoch: unlockStart, + } + + enc, actErr := actors.SerializeParams(msigParams) + if actErr != nil { + return nil, actErr + } + + // new actors are created by invoking 'exec' on the init actor with the constructor params + execParams := &init7.ExecParams{ + CodeCID: builtin7.MultisigActorCodeID, + ConstructorParams: enc, + } + + enc, actErr = actors.SerializeParams(execParams) + if actErr != nil { + return nil, actErr + } + + return &types.Message{ + To: init_.Address, + From: m.from, + Method: builtin7.MethodsInit.Exec, + Params: enc, + Value: initialAmount, + }, nil +} diff --git a/chain/actors/builtin/multisig/multisig.go b/chain/actors/builtin/multisig/multisig.go index ee725f7e58e..f1b50475af4 100644 --- a/chain/actors/builtin/multisig/multisig.go +++ b/chain/actors/builtin/multisig/multisig.go @@ -13,7 +13,7 @@ import ( "github.com/ipfs/go-cid" msig0 "github.com/filecoin-project/specs-actors/actors/builtin/multisig" - msig6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/multisig" + msig7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/multisig" builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" @@ -27,6 +27,8 @@ import ( 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" @@ -58,6 +60,10 @@ func init() { builtin.RegisterActorState(builtin6.MultisigActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load6(store, root) }) + + builtin.RegisterActorState(builtin7.MultisigActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load7(store, root) + }) } func Load(store adt.Store, act *types.Actor) (State, error) { @@ -81,6 +87,9 @@ func Load(store adt.Store, act *types.Actor) (State, error) { case builtin6.MultisigActorCodeID: return load6(store, act.Head) + case builtin7.MultisigActorCodeID: + return load7(store, act.Head) + } return nil, xerrors.Errorf("unknown actor code %s", act.Code) } @@ -106,6 +115,9 @@ func MakeState(store adt.Store, av actors.Version, signers []address.Address, th case actors.Version6: return make6(store, signers, threshold, startEpoch, unlockDuration, initialBalance) + case actors.Version7: + return make7(store, signers, threshold, startEpoch, unlockDuration, initialBalance) + } return nil, xerrors.Errorf("unknown actor version %d", av) } @@ -131,6 +143,9 @@ func GetActorCodeID(av actors.Version) (cid.Cid, error) { case actors.Version6: return builtin6.MultisigActorCodeID, nil + case actors.Version7: + return builtin7.MultisigActorCodeID, nil + } return cid.Undef, xerrors.Errorf("unknown actor version %d", av) @@ -156,7 +171,7 @@ type State interface { type Transaction = msig0.Transaction -var Methods = builtin6.MethodsMultisig +var Methods = builtin7.MethodsMultisig func Message(version actors.Version, from address.Address) MessageBuilder { switch version { @@ -178,6 +193,9 @@ func Message(version actors.Version, from address.Address) MessageBuilder { case actors.Version6: return message6{message0{from}} + + case actors.Version7: + return message7{message0{from}} default: panic(fmt.Sprintf("unsupported actors version: %d", version)) } @@ -201,13 +219,13 @@ type MessageBuilder interface { } // this type is the same between v0 and v2 -type ProposalHashData = msig6.ProposalHashData -type ProposeReturn = msig6.ProposeReturn -type ProposeParams = msig6.ProposeParams -type ApproveReturn = msig6.ApproveReturn +type ProposalHashData = msig7.ProposalHashData +type ProposeReturn = msig7.ProposeReturn +type ProposeParams = msig7.ProposeParams +type ApproveReturn = msig7.ApproveReturn func txnParams(id uint64, data *ProposalHashData) ([]byte, error) { - params := msig6.TxnIDParams{ID: msig6.TxnID(id)} + params := msig7.TxnIDParams{ID: msig7.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/v7.go b/chain/actors/builtin/multisig/v7.go new file mode 100644 index 00000000000..bbe41f3dbb0 --- /dev/null +++ b/chain/actors/builtin/multisig/v7.go @@ -0,0 +1,119 @@ +package multisig + +import ( + "bytes" + "encoding/binary" + + adt7 "github.com/filecoin-project/specs-actors/v7/actors/util/adt" + + "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" + + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + + msig7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/multisig" +) + +var _ State = (*state7)(nil) + +func load7(store adt.Store, root cid.Cid) (State, error) { + out := state7{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make7(store adt.Store, signers []address.Address, threshold uint64, startEpoch abi.ChainEpoch, unlockDuration abi.ChainEpoch, initialBalance abi.TokenAmount) (State, error) { + out := state7{store: store} + out.State = msig7.State{} + out.State.Signers = signers + out.State.NumApprovalsThreshold = threshold + out.State.StartEpoch = startEpoch + out.State.UnlockDuration = unlockDuration + out.State.InitialBalance = initialBalance + + em, err := adt7.StoreEmptyMap(store, builtin7.DefaultHamtBitwidth) + if err != nil { + return nil, err + } + + out.State.PendingTxns = em + + return &out, nil +} + +type state7 struct { + msig7.State + store adt.Store +} + +func (s *state7) LockedBalance(currEpoch abi.ChainEpoch) (abi.TokenAmount, error) { + return s.State.AmountLocked(currEpoch - s.State.StartEpoch), nil +} + +func (s *state7) StartEpoch() (abi.ChainEpoch, error) { + return s.State.StartEpoch, nil +} + +func (s *state7) UnlockDuration() (abi.ChainEpoch, error) { + return s.State.UnlockDuration, nil +} + +func (s *state7) InitialBalance() (abi.TokenAmount, error) { + return s.State.InitialBalance, nil +} + +func (s *state7) Threshold() (uint64, error) { + return s.State.NumApprovalsThreshold, nil +} + +func (s *state7) Signers() ([]address.Address, error) { + return s.State.Signers, nil +} + +func (s *state7) ForEachPendingTxn(cb func(id int64, txn Transaction) error) error { + arr, err := adt7.AsMap(s.store, s.State.PendingTxns, builtin7.DefaultHamtBitwidth) + if err != nil { + return err + } + var out msig7.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 *state7) PendingTxnChanged(other State) (bool, error) { + other7, ok := other.(*state7) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + return !s.State.PendingTxns.Equals(other7.PendingTxns), nil +} + +func (s *state7) transactions() (adt.Map, error) { + return adt7.AsMap(s.store, s.PendingTxns, builtin7.DefaultHamtBitwidth) +} + +func (s *state7) decodeTransaction(val *cbg.Deferred) (Transaction, error) { + var tx msig7.Transaction + if err := tx.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { + return Transaction{}, err + } + return tx, nil +} + +func (s *state7) GetState() interface{} { + return &s.State +} diff --git a/chain/actors/builtin/paych/message7.go b/chain/actors/builtin/paych/message7.go new file mode 100644 index 00000000000..41dfa1bdd18 --- /dev/null +++ b/chain/actors/builtin/paych/message7.go @@ -0,0 +1,74 @@ +package paych + +import ( + "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" + paych7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/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 message7 struct{ from address.Address } + +func (m message7) Create(to address.Address, initialAmount abi.TokenAmount) (*types.Message, error) { + params, aerr := actors.SerializeParams(&paych7.ConstructorParams{From: m.from, To: to}) + if aerr != nil { + return nil, aerr + } + enc, aerr := actors.SerializeParams(&init7.ExecParams{ + CodeCID: builtin7.PaymentChannelActorCodeID, + ConstructorParams: params, + }) + if aerr != nil { + return nil, aerr + } + + return &types.Message{ + To: init_.Address, + From: m.from, + Value: initialAmount, + Method: builtin7.MethodsInit.Exec, + Params: enc, + }, nil +} + +func (m message7) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*types.Message, error) { + params, aerr := actors.SerializeParams(&paych7.UpdateChannelStateParams{ + Sv: *sv, + Secret: secret, + }) + if aerr != nil { + return nil, aerr + } + + return &types.Message{ + To: paych, + From: m.from, + Value: abi.NewTokenAmount(0), + Method: builtin7.MethodsPaych.UpdateChannelState, + Params: params, + }, nil +} + +func (m message7) Settle(paych address.Address) (*types.Message, error) { + return &types.Message{ + To: paych, + From: m.from, + Value: abi.NewTokenAmount(0), + Method: builtin7.MethodsPaych.Settle, + }, nil +} + +func (m message7) Collect(paych address.Address) (*types.Message, error) { + return &types.Message{ + To: paych, + From: m.from, + Value: abi.NewTokenAmount(0), + Method: builtin7.MethodsPaych.Collect, + }, nil +} diff --git a/chain/actors/builtin/paych/paych.go b/chain/actors/builtin/paych/paych.go index eea3659f8b5..f807b33edce 100644 --- a/chain/actors/builtin/paych/paych.go +++ b/chain/actors/builtin/paych/paych.go @@ -27,6 +27,8 @@ import ( 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" @@ -58,6 +60,10 @@ func init() { builtin.RegisterActorState(builtin6.PaymentChannelActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load6(store, root) }) + + builtin.RegisterActorState(builtin7.PaymentChannelActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load7(store, root) + }) } // Load returns an abstract copy of payment channel state, irregardless of actor version @@ -82,6 +88,9 @@ func Load(store adt.Store, act *types.Actor) (State, error) { case builtin6.PaymentChannelActorCodeID: return load6(store, act.Head) + case builtin7.PaymentChannelActorCodeID: + return load7(store, act.Head) + } return nil, xerrors.Errorf("unknown actor code %s", act.Code) } @@ -107,6 +116,9 @@ func MakeState(store adt.Store, av actors.Version) (State, error) { case actors.Version6: return make6(store) + case actors.Version7: + return make7(store) + } return nil, xerrors.Errorf("unknown actor version %d", av) } @@ -132,6 +144,9 @@ func GetActorCodeID(av actors.Version) (cid.Cid, error) { case actors.Version6: return builtin6.PaymentChannelActorCodeID, nil + case actors.Version7: + return builtin7.PaymentChannelActorCodeID, nil + } return cid.Undef, xerrors.Errorf("unknown actor version %d", av) @@ -185,7 +200,7 @@ func DecodeSignedVoucher(s string) (*SignedVoucher, error) { return &sv, nil } -var Methods = builtin6.MethodsPaych +var Methods = builtin7.MethodsPaych func Message(version actors.Version, from address.Address) MessageBuilder { switch version { @@ -208,6 +223,9 @@ func Message(version actors.Version, from address.Address) MessageBuilder { case actors.Version6: return message6{from} + case actors.Version7: + return message7{from} + default: panic(fmt.Sprintf("unsupported actors version: %d", version)) } diff --git a/chain/actors/builtin/paych/v7.go b/chain/actors/builtin/paych/v7.go new file mode 100644 index 00000000000..ce09ea2e4be --- /dev/null +++ b/chain/actors/builtin/paych/v7.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" + + 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) + +func load7(store adt.Store, root cid.Cid) (State, error) { + out := state7{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make7(store adt.Store) (State, error) { + out := state7{store: store} + out.State = paych7.State{} + return &out, nil +} + +type state7 struct { + paych7.State + store adt.Store + lsAmt *adt7.Array +} + +// Channel owner, who has funded the actor +func (s *state7) From() (address.Address, error) { + return s.State.From, nil +} + +// Recipient of payouts from channel +func (s *state7) To() (address.Address, error) { + return s.State.To, nil +} + +// Height at which the channel can be `Collected` +func (s *state7) SettlingAt() (abi.ChainEpoch, error) { + return s.State.SettlingAt, nil +} + +// Amount successfully redeemed through the payment channel, paid out on `Collect()` +func (s *state7) ToSend() (abi.TokenAmount, error) { + return s.State.ToSend, nil +} + +func (s *state7) getOrLoadLsAmt() (*adt7.Array, error) { + if s.lsAmt != nil { + return s.lsAmt, nil + } + + // Get the lane state from the chain + lsamt, err := adt7.AsArray(s.store, s.State.LaneStates, paych7.LaneStatesAmtBitwidth) + if err != nil { + return nil, err + } + + s.lsAmt = lsamt + return lsamt, nil +} + +// Get total number of lanes +func (s *state7) LaneCount() (uint64, error) { + lsamt, err := s.getOrLoadLsAmt() + if err != nil { + return 0, err + } + return lsamt.Length(), nil +} + +func (s *state7) GetState() interface{} { + return &s.State +} + +// Iterate lane states +func (s *state7) 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 paych7.LaneState + return lsamt.ForEach(&ls, func(i int64) error { + return cb(uint64(i), &laneState7{ls}) + }) +} + +type laneState7 struct { + paych7.LaneState +} + +func (ls *laneState7) Redeemed() (big.Int, error) { + return ls.LaneState.Redeemed, nil +} + +func (ls *laneState7) Nonce() (uint64, error) { + return ls.LaneState.Nonce, nil +} diff --git a/chain/actors/builtin/power/power.go b/chain/actors/builtin/power/power.go index 84bd6948a86..9b73cdd603e 100644 --- a/chain/actors/builtin/power/power.go +++ b/chain/actors/builtin/power/power.go @@ -26,6 +26,8 @@ import ( 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 init() { @@ -53,11 +55,15 @@ func init() { builtin.RegisterActorState(builtin6.StoragePowerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load6(store, root) }) + + builtin.RegisterActorState(builtin7.StoragePowerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load7(store, root) + }) } var ( - Address = builtin6.StoragePowerActorAddr - Methods = builtin6.MethodsPower + Address = builtin7.StoragePowerActorAddr + Methods = builtin7.MethodsPower ) func Load(store adt.Store, act *types.Actor) (State, error) { @@ -81,6 +87,9 @@ func Load(store adt.Store, act *types.Actor) (State, error) { case builtin6.StoragePowerActorCodeID: return load6(store, act.Head) + case builtin7.StoragePowerActorCodeID: + return load7(store, act.Head) + } return nil, xerrors.Errorf("unknown actor code %s", act.Code) } @@ -106,6 +115,9 @@ func MakeState(store adt.Store, av actors.Version) (State, error) { case actors.Version6: return make6(store) + case actors.Version7: + return make7(store) + } return nil, xerrors.Errorf("unknown actor version %d", av) } @@ -131,6 +143,9 @@ func GetActorCodeID(av actors.Version) (cid.Cid, error) { case actors.Version6: return builtin6.StoragePowerActorCodeID, nil + case actors.Version7: + return builtin7.StoragePowerActorCodeID, nil + } return cid.Undef, xerrors.Errorf("unknown actor version %d", av) diff --git a/chain/actors/builtin/power/v7.go b/chain/actors/builtin/power/v7.go new file mode 100644 index 00000000000..af1761cb2b8 --- /dev/null +++ b/chain/actors/builtin/power/v7.go @@ -0,0 +1,187 @@ +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" + + 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) + +func load7(store adt.Store, root cid.Cid) (State, error) { + out := state7{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make7(store adt.Store) (State, error) { + out := state7{store: store} + + s, err := power7.ConstructState(store) + if err != nil { + return nil, err + } + + out.State = *s + + return &out, nil +} + +type state7 struct { + power7.State + store adt.Store +} + +func (s *state7) TotalLocked() (abi.TokenAmount, error) { + return s.TotalPledgeCollateral, nil +} + +func (s *state7) 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 *state7) TotalCommitted() (Claim, error) { + return Claim{ + RawBytePower: s.TotalBytesCommitted, + QualityAdjPower: s.TotalQABytesCommitted, + }, nil +} + +func (s *state7) MinerPower(addr address.Address) (Claim, bool, error) { + claims, err := s.claims() + if err != nil { + return Claim{}, false, err + } + var claim power7.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 *state7) MinerNominalPowerMeetsConsensusMinimum(a address.Address) (bool, error) { + return s.State.MinerNominalPowerMeetsConsensusMinimum(s.store, a) +} + +func (s *state7) TotalPowerSmoothed() (builtin.FilterEstimate, error) { + return builtin.FromV7FilterEstimate(s.State.ThisEpochQAPowerSmoothed), nil +} + +func (s *state7) MinerCounts() (uint64, uint64, error) { + return uint64(s.State.MinerAboveMinPowerCount), uint64(s.State.MinerCount), nil +} + +func (s *state7) 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 *state7) ForEachClaim(cb func(miner address.Address, claim Claim) error) error { + claims, err := s.claims() + if err != nil { + return err + } + + var claim power7.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 *state7) ClaimsChanged(other State) (bool, error) { + other7, ok := other.(*state7) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + return !s.State.Claims.Equals(other7.State.Claims), nil +} + +func (s *state7) SetTotalQualityAdjPower(p abi.StoragePower) error { + s.State.TotalQualityAdjPower = p + return nil +} + +func (s *state7) SetTotalRawBytePower(p abi.StoragePower) error { + s.State.TotalRawBytePower = p + return nil +} + +func (s *state7) SetThisEpochQualityAdjPower(p abi.StoragePower) error { + s.State.ThisEpochQualityAdjPower = p + return nil +} + +func (s *state7) SetThisEpochRawBytePower(p abi.StoragePower) error { + s.State.ThisEpochRawBytePower = p + return nil +} + +func (s *state7) GetState() interface{} { + return &s.State +} + +func (s *state7) claims() (adt.Map, error) { + return adt7.AsMap(s.store, s.Claims, builtin7.DefaultHamtBitwidth) +} + +func (s *state7) decodeClaim(val *cbg.Deferred) (Claim, error) { + var ci power7.Claim + if err := ci.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { + return Claim{}, err + } + return fromV7Claim(ci), nil +} + +func fromV7Claim(v7 power7.Claim) Claim { + return Claim{ + RawBytePower: v7.RawBytePower, + QualityAdjPower: v7.QualityAdjPower, + } +} diff --git a/chain/actors/builtin/reward/reward.go b/chain/actors/builtin/reward/reward.go index 38d5b5b875e..b6ee2f14668 100644 --- a/chain/actors/builtin/reward/reward.go +++ b/chain/actors/builtin/reward/reward.go @@ -21,6 +21,8 @@ import ( 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/adt" "github.com/filecoin-project/lotus/chain/actors/builtin" "github.com/filecoin-project/lotus/chain/types" @@ -51,11 +53,15 @@ func init() { builtin.RegisterActorState(builtin6.RewardActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load6(store, root) }) + + builtin.RegisterActorState(builtin7.RewardActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load7(store, root) + }) } var ( - Address = builtin6.RewardActorAddr - Methods = builtin6.MethodsReward + Address = builtin7.RewardActorAddr + Methods = builtin7.MethodsReward ) func Load(store adt.Store, act *types.Actor) (State, error) { @@ -79,6 +85,9 @@ func Load(store adt.Store, act *types.Actor) (State, error) { case builtin6.RewardActorCodeID: return load6(store, act.Head) + case builtin7.RewardActorCodeID: + return load7(store, act.Head) + } return nil, xerrors.Errorf("unknown actor code %s", act.Code) } @@ -104,6 +113,9 @@ func MakeState(store adt.Store, av actors.Version, currRealizedPower abi.Storage case actors.Version6: return make6(store, currRealizedPower) + case actors.Version7: + return make7(store, currRealizedPower) + } return nil, xerrors.Errorf("unknown actor version %d", av) } @@ -129,6 +141,9 @@ func GetActorCodeID(av actors.Version) (cid.Cid, error) { case actors.Version6: return builtin6.RewardActorCodeID, nil + case actors.Version7: + return builtin7.RewardActorCodeID, nil + } return cid.Undef, xerrors.Errorf("unknown actor version %d", av) diff --git a/chain/actors/builtin/reward/v7.go b/chain/actors/builtin/reward/v7.go new file mode 100644 index 00000000000..368bb3abd12 --- /dev/null +++ b/chain/actors/builtin/reward/v7.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" + + 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) + +func load7(store adt.Store, root cid.Cid) (State, error) { + out := state7{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make7(store adt.Store, currRealizedPower abi.StoragePower) (State, error) { + out := state7{store: store} + out.State = *reward7.ConstructState(currRealizedPower) + return &out, nil +} + +type state7 struct { + reward7.State + store adt.Store +} + +func (s *state7) ThisEpochReward() (abi.TokenAmount, error) { + return s.State.ThisEpochReward, nil +} + +func (s *state7) ThisEpochRewardSmoothed() (builtin.FilterEstimate, error) { + + return builtin.FilterEstimate{ + PositionEstimate: s.State.ThisEpochRewardSmoothed.PositionEstimate, + VelocityEstimate: s.State.ThisEpochRewardSmoothed.VelocityEstimate, + }, nil + +} + +func (s *state7) ThisEpochBaselinePower() (abi.StoragePower, error) { + return s.State.ThisEpochBaselinePower, nil +} + +func (s *state7) TotalStoragePowerReward() (abi.TokenAmount, error) { + return s.State.TotalStoragePowerReward, nil +} + +func (s *state7) EffectiveBaselinePower() (abi.StoragePower, error) { + return s.State.EffectiveBaselinePower, nil +} + +func (s *state7) EffectiveNetworkTime() (abi.ChainEpoch, error) { + return s.State.EffectiveNetworkTime, nil +} + +func (s *state7) CumsumBaseline() (reward7.Spacetime, error) { + return s.State.CumsumBaseline, nil +} + +func (s *state7) CumsumRealized() (reward7.Spacetime, error) { + return s.State.CumsumRealized, nil +} + +func (s *state7) InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount) (abi.TokenAmount, error) { + return miner7.InitialPledgeForPower( + qaPower, + s.State.ThisEpochBaselinePower, + s.State.ThisEpochRewardSmoothed, + smoothing7.FilterEstimate{ + PositionEstimate: networkQAPower.PositionEstimate, + VelocityEstimate: networkQAPower.VelocityEstimate, + }, + circSupply, + ), nil +} + +func (s *state7) PreCommitDepositForPower(networkQAPower builtin.FilterEstimate, sectorWeight abi.StoragePower) (abi.TokenAmount, error) { + return miner7.PreCommitDepositForPower(s.State.ThisEpochRewardSmoothed, + smoothing7.FilterEstimate{ + PositionEstimate: networkQAPower.PositionEstimate, + VelocityEstimate: networkQAPower.VelocityEstimate, + }, + sectorWeight), nil +} + +func (s *state7) GetState() interface{} { + return &s.State +} diff --git a/chain/actors/builtin/system/system.go b/chain/actors/builtin/system/system.go index 3d6105c3801..fb7515f3547 100644 --- a/chain/actors/builtin/system/system.go +++ b/chain/actors/builtin/system/system.go @@ -17,10 +17,12 @@ import ( 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" ) var ( - Address = builtin6.SystemActorAddr + Address = builtin7.SystemActorAddr ) func MakeState(store adt.Store, av actors.Version) (State, error) { @@ -44,6 +46,9 @@ func MakeState(store adt.Store, av actors.Version) (State, error) { case actors.Version6: return make6(store) + case actors.Version7: + return make7(store) + } return nil, xerrors.Errorf("unknown actor version %d", av) } @@ -69,6 +74,9 @@ func GetActorCodeID(av actors.Version) (cid.Cid, error) { case actors.Version6: return builtin6.SystemActorCodeID, nil + case actors.Version7: + return builtin7.SystemActorCodeID, nil + } return cid.Undef, xerrors.Errorf("unknown actor version %d", av) diff --git a/chain/actors/builtin/system/v7.go b/chain/actors/builtin/system/v7.go new file mode 100644 index 00000000000..813add5fb14 --- /dev/null +++ b/chain/actors/builtin/system/v7.go @@ -0,0 +1,35 @@ +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" +) + +var _ State = (*state7)(nil) + +func load7(store adt.Store, root cid.Cid) (State, error) { + out := state7{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make7(store adt.Store) (State, error) { + out := state7{store: store} + out.State = system7.State{} + return &out, nil +} + +type state7 struct { + system7.State + store adt.Store +} + +func (s *state7) GetState() interface{} { + return &s.State +} diff --git a/chain/actors/builtin/verifreg/v7.go b/chain/actors/builtin/verifreg/v7.go new file mode 100644 index 00000000000..9b2ca928ab5 --- /dev/null +++ b/chain/actors/builtin/verifreg/v7.go @@ -0,0 +1,75 @@ +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" + + 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) + +func load7(store adt.Store, root cid.Cid) (State, error) { + out := state7{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make7(store adt.Store, rootKeyAddress address.Address) (State, error) { + out := state7{store: store} + + s, err := verifreg7.ConstructState(store, rootKeyAddress) + if err != nil { + return nil, err + } + + out.State = *s + + return &out, nil +} + +type state7 struct { + verifreg7.State + store adt.Store +} + +func (s *state7) RootKey() (address.Address, error) { + return s.State.RootKey, nil +} + +func (s *state7) VerifiedClientDataCap(addr address.Address) (bool, abi.StoragePower, error) { + return getDataCap(s.store, actors.Version7, s.verifiedClients, addr) +} + +func (s *state7) VerifierDataCap(addr address.Address) (bool, abi.StoragePower, error) { + return getDataCap(s.store, actors.Version7, s.verifiers, addr) +} + +func (s *state7) ForEachVerifier(cb func(addr address.Address, dcap abi.StoragePower) error) error { + return forEachCap(s.store, actors.Version7, s.verifiers, cb) +} + +func (s *state7) ForEachClient(cb func(addr address.Address, dcap abi.StoragePower) error) error { + return forEachCap(s.store, actors.Version7, s.verifiedClients, cb) +} + +func (s *state7) verifiedClients() (adt.Map, error) { + return adt7.AsMap(s.store, s.VerifiedClients, builtin7.DefaultHamtBitwidth) +} + +func (s *state7) verifiers() (adt.Map, error) { + return adt7.AsMap(s.store, s.Verifiers, builtin7.DefaultHamtBitwidth) +} + +func (s *state7) GetState() interface{} { + return &s.State +} diff --git a/chain/actors/builtin/verifreg/verifreg.go b/chain/actors/builtin/verifreg/verifreg.go index 31e8e5a083e..f6281334dda 100644 --- a/chain/actors/builtin/verifreg/verifreg.go +++ b/chain/actors/builtin/verifreg/verifreg.go @@ -21,6 +21,8 @@ import ( 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" @@ -53,11 +55,15 @@ func init() { return load6(store, root) }) + builtin.RegisterActorState(builtin7.VerifiedRegistryActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load7(store, root) + }) + } var ( - Address = builtin6.VerifiedRegistryActorAddr - Methods = builtin6.MethodsVerifiedRegistry + Address = builtin7.VerifiedRegistryActorAddr + Methods = builtin7.MethodsVerifiedRegistry ) func Load(store adt.Store, act *types.Actor) (State, error) { @@ -81,6 +87,9 @@ func Load(store adt.Store, act *types.Actor) (State, error) { case builtin6.VerifiedRegistryActorCodeID: return load6(store, act.Head) + case builtin7.VerifiedRegistryActorCodeID: + return load7(store, act.Head) + } return nil, xerrors.Errorf("unknown actor code %s", act.Code) } @@ -106,6 +115,9 @@ func MakeState(store adt.Store, av actors.Version, rootKeyAddress address.Addres case actors.Version6: return make6(store, rootKeyAddress) + case actors.Version7: + return make7(store, rootKeyAddress) + } return nil, xerrors.Errorf("unknown actor version %d", av) } @@ -131,6 +143,9 @@ func GetActorCodeID(av actors.Version) (cid.Cid, error) { case actors.Version6: return builtin6.VerifiedRegistryActorCodeID, nil + case actors.Version7: + return builtin7.VerifiedRegistryActorCodeID, nil + } return cid.Undef, xerrors.Errorf("unknown actor version %d", av) diff --git a/chain/actors/policy/policy.go b/chain/actors/policy/policy.go index e00a6ae10cb..f51da7aa7d5 100644 --- a/chain/actors/policy/policy.go +++ b/chain/actors/policy/policy.go @@ -40,14 +40,19 @@ import ( miner6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/miner" verifreg6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/verifreg" - paych6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/paych" + 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" + + paych7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/paych" ) const ( - ChainFinality = miner6.ChainFinality + ChainFinality = miner7.ChainFinality SealRandomnessLookback = ChainFinality - PaychSettleDelay = paych6.SettleDelay - MaxPreCommitRandomnessLookback = builtin6.EpochsInDay + SealRandomnessLookback + PaychSettleDelay = paych7.SettleDelay + MaxPreCommitRandomnessLookback = builtin7.EpochsInDay + SealRandomnessLookback ) // SetSupportedProofTypes sets supported proof types, across all actor versions. @@ -72,6 +77,8 @@ func SetSupportedProofTypes(types ...abi.RegisteredSealProof) { miner6.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) + miner7.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) + AddSupportedProofTypes(types...) } @@ -119,6 +126,15 @@ func AddSupportedProofTypes(types ...abi.RegisteredSealProof) { miner6.WindowPoStProofTypes[wpp] = struct{}{} + miner7.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) + } + + miner7.WindowPoStProofTypes[wpp] = struct{}{} + } } @@ -139,11 +155,13 @@ func SetPreCommitChallengeDelay(delay abi.ChainEpoch) { miner6.PreCommitChallengeDelay = delay + miner7.PreCommitChallengeDelay = delay + } // TODO: this function shouldn't really exist. Instead, the API should expose the precommit delay. func GetPreCommitChallengeDelay() abi.ChainEpoch { - return miner6.PreCommitChallengeDelay + return miner7.PreCommitChallengeDelay } // SetConsensusMinerMinPower sets the minimum power of an individual miner must @@ -173,6 +191,10 @@ func SetConsensusMinerMinPower(p abi.StoragePower) { policy.ConsensusMinerMinPower = p } + for _, policy := range builtin7.PoStProofPolicies { + policy.ConsensusMinerMinPower = p + } + } // SetMinVerifiedDealSize sets the minimum size of a verified deal. This should @@ -191,6 +213,8 @@ func SetMinVerifiedDealSize(size abi.StoragePower) { verifreg6.MinVerifiedDealSize = size + verifreg7.MinVerifiedDealSize = size + } func GetMaxProveCommitDuration(ver actors.Version, t abi.RegisteredSealProof) (abi.ChainEpoch, error) { @@ -220,6 +244,10 @@ func GetMaxProveCommitDuration(ver actors.Version, t abi.RegisteredSealProof) (a return miner6.MaxProveCommitDuration[t], nil + case actors.Version7: + + return miner7.MaxProveCommitDuration[t], nil + default: return 0, xerrors.Errorf("unsupported actors version") } @@ -255,6 +283,11 @@ func SetProviderCollateralSupplyTarget(num, denom big.Int) { Denominator: denom, } + market7.ProviderCollateralSupplyTarget = builtin7.BigFrac{ + Numerator: num, + Denominator: denom, + } + } func DealProviderCollateralBounds( @@ -298,13 +331,18 @@ func DealProviderCollateralBounds( min, max := market6.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) return min, max, nil + case actors.Version7: + + min, max := market7.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 market6.DealDurationBounds(pieceSize) + return market7.DealDurationBounds(pieceSize) } // Sets the challenge window and scales the proving period to match (such that @@ -345,6 +383,13 @@ func SetWPoStChallengeWindow(period abi.ChainEpoch) { // scale it if we're scaling the challenge period. miner6.WPoStDisputeWindow = period * 30 + miner7.WPoStChallengeWindow = period + miner7.WPoStProvingPeriod = period * abi.ChainEpoch(miner7.WPoStPeriodDeadlines) + + // by default, this is 2x finality which is 30 periods. + // scale it if we're scaling the challenge period. + miner7.WPoStDisputeWindow = period * 30 + } func GetWinningPoStSectorSetLookback(nwVer network.Version) abi.ChainEpoch { @@ -357,15 +402,15 @@ func GetWinningPoStSectorSetLookback(nwVer network.Version) abi.ChainEpoch { } func GetMaxSectorExpirationExtension() abi.ChainEpoch { - return miner6.MaxSectorExpirationExtension + return miner7.MaxSectorExpirationExtension } func GetMinSectorExpiration() abi.ChainEpoch { - return miner6.MinSectorExpiration + return miner7.MinSectorExpiration } func GetMaxPoStPartitions(nv network.Version, p abi.RegisteredPoStProof) (int, error) { - sectorsPerPart, err := builtin6.PoStProofWindowPoStPartitionSectors(p) + sectorsPerPart, err := builtin7.PoStProofWindowPoStPartitionSectors(p) if err != nil { return 0, err } @@ -378,8 +423,8 @@ func GetMaxPoStPartitions(nv network.Version, p abi.RegisteredPoStProof) (int, e func GetDefaultSectorSize() abi.SectorSize { // supported sector sizes are the same across versions. - szs := make([]abi.SectorSize, 0, len(miner6.PreCommitSealProofTypesV8)) - for spt := range miner6.PreCommitSealProofTypesV8 { + szs := make([]abi.SectorSize, 0, len(miner7.PreCommitSealProofTypesV8)) + for spt := range miner7.PreCommitSealProofTypesV8 { ss, err := spt.SectorSize() if err != nil { panic(err) @@ -404,7 +449,7 @@ func GetSectorMaxLifetime(proof abi.RegisteredSealProof, nwVer network.Version) return builtin4.SealProofPoliciesV0[proof].SectorMaxLifetime } - return builtin6.SealProofPoliciesV11[proof].SectorMaxLifetime + return builtin7.SealProofPoliciesV11[proof].SectorMaxLifetime } func GetAddressedSectorsMax(nwVer network.Version) (int, error) { @@ -432,6 +477,9 @@ func GetAddressedSectorsMax(nwVer network.Version) (int, error) { case actors.Version6: return miner6.AddressedSectorsMax, nil + case actors.Version7: + return miner7.AddressedSectorsMax, nil + default: return 0, xerrors.Errorf("unsupported network version") } @@ -469,6 +517,10 @@ func GetDeclarationsMax(nwVer network.Version) (int, error) { return miner6.DeclarationsMax, nil + case actors.Version7: + + return miner7.DeclarationsMax, nil + default: return 0, xerrors.Errorf("unsupported network version") } @@ -505,6 +557,10 @@ func AggregateProveCommitNetworkFee(nwVer network.Version, aggregateSize int, ba return miner6.AggregateProveCommitNetworkFee(aggregateSize, baseFee), nil + case actors.Version7: + + return miner7.AggregateProveCommitNetworkFee(aggregateSize, baseFee), nil + default: return big.Zero(), xerrors.Errorf("unsupported network version") } @@ -541,6 +597,10 @@ func AggregatePreCommitNetworkFee(nwVer network.Version, aggregateSize int, base return miner6.AggregatePreCommitNetworkFee(aggregateSize, baseFee), nil + case actors.Version7: + + return miner7.AggregatePreCommitNetworkFee(aggregateSize, baseFee), nil + default: return big.Zero(), xerrors.Errorf("unsupported network version") } diff --git a/chain/actors/version.go b/chain/actors/version.go index 7b7a6393a44..af51161c9a1 100644 --- a/chain/actors/version.go +++ b/chain/actors/version.go @@ -20,9 +20,9 @@ const ({{range .actorVersions}} /* inline-gen start */ -var LatestVersion = 6 +var LatestVersion = 7 -var Versions = []int{0, 2, 3, 4, 5, 6} +var Versions = []int{0, 2, 3, 4, 5, 6, 7} const ( Version0 Version = 0 @@ -31,6 +31,7 @@ const ( Version4 Version = 4 Version5 Version = 5 Version6 Version = 6 + Version7 Version = 7 ) /* inline-gen end */ @@ -50,6 +51,8 @@ func VersionForNetwork(version network.Version) (Version, error) { return Version5, nil case network.Version14: return Version6, nil + case network.Version15: + return Version7, 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 3c333298ef9..847d41d4786 100644 --- a/chain/consensus/filcns/compute_state.go +++ b/chain/consensus/filcns/compute_state.go @@ -28,6 +28,7 @@ import ( 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" /* inline-gen end */ @@ -59,6 +60,7 @@ func NewActorRegistry() *vm.ActorRegistry { inv.Register(vm.ActorsVersionPredicate(actors.Version4), exported4.BuiltinActors()...) inv.Register(vm.ActorsVersionPredicate(actors.Version5), exported5.BuiltinActors()...) inv.Register(vm.ActorsVersionPredicate(actors.Version6), exported6.BuiltinActors()...) + inv.Register(vm.ActorsVersionPredicate(actors.Version7), exported7.BuiltinActors()...) /* inline-gen end */ diff --git a/chain/consensus/filcns/upgrades.go b/chain/consensus/filcns/upgrades.go index cf4c62bf340..43f50311f72 100644 --- a/chain/consensus/filcns/upgrades.go +++ b/chain/consensus/filcns/upgrades.go @@ -156,6 +156,22 @@ func DefaultUpgradeSchedule() stmgr.UpgradeSchedule { StopWithin: 5, }}, Expensive: true, + }, { + Height: build.UpgradeSnapDealsHeight, + Network: network.Version15, + Migration: UpgradeActorsV7, + PreMigrations: []stmgr.PreMigration{{ + PreMigration: PreUpgradeActorsV7, + StartWithin: 120, + DontStartWithin: 60, + StopWithin: 35, + }, { + PreMigration: PreUpgradeActorsV7, + StartWithin: 30, + DontStartWithin: 15, + StopWithin: 5, + }}, + Expensive: true, }, } @@ -1170,7 +1186,97 @@ func upgradeActorsV6Common( // Perform the migration newHamtRoot, err := nv14.MigrateStateTree(ctx, store, stateRoot.Actors, epoch, config, migrationLogger{}, cache) if err != nil { - return cid.Undef, xerrors.Errorf("upgrading to actors v5: %w", err) + return cid.Undef, xerrors.Errorf("upgrading to actors v6: %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 +} + +func UpgradeActorsV7(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 := nv14.Config{ + MaxWorkers: uint(workerCount), + JobQueueSize: 1000, + ResultQueueSize: 100, + ProgressLogPeriod: 10 * time.Second, + } + + newRoot, err := upgradeActorsV7Common(ctx, sm, cache, root, epoch, ts, config) + if err != nil { + return cid.Undef, xerrors.Errorf("migrating actors v6 state: %w", err) + } + + return newRoot, nil +} + +func PreUpgradeActorsV7(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 + } + + //TODO: nv15 + config := nv14.Config{MaxWorkers: uint(workerCount)} + _, err := upgradeActorsV7Common(ctx, sm, cache, root, epoch, ts, config) + return err +} + +func upgradeActorsV7Common( + ctx context.Context, sm *stmgr.StateManager, cache stmgr.MigrationCache, + root cid.Cid, epoch abi.ChainEpoch, ts *types.TipSet, + //TODO: nv15 + config nv14.Config, +) (cid.Cid, error) { + buf := blockstore.NewTieredBstore(sm.ChainStore().StateBlockstore(), blockstore.NewMemorySync()) + store := store.ActorStore(ctx, buf) + + // 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 v7 upgrade, got %d", + stateRoot.Version, + ) + } + + // Perform the migration + //TODO: nv15 + newHamtRoot, err := nv14.MigrateStateTree(ctx, store, stateRoot.Actors, epoch, config, migrationLogger{}, cache) + if err != nil { + return cid.Undef, xerrors.Errorf("upgrading to actors v7: %w", err) } // Persist the result. diff --git a/chain/gen/gen.go b/chain/gen/gen.go index 69ab32d58e8..60dd142e9fa 100644 --- a/chain/gen/gen.go +++ b/chain/gen/gen.go @@ -9,6 +9,8 @@ import ( "sync/atomic" "time" + proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" + "github.com/filecoin-project/lotus/chain/rand" "github.com/filecoin-project/go-state-types/network" @@ -686,6 +688,10 @@ func (m genFakeVerifier) VerifyAggregateSeals(aggregate proof5.AggregateSealVeri panic("not supported") } +func (m genFakeVerifier) VerifyReplicaUpdate(update proof7.ReplicaUpdateInfo) (bool, error) { + panic("not supported") +} + func (m genFakeVerifier) VerifyWinningPoSt(ctx context.Context, info proof5.WinningPoStVerifyInfo) (bool, error) { panic("not supported") } diff --git a/chain/gen/genesis/miners.go b/chain/gen/genesis/miners.go index edacfe304c4..66691205802 100644 --- a/chain/gen/genesis/miners.go +++ b/chain/gen/genesis/miners.go @@ -6,6 +6,8 @@ import ( "fmt" "math/rand" + runtime7 "github.com/filecoin-project/specs-actors/v7/actors/runtime" + builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" "github.com/ipfs/go-cid" @@ -29,7 +31,6 @@ import ( 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" - runtime5 "github.com/filecoin-project/specs-actors/v5/actors/runtime" "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/adt" @@ -57,7 +58,7 @@ func MinerAddress(genesisIndex uint64) address.Address { } type fakedSigSyscalls struct { - runtime5.Syscalls + runtime7.Syscalls } func (fss *fakedSigSyscalls) VerifySignature(signature crypto.Signature, signer address.Address, plaintext []byte) error { @@ -65,7 +66,7 @@ func (fss *fakedSigSyscalls) VerifySignature(signature crypto.Signature, signer } func mkFakedSigSyscalls(base vm.SyscallBuilder) vm.SyscallBuilder { - return func(ctx context.Context, rt *vm.Runtime) runtime5.Syscalls { + return func(ctx context.Context, rt *vm.Runtime) runtime7.Syscalls { return &fakedSigSyscalls{ base(ctx, rt), } diff --git a/chain/state/statetree.go b/chain/state/statetree.go index f230f7faa54..9a518a6227a 100644 --- a/chain/state/statetree.go +++ b/chain/state/statetree.go @@ -159,7 +159,7 @@ func VersionForNetwork(ver network.Version) (types.StateTreeVersion, error) { /* inline-gen start */ - case network.Version13, network.Version14: + case network.Version13, network.Version14, network.Version15: /* inline-gen end */ return types.StateTreeVersion4, nil diff --git a/chain/vm/gas.go b/chain/vm/gas.go index 206a55d3643..27d9c8d94ae 100644 --- a/chain/vm/gas.go +++ b/chain/vm/gas.go @@ -3,13 +3,14 @@ package vm import ( "fmt" + vmr "github.com/filecoin-project/specs-actors/v7/actors/runtime" + proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" + "github.com/filecoin-project/go-address" addr "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/build" - vmr5 "github.com/filecoin-project/specs-actors/v5/actors/runtime" - proof5 "github.com/filecoin-project/specs-actors/v5/actors/runtime/proof" "github.com/ipfs/go-cid" ) @@ -73,9 +74,10 @@ type Pricelist interface { OnVerifySignature(sigType crypto.SigType, planTextSize int) (GasCharge, error) OnHashing(dataSize int) GasCharge OnComputeUnsealedSectorCid(proofType abi.RegisteredSealProof, pieces []abi.PieceInfo) GasCharge - OnVerifySeal(info proof5.SealVerifyInfo) GasCharge - OnVerifyAggregateSeals(aggregate proof5.AggregateSealVerifyProofAndInfos) GasCharge - OnVerifyPost(info proof5.WindowPoStVerifyInfo) GasCharge + OnVerifySeal(info proof7.SealVerifyInfo) GasCharge + OnVerifyAggregateSeals(aggregate proof7.AggregateSealVerifyProofAndInfos) GasCharge + OnVerifyReplicaUpdate(update proof7.ReplicaUpdateInfo) GasCharge + OnVerifyPost(info proof7.WindowPoStVerifyInfo) GasCharge OnVerifyConsensusFault() GasCharge } @@ -227,7 +229,7 @@ func PricelistByEpoch(epoch abi.ChainEpoch) Pricelist { } type pricedSyscalls struct { - under vmr5.Syscalls + under vmr.Syscalls pl Pricelist chargeGas func(GasCharge) } @@ -261,7 +263,7 @@ func (ps pricedSyscalls) ComputeUnsealedSectorCID(reg abi.RegisteredSealProof, p } // Verifies a sector seal proof. -func (ps pricedSyscalls) VerifySeal(vi proof5.SealVerifyInfo) error { +func (ps pricedSyscalls) VerifySeal(vi proof7.SealVerifyInfo) error { ps.chargeGas(ps.pl.OnVerifySeal(vi)) defer ps.chargeGas(gasOnActorExec) @@ -269,7 +271,7 @@ func (ps pricedSyscalls) VerifySeal(vi proof5.SealVerifyInfo) error { } // Verifies a proof of spacetime. -func (ps pricedSyscalls) VerifyPoSt(vi proof5.WindowPoStVerifyInfo) error { +func (ps pricedSyscalls) VerifyPoSt(vi proof7.WindowPoStVerifyInfo) error { ps.chargeGas(ps.pl.OnVerifyPost(vi)) defer ps.chargeGas(gasOnActorExec) @@ -286,14 +288,14 @@ func (ps pricedSyscalls) VerifyPoSt(vi proof5.WindowPoStVerifyInfo) error { // the "parent grinding fault", in which case it must be the sibling of h1 (same parent tipset) and one of the // blocks in the parent of h2 (i.e. h2's grandparent). // Returns nil and an error if the headers don't prove a fault. -func (ps pricedSyscalls) VerifyConsensusFault(h1 []byte, h2 []byte, extra []byte) (*vmr5.ConsensusFault, error) { +func (ps pricedSyscalls) VerifyConsensusFault(h1 []byte, h2 []byte, extra []byte) (*vmr.ConsensusFault, error) { ps.chargeGas(ps.pl.OnVerifyConsensusFault()) defer ps.chargeGas(gasOnActorExec) return ps.under.VerifyConsensusFault(h1, h2, extra) } -func (ps pricedSyscalls) BatchVerifySeals(inp map[address.Address][]proof5.SealVerifyInfo) (map[address.Address][]bool, error) { +func (ps pricedSyscalls) BatchVerifySeals(inp map[address.Address][]proof7.SealVerifyInfo) (map[address.Address][]bool, error) { count := int64(0) for _, svis := range inp { count += int64(len(svis)) @@ -307,9 +309,16 @@ func (ps pricedSyscalls) BatchVerifySeals(inp map[address.Address][]proof5.SealV return ps.under.BatchVerifySeals(inp) } -func (ps pricedSyscalls) VerifyAggregateSeals(aggregate proof5.AggregateSealVerifyProofAndInfos) error { +func (ps pricedSyscalls) VerifyAggregateSeals(aggregate proof7.AggregateSealVerifyProofAndInfos) error { ps.chargeGas(ps.pl.OnVerifyAggregateSeals(aggregate)) defer ps.chargeGas(gasOnActorExec) return ps.under.VerifyAggregateSeals(aggregate) } + +func (ps pricedSyscalls) VerifyReplicaUpdate(update proof7.ReplicaUpdateInfo) error { + ps.chargeGas(ps.pl.OnVerifyReplicaUpdate(update)) + defer ps.chargeGas(gasOnActorExec) + + return ps.under.VerifyReplicaUpdate(update) +} diff --git a/chain/vm/gas_v0.go b/chain/vm/gas_v0.go index 13c5fdd86ad..548227a3356 100644 --- a/chain/vm/gas_v0.go +++ b/chain/vm/gas_v0.go @@ -3,8 +3,7 @@ package vm import ( "fmt" - proof2 "github.com/filecoin-project/specs-actors/v2/actors/runtime/proof" - proof5 "github.com/filecoin-project/specs-actors/v5/actors/runtime/proof" + proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" @@ -206,14 +205,14 @@ func (pl *pricelistV0) OnComputeUnsealedSectorCid(proofType abi.RegisteredSealPr } // OnVerifySeal -func (pl *pricelistV0) OnVerifySeal(info proof2.SealVerifyInfo) GasCharge { +func (pl *pricelistV0) OnVerifySeal(info proof7.SealVerifyInfo) GasCharge { // TODO: this needs more cost tunning, check with @lotus // this is not used return newGasCharge("OnVerifySeal", pl.verifySealBase, 0) } // OnVerifyAggregateSeals -func (pl *pricelistV0) OnVerifyAggregateSeals(aggregate proof5.AggregateSealVerifyProofAndInfos) GasCharge { +func (pl *pricelistV0) OnVerifyAggregateSeals(aggregate proof7.AggregateSealVerifyProofAndInfos) GasCharge { proofType := aggregate.SealProof perProof, ok := pl.verifyAggregateSealPer[proofType] if !ok { @@ -228,8 +227,14 @@ func (pl *pricelistV0) OnVerifyAggregateSeals(aggregate proof5.AggregateSealVeri return newGasCharge("OnVerifyAggregateSeals", perProof*num+step.Lookup(num), 0) } +// OnVerifyReplicaUpdate +func (pl *pricelistV0) OnVerifyReplicaUpdate(update proof7.ReplicaUpdateInfo) GasCharge { + // TODO: do the thing + return GasCharge{} +} + // OnVerifyPost -func (pl *pricelistV0) OnVerifyPost(info proof2.WindowPoStVerifyInfo) GasCharge { +func (pl *pricelistV0) OnVerifyPost(info proof7.WindowPoStVerifyInfo) GasCharge { sectorSize := "unknown" var proofType abi.RegisteredPoStProof diff --git a/chain/vm/invoker.go b/chain/vm/invoker.go index 85357e51bda..8a7a4c8c9d0 100644 --- a/chain/vm/invoker.go +++ b/chain/vm/invoker.go @@ -16,7 +16,7 @@ import ( cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - vmr "github.com/filecoin-project/specs-actors/v5/actors/runtime" + vmr "github.com/filecoin-project/specs-actors/v7/actors/runtime" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/exitcode" diff --git a/chain/vm/mkactor.go b/chain/vm/mkactor.go index ea49abff30a..5716b50067b 100644 --- a/chain/vm/mkactor.go +++ b/chain/vm/mkactor.go @@ -26,6 +26,7 @@ import ( 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" /* inline-gen end */ @@ -130,6 +131,8 @@ func newAccountActor(ver actors.Version) *types.Actor { code = builtin5.AccountActorCodeID case actors.Version6: code = builtin6.AccountActorCodeID + case actors.Version7: + code = builtin7.AccountActorCodeID /* inline-gen end */ default: panic("unsupported actors version") diff --git a/chain/vm/runtime.go b/chain/vm/runtime.go index 6e94030bd2a..583c99593b9 100644 --- a/chain/vm/runtime.go +++ b/chain/vm/runtime.go @@ -17,7 +17,7 @@ import ( rtt "github.com/filecoin-project/go-state-types/rt" rt0 "github.com/filecoin-project/specs-actors/actors/runtime" rt5 "github.com/filecoin-project/specs-actors/v5/actors/runtime" - rt6 "github.com/filecoin-project/specs-actors/v6/actors/runtime" + rt7 "github.com/filecoin-project/specs-actors/v7/actors/runtime" "github.com/ipfs/go-cid" ipldcbor "github.com/ipfs/go-ipld-cbor" "go.opencensus.io/trace" @@ -55,8 +55,8 @@ func (m *Message) ValueReceived() abi.TokenAmount { var EnableGasTracing = false type Runtime struct { - rt5.Message - rt5.Syscalls + rt7.Message + rt7.Syscalls ctx context.Context @@ -142,7 +142,7 @@ func (rt *Runtime) StorePut(x cbor.Marshaler) cid.Cid { var _ rt0.Runtime = (*Runtime)(nil) var _ rt5.Runtime = (*Runtime)(nil) -var _ rt6.Runtime = (*Runtime)(nil) +var _ rt7.Runtime = (*Runtime)(nil) func (rt *Runtime) shimCall(f func() interface{}) (rval []byte, aerr aerrors.ActorError) { defer func() { diff --git a/chain/vm/syscalls.go b/chain/vm/syscalls.go index 0cbefd1fd7f..b8c027bd7b4 100644 --- a/chain/vm/syscalls.go +++ b/chain/vm/syscalls.go @@ -7,6 +7,8 @@ import ( goruntime "runtime" "sync" + proof5 "github.com/filecoin-project/specs-actors/v5/actors/runtime/proof" + "github.com/ipfs/go-cid" cbor "github.com/ipfs/go-ipld-cbor" "github.com/minio/blake2b-simd" @@ -26,8 +28,8 @@ import ( "github.com/filecoin-project/lotus/extern/sector-storage/ffiwrapper" "github.com/filecoin-project/lotus/lib/sigs" - runtime5 "github.com/filecoin-project/specs-actors/v5/actors/runtime" - proof5 "github.com/filecoin-project/specs-actors/v5/actors/runtime/proof" + runtime7 "github.com/filecoin-project/specs-actors/v7/actors/runtime" + proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" ) func init() { @@ -36,10 +38,10 @@ func init() { // Actual type is defined in chain/types/vmcontext.go because the VMContext interface is there -type SyscallBuilder func(ctx context.Context, rt *Runtime) runtime5.Syscalls +type SyscallBuilder func(ctx context.Context, rt *Runtime) runtime7.Syscalls func Syscalls(verifier ffiwrapper.Verifier) SyscallBuilder { - return func(ctx context.Context, rt *Runtime) runtime5.Syscalls { + return func(ctx context.Context, rt *Runtime) runtime7.Syscalls { return &syscallShim{ ctx: ctx, @@ -90,7 +92,7 @@ func (ss *syscallShim) HashBlake2b(data []byte) [32]byte { // Checks validity of the submitted consensus fault with the two block headers needed to prove the fault // and an optional extra one to check common ancestry (as needed). // Note that the blocks are ordered: the method requires a.Epoch() <= b.Epoch(). -func (ss *syscallShim) VerifyConsensusFault(a, b, extra []byte) (*runtime5.ConsensusFault, error) { +func (ss *syscallShim) VerifyConsensusFault(a, b, extra []byte) (*runtime7.ConsensusFault, error) { // Note that block syntax is not validated. Any validly signed block will be accepted pursuant to the below conditions. // Whether or not it could ever have been accepted in a chain is not checked/does not matter here. // for that reason when checking block parent relationships, rather than instantiating a Tipset to do so @@ -133,14 +135,14 @@ func (ss *syscallShim) VerifyConsensusFault(a, b, extra []byte) (*runtime5.Conse } // (2) check for the consensus faults themselves - var consensusFault *runtime5.ConsensusFault + var consensusFault *runtime7.ConsensusFault // (a) double-fork mining fault if blockA.Height == blockB.Height { - consensusFault = &runtime5.ConsensusFault{ + consensusFault = &runtime7.ConsensusFault{ Target: blockA.Miner, Epoch: blockB.Height, - Type: runtime5.ConsensusFaultDoubleForkMining, + Type: runtime7.ConsensusFaultDoubleForkMining, } } @@ -148,10 +150,10 @@ func (ss *syscallShim) VerifyConsensusFault(a, b, extra []byte) (*runtime5.Conse // strictly speaking no need to compare heights based on double fork mining check above, // but at same height this would be a different fault. if types.CidArrsEqual(blockA.Parents, blockB.Parents) && blockA.Height != blockB.Height { - consensusFault = &runtime5.ConsensusFault{ + consensusFault = &runtime7.ConsensusFault{ Target: blockA.Miner, Epoch: blockB.Height, - Type: runtime5.ConsensusFaultTimeOffsetMining, + Type: runtime7.ConsensusFaultTimeOffsetMining, } } @@ -171,10 +173,10 @@ func (ss *syscallShim) VerifyConsensusFault(a, b, extra []byte) (*runtime5.Conse if types.CidArrsEqual(blockA.Parents, blockC.Parents) && blockA.Height == blockC.Height && types.CidArrsContains(blockB.Parents, blockC.Cid()) && !types.CidArrsContains(blockB.Parents, blockA.Cid()) { - consensusFault = &runtime5.ConsensusFault{ + consensusFault = &runtime7.ConsensusFault{ Target: blockA.Miner, Epoch: blockB.Height, - Type: runtime5.ConsensusFaultParentGrinding, + Type: runtime7.ConsensusFaultParentGrinding, } } } @@ -286,6 +288,7 @@ func (ss *syscallShim) VerifyAggregateSeals(aggregate proof5.AggregateSealVerify if err != nil { return xerrors.Errorf("failed to verify aggregated PoRep: %w", err) } + if !ok { return fmt.Errorf("invalid aggregate proof") } @@ -293,6 +296,19 @@ func (ss *syscallShim) VerifyAggregateSeals(aggregate proof5.AggregateSealVerify return nil } +func (ss *syscallShim) VerifyReplicaUpdate(update proof7.ReplicaUpdateInfo) error { + ok, err := ss.verifier.VerifyReplicaUpdate(update) + if err != nil { + return xerrors.Errorf("failed to verify replica update: %w", err) + } + + if !ok { + return fmt.Errorf("invalid replica update") + } + + return nil +} + func (ss *syscallShim) VerifySignature(sig crypto.Signature, addr address.Address, input []byte) error { // TODO: in genesis setup, we are currently faking signatures diff --git a/cmd/lotus-bench/caching_verifier.go b/cmd/lotus-bench/caching_verifier.go index f4cc0f83741..7d5e993a08d 100644 --- a/cmd/lotus-bench/caching_verifier.go +++ b/cmd/lotus-bench/caching_verifier.go @@ -5,10 +5,11 @@ import ( "context" "errors" + proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" + "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/lotus/extern/sector-storage/ffiwrapper" proof2 "github.com/filecoin-project/specs-actors/v2/actors/runtime/proof" - proof5 "github.com/filecoin-project/specs-actors/v5/actors/runtime/proof" "github.com/ipfs/go-datastore" "github.com/minio/blake2b-simd" cbg "github.com/whyrusleeping/cbor-gen" @@ -97,8 +98,12 @@ func (cv *cachingVerifier) GenerateWinningPoStSectorChallenge(ctx context.Contex return cv.backend.GenerateWinningPoStSectorChallenge(ctx, proofType, a, rnd, u) } -func (cv cachingVerifier) VerifyAggregateSeals(aggregate proof5.AggregateSealVerifyProofAndInfos) (bool, error) { +func (cv cachingVerifier) VerifyAggregateSeals(aggregate proof7.AggregateSealVerifyProofAndInfos) (bool, error) { return cv.backend.VerifyAggregateSeals(aggregate) } +func (cv cachingVerifier) VerifyReplicaUpdate(update proof7.ReplicaUpdateInfo) (bool, error) { + return cv.backend.VerifyReplicaUpdate(update) +} + var _ ffiwrapper.Verifier = (*cachingVerifier)(nil) diff --git a/cmd/lotus-sim/simulation/mock/mock.go b/cmd/lotus-sim/simulation/mock/mock.go index 38648f758dc..7656aaa28a6 100644 --- a/cmd/lotus-sim/simulation/mock/mock.go +++ b/cmd/lotus-sim/simulation/mock/mock.go @@ -6,6 +6,8 @@ import ( "encoding/binary" "fmt" + proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" + "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" @@ -70,6 +72,12 @@ func (mockVerifier) VerifyAggregateSeals(aggregate proof5.AggregateSealVerifyPro ) return false, nil } + +// TODO: do the thing +func (mockVerifier) VerifyReplicaUpdate(update proof7.ReplicaUpdateInfo) (bool, error) { + return false, nil +} + func (mockVerifier) VerifyWinningPoSt(ctx context.Context, info proof5.WinningPoStVerifyInfo) (bool, error) { panic("should not be called") } diff --git a/documentation/en/api-v0-methods.md b/documentation/en/api-v0-methods.md index 4d953082116..42bb945d0f1 100644 --- a/documentation/en/api-v0-methods.md +++ b/documentation/en/api-v0-methods.md @@ -4698,7 +4698,7 @@ Inputs: ] ``` -Response: `14` +Response: `15` ### StateReadState StateReadState returns the indicated actor's state. diff --git a/documentation/en/api-v1-unstable-methods.md b/documentation/en/api-v1-unstable-methods.md index b03f75e9d05..3578a449218 100644 --- a/documentation/en/api-v1-unstable-methods.md +++ b/documentation/en/api-v1-unstable-methods.md @@ -4948,7 +4948,7 @@ Inputs: ] ``` -Response: `14` +Response: `15` ### StateReadState StateReadState returns the indicated actor's state. diff --git a/extern/sector-storage/ffiwrapper/types.go b/extern/sector-storage/ffiwrapper/types.go index a5b2fdf1fa0..1da7ea832b8 100644 --- a/extern/sector-storage/ffiwrapper/types.go +++ b/extern/sector-storage/ffiwrapper/types.go @@ -4,6 +4,8 @@ import ( "context" "io" + proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" + proof5 "github.com/filecoin-project/specs-actors/v5/actors/runtime/proof" "github.com/ipfs/go-cid" @@ -36,6 +38,7 @@ type Storage interface { type Verifier interface { VerifySeal(proof5.SealVerifyInfo) (bool, error) VerifyAggregateSeals(aggregate proof5.AggregateSealVerifyProofAndInfos) (bool, error) + VerifyReplicaUpdate(update proof7.ReplicaUpdateInfo) (bool, error) VerifyWinningPoSt(ctx context.Context, info proof5.WinningPoStVerifyInfo) (bool, error) VerifyWindowPoSt(ctx context.Context, info proof5.WindowPoStVerifyInfo) (bool, error) diff --git a/extern/sector-storage/ffiwrapper/verifier_cgo.go b/extern/sector-storage/ffiwrapper/verifier_cgo.go index ff35ddc1f12..37256b26fd0 100644 --- a/extern/sector-storage/ffiwrapper/verifier_cgo.go +++ b/extern/sector-storage/ffiwrapper/verifier_cgo.go @@ -6,6 +6,8 @@ package ffiwrapper import ( "context" + proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" + "go.opencensus.io/trace" "golang.org/x/xerrors" @@ -120,6 +122,11 @@ func (proofVerifier) VerifyAggregateSeals(aggregate proof5.AggregateSealVerifyPr return ffi.VerifyAggregateSeals(aggregate) } +func (proofVerifier) VerifyReplicaUpdate(update proof7.ReplicaUpdateInfo) (bool, error) { + //TODO: do the thing + return false, nil +} + func (proofVerifier) VerifyWinningPoSt(ctx context.Context, info proof5.WinningPoStVerifyInfo) (bool, error) { info.Randomness[31] &= 0x3f _, span := trace.StartSpan(ctx, "VerifyWinningPoSt") diff --git a/extern/sector-storage/mock/mock.go b/extern/sector-storage/mock/mock.go index 273f0928e41..8fb356d0bdd 100644 --- a/extern/sector-storage/mock/mock.go +++ b/extern/sector-storage/mock/mock.go @@ -10,6 +10,8 @@ import ( "math/rand" "sync" + proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" + proof5 "github.com/filecoin-project/specs-actors/v5/actors/runtime/proof" ffiwrapper2 "github.com/filecoin-project/go-commp-utils/ffiwrapper" @@ -547,6 +549,11 @@ func (m mockVerifProver) VerifyAggregateSeals(aggregate proof5.AggregateSealVeri return ok, nil } +// TODO: do the thing +func (m mockVerifProver) VerifyReplicaUpdate(update proof7.ReplicaUpdateInfo) (bool, error) { + return false, nil +} + func (m mockVerifProver) AggregateSealProofs(aggregateInfo proof5.AggregateSealVerifyProofAndInfos, proofs [][]byte) ([]byte, error) { out := make([]byte, m.aggLen(len(aggregateInfo.Infos))) // todo: figure out more real length for pi, proof := range proofs { diff --git a/gen/inlinegen-data.json b/gen/inlinegen-data.json index e26b1b28f7d..ef97db6518f 100644 --- a/gen/inlinegen-data.json +++ b/gen/inlinegen-data.json @@ -1,7 +1,7 @@ { - "actorVersions": [0, 2, 3, 4, 5, 6], - "latestActorsVersion": 6, + "actorVersions": [0, 2, 3, 4, 5, 6, 7], + "latestActorsVersion": 7, - "networkVersions": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], - "latestNetworkVersion": 14 + "networkVersions": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], + "latestNetworkVersion": 15 } diff --git a/go.mod b/go.mod index 37e6bb9165c..fd898ab5f96 100644 --- a/go.mod +++ b/go.mod @@ -50,6 +50,7 @@ require ( github.com/filecoin-project/specs-actors/v4 v4.0.1 github.com/filecoin-project/specs-actors/v5 v5.0.4 github.com/filecoin-project/specs-actors/v6 v6.0.1 + github.com/filecoin-project/specs-actors/v7 v7.0.0-20211110223913-e2abd33b42d4 github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506 github.com/filecoin-project/test-vectors/schema v0.0.5 github.com/gbrlsnchs/jwt/v3 v3.0.1 diff --git a/go.sum b/go.sum index 6019140fce8..c9f2d33cbf5 100644 --- a/go.sum +++ b/go.sum @@ -391,8 +391,13 @@ github.com/filecoin-project/specs-actors/v4 v4.0.1/go.mod h1:TkHXf/l7Wyw4ZejyXIP github.com/filecoin-project/specs-actors/v5 v5.0.0-20210512015452-4fe3889fff57/go.mod h1:283yBMMUSDB2abcjP/hhrwTkhb9h3sfM6KGrep/ZlBI= github.com/filecoin-project/specs-actors/v5 v5.0.4 h1:OY7BdxJWlUfUFXWV/kpNBYGXNPasDIedf42T3sGx08s= github.com/filecoin-project/specs-actors/v5 v5.0.4/go.mod h1:5BAKRAMsOOlD8+qCw4UvT/lTLInCJ3JwOWZbX8Ipwq4= +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 h1:laxvHNsvrq83Y9n+W7znVCePi3oLyRf0Rkl4jFO8Wew= github.com/filecoin-project/specs-actors/v6 v6.0.1/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= +github.com/filecoin-project/specs-actors/v7 v7.0.0-20211109185520-8807da1012c5 h1:8SCNu2TkLCfsS8BpRfeOVt5e4pw2Ej3GInDlFEWqKHo= +github.com/filecoin-project/specs-actors/v7 v7.0.0-20211109185520-8807da1012c5/go.mod h1:F3/N4dIRgwEcSk7xp3RizaVyBE/Jlzhv9Le1/ZH50ZA= +github.com/filecoin-project/specs-actors/v7 v7.0.0-20211110223913-e2abd33b42d4 h1:5sswsw6rhw/JFG5+xU4En5na4K5QPf3jZ33zvAzGrY8= +github.com/filecoin-project/specs-actors/v7 v7.0.0-20211110223913-e2abd33b42d4/go.mod h1:F3/N4dIRgwEcSk7xp3RizaVyBE/Jlzhv9Le1/ZH50ZA= github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506 h1:Ur/l2+6qN+lQiqjozWWc5p9UDaAMDZKTlDS98oRnlIw= github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506/go.mod h1:nJRRM7Aa9XVvygr3W9k6xGF46RWzr2zxF/iGoAIfA/g= github.com/filecoin-project/test-vectors/schema v0.0.5 h1:w3zHQhzM4pYxJDl21avXjOKBLF8egrvwUwjpT8TquDg= diff --git a/itests/kit/ensemble_opts_nv.go b/itests/kit/ensemble_opts_nv.go index 0d7d87e6aa5..45ed514439d 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.Version13, + Network: network.Version14, Height: -1, }, stmgr.Upgrade{ - Network: network.Version14, + Network: network.Version15, Height: upgradeHeight, - Migration: filcns.UpgradeActorsV6, + Migration: filcns.UpgradeActorsV7, }) /* inline-gen end */ } diff --git a/lotuspond/front/src/chain/methods.json b/lotuspond/front/src/chain/methods.json index c0f69d58ca9..1f6191a9425 100644 --- a/lotuspond/front/src/chain/methods.json +++ b/lotuspond/front/src/chain/methods.json @@ -622,5 +622,112 @@ "AddVerifiedClient", "UseBytes", "RestoreBytes" + ], + "fil/7/account": [ + "Send", + "Constructor", + "PubkeyAddress" + ], + "fil/7/cron": [ + "Send", + "Constructor", + "EpochTick" + ], + "fil/7/init": [ + "Send", + "Constructor", + "Exec" + ], + "fil/7/multisig": [ + "Send", + "Constructor", + "Propose", + "Approve", + "Cancel", + "AddSigner", + "RemoveSigner", + "SwapSigner", + "ChangeNumApprovalsThreshold", + "LockBalance" + ], + "fil/7/paymentchannel": [ + "Send", + "Constructor", + "UpdateChannelState", + "Settle", + "Collect" + ], + "fil/7/reward": [ + "Send", + "Constructor", + "AwardBlockReward", + "ThisEpochReward", + "UpdateNetworkKPI" + ], + "fil/7/storagemarket": [ + "Send", + "Constructor", + "AddBalance", + "WithdrawBalance", + "PublishStorageDeals", + "VerifyDealsForActivation", + "ActivateDeals", + "OnMinerSectorsTerminate", + "ComputeDataCommitment", + "CronTick" + ], + "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" + ], + "fil/7/storagepower": [ + "Send", + "Constructor", + "CreateMiner", + "UpdateClaimedPower", + "EnrollCronEvent", + "OnEpochTickEnd", + "UpdatePledgeTotal", + "SubmitPoRepForBulkVerify", + "CurrentTotalPower" + ], + "fil/7/system": [ + "Send", + "Constructor" + ], + "fil/7/verifiedregistry": [ + "Send", + "Constructor", + "AddVerifier", + "RemoveVerifier", + "AddVerifiedClient", + "UseBytes", + "RestoreBytes" ] } \ No newline at end of file diff --git a/storage/wdpost_run_test.go b/storage/wdpost_run_test.go index 78d9431d40a..9ece295caa9 100644 --- a/storage/wdpost_run_test.go +++ b/storage/wdpost_run_test.go @@ -5,6 +5,8 @@ import ( "context" "testing" + proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" + builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" miner5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/miner" @@ -22,12 +24,6 @@ import ( "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/go-state-types/dline" "github.com/filecoin-project/go-state-types/network" - builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" - miner2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/miner" - proof2 "github.com/filecoin-project/specs-actors/v2/actors/runtime/proof" - tutils "github.com/filecoin-project/specs-actors/v2/support/testing" - proof5 "github.com/filecoin-project/specs-actors/v5/actors/runtime/proof" - "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/build" "github.com/filecoin-project/lotus/chain/actors/builtin/miner" @@ -35,6 +31,10 @@ import ( "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/extern/sector-storage/storiface" "github.com/filecoin-project/lotus/journal" + builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" + miner2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/miner" + proof2 "github.com/filecoin-project/specs-actors/v2/actors/runtime/proof" + tutils "github.com/filecoin-project/specs-actors/v2/support/testing" ) type mockStorageMinerAPI struct { @@ -149,7 +149,11 @@ func (m mockVerif) VerifyWindowPoSt(ctx context.Context, info proof2.WindowPoStV return true, nil } -func (m mockVerif) VerifyAggregateSeals(aggregate proof5.AggregateSealVerifyProofAndInfos) (bool, error) { +func (m mockVerif) VerifyAggregateSeals(aggregate proof7.AggregateSealVerifyProofAndInfos) (bool, error) { + panic("implement me") +} + +func (m mockVerif) VerifyReplicaUpdate(update proof7.ReplicaUpdateInfo) (bool, error) { panic("implement me") } diff --git a/testplans/lotus-soup/go.mod b/testplans/lotus-soup/go.mod index 7f4a5363052..fdf53cfc227 100644 --- a/testplans/lotus-soup/go.mod +++ b/testplans/lotus-soup/go.mod @@ -3,15 +3,15 @@ module github.com/filecoin-project/lotus/testplans/lotus-soup go 1.16 require ( - contrib.go.opencensus.io/exporter/prometheus v0.1.0 + contrib.go.opencensus.io/exporter/prometheus v0.4.0 github.com/codeskyblue/go-sh v0.0.0-20200712050446-30169cf553fe github.com/davecgh/go-spew v1.1.1 github.com/drand/drand v1.2.1 - github.com/filecoin-project/go-address v0.0.5 - github.com/filecoin-project/go-data-transfer v1.10.1 - github.com/filecoin-project/go-fil-markets v1.12.0 - github.com/filecoin-project/go-jsonrpc v0.1.4-0.20210217175800-45ea43ac2bec - github.com/filecoin-project/go-state-types v0.1.1-0.20210915140513-d354ccf10379 + github.com/filecoin-project/go-address v0.0.6 + github.com/filecoin-project/go-data-transfer v1.11.4 + github.com/filecoin-project/go-fil-markets v1.13.3 + github.com/filecoin-project/go-jsonrpc v0.1.5 + github.com/filecoin-project/go-state-types v0.1.1 github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b github.com/filecoin-project/lotus v0.0.0-00010101000000-000000000000 github.com/filecoin-project/specs-actors v0.9.14 @@ -21,17 +21,17 @@ require ( github.com/influxdata/influxdb v1.9.4 // indirect github.com/ipfs/go-cid v0.1.0 github.com/ipfs/go-datastore v0.4.6 - github.com/ipfs/go-ipfs-files v0.0.8 + github.com/ipfs/go-ipfs-files v0.0.9 github.com/ipfs/go-ipld-format v0.2.0 github.com/ipfs/go-log/v2 v2.3.0 - github.com/ipfs/go-merkledag v0.3.2 + github.com/ipfs/go-merkledag v0.4.1 github.com/ipfs/go-unixfs v0.2.6 - github.com/ipld/go-car v0.3.1-null-padded-files + github.com/ipld/go-car v0.3.2-0.20211001225732-32d0d9933823 github.com/kpacha/opencensus-influxdb v0.0.0-20181102202715-663e2683a27c github.com/libp2p/go-libp2p v0.15.0 github.com/libp2p/go-libp2p-core v0.9.0 github.com/libp2p/go-libp2p-pubsub-tracer v0.0.0-20200626141350-e730b32bf1e6 - github.com/multiformats/go-multiaddr v0.4.0 + github.com/multiformats/go-multiaddr v0.4.1 github.com/testground/sdk-go v0.2.6 go.opencensus.io v0.23.0 golang.org/x/sync v0.0.0-20210220032951-036812b2e83c diff --git a/testplans/lotus-soup/go.sum b/testplans/lotus-soup/go.sum index b6246d6349c..b31a9375347 100644 --- a/testplans/lotus-soup/go.sum +++ b/testplans/lotus-soup/go.sum @@ -38,8 +38,10 @@ cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RX cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= collectd.org v0.3.0/go.mod h1:A/8DzQBkF6abtvrT2j/AU/4tiBgJWYyh0y/oB/4MlWE= contrib.go.opencensus.io/exporter/jaeger v0.1.0/go.mod h1:VYianECmuFPwU37O699Vc1GOcy+y8kOsfaxHRImmjbA= +contrib.go.opencensus.io/exporter/jaeger v0.2.1/go.mod h1:Y8IsLgdxqh1QxYxPC5IgXVmBaeLUeQFfBeBi9PbeZd0= contrib.go.opencensus.io/exporter/prometheus v0.1.0 h1:SByaIoWwNgMdPSgl5sMqM2KDE5H/ukPWBRo314xiDvg= contrib.go.opencensus.io/exporter/prometheus v0.1.0/go.mod h1:cGFniUXGZlKRjzOyuZJ6mgB+PgBcCIa79kEKR8YCW+A= +contrib.go.opencensus.io/exporter/prometheus v0.4.0/go.mod h1:o7cosnyfuPVK0tB8q0QmaQNhGnptITnPQB+z1+qeFB0= dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= dmitri.shuralyov.com/gpu/mtl v0.0.0-20201218220906-28db891af037/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= @@ -80,6 +82,7 @@ github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbt github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/toml v0.4.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/DATA-DOG/go-sqlmock v1.4.1/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= @@ -90,10 +93,12 @@ github.com/GeertJohan/go.incremental v1.0.0 h1:7AH+pY1XUgQE4Y1HcXYaMqAI0m9yrFqo/ github.com/GeertJohan/go.incremental v1.0.0/go.mod h1:6fAjUhbVuX1KcMD3c8TEgVUqmo4seqhv0i0kdATSkM0= github.com/GeertJohan/go.rice v1.0.0 h1:KkI6O9uMaQU3VEKaj01ulavtF7o1fWT7+pk/4voiMLQ= github.com/GeertJohan/go.rice v1.0.0/go.mod h1:eH6gbSOAUv07dQuZVnBmoDP8mgsM1rtixis4Tib9if0= +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 h1:6dpdDPTRoo78HxAJ6T1HfMiKSnqhgRRqzCuPshRkQ7I= 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= @@ -115,6 +120,7 @@ github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWX github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d h1:G0m3OIz70MZUWq3EgK3CesDbo8upS2Vm9/P3FtgI+Jk= github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= +github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= github.com/Stebalien/go-bitfield v0.0.1 h1:X3kbSSPUaJK60wV2hjOPZwmpljr6VGCqdq4cBLhbQBo= github.com/Stebalien/go-bitfield v0.0.1/go.mod h1:GNjFpasyUVkHMsfEOk8EFLJ9syQ6SI+XWrX9Wf2XH0s= github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= @@ -146,7 +152,9 @@ github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hC 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.3/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= +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/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= @@ -159,12 +167,15 @@ github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN github.com/aws/aws-sdk-go v1.29.16/go.mod h1:1KvfttTE3SPKMpo8g2c6jL3ZKfXtFvKscTgahTma5Xg= github.com/aws/aws-sdk-go v1.30.12/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= 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.3.2/go.mod h1:7OaACgj2SX3XGWnrIjGlJM22h6yD6MEWKvm7levnnM8= +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/config v1.1.5/go.mod h1:P3F1hku7qzC81txjwXnwOM6Ex6ezkU6+/557Teyb64E= github.com/aws/aws-sdk-go-v2/credentials v1.1.5/go.mod h1:Ir1R6tPiR1/2y1hes8yOijFMz54hzSmgcmCDo6F45Qc= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.0.6/go.mod h1:0+fWMitrmIpENiY8/1DyhdYPUCAPvd9UNz9mtCsEoLQ= github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.1.2/go.mod h1:Azf567f5wBUfUbwpyJJnLM/geFFIzEulGR30L+nQZOE= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.8.1/go.mod h1:CM+19rL1+4dFWnOQKwDc7H1KwXTz+h61oUSHyhV0b3o= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.0.4/go.mod h1:BCfU3Uo2fhKcMZFp9zU5QQGQxqWCOYmZ/27Dju3S/do= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.0.6/go.mod h1:L0KWr0ASo83PRZu9NaZaDsw3koS6PspKv137DMDZjHo= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.2.2/go.mod h1:nnutjMLuna0s3GVY/MAkpLX03thyNER06gXvnMAPj5g= @@ -172,6 +183,7 @@ github.com/aws/aws-sdk-go-v2/service/s3 v1.5.0/go.mod h1:uwA7gs93Qcss43astPUb1eq github.com/aws/aws-sdk-go-v2/service/sso v1.1.5/go.mod h1:bpGz0tidC4y39sZkQSkpO/J0tzWCMXHbw6FZ0j1GkWM= github.com/aws/aws-sdk-go-v2/service/sts v1.2.2/go.mod h1:ssRzzJ2RZOVuKj2Vx1YE7ypfil/BIlgmQnCSW4DistU= github.com/aws/smithy-go v1.3.1/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= +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.1/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= github.com/benbjohnson/clock v1.0.2/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= @@ -214,10 +226,12 @@ github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtE github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= github.com/buger/goterm v0.0.0-20200322175922-2f3e71b85129 h1:gfAMKE626QEuKG3si0pdTRcr/YEbBoxY+3GOH3gWvl4= github.com/buger/goterm v0.0.0-20200322175922-2f3e71b85129/go.mod h1:u9UyCz2eTrSGy6fbupqJ54eY5c4IC8gREQ1053dK12U= +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/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34= github.com/cactus/go-statsd-client/statsd v0.0.0-20191106001114-12b4e2b38748/go.mod h1:l/bIBLeOl9eX+wxJAzxS4TveKRtAqlyDpHjhkfO0MEI= 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 v0.0.0-20181003080854-62661b46c409/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= 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= @@ -228,6 +242,7 @@ github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghf github.com/cespare/xxhash/v2 v2.1.0/go.mod h1:dgIUBU3pDso/gPgZ1osOZ0iQf77oPR28Tjxl5dIMyVM= github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +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/chzyer/logex v1.1.10 h1:Swpa1K6QvQznwJRcfTfQJmTE72DqScAa40E+fbHEXEE= @@ -239,6 +254,7 @@ 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/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= @@ -271,6 +287,7 @@ github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf h1:iW4rZ826su+pq github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd/v22 v22.1.0 h1:kq/SbG2BCKLkDKkjQf5OWwKWUKj1lgs3lFI4PxnR5lg= github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= +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= @@ -346,10 +363,12 @@ github.com/eclipse/paho.mqtt.golang v1.2.0/go.mod h1:H9keYFcgq3Qr5OUJm/JZI/i6U7j github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/elastic/go-sysinfo v1.3.0 h1:eb2XFGTMlSwG/yyU9Y8jVAYLIzU2sFzWXwo2gmetyrE= github.com/elastic/go-sysinfo v1.3.0/go.mod h1:i1ZYdU10oLNfRzq4vq62BEwD2fH8KaWh6eh0ikPT9F0= +github.com/elastic/go-sysinfo v1.7.0/go.mod h1:i1ZYdU10oLNfRzq4vq62BEwD2fH8KaWh6eh0ikPT9F0= github.com/elastic/go-windows v1.0.0 h1:qLURgZFkkrYyTTkvYpsZIgf83AUsdIHfvlJaqaZ7aSY= github.com/elastic/go-windows v1.0.0/go.mod h1:TsU0Nrp7/y3+VwE82FoZF8gC/XFg/Elz6CcloAxnPgU= github.com/elastic/gosigar v0.12.0 h1:AsdhYCJlTudhfOYQyFNgx+fIVTfrDO0V1ST0vHgiapU= github.com/elastic/gosigar v0.12.0/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= +github.com/elastic/gosigar v0.14.1/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/ema/qdisc v0.0.0-20190904071900-b82c76788043/go.mod h1:ix4kG2zvdUd8kEKSW0ZTr1XLks0epFpI4j745DXxlNE= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= @@ -358,6 +377,7 @@ github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymF 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/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= @@ -369,12 +389,15 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv github.com/fatih/color v1.8.0/go.mod h1:3l45GVGkyrnYNl9HoIjnp2NnNWvh6hLAqD8yTfGjnw8= github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s= 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/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/filecoin-project/dagstore v0.4.2/go.mod h1:WY5OoLfnwISCk6eASSF927KKPqLPIlTwmG1qHpA08KY= github.com/filecoin-project/dagstore v0.4.3 h1:yeFl6+2BRY1gOVp/hrZuFa24s7LY0Qqkqx/Gh8lidZs= github.com/filecoin-project/dagstore v0.4.3/go.mod h1:dm/91AO5UaDd3bABFjg/5fmRH99vvpS7g1mykqvz6KQ= github.com/filecoin-project/go-address v0.0.3/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= github.com/filecoin-project/go-address v0.0.5 h1:SSaFT/5aLfPXycUlFyemoHYhRgdyXClXCyDdNJKPlDM= github.com/filecoin-project/go-address v0.0.5/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= +github.com/filecoin-project/go-address v0.0.6/go.mod h1:7B0/5DA13n6nHkB8bbGx1gWzG/dbTsZ0fgOJVGsM3TE= github.com/filecoin-project/go-amt-ipld/v2 v2.1.0 h1:t6qDiuGYYngDqaLc2ZUvdtAg4UNxPeOYaXhBWSNsVaM= github.com/filecoin-project/go-amt-ipld/v2 v2.1.0/go.mod h1:nfFPoGyX0CU9SkXX8EoCcSuHN1XcbN0c6KBh7yvP5fs= github.com/filecoin-project/go-amt-ipld/v3 v3.0.0/go.mod h1:Qa95YNAbtoVCTSVtX38aAC1ptBnJfPma1R/zZsKmx4o= @@ -386,14 +409,18 @@ github.com/filecoin-project/go-bitfield v0.2.4 h1:uZ7MeE+XfM5lqrHJZ93OnhQKc/rveW github.com/filecoin-project/go-bitfield v0.2.4/go.mod h1:CNl9WG8hgR5mttCnUErjcQjGvuiZjRqK9rHVBsQF4oM= github.com/filecoin-project/go-cbor-util v0.0.0-20191219014500-08c40a1e63a2 h1:av5fw6wmm58FYMgJeoB/lK9XXrgdugYiTqkdxjTy9k8= github.com/filecoin-project/go-cbor-util v0.0.0-20191219014500-08c40a1e63a2/go.mod h1:pqTiPHobNkOVM5thSRsHYjyQfq7O5QSCMhvuu9JoDlg= +github.com/filecoin-project/go-cbor-util v0.0.1/go.mod h1:pqTiPHobNkOVM5thSRsHYjyQfq7O5QSCMhvuu9JoDlg= github.com/filecoin-project/go-commp-utils v0.1.1-0.20210427191551-70bf140d31c7 h1:U9Z+76pHCKBmtdxFV7JFZJj7OVm12I6dEKwtMVbq5p0= github.com/filecoin-project/go-commp-utils v0.1.1-0.20210427191551-70bf140d31c7/go.mod h1:6s95K91mCyHY51RPWECZieD3SGWTqIFLf1mPOes9l5U= +github.com/filecoin-project/go-commp-utils v0.1.2/go.mod h1:6s95K91mCyHY51RPWECZieD3SGWTqIFLf1mPOes9l5U= github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03 h1:2pMXdBnCiXjfCYx/hLqFxccPoqsSveQFxVLvNxy9bus= github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= +github.com/filecoin-project/go-crypto v0.0.1/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= github.com/filecoin-project/go-data-transfer v1.0.1/go.mod h1:UxvfUAY9v3ub0a21BSK9u3pB2aq30Y0KMsG+w9/ysyo= github.com/filecoin-project/go-data-transfer v1.10.0/go.mod h1:uQtqy6vUAY5v70ZHdkF5mJ8CjVtjj/JA3aOoaqzWTVw= github.com/filecoin-project/go-data-transfer v1.10.1 h1:YQNLwhizxkdfFxegAyrnn3l7WjgMjqDlqFzr18iWiYI= github.com/filecoin-project/go-data-transfer v1.10.1/go.mod h1:CSDMCrPK2lVGodNB1wPEogjFvM9nVGyiL1GNbBRTSdw= +github.com/filecoin-project/go-data-transfer v1.11.4/go.mod h1:2MitLI0ebCkLlPKM7NRggP/t9d+gCcREUKkCKqWRCwU= github.com/filecoin-project/go-ds-versioning v0.1.0 h1:y/X6UksYTsK8TLCI7rttCKEvl8btmWxyFMEeeWGUxIQ= github.com/filecoin-project/go-ds-versioning v0.1.0/go.mod h1:mp16rb4i2QPmxBnmanUx8i/XANp+PFCCJWiAb+VW4/s= github.com/filecoin-project/go-fil-commcid v0.0.0-20200716160307-8f644712406f/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= @@ -405,6 +432,7 @@ github.com/filecoin-project/go-fil-commp-hashhash v0.1.0/go.mod h1:73S8WSEWh9vr0 github.com/filecoin-project/go-fil-markets v1.0.5-0.20201113164554-c5eba40d5335/go.mod h1:AJySOJC00JRWEZzRG2KsfUnqEf5ITXxeX09BE9N4f9c= github.com/filecoin-project/go-fil-markets v1.12.0 h1:RpU5bLaMADVrU4CgLxKMGHC2ZUocNV35uINxogQCf00= github.com/filecoin-project/go-fil-markets v1.12.0/go.mod h1:XuuZFaFujI47nrgfQJiq7jWB+6rRya6nm7Sj6uXQ80U= +github.com/filecoin-project/go-fil-markets v1.13.3/go.mod h1:38zuj8AgDvOfdakFLpC/syYIYgXTzkq7xqBJ6T1AuG4= 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= @@ -414,10 +442,12 @@ 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.4-0.20210217175800-45ea43ac2bec h1:rGI5I7fdU4viManxmDdbk5deZO7afe6L1Wc04dAmlOM= github.com/filecoin-project/go-jsonrpc v0.1.4-0.20210217175800-45ea43ac2bec/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= +github.com/filecoin-project/go-jsonrpc v0.1.5/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= github.com/filecoin-project/go-multistore v0.0.3/go.mod h1:kaNqCC4IhU4B1uyr7YWFHd23TL4KM32aChS0jNkyUvQ= github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20/go.mod h1:mPn+LRRd5gEKNAtc+r3ScpW2JRU/pj4NBKdADYWHiak= github.com/filecoin-project/go-padreader v0.0.0-20210723183308-812a16dc01b1 h1:0BogtftbcgyBx4lP2JWM00ZK7/pXmgnrDqKp9aLTgVs= github.com/filecoin-project/go-padreader v0.0.0-20210723183308-812a16dc01b1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= +github.com/filecoin-project/go-padreader v0.0.1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= github.com/filecoin-project/go-paramfetch v0.0.2 h1:a6W3Ij6CKhwHYYlx+5mqvBIyw4CabZH2ojdEaoAZ6/g= github.com/filecoin-project/go-paramfetch v0.0.2/go.mod h1:1FH85P8U+DUEmWk1Jkw3Bw7FrwTVUNHk/95PSPG+dts= github.com/filecoin-project/go-state-types v0.0.0-20200903145444-247639ffa6ad/go.mod h1:IQ0MBPnonv35CJHtWSN3YY1Hz2gkPru1Q9qoaYLxx9I= @@ -428,6 +458,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.1-0.20210506134452-99b279731c48/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.1-0.20210810190654-139e0e79e69e h1:XAgb6HmgXaGRklNjhZoNMSIYriKLqjWXIqYMotg6iSs= 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.1-0.20210915140513-d354ccf10379/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= +github.com/filecoin-project/go-state-types v0.1.1/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig= github.com/filecoin-project/go-statemachine v1.0.1 h1:LQ60+JDVjMdLxXmVFM2jjontzOYnfVE7u02CXV3WKSw= github.com/filecoin-project/go-statemachine v1.0.1/go.mod h1:jZdXXiHa61n4NmgWFG4w8tnqgvZVHYbJ3yW7+y8bF54= @@ -454,6 +486,9 @@ github.com/filecoin-project/specs-actors/v4 v4.0.1/go.mod h1:TkHXf/l7Wyw4ZejyXIP github.com/filecoin-project/specs-actors/v5 v5.0.0-20210512015452-4fe3889fff57/go.mod h1:283yBMMUSDB2abcjP/hhrwTkhb9h3sfM6KGrep/ZlBI= github.com/filecoin-project/specs-actors/v5 v5.0.4 h1:OY7BdxJWlUfUFXWV/kpNBYGXNPasDIedf42T3sGx08s= github.com/filecoin-project/specs-actors/v5 v5.0.4/go.mod h1:5BAKRAMsOOlD8+qCw4UvT/lTLInCJ3JwOWZbX8Ipwq4= +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/v7 v7.0.0-20211104150953-8bd473fc487a/go.mod h1:F3/N4dIRgwEcSk7xp3RizaVyBE/Jlzhv9Le1/ZH50ZA= github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506 h1:Ur/l2+6qN+lQiqjozWWc5p9UDaAMDZKTlDS98oRnlIw= github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506/go.mod h1:nJRRM7Aa9XVvygr3W9k6xGF46RWzr2zxF/iGoAIfA/g= github.com/filecoin-project/test-vectors/schema v0.0.5/go.mod h1:iQ9QXLpYWL3m7warwvK1JC/pTri8mnfEmKygNDqqY6E= @@ -467,6 +502,7 @@ github.com/foxcpp/go-mockdns v0.0.0-20201212160233-ede2f9158d15/go.mod h1:tPg4cp 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 h1:8sXhOn0uLys67V8EsXLc6eszDs8VXWxL3iRvebPhedY= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= @@ -475,6 +511,7 @@ github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWo github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/gbrlsnchs/jwt/v3 v3.0.0-beta.1 h1:EzDjxMg43q1tA2c0MV3tNbaontnHLplHyFF6M5KiVP0= github.com/gbrlsnchs/jwt/v3 v3.0.0-beta.1/go.mod h1:0eHX/BVySxPc6SE2mZRoppGq7qcEagxdmQnA3dzork8= +github.com/gbrlsnchs/jwt/v3 v3.0.1/go.mod h1:AncDcjXz18xetI3A6STfXq2w+LuTx8pQ8bGEwRN8zVM= github.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdko= github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg= github.com/gdamore/tcell/v2 v2.2.0 h1:vSyEgKwraXPSOkvCk7IwOSyX+Pv3V2cV9CikJMXg4U4= @@ -500,15 +537,19 @@ github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2 github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.10.0 h1:dXFJfIHVvUcpSgDOV+Ne6t7jXri8Tfv2uOLHUZ2XNuo= github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= +github.com/go-kit/kit v0.12.0/go.mod h1:lHd+EkCZPIwYItmGDDRdhinkzX2A1sj+M9biaEaizzs= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0 h1:TrB8swr/68K7m9CcGut2g3UOihhbcbiMAYiuTXdEih4= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= 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-ole/go-ole v1.2.4 h1:nNBDSCOigTSiarFpYE9J/KtEA1IOW4CNeqT9TQDqCxI= github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM= +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= github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= @@ -581,6 +622,7 @@ github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= 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/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0= github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY= github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg= @@ -609,6 +651,7 @@ github.com/godbus/dbus v0.0.0-20190402143921-271e53dc4968 h1:s+PDl6lozQ+dEUtUtQn github.com/godbus/dbus v0.0.0-20190402143921-271e53dc4968/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= github.com/godbus/dbus/v5 v5.0.3 h1:ZqHaoEF7TBzh4jzPmqVhE/5A1z9of6orkAe5uHoAeME= github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= @@ -627,6 +670,7 @@ github.com/gogo/status v1.0.3/go.mod h1:SavQ51ycCLnc7dGyJxp8YAmudx8xqiVrRf+6IXRs 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 v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= +github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= @@ -637,6 +681,7 @@ github.com/golang/groupcache v0.0.0-20191027212112-611e8accdfc9/go.mod h1:cIg4er github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= @@ -670,6 +715,7 @@ github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8l github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.2-0.20190904063534-ff6b7dc882cf h1:gFVkHXmVAhEbxZVDln5V9GKrLaluNoFHDbrZwAWZgws= github.com/golang/snappy v0.0.2-0.20190904063534-ff6b7dc882cf/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.3/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= @@ -687,6 +733,7 @@ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -759,16 +806,21 @@ github.com/hannahhoward/go-pubsub v0.0.0-20200423002714-8d62886cc36e h1:3YKHER4n 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.4.0/go.mod h1:xc8u05kyMa3Wjr9eEAsIAo3dg8+LywT5E/Cl7cNS5nU= +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.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/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.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-hclog v0.12.2/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.2.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= @@ -796,12 +848,15 @@ github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/memberlist v0.1.4/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/memberlist v0.2.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= +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.0/go.mod h1:YL0HO+FifKOW2u1ke99DGVu1zhcpZzNwrLIqBC7vbYU= +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/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo= 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 h1:RfGLP+h3mvisuWEyybxNq5Eft3NWhHLPeUN72kpKZoI= github.com/huin/goupnp v1.0.2/go.mod h1:0dxJBVBHqTMjIUMkESDTNgOOx/Mw5wYIfyFmdzSamkM= @@ -810,6 +865,8 @@ github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0/go.mod h1:N0 github.com/iancoleman/orderedmap v0.1.0/go.mod h1:N0Wam8K1arqPXNWjMo21EXnBPOPp36vB07FNRdD2geA= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/icrowley/fake v0.0.0-20180203215853-4178557ae428/go.mod h1:uhpZMVGznybq1itEKXj6RYw9I71qK4kH+OGMjRC4KEo= +github.com/icza/backscanner v0.0.0-20210726202459-ac2ffc679f94/go.mod h1:GYeBD1CF7AqnKZK+UCytLcY3G+UKo0ByXX/3xfdNyqQ= +github.com/icza/mighty v0.0.0-20180919140131-cfd07d671de6/go.mod h1:xQig96I1VNBDIWGCdTt54nHt6EeI639SmHycLYL7FkA= github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= @@ -823,6 +880,7 @@ github.com/influxdata/influxdb-client-go/v2 v2.3.1-0.20210518120617-5d1fff431040 github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/influxdata/influxdb1-client v0.0.0-20200515024757-02f0bf5dbca3 h1:k3/6a1Shi7GGCp9QpyYuXsMM6ncTOjCzOE9Fd6CDA+Q= github.com/influxdata/influxdb1-client v0.0.0-20200515024757-02f0bf5dbca3/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= +github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/influxdata/influxql v1.1.0/go.mod h1:KpVI7okXjK6PRi3Z5B+mtKZli+R1DnZgb3N+tzevNgo= github.com/influxdata/influxql v1.1.1-0.20210223160523-b6ab99450c93/go.mod h1:gHp9y86a/pxhjJ+zMjNXiQAA197Xk9wLxaz+fGG+kWk= github.com/influxdata/line-protocol v0.0.0-20180522152040-32c6aa80de5e/go.mod h1:4kt73NQhadE3daL3WhR5EJ/J2ocX0PZzwxQ0gXJ7oFE= @@ -852,6 +910,7 @@ github.com/ipfs/go-blockservice v0.1.3/go.mod h1:OTZhFpkgY48kNzbgyvcexW9cHrpjBYI github.com/ipfs/go-blockservice v0.1.4-0.20200624145336-a978cec6e834/go.mod h1:OTZhFpkgY48kNzbgyvcexW9cHrpjBYIjSR0KoDOFOLU= github.com/ipfs/go-blockservice v0.1.5 h1:euqZu96CCbToPyYVwVshu8ENURi8BhFd7FUFfTLi+fQ= github.com/ipfs/go-blockservice v0.1.5/go.mod h1:yLk8lBJCBRWRqerqCSVi3cE/Dncdt3vGC/PJMVKhLTY= +github.com/ipfs/go-blockservice v0.1.7/go.mod h1:GmS+BAt4hrwBKkzE11AFDQUrnvqjwFatGS2MY7wOjEM= 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= @@ -910,10 +969,13 @@ github.com/ipfs/go-graphsync v0.4.3/go.mod h1:mPOwDYv128gf8gxPFgXnz4fNrSYPsWyqis github.com/ipfs/go-graphsync v0.9.0/go.mod h1:J62ahWT9JbPsFL2UWsUM5rOu0lZJ0LOIH1chHdxGGcw= github.com/ipfs/go-graphsync v0.9.1 h1:jo7ZaAZ3lal89RhKxKoRkPzIO8lmOY6KUWA1mDRZ2+U= github.com/ipfs/go-graphsync v0.9.1/go.mod h1:J62ahWT9JbPsFL2UWsUM5rOu0lZJ0LOIH1chHdxGGcw= +github.com/ipfs/go-graphsync v0.10.0/go.mod h1:cKIshzTaa5rCZjryH5xmSKZVGX9uk1wvwGvz2WEha5Y= +github.com/ipfs/go-graphsync v0.10.4/go.mod h1:oei4tnWAKnZ6LPnapZGPYVVbyiKV1UP3f8BeLU7Z4JQ= github.com/ipfs/go-hamt-ipld v0.1.1/go.mod h1:1EZCr2v0jlCnhpa+aZ0JZYp8Tt2w16+JJOAVz17YcDk= 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 v1.0.0/go.mod h1:knLVdhVU9L7CC4T+T4nvGdeUIPAXlnd9zmXfp+9MIjU= github.com/ipfs/go-ipfs-blockstore v1.0.1/go.mod h1:MGNZlHNEnR4KGgPHM3/k8lBySIOK2Ve+0KjZubKlaOE= github.com/ipfs/go-ipfs-blockstore v1.0.3/go.mod h1:MGNZlHNEnR4KGgPHM3/k8lBySIOK2Ve+0KjZubKlaOE= @@ -943,6 +1005,7 @@ github.com/ipfs/go-ipfs-files v0.0.3/go.mod h1:INEFm0LL2LWXBhNJ2PMIIb2w45hpXgPjN github.com/ipfs/go-ipfs-files v0.0.4/go.mod h1:INEFm0LL2LWXBhNJ2PMIIb2w45hpXgPjNoE7yA8Y1d4= github.com/ipfs/go-ipfs-files v0.0.8 h1:8o0oFJkJ8UkO/ABl8T6ac6tKF3+NIpj67aAB6ZpusRg= 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-http-client v0.0.6 h1:k2QllZyP7Fz5hMgsX5hvHfn1WPG9Ngdy5WknQ7JNhBM= github.com/ipfs/go-ipfs-http-client v0.0.6/go.mod h1:8e2dQbntMZKxLfny+tyXJ7bJHZFERp/2vyzZdvkeLMc= github.com/ipfs/go-ipfs-posinfo v0.0.1 h1:Esoxj+1JgSjX0+ylc0hUmJCOv6V2vFoZiETLR6OtpRs= @@ -966,6 +1029,7 @@ github.com/ipfs/go-ipld-format v0.0.1/go.mod h1:kyJtbkDALmFHv3QR6et67i35QzO3S0dC github.com/ipfs/go-ipld-format v0.0.2/go.mod h1:4B6+FM2u9OJ9zCV+kSbgFAZlOrv1Hqbf0INGQgiKf9k= github.com/ipfs/go-ipld-format v0.2.0 h1:xGlJKkArkmBvowr+GMCX0FEZtkro71K1AwiKnL37mwA= github.com/ipfs/go-ipld-format v0.2.0/go.mod h1:3l3C1uKoadTPbeNfrDi+xMInYKlx2Cvg1BuydPSdzQs= +github.com/ipfs/go-ipld-legacy v0.1.0/go.mod h1:86f5P/srAmh9GcIcWQR9lfFLZPrIyyXQeVlOWeeWEuI= 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-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= @@ -993,6 +1057,7 @@ github.com/ipfs/go-merkledag v0.2.4/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB github.com/ipfs/go-merkledag v0.3.1/go.mod h1:fvkZNNZixVW6cKSZ/JfLlON5OlgTXNdRLz0p6QG/I2M= github.com/ipfs/go-merkledag v0.3.2 h1:MRqj40QkrWkvPswXs4EfSslhZ4RVPRbxwX11js0t1xY= github.com/ipfs/go-merkledag v0.3.2/go.mod h1:fvkZNNZixVW6cKSZ/JfLlON5OlgTXNdRLz0p6QG/I2M= +github.com/ipfs/go-merkledag v0.4.1/go.mod h1:56biPaS6e+IS0eXkEt6A8tG+BUQaEIFqDqJuFfQDBoE= github.com/ipfs/go-metrics-interface v0.0.1 h1:j+cpbjYvu4R8zbleSs36gvB7jR+wsL2fGD6n0jO4kdg= github.com/ipfs/go-metrics-interface v0.0.1/go.mod h1:6s6euYU4zowdslK0GKHmqaIZ3j/b/tL7HTWtJ4VPgWY= github.com/ipfs/go-metrics-prometheus v0.0.2/go.mod h1:ELLU99AQQNi+zX6GCGm2lAgnzdSH3u5UVlCdqSXnEks= @@ -1003,6 +1068,7 @@ github.com/ipfs/go-peertaskqueue v0.1.0/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3 github.com/ipfs/go-peertaskqueue v0.1.1/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U= github.com/ipfs/go-peertaskqueue v0.2.0 h1:2cSr7exUGKYyDeUyQ7P/nHPs9P7Ht/B+ROrpN1EJOjc= github.com/ipfs/go-peertaskqueue v0.2.0/go.mod h1:5/eNrBEbtSKWCG+kQK8K8fGNixoYUnr+P7jivavs9lY= +github.com/ipfs/go-peertaskqueue v0.6.0/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68ow0Rrb04donIU= 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= @@ -1022,6 +1088,7 @@ github.com/ipld/go-car v0.1.1-0.20201119040415-11b6074b6d4d/go.mod h1:2Gys8L8MJ6 github.com/ipld/go-car v0.3.1-0.20210601190600-f512dac51e8e/go.mod h1:wUxBdwOLA9/0HZBi3fnTBzla0MuwlqgJLyrhOg1XaKI= github.com/ipld/go-car v0.3.1-null-padded-files h1:FMD0Ce4tAM9P5aq7yklw2jnVK3ZuoJ4xK6vkL9VLmxs= github.com/ipld/go-car v0.3.1-null-padded-files/go.mod h1:wUxBdwOLA9/0HZBi3fnTBzla0MuwlqgJLyrhOg1XaKI= +github.com/ipld/go-car v0.3.2-0.20211001225732-32d0d9933823/go.mod h1:jSlTph+i/q1jLFoiKKeN69KGG0fXpwrcD0izu5C1Tpo= github.com/ipld/go-car/v2 v2.0.0-beta1.0.20210721090610-5a9d1b217d25/go.mod h1:I2ACeeg6XNBe5pdh5TaR7Ambhfa7If9KXxmXgZsYENU= github.com/ipld/go-car/v2 v2.0.2/go.mod h1:I2ACeeg6XNBe5pdh5TaR7Ambhfa7If9KXxmXgZsYENU= github.com/ipld/go-car/v2 v2.0.3-0.20210811121346-c514a30114d7 h1:6Z0beJSZNsRY+7udoqUl4gQ/tqtrPuRvDySrlsvbqZA= @@ -1034,13 +1101,18 @@ github.com/ipld/go-ipld-prime v0.0.2-0.20200428162820-8b59dc292b8e/go.mod h1:uVI github.com/ipld/go-ipld-prime v0.5.1-0.20200828233916-988837377a7f/go.mod h1:0xEgdD6MKbZ1vF0GC+YcR/C4SQCAlRuOjIJ2i0HxqzM= github.com/ipld/go-ipld-prime v0.5.1-0.20201021195245-109253e8a018/go.mod h1:0xEgdD6MKbZ1vF0GC+YcR/C4SQCAlRuOjIJ2i0HxqzM= github.com/ipld/go-ipld-prime v0.9.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= +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.0 h1:JapyKWTsJgmhrPI7hfx4V798c/RClr85sXfBZnH1VIw= github.com/ipld/go-ipld-prime v0.12.0/go.mod h1:hy8b93WleDMRKumOJnTIrr0MbbFbx9GD6Kzxa53Xppc= +github.com/ipld/go-ipld-prime v0.12.3-0.20210930132912-0b3aef3ca569/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= +github.com/ipld/go-ipld-prime v0.12.3/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= github.com/ipld/go-ipld-prime-proto v0.0.0-20191113031812-e32bd156a1e5/go.mod h1:gcvzoEDBjwycpXt3LBE061wT9f46szXGHAmj9uoP6fU= github.com/ipld/go-ipld-prime-proto v0.0.0-20200428191222-c1ffdadc01e1/go.mod h1:OAV6xBmuTLsPZ+epzKkPB1e25FHk/vCtyatkdHcArLs= github.com/ipld/go-ipld-prime-proto v0.0.0-20200922192210-9a2bfd4440a6/go.mod h1:3pHYooM9Ea65jewRwrb2u5uHZCNkNTe9ABsVB+SrkH0= github.com/ipld/go-ipld-prime-proto v0.1.0/go.mod h1:11zp8f3sHVgIqtb/c9Kr5ZGqpnCLF1IVTNOez9TopzE= +github.com/ipld/go-ipld-selector-text-lite v0.0.0/go.mod h1:U2CQmFb+uWzfIEF3I1arrDa5rwtj00PrpiwwCO+k1RM= 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= @@ -1086,6 +1158,7 @@ github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/u github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jsternberg/zap-logfmt v1.0.0/go.mod h1:uvPs/4X51zdkcm5jXl5SYoN+4RK21K8mysFmDaM/h+o= @@ -1117,6 +1190,8 @@ github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0 github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.11.7 h1:0hzRabrMN4tSTvMfnL3SCv1ZGeAP23ynzodBgaHeMeg= 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/cpuid v0.0.0-20170728055534-ae7887de9fa5 h1:2U0HzY8BJ8hVwDKIzp7y4voR9CX/nvcfymLmg2UiOio= github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= @@ -1324,6 +1399,7 @@ 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.2.9 h1:tVa7siDymmzOl3b3+SxPYpQUCnicmK13y6Re1PqWK+g= github.com/libp2p/go-libp2p-peerstore v0.2.9/go.mod h1:zhBaLzxiWpNGQ3+uI17G/OIjmOD8GxKyFuHbrZbgs0w= +github.com/libp2p/go-libp2p-peerstore v0.3.0/go.mod h1:fNX9WlOENMvdx/YD7YO/5Hkrn8+lQIk5A39BHa1HIrM= github.com/libp2p/go-libp2p-pnet v0.2.0 h1:J6htxttBipJujEjz1y0a5+eYoiPcFHhSYHH6na5f0/k= 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= @@ -1333,6 +1409,7 @@ github.com/libp2p/go-libp2p-pubsub v0.3.2-0.20200527132641-c0712c6e92cf/go.mod h github.com/libp2p/go-libp2p-pubsub v0.3.2/go.mod h1:Uss7/Cfz872KggNb+doCVPHeCDmXB7z500m/R8DaAUk= github.com/libp2p/go-libp2p-pubsub v0.5.4 h1:rHl9/Xok4zX3zgi0pg0XnUj9Xj2OeXO8oTu85q2+YA8= github.com/libp2p/go-libp2p-pubsub v0.5.4/go.mod h1:gVOzwebXVdSMDQBTfH8ACO5EJ4SQrvsHqCmYsCZpD0E= +github.com/libp2p/go-libp2p-pubsub v0.5.6/go.mod h1:gVOzwebXVdSMDQBTfH8ACO5EJ4SQrvsHqCmYsCZpD0E= github.com/libp2p/go-libp2p-pubsub-tracer v0.0.0-20200626141350-e730b32bf1e6 h1:2lH7rMlvDPSvXeOR+g7FE6aqiEwxtpxWKQL8uigk5fQ= github.com/libp2p/go-libp2p-pubsub-tracer v0.0.0-20200626141350-e730b32bf1e6/go.mod h1:8ZodgKS4qRLayfw9FDKDd9DX4C16/GMofDxSldG8QPI= github.com/libp2p/go-libp2p-quic-transport v0.1.1/go.mod h1:wqG/jzhF3Pu2NrhJEvE+IE0NTHNXslOPn9JQzyCAxzU= @@ -1507,6 +1584,7 @@ github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i github.com/lufia/iostat v1.1.0/go.mod h1:rEPNA0xXgjHQjuI5Cy05sLlS2oRcSlWHRLrvh/AQ+Pg= github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= +github.com/magefile/mage v1.9.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= @@ -1542,6 +1620,7 @@ github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= 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= @@ -1553,6 +1632,7 @@ github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOA github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.13 h1:qdl+GuBjcsKKDco5BsxPJlId98mSWNKqYA+Co0SC1yA= github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +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.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= @@ -1590,6 +1670,8 @@ github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc/go.mod h1:cGKTAVKx4S github.com/mileusna/useragent v0.0.0-20190129205925-3e331f0949a5/go.mod h1:JWhYAp2EXqUtsxTKdeGlY8Wp44M7VxThC9FEoNGi2IE= 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= @@ -1598,6 +1680,7 @@ 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= @@ -1608,10 +1691,12 @@ github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0Qu 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.2.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +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.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= 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= @@ -1622,6 +1707,7 @@ github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjW github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg= github.com/multiformats/go-base32 v0.0.3 h1:tw5+NhuwaOjJCC5Pp82QuXbrmLzWg7uxlMFp8Nq/kkI= github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= +github.com/multiformats/go-base32 v0.0.4/go.mod h1:jNLFzjPZtp3aIARHbJRZIaPuspdH0J6q39uUM5pnABM= github.com/multiformats/go-base36 v0.1.0 h1:JR6TyF7JjGd3m6FbLU2cOxhC0Li8z8dLNGQ89tUg4F4= github.com/multiformats/go-base36 v0.1.0/go.mod h1:kFGE83c6s80PklsHO9sRn2NCoffoRdUUOENyW/Vv6sM= github.com/multiformats/go-multiaddr v0.0.1/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= @@ -1637,6 +1723,7 @@ 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 h1:hL/K4ZJhJ5PTw3nwylq9lGU5yArzcAroZmex1ghSEkQ= 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-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= @@ -1673,6 +1760,7 @@ 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 h1:hWOPdrNqDjwHDx82vsYGSDZNyktOJJ2dzZJzFkOV1jM= 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-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= @@ -1692,10 +1780,16 @@ github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRW github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= 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= @@ -1705,6 +1799,7 @@ github.com/nikkolasg/hexjson v0.0.0-20181101101858-78e39397e00c h1:5bFTChQxSKNwy github.com/nikkolasg/hexjson v0.0.0-20181101101858-78e39397e00c/go.mod h1:7qN3Y0BvzRUf4LofcoJplQL10lsFDb4PYlePTVwrP28= github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229 h1:E2B8qYyeSgv5MXpmzZXRNp8IAQ4vjxIjhpAf5hv/tAg= github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229/go.mod h1:0aYXnNPJ8l7uZxf45rWW1a/uME32OF0rhiYGNQ2oF2E= +github.com/nkovacs/streamquote v1.0.0/go.mod h1:BN+NaZ2CmdKqUuTUXUEm9j95B2TRbpOWpxbJYzzgUsc= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= @@ -1758,6 +1853,7 @@ 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= @@ -1766,6 +1862,7 @@ github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtP github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.4.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo= 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/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= @@ -1789,6 +1886,7 @@ 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/alertmanager v0.20.0/go.mod h1:9g2i48FAyZW6BtbsnvHtMHQXl2aVtrORKwKVCQ+nbrg= 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= @@ -1825,6 +1923,7 @@ github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB8 github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/common v0.18.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= +github.com/prometheus/common v0.28.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/common v0.30.0 h1:JEkYlQnpzrzQFxi6gnukFPdQ+ac82oRhzMcIduJu/Ug= github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/node_exporter v1.0.0-rc.0.0.20200428091818-01054558c289/go.mod h1:FGbBv5OPKjch+jNUJmEQpMZytIdyW0NdBtWFcfSKusc= @@ -1845,6 +1944,7 @@ github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1 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/prometheus v0.0.0-20200609090129-a6600f564e3c/go.mod h1:S5n0C6tSgdnwWshBUceRx5G1OsjLv/EeZ9t3wIfEtsY= +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.0.1 h1:qgm3DIJAeb+2byneLrQJ7kvmDLGxN2vy3apXyGaDKN4= @@ -1957,7 +2057,9 @@ 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/streadway/quantile v0.0.0-20150917103942-b0c588724d25/go.mod h1:lbP8tGiBjZ5YWIc2fzuRpTaz0b/53vT6PEs3QuAWzuU= 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= @@ -1993,6 +2095,7 @@ github.com/uber/athenadriver v1.1.4/go.mod h1:tQjho4NzXw55LGfSZEcETuYydpY1vtmixU github.com/uber/jaeger-client-go v2.15.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/uber/jaeger-client-go v2.23.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/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/uber/jaeger-client-go v2.28.0+incompatible h1:G4QSBfvPKvg5ZM2j9MrJFdfI5iSljY/WnJqOGFao6HI= github.com/uber/jaeger-client-go v2.28.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/uber/jaeger-lib v1.5.1-0.20181102163054-1fc5c315e03c/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= @@ -2045,6 +2148,7 @@ 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-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-20210713220151-be142a5ae1a8 h1:TEv7MId88TyIqIUL4hbf9otOookIolMxlEbN0ro671Y= github.com/whyrusleeping/cbor-gen v0.0.0-20210713220151-be142a5ae1a8/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f h1:jQa4QT2UP9WYv2nzyawpKMOCl+Z/jW7djv2/J50lj9E= @@ -2103,6 +2207,10 @@ 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.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.mongodb.org/mongo-driver v1.1.2/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= @@ -2140,6 +2248,7 @@ go.uber.org/fx v1.9.0/go.mod h1:mFdUyAUuJ3w4jAckiKSKbldsxy1ojpAMJ+dVZg5Y0Aw= go.uber.org/goleak v1.0.0/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.1.10 h1:z+mqJhf6ss6BSfSM671tgKyZBFPTTJM+HLxnhPC3wu0= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= +go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= @@ -2155,9 +2264,11 @@ go.uber.org/zap v1.14.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 h1:mZQZefskPPCMIBCSEH0v2/iUqqLrYtaeqwD6FUGUnFE= 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= 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= @@ -2187,6 +2298,7 @@ golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8U 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-20191202143827-86a70503ff7e/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -2195,6 +2307,7 @@ golang.org/x/crypto v0.0.0-20200117160349-530e935923ad/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200128174031-69ecbb4d6d5d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/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-20200422194213-44a606286825/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= @@ -2206,12 +2319,15 @@ golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= 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 h1:VvfwVmMH40bpMeizC9/K7ipM5Qjucuu16RWfneFPyhQ= 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/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= @@ -2247,6 +2363,7 @@ golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRu golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b h1:Wh+f8QHJXR411sJR8/vRBTZ7YapZaRvUcLFFJhusH0k= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mobile v0.0.0-20201217150744-e6ae53a27f4f/go.mod h1:skQtrUTUwhdJvXM/2KKJzY8pDgNr9I/FOMqDVRPBUS4= @@ -2329,8 +2446,10 @@ golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96b 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-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-20210813160813-60bc85c4be6d h1:LO7XpTYMwTqxjLcGWPijK3vRXg1aWdlNOVOHRq45d7c= 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/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= @@ -2367,6 +2486,7 @@ 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-20190209173611-3b5209105503/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= @@ -2399,6 +2519,7 @@ golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7w 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= @@ -2454,6 +2575,8 @@ golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 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-20210426080607-c94f62235c83/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -2465,6 +2588,7 @@ golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf h1:2ucpDCmfkl8Bd/FsLtiD653Wf96cW37s+iGx93zsu4k= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/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 h1:MZ2shdL+ZM/XzY3ZGOnh4Nlpnxz5GSOhOmtHo3iPU6M= @@ -2486,6 +2610,7 @@ golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +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= @@ -2518,6 +2643,7 @@ golang.org/x/tools v0.0.0-20190813034749-528a2984e271/go.mod h1:b+2E5dAYhXwXZwtn 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= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -2566,6 +2692,7 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1-0.20210225150353-54dc8c5edb56/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= 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 h1:ouewzE6p+/VEB31YYnTbEJdi8pFqKp4P4n85vwo3DHA= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -2651,6 +2778,8 @@ google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987 h1:PDIOdWxZ8eRizhKa1AAvY53xsvLB1cWorMjslvY3VA8= 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/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= @@ -2678,6 +2807,7 @@ 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 h1:AGJ0Ih4mHjSeibYkFGh1dD9KJ/eOtZ93I6hoHhukQ5Q= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= @@ -2774,6 +2904,7 @@ 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/structured-merge-diff/v2 v2.0.1/go.mod h1:Wb7vfKAodbKgf6tn1Kl0VvGj7mRH6DGaRcixXEJXTsE= 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 07f1be0ff6634d9329f1736e5a8162fd18e51a4b Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 16 Nov 2021 19:09:10 -0500 Subject: [PATCH 006/393] Plug in the FFI call --- extern/filecoin-ffi | 2 +- extern/sector-storage/ffiwrapper/verifier_cgo.go | 4 ++-- go.mod | 2 +- go.sum | 7 +++---- itests/ccupgrade_test.go | 2 +- 5 files changed, 8 insertions(+), 9 deletions(-) diff --git a/extern/filecoin-ffi b/extern/filecoin-ffi index 7912389334e..e8857b32c34 160000 --- a/extern/filecoin-ffi +++ b/extern/filecoin-ffi @@ -1 +1 @@ -Subproject commit 7912389334e347bbb2eac0520c836830875c39de +Subproject commit e8857b32c348d92258d1452f1e8738ff03d72c6d diff --git a/extern/sector-storage/ffiwrapper/verifier_cgo.go b/extern/sector-storage/ffiwrapper/verifier_cgo.go index 37256b26fd0..5d537870d00 100644 --- a/extern/sector-storage/ffiwrapper/verifier_cgo.go +++ b/extern/sector-storage/ffiwrapper/verifier_cgo.go @@ -123,8 +123,8 @@ func (proofVerifier) VerifyAggregateSeals(aggregate proof5.AggregateSealVerifyPr } func (proofVerifier) VerifyReplicaUpdate(update proof7.ReplicaUpdateInfo) (bool, error) { - //TODO: do the thing - return false, nil + v := ffi.FunctionsSectorUpdate{} + return v.VerifyUpdateProof(update.UpdateProof, update.Proof, update.OldSealedSectorCID, update.NewSealedSectorCID, update.NewUnsealedSectorCID) } func (proofVerifier) VerifyWinningPoSt(ctx context.Context, info proof5.WinningPoStVerifyInfo) (bool, error) { diff --git a/go.mod b/go.mod index fd898ab5f96..1202fd20067 100644 --- a/go.mod +++ b/go.mod @@ -50,7 +50,7 @@ require ( github.com/filecoin-project/specs-actors/v4 v4.0.1 github.com/filecoin-project/specs-actors/v5 v5.0.4 github.com/filecoin-project/specs-actors/v6 v6.0.1 - github.com/filecoin-project/specs-actors/v7 v7.0.0-20211110223913-e2abd33b42d4 + github.com/filecoin-project/specs-actors/v7 v7.0.0-20211116235548-301b685341ad github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506 github.com/filecoin-project/test-vectors/schema v0.0.5 github.com/gbrlsnchs/jwt/v3 v3.0.1 diff --git a/go.sum b/go.sum index c9f2d33cbf5..7747074b931 100644 --- a/go.sum +++ b/go.sum @@ -363,6 +363,7 @@ 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.1-0.20210506134452-99b279731c48/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.1-0.20211102152656-6027e22b77fd/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.1 h1:LR260vya4p++atgf256W6yV3Lxl5mKrBFcEZePWQrdg= github.com/filecoin-project/go-state-types v0.1.1/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig= @@ -394,10 +395,8 @@ github.com/filecoin-project/specs-actors/v5 v5.0.4/go.mod h1:5BAKRAMsOOlD8+qCw4U 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 h1:laxvHNsvrq83Y9n+W7znVCePi3oLyRf0Rkl4jFO8Wew= github.com/filecoin-project/specs-actors/v6 v6.0.1/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= -github.com/filecoin-project/specs-actors/v7 v7.0.0-20211109185520-8807da1012c5 h1:8SCNu2TkLCfsS8BpRfeOVt5e4pw2Ej3GInDlFEWqKHo= -github.com/filecoin-project/specs-actors/v7 v7.0.0-20211109185520-8807da1012c5/go.mod h1:F3/N4dIRgwEcSk7xp3RizaVyBE/Jlzhv9Le1/ZH50ZA= -github.com/filecoin-project/specs-actors/v7 v7.0.0-20211110223913-e2abd33b42d4 h1:5sswsw6rhw/JFG5+xU4En5na4K5QPf3jZ33zvAzGrY8= -github.com/filecoin-project/specs-actors/v7 v7.0.0-20211110223913-e2abd33b42d4/go.mod h1:F3/N4dIRgwEcSk7xp3RizaVyBE/Jlzhv9Le1/ZH50ZA= +github.com/filecoin-project/specs-actors/v7 v7.0.0-20211116235548-301b685341ad h1:uUl9I4MCOAkbrY/JI3y6Php3t5c3tu1nux5VkCBwO4E= +github.com/filecoin-project/specs-actors/v7 v7.0.0-20211116235548-301b685341ad/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506 h1:Ur/l2+6qN+lQiqjozWWc5p9UDaAMDZKTlDS98oRnlIw= github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506/go.mod h1:nJRRM7Aa9XVvygr3W9k6xGF46RWzr2zxF/iGoAIfA/g= github.com/filecoin-project/test-vectors/schema v0.0.5 h1:w3zHQhzM4pYxJDl21avXjOKBLF8egrvwUwjpT8TquDg= diff --git a/itests/ccupgrade_test.go b/itests/ccupgrade_test.go index c5b38083512..12bc1fc869a 100644 --- a/itests/ccupgrade_test.go +++ b/itests/ccupgrade_test.go @@ -32,7 +32,7 @@ func runTestCCUpgrade(t *testing.T, upgradeHeight abi.ChainEpoch) { ctx := context.Background() blockTime := 5 * time.Millisecond - client, miner, ens := kit.EnsembleMinimal(t, kit.MockProofs(), kit.LatestActorsAt(upgradeHeight)) + client, miner, ens := kit.EnsembleMinimal(t, kit.MockProofs(), kit.TurboUpgradeAt(upgradeHeight)) ens.InterconnectAll().BeginMining(blockTime) maddr, err := miner.ActorAddress(ctx) From 8665e32221cd1e73435d8a62f9718a655590ea4c Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Wed, 17 Nov 2021 12:41:42 -0500 Subject: [PATCH 007/393] Update deps --- chain/consensus/filcns/upgrades.go | 12 +++++------- extern/filecoin-ffi | 2 +- extern/sector-storage/ffiwrapper/verifier_cgo.go | 3 +-- extern/sector-storage/mock/mock.go | 3 +-- go.mod | 2 +- go.sum | 6 ++---- itests/ccupgrade_test.go | 1 + itests/wdpost_test.go | 2 +- 8 files changed, 13 insertions(+), 18 deletions(-) diff --git a/chain/consensus/filcns/upgrades.go b/chain/consensus/filcns/upgrades.go index 43f50311f72..a8e85d78fc1 100644 --- a/chain/consensus/filcns/upgrades.go +++ b/chain/consensus/filcns/upgrades.go @@ -6,6 +6,7 @@ import ( "time" "github.com/filecoin-project/specs-actors/v6/actors/migration/nv14" + "github.com/filecoin-project/specs-actors/v7/actors/migration/nv15" "github.com/ipfs/go-cid" cbor "github.com/ipfs/go-ipld-cbor" @@ -1220,7 +1221,7 @@ func UpgradeActorsV7(ctx context.Context, sm *stmgr.StateManager, cache stmgr.Mi workerCount = 1 } - config := nv14.Config{ + config := nv15.Config{ MaxWorkers: uint(workerCount), JobQueueSize: 1000, ResultQueueSize: 100, @@ -1244,8 +1245,7 @@ func PreUpgradeActorsV7(ctx context.Context, sm *stmgr.StateManager, cache stmgr workerCount /= 2 } - //TODO: nv15 - config := nv14.Config{MaxWorkers: uint(workerCount)} + config := nv15.Config{MaxWorkers: uint(workerCount)} _, err := upgradeActorsV7Common(ctx, sm, cache, root, epoch, ts, config) return err } @@ -1253,8 +1253,7 @@ func PreUpgradeActorsV7(ctx context.Context, sm *stmgr.StateManager, cache stmgr func upgradeActorsV7Common( ctx context.Context, sm *stmgr.StateManager, cache stmgr.MigrationCache, root cid.Cid, epoch abi.ChainEpoch, ts *types.TipSet, - //TODO: nv15 - config nv14.Config, + config nv15.Config, ) (cid.Cid, error) { buf := blockstore.NewTieredBstore(sm.ChainStore().StateBlockstore(), blockstore.NewMemorySync()) store := store.ActorStore(ctx, buf) @@ -1273,8 +1272,7 @@ func upgradeActorsV7Common( } // Perform the migration - //TODO: nv15 - newHamtRoot, err := nv14.MigrateStateTree(ctx, store, stateRoot.Actors, epoch, config, migrationLogger{}, cache) + newHamtRoot, err := nv15.MigrateStateTree(ctx, store, stateRoot.Actors, epoch, config, migrationLogger{}, cache) if err != nil { return cid.Undef, xerrors.Errorf("upgrading to actors v7: %w", err) } diff --git a/extern/filecoin-ffi b/extern/filecoin-ffi index e8857b32c34..fe2a3175719 160000 --- a/extern/filecoin-ffi +++ b/extern/filecoin-ffi @@ -1 +1 @@ -Subproject commit e8857b32c348d92258d1452f1e8738ff03d72c6d +Subproject commit fe2a317571931b31fb1ca6dd2adf1414e375b902 diff --git a/extern/sector-storage/ffiwrapper/verifier_cgo.go b/extern/sector-storage/ffiwrapper/verifier_cgo.go index 5d537870d00..94e04f26a25 100644 --- a/extern/sector-storage/ffiwrapper/verifier_cgo.go +++ b/extern/sector-storage/ffiwrapper/verifier_cgo.go @@ -123,8 +123,7 @@ func (proofVerifier) VerifyAggregateSeals(aggregate proof5.AggregateSealVerifyPr } func (proofVerifier) VerifyReplicaUpdate(update proof7.ReplicaUpdateInfo) (bool, error) { - v := ffi.FunctionsSectorUpdate{} - return v.VerifyUpdateProof(update.UpdateProof, update.Proof, update.OldSealedSectorCID, update.NewSealedSectorCID, update.NewUnsealedSectorCID) + return ffi.SectorUpdate.VerifyUpdateProof(update) } func (proofVerifier) VerifyWinningPoSt(ctx context.Context, info proof5.WinningPoStVerifyInfo) (bool, error) { diff --git a/extern/sector-storage/mock/mock.go b/extern/sector-storage/mock/mock.go index 8fb356d0bdd..64568dc2d55 100644 --- a/extern/sector-storage/mock/mock.go +++ b/extern/sector-storage/mock/mock.go @@ -549,9 +549,8 @@ func (m mockVerifProver) VerifyAggregateSeals(aggregate proof5.AggregateSealVeri return ok, nil } -// TODO: do the thing func (m mockVerifProver) VerifyReplicaUpdate(update proof7.ReplicaUpdateInfo) (bool, error) { - return false, nil + return true, nil } func (m mockVerifProver) AggregateSealProofs(aggregateInfo proof5.AggregateSealVerifyProofAndInfos, proofs [][]byte) ([]byte, error) { diff --git a/go.mod b/go.mod index 1202fd20067..e0dc4058319 100644 --- a/go.mod +++ b/go.mod @@ -50,7 +50,7 @@ require ( github.com/filecoin-project/specs-actors/v4 v4.0.1 github.com/filecoin-project/specs-actors/v5 v5.0.4 github.com/filecoin-project/specs-actors/v6 v6.0.1 - github.com/filecoin-project/specs-actors/v7 v7.0.0-20211116235548-301b685341ad + github.com/filecoin-project/specs-actors/v7 v7.0.0-20211117170924-fd07a4c7dff9 github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506 github.com/filecoin-project/test-vectors/schema v0.0.5 github.com/gbrlsnchs/jwt/v3 v3.0.1 diff --git a/go.sum b/go.sum index 7747074b931..b91544f8d6f 100644 --- a/go.sum +++ b/go.sum @@ -363,7 +363,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.1-0.20210506134452-99b279731c48/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.1-0.20211102152656-6027e22b77fd/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.1 h1:LR260vya4p++atgf256W6yV3Lxl5mKrBFcEZePWQrdg= github.com/filecoin-project/go-state-types v0.1.1/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig= @@ -389,14 +388,13 @@ github.com/filecoin-project/specs-actors/v3 v3.1.1/go.mod h1:mpynccOLlIRy0QnR008 github.com/filecoin-project/specs-actors/v4 v4.0.0/go.mod h1:TkHXf/l7Wyw4ZejyXIPS2rK8bBO0rdwhTZyQQgaglng= github.com/filecoin-project/specs-actors/v4 v4.0.1 h1:AiWrtvJZ63MHGe6rn7tPu4nSUY8bA1KDNszqJaD5+Fg= github.com/filecoin-project/specs-actors/v4 v4.0.1/go.mod h1:TkHXf/l7Wyw4ZejyXIPS2rK8bBO0rdwhTZyQQgaglng= -github.com/filecoin-project/specs-actors/v5 v5.0.0-20210512015452-4fe3889fff57/go.mod h1:283yBMMUSDB2abcjP/hhrwTkhb9h3sfM6KGrep/ZlBI= github.com/filecoin-project/specs-actors/v5 v5.0.4 h1:OY7BdxJWlUfUFXWV/kpNBYGXNPasDIedf42T3sGx08s= github.com/filecoin-project/specs-actors/v5 v5.0.4/go.mod h1:5BAKRAMsOOlD8+qCw4UvT/lTLInCJ3JwOWZbX8Ipwq4= 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 h1:laxvHNsvrq83Y9n+W7znVCePi3oLyRf0Rkl4jFO8Wew= github.com/filecoin-project/specs-actors/v6 v6.0.1/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= -github.com/filecoin-project/specs-actors/v7 v7.0.0-20211116235548-301b685341ad h1:uUl9I4MCOAkbrY/JI3y6Php3t5c3tu1nux5VkCBwO4E= -github.com/filecoin-project/specs-actors/v7 v7.0.0-20211116235548-301b685341ad/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= +github.com/filecoin-project/specs-actors/v7 v7.0.0-20211117170924-fd07a4c7dff9 h1:H10WnEAJQH3JwHyaHwMEgaaj00z+/QMCb9Sjd/SUW1w= +github.com/filecoin-project/specs-actors/v7 v7.0.0-20211117170924-fd07a4c7dff9/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506 h1:Ur/l2+6qN+lQiqjozWWc5p9UDaAMDZKTlDS98oRnlIw= github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506/go.mod h1:nJRRM7Aa9XVvygr3W9k6xGF46RWzr2zxF/iGoAIfA/g= github.com/filecoin-project/test-vectors/schema v0.0.5 h1:w3zHQhzM4pYxJDl21avXjOKBLF8egrvwUwjpT8TquDg= diff --git a/itests/ccupgrade_test.go b/itests/ccupgrade_test.go index 12bc1fc869a..b5ca414161c 100644 --- a/itests/ccupgrade_test.go +++ b/itests/ccupgrade_test.go @@ -13,6 +13,7 @@ import ( "github.com/stretchr/testify/require" ) +// TODO: This needs to be repurposed into a SnapDeals test suite func TestCCUpgrade(t *testing.T) { kit.QuietMiningLogs() diff --git a/itests/wdpost_test.go b/itests/wdpost_test.go index d87059bb48d..b1420e6a361 100644 --- a/itests/wdpost_test.go +++ b/itests/wdpost_test.go @@ -23,7 +23,7 @@ import ( ) func TestWindowedPost(t *testing.T) { - kit.Expensive(t) + //kit.Expensive(t) kit.QuietMiningLogs() From 91fb1114624e56f5d4fd86e29998ae509c0a1ff1 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Wed, 17 Nov 2021 17:50:36 -0500 Subject: [PATCH 008/393] Update FFI --- extern/filecoin-ffi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extern/filecoin-ffi b/extern/filecoin-ffi index fe2a3175719..58c014a42b7 160000 --- a/extern/filecoin-ffi +++ b/extern/filecoin-ffi @@ -1 +1 @@ -Subproject commit fe2a317571931b31fb1ca6dd2adf1414e375b902 +Subproject commit 58c014a42b7a21e73560879841a71e679126a852 From a5847fd06f34325d240fda97f4c758a94957873e Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Wed, 17 Nov 2021 20:33:18 -0500 Subject: [PATCH 009/393] Update actors --- go.mod | 2 +- go.sum | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index e0dc4058319..ce52b7975c4 100644 --- a/go.mod +++ b/go.mod @@ -50,7 +50,7 @@ require ( github.com/filecoin-project/specs-actors/v4 v4.0.1 github.com/filecoin-project/specs-actors/v5 v5.0.4 github.com/filecoin-project/specs-actors/v6 v6.0.1 - github.com/filecoin-project/specs-actors/v7 v7.0.0-20211117170924-fd07a4c7dff9 + github.com/filecoin-project/specs-actors/v7 v7.0.0-20211118013026-3dce48197cec github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506 github.com/filecoin-project/test-vectors/schema v0.0.5 github.com/gbrlsnchs/jwt/v3 v3.0.1 diff --git a/go.sum b/go.sum index b91544f8d6f..06341ce01eb 100644 --- a/go.sum +++ b/go.sum @@ -393,8 +393,9 @@ github.com/filecoin-project/specs-actors/v5 v5.0.4/go.mod h1:5BAKRAMsOOlD8+qCw4U 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 h1:laxvHNsvrq83Y9n+W7znVCePi3oLyRf0Rkl4jFO8Wew= github.com/filecoin-project/specs-actors/v6 v6.0.1/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= -github.com/filecoin-project/specs-actors/v7 v7.0.0-20211117170924-fd07a4c7dff9 h1:H10WnEAJQH3JwHyaHwMEgaaj00z+/QMCb9Sjd/SUW1w= github.com/filecoin-project/specs-actors/v7 v7.0.0-20211117170924-fd07a4c7dff9/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= +github.com/filecoin-project/specs-actors/v7 v7.0.0-20211118013026-3dce48197cec h1:KV9vE+Sl2Y3qKsrpba4HcE7wHwK7v6O5U/S0xHbje6A= +github.com/filecoin-project/specs-actors/v7 v7.0.0-20211118013026-3dce48197cec/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506 h1:Ur/l2+6qN+lQiqjozWWc5p9UDaAMDZKTlDS98oRnlIw= github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506/go.mod h1:nJRRM7Aa9XVvygr3W9k6xGF46RWzr2zxF/iGoAIfA/g= github.com/filecoin-project/test-vectors/schema v0.0.5 h1:w3zHQhzM4pYxJDl21avXjOKBLF8egrvwUwjpT8TquDg= From 5f1783c9a5965f1820e568a66da6200e9cbadc17 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Thu, 18 Nov 2021 18:35:06 -0500 Subject: [PATCH 010/393] Address review --- build/openrpc/full.json.gz | Bin 25453 -> 25465 bytes chain/actors/builtin/miner/actor.go.template | 1 + chain/actors/builtin/miner/miner.go | 1 + chain/actors/builtin/miner/state.go.template | 23 ++++++++++++++----- chain/actors/builtin/miner/v0.go | 18 ++++++++++++--- chain/actors/builtin/miner/v2.go | 6 ++--- chain/actors/builtin/miner/v3.go | 6 ++--- chain/actors/builtin/miner/v4.go | 6 ++--- chain/actors/builtin/miner/v5.go | 6 ++--- chain/actors/builtin/miner/v6.go | 8 +++---- chain/actors/builtin/miner/v7.go | 15 ++++++------ chain/vm/runtime.go | 9 ++++++++ documentation/en/api-v0-methods.md | 3 ++- documentation/en/api-v1-unstable-methods.md | 3 ++- itests/wdpost_test.go | 2 +- 15 files changed, 72 insertions(+), 35 deletions(-) diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 8f71ee8a973b9f29d91d16893c3cbe8bf3db8356..8719b71713e8587d8e7ec8ea03f23b0d6486fd6c 100644 GIT binary patch delta 24728 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 D;PdR} delta 24759 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 Nw@J1LHh4gQ`9C{nHm3jp diff --git a/chain/actors/builtin/miner/actor.go.template b/chain/actors/builtin/miner/actor.go.template index 2669a05a6c5..2b6b78ebcea 100644 --- a/chain/actors/builtin/miner/actor.go.template +++ b/chain/actors/builtin/miner/actor.go.template @@ -177,6 +177,7 @@ type SectorOnChainInfo struct { InitialPledge abi.TokenAmount ExpectedDayReward abi.TokenAmount ExpectedStoragePledge abi.TokenAmount + SectorKeyCID *cid.Cid } type SectorPreCommitInfo = miner0.SectorPreCommitInfo diff --git a/chain/actors/builtin/miner/miner.go b/chain/actors/builtin/miner/miner.go index f6d63388014..e60ff8da8b4 100644 --- a/chain/actors/builtin/miner/miner.go +++ b/chain/actors/builtin/miner/miner.go @@ -266,6 +266,7 @@ type SectorOnChainInfo struct { InitialPledge abi.TokenAmount ExpectedDayReward abi.TokenAmount ExpectedStoragePledge abi.TokenAmount + SectorKeyCID *cid.Cid } type SectorPreCommitInfo = miner0.SectorPreCommitInfo diff --git a/chain/actors/builtin/miner/state.go.template b/chain/actors/builtin/miner/state.go.template index 2ea6a905e11..77563196109 100644 --- a/chain/actors/builtin/miner/state.go.template +++ b/chain/actors/builtin/miner/state.go.template @@ -138,11 +138,22 @@ func (s *state{{.v}}) GetSectorExpiration(num abi.SectorNumber) (*SectorExpirati return nil, err } // NOTE: this can be optimized significantly. - // 1. If the sector is non-faulty, it will either expire on-time (can be +{{if (ge .v 7) -}} + // 1. If the sector is non-faulty, it will expire on-time (can be + // learned from the sector info). +{{- else -}} + // 1. If the sector is non-faulty, it will either expire on-time (can be // learned from the sector info), or in the next quantized expiration // epoch (i.e., the first element in the partition's expiration queue. +{{- end}} +{{if (ge .v 6) -}} + // 2. If it's faulty, it will expire early within the first 42 entries + // of the expiration queue. +{{- else -}} // 2. If it's faulty, it will expire early within the first 14 entries // of the expiration queue. +{{- end}} + stopErr := errors.New("stop") out := SectorExpiration{} err = dls.ForEach(s.store, func(dlIdx uint64, dl *miner{{.v}}.Deadline) error { @@ -554,8 +565,7 @@ func (p *partition{{.v}}) UnprovenSectors() (bitfield.BitField, error) { } func fromV{{.v}}SectorOnChainInfo(v{{.v}} miner{{.v}}.SectorOnChainInfo) SectorOnChainInfo { -{{if (ge .v 2)}} - return SectorOnChainInfo{ + info := SectorOnChainInfo{ SectorNumber: v{{.v}}.SectorNumber, SealProof: v{{.v}}.SealProof, SealedCID: v{{.v}}.SealedCID, @@ -567,10 +577,11 @@ func fromV{{.v}}SectorOnChainInfo(v{{.v}} miner{{.v}}.SectorOnChainInfo) SectorO InitialPledge: v{{.v}}.InitialPledge, ExpectedDayReward: v{{.v}}.ExpectedDayReward, ExpectedStoragePledge: v{{.v}}.ExpectedStoragePledge, + {{if (ge .v 7)}} + SectorKeyCID: v{{.v}}.SectorKeyCID, + {{end}} } -{{else}} - return (SectorOnChainInfo)(v0) -{{end}} + return info } func fromV{{.v}}SectorPreCommitOnChainInfo(v{{.v}} miner{{.v}}.SectorPreCommitOnChainInfo) SectorPreCommitOnChainInfo { diff --git a/chain/actors/builtin/miner/v0.go b/chain/actors/builtin/miner/v0.go index 564bcbbc27b..8bde8bf73e2 100644 --- a/chain/actors/builtin/miner/v0.go +++ b/chain/actors/builtin/miner/v0.go @@ -140,6 +140,7 @@ func (s *state0) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, e // epoch (i.e., the first element in the partition's expiration queue. // 2. If it's faulty, it will expire early within the first 14 entries // of the expiration queue. + stopErr := errors.New("stop") out := SectorExpiration{} err = dls.ForEach(s.store, func(dlIdx uint64, dl *miner0.Deadline) error { @@ -505,9 +506,20 @@ func (p *partition0) UnprovenSectors() (bitfield.BitField, error) { } func fromV0SectorOnChainInfo(v0 miner0.SectorOnChainInfo) SectorOnChainInfo { - - return (SectorOnChainInfo)(v0) - + info := SectorOnChainInfo{ + SectorNumber: v0.SectorNumber, + SealProof: v0.SealProof, + SealedCID: v0.SealedCID, + DealIDs: v0.DealIDs, + Activation: v0.Activation, + Expiration: v0.Expiration, + DealWeight: v0.DealWeight, + VerifiedDealWeight: v0.VerifiedDealWeight, + InitialPledge: v0.InitialPledge, + ExpectedDayReward: v0.ExpectedDayReward, + ExpectedStoragePledge: v0.ExpectedStoragePledge, + } + return info } func fromV0SectorPreCommitOnChainInfo(v0 miner0.SectorPreCommitOnChainInfo) SectorPreCommitOnChainInfo { diff --git a/chain/actors/builtin/miner/v2.go b/chain/actors/builtin/miner/v2.go index fe0863111dd..bbfdd403e3c 100644 --- a/chain/actors/builtin/miner/v2.go +++ b/chain/actors/builtin/miner/v2.go @@ -138,6 +138,7 @@ func (s *state2) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, e // epoch (i.e., the first element in the partition's expiration queue. // 2. If it's faulty, it will expire early within the first 14 entries // of the expiration queue. + stopErr := errors.New("stop") out := SectorExpiration{} err = dls.ForEach(s.store, func(dlIdx uint64, dl *miner2.Deadline) error { @@ -535,8 +536,7 @@ func (p *partition2) UnprovenSectors() (bitfield.BitField, error) { } func fromV2SectorOnChainInfo(v2 miner2.SectorOnChainInfo) SectorOnChainInfo { - - return SectorOnChainInfo{ + info := SectorOnChainInfo{ SectorNumber: v2.SectorNumber, SealProof: v2.SealProof, SealedCID: v2.SealedCID, @@ -549,7 +549,7 @@ func fromV2SectorOnChainInfo(v2 miner2.SectorOnChainInfo) SectorOnChainInfo { ExpectedDayReward: v2.ExpectedDayReward, ExpectedStoragePledge: v2.ExpectedStoragePledge, } - + return info } func fromV2SectorPreCommitOnChainInfo(v2 miner2.SectorPreCommitOnChainInfo) SectorPreCommitOnChainInfo { diff --git a/chain/actors/builtin/miner/v3.go b/chain/actors/builtin/miner/v3.go index b0d5429ea3c..68505918a79 100644 --- a/chain/actors/builtin/miner/v3.go +++ b/chain/actors/builtin/miner/v3.go @@ -140,6 +140,7 @@ func (s *state3) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, e // epoch (i.e., the first element in the partition's expiration queue. // 2. If it's faulty, it will expire early within the first 14 entries // of the expiration queue. + stopErr := errors.New("stop") out := SectorExpiration{} err = dls.ForEach(s.store, func(dlIdx uint64, dl *miner3.Deadline) error { @@ -536,8 +537,7 @@ func (p *partition3) UnprovenSectors() (bitfield.BitField, error) { } func fromV3SectorOnChainInfo(v3 miner3.SectorOnChainInfo) SectorOnChainInfo { - - return SectorOnChainInfo{ + info := SectorOnChainInfo{ SectorNumber: v3.SectorNumber, SealProof: v3.SealProof, SealedCID: v3.SealedCID, @@ -550,7 +550,7 @@ func fromV3SectorOnChainInfo(v3 miner3.SectorOnChainInfo) SectorOnChainInfo { ExpectedDayReward: v3.ExpectedDayReward, ExpectedStoragePledge: v3.ExpectedStoragePledge, } - + return info } func fromV3SectorPreCommitOnChainInfo(v3 miner3.SectorPreCommitOnChainInfo) SectorPreCommitOnChainInfo { diff --git a/chain/actors/builtin/miner/v4.go b/chain/actors/builtin/miner/v4.go index 7e5a9761a61..5c40d418976 100644 --- a/chain/actors/builtin/miner/v4.go +++ b/chain/actors/builtin/miner/v4.go @@ -140,6 +140,7 @@ func (s *state4) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, e // epoch (i.e., the first element in the partition's expiration queue. // 2. If it's faulty, it will expire early within the first 14 entries // of the expiration queue. + stopErr := errors.New("stop") out := SectorExpiration{} err = dls.ForEach(s.store, func(dlIdx uint64, dl *miner4.Deadline) error { @@ -536,8 +537,7 @@ func (p *partition4) UnprovenSectors() (bitfield.BitField, error) { } func fromV4SectorOnChainInfo(v4 miner4.SectorOnChainInfo) SectorOnChainInfo { - - return SectorOnChainInfo{ + info := SectorOnChainInfo{ SectorNumber: v4.SectorNumber, SealProof: v4.SealProof, SealedCID: v4.SealedCID, @@ -550,7 +550,7 @@ func fromV4SectorOnChainInfo(v4 miner4.SectorOnChainInfo) SectorOnChainInfo { ExpectedDayReward: v4.ExpectedDayReward, ExpectedStoragePledge: v4.ExpectedStoragePledge, } - + return info } func fromV4SectorPreCommitOnChainInfo(v4 miner4.SectorPreCommitOnChainInfo) SectorPreCommitOnChainInfo { diff --git a/chain/actors/builtin/miner/v5.go b/chain/actors/builtin/miner/v5.go index 7f4aaf168e5..f717934f436 100644 --- a/chain/actors/builtin/miner/v5.go +++ b/chain/actors/builtin/miner/v5.go @@ -140,6 +140,7 @@ func (s *state5) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, e // epoch (i.e., the first element in the partition's expiration queue. // 2. If it's faulty, it will expire early within the first 14 entries // of the expiration queue. + stopErr := errors.New("stop") out := SectorExpiration{} err = dls.ForEach(s.store, func(dlIdx uint64, dl *miner5.Deadline) error { @@ -536,8 +537,7 @@ func (p *partition5) UnprovenSectors() (bitfield.BitField, error) { } func fromV5SectorOnChainInfo(v5 miner5.SectorOnChainInfo) SectorOnChainInfo { - - return SectorOnChainInfo{ + info := SectorOnChainInfo{ SectorNumber: v5.SectorNumber, SealProof: v5.SealProof, SealedCID: v5.SealedCID, @@ -550,7 +550,7 @@ func fromV5SectorOnChainInfo(v5 miner5.SectorOnChainInfo) SectorOnChainInfo { ExpectedDayReward: v5.ExpectedDayReward, ExpectedStoragePledge: v5.ExpectedStoragePledge, } - + return info } func fromV5SectorPreCommitOnChainInfo(v5 miner5.SectorPreCommitOnChainInfo) SectorPreCommitOnChainInfo { diff --git a/chain/actors/builtin/miner/v6.go b/chain/actors/builtin/miner/v6.go index de5a22a1091..7a9dfb0dfa3 100644 --- a/chain/actors/builtin/miner/v6.go +++ b/chain/actors/builtin/miner/v6.go @@ -138,8 +138,9 @@ func (s *state6) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, e // 1. If the sector is non-faulty, it will either expire on-time (can be // learned from the sector info), or in the next quantized expiration // epoch (i.e., the first element in the partition's expiration queue. - // 2. If it's faulty, it will expire early within the first 14 entries + // 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 *miner6.Deadline) error { @@ -536,8 +537,7 @@ func (p *partition6) UnprovenSectors() (bitfield.BitField, error) { } func fromV6SectorOnChainInfo(v6 miner6.SectorOnChainInfo) SectorOnChainInfo { - - return SectorOnChainInfo{ + info := SectorOnChainInfo{ SectorNumber: v6.SectorNumber, SealProof: v6.SealProof, SealedCID: v6.SealedCID, @@ -550,7 +550,7 @@ func fromV6SectorOnChainInfo(v6 miner6.SectorOnChainInfo) SectorOnChainInfo { ExpectedDayReward: v6.ExpectedDayReward, ExpectedStoragePledge: v6.ExpectedStoragePledge, } - + return info } func fromV6SectorPreCommitOnChainInfo(v6 miner6.SectorPreCommitOnChainInfo) SectorPreCommitOnChainInfo { diff --git a/chain/actors/builtin/miner/v7.go b/chain/actors/builtin/miner/v7.go index c7096a78149..e1b2520e4dc 100644 --- a/chain/actors/builtin/miner/v7.go +++ b/chain/actors/builtin/miner/v7.go @@ -135,11 +135,11 @@ func (s *state7) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, e return nil, err } // NOTE: this can be optimized significantly. - // 1. If the sector is non-faulty, it will either expire on-time (can be - // learned from the sector info), or in the next quantized expiration - // epoch (i.e., the first element in the partition's expiration queue. - // 2. If it's faulty, it will expire early within the first 14 entries + // 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 *miner7.Deadline) error { @@ -536,8 +536,7 @@ func (p *partition7) UnprovenSectors() (bitfield.BitField, error) { } func fromV7SectorOnChainInfo(v7 miner7.SectorOnChainInfo) SectorOnChainInfo { - - return SectorOnChainInfo{ + info := SectorOnChainInfo{ SectorNumber: v7.SectorNumber, SealProof: v7.SealProof, SealedCID: v7.SealedCID, @@ -549,8 +548,10 @@ func fromV7SectorOnChainInfo(v7 miner7.SectorOnChainInfo) SectorOnChainInfo { InitialPledge: v7.InitialPledge, ExpectedDayReward: v7.ExpectedDayReward, ExpectedStoragePledge: v7.ExpectedStoragePledge, - } + SectorKeyCID: v7.SectorKeyCID, + } + return info } func fromV7SectorPreCommitOnChainInfo(v7 miner7.SectorPreCommitOnChainInfo) SectorPreCommitOnChainInfo { diff --git a/chain/vm/runtime.go b/chain/vm/runtime.go index 583c99593b9..0dbe98224ee 100644 --- a/chain/vm/runtime.go +++ b/chain/vm/runtime.go @@ -16,7 +16,11 @@ import ( "github.com/filecoin-project/go-state-types/network" rtt "github.com/filecoin-project/go-state-types/rt" rt0 "github.com/filecoin-project/specs-actors/actors/runtime" + rt2 "github.com/filecoin-project/specs-actors/v2/actors/runtime" + rt3 "github.com/filecoin-project/specs-actors/v3/actors/runtime" + rt4 "github.com/filecoin-project/specs-actors/v4/actors/runtime" rt5 "github.com/filecoin-project/specs-actors/v5/actors/runtime" + rt6 "github.com/filecoin-project/specs-actors/v6/actors/runtime" rt7 "github.com/filecoin-project/specs-actors/v7/actors/runtime" "github.com/ipfs/go-cid" ipldcbor "github.com/ipfs/go-ipld-cbor" @@ -142,6 +146,11 @@ func (rt *Runtime) StorePut(x cbor.Marshaler) cid.Cid { var _ rt0.Runtime = (*Runtime)(nil) var _ rt5.Runtime = (*Runtime)(nil) +var _ rt2.Runtime = (*Runtime)(nil) +var _ rt3.Runtime = (*Runtime)(nil) +var _ rt4.Runtime = (*Runtime)(nil) +var _ rt5.Runtime = (*Runtime)(nil) +var _ rt6.Runtime = (*Runtime)(nil) var _ rt7.Runtime = (*Runtime)(nil) func (rt *Runtime) shimCall(f func() interface{}) (rval []byte, aerr aerrors.ActorError) { diff --git a/documentation/en/api-v0-methods.md b/documentation/en/api-v0-methods.md index 42bb945d0f1..09c3d1c34ad 100644 --- a/documentation/en/api-v0-methods.md +++ b/documentation/en/api-v0-methods.md @@ -5016,7 +5016,8 @@ Response: "VerifiedDealWeight": "0", "InitialPledge": "0", "ExpectedDayReward": "0", - "ExpectedStoragePledge": "0" + "ExpectedStoragePledge": "0", + "SectorKeyCID": null } ``` diff --git a/documentation/en/api-v1-unstable-methods.md b/documentation/en/api-v1-unstable-methods.md index 3578a449218..91baffdc6ea 100644 --- a/documentation/en/api-v1-unstable-methods.md +++ b/documentation/en/api-v1-unstable-methods.md @@ -5223,7 +5223,8 @@ Response: "VerifiedDealWeight": "0", "InitialPledge": "0", "ExpectedDayReward": "0", - "ExpectedStoragePledge": "0" + "ExpectedStoragePledge": "0", + "SectorKeyCID": null } ``` diff --git a/itests/wdpost_test.go b/itests/wdpost_test.go index b1420e6a361..d87059bb48d 100644 --- a/itests/wdpost_test.go +++ b/itests/wdpost_test.go @@ -23,7 +23,7 @@ import ( ) func TestWindowedPost(t *testing.T) { - //kit.Expensive(t) + kit.Expensive(t) kit.QuietMiningLogs() From 7d2b3f05db38cee481c4b91e628b53bb460bdadc Mon Sep 17 00:00:00 2001 From: zenground0 Date: Wed, 10 Nov 2021 13:53:00 -0500 Subject: [PATCH 011/393] WIP sector storage and integration test --- api/api_storage.go | 25 +-- api/api_worker.go | 3 + api/proxy_gen.go | 78 +++++++++ build/openrpc/full.json.gz | Bin 25465 -> 25466 bytes build/openrpc/miner.json.gz | Bin 10467 -> 10672 bytes build/openrpc/worker.json.gz | Bin 2713 -> 2940 bytes documentation/en/api-v0-methods-miner.md | 85 +++++++++ documentation/en/api-v0-methods-worker.md | 118 +++++++++++++ extern/filecoin-ffi | 2 +- .../sector-storage/ffiwrapper/sealer_cgo.go | 83 +++++++++ .../sector-storage/ffiwrapper/verifier_cgo.go | 3 +- extern/sector-storage/manager.go | 161 ++++++++++++++++++ extern/sector-storage/manager_calltracker.go | 1 - extern/sector-storage/manager_test.go | 139 ++++++++++++++- extern/sector-storage/mock/mock.go | 32 ++++ extern/sector-storage/sched_test.go | 12 ++ extern/sector-storage/sealtasks/task.go | 27 ++- extern/sector-storage/storiface/filetype.go | 42 +++-- extern/sector-storage/storiface/worker.go | 6 + extern/sector-storage/teststorage_test.go | 16 ++ extern/sector-storage/testworker_test.go | 28 +++ extern/sector-storage/worker_local.go | 85 ++++++--- extern/sector-storage/worker_tracked.go | 19 ++- go.mod | 4 +- go.sum | 10 +- 25 files changed, 911 insertions(+), 68 deletions(-) diff --git a/api/api_storage.go b/api/api_storage.go index 8cca2aa5be5..bf7520d09e7 100644 --- a/api/api_storage.go +++ b/api/api_storage.go @@ -118,17 +118,20 @@ type StorageMiner interface { WorkerJobs(context.Context) (map[uuid.UUID][]storiface.WorkerJob, error) //perm:admin //storiface.WorkerReturn - ReturnAddPiece(ctx context.Context, callID storiface.CallID, pi abi.PieceInfo, err *storiface.CallError) error //perm:admin retry:true - ReturnSealPreCommit1(ctx context.Context, callID storiface.CallID, p1o storage.PreCommit1Out, err *storiface.CallError) error //perm:admin retry:true - ReturnSealPreCommit2(ctx context.Context, callID storiface.CallID, sealed storage.SectorCids, err *storiface.CallError) error //perm:admin retry:true - ReturnSealCommit1(ctx context.Context, callID storiface.CallID, out storage.Commit1Out, err *storiface.CallError) error //perm:admin retry:true - ReturnSealCommit2(ctx context.Context, callID storiface.CallID, proof storage.Proof, err *storiface.CallError) error //perm:admin retry:true - ReturnFinalizeSector(ctx context.Context, callID storiface.CallID, err *storiface.CallError) error //perm:admin retry:true - ReturnReleaseUnsealed(ctx context.Context, callID storiface.CallID, err *storiface.CallError) error //perm:admin retry:true - 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 - ReturnFetch(ctx context.Context, callID storiface.CallID, err *storiface.CallError) error //perm:admin retry:true + ReturnAddPiece(ctx context.Context, callID storiface.CallID, pi abi.PieceInfo, err *storiface.CallError) error //perm:admin retry:true + ReturnSealPreCommit1(ctx context.Context, callID storiface.CallID, p1o storage.PreCommit1Out, err *storiface.CallError) error //perm:admin retry:true + ReturnSealPreCommit2(ctx context.Context, callID storiface.CallID, sealed storage.SectorCids, err *storiface.CallError) error //perm:admin retry:true + ReturnSealCommit1(ctx context.Context, callID storiface.CallID, out storage.Commit1Out, err *storiface.CallError) error //perm:admin retry:true + ReturnSealCommit2(ctx context.Context, callID storiface.CallID, proof storage.Proof, err *storiface.CallError) error //perm:admin retry:true + ReturnFinalizeSector(ctx context.Context, callID storiface.CallID, err *storiface.CallError) error //perm:admin retry:true + ReturnReplicaUpdate(ctx context.Context, callID storiface.CallID, out storage.ReplicaUpdateOut, err *storiface.CallError) error //perm:admin retry:true + ReturnProveReplicaUpdate1(ctx context.Context, callID storiface.CallID, vanillaProofs storage.ReplicaVanillaProofs, err *storiface.CallError) error //perm:admin retry:true + ReturnProveReplicaUpdate2(ctx context.Context, callID storiface.CallID, proof storage.ReplicaUpdateProof, err *storiface.CallError) error //perm:admin retry:true + ReturnReleaseUnsealed(ctx context.Context, callID storiface.CallID, err *storiface.CallError) error //perm:admin retry:true + 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 + ReturnFetch(ctx context.Context, callID storiface.CallID, err *storiface.CallError) error //perm:admin retry:true // SealingSchedDiag dumps internal sealing scheduler state SealingSchedDiag(ctx context.Context, doSched bool) (interface{}, error) //perm:admin diff --git a/api/api_worker.go b/api/api_worker.go index 4553c30e095..5e0b4f8c6d4 100644 --- a/api/api_worker.go +++ b/api/api_worker.go @@ -39,6 +39,9 @@ type Worker interface { SealCommit1(ctx context.Context, sector storage.SectorRef, ticket abi.SealRandomness, seed abi.InteractiveSealRandomness, pieces []abi.PieceInfo, cids storage.SectorCids) (storiface.CallID, error) //perm:admin SealCommit2(ctx context.Context, sector storage.SectorRef, c1o storage.Commit1Out) (storiface.CallID, error) //perm:admin FinalizeSector(ctx context.Context, sector storage.SectorRef, keepUnsealed []storage.Range) (storiface.CallID, error) //perm:admin + ReplicaUpdate(ctx context.Context, sector storage.SectorRef, pieces []abi.PieceInfo) (storiface.CallID, error) //perm:admin + ProveReplicaUpdate1(ctx context.Context, sector storage.SectorRef, sectorKey, newSealed, newUnsealed cid.Cid) (storiface.CallID, error) //perm:admin + ProveReplicaUpdate2(ctx context.Context, sector storage.SectorRef, sectorKey, newSealed, newUnsealed cid.Cid, vanillaProofs storage.ReplicaVanillaProofs) (storiface.CallID, error) //perm:admin ReleaseUnsealed(ctx context.Context, sector storage.SectorRef, safeToFree []storage.Range) (storiface.CallID, error) //perm:admin MoveStorage(ctx context.Context, sector storage.SectorRef, types storiface.SectorFileType) (storiface.CallID, error) //perm:admin UnsealPiece(context.Context, storage.SectorRef, storiface.UnpaddedByteIndex, abi.UnpaddedPieceSize, abi.SealRandomness, cid.Cid) (storiface.CallID, error) //perm:admin diff --git a/api/proxy_gen.go b/api/proxy_gen.go index b36f19a7e1e..b78b40959b2 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -709,10 +709,16 @@ type StorageMinerStruct struct { ReturnMoveStorage func(p0 context.Context, p1 storiface.CallID, p2 *storiface.CallError) error `perm:"admin"` + ReturnProveReplicaUpdate1 func(p0 context.Context, p1 storiface.CallID, p2 storage.ReplicaVanillaProofs, p3 *storiface.CallError) error `perm:"admin"` + + ReturnProveReplicaUpdate2 func(p0 context.Context, p1 storiface.CallID, p2 storage.ReplicaUpdateProof, p3 *storiface.CallError) error `perm:"admin"` + ReturnReadPiece func(p0 context.Context, p1 storiface.CallID, p2 bool, p3 *storiface.CallError) error `perm:"admin"` ReturnReleaseUnsealed func(p0 context.Context, p1 storiface.CallID, p2 *storiface.CallError) error `perm:"admin"` + ReturnReplicaUpdate func(p0 context.Context, p1 storiface.CallID, p2 storage.ReplicaUpdateOut, p3 *storiface.CallError) error `perm:"admin"` + ReturnSealCommit1 func(p0 context.Context, p1 storiface.CallID, p2 storage.Commit1Out, p3 *storiface.CallError) error `perm:"admin"` ReturnSealCommit2 func(p0 context.Context, p1 storiface.CallID, p2 storage.Proof, p3 *storiface.CallError) error `perm:"admin"` @@ -852,10 +858,16 @@ type WorkerStruct struct { ProcessSession func(p0 context.Context) (uuid.UUID, error) `perm:"admin"` + ProveReplicaUpdate1 func(p0 context.Context, p1 storage.SectorRef, p2 cid.Cid, p3 cid.Cid, p4 cid.Cid) (storiface.CallID, error) `perm:"admin"` + + ProveReplicaUpdate2 func(p0 context.Context, p1 storage.SectorRef, p2 cid.Cid, p3 cid.Cid, p4 cid.Cid, p5 storage.ReplicaVanillaProofs) (storiface.CallID, error) `perm:"admin"` + ReleaseUnsealed func(p0 context.Context, p1 storage.SectorRef, p2 []storage.Range) (storiface.CallID, error) `perm:"admin"` Remove func(p0 context.Context, p1 abi.SectorID) error `perm:"admin"` + ReplicaUpdate func(p0 context.Context, p1 storage.SectorRef, p2 []abi.PieceInfo) (storiface.CallID, error) `perm:"admin"` + SealCommit1 func(p0 context.Context, p1 storage.SectorRef, p2 abi.SealRandomness, p3 abi.InteractiveSealRandomness, p4 []abi.PieceInfo, p5 storage.SectorCids) (storiface.CallID, error) `perm:"admin"` SealCommit2 func(p0 context.Context, p1 storage.SectorRef, p2 storage.Commit1Out) (storiface.CallID, error) `perm:"admin"` @@ -4165,6 +4177,28 @@ func (s *StorageMinerStub) ReturnMoveStorage(p0 context.Context, p1 storiface.Ca return ErrNotSupported } +func (s *StorageMinerStruct) ReturnProveReplicaUpdate1(p0 context.Context, p1 storiface.CallID, p2 storage.ReplicaVanillaProofs, p3 *storiface.CallError) error { + if s.Internal.ReturnProveReplicaUpdate1 == nil { + return ErrNotSupported + } + return s.Internal.ReturnProveReplicaUpdate1(p0, p1, p2, p3) +} + +func (s *StorageMinerStub) ReturnProveReplicaUpdate1(p0 context.Context, p1 storiface.CallID, p2 storage.ReplicaVanillaProofs, p3 *storiface.CallError) error { + return ErrNotSupported +} + +func (s *StorageMinerStruct) ReturnProveReplicaUpdate2(p0 context.Context, p1 storiface.CallID, p2 storage.ReplicaUpdateProof, p3 *storiface.CallError) error { + if s.Internal.ReturnProveReplicaUpdate2 == nil { + return ErrNotSupported + } + return s.Internal.ReturnProveReplicaUpdate2(p0, p1, p2, p3) +} + +func (s *StorageMinerStub) ReturnProveReplicaUpdate2(p0 context.Context, p1 storiface.CallID, p2 storage.ReplicaUpdateProof, p3 *storiface.CallError) error { + return ErrNotSupported +} + func (s *StorageMinerStruct) ReturnReadPiece(p0 context.Context, p1 storiface.CallID, p2 bool, p3 *storiface.CallError) error { if s.Internal.ReturnReadPiece == nil { return ErrNotSupported @@ -4187,6 +4221,17 @@ func (s *StorageMinerStub) ReturnReleaseUnsealed(p0 context.Context, p1 storifac return ErrNotSupported } +func (s *StorageMinerStruct) ReturnReplicaUpdate(p0 context.Context, p1 storiface.CallID, p2 storage.ReplicaUpdateOut, p3 *storiface.CallError) error { + if s.Internal.ReturnReplicaUpdate == nil { + return ErrNotSupported + } + return s.Internal.ReturnReplicaUpdate(p0, p1, p2, p3) +} + +func (s *StorageMinerStub) ReturnReplicaUpdate(p0 context.Context, p1 storiface.CallID, p2 storage.ReplicaUpdateOut, p3 *storiface.CallError) error { + return ErrNotSupported +} + func (s *StorageMinerStruct) ReturnSealCommit1(p0 context.Context, p1 storiface.CallID, p2 storage.Commit1Out, p3 *storiface.CallError) error { if s.Internal.ReturnSealCommit1 == nil { return ErrNotSupported @@ -4858,6 +4903,28 @@ func (s *WorkerStub) ProcessSession(p0 context.Context) (uuid.UUID, error) { return *new(uuid.UUID), ErrNotSupported } +func (s *WorkerStruct) ProveReplicaUpdate1(p0 context.Context, p1 storage.SectorRef, p2 cid.Cid, p3 cid.Cid, p4 cid.Cid) (storiface.CallID, error) { + if s.Internal.ProveReplicaUpdate1 == nil { + return *new(storiface.CallID), ErrNotSupported + } + return s.Internal.ProveReplicaUpdate1(p0, p1, p2, p3, p4) +} + +func (s *WorkerStub) ProveReplicaUpdate1(p0 context.Context, p1 storage.SectorRef, p2 cid.Cid, p3 cid.Cid, p4 cid.Cid) (storiface.CallID, error) { + return *new(storiface.CallID), ErrNotSupported +} + +func (s *WorkerStruct) ProveReplicaUpdate2(p0 context.Context, p1 storage.SectorRef, p2 cid.Cid, p3 cid.Cid, p4 cid.Cid, p5 storage.ReplicaVanillaProofs) (storiface.CallID, error) { + if s.Internal.ProveReplicaUpdate2 == nil { + return *new(storiface.CallID), ErrNotSupported + } + return s.Internal.ProveReplicaUpdate2(p0, p1, p2, p3, p4, p5) +} + +func (s *WorkerStub) ProveReplicaUpdate2(p0 context.Context, p1 storage.SectorRef, p2 cid.Cid, p3 cid.Cid, p4 cid.Cid, p5 storage.ReplicaVanillaProofs) (storiface.CallID, error) { + return *new(storiface.CallID), ErrNotSupported +} + func (s *WorkerStruct) ReleaseUnsealed(p0 context.Context, p1 storage.SectorRef, p2 []storage.Range) (storiface.CallID, error) { if s.Internal.ReleaseUnsealed == nil { return *new(storiface.CallID), ErrNotSupported @@ -4880,6 +4947,17 @@ func (s *WorkerStub) Remove(p0 context.Context, p1 abi.SectorID) error { return ErrNotSupported } +func (s *WorkerStruct) ReplicaUpdate(p0 context.Context, p1 storage.SectorRef, p2 []abi.PieceInfo) (storiface.CallID, error) { + if s.Internal.ReplicaUpdate == nil { + return *new(storiface.CallID), ErrNotSupported + } + return s.Internal.ReplicaUpdate(p0, p1, p2) +} + +func (s *WorkerStub) ReplicaUpdate(p0 context.Context, p1 storage.SectorRef, p2 []abi.PieceInfo) (storiface.CallID, error) { + return *new(storiface.CallID), ErrNotSupported +} + func (s *WorkerStruct) SealCommit1(p0 context.Context, p1 storage.SectorRef, p2 abi.SealRandomness, p3 abi.InteractiveSealRandomness, p4 []abi.PieceInfo, p5 storage.SectorCids) (storiface.CallID, error) { if s.Internal.SealCommit1 == nil { return *new(storiface.CallID), ErrNotSupported diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 8719b71713e8587d8e7ec8ea03f23b0d6486fd6c..a5816ef4f3d57f10df36cc9e5a911257fb47e0e6 100644 GIT binary patch delta 25088 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 WJUo1P`2PU_0RR7TD+|HU^Z@`4(25@b delta 10388 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 literal 2713 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", t) } @@ -104,9 +116,11 @@ func (t SectorFileType) All() [FileTypes]bool { type SectorPaths struct { ID abi.SectorID - Unsealed string - Sealed string - Cache string + Unsealed string + Sealed string + Cache string + Update string + UpdateCache string } func ParseSectorID(baseName string) (abi.SectorID, error) { @@ -139,6 +153,10 @@ func PathByType(sps SectorPaths, fileType SectorFileType) string { return sps.Sealed case FTCache: return sps.Cache + case FTUpdate: + return sps.Update + case FTUpdateCache: + return sps.UpdateCache } panic("requested unknown path type") @@ -152,5 +170,9 @@ func SetPathByType(sps *SectorPaths, fileType SectorFileType, p string) { sps.Sealed = p case FTCache: sps.Cache = p + case FTUpdate: + sps.Update = p + case FTUpdateCache: + sps.UpdateCache = p } } diff --git a/extern/sector-storage/storiface/worker.go b/extern/sector-storage/storiface/worker.go index e3374d6cf86..970e0ec33a2 100644 --- a/extern/sector-storage/storiface/worker.go +++ b/extern/sector-storage/storiface/worker.go @@ -92,6 +92,9 @@ type WorkerCalls interface { SealCommit2(ctx context.Context, sector storage.SectorRef, c1o storage.Commit1Out) (CallID, error) FinalizeSector(ctx context.Context, sector storage.SectorRef, keepUnsealed []storage.Range) (CallID, error) ReleaseUnsealed(ctx context.Context, sector storage.SectorRef, safeToFree []storage.Range) (CallID, error) + ReplicaUpdate(ctx context.Context, sector storage.SectorRef, pieces []abi.PieceInfo) (CallID, error) + ProveReplicaUpdate1(ctx context.Context, sector storage.SectorRef, sectorKey, newSealed, newUnsealed cid.Cid) (CallID, error) + ProveReplicaUpdate2(ctx context.Context, sector storage.SectorRef, sectorKey, newSealed, newUnsealed cid.Cid, vanillaProofs storage.ReplicaVanillaProofs) (CallID, error) MoveStorage(ctx context.Context, sector storage.SectorRef, types SectorFileType) (CallID, error) UnsealPiece(context.Context, storage.SectorRef, UnpaddedByteIndex, abi.UnpaddedPieceSize, abi.SealRandomness, cid.Cid) (CallID, error) Fetch(context.Context, storage.SectorRef, SectorFileType, PathType, AcquireMode) (CallID, error) @@ -145,6 +148,9 @@ type WorkerReturn interface { ReturnSealCommit2(ctx context.Context, callID CallID, proof storage.Proof, err *CallError) error ReturnFinalizeSector(ctx context.Context, callID CallID, err *CallError) error ReturnReleaseUnsealed(ctx context.Context, callID CallID, err *CallError) error + ReturnReplicaUpdate(ctx context.Context, callID CallID, out storage.ReplicaUpdateOut, err *CallError) error + ReturnProveReplicaUpdate1(ctx context.Context, callID CallID, proofs storage.ReplicaVanillaProofs, err *CallError) error + ReturnProveReplicaUpdate2(ctx context.Context, callID CallID, proof storage.ReplicaUpdateProof, err *CallError) error ReturnMoveStorage(ctx context.Context, callID CallID, err *CallError) error ReturnUnsealPiece(ctx context.Context, callID CallID, err *CallError) error ReturnReadPiece(ctx context.Context, callID CallID, ok bool, err *CallError) error diff --git a/extern/sector-storage/teststorage_test.go b/extern/sector-storage/teststorage_test.go index 72b27b154dc..4061b48d99c 100644 --- a/extern/sector-storage/teststorage_test.go +++ b/extern/sector-storage/teststorage_test.go @@ -55,10 +55,26 @@ func (t *testExec) ReleaseUnsealed(ctx context.Context, sector storage.SectorRef panic("implement me") } +func (t *testExec) ReleaseSealed(ctx context.Context, sector storage.SectorRef) error { + panic("implement me") +} + func (t *testExec) Remove(ctx context.Context, sector storage.SectorRef) error { panic("implement me") } +func (t *testExec) ReplicaUpdate(ctx context.Context, sector storage.SectorRef, pieces []abi.PieceInfo) (storage.ReplicaUpdateOut, error) { + panic("implement me") +} + +func (t *testExec) ProveReplicaUpdate1(ctx context.Context, sector storage.SectorRef, sectorKey, newSealed, newUnsealed cid.Cid) (storage.ReplicaVanillaProofs, error) { + panic("implement me") +} + +func (t *testExec) ProveReplicaUpdate2(ctx context.Context, sector storage.SectorRef, sectorKey, newSealed, newUnsealed cid.Cid, vanillaProofs storage.ReplicaVanillaProofs) (storage.ReplicaUpdateProof, error) { + panic("implement me") +} + func (t *testExec) NewSector(ctx context.Context, sector storage.SectorRef) error { panic("implement me") } diff --git a/extern/sector-storage/testworker_test.go b/extern/sector-storage/testworker_test.go index 2fe99f3d4cc..a5c678415d4 100644 --- a/extern/sector-storage/testworker_test.go +++ b/extern/sector-storage/testworker_test.go @@ -7,6 +7,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/specs-storage/storage" "github.com/google/uuid" + cid "github.com/ipfs/go-cid" "github.com/filecoin-project/lotus/extern/sector-storage/mock" "github.com/filecoin-project/lotus/extern/sector-storage/sealtasks" @@ -67,6 +68,33 @@ func (t *testWorker) AddPiece(ctx context.Context, sector storage.SectorRef, pie }) } +func (t *testWorker) ReplicaUpdate(ctx context.Context, sector storage.SectorRef, pieces []abi.PieceInfo) (storiface.CallID, error) { + return t.asyncCall(sector, func(ci storiface.CallID) { + out, err := t.mockSeal.ReplicaUpdate(ctx, sector, pieces) + if err := t.ret.ReturnReplicaUpdate(ctx, ci, out, toCallError(err)); err != nil { + log.Error(err) + } + }) +} + +func (t *testWorker) ProveReplicaUpdate1(ctx context.Context, sector storage.SectorRef, sectorKey, newSealed, newUnsealed cid.Cid) (storiface.CallID, error) { + return t.asyncCall(sector, func(ci storiface.CallID) { + vanillaProofs, err := t.mockSeal.ProveReplicaUpdate1(ctx, sector, sectorKey, newSealed, newUnsealed) + if err := t.ret.ReturnProveReplicaUpdate1(ctx, ci, vanillaProofs, toCallError(err)); err != nil { + log.Error(err) + } + }) +} + +func (t *testWorker) ProveReplicaUpdate2(ctx context.Context, sector storage.SectorRef, sectorKey, newSealed, newUnsealed cid.Cid, vanillaProofs storage.ReplicaVanillaProofs) (storiface.CallID, error) { + return t.asyncCall(sector, func(ci storiface.CallID) { + proof, err := t.mockSeal.ProveReplicaUpdate2(ctx, sector, sectorKey, newSealed, newUnsealed, vanillaProofs) + if err := t.ret.ReturnProveReplicaUpdate2(ctx, ci, proof, toCallError(err)); err != nil { + log.Error(err) + } + }) +} + func (t *testWorker) SealPreCommit1(ctx context.Context, sector storage.SectorRef, ticket abi.SealRandomness, pieces []abi.PieceInfo) (storiface.CallID, error) { return t.asyncCall(sector, func(ci storiface.CallID) { t.pc1s++ diff --git a/extern/sector-storage/worker_local.go b/extern/sector-storage/worker_local.go index d45d140f818..cc41e916e20 100644 --- a/extern/sector-storage/worker_local.go +++ b/extern/sector-storage/worker_local.go @@ -28,7 +28,7 @@ import ( "github.com/filecoin-project/lotus/extern/sector-storage/storiface" ) -var pathTypes = []storiface.SectorFileType{storiface.FTUnsealed, storiface.FTSealed, storiface.FTCache} +var pathTypes = []storiface.SectorFileType{storiface.FTUnsealed, storiface.FTSealed, storiface.FTCache, storiface.FTUpdate, storiface.FTUpdateCache} type WorkerConfig struct { TaskTypes []sealtasks.TaskType @@ -145,7 +145,6 @@ func (l *localWorkerPathProvider) AcquireSector(ctx context.Context, sector stor } sid := storiface.PathByType(storageIDs, fileType) - if err := l.w.sindex.StorageDeclareSector(ctx, stores.ID(sid), sector.ID, fileType, l.op == storiface.AcquireMove); err != nil { log.Errorf("declare sector error: %+v", err) } @@ -160,16 +159,19 @@ func (l *LocalWorker) ffiExec() (ffiwrapper.Storage, error) { type ReturnType string const ( - AddPiece ReturnType = "AddPiece" - SealPreCommit1 ReturnType = "SealPreCommit1" - SealPreCommit2 ReturnType = "SealPreCommit2" - SealCommit1 ReturnType = "SealCommit1" - SealCommit2 ReturnType = "SealCommit2" - FinalizeSector ReturnType = "FinalizeSector" - ReleaseUnsealed ReturnType = "ReleaseUnsealed" - MoveStorage ReturnType = "MoveStorage" - UnsealPiece ReturnType = "UnsealPiece" - Fetch ReturnType = "Fetch" + AddPiece ReturnType = "AddPiece" + SealPreCommit1 ReturnType = "SealPreCommit1" + SealPreCommit2 ReturnType = "SealPreCommit2" + SealCommit1 ReturnType = "SealCommit1" + SealCommit2 ReturnType = "SealCommit2" + FinalizeSector ReturnType = "FinalizeSector" + ReplicaUpdate ReturnType = "ReplicaUpdate" + ProveReplicaUpdate1 ReturnType = "ProveReplicaUpdate1" + ProveReplicaUpdate2 ReturnType = "ProveReplicaUpdate2" + ReleaseUnsealed ReturnType = "ReleaseUnsealed" + MoveStorage ReturnType = "MoveStorage" + UnsealPiece ReturnType = "UnsealPiece" + Fetch ReturnType = "Fetch" ) // in: func(WorkerReturn, context.Context, CallID, err string) @@ -207,16 +209,19 @@ func rfunc(in interface{}) func(context.Context, storiface.CallID, storiface.Wor } var returnFunc = map[ReturnType]func(context.Context, storiface.CallID, storiface.WorkerReturn, interface{}, *storiface.CallError) error{ - AddPiece: rfunc(storiface.WorkerReturn.ReturnAddPiece), - SealPreCommit1: rfunc(storiface.WorkerReturn.ReturnSealPreCommit1), - SealPreCommit2: rfunc(storiface.WorkerReturn.ReturnSealPreCommit2), - SealCommit1: rfunc(storiface.WorkerReturn.ReturnSealCommit1), - SealCommit2: rfunc(storiface.WorkerReturn.ReturnSealCommit2), - FinalizeSector: rfunc(storiface.WorkerReturn.ReturnFinalizeSector), - ReleaseUnsealed: rfunc(storiface.WorkerReturn.ReturnReleaseUnsealed), - MoveStorage: rfunc(storiface.WorkerReturn.ReturnMoveStorage), - UnsealPiece: rfunc(storiface.WorkerReturn.ReturnUnsealPiece), - Fetch: rfunc(storiface.WorkerReturn.ReturnFetch), + AddPiece: rfunc(storiface.WorkerReturn.ReturnAddPiece), + SealPreCommit1: rfunc(storiface.WorkerReturn.ReturnSealPreCommit1), + SealPreCommit2: rfunc(storiface.WorkerReturn.ReturnSealPreCommit2), + SealCommit1: rfunc(storiface.WorkerReturn.ReturnSealCommit1), + SealCommit2: rfunc(storiface.WorkerReturn.ReturnSealCommit2), + FinalizeSector: rfunc(storiface.WorkerReturn.ReturnFinalizeSector), + ReleaseUnsealed: rfunc(storiface.WorkerReturn.ReturnReleaseUnsealed), + ReplicaUpdate: rfunc(storiface.WorkerReturn.ReturnReplicaUpdate), + ProveReplicaUpdate1: rfunc(storiface.WorkerReturn.ReturnProveReplicaUpdate1), + ProveReplicaUpdate2: rfunc(storiface.WorkerReturn.ReturnProveReplicaUpdate2), + MoveStorage: rfunc(storiface.WorkerReturn.ReturnMoveStorage), + UnsealPiece: rfunc(storiface.WorkerReturn.ReturnUnsealPiece), + Fetch: rfunc(storiface.WorkerReturn.ReturnFetch), } func (l *LocalWorker) asyncCall(ctx context.Context, sector storage.SectorRef, rt ReturnType, work func(ctx context.Context, ci storiface.CallID) (interface{}, error)) (storiface.CallID, error) { @@ -240,7 +245,6 @@ func (l *LocalWorker) asyncCall(ctx context.Context, sector storage.SectorRef, r } res, err := work(ctx, ci) - if err != nil { rb, err := json.Marshal(res) if err != nil { @@ -258,7 +262,6 @@ func (l *LocalWorker) asyncCall(ctx context.Context, sector storage.SectorRef, r } } }() - return ci, nil } @@ -382,6 +385,40 @@ func (l *LocalWorker) SealCommit2(ctx context.Context, sector storage.SectorRef, }) } +func (l *LocalWorker) ReplicaUpdate(ctx context.Context, sector storage.SectorRef, pieces []abi.PieceInfo) (storiface.CallID, error) { + sb, err := l.executor() + if err != nil { + return storiface.UndefCall, err + } + + return l.asyncCall(ctx, sector, ReplicaUpdate, func(ctx context.Context, ci storiface.CallID) (interface{}, error) { + sealerOut, err := sb.ReplicaUpdate(ctx, sector, pieces) + return sealerOut, err + }) +} + +func (l *LocalWorker) ProveReplicaUpdate1(ctx context.Context, sector storage.SectorRef, sectorKey, newSealed, newUnsealed cid.Cid) (storiface.CallID, error) { + sb, err := l.executor() + if err != nil { + return storiface.UndefCall, err + } + + return l.asyncCall(ctx, sector, ProveReplicaUpdate1, func(ctx context.Context, ci storiface.CallID) (interface{}, error) { + return sb.ProveReplicaUpdate1(ctx, sector, sectorKey, newSealed, newUnsealed) + }) +} + +func (l *LocalWorker) ProveReplicaUpdate2(ctx context.Context, sector storage.SectorRef, sectorKey, newSealed, newUnsealed cid.Cid, vanillaProofs storage.ReplicaVanillaProofs) (storiface.CallID, error) { + sb, err := l.executor() + if err != nil { + return storiface.UndefCall, err + } + + return l.asyncCall(ctx, sector, ProveReplicaUpdate2, func(ctx context.Context, ci storiface.CallID) (interface{}, error) { + return sb.ProveReplicaUpdate2(ctx, sector, sectorKey, newSealed, newUnsealed, vanillaProofs) + }) +} + func (l *LocalWorker) FinalizeSector(ctx context.Context, sector storage.SectorRef, keepUnsealed []storage.Range) (storiface.CallID, error) { sb, err := l.executor() if err != nil { diff --git a/extern/sector-storage/worker_tracked.go b/extern/sector-storage/worker_tracked.go index 5702426c31a..b87abed061f 100644 --- a/extern/sector-storage/worker_tracked.go +++ b/extern/sector-storage/worker_tracked.go @@ -98,7 +98,6 @@ func (wt *workTracker) track(ctx context.Context, ready chan struct{}, wid Worke wt.lk.Lock() delete(wt.prepared, prepID) } - callID, err := cb() if err != nil { return callID, err @@ -198,4 +197,22 @@ func (t *trackedWorker) UnsealPiece(ctx context.Context, id storage.SectorRef, i return t.tracker.track(ctx, t.execute, t.wid, t.workerInfo, id, sealtasks.TTUnseal, func() (storiface.CallID, error) { return t.Worker.UnsealPiece(ctx, id, index, size, randomness, cid) }) } +func (t *trackedWorker) ReplicaUpdate(ctx context.Context, sector storage.SectorRef, pieces []abi.PieceInfo) (storiface.CallID, error) { + return t.tracker.track(ctx, t.execute, t.wid, t.workerInfo, sector, sealtasks.TTReplicaUpdate, func() (storiface.CallID, error) { + return t.Worker.ReplicaUpdate(ctx, sector, pieces) + }) +} + +func (t *trackedWorker) ProveReplicaUpdate1(ctx context.Context, sector storage.SectorRef, sectorKey, newSealed, newUnsealed cid.Cid) (storiface.CallID, error) { + return t.tracker.track(ctx, t.execute, t.wid, t.workerInfo, sector, sealtasks.TTProveReplicaUpdate1, func() (storiface.CallID, error) { + return t.Worker.ProveReplicaUpdate1(ctx, sector, sectorKey, newSealed, newUnsealed) + }) +} + +func (t *trackedWorker) ProveReplicaUpdate2(ctx context.Context, sector storage.SectorRef, sectorKey, newSealed, newUnsealed cid.Cid, vanillaProofs storage.ReplicaVanillaProofs) (storiface.CallID, error) { + return t.tracker.track(ctx, t.execute, t.wid, t.workerInfo, sector, sealtasks.TTProveReplicaUpdate2, func() (storiface.CallID, error) { + return t.Worker.ProveReplicaUpdate2(ctx, sector, sectorKey, newSealed, newUnsealed, vanillaProofs) + }) +} + var _ Worker = &trackedWorker{} diff --git a/go.mod b/go.mod index ce52b7975c4..e0823094dfa 100644 --- a/go.mod +++ b/go.mod @@ -51,7 +51,7 @@ require ( github.com/filecoin-project/specs-actors/v5 v5.0.4 github.com/filecoin-project/specs-actors/v6 v6.0.1 github.com/filecoin-project/specs-actors/v7 v7.0.0-20211118013026-3dce48197cec - github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506 + github.com/filecoin-project/specs-storage v0.1.1-0.20211123153428-712cb8da07a3 github.com/filecoin-project/test-vectors/schema v0.0.5 github.com/gbrlsnchs/jwt/v3 v3.0.1 github.com/gdamore/tcell/v2 v2.2.0 @@ -156,7 +156,7 @@ require ( golang.org/x/sync v0.0.0-20210220032951-036812b2e83c golang.org/x/sys v0.0.0-20210917161153-d61c044b1678 golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac - golang.org/x/tools v0.1.5 + golang.org/x/tools v0.1.7 golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 gopkg.in/cheggaaa/pb.v1 v1.0.28 gotest.tools v2.2.0+incompatible diff --git a/go.sum b/go.sum index 06341ce01eb..e404ca72e56 100644 --- a/go.sum +++ b/go.sum @@ -396,8 +396,8 @@ github.com/filecoin-project/specs-actors/v6 v6.0.1/go.mod h1:V1AYfi5GkHXipx1mnVi github.com/filecoin-project/specs-actors/v7 v7.0.0-20211117170924-fd07a4c7dff9/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= github.com/filecoin-project/specs-actors/v7 v7.0.0-20211118013026-3dce48197cec h1:KV9vE+Sl2Y3qKsrpba4HcE7wHwK7v6O5U/S0xHbje6A= github.com/filecoin-project/specs-actors/v7 v7.0.0-20211118013026-3dce48197cec/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= -github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506 h1:Ur/l2+6qN+lQiqjozWWc5p9UDaAMDZKTlDS98oRnlIw= -github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506/go.mod h1:nJRRM7Aa9XVvygr3W9k6xGF46RWzr2zxF/iGoAIfA/g= +github.com/filecoin-project/specs-storage v0.1.1-0.20211123153428-712cb8da07a3 h1:FLPxD2ksWwGc/sbnFLWep2p8ViP93VCAwFaVxrtVCyo= +github.com/filecoin-project/specs-storage v0.1.1-0.20211123153428-712cb8da07a3/go.mod h1:nJRRM7Aa9XVvygr3W9k6xGF46RWzr2zxF/iGoAIfA/g= 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= @@ -1872,6 +1872,7 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de 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.0/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= @@ -2104,6 +2105,7 @@ golang.org/x/net v0.0.0-20210423184538-5f58ad60dda6/go.mod h1:OJAsFXCWl8Ukc7SiCT golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= 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-20210805182204-aaa1db679c0d/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 h1:R150MpwJIv1MpS0N/pc+NhTM8ajzvlmxlY5OYsrevXQ= golang.org/x/net v0.0.0-20210917221730-978cfadd31cf/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= @@ -2227,6 +2229,7 @@ golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/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-20210917161153-d61c044b1678 h1:J27LZFQBFoihqXoegpscI10HpjZ7B5WQLLKL2FZXQKw= golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -2318,8 +2321,9 @@ golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1-0.20210225150353-54dc8c5edb56/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= 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 h1:ouewzE6p+/VEB31YYnTbEJdi8pFqKp4P4n85vwo3DHA= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.7 h1:6j8CgantCy3yc8JGBqkDLMKWqZ0RDU2g1HVgacojGWQ= +golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= 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= From e16e9ad34393c5c97f18d895749ffc3a1c70a8c8 Mon Sep 17 00:00:00 2001 From: c r Date: Mon, 29 Nov 2021 17:26:47 -0500 Subject: [PATCH 012/393] reorder `transfer` checks so as to ensure sending more money than you have to yourself fails with an error (fixing issue 7596) PR #7637, also adds tests to make sure behavior is correct across versions. --- .circleci/config.yml | 5 ++ chain/vm/runtime.go | 2 +- chain/vm/vm.go | 93 ++++++++++++++++++++++---------- itests/self_sent_txn_test.go | 102 +++++++++++++++++++++++++++++++++++ 4 files changed, 174 insertions(+), 28 deletions(-) create mode 100644 itests/self_sent_txn_test.go diff --git a/.circleci/config.yml b/.circleci/config.yml index 30f2d5c01fd..d747e2cab2f 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -890,6 +890,11 @@ workflows: suite: itest-sector_terminate target: "./itests/sector_terminate_test.go" + - test: + name: test-itest-self_sent_txn + suite: itest-self_sent_txn + target: "./itests/self_sent_txn_test.go" + - test: name: test-itest-tape suite: itest-tape diff --git a/chain/vm/runtime.go b/chain/vm/runtime.go index 0dbe98224ee..548b0902806 100644 --- a/chain/vm/runtime.go +++ b/chain/vm/runtime.go @@ -332,7 +332,7 @@ func (rt *Runtime) DeleteActor(beneficiary address.Address) { } // Transfer the executing actor's balance to the beneficiary - if err := rt.vm.transfer(rt.Receiver(), beneficiary, act.Balance); err != nil { + if err := rt.vm.transfer(rt.Receiver(), beneficiary, act.Balance, rt.NetworkVersion()); err != nil { panic(aerrors.Fatalf("failed to transfer balance to beneficiary actor: %s", err)) } } diff --git a/chain/vm/vm.go b/chain/vm/vm.go index 36308fe03f6..16ad5e2a463 100644 --- a/chain/vm/vm.go +++ b/chain/vm/vm.go @@ -339,7 +339,7 @@ func (vm *VM) send(ctx context.Context, msg *types.Message, parent *Runtime, defer rt.chargeGasSafe(newGasCharge("OnMethodInvocationDone", 0, 0)) if types.BigCmp(msg.Value, types.NewInt(0)) != 0 { - if err := vm.transfer(msg.From, msg.To, msg.Value); err != nil { + if err := vm.transfer(msg.From, msg.To, msg.Value, vm.ntwkVersion(ctx, vm.blockHeight)); err != nil { return nil, aerrors.Wrap(err, "failed to transfer funds") } } @@ -869,32 +869,71 @@ func (vm *VM) incrementNonce(addr address.Address) error { }) } -func (vm *VM) transfer(from, to address.Address, amt types.BigInt) aerrors.ActorError { - if from == to { - return nil - } +func (vm *VM) transfer(from, to address.Address, amt types.BigInt, networkVersion network.Version) aerrors.ActorError { + var f *types.Actor + var fromID, toID address.Address + var err error + // switching the order around so that transactions for more than the balance sent to self fail + if networkVersion >= network.Version15 { + if amt.LessThan(types.NewInt(0)) { + return aerrors.Newf(exitcode.SysErrForbidden, "attempted to transfer negative value: %s", amt) + } - fromID, err := vm.cstate.LookupID(from) - if err != nil { - return aerrors.Fatalf("transfer failed when resolving sender address: %s", err) - } + fromID, err = vm.cstate.LookupID(from) + if err != nil { + return aerrors.Fatalf("transfer failed when resolving sender address: %s", err) + } - toID, err := vm.cstate.LookupID(to) - if err != nil { - return aerrors.Fatalf("transfer failed when resolving receiver address: %s", err) - } + f, err = vm.cstate.GetActor(fromID) + if err != nil { + return aerrors.Fatalf("transfer failed when retrieving sender actor: %s", err) + } - if fromID == toID { - return nil - } + if f.Balance.LessThan(amt) { + return aerrors.Newf(exitcode.SysErrInsufficientFunds, "transfer failed, insufficient balance in sender actor: %v", f.Balance) + } - if amt.LessThan(types.NewInt(0)) { - return aerrors.Newf(exitcode.SysErrForbidden, "attempted to transfer negative value: %s", amt) - } + if from == to { + log.Infow("sending to same address: noop", "from/to addr", from) + return nil + } - f, err := vm.cstate.GetActor(fromID) - if err != nil { - return aerrors.Fatalf("transfer failed when retrieving sender actor: %s", err) + toID, err = vm.cstate.LookupID(to) + if err != nil { + return aerrors.Fatalf("transfer failed when resolving receiver address: %s", err) + } + + if fromID == toID { + log.Infow("sending to same actor ID: noop", "from/to actor", fromID) + return nil + } + } else { + if from == to { + return nil + } + + fromID, err = vm.cstate.LookupID(from) + if err != nil { + return aerrors.Fatalf("transfer failed when resolving sender address: %s", err) + } + + toID, err = vm.cstate.LookupID(to) + if err != nil { + return aerrors.Fatalf("transfer failed when resolving receiver address: %s", err) + } + + if fromID == toID { + return nil + } + + if amt.LessThan(types.NewInt(0)) { + return aerrors.Newf(exitcode.SysErrForbidden, "attempted to transfer negative value: %s", amt) + } + + f, err = vm.cstate.GetActor(fromID) + if err != nil { + return aerrors.Fatalf("transfer failed when retrieving sender actor: %s", err) + } } t, err := vm.cstate.GetActor(toID) @@ -902,17 +941,17 @@ func (vm *VM) transfer(from, to address.Address, amt types.BigInt) aerrors.Actor return aerrors.Fatalf("transfer failed when retrieving receiver actor: %s", err) } - if err := deductFunds(f, amt); err != nil { + if err = deductFunds(f, amt); err != nil { return aerrors.Newf(exitcode.SysErrInsufficientFunds, "transfer failed when deducting funds (%s): %s", types.FIL(amt), err) } depositFunds(t, amt) - if err := vm.cstate.SetActor(fromID, f); err != nil { - return aerrors.Fatalf("transfer failed when setting receiver actor: %s", err) + if err = vm.cstate.SetActor(fromID, f); err != nil { + return aerrors.Fatalf("transfer failed when setting sender actor: %s", err) } - if err := vm.cstate.SetActor(toID, t); err != nil { - return aerrors.Fatalf("transfer failed when setting sender actor: %s", err) + if err = vm.cstate.SetActor(toID, t); err != nil { + return aerrors.Fatalf("transfer failed when setting receiver actor: %s", err) } return nil diff --git a/itests/self_sent_txn_test.go b/itests/self_sent_txn_test.go new file mode 100644 index 00000000000..846bcff05d8 --- /dev/null +++ b/itests/self_sent_txn_test.go @@ -0,0 +1,102 @@ +package itests + +import ( + "context" + "testing" + "time" + + "github.com/filecoin-project/go-state-types/network" + + "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/stretchr/testify/require" +) + + +// these tests check that the versioned code in vm.transfer is functioning correctly across versions! +// we reordered the checks to make sure that a transaction with too much money in it sent to yourself will fail instead of succeeding as a noop +// more info in this PR! https://github.com/filecoin-project/lotus/pull/7637 +func TestSelfSentTxnV15(t *testing.T) { + ctx := context.Background() + + kit.QuietMiningLogs() + + client15, _, ens := kit.EnsembleMinimal(t, kit.MockProofs(), kit.GenesisNetworkVersion(network.Version15)) + ens.InterconnectAll().BeginMining(10 * time.Millisecond) + + bal, err := client15.WalletBalance(ctx, client15.DefaultKey.Address) + require.NoError(t, err) + + // send self half of account balance + msgHalfBal := &types.Message{ + From: client15.DefaultKey.Address, + To: client15.DefaultKey.Address, + Value: big.Div(bal, big.NewInt(2)), + } + smHalfBal, err := client15.MpoolPushMessage(ctx, msgHalfBal, nil) + require.NoError(t, err) + mLookup, err := client15.StateWaitMsg(ctx, smHalfBal.Cid(), 3, api.LookbackNoLimit, true) + require.NoError(t, err) + require.Equal(t, exitcode.Ok, mLookup.Receipt.ExitCode) + + msgOverBal := &types.Message{ + From: client15.DefaultKey.Address, + To: client15.DefaultKey.Address, + Value: big.Mul(big.NewInt(2), bal), + GasLimit: 10000000000, + GasPremium: big.NewInt(10000000000), + GasFeeCap: big.NewInt(100000000000), + Nonce: 1, + } + smOverBal, err := client15.WalletSignMessage(ctx, client15.DefaultKey.Address, msgOverBal) + require.NoError(t, err) + smcid, err := client15.MpoolPush(ctx, smOverBal) + require.NoError(t, err) + mLookup, err = client15.StateWaitMsg(ctx, smcid, 3, api.LookbackNoLimit, true) + require.NoError(t, err) + require.Equal(t, exitcode.SysErrInsufficientFunds, mLookup.Receipt.ExitCode) +} + +func TestSelfSentTxnV14(t *testing.T) { + ctx := context.Background() + + kit.QuietMiningLogs() + + client14, _, ens := kit.EnsembleMinimal(t, kit.MockProofs(), kit.GenesisNetworkVersion(network.Version14)) + ens.InterconnectAll().BeginMining(10 * time.Millisecond) + + bal, err := client14.WalletBalance(ctx, client14.DefaultKey.Address) + require.NoError(t, err) + + // send self half of account balance + msgHalfBal := &types.Message{ + From: client14.DefaultKey.Address, + To: client14.DefaultKey.Address, + Value: big.Div(bal, big.NewInt(2)), + } + smHalfBal, err := client14.MpoolPushMessage(ctx, msgHalfBal, nil) + require.NoError(t, err) + mLookup, err := client14.StateWaitMsg(ctx, smHalfBal.Cid(), 3, api.LookbackNoLimit, true) + require.NoError(t, err) + require.Equal(t, exitcode.Ok, mLookup.Receipt.ExitCode) + + msgOverBal := &types.Message{ + From: client14.DefaultKey.Address, + To: client14.DefaultKey.Address, + Value: big.Mul(big.NewInt(2), bal), + GasLimit: 10000000000, + GasPremium: big.NewInt(10000000000), + GasFeeCap: big.NewInt(100000000000), + Nonce: 1, + } + smOverBal, err := client14.WalletSignMessage(ctx, client14.DefaultKey.Address, msgOverBal) + require.NoError(t, err) + smcid, err := client14.MpoolPush(ctx, smOverBal) + require.NoError(t, err) + mLookup, err = client14.StateWaitMsg(ctx, smcid, 3, api.LookbackNoLimit, true) + require.NoError(t, err) + require.Equal(t, exitcode.Ok, mLookup.Receipt.ExitCode) +} From f88fcdbcfc5c238f8bc6545a39c78c2e9a1df7d4 Mon Sep 17 00:00:00 2001 From: zenground0 Date: Tue, 30 Nov 2021 12:40:14 -0500 Subject: [PATCH 013/393] WIP --- extern/sector-storage/ffiwrapper/sealer_cgo.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/extern/sector-storage/ffiwrapper/sealer_cgo.go b/extern/sector-storage/ffiwrapper/sealer_cgo.go index 81dbfb42694..b9fad3a0418 100644 --- a/extern/sector-storage/ffiwrapper/sealer_cgo.go +++ b/extern/sector-storage/ffiwrapper/sealer_cgo.go @@ -628,9 +628,9 @@ func (sb *Sealer) ReplicaUpdate(ctx context.Context, sector storage.SectorRef, p } // XXX: we want to keep the stuff at the end - if err := os.Truncate(paths.Unsealed, sealedSize); err != nil { - return empty, xerrors.Errorf("failed to truncate unsealed data file: %w", err) - } + // if err := os.Truncate(paths.Unsealed, sealedSize); err != nil { + // return empty, xerrors.Errorf("failed to truncate unsealed data file: %w", err) + // } sealed, unsealed, err := ffi.SectorUpdate.EncodeInto(updateProofType, paths.Update, paths.UpdateCache, paths.Sealed, paths.Cache, paths.Unsealed, pieces) if err != nil { From 40d16a8f880395c7ce2b8cc62a2e4605e95e2c5d Mon Sep 17 00:00:00 2001 From: zenground0 Date: Tue, 30 Nov 2021 13:53:37 -0500 Subject: [PATCH 014/393] Review Response --- extern/filecoin-ffi | 2 +- extern/sector-storage/ffiwrapper/sealer_cgo.go | 6 +++--- extern/sector-storage/manager_test.go | 15 ++++++++++----- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/extern/filecoin-ffi b/extern/filecoin-ffi index b1a66cfd126..ce7083b3d18 160000 --- a/extern/filecoin-ffi +++ b/extern/filecoin-ffi @@ -1 +1 @@ -Subproject commit b1a66cfd12686a8af6030fccace49916849b1954 +Subproject commit ce7083b3d187ec3bc41a68ab66567bd4f3be6dfc diff --git a/extern/sector-storage/ffiwrapper/sealer_cgo.go b/extern/sector-storage/ffiwrapper/sealer_cgo.go index b9fad3a0418..81dbfb42694 100644 --- a/extern/sector-storage/ffiwrapper/sealer_cgo.go +++ b/extern/sector-storage/ffiwrapper/sealer_cgo.go @@ -628,9 +628,9 @@ func (sb *Sealer) ReplicaUpdate(ctx context.Context, sector storage.SectorRef, p } // XXX: we want to keep the stuff at the end - // if err := os.Truncate(paths.Unsealed, sealedSize); err != nil { - // return empty, xerrors.Errorf("failed to truncate unsealed data file: %w", err) - // } + if err := os.Truncate(paths.Unsealed, sealedSize); err != nil { + return empty, xerrors.Errorf("failed to truncate unsealed data file: %w", err) + } sealed, unsealed, err := ffi.SectorUpdate.EncodeInto(updateProofType, paths.Update, paths.UpdateCache, paths.Sealed, paths.Cache, paths.Unsealed, pieces) if err != nil { diff --git a/extern/sector-storage/manager_test.go b/extern/sector-storage/manager_test.go index e4ca355600a..77e185b9398 100644 --- a/extern/sector-storage/manager_test.go +++ b/extern/sector-storage/manager_test.go @@ -68,11 +68,16 @@ func newTestStorage(t *testing.T) *testStorage { } func (t testStorage) cleanup() { - // for _, path := range t.StoragePaths { - // if err := os.RemoveAll(path.Path); err != nil { - // fmt.Println("Cleanup error:", err) - // } - // } + noCleanup := os.Getenv("LOTUS_TEST_NO_CLEANUP") != "" + for _, path := range t.StoragePaths { + if noCleanup { + fmt.Printf("Not cleaning up test storage at %s\n", path) + continue + } + if err := os.RemoveAll(path.Path); err != nil { + fmt.Println("Cleanup error:", err) + } + } } func (t testStorage) GetStorage() (stores.StorageConfig, error) { From a09aa0aa72604f4e3c9eb8e0fb55de1883e30ec4 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Tue, 30 Nov 2021 18:24:34 -0500 Subject: [PATCH 015/393] Bump the master version to v1.13.3-dev --- build/version.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/version.go b/build/version.go index cf1cd9a52c1..3656dc9ad82 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.13.2-dev" +const BuildVersion = "1.13.3-dev" func UserVersion() string { if os.Getenv("LOTUS_VERSION_IGNORE_COMMIT") == "1" { From c3ecf8355d02a1d88ebb2e83ddc5bf66f668c989 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Tue, 30 Nov 2021 18:29:13 -0500 Subject: [PATCH 016/393] docs gen --- build/openrpc/full.json.gz | Bin 25688 -> 25688 bytes build/openrpc/miner.json.gz | Bin 11151 -> 11151 bytes build/openrpc/worker.json.gz | Bin 3401 -> 3401 bytes documentation/en/cli-lotus-miner.md | 2 +- documentation/en/cli-lotus-worker.md | 2 +- documentation/en/cli-lotus.md | 2 +- 6 files changed, 3 insertions(+), 3 deletions(-) diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 2e99a20e4253d51c68ce7090516a0d25c1fc2897..7d44a46a09de7e2f745e52919599de204a92b3a6 100644 GIT binary patch delta 25568 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 F{{t1e!yy0w delta 25569 zcmZUaQ*dQn8?9s8>e#luV>=z&wzFe*td4DWY}>YNtAo>D{pVbrS~sIsty(v8R?T;g zXN=WR(A81U_(aoYIwBktRq=gS55>3SgZ0r5&+#w{Olau)j5S4G@Sz1Vd!}}5#^(Mc7x?@xfTd8% zoc@C3-L|c+gK!HA26%%belr#We{+m+Km{ce=mUu)aR^+P<3M##UxPIbP(nJ62qqDQ zcm;I>Km*(S)9>CsUl*q785T5vGDza0S$A=E;LD4vP z(MP2yx(Z=ctAwb%VyVx$jyw`4A84PB&u!SlI*-}ETzAdiE?(?Tqd@st;P-`rfC##) z9?#M&A97h7Sgg38v~$l%DdFer)W@lOLi7<4K+cdEC`oW`%!-wZ#M;DZ>LsNXgaZ z&xFvqE#lDMHiP8<=|&%I%j5cP)5xR$4vOjec@C@ad@)-%U{D(Ggz*9A_fbhS+wu1O z3v~@|;rqtc!l#aGSnbfrxr;C|yPq3z7FceWB#)~ljZd+8$>Yfx`o;Cc&~4HuFEJ}3 z?8oIL(xCYh3HBeioV8RPror#D8DS38fb8RrAl9gn0qV7L_A~@g}A26g>M>Qgx0F3dMjpuzDVx00{nITZJrXVOYd9 z7iN*!1N7YpyZ|(cO>z7lRwOTX@W_0L$DlpkRK&<=Fo)PN9K-t9(g?>k*p}37$6UY+ z9qPutk<8@C{n`WJ+qyqTnbro?C=fv4hx@f;uRgL=iBcE5Rc&&~sJ-FDmtA$vuD3K{s*4*`|2 zjta1ST1?A^(J?w_C%l4)VloQJZEpvk!Y$x7&RiUj^fl`NFgyL32;y;3toX7vASKi3&6h#sr^b8AO?o&V~WeOIY~sr ze!qhjJ@J1A8BaCUbpnBp%#y0^xr9?cX!JfQoti)}{e(^Pk04emov zvFmghCioVc>h{l@7+Tj_V2KphBEUqO)Xx=9ApTe#+tAEUo~E>5eVL<;GM7dYde@a4 z4g#hZgr?-cCm~d0F)Y9&mt-3{{kuOP+##OoQD^i>WQ-%yM~$ilrZxXYn)4WL`vo3+ z)&%1~wk$cfAiiS8L)6B#Wz|2~{l9|Oj#J`kV^fkVm&2XZ(@CK?&s+`9rx z8r2B<=qL8`J40!o#?3bb9IFL3XRJHrSa84>jGq?}1J2mC`{2opM1jyjjY6cX6nhYXb81_WJz% z@d5hwZ0qP~FWe(-_mPboBJJcRR&ghnFu3p!(@0MwmST6nj6sc9m)svs12Oos^%0An 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

KB$Sd7U5LC7{>sC`yPDEiy&nLG)X9@XM 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 G^?v{mWpU^L diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index f02a58bec816a99be0c2ecb0df65dbffb92dce48..571159054d990e6f92087e375288003ed9e7a893 100644 GIT binary patch delta 21 ccmeAV?+>5Q%6NEV8>2SIqwGbdo7tHd0AlS2@c;k- delta 21 ccmeAV?+>5Q%GkWIjZvG!jPGmoW_Bh909rB!ApigX diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index c6640c1404d5b2c9b33a424be1d53ce9d07fb007..83d951047168368962397ea15eb0ea4bc68c1800 100644 GIT binary patch delta 22 ecmX>pby8|VBhy8_jm`UbI6l;Vcpby8|VBU7OM#^!xI9N8@#-3|*G7yx7o2g3jW diff --git a/documentation/en/cli-lotus-miner.md b/documentation/en/cli-lotus-miner.md index 9ae36b6176e..b448689edfb 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.13.2-dev + 1.13.3-dev COMMANDS: init Initialize a lotus miner repo diff --git a/documentation/en/cli-lotus-worker.md b/documentation/en/cli-lotus-worker.md index 09a93f09120..ac133f9086a 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.13.2-dev + 1.13.3-dev COMMANDS: run Start lotus worker diff --git a/documentation/en/cli-lotus.md b/documentation/en/cli-lotus.md index f3d2d6a06e9..eaefe25cea9 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.13.2-dev + 1.13.3-dev COMMANDS: daemon Start a lotus daemon process From 66c8c66f402a4b05d7de75fdf54c624da9c7a844 Mon Sep 17 00:00:00 2001 From: Travis Person Date: Mon, 29 Nov 2021 20:51:37 +0000 Subject: [PATCH 017/393] disable building of appimage on release appimage testing is currently broken due to a requirement to have access to /dev/snd, which is not present on the image we are using in circleci. --- .circleci/config.yml | 9 --------- .circleci/template.yml | 9 --------- 2 files changed, 18 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index e74cb773670..a4a88a09089 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -976,19 +976,10 @@ workflows: tags: only: - /^v\d+\.\d+\.\d+(-rc\d+)?$/ - - build-appimage: - filters: - branches: - ignore: - - /.*/ - tags: - only: - - /^v\d+\.\d+\.\d+(-rc\d+)?$/ - publish: requires: - build-all - build-macos - - build-appimage filters: branches: ignore: diff --git a/.circleci/template.yml b/.circleci/template.yml index 4b954391b5c..666ad39f5e8 100644 --- a/.circleci/template.yml +++ b/.circleci/template.yml @@ -816,19 +816,10 @@ workflows: tags: only: - /^v\d+\.\d+\.\d+(-rc\d+)?$/ - - build-appimage: - filters: - branches: - ignore: - - /.*/ - tags: - only: - - /^v\d+\.\d+\.\d+(-rc\d+)?$/ - publish: requires: - build-all - build-macos - - build-appimage filters: branches: ignore: From f3b691d6186e055714484bf0faa239bb618fb1ef Mon Sep 17 00:00:00 2001 From: hannahhoward Date: Wed, 1 Dec 2021 16:07:56 -0800 Subject: [PATCH 018/393] feat(tracing): switch to OpenTelemetry Switch the underlying tracing library to OpenTelemetry, with a bridge to OpenCensus for compatibility --- cmd/lotus-miner/main.go | 6 +-- cmd/lotus/main.go | 4 +- go.mod | 6 ++- go.sum | 27 ++++++++++++-- lib/tracing/setup.go | 81 +++++++++++++++++++++++------------------ 5 files changed, 79 insertions(+), 45 deletions(-) diff --git a/cmd/lotus-miner/main.go b/cmd/lotus-miner/main.go index 110748f482d..497a9e9fb89 100644 --- a/cmd/lotus-miner/main.go +++ b/cmd/lotus-miner/main.go @@ -7,7 +7,6 @@ import ( "github.com/fatih/color" logging "github.com/ipfs/go-log/v2" "github.com/urfave/cli/v2" - "go.opencensus.io/trace" "golang.org/x/xerrors" cliutil "github.com/filecoin-project/lotus/cli/util" @@ -55,10 +54,11 @@ func main() { lcli.WithCategory("storage", sealingCmd), lcli.WithCategory("retrieval", piecesCmd), } + jaeger := tracing.SetupJaegerTracing("lotus") defer func() { if jaeger != nil { - jaeger.Flush() + _ = jaeger.ForceFlush(context.Background()) } }() @@ -66,7 +66,7 @@ func main() { cmd := cmd originBefore := cmd.Before cmd.Before = func(cctx *cli.Context) error { - trace.UnregisterExporter(jaeger) + _ = jaeger.Shutdown(cctx.Context) jaeger = tracing.SetupJaegerTracing("lotus/" + cmd.Name) if cctx.IsSet("color") { diff --git a/cmd/lotus/main.go b/cmd/lotus/main.go index 7aa2e704e32..ddd695e688a 100644 --- a/cmd/lotus/main.go +++ b/cmd/lotus/main.go @@ -39,7 +39,7 @@ func main() { jaeger := tracing.SetupJaegerTracing("lotus") defer func() { if jaeger != nil { - jaeger.Flush() + _ = jaeger.ForceFlush(context.Background()) } }() @@ -47,7 +47,7 @@ func main() { cmd := cmd originBefore := cmd.Before cmd.Before = func(cctx *cli.Context) error { - trace.UnregisterExporter(jaeger) + _ = jaeger.Shutdown(cctx.Context) jaeger = tracing.SetupJaegerTracing("lotus/" + cmd.Name) if originBefore != nil { diff --git a/go.mod b/go.mod index ba29f8cdf8d..cf234250a7f 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,6 @@ module github.com/filecoin-project/lotus go 1.16 require ( - contrib.go.opencensus.io/exporter/jaeger v0.2.1 contrib.go.opencensus.io/exporter/prometheus v0.4.0 github.com/BurntSushi/toml v0.4.1 github.com/GeertJohan/go.rice v1.0.2 @@ -139,6 +138,7 @@ require ( github.com/streadway/quantile v0.0.0-20150917103942-b0c588724d25 github.com/stretchr/testify v1.7.0 github.com/syndtr/goleveldb v1.0.0 + github.com/uber/jaeger-client-go v2.25.0+incompatible // indirect github.com/urfave/cli/v2 v2.2.0 github.com/whyrusleeping/bencher v0.0.0-20190829221104-bb6607aa8bba github.com/whyrusleeping/cbor-gen v0.0.0-20210713220151-be142a5ae1a8 @@ -147,6 +147,10 @@ require ( github.com/whyrusleeping/pubsub v0.0.0-20190708150250-92bcb0691325 github.com/xorcare/golden v0.6.1-0.20191112154924-b87f686d7542 go.opencensus.io v0.23.0 + go.opentelemetry.io/otel v1.2.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/dig v1.10.0 // indirect go.uber.org/fx v1.9.0 go.uber.org/multierr v1.7.0 diff --git a/go.sum b/go.sum index c0ceb01ae82..905a758d803 100644 --- a/go.sum +++ b/go.sum @@ -32,8 +32,6 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -contrib.go.opencensus.io/exporter/jaeger v0.2.1 h1:yGBYzYMewVL0yO9qqJv3Z5+IRhPdU7e9o/2oKpX4YvI= -contrib.go.opencensus.io/exporter/jaeger v0.2.1/go.mod h1:Y8IsLgdxqh1QxYxPC5IgXVmBaeLUeQFfBeBi9PbeZd0= contrib.go.opencensus.io/exporter/prometheus v0.4.0 h1:0QfIkj9z/iVZgK31D9H9ohjjIDApI2GOPScCKwxedbs= contrib.go.opencensus.io/exporter/prometheus v0.4.0/go.mod h1:o7cosnyfuPVK0tB8q0QmaQNhGnptITnPQB+z1+qeFB0= dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU= @@ -120,8 +118,9 @@ github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NR github.com/benbjohnson/clock v1.0.1/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= github.com/benbjohnson/clock v1.0.2/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= -github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/benbjohnson/clock v1.2.0 h1:9Re3G2TWxkE06LdMWMpcY6KV81GLXMGiYpPYUPkFAws= +github.com/benbjohnson/clock v1.2.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -1758,6 +1757,7 @@ github.com/streadway/handy v0.0.0-20200128134331-0f66f006fb2e/go.mod h1:qNTQ5P5J github.com/streadway/quantile v0.0.0-20150917103942-b0c588724d25 h1:7z3LSn867ex6VSaahyKadf4WtSsJIgne6A1WLOAGM8A= github.com/streadway/quantile v0.0.0-20150917103942-b0c588724d25/go.mod h1:lbP8tGiBjZ5YWIc2fzuRpTaz0b/53vT6PEs3QuAWzuU= 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/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -1899,13 +1899,32 @@ go.opencensus.io v0.22.1/go.mod h1:Ap50jQcDJrx6rB6VgeeFPtuPIf3wMRvRfrfYDO6+BmA= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.6-0.20201102222123-380f4078db9f/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= 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 h1:YOQDvxO1FayUcT9MIhJhgMyNO1WqoduiyvQHzGN0kUQ= +go.opentelemetry.io/otel v1.2.0/go.mod h1:aT17Fk0Z1Nor9e0uisf98LrntPGMnk4frBO9+dkf69I= +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= +go.opentelemetry.io/otel/exporters/jaeger v1.2.0/go.mod h1:KJLFbEMKTNPIfOxcg/WikIozEoKcPgJRz3Ce1vLlM8E= +go.opentelemetry.io/otel/internal/metric v0.25.0 h1:w/7RXe16WdPylaIXDgcYM6t/q0K5lXgSdZOEbIEyliE= +go.opentelemetry.io/otel/internal/metric v0.25.0/go.mod h1:Nhuw26QSX7d6n4duoqAFi5KOQR4AuzyMcl5eXOgwxtc= go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= +go.opentelemetry.io/otel/metric v0.25.0 h1:7cXOnCADUsR3+EOqxPaSKwhEuNu0gz/56dRN1hpIdKw= +go.opentelemetry.io/otel/metric v0.25.0/go.mod h1:E884FSpQfnJOMMUaq+05IWlJ4rjZpk2s/F1Ju+TEEm8= go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= +go.opentelemetry.io/otel/sdk v1.2.0 h1:wKN260u4DesJYhyjxDa7LRFkuhH7ncEVKU37LWcyNIo= +go.opentelemetry.io/otel/sdk v1.2.0/go.mod h1:jNN8QtpvbsKhgaC6V5lHiejMoKD+V8uadoSafgHPx1U= +go.opentelemetry.io/otel/sdk/export/metric v0.25.0 h1:6UjAFmVB5Fza3K5qUJpYWGrk8QMPIqlSnya5FI46VBY= +go.opentelemetry.io/otel/sdk/export/metric v0.25.0/go.mod h1:Ej7NOa+WpN49EIcr1HMUYRvxXXCCnQCg2+ovdt2z8Pk= +go.opentelemetry.io/otel/sdk/metric v0.25.0 h1:J+Ta+4IAA5W9AdWhGQLfciEpavBqqSkBzTDeYvJLFNU= +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 h1:Ys3iqbqZhcf28hHzrm5WAquMkDHNZTUkw7KHbuNjej0= +go.opentelemetry.io/otel/trace v1.2.0/go.mod h1:N5FLswTubnxKxOJHM7XZC074qpeEdLy3CgAVsdMucK0= 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= @@ -2218,6 +2237,7 @@ golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7w 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= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210511113859-b0526f3d8744/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -2346,7 +2366,6 @@ google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/ google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0 h1:yfrXXP61wVuLb0vBcG6qaOoIoqYEzOQS8jum51jkv2w= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= diff --git a/lib/tracing/setup.go b/lib/tracing/setup.go index b8c0399ad9d..1a2d8128e62 100644 --- a/lib/tracing/setup.go +++ b/lib/tracing/setup.go @@ -4,9 +4,15 @@ import ( "os" "strings" - "contrib.go.opencensus.io/exporter/jaeger" + octrace "go.opencensus.io/trace" + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/bridge/opencensus" + "go.opentelemetry.io/otel/exporters/jaeger" + "go.opentelemetry.io/otel/sdk/resource" + tracesdk "go.opentelemetry.io/otel/sdk/trace" + semconv "go.opentelemetry.io/otel/semconv/v1.7.0" + logging "github.com/ipfs/go-log/v2" - "go.opencensus.io/trace" ) var log = logging.Logger("tracing") @@ -14,7 +20,6 @@ var log = logging.Logger("tracing") const ( // environment variable names envCollectorEndpoint = "LOTUS_JAEGER_COLLECTOR_ENDPOINT" - envAgentEndpoint = "LOTUS_JAEGER_AGENT_ENDPOINT" envAgentHost = "LOTUS_JAEGER_AGENT_HOST" envAgentPort = "LOTUS_JAEGER_AGENT_PORT" envJaegerUser = "LOTUS_JAEGER_USERNAME" @@ -26,54 +31,60 @@ const ( // The agent endpoint is a thrift/udp protocol and should be given // as a string like "hostname:port". The agent can also be configured // with separate host and port variables. -func jaegerOptsFromEnv(opts *jaeger.Options) bool { +func jaegerOptsFromEnv() jaeger.EndpointOption { var e string var ok bool - if e, ok = os.LookupEnv(envJaegerUser); ok { - if p, ok := os.LookupEnv(envJaegerCred); ok { - opts.Username = e - opts.Password = p - } else { - log.Warn("jaeger username supplied with no password. authentication will not be used.") - } - } + if e, ok = os.LookupEnv(envCollectorEndpoint); ok { - opts.CollectorEndpoint = e + options := []jaeger.CollectorEndpointOption{jaeger.WithEndpoint(e)} + if u, ok := os.LookupEnv(envJaegerUser); ok { + if p, ok := os.LookupEnv(envJaegerCred); ok { + options = append(options, jaeger.WithUsername(u)) + options = append(options, jaeger.WithPassword(p)) + } else { + log.Warn("jaeger username supplied with no password. authentication will not be used.") + } + } log.Infof("jaeger tracess will send to collector %s", e) - return true - } - if e, ok = os.LookupEnv(envAgentEndpoint); ok { - log.Infof("jaeger traces will be sent to agent %s", e) - opts.AgentEndpoint = e - return true + return jaeger.WithCollectorEndpoint(options...) } + if e, ok = os.LookupEnv(envAgentHost); ok { + options := []jaeger.AgentEndpointOption{jaeger.WithAgentHost(e)} + var ep string if p, ok := os.LookupEnv(envAgentPort); ok { - opts.AgentEndpoint = strings.Join([]string{e, p}, ":") + options = append(options, jaeger.WithAgentPort(p)) + ep = strings.Join([]string{e, p}, ":") } else { - opts.AgentEndpoint = strings.Join([]string{e, "6831"}, ":") + ep = strings.Join([]string{e, "6831"}, ":") } - log.Infof("jaeger traces will be sent to agent %s", opts.AgentEndpoint) - return true + log.Infof("jaeger traces will be sent to agent %s", ep) + return jaeger.WithAgentEndpoint(options...) } - return false + return nil } -func SetupJaegerTracing(serviceName string) *jaeger.Exporter { - opts := jaeger.Options{} - if !jaegerOptsFromEnv(&opts) { +func SetupJaegerTracing(serviceName string) *tracesdk.TracerProvider { + jaegerEndpoint := jaegerOptsFromEnv() + if jaegerEndpoint == nil { return nil } - opts.ServiceName = serviceName - je, err := jaeger.NewExporter(opts) + je, err := jaeger.New(jaegerEndpoint) if err != nil { log.Errorw("failed to create the jaeger exporter", "error", err) return nil } - - trace.RegisterExporter(je) - trace.ApplyConfig(trace.Config{ - DefaultSampler: trace.AlwaysSample(), - }) - return je + tp := tracesdk.NewTracerProvider( + // Always be sure to batch in production. + tracesdk.WithBatcher(je), + // Record information about this application in an Resource. + tracesdk.WithResource(resource.NewWithAttributes( + semconv.SchemaURL, + semconv.ServiceNameKey.String(serviceName), + )), + ) + otel.SetTracerProvider(tp) + tracer := tp.Tracer(serviceName) + octrace.DefaultTracer = opencensus.NewTracer(tracer) + return tp } From bfd1099ef3ff724bd1f68db591438f07953d9a80 Mon Sep 17 00:00:00 2001 From: hannahhoward Date: Wed, 1 Dec 2021 18:53:00 -0800 Subject: [PATCH 019/393] fix(main): fix bug in startup when tracing is not present --- cmd/lotus-miner/main.go | 4 +++- cmd/lotus/main.go | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/cmd/lotus-miner/main.go b/cmd/lotus-miner/main.go index 497a9e9fb89..57b5d8a3ee9 100644 --- a/cmd/lotus-miner/main.go +++ b/cmd/lotus-miner/main.go @@ -66,7 +66,9 @@ func main() { cmd := cmd originBefore := cmd.Before cmd.Before = func(cctx *cli.Context) error { - _ = jaeger.Shutdown(cctx.Context) + if jaeger != nil { + _ = jaeger.Shutdown(cctx.Context) + } jaeger = tracing.SetupJaegerTracing("lotus/" + cmd.Name) if cctx.IsSet("color") { diff --git a/cmd/lotus/main.go b/cmd/lotus/main.go index ddd695e688a..c19b9fce4df 100644 --- a/cmd/lotus/main.go +++ b/cmd/lotus/main.go @@ -47,7 +47,9 @@ func main() { cmd := cmd originBefore := cmd.Before cmd.Before = func(cctx *cli.Context) error { - _ = jaeger.Shutdown(cctx.Context) + if jaeger != nil { + _ = jaeger.Shutdown(cctx.Context) + } jaeger = tracing.SetupJaegerTracing("lotus/" + cmd.Name) if originBefore != nil { From c2437b7bf2a24d4244a00945d9ebfe304cf05cb6 Mon Sep 17 00:00:00 2001 From: Jiaying Wang <42981373+jennijuju@users.noreply.github.com> Date: Wed, 1 Dec 2021 22:37:22 -0500 Subject: [PATCH 020/393] Create pull_request_template.md This is the very first iteration of the lotus PR template. The goal of adding PR template is to standardize PR requests and encourage contributors to: - come up with good PR descriptions to give code reviewers a clear overview of what's in the PR - have a clear PR title as lotus generates a change log based on it - check that tests and documentation for the codes that changed are icnluded The PR type follows the https://www.conventionalcommits.org/en/v1.0.0-beta.2/. The [contribution guideline](https://github.com/filecoin-project/lotus#contribute) should be updated with how to create a pr after the template is accepted. --- .github/pull_request_template.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 .github/pull_request_template.md diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 00000000000..6984f6ffd3d --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,20 @@ +## Related Issues + + +## Proposed Changes + + + +## Additional Info + + +## Checklist + +Before you mark the PR ready for review, please make sure that: +- [ ] The PR title is in the form of of `: <#issue number> : ` + - example: ` fix: #1234 mempool: Introduce a cache for valid signatures` + - `PR type`: _fix_, _feat_, _BREAKING CHANGE_, _build_, _chore_, _ci_, _docs_, _perf_, _refactor_, _revert_, _style_, _test_ + - `area`: _api_, _chain_, _state_, _vm_, _data transfer_, _market_, _mempool_, _message_, _block production_, _multisig_, _networking_, _paychan_, _proving_, _sealing_, _wallet_ +- [ ] This PR has tests for new functionality or change in behaviour +- [ ] If new user-facing features are introduced, clear usage guidelines and / or documentation updates should be included in https://lotus.filecoin.io or [Discussion Tutorials.](https://github.com/filecoin-project/lotus/discussions/categories/tutorials) +- [ ] CI is green From 05c132588519be2ac190a3f74ea6584c04945dca Mon Sep 17 00:00:00 2001 From: vyzo Date: Fri, 3 Dec 2021 11:50:35 +0200 Subject: [PATCH 021/393] add logic for supressing compaction near upgrade boundaries --- blockstore/splitstore/splitstore.go | 32 ++++++++++++++++++++- blockstore/splitstore/splitstore_compact.go | 16 +++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/blockstore/splitstore/splitstore.go b/blockstore/splitstore/splitstore.go index 0e34fe952cf..e0366512f52 100644 --- a/blockstore/splitstore/splitstore.go +++ b/blockstore/splitstore/splitstore.go @@ -18,6 +18,8 @@ import ( "github.com/filecoin-project/go-state-types/abi" bstore "github.com/filecoin-project/lotus/blockstore" + "github.com/filecoin-project/lotus/build" + "github.com/filecoin-project/lotus/chain/stmgr" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/metrics" @@ -47,6 +49,9 @@ var ( enableDebugLog = false // set this to true if you want to track origin stack traces in the write log enableDebugLogWriteTraces = false + + // upgradeBoundary is the boundary before and after an upgrade where we supress compaction + upgradeBoundary = build.Finality ) func init() { @@ -98,6 +103,12 @@ type ChainAccessor interface { SubscribeHeadChanges(change func(revert []*types.TipSet, apply []*types.TipSet) error) } +// upgradeRange is a precomputed epoch range during which we shouldn't compact so as to not +// interfere with an upgrade +type upgradeRange struct { + start, end abi.ChainEpoch +} + // hotstore is the interface that must be satisfied by the hot blockstore; it is an extension // of the Blockstore interface with the traits we need for compaction. type hotstore interface { @@ -125,6 +136,8 @@ type SplitStore struct { cold bstore.Blockstore hot hotstore + upgrades []upgradeRange + markSetEnv MarkSetEnv markSetSize int64 @@ -463,10 +476,27 @@ func (s *SplitStore) isWarm() bool { } // State tracking -func (s *SplitStore) Start(chain ChainAccessor) error { +func (s *SplitStore) Start(chain ChainAccessor, us stmgr.UpgradeSchedule) error { s.chain = chain curTs := chain.GetHeaviestTipSet() + // precompute the upgrade boundaries + s.upgrades = make([]upgradeRange, 0, len(us)) + for _, upgrade := range us { + boundary := upgrade.Height + for _, pre := range upgrade.PreMigrations { + preMigrationBoundary := upgrade.Height - pre.StartWithin + if preMigrationBoundary < boundary { + boundary = preMigrationBoundary + } + } + + upgradeStart := boundary - upgradeBoundary + upgradeEnd := upgrade.Height + upgradeBoundary + + s.upgrades = append(s.upgrades, upgradeRange{start: upgradeStart, end: upgradeEnd}) + } + // should we warmup warmup := false diff --git a/blockstore/splitstore/splitstore_compact.go b/blockstore/splitstore/splitstore_compact.go index 4ff38a5fb94..3a1fda2026c 100644 --- a/blockstore/splitstore/splitstore_compact.go +++ b/blockstore/splitstore/splitstore_compact.go @@ -99,6 +99,12 @@ func (s *SplitStore) HeadChange(_, apply []*types.TipSet) error { return nil } + if s.isNearUpgrade(epoch) { + // we are near an upgrade epoch, supress compaction + atomic.StoreInt32(&s.compacting, 0) + return nil + } + if epoch-s.baseEpoch > CompactionThreshold { // it's time to compact -- prepare the transaction and go! s.beginTxnProtect() @@ -121,6 +127,16 @@ func (s *SplitStore) HeadChange(_, apply []*types.TipSet) error { return nil } +func (s *SplitStore) isNearUpgrade(epoch abi.ChainEpoch) bool { + for _, upgrade := range s.upgrades { + if epoch >= upgrade.start && epoch <= upgrade.end { + return true + } + } + + return false +} + // transactionally protect incoming tipsets func (s *SplitStore) protectTipSets(apply []*types.TipSet) { s.txnLk.RLock() From 6ce5879071a5f206623c4e822acab4ad69a8561f Mon Sep 17 00:00:00 2001 From: vyzo Date: Fri, 3 Dec 2021 12:05:15 +0200 Subject: [PATCH 022/393] add unit test for compaction supression --- blockstore/splitstore/splitstore_test.go | 137 ++++++++++++++++++++++- 1 file changed, 136 insertions(+), 1 deletion(-) diff --git a/blockstore/splitstore/splitstore_test.go b/blockstore/splitstore/splitstore_test.go index df9984d4117..6d8ff465f7b 100644 --- a/blockstore/splitstore/splitstore_test.go +++ b/blockstore/splitstore/splitstore_test.go @@ -11,6 +11,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/lotus/blockstore" + "github.com/filecoin-project/lotus/chain/stmgr" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/chain/types/mock" @@ -90,7 +91,7 @@ func testSplitStore(t *testing.T, cfg *Config) { return protect(protected.Cid()) }) - err = ss.Start(chain) + err = ss.Start(chain, nil) if err != nil { t.Fatal(err) } @@ -220,6 +221,140 @@ func TestSplitStoreCompactionWithBadger(t *testing.T) { testSplitStore(t, &Config{MarkSetType: "badger"}) } +func TestSplitStoreSupressCompactionNearUpgrade(t *testing.T) { + chain := &mockChain{t: t} + + // the myriads of stores + ds := dssync.MutexWrap(datastore.NewMapDatastore()) + hot := newMockStore() + cold := newMockStore() + + // this is necessary to avoid the garbage mock puts in the blocks + garbage := blocks.NewBlock([]byte{1, 2, 3}) + err := cold.Put(garbage) + if err != nil { + t.Fatal(err) + } + + // genesis + genBlock := mock.MkBlock(nil, 0, 0) + genBlock.Messages = garbage.Cid() + genBlock.ParentMessageReceipts = garbage.Cid() + genBlock.ParentStateRoot = garbage.Cid() + genBlock.Timestamp = uint64(time.Now().Unix()) + + genTs := mock.TipSet(genBlock) + chain.push(genTs) + + // put the genesis block to cold store + blk, err := genBlock.ToStorageBlock() + if err != nil { + t.Fatal(err) + } + + err = cold.Put(blk) + if err != nil { + t.Fatal(err) + } + + // open the splitstore + ss, err := Open("", ds, hot, cold, &Config{MarkSetType: "map"}) + if err != nil { + t.Fatal(err) + } + defer ss.Close() //nolint + + // create an upgrade schedule that will supress compaction during the test + upgradeBoundary = 0 + upgrade := stmgr.Upgrade{ + Height: 10, + PreMigrations: []stmgr.PreMigration{{StartWithin: 10}}, + } + + err = ss.Start(chain, []stmgr.Upgrade{upgrade}) + if err != nil { + t.Fatal(err) + } + + mkBlock := func(curTs *types.TipSet, i int, stateRoot blocks.Block) *types.TipSet { + blk := mock.MkBlock(curTs, uint64(i), uint64(i)) + + blk.Messages = garbage.Cid() + blk.ParentMessageReceipts = garbage.Cid() + blk.ParentStateRoot = stateRoot.Cid() + blk.Timestamp = uint64(time.Now().Unix()) + + sblk, err := blk.ToStorageBlock() + if err != nil { + t.Fatal(err) + } + err = ss.Put(stateRoot) + if err != nil { + t.Fatal(err) + } + err = ss.Put(sblk) + if err != nil { + t.Fatal(err) + } + ts := mock.TipSet(blk) + chain.push(ts) + + return ts + } + + waitForCompaction := func() { + for atomic.LoadInt32(&ss.compacting) == 1 { + time.Sleep(100 * time.Millisecond) + } + } + + curTs := genTs + for i := 1; i < 10; i++ { + stateRoot := blocks.NewBlock([]byte{byte(i), 3, 3, 7}) + curTs = mkBlock(curTs, i, stateRoot) + waitForCompaction() + } + + countBlocks := func(bs blockstore.Blockstore) int { + count := 0 + _ = bs.(blockstore.BlockstoreIterator).ForEachKey(func(_ cid.Cid) error { + count++ + return nil + }) + return count + } + + // we should not have compacted due to suppression and everything should still be hot + hotCnt := countBlocks(hot) + coldCnt := countBlocks(cold) + + if hotCnt != 20 { + t.Errorf("expected %d blocks, but got %d", 20, hotCnt) + } + + if coldCnt != 2 { + t.Errorf("expected %d blocks, but got %d", 2, coldCnt) + } + + // put some more blocks, now we should compact + for i := 10; i < 20; i++ { + stateRoot := blocks.NewBlock([]byte{byte(i), 3, 3, 7}) + curTs = mkBlock(curTs, i, stateRoot) + waitForCompaction() + } + + hotCnt = countBlocks(hot) + coldCnt = countBlocks(cold) + + if hotCnt != 24 { + t.Errorf("expected %d blocks, but got %d", 24, hotCnt) + } + + if coldCnt != 18 { + t.Errorf("expected %d blocks, but got %d", 18, coldCnt) + } +} + type mockChain struct { t testing.TB From 5d6398f20e901657b3244c90e7465173f04484ec Mon Sep 17 00:00:00 2001 From: vyzo Date: Fri, 3 Dec 2021 12:11:54 +0200 Subject: [PATCH 023/393] hook the upgrade schedule to splitstore start --- node/modules/chain.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/node/modules/chain.go b/node/modules/chain.go index 3518c3b296a..b5be24d5d00 100644 --- a/node/modules/chain.go +++ b/node/modules/chain.go @@ -78,6 +78,7 @@ func ChainStore(lc fx.Lifecycle, ds dtypes.MetadataDS, basebs dtypes.BaseBlockstore, weight store.WeightFunc, + us stmgr.UpgradeSchedule, j journal.Journal) *store.ChainStore { chain := store.NewChainStore(cbs, sbs, ds, weight, j) @@ -89,7 +90,7 @@ func ChainStore(lc fx.Lifecycle, var startHook func(context.Context) error if ss, ok := basebs.(*splitstore.SplitStore); ok { startHook = func(_ context.Context) error { - err := ss.Start(chain) + err := ss.Start(chain, us) if err != nil { err = xerrors.Errorf("error starting splitstore: %w", err) } From 489782e21bfac677377329dce1bbf4b42a396b0b Mon Sep 17 00:00:00 2001 From: vyzo Date: Fri, 3 Dec 2021 12:15:28 +0200 Subject: [PATCH 024/393] satisfy the spellchecker that masquarades as a linter --- blockstore/splitstore/splitstore.go | 2 +- blockstore/splitstore/splitstore_compact.go | 2 +- blockstore/splitstore/splitstore_test.go | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/blockstore/splitstore/splitstore.go b/blockstore/splitstore/splitstore.go index e0366512f52..145e31d7a08 100644 --- a/blockstore/splitstore/splitstore.go +++ b/blockstore/splitstore/splitstore.go @@ -50,7 +50,7 @@ var ( // set this to true if you want to track origin stack traces in the write log enableDebugLogWriteTraces = false - // upgradeBoundary is the boundary before and after an upgrade where we supress compaction + // upgradeBoundary is the boundary before and after an upgrade where we suppress compaction upgradeBoundary = build.Finality ) diff --git a/blockstore/splitstore/splitstore_compact.go b/blockstore/splitstore/splitstore_compact.go index 3a1fda2026c..04c2562fa35 100644 --- a/blockstore/splitstore/splitstore_compact.go +++ b/blockstore/splitstore/splitstore_compact.go @@ -100,7 +100,7 @@ func (s *SplitStore) HeadChange(_, apply []*types.TipSet) error { } if s.isNearUpgrade(epoch) { - // we are near an upgrade epoch, supress compaction + // we are near an upgrade epoch, suppress compaction atomic.StoreInt32(&s.compacting, 0) return nil } diff --git a/blockstore/splitstore/splitstore_test.go b/blockstore/splitstore/splitstore_test.go index 6d8ff465f7b..f9111a979d2 100644 --- a/blockstore/splitstore/splitstore_test.go +++ b/blockstore/splitstore/splitstore_test.go @@ -221,7 +221,7 @@ func TestSplitStoreCompactionWithBadger(t *testing.T) { testSplitStore(t, &Config{MarkSetType: "badger"}) } -func TestSplitStoreSupressCompactionNearUpgrade(t *testing.T) { +func TestSplitStoreSuppressCompactionNearUpgrade(t *testing.T) { chain := &mockChain{t: t} // the myriads of stores @@ -264,7 +264,7 @@ func TestSplitStoreSupressCompactionNearUpgrade(t *testing.T) { } defer ss.Close() //nolint - // create an upgrade schedule that will supress compaction during the test + // create an upgrade schedule that will suppress compaction during the test upgradeBoundary = 0 upgrade := stmgr.Upgrade{ Height: 10, From 727765b248ad0a07e42892f80cfbcb8b5a99db44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 3 Dec 2021 12:33:23 +0100 Subject: [PATCH 025/393] Command to list active sector locks --- api/api_storage.go | 1 + api/docgen/docgen.go | 7 ++++ api/proxy_gen.go | 13 +++++++ build/openrpc/full.json.gz | Bin 25688 -> 25690 bytes build/openrpc/miner.json.gz | Bin 11151 -> 11267 bytes build/openrpc/worker.json.gz | Bin 3401 -> 3402 bytes cmd/lotus-miner/storage.go | 41 ++++++++++++++++++++ documentation/en/api-v0-methods-miner.md | 32 +++++++++++++++ documentation/en/cli-lotus-miner.md | 14 +++++++ extern/sector-storage/stores/index.go | 1 + extern/sector-storage/stores/index_locks.go | 30 ++++++++++++++ extern/sector-storage/stores/mocks/index.go | 15 +++++++ extern/sector-storage/storiface/storage.go | 16 ++++++++ 13 files changed, 170 insertions(+) diff --git a/api/api_storage.go b/api/api_storage.go index 8cca2aa5be5..4e09ecfa5ba 100644 --- a/api/api_storage.go +++ b/api/api_storage.go @@ -145,6 +145,7 @@ type StorageMiner interface { StorageLock(ctx context.Context, sector abi.SectorID, read storiface.SectorFileType, write storiface.SectorFileType) error //perm:admin StorageTryLock(ctx context.Context, sector abi.SectorID, read storiface.SectorFileType, write storiface.SectorFileType) (bool, error) //perm:admin StorageList(ctx context.Context) (map[stores.ID][]stores.Decl, error) //perm:admin + StorageGetLocks(ctx context.Context) (storiface.SectorLocks, error) //perm:admin StorageLocal(ctx context.Context) (map[stores.ID]string, error) //perm:admin StorageStat(ctx context.Context, id stores.ID) (fsutil.FsStat, error) //perm:admin diff --git a/api/docgen/docgen.go b/api/docgen/docgen.go index 5478e5ea6a5..5d87e9d20c2 100644 --- a/api/docgen/docgen.go +++ b/api/docgen/docgen.go @@ -254,6 +254,13 @@ func init() { api.SectorState(sealing.Proving): 120, }) addExample([]abi.SectorNumber{123, 124}) + addExample([]storiface.SectorLock{ + { + Sector: abi.SectorID{Number: 123, Miner: 1000}, + Write: [storiface.FileTypes]uint{0, 0, 1}, + Read: [storiface.FileTypes]uint{2, 3, 0}, + }, + }) // worker specific addExample(storiface.AcquireMove) diff --git a/api/proxy_gen.go b/api/proxy_gen.go index feb08531f4f..88ff4cd15d7 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -794,6 +794,8 @@ type StorageMinerStruct struct { StorageFindSector func(p0 context.Context, p1 abi.SectorID, p2 storiface.SectorFileType, p3 abi.SectorSize, p4 bool) ([]stores.SectorStorageInfo, error) `perm:"admin"` + StorageGetLocks func(p0 context.Context) (storiface.SectorLocks, error) `perm:"admin"` + StorageInfo func(p0 context.Context, p1 stores.ID) (stores.StorageInfo, error) `perm:"admin"` StorageList func(p0 context.Context) (map[stores.ID][]stores.Decl, error) `perm:"admin"` @@ -4647,6 +4649,17 @@ func (s *StorageMinerStub) StorageFindSector(p0 context.Context, p1 abi.SectorID return *new([]stores.SectorStorageInfo), ErrNotSupported } +func (s *StorageMinerStruct) StorageGetLocks(p0 context.Context) (storiface.SectorLocks, error) { + if s.Internal.StorageGetLocks == nil { + return *new(storiface.SectorLocks), ErrNotSupported + } + return s.Internal.StorageGetLocks(p0) +} + +func (s *StorageMinerStub) StorageGetLocks(p0 context.Context) (storiface.SectorLocks, error) { + return *new(storiface.SectorLocks), ErrNotSupported +} + func (s *StorageMinerStruct) StorageInfo(p0 context.Context, p1 stores.ID) (stores.StorageInfo, error) { if s.Internal.StorageInfo == nil { return *new(stores.StorageInfo), ErrNotSupported diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 7d44a46a09de7e2f745e52919599de204a92b3a6..e39ebc6a20737848c433d295d93d694532317089 100644 GIT binary patch delta 19509 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 P00960TAg5rWeNoVQ2FDC diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index 571159054d990e6f92087e375288003ed9e7a893..e09ecdcb519a2a7f9579555b217e97820ce46dd6 100644 GIT binary patch delta 11261 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 delta 11144 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 a;oGCB_W1ba@&5+^0RR8uYoax?2Lb?bU%HO~ diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index 83d951047168368962397ea15eb0ea4bc68c1800..f5cbf4b84c5eca57fffa63a1e3f4e858babdd5a0 100644 GIT binary patch delta 1321 zcmV+^1=jk>8p;~53IhXCUlEfH13`a-UcM;(fw-}(C`f*rYG^hxv_ZL`F93xPXQPKx z$d_TU9xHxl_|yK$F;PWO>$BPvqTS3xIXK(m)}Ii!7Rh~cpsof)mj$L-4J{>g5<}3! zWFf_vVx0OV^}x)GeJID5?L45pnQD<{i!@&w(j2M<@BkBN;U6emi;6fQ(YTY%13dzc zw6hEZJp+HN=V#-7avsoikcwY1DL2-#o(GFnMJ@ZLIY3ecBZAC9CMo{5JV#OoFp&h;>3&Agb;kg+gLF zHV}k>GY8-OQ3DpVm%#!NM8yh+6|EKczCy@r3EPnHRfmMysK|f%cUx6;o1#&Xw}dks+Wo8dZvzjQ?*K(7`F^j8e+yX=r1M?c zW-qi0{^U!6B5U$-@o|>a_5vNRrnb#$Kt+Ff&$E@EJu7>iW>^^8@Y|wU%X;C;rH}KK zOGM?DeuiCEdUk7AtYtM&8VDt{zWDJIL5yv0fcJF<8XP~MObtD}Ki!L0qAD6;}zZrU#RCVdaT*|JX02{@un3;9CU|p38r_@3NR#t)6!yN<$d=r^ok(xoYz;S8exj&rLVa z0orDT_~pU9*3Y$m?zQ>3VZnz~gh8KDwEy-{)VP)%qEs}shX;%pYSIZNh8^GTX?@{Y z=jjE4`Ea3N(LewcvQ-Uy$9u4{TpWiH@}_lx74i zVGx;5Cb+_)P_kqF9V*pH)|!{-%rMJ;Dexxt-0LRK3n&+b%x@wxRnqyYP3+Z~e616&P=O-Vqu<(|x6YIX;qn zMc63R02jBOqG$*N7Z)5H2tPB5%!)i;zs!bP{;kb^%Im(@r@iW}qrTFU*9+v@}00960R+AgLK%oEtq7{$A delta 1320 zcmV+@1=sq@8p#^43IhX?HWZT$13`cKC|{KRK-^eX6ePb*H8dL;+Mry}7l6Wtv(dvT zn5ZJC^;vBS(Qf9U9Gq=&>raSVi{!pJP*($@%L3D^hL(~#i6LlV zvXEj-F;4xGdSGV8K9u9jb{^2)Otna}MVhY-Y4*nj@BkBN;U6emi;6fQ(YTY%13dx` zm9q>4Jp+H#%g@IBf-l{2Fn$LXA3mOXNLLo67 z8wf(cnS<~Cr~wPw%V2>BqGE-^iq;BzUm_CLyCrTw4=@fXuXeXzo=R^AomrmvlM?qs zlyZOAjoc~sybFFEYSz>9)$9wh5M=1a-)OIV#Z{{HF|Qm*k!~td%Z{*(*3Jrhoa%qEn zGI^4^!eGMrN}c_H27=mm zW-bRS4Qc~E)7U+--G7|Ne_e0o*zP|wdyZCfO`l`UTMax9>FR?X!~k{nSJ6~P#H+1m zd>X2>tP^Cl0cjhMzGTd-7ksNA!gGIF_gxk^k|Md9YFjs9J=Bn);?z!pa zIY8U25WhUQ*ZR5E&%HK3*Dv^xiZJL?iuT_giW=9lLzIf9_V9oaLrprt#IWPrJ*_W1 z3;jI@U-;^`dD^Xy7Dcou;wM58gM#m^Bs}6i0dv%NznD34$NPoN5&ffphBkkAK08%C z2f&ak%`Xo#w4Sf^e6P*(jS9Y&vR`8T;TiQ!rP4o_L;n%qqtv+o8O%Hmw#oG*%(aST z%nL0rG4ns3+h)uEJlXQ&ffq3fzXU5gvi>51Hl+6q z@Fm)41!MpP&$=7!=zz}-2YfmS#XpzhPqt%M&S;cCIjK(QtP0@y>qgNC)qchFrO z;=N_8mF}NHy0wCHJDWABdY!|zU495`L-%WT;qRE=`f0r@Fy8jOBQ$=d`$_?Gd?fjb zuqdekE^a+V(GUnOE;u+4er6Pz6?wjXnGLu6Tbuoq*L|-~d(~S 0 { + lockstr += fmt.Sprintf("%s(%s) ", storiface.SectorFileType(1< 0 { + lockstr += fmt.Sprintf("%s(%s:%d) ", storiface.SectorFileType(1< Date: Fri, 3 Dec 2021 17:07:14 +0100 Subject: [PATCH 026/393] Add metrics to dagstore piecereader --- markets/dagstore/piecereader.go | 14 +++++++++ metrics/metrics.go | 50 +++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+) diff --git a/markets/dagstore/piecereader.go b/markets/dagstore/piecereader.go index 6ef69dfbebf..f9ba881f552 100644 --- a/markets/dagstore/piecereader.go +++ b/markets/dagstore/piecereader.go @@ -2,6 +2,8 @@ package dagstore import ( "context" + "github.com/filecoin-project/lotus/metrics" + "go.opencensus.io/stats" "io" "github.com/ipfs/go-cid" @@ -29,6 +31,8 @@ type pieceReader struct { } func (p *pieceReader) init() (_ *pieceReader, err error) { + stats.Record(p.ctx, metrics.DagStorePRInitCount.M(1)) + p.rAt = 0 p.r, p.len, err = p.api.FetchUnsealedPiece(p.ctx, p.pieceCid, uint64(p.rAt)) if err != nil { @@ -95,6 +99,8 @@ func (p *pieceReader) ReadAt(b []byte, off int64) (n int, err error) { return 0, err } + stats.Record(p.ctx, metrics.DagStorePRBytesRequested.M(int64(len(b)))) + // 1. Get the backing reader into the correct position // if the backing reader is ahead of the offset we want, or more than @@ -109,6 +115,12 @@ func (p *pieceReader) ReadAt(b []byte, off int64) (n int, err error) { log.Debugw("pieceReader new stream", "piece", p.pieceCid, "at", p.rAt, "off", off-p.rAt) + if off > p.rAt { + stats.Record(p.ctx, metrics.DagStorePRSeekForwardBytes.M(off-p.rAt), metrics.DagStorePRSeekForwardCount.M(1)) + } else { + stats.Record(p.ctx, metrics.DagStorePRSeekBackBytes.M(p.rAt-off), metrics.DagStorePRSeekBackCount.M(1)) + } + p.rAt = off p.r, _, err = p.api.FetchUnsealedPiece(p.ctx, p.pieceCid, uint64(p.rAt)) if err != nil { @@ -118,6 +130,8 @@ func (p *pieceReader) ReadAt(b []byte, off int64) (n int, err error) { // 2. Check if we need to burn some bytes if off > p.rAt { + stats.Record(p.ctx, metrics.DagStorePRBytesDiscarded.M(off-p.rAt), metrics.DagStorePRDiscardCount.M(1)) + n, err := io.CopyN(io.Discard, p.r, off-p.rAt) p.rAt += n if err != nil { diff --git a/metrics/metrics.go b/metrics/metrics.go index ddd149d8d9f..b4032bb1d35 100644 --- a/metrics/metrics.go +++ b/metrics/metrics.go @@ -128,6 +128,15 @@ var ( StorageLimitUsedBytes = stats.Int64("storage/path_limit_used_bytes", "used optional storage limit bytes", stats.UnitBytes) StorageLimitMaxBytes = stats.Int64("storage/path_limit_max_bytes", "optional storage limit", stats.UnitBytes) + DagStorePRInitCount = stats.Int64("dagstore/pr_init_count", "PieceReader init count", stats.UnitDimensionless) + DagStorePRBytesRequested = stats.Int64("dagstore/pr_requested_bytes", "PieceReader requested bytes", stats.UnitBytes) + DagStorePRBytesDiscarded = stats.Int64("dagstore/pr_discarded_bytes", "PieceReader discarded bytes", stats.UnitBytes) + DagStorePRDiscardCount = stats.Int64("dagstore/pr_discard_count", "PieceReader discard count", stats.UnitDimensionless) + DagStorePRSeekBackCount = stats.Int64("dagstore/pr_seek_back_count", "PieceReader seek back count", stats.UnitDimensionless) + DagStorePRSeekForwardCount = stats.Int64("dagstore/pr_seek_forward_count", "PieceReader seek forward count", stats.UnitDimensionless) + DagStorePRSeekBackBytes = stats.Int64("dagstore/pr_seek_back_bytes", "PieceReader seek back bytes", stats.UnitBytes) + DagStorePRSeekForwardBytes = stats.Int64("dagstore/pr_seek_forward_bytes", "PieceReader seek forward bytes", stats.UnitBytes) + // splitstore SplitstoreMiss = stats.Int64("splitstore/miss", "Number of misses in hotstre access", stats.UnitDimensionless) SplitstoreCompactionTimeSeconds = stats.Float64("splitstore/compaction_time", "Compaction time in seconds", stats.UnitSeconds) @@ -383,6 +392,39 @@ var ( TagKeys: []tag.Key{StorageID}, } + DagStorePRInitCountView = &view.View{ + Measure: DagStorePRInitCount, + Aggregation: view.Count(), + } + DagStorePRBytesRequestedView = &view.View{ + Measure: DagStorePRBytesRequested, + Aggregation: view.Sum(), + } + DagStorePRBytesDiscardedView = &view.View{ + Measure: DagStorePRBytesDiscarded, + Aggregation: view.Sum(), + } + DagStorePRDiscardCountView = &view.View{ + Measure: DagStorePRDiscardCount, + Aggregation: view.Count(), + } + DagStorePRSeekBackCountView = &view.View{ + Measure: DagStorePRSeekBackCount, + Aggregation: view.Count(), + } + DagStorePRSeekForwardCountView = &view.View{ + Measure: DagStorePRSeekForwardCount, + Aggregation: view.Count(), + } + DagStorePRSeekBackBytesView = &view.View{ + Measure: DagStorePRSeekBackBytes, + Aggregation: view.Sum(), + } + DagStorePRSeekForwardBytesView = &view.View{ + Measure: DagStorePRSeekForwardBytes, + Aggregation: view.Sum(), + } + // splitstore SplitstoreMissView = &view.View{ Measure: SplitstoreMiss, @@ -539,6 +581,14 @@ var MinerNodeViews = append([]*view.View{ StorageReservedBytesView, StorageLimitUsedBytesView, StorageLimitMaxBytesView, + DagStorePRInitCountView, + DagStorePRBytesRequestedView, + DagStorePRBytesDiscardedView, + DagStorePRDiscardCountView, + DagStorePRSeekBackCountView, + DagStorePRSeekForwardCountView, + DagStorePRSeekBackBytesView, + DagStorePRSeekForwardBytesView, }, DefaultViews...) // SinceInMilliseconds returns the duration of time since the provide time as a float64. From 3969d6b767f0282f71ec69bd2ae40a60b8edc106 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 3 Dec 2021 20:11:52 +0100 Subject: [PATCH 027/393] dagstore pieceReader: Always read full in ReadAt --- markets/dagstore/piecereader.go | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/markets/dagstore/piecereader.go b/markets/dagstore/piecereader.go index f9ba881f552..14a027bd13e 100644 --- a/markets/dagstore/piecereader.go +++ b/markets/dagstore/piecereader.go @@ -1,21 +1,23 @@ package dagstore import ( + "bufio" "context" - "github.com/filecoin-project/lotus/metrics" - "go.opencensus.io/stats" "io" "github.com/ipfs/go-cid" + "go.opencensus.io/stats" "golang.org/x/xerrors" "github.com/filecoin-project/dagstore/mount" "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/lotus/metrics" ) // For small read skips, it's faster to "burn" some bytes than to setup new sector reader. // Assuming 1ms stream seek latency, and 1G/s stream rate, we're willing to discard up to 1 MiB. var MaxPieceReaderBurnBytes int64 = 1 << 20 // 1M +var ReadBuf = 128 * (127 * 8) // unpadded(128k) type pieceReader struct { ctx context.Context @@ -27,6 +29,7 @@ type pieceReader struct { seqAt int64 // next byte to be read by io.Reader r io.ReadCloser + br *bufio.Reader rAt int64 } @@ -38,6 +41,7 @@ func (p *pieceReader) init() (_ *pieceReader, err error) { if err != nil { return nil, err } + p.br = bufio.NewReaderSize(p.r, ReadBuf) return p, nil } @@ -111,9 +115,10 @@ func (p *pieceReader) ReadAt(b []byte, off int64) (n int, err error) { return 0, xerrors.Errorf("closing backing reader: %w", err) } p.r = nil + p.br = nil } - log.Debugw("pieceReader new stream", "piece", p.pieceCid, "at", p.rAt, "off", off-p.rAt) + log.Debugw("pieceReader new stream", "piece", p.pieceCid, "at", p.rAt, "off", off-p.rAt, "n", len(b)) if off > p.rAt { stats.Record(p.ctx, metrics.DagStorePRSeekForwardBytes.M(off-p.rAt), metrics.DagStorePRSeekForwardCount.M(1)) @@ -123,6 +128,7 @@ func (p *pieceReader) ReadAt(b []byte, off int64) (n int, err error) { p.rAt = off p.r, _, err = p.api.FetchUnsealedPiece(p.ctx, p.pieceCid, uint64(p.rAt)) + p.br = bufio.NewReaderSize(p.r, ReadBuf) if err != nil { return 0, xerrors.Errorf("getting backing reader: %w", err) } @@ -132,7 +138,7 @@ func (p *pieceReader) ReadAt(b []byte, off int64) (n int, err error) { if off > p.rAt { stats.Record(p.ctx, metrics.DagStorePRBytesDiscarded.M(off-p.rAt), metrics.DagStorePRDiscardCount.M(1)) - n, err := io.CopyN(io.Discard, p.r, off-p.rAt) + n, err := io.CopyN(io.Discard, p.br, off-p.rAt) p.rAt += n if err != nil { return 0, xerrors.Errorf("discarding read gap: %w", err) @@ -145,7 +151,11 @@ func (p *pieceReader) ReadAt(b []byte, off int64) (n int, err error) { } // 4. Read! - n, err = p.r.Read(b) + n, err = io.ReadFull(p.br, b) + if n < len(b) { + log.Debugw("pieceReader short read", "piece", p.pieceCid, "at", p.rAt, "toEnd", int64(p.len)-p.rAt, "n", len(b), "read", n, "err", err) + } + p.rAt += int64(n) return n, err } From a5be80828a28908b665b9f5b5a647b084c2bc6ba Mon Sep 17 00:00:00 2001 From: zenground0 Date: Wed, 1 Dec 2021 14:01:55 -0500 Subject: [PATCH 028/393] RemoveData and Decode - Unsealing replica update with sector key works and tested - Sector key generation added and tested --- api/api_storage.go | 1 + api/api_worker.go | 1 + api/proxy_gen.go | 26 +++++++ build/openrpc/full.json.gz | Bin 25466 -> 25465 bytes build/openrpc/miner.json.gz | Bin 10672 -> 10724 bytes build/openrpc/worker.json.gz | Bin 2940 -> 3000 bytes documentation/en/api-v0-methods-miner.md | 25 ++++++ documentation/en/api-v0-methods-worker.md | 37 +++++++++ extern/filecoin-ffi | 2 +- .../sector-storage/ffiwrapper/sealer_cgo.go | 60 ++++++++++++-- extern/sector-storage/manager.go | 73 +++++++++++++++++- extern/sector-storage/manager_test.go | 36 ++++++--- extern/sector-storage/mock/mock.go | 8 ++ extern/sector-storage/sched_test.go | 4 + extern/sector-storage/sealtasks/task.go | 5 +- extern/sector-storage/storiface/worker.go | 2 + extern/sector-storage/teststorage_test.go | 4 + extern/sector-storage/worker_local.go | 13 ++++ go.mod | 2 +- go.sum | 4 +- itests/self_sent_txn_test.go | 3 +- 21 files changed, 281 insertions(+), 25 deletions(-) diff --git a/api/api_storage.go b/api/api_storage.go index bf7520d09e7..92117d2fb09 100644 --- a/api/api_storage.go +++ b/api/api_storage.go @@ -127,6 +127,7 @@ type StorageMiner interface { ReturnReplicaUpdate(ctx context.Context, callID storiface.CallID, out storage.ReplicaUpdateOut, err *storiface.CallError) error //perm:admin retry:true ReturnProveReplicaUpdate1(ctx context.Context, callID storiface.CallID, vanillaProofs storage.ReplicaVanillaProofs, err *storiface.CallError) error //perm:admin retry:true ReturnProveReplicaUpdate2(ctx context.Context, callID storiface.CallID, proof storage.ReplicaUpdateProof, err *storiface.CallError) error //perm:admin retry:true + ReturnGenerateSectorKeyFromData(ctx context.Context, callID storiface.CallID, err *storiface.CallError) error //perm:admin retry:true ReturnReleaseUnsealed(ctx context.Context, callID storiface.CallID, err *storiface.CallError) error //perm:admin retry:true 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 diff --git a/api/api_worker.go b/api/api_worker.go index 5e0b4f8c6d4..68d8e7baf5c 100644 --- a/api/api_worker.go +++ b/api/api_worker.go @@ -42,6 +42,7 @@ type Worker interface { ReplicaUpdate(ctx context.Context, sector storage.SectorRef, pieces []abi.PieceInfo) (storiface.CallID, error) //perm:admin ProveReplicaUpdate1(ctx context.Context, sector storage.SectorRef, sectorKey, newSealed, newUnsealed cid.Cid) (storiface.CallID, error) //perm:admin ProveReplicaUpdate2(ctx context.Context, sector storage.SectorRef, sectorKey, newSealed, newUnsealed cid.Cid, vanillaProofs storage.ReplicaVanillaProofs) (storiface.CallID, error) //perm:admin + GenerateSectorKeyFromData(ctx context.Context, sector storage.SectorRef, commD cid.Cid) (storiface.CallID, error) //perm:admin ReleaseUnsealed(ctx context.Context, sector storage.SectorRef, safeToFree []storage.Range) (storiface.CallID, error) //perm:admin MoveStorage(ctx context.Context, sector storage.SectorRef, types storiface.SectorFileType) (storiface.CallID, error) //perm:admin UnsealPiece(context.Context, storage.SectorRef, storiface.UnpaddedByteIndex, abi.UnpaddedPieceSize, abi.SealRandomness, cid.Cid) (storiface.CallID, error) //perm:admin diff --git a/api/proxy_gen.go b/api/proxy_gen.go index b78b40959b2..5733c3cc851 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -707,6 +707,8 @@ type StorageMinerStruct struct { ReturnFinalizeSector func(p0 context.Context, p1 storiface.CallID, p2 *storiface.CallError) error `perm:"admin"` + ReturnGenerateSectorKeyFromData func(p0 context.Context, p1 storiface.CallID, p2 *storiface.CallError) error `perm:"admin"` + ReturnMoveStorage func(p0 context.Context, p1 storiface.CallID, p2 *storiface.CallError) error `perm:"admin"` ReturnProveReplicaUpdate1 func(p0 context.Context, p1 storiface.CallID, p2 storage.ReplicaVanillaProofs, p3 *storiface.CallError) error `perm:"admin"` @@ -850,6 +852,8 @@ type WorkerStruct struct { FinalizeSector func(p0 context.Context, p1 storage.SectorRef, p2 []storage.Range) (storiface.CallID, error) `perm:"admin"` + GenerateSectorKeyFromData func(p0 context.Context, p1 storage.SectorRef, p2 cid.Cid) (storiface.CallID, error) `perm:"admin"` + Info func(p0 context.Context) (storiface.WorkerInfo, error) `perm:"admin"` MoveStorage func(p0 context.Context, p1 storage.SectorRef, p2 storiface.SectorFileType) (storiface.CallID, error) `perm:"admin"` @@ -4166,6 +4170,17 @@ func (s *StorageMinerStub) ReturnFinalizeSector(p0 context.Context, p1 storiface return ErrNotSupported } +func (s *StorageMinerStruct) ReturnGenerateSectorKeyFromData(p0 context.Context, p1 storiface.CallID, p2 *storiface.CallError) error { + if s.Internal.ReturnGenerateSectorKeyFromData == nil { + return ErrNotSupported + } + return s.Internal.ReturnGenerateSectorKeyFromData(p0, p1, p2) +} + +func (s *StorageMinerStub) ReturnGenerateSectorKeyFromData(p0 context.Context, p1 storiface.CallID, p2 *storiface.CallError) error { + return ErrNotSupported +} + func (s *StorageMinerStruct) ReturnMoveStorage(p0 context.Context, p1 storiface.CallID, p2 *storiface.CallError) error { if s.Internal.ReturnMoveStorage == nil { return ErrNotSupported @@ -4859,6 +4874,17 @@ func (s *WorkerStub) FinalizeSector(p0 context.Context, p1 storage.SectorRef, p2 return *new(storiface.CallID), ErrNotSupported } +func (s *WorkerStruct) GenerateSectorKeyFromData(p0 context.Context, p1 storage.SectorRef, p2 cid.Cid) (storiface.CallID, error) { + if s.Internal.GenerateSectorKeyFromData == nil { + return *new(storiface.CallID), ErrNotSupported + } + return s.Internal.GenerateSectorKeyFromData(p0, p1, p2) +} + +func (s *WorkerStub) GenerateSectorKeyFromData(p0 context.Context, p1 storage.SectorRef, p2 cid.Cid) (storiface.CallID, error) { + return *new(storiface.CallID), ErrNotSupported +} + func (s *WorkerStruct) Info(p0 context.Context) (storiface.WorkerInfo, error) { if s.Internal.Info == nil { return *new(storiface.WorkerInfo), ErrNotSupported diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index a5816ef4f3d57f10df36cc9e5a911257fb47e0e6..839e95e61f36b78820c1705ba99bb12de914ce52 100644 GIT binary patch delta 24891 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 diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index 0c176bbef0d3f369e719e67fffeed4443dd180b3..f0eaa49ec9bd976dc3f27084730e55661bfeaf14 100644 GIT binary patch delta 10012 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 delta 9959 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 literal 2940 zcmV-?3xo6@iwFP!00000|Lk3FZ`-!k|0)EZH_f2fj_stWfxYOHZo2{6E;m`W7fo^5$&wt=v3ebc7|_KO4|xuG{``1EQjeI2z(nZc0X}MVTPN7T zl#MtZJYq$a4|sq-aurE*d2xo`Uz}qH--D2pvzX$j*Xka6aF1sW4nR$~C-LCRBW5Jf zq`y)hTuxc*z2{v}Z~;5m1L+DHs-%gpU%!s|4I4$wMQPdgm z)(4`<0eYi<(h+f?bw+&u{DXr)2rdrL;|;q}bcAH~9Y%Qb~Mzeiz!)7<^>({T?!7>U0 zBBpqNm%Sz9sr!^S3_Ca^f&|I%MnX@~aC#VWN#p5AALphpJSxmtVbpVd>mTj}0-|*Y zzL6mGA!+gagD(0+83;T$>U25|{u~8E{p;P#!54z_(I3+g@ZfZI>tNz}Fh1bQ+;0WMLxBo=PwEN81*n5_zHs5NIS^8H%}Qw6C~6eP&^m5ddl5)rf_ zyDQ~O(s+7}}3Uz!y;xpFz0d35<^EUbKu;icle|RG=kt*|JE!BO}I|St0dD7s~ ziGu^mGQZNwiH^^ljO@GTsWx^!#WHOvN#Odx-I9_1jjBmBL;?b?0Qr>NVFyRT#{)c3 zDwKnEdmLA3xjbl(QV4Mv3a=R6zo_YeuotdM-FM}x^eZTLVyH+ljTxF`OUqBz;rH+#08lt5nA^{EJJq=t={BbWi+9`{wg8 z;{q;0@<_Pz^s|FA1&{a>1Q(O3q%QICpxv)9U(wYmOS73D2N96{xP8Yectx1r~ zjCE7})01wwoBG7>;VQu>hTbYext(mFAh^rrJmdc+dUZH?VKXRA&G4Ewh{{lLm)JmpoF-5YgwszXDurVfhx7#*$ z5~J?IsxH;&rx$Ut(J+P1Jz$ECXo-hAqaG5vdkIWwHz&a#9VT^#l#LSuWC{__6Cfpc zh%Q=dp>w63!$e>gKXxnq+%dzRdJ z*Ey++go^>(6bW~?ii8~$9xo``9xxh)akMxtfMeO;i;v$&jXg|NO&2 z5&_Etpl+l*?wQ25loj1|c}Sb@{cWS))da-Wu7=9WS<~7pY~0Ljo3#K#eJ}HspCi9` zuSQy!S-38CZ}|QTH?CgAtr@ulsj-b^Xg9eNF1{HmKCoj7Ofwxf2TSwPSx~wQw!dSb zG^fRlgVMOCvvdRKx};iR|EGnh7NS~+`s^rrTyeR?6%hZ72LV;4TNyKyW)U=jcErDo zcil3Oa&e(*9KwjJ=sgr_^jAY~?hS9!#ToTX-|J??Xeu7(N6Nm(wUK#EWG-6A9$v6o zY3DCm*5V6B3$vd40&wZqYkIB4%ZkBvUTBQ=vXCvRfMZR|x zx3X<^9ozHoVQcCFwx@1h`$+F#>X>b<&L%E zPN(9IwJT7YeOhrzSOpV@ocn9`%r6^w?!NgPD{J=7FFOo~xRXdtU~UyeB1oRK=ho3e zpSeP6Li9gWA_+=SHojp2nIc8*01-5T2PDDe%#%oQq}@9i69xK*BJvJtb@w8Fi#zpy z%r_nFR``#{oui7|Skgln?>#TROV!kH^3>IfEJ4|Lo&Dt7dA1Q1*s8Xqt*waSoKU^b z>Se!LvCS)^UY%BVD^4H(LFCoV9aXwtI+O##R0wf zoS1$DU_n>D1P(~}r8x1oGNyir`T3)j>exiA!1#?!CazmKcK!-O`r_%$JTzCKM zh42$n6lUb<`gIa+bGy=7IybGsW4z@xBuWp;MK0ge`sv98)n2ELjyoq6$8wVGyYV|s zL+i;g;cK#Qk>faFsWvG%1x>BXAOnxoMo}2s1_Ft}k%dUn#ckd*Mn4&&X6A*xi0K}5F mbP|b(vH0EIGd1?rC8OT;@N9NF`)>dM0RR8#PS8G&m;eBTe!1}g diff --git a/documentation/en/api-v0-methods-miner.md b/documentation/en/api-v0-methods-miner.md index c037a0af6ea..a498cddff68 100644 --- a/documentation/en/api-v0-methods-miner.md +++ b/documentation/en/api-v0-methods-miner.md @@ -94,6 +94,7 @@ * [ReturnAddPiece](#ReturnAddPiece) * [ReturnFetch](#ReturnFetch) * [ReturnFinalizeSector](#ReturnFinalizeSector) + * [ReturnGenerateSectorKeyFromData](#ReturnGenerateSectorKeyFromData) * [ReturnMoveStorage](#ReturnMoveStorage) * [ReturnProveReplicaUpdate1](#ReturnProveReplicaUpdate1) * [ReturnProveReplicaUpdate2](#ReturnProveReplicaUpdate2) @@ -1443,6 +1444,30 @@ Response: `{}` ### ReturnFinalizeSector +Perms: admin + +Inputs: +```json +[ + { + "Sector": { + "Miner": 1000, + "Number": 9 + }, + "ID": "07070707-0707-0707-0707-070707070707" + }, + { + "Code": 0, + "Message": "string value" + } +] +``` + +Response: `{}` + +### ReturnGenerateSectorKeyFromData + + Perms: admin Inputs: diff --git a/documentation/en/api-v0-methods-worker.md b/documentation/en/api-v0-methods-worker.md index 7aee91d526e..5d4b33a52f1 100644 --- a/documentation/en/api-v0-methods-worker.md +++ b/documentation/en/api-v0-methods-worker.md @@ -11,6 +11,8 @@ * [AddPiece](#AddPiece) * [Finalize](#Finalize) * [FinalizeSector](#FinalizeSector) +* [Generate](#Generate) + * [GenerateSectorKeyFromData](#GenerateSectorKeyFromData) * [Move](#Move) * [MoveStorage](#MoveStorage) * [Process](#Process) @@ -220,6 +222,41 @@ Response: } ``` +## Generate + + +### GenerateSectorKeyFromData + + +Perms: admin + +Inputs: +```json +[ + { + "ID": { + "Miner": 1000, + "Number": 9 + }, + "ProofType": 8 + }, + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +Response: +```json +{ + "Sector": { + "Miner": 1000, + "Number": 9 + }, + "ID": "07070707-0707-0707-0707-070707070707" +} +``` + ## Move diff --git a/extern/filecoin-ffi b/extern/filecoin-ffi index ce7083b3d18..428503c87d9 160000 --- a/extern/filecoin-ffi +++ b/extern/filecoin-ffi @@ -1 +1 @@ -Subproject commit ce7083b3d187ec3bc41a68ab66567bd4f3be6dfc +Subproject commit 428503c87d917cc5e3e637983b43b4c260863bf0 diff --git a/extern/sector-storage/ffiwrapper/sealer_cgo.go b/extern/sector-storage/ffiwrapper/sealer_cgo.go index 81dbfb42694..65c6762fa20 100644 --- a/extern/sector-storage/ffiwrapper/sealer_cgo.go +++ b/extern/sector-storage/ffiwrapper/sealer_cgo.go @@ -251,6 +251,23 @@ func (sb *Sealer) pieceCid(spt abi.RegisteredSealProof, in []byte) (cid.Cid, err return pieceCID, werr() } +func (sb *Sealer) tryDecodeUpdatedReplica(ctx context.Context, sector storage.SectorRef, commD cid.Cid, unsealedPath string) (bool, error) { + paths, done, err := sb.sectors.AcquireSector(ctx, sector, storiface.FTUpdate|storiface.FTSealed|storiface.FTCache, storiface.FTNone, storiface.PathStorage) + if xerrors.Is(err, storiface.ErrSectorNotFound) { + return false, nil + } else if err != nil { + return false, xerrors.Errorf("reading updated replica: %w", err) + } + defer done() + + // Sector data stored in replica update + updateProof, err := sector.ProofType.RegisteredUpdateProof() + if err != nil { + return false, err + } + return true, ffi.SectorUpdate.DecodeFrom(updateProof, unsealedPath, paths.Update, paths.Sealed, paths.Cache, commD) +} + func (sb *Sealer) UnsealPiece(ctx context.Context, sector storage.SectorRef, offset storiface.UnpaddedByteIndex, size abi.UnpaddedPieceSize, randomness abi.SealRandomness, commd cid.Cid) error { ssize, err := sector.ProofType.SectorSize() if err != nil { @@ -301,6 +318,16 @@ func (sb *Sealer) UnsealPiece(ctx context.Context, sector storage.SectorRef, off return nil } + // If piece data stored in updated replica decode whole sector + decoded, err := sb.tryDecodeUpdatedReplica(ctx, sector, commd, unsealedPath.Unsealed) + if err != nil { + return xerrors.Errorf("decoding sector from replica: %w", err) + } + if decoded { + return pf.MarkAllocated(0, maxPieceSize) + } + + // Piece data sealed in sector srcPaths, srcDone, err := sb.sectors.AcquireSector(ctx, sector, storiface.FTCache|storiface.FTSealed, storiface.FTNone, storiface.PathStorage) if err != nil { return xerrors.Errorf("acquire sealed sector paths: %w", err) @@ -626,12 +653,6 @@ func (sb *Sealer) ReplicaUpdate(ctx context.Context, sector storage.SectorRef, p return empty, err } } - - // XXX: we want to keep the stuff at the end - if err := os.Truncate(paths.Unsealed, sealedSize); err != nil { - return empty, xerrors.Errorf("failed to truncate unsealed data file: %w", err) - } - sealed, unsealed, err := ffi.SectorUpdate.EncodeInto(updateProofType, paths.Update, paths.UpdateCache, paths.Sealed, paths.Cache, paths.Unsealed, pieces) if err != nil { return empty, xerrors.Errorf("failed to update replica %d with new deal data: %w", sector.ID.Number, err) @@ -661,6 +682,33 @@ func (sb *Sealer) ProveReplicaUpdate2(ctx context.Context, sector storage.Sector return ffi.SectorUpdate.GenerateUpdateProofWithVanilla(updateProofType, sectorKey, newSealed, newUnsealed, vanillaProofs) } +func (sb *Sealer) GenerateSectorKeyFromData(ctx context.Context, sector storage.SectorRef, commD cid.Cid) error { + paths, done, err := sb.sectors.AcquireSector(ctx, sector, storiface.FTUnsealed|storiface.FTCache|storiface.FTUpdate|storiface.FTUpdateCache, storiface.FTSealed, storiface.PathSealing) + defer done() + if err != nil { + return xerrors.Errorf("failed to acquire sector paths: %w", err) + } + + s, err := os.Stat(paths.Update) + if err != nil { + return xerrors.Errorf("measuring update file size: %w", err) + } + sealedSize := s.Size() + e, err := os.OpenFile(paths.Sealed, os.O_RDWR|os.O_CREATE, 0644) // nolint:gosec + if err != nil { + return xerrors.Errorf("ensuring sector key file exists: %w", err) + } + if err := fallocate.Fallocate(e, 0, sealedSize); err != nil { + return xerrors.Errorf("allocating space for sector key file: %w", err) + } + if err := e.Close(); err != nil { + return err + } + + updateProofType := abi.SealProofInfos[sector.ProofType].UpdateProof + return ffi.SectorUpdate.RemoveData(updateProofType, paths.Sealed, paths.Cache, paths.Update, paths.UpdateCache, paths.Unsealed, commD) +} + func (sb *Sealer) ReleaseSealed(ctx context.Context, sector storage.SectorRef) error { return xerrors.Errorf("not supported at this layer") } diff --git a/extern/sector-storage/manager.go b/extern/sector-storage/manager.go index e0abf1773fd..3deff4d6bd4 100644 --- a/extern/sector-storage/manager.go +++ b/extern/sector-storage/manager.go @@ -578,15 +578,72 @@ func (m *Manager) ReleaseUnsealed(ctx context.Context, sector storage.SectorRef, return nil } -func (m *Manager) ReleaseSealed(ctx context.Context, sector storage.SectorRef) error { - return nil +func (m *Manager) ReleaseSectorKey(ctx context.Context, sector storage.SectorRef) error { + ctx, cancel := context.WithCancel(ctx) + defer cancel() + + if err := m.index.StorageLock(ctx, sector.ID, storiface.FTNone, storiface.FTSealed); err != nil { + return xerrors.Errorf("acquiring sector lock: %w", err) + } + + return m.storage.Remove(ctx, sector.ID, storiface.FTSealed, true, nil) +} + +func (m *Manager) GenerateSectorKeyFromData(ctx context.Context, sector storage.SectorRef, commD cid.Cid) error { + + ctx, cancel := context.WithCancel(ctx) + defer cancel() + + wk, wait, cancel, err := m.getWork(ctx, sealtasks.TTRegenSectorKey, sector, commD) + if err != nil { + return xerrors.Errorf("getWork: %w", err) + } + defer cancel() + + var waitErr error + waitRes := func() { + _, werr := m.waitWork(ctx, wk) + if werr != nil { + waitErr = werr + return + } + } + + if wait { // already in progress + waitRes() + return waitErr + } + + if err := m.index.StorageLock(ctx, sector.ID, storiface.FTUnsealed|storiface.FTUpdate|storiface.FTUpdateCache, storiface.FTSealed|storiface.FTCache); err != nil { + return xerrors.Errorf("acquiring sector lock: %w", err) + } + + // NOTE: We set allowFetch to false in so that we always execute on a worker + // with direct access to the data. We want to do that because this step is + // generally very cheap / fast, and transferring data is not worth the effort + selector := newExistingSelector(m.index, sector.ID, storiface.FTUnsealed|storiface.FTUpdate|storiface.FTUpdateCache|storiface.FTCache, true) + + err = m.sched.Schedule(ctx, sector, sealtasks.TTRegenSectorKey, selector, m.schedFetch(sector, storiface.FTUpdate|storiface.FTUnsealed, storiface.PathSealing, storiface.AcquireMove), func(ctx context.Context, w Worker) error { + err := m.startWork(ctx, w, wk)(w.GenerateSectorKeyFromData(ctx, sector, commD)) + if err != nil { + return err + } + + waitRes() + return nil + }) + if err != nil { + return err + } + + return waitErr } func (m *Manager) Remove(ctx context.Context, sector storage.SectorRef) error { ctx, cancel := context.WithCancel(ctx) defer cancel() - if err := m.index.StorageLock(ctx, sector.ID, storiface.FTNone, storiface.FTSealed|storiface.FTUnsealed|storiface.FTCache); err != nil { + if err := m.index.StorageLock(ctx, sector.ID, storiface.FTNone, storiface.FTSealed|storiface.FTUnsealed|storiface.FTCache|storiface.FTUpdate|storiface.FTUpdateCache); err != nil { return xerrors.Errorf("acquiring sector lock: %w", err) } @@ -601,6 +658,12 @@ func (m *Manager) Remove(ctx context.Context, sector storage.SectorRef) error { if rerr := m.storage.Remove(ctx, sector.ID, storiface.FTUnsealed, true, nil); rerr != nil { err = multierror.Append(err, xerrors.Errorf("removing sector (unsealed): %w", rerr)) } + if rerr := m.storage.Remove(ctx, sector.ID, storiface.FTUpdate, true, nil); rerr != nil { + err = multierror.Append(err, xerrors.Errorf("removing sector (unsealed): %w", rerr)) + } + if rerr := m.storage.Remove(ctx, sector.ID, storiface.FTUpdateCache, true, nil); rerr != nil { + err = multierror.Append(err, xerrors.Errorf("removing sector (unsealed): %w", rerr)) + } return err } @@ -790,6 +853,10 @@ func (m *Manager) ReturnProveReplicaUpdate2(ctx context.Context, callID storifac return m.returnResult(ctx, callID, proof, err) } +func (m *Manager) ReturnGenerateSectorKeyFromData(ctx context.Context, callID storiface.CallID, err *storiface.CallError) error { + return m.returnResult(ctx, callID, nil, err) +} + func (m *Manager) ReturnMoveStorage(ctx context.Context, callID storiface.CallID, err *storiface.CallError) error { return m.returnResult(ctx, callID, nil, err) } diff --git a/extern/sector-storage/manager_test.go b/extern/sector-storage/manager_test.go index 77e185b9398..cf54ccbf25a 100644 --- a/extern/sector-storage/manager_test.go +++ b/extern/sector-storage/manager_test.go @@ -199,7 +199,8 @@ func TestSnapDeals(t *testing.T) { localTasks := []sealtasks.TaskType{ sealtasks.TTAddPiece, sealtasks.TTPreCommit1, sealtasks.TTPreCommit2, sealtasks.TTCommit1, sealtasks.TTCommit2, sealtasks.TTFinalize, - sealtasks.TTFetch, sealtasks.TTReplicaUpdate, sealtasks.TTProveReplicaUpdate1, sealtasks.TTProveReplicaUpdate2, + sealtasks.TTFetch, sealtasks.TTReplicaUpdate, sealtasks.TTProveReplicaUpdate1, sealtasks.TTProveReplicaUpdate2, sealtasks.TTUnseal, + sealtasks.TTRegenSectorKey, } wds := datastore.NewMapDatastore() @@ -245,14 +246,6 @@ func TestSnapDeals(t *testing.T) { require.NoError(t, err) fmt.Printf("PC2\n") pc2Out, err := m.SealPreCommit2(ctx, sid, pc1Out) - - require.NoError(t, err) - seed := abi.InteractiveSealRandomness{1, 1, 1, 1, 1, 1, 1} - fmt.Printf("C1\n") - c1Out, err := m.SealCommit1(ctx, sid, ticket, seed, nil, pc2Out) - require.NoError(t, err) - fmt.Printf("C2\n") - _, err = m.SealCommit2(ctx, sid, c1Out) require.NoError(t, err) // Now do a snap deals replica update @@ -270,19 +263,26 @@ func TestSnapDeals(t *testing.T) { pieces := []abi.PieceInfo{p1, p2} fmt.Printf("RU\n") + startRU := time.Now() out, err := m.ReplicaUpdate(ctx, sid, pieces) require.NoError(t, err) + fmt.Printf("RU duration (%s): %s\n", ss.ShortString(), time.Since(startRU)) + updateProofType, err := sid.ProofType.RegisteredUpdateProof() require.NoError(t, err) require.NotNil(t, out) fmt.Printf("PR1\n") + startPR1 := time.Now() vanillaProofs, err := m.ProveReplicaUpdate1(ctx, sid, sectorKey, out.NewSealed, out.NewUnsealed) require.NoError(t, err) require.NotNil(t, vanillaProofs) + fmt.Printf("PR1 duration (%s): %s\n", ss.ShortString(), time.Since(startPR1)) fmt.Printf("PR2\n") + startPR2 := time.Now() proof, err := m.ProveReplicaUpdate2(ctx, sid, sectorKey, out.NewSealed, out.NewUnsealed, vanillaProofs) require.NoError(t, err) require.NotNil(t, proof) + fmt.Printf("PR2 duration (%s): %s\n", ss.ShortString(), time.Since(startPR2)) vInfo := proof7.ReplicaUpdateInfo{ Proof: proof, @@ -294,6 +294,24 @@ func TestSnapDeals(t *testing.T) { pass, err := ffiwrapper.ProofVerifier.VerifyReplicaUpdate(vInfo) require.NoError(t, err) assert.True(t, pass) + + fmt.Printf("Decode\n") + // Remove unsealed data and decode for retrieval + require.NoError(t, m.FinalizeSector(ctx, sid, nil)) + startDecode := time.Now() + require.NoError(t, m.SectorsUnsealPiece(ctx, sid, 0, p1.Size.Unpadded(), ticket, &out.NewUnsealed)) + fmt.Printf("Decode duration (%s): %s\n", ss.ShortString(), time.Since(startDecode)) + + // Remove just the first piece and decode for retrieval + require.NoError(t, m.FinalizeSector(ctx, sid, []storage.Range{{Offset: p1.Size.Unpadded(), Size: p2.Size.Unpadded()}})) + require.NoError(t, m.SectorsUnsealPiece(ctx, sid, 0, p1.Size.Unpadded(), ticket, &out.NewUnsealed)) + + fmt.Printf("GSK\n") + require.NoError(t, m.ReleaseSectorKey(ctx, sid)) + startGSK := time.Now() + require.NoError(t, m.GenerateSectorKeyFromData(ctx, sid, out.NewUnsealed)) + fmt.Printf("GSK duration (%s): %s\n", ss.ShortString(), time.Since(startGSK)) + } func TestRedoPC1(t *testing.T) { diff --git a/extern/sector-storage/mock/mock.go b/extern/sector-storage/mock/mock.go index 023904984a3..95b11c004e0 100644 --- a/extern/sector-storage/mock/mock.go +++ b/extern/sector-storage/mock/mock.go @@ -277,6 +277,10 @@ func (mgr *SectorMgr) ProveReplicaUpdate2(ctx context.Context, sector storage.Se return make([]byte, 0), nil } +func (mgr *SectorMgr) GenerateSectorKeyFromData(ctx context.Context, sector storage.SectorRef, commD cid.Cid) error { + return nil +} + func (mgr *SectorMgr) ReleaseSealed(ctx context.Context, sid storage.SectorRef) error { return nil } @@ -534,6 +538,10 @@ func (mgr *SectorMgr) ReturnProveReplicaUpdate2(ctx context.Context, callID stor panic("not supported") } +func (mgr *SectorMgr) ReturnGenerateSectorKeyFromData(ctx context.Context, callID storiface.CallID, err *storiface.CallError) error { + panic("not supported") +} + func (m mockVerifProver) VerifySeal(svi proof5.SealVerifyInfo) (bool, error) { plen, err := svi.SealProof.ProofSize() if err != nil { diff --git a/extern/sector-storage/sched_test.go b/extern/sector-storage/sched_test.go index fd3c90295b9..a41e7c855a4 100644 --- a/extern/sector-storage/sched_test.go +++ b/extern/sector-storage/sched_test.go @@ -112,6 +112,10 @@ func (s *schedTestWorker) ProveReplicaUpdate2(ctx context.Context, sector storag panic("implement me") } +func (s *schedTestWorker) GenerateSectorKeyFromData(ctx context.Context, sector storage.SectorRef, commD cid.Cid) (storiface.CallID, error) { + panic("implement me") +} + func (s *schedTestWorker) MoveStorage(ctx context.Context, sector storage.SectorRef, types storiface.SectorFileType) (storiface.CallID, error) { panic("implement me") } diff --git a/extern/sector-storage/sealtasks/task.go b/extern/sector-storage/sealtasks/task.go index 3f2a9701fba..f6104878b21 100644 --- a/extern/sector-storage/sealtasks/task.go +++ b/extern/sector-storage/sealtasks/task.go @@ -17,10 +17,12 @@ const ( TTReplicaUpdate TaskType = "seal/v0/replicaupdate" TTProveReplicaUpdate1 TaskType = "seal/v0/provereplicaupdate/1" TTProveReplicaUpdate2 TaskType = "seal/v0/provereplicaupdate/2" + TTRegenSectorKey TaskType = "seal/v0/regensectorkey" ) var order = map[TaskType]int{ - TTAddPiece: 9, // least priority + TTRegenSectorKey: 10, // least priority + TTAddPiece: 9, TTReplicaUpdate: 8, TTProveReplicaUpdate2: 7, TTProveReplicaUpdate1: 6, @@ -49,6 +51,7 @@ var shortNames = map[TaskType]string{ TTReplicaUpdate: "RU", TTProveReplicaUpdate1: "PR1", TTProveReplicaUpdate2: "PR2", + TTRegenSectorKey: "GSK", } func (a TaskType) MuchLess(b TaskType) (bool, bool) { diff --git a/extern/sector-storage/storiface/worker.go b/extern/sector-storage/storiface/worker.go index 970e0ec33a2..ab8c484e660 100644 --- a/extern/sector-storage/storiface/worker.go +++ b/extern/sector-storage/storiface/worker.go @@ -95,6 +95,7 @@ type WorkerCalls interface { ReplicaUpdate(ctx context.Context, sector storage.SectorRef, pieces []abi.PieceInfo) (CallID, error) ProveReplicaUpdate1(ctx context.Context, sector storage.SectorRef, sectorKey, newSealed, newUnsealed cid.Cid) (CallID, error) ProveReplicaUpdate2(ctx context.Context, sector storage.SectorRef, sectorKey, newSealed, newUnsealed cid.Cid, vanillaProofs storage.ReplicaVanillaProofs) (CallID, error) + GenerateSectorKeyFromData(ctx context.Context, sector storage.SectorRef, commD cid.Cid) (CallID, error) MoveStorage(ctx context.Context, sector storage.SectorRef, types SectorFileType) (CallID, error) UnsealPiece(context.Context, storage.SectorRef, UnpaddedByteIndex, abi.UnpaddedPieceSize, abi.SealRandomness, cid.Cid) (CallID, error) Fetch(context.Context, storage.SectorRef, SectorFileType, PathType, AcquireMode) (CallID, error) @@ -151,6 +152,7 @@ type WorkerReturn interface { ReturnReplicaUpdate(ctx context.Context, callID CallID, out storage.ReplicaUpdateOut, err *CallError) error ReturnProveReplicaUpdate1(ctx context.Context, callID CallID, proofs storage.ReplicaVanillaProofs, err *CallError) error ReturnProveReplicaUpdate2(ctx context.Context, callID CallID, proof storage.ReplicaUpdateProof, err *CallError) error + ReturnGenerateSectorKeyFromData(ctx context.Context, callID CallID, err *CallError) error ReturnMoveStorage(ctx context.Context, callID CallID, err *CallError) error ReturnUnsealPiece(ctx context.Context, callID CallID, err *CallError) error ReturnReadPiece(ctx context.Context, callID CallID, ok bool, err *CallError) error diff --git a/extern/sector-storage/teststorage_test.go b/extern/sector-storage/teststorage_test.go index 4061b48d99c..9fdb3a913dd 100644 --- a/extern/sector-storage/teststorage_test.go +++ b/extern/sector-storage/teststorage_test.go @@ -75,6 +75,10 @@ func (t *testExec) ProveReplicaUpdate2(ctx context.Context, sector storage.Secto panic("implement me") } +func (t *testExec) GenerateSectorKeyFromData(ctx context.Context, sector storage.SectorRef, commD cid.Cid) error { + panic("implement me") +} + func (t *testExec) NewSector(ctx context.Context, sector storage.SectorRef) error { panic("implement me") } diff --git a/extern/sector-storage/worker_local.go b/extern/sector-storage/worker_local.go index cc41e916e20..387a47f8fa3 100644 --- a/extern/sector-storage/worker_local.go +++ b/extern/sector-storage/worker_local.go @@ -168,6 +168,7 @@ const ( ReplicaUpdate ReturnType = "ReplicaUpdate" ProveReplicaUpdate1 ReturnType = "ProveReplicaUpdate1" ProveReplicaUpdate2 ReturnType = "ProveReplicaUpdate2" + GenerateSectorKey ReturnType = "GenerateSectorKey" ReleaseUnsealed ReturnType = "ReleaseUnsealed" MoveStorage ReturnType = "MoveStorage" UnsealPiece ReturnType = "UnsealPiece" @@ -219,6 +220,7 @@ var returnFunc = map[ReturnType]func(context.Context, storiface.CallID, storifac ReplicaUpdate: rfunc(storiface.WorkerReturn.ReturnReplicaUpdate), ProveReplicaUpdate1: rfunc(storiface.WorkerReturn.ReturnProveReplicaUpdate1), ProveReplicaUpdate2: rfunc(storiface.WorkerReturn.ReturnProveReplicaUpdate2), + GenerateSectorKey: rfunc(storiface.WorkerReturn.ReturnGenerateSectorKeyFromData), MoveStorage: rfunc(storiface.WorkerReturn.ReturnMoveStorage), UnsealPiece: rfunc(storiface.WorkerReturn.ReturnUnsealPiece), Fetch: rfunc(storiface.WorkerReturn.ReturnFetch), @@ -419,6 +421,17 @@ func (l *LocalWorker) ProveReplicaUpdate2(ctx context.Context, sector storage.Se }) } +func (l *LocalWorker) GenerateSectorKeyFromData(ctx context.Context, sector storage.SectorRef, commD cid.Cid) (storiface.CallID, error) { + sb, err := l.executor() + if err != nil { + return storiface.UndefCall, err + } + + return l.asyncCall(ctx, sector, GenerateSectorKey, func(ctx context.Context, ci storiface.CallID) (interface{}, error) { + return nil, sb.GenerateSectorKeyFromData(ctx, sector, commD) + }) +} + func (l *LocalWorker) FinalizeSector(ctx context.Context, sector storage.SectorRef, keepUnsealed []storage.Range) (storiface.CallID, error) { sb, err := l.executor() if err != nil { diff --git a/go.mod b/go.mod index e0823094dfa..95618417bc7 100644 --- a/go.mod +++ b/go.mod @@ -51,7 +51,7 @@ require ( github.com/filecoin-project/specs-actors/v5 v5.0.4 github.com/filecoin-project/specs-actors/v6 v6.0.1 github.com/filecoin-project/specs-actors/v7 v7.0.0-20211118013026-3dce48197cec - github.com/filecoin-project/specs-storage v0.1.1-0.20211123153428-712cb8da07a3 + github.com/filecoin-project/specs-storage v0.1.1-0.20211202151826-2e51da61d454 github.com/filecoin-project/test-vectors/schema v0.0.5 github.com/gbrlsnchs/jwt/v3 v3.0.1 github.com/gdamore/tcell/v2 v2.2.0 diff --git a/go.sum b/go.sum index e404ca72e56..38f77202546 100644 --- a/go.sum +++ b/go.sum @@ -396,8 +396,8 @@ github.com/filecoin-project/specs-actors/v6 v6.0.1/go.mod h1:V1AYfi5GkHXipx1mnVi github.com/filecoin-project/specs-actors/v7 v7.0.0-20211117170924-fd07a4c7dff9/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= github.com/filecoin-project/specs-actors/v7 v7.0.0-20211118013026-3dce48197cec h1:KV9vE+Sl2Y3qKsrpba4HcE7wHwK7v6O5U/S0xHbje6A= github.com/filecoin-project/specs-actors/v7 v7.0.0-20211118013026-3dce48197cec/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= -github.com/filecoin-project/specs-storage v0.1.1-0.20211123153428-712cb8da07a3 h1:FLPxD2ksWwGc/sbnFLWep2p8ViP93VCAwFaVxrtVCyo= -github.com/filecoin-project/specs-storage v0.1.1-0.20211123153428-712cb8da07a3/go.mod h1:nJRRM7Aa9XVvygr3W9k6xGF46RWzr2zxF/iGoAIfA/g= +github.com/filecoin-project/specs-storage v0.1.1-0.20211202151826-2e51da61d454 h1:9II9Xf+jq5xAPQiS4rVoKIiALINa3loMC+ghyFYIrqQ= +github.com/filecoin-project/specs-storage v0.1.1-0.20211202151826-2e51da61d454/go.mod h1:nJRRM7Aa9XVvygr3W9k6xGF46RWzr2zxF/iGoAIfA/g= 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= diff --git a/itests/self_sent_txn_test.go b/itests/self_sent_txn_test.go index 846bcff05d8..b5ec2c0dcaf 100644 --- a/itests/self_sent_txn_test.go +++ b/itests/self_sent_txn_test.go @@ -15,8 +15,7 @@ import ( "github.com/stretchr/testify/require" ) - -// these tests check that the versioned code in vm.transfer is functioning correctly across versions! +// these tests check that the versioned code in vm.transfer is functioning correctly across versions! // we reordered the checks to make sure that a transaction with too much money in it sent to yourself will fail instead of succeeding as a noop // more info in this PR! https://github.com/filecoin-project/lotus/pull/7637 func TestSelfSentTxnV15(t *testing.T) { From 9f6265e0b43b95d891b6cee283ebf9cfeb7d429c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 3 Dec 2021 23:36:36 +0100 Subject: [PATCH 029/393] dagstore pieceReader: Fix wrong ErrUnexpectedEOF return in ReadAt --- markets/dagstore/mount_test.go | 1 - markets/dagstore/piecereader.go | 3 +++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/markets/dagstore/mount_test.go b/markets/dagstore/mount_test.go index ec5e8a086b6..82005878602 100644 --- a/markets/dagstore/mount_test.go +++ b/markets/dagstore/mount_test.go @@ -30,7 +30,6 @@ func TestLotusMount(t *testing.T) { mockLotusMountAPI := mock_dagstore.NewMockMinerAPI(mockCtrl) mockLotusMountAPI.EXPECT().IsUnsealed(gomock.Any(), cid).Return(true, nil).Times(1) - mockLotusMountAPI.EXPECT().FetchUnsealedPiece(gomock.Any(), cid, uint64(0)).Return(ioutil.NopCloser(strings.NewReader("testing")), abi.UnpaddedPieceSize(7), nil).Times(1) mockLotusMountAPI.EXPECT().FetchUnsealedPiece(gomock.Any(), cid, uint64(0)).Return(ioutil.NopCloser(strings.NewReader("testing")), abi.UnpaddedPieceSize(7), nil).Times(1) mockLotusMountAPI.EXPECT().GetUnpaddedCARSize(ctx, cid).Return(uint64(100), nil).Times(1) diff --git a/markets/dagstore/piecereader.go b/markets/dagstore/piecereader.go index 14a027bd13e..67cd10c27ea 100644 --- a/markets/dagstore/piecereader.go +++ b/markets/dagstore/piecereader.go @@ -155,6 +155,9 @@ func (p *pieceReader) ReadAt(b []byte, off int64) (n int, err error) { if n < len(b) { log.Debugw("pieceReader short read", "piece", p.pieceCid, "at", p.rAt, "toEnd", int64(p.len)-p.rAt, "n", len(b), "read", n, "err", err) } + if err == io.ErrUnexpectedEOF { + err = io.EOF + } p.rAt += int64(n) return n, err From 84c48de5d9b0087fedcd6e8d6f15b324711d49c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 6 Dec 2021 15:38:45 +0100 Subject: [PATCH 030/393] CARv2 v2.1.0 --- go.mod | 4 ++-- go.sum | 11 ++++++----- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/go.mod b/go.mod index cf234250a7f..a9b0bee9dcf 100644 --- a/go.mod +++ b/go.mod @@ -36,7 +36,7 @@ require ( github.com/filecoin-project/go-data-transfer v1.11.4 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.13.3 + github.com/filecoin-project/go-fil-markets v1.13.4 github.com/filecoin-project/go-jsonrpc v0.1.5 github.com/filecoin-project/go-padreader v0.0.1 github.com/filecoin-project/go-paramfetch v0.0.2 @@ -98,7 +98,7 @@ require ( github.com/ipfs/go-unixfs v0.2.6 github.com/ipfs/interface-go-ipfs-core v0.4.0 github.com/ipld/go-car v0.3.2-0.20211001225732-32d0d9933823 - github.com/ipld/go-car/v2 v2.0.3-0.20210811121346-c514a30114d7 + github.com/ipld/go-car/v2 v2.1.0 github.com/ipld/go-codec-dagpb v1.3.0 github.com/ipld/go-ipld-prime v0.12.3 github.com/ipld/go-ipld-selector-text-lite v0.0.1 diff --git a/go.sum b/go.sum index 905a758d803..241b98887d0 100644 --- a/go.sum +++ b/go.sum @@ -338,8 +338,8 @@ github.com/filecoin-project/go-fil-commcid v0.1.0/go.mod h1:Eaox7Hvus1JgPrL5+M3+ 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.0.5-0.20201113164554-c5eba40d5335/go.mod h1:AJySOJC00JRWEZzRG2KsfUnqEf5ITXxeX09BE9N4f9c= -github.com/filecoin-project/go-fil-markets v1.13.3 h1:iMCpG7I4fb+YLcgDnMaqZiZiyFZWNvrwHqiFPHB0/tQ= -github.com/filecoin-project/go-fil-markets v1.13.3/go.mod h1:38zuj8AgDvOfdakFLpC/syYIYgXTzkq7xqBJ6T1AuG4= +github.com/filecoin-project/go-fil-markets v1.13.4 h1:NAu+ACelR2mYsj+yJ4iLu8FGqWK50OnU5VF8axkLsSc= +github.com/filecoin-project/go-fil-markets v1.13.4/go.mod h1:aANjXD2XMHWnT2zWpyGWLsWLC24C4mHm0gRm85OpPWE= 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= @@ -865,8 +865,8 @@ github.com/ipld/go-car v0.3.2-0.20211001225732-32d0d9933823 h1:8JMSJ0k71fU9lIUrp github.com/ipld/go-car v0.3.2-0.20211001225732-32d0d9933823/go.mod h1:jSlTph+i/q1jLFoiKKeN69KGG0fXpwrcD0izu5C1Tpo= github.com/ipld/go-car/v2 v2.0.0-beta1.0.20210721090610-5a9d1b217d25/go.mod h1:I2ACeeg6XNBe5pdh5TaR7Ambhfa7If9KXxmXgZsYENU= github.com/ipld/go-car/v2 v2.0.2/go.mod h1:I2ACeeg6XNBe5pdh5TaR7Ambhfa7If9KXxmXgZsYENU= -github.com/ipld/go-car/v2 v2.0.3-0.20210811121346-c514a30114d7 h1:6Z0beJSZNsRY+7udoqUl4gQ/tqtrPuRvDySrlsvbqZA= -github.com/ipld/go-car/v2 v2.0.3-0.20210811121346-c514a30114d7/go.mod h1:I2ACeeg6XNBe5pdh5TaR7Ambhfa7If9KXxmXgZsYENU= +github.com/ipld/go-car/v2 v2.1.0 h1:t8R/WXUSkfu1K1gpPk76mytCxsEdMjGcMIgpOq3/Cnw= +github.com/ipld/go-car/v2 v2.1.0/go.mod h1:Xr6GwkDhv8dtOtgHzOynAkIOg0t0YiPc5DxBPppWqZA= github.com/ipld/go-codec-dagpb v1.2.0/go.mod h1:6nBN7X7h8EOsEejZGqC7tej5drsdBAXbMHyBT+Fne5s= github.com/ipld/go-codec-dagpb v1.3.0 h1:czTcaoAuNNyIYWs6Qe01DJ+sEX7B+1Z0LcXjSatMGe8= github.com/ipld/go-codec-dagpb v1.3.0/go.mod h1:ga4JTU3abYApDC3pZ00BC2RSvC3qfBb9MSJkMLSwnhA= @@ -1482,8 +1482,9 @@ github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPw github.com/multiformats/go-multicodec v0.2.0/go.mod h1:/y4YVwkfMyry5kFbMTbLJKErhycTIftytRV+llXdyS4= github.com/multiformats/go-multicodec v0.2.1-0.20210713081508-b421db6850ae/go.mod h1:qGGaQmioCDh+TeFOnxrbU0DaIPw8yFgAZgFG0V7p1qQ= github.com/multiformats/go-multicodec v0.2.1-0.20210714093213-b2b5bd6fe68b/go.mod h1:qGGaQmioCDh+TeFOnxrbU0DaIPw8yFgAZgFG0V7p1qQ= -github.com/multiformats/go-multicodec v0.3.0 h1:tstDwfIjiHbnIjeM5Lp+pMrSeN+LCMsEwOrkPmWm03A= github.com/multiformats/go-multicodec v0.3.0/go.mod h1:qGGaQmioCDh+TeFOnxrbU0DaIPw8yFgAZgFG0V7p1qQ= +github.com/multiformats/go-multicodec v0.3.1-0.20210902112759-1539a079fd61 h1:ZrUuMKNgJ52qHPoQ+bx0h0uBfcWmN7Px+4uKSZeesiI= +github.com/multiformats/go-multicodec v0.3.1-0.20210902112759-1539a079fd61/go.mod h1:1Hj/eHRaVWSXiSNNfcEPcwZleTmdNP81xlxDLnWU9GQ= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po= github.com/multiformats/go-multihash v0.0.8/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= From fcb7cd0eb08f45ba84e543a60571951d5f069e5f Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Mon, 22 Nov 2021 19:49:38 -0500 Subject: [PATCH 031/393] Shed: Add a util to send a batch of messages --- chain/messagepool/messagepool.go | 6 +- cmd/lotus-shed/main.go | 1 + cmd/lotus-shed/send-csv.go | 104 +++++++++++++++++++++++++++++++ 3 files changed, 108 insertions(+), 3 deletions(-) create mode 100644 cmd/lotus-shed/send-csv.go diff --git a/chain/messagepool/messagepool.go b/chain/messagepool/messagepool.go index 06343e9c978..e97dfea7b7a 100644 --- a/chain/messagepool/messagepool.go +++ b/chain/messagepool/messagepool.go @@ -196,10 +196,10 @@ func ComputeMinRBF(curPrem abi.TokenAmount) abi.TokenAmount { return types.BigAdd(minPrice, types.NewInt(1)) } -func CapGasFee(mff dtypes.DefaultMaxFeeFunc, msg *types.Message, sendSepc *api.MessageSendSpec) { +func CapGasFee(mff dtypes.DefaultMaxFeeFunc, msg *types.Message, sendSpec *api.MessageSendSpec) { var maxFee abi.TokenAmount - if sendSepc != nil { - maxFee = sendSepc.MaxFee + if sendSpec != nil { + maxFee = sendSpec.MaxFee } if maxFee.Int == nil || maxFee.Equals(big.Zero()) { mf, err := mff() diff --git a/cmd/lotus-shed/main.go b/cmd/lotus-shed/main.go index d35fb56dd8b..f4e6627cb3c 100644 --- a/cmd/lotus-shed/main.go +++ b/cmd/lotus-shed/main.go @@ -65,6 +65,7 @@ func main() { fr32Cmd, chainCmd, balancerCmd, + sendCsvCmd, } app := &cli.App{ diff --git a/cmd/lotus-shed/send-csv.go b/cmd/lotus-shed/send-csv.go new file mode 100644 index 00000000000..072605b8d51 --- /dev/null +++ b/cmd/lotus-shed/send-csv.go @@ -0,0 +1,104 @@ +package main + +import ( + "encoding/csv" + "fmt" + "os" + "strings" + + "github.com/ipfs/go-cid" + "github.com/urfave/cli/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/exitcode" + + lapi "github.com/filecoin-project/lotus/api" + "github.com/filecoin-project/lotus/chain/types" + lcli "github.com/filecoin-project/lotus/cli" +) + +var sendCsvCmd = &cli.Command{ + Name: "send-csv", + Usage: "Utility for sending a batch of balance transfers", + ArgsUsage: "[sender] [csvfile]", + Action: func(cctx *cli.Context) error { + if cctx.NArg() != 2 { + return xerrors.New("must supply sender and path to csv file") + } + + api, closer, err := lcli.GetFullNodeAPIV1(cctx) + if err != nil { + return err + } + + defer closer() + ctx := lcli.ReqContext(cctx) + + sender, err := address.NewFromString(cctx.Args().Get(0)) + if err != nil { + return err + } + + fileReader, err := os.Open(cctx.Args().Get(1)) + if err != nil { + return xerrors.Errorf("read csv: %w", err) + } + + defer fileReader.Close() //nolint:errcheck + r := csv.NewReader(fileReader) + records, err := r.ReadAll() + if err != nil { + return xerrors.Errorf("read csv: %w", err) + } + + var msgCids []cid.Cid + for i, e := range records[1:] { + addr, err := address.NewFromString(e[0]) + if err != nil { + return xerrors.Errorf("failed to parse address in row %d: %w", i, err) + } + + value, err := types.ParseFIL(strings.TrimSpace(e[1])) + if err != nil { + return xerrors.Errorf("failed to parse value balance: %w", err) + } + + smsg, err := api.MpoolPushMessage(ctx, &types.Message{ + To: addr, + From: sender, + Value: abi.TokenAmount(value), + }, nil) + if err != nil { + return err + } + + fmt.Printf("sending %s to %s in msg %s\n", value.String(), addr, smsg.Cid()) + + if i > 0 && i%100 == 0 { + fmt.Printf("catching up until latest message lands") + _, err := api.StateWaitMsg(ctx, smsg.Cid(), 1, lapi.LookbackNoLimit, true) + if err != nil { + return err + } + } + + msgCids = append(msgCids, smsg.Cid()) + } + + fmt.Println("waiting on messages") + + for _, msgCid := range msgCids { + ml, err := api.StateWaitMsg(ctx, msgCid, 5, lapi.LookbackNoLimit, true) + if err != nil { + return err + } + if ml.Receipt.ExitCode != exitcode.Ok { + fmt.Printf("MSG %s NON-ZERO EXITCODE: %s\n", msgCid, ml.Receipt.ExitCode) + } + } + + return nil + }, +} From c9a557e0d97a5240d022573da3f498cbcaef642d Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Wed, 24 Nov 2021 14:34:28 -0500 Subject: [PATCH 032/393] Address review --- cmd/lotus-shed/send-csv.go | 38 +++++++++++++++++++++++++++----------- 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/cmd/lotus-shed/send-csv.go b/cmd/lotus-shed/send-csv.go index 072605b8d51..2ecd6345bf4 100644 --- a/cmd/lotus-shed/send-csv.go +++ b/cmd/lotus-shed/send-csv.go @@ -20,12 +20,19 @@ import ( ) var sendCsvCmd = &cli.Command{ - Name: "send-csv", - Usage: "Utility for sending a batch of balance transfers", - ArgsUsage: "[sender] [csvfile]", + Name: "send-csv", + Usage: "Utility for sending a batch of balance transfers", + Flags: []cli.Flag{ + &cli.StringFlag{ + Name: "from", + Usage: "specify the account to send funds from", + Required: true, + }, + }, + ArgsUsage: "[csvfile]", Action: func(cctx *cli.Context) error { - if cctx.NArg() != 2 { - return xerrors.New("must supply sender and path to csv file") + if cctx.NArg() != 1 { + return xerrors.New("must supply path to csv file") } api, closer, err := lcli.GetFullNodeAPIV1(cctx) @@ -36,12 +43,12 @@ var sendCsvCmd = &cli.Command{ defer closer() ctx := lcli.ReqContext(cctx) - sender, err := address.NewFromString(cctx.Args().Get(0)) + sender, err := address.NewFromString(cctx.String("from")) if err != nil { return err } - fileReader, err := os.Open(cctx.Args().Get(1)) + fileReader, err := os.Open(cctx.Args().First()) if err != nil { return xerrors.Errorf("read csv: %w", err) } @@ -53,7 +60,11 @@ var sendCsvCmd = &cli.Command{ return xerrors.Errorf("read csv: %w", err) } - var msgCids []cid.Cid + if strings.TrimSpace(records[0][0]) != "Recipient" || strings.TrimSpace(records[0][1]) != "FIL" { + return xerrors.Errorf("expected header row to be \"Recipient, FIL\"") + } + + var msgs []*types.Message for i, e := range records[1:] { addr, err := address.NewFromString(e[0]) if err != nil { @@ -65,16 +76,21 @@ var sendCsvCmd = &cli.Command{ return xerrors.Errorf("failed to parse value balance: %w", err) } - smsg, err := api.MpoolPushMessage(ctx, &types.Message{ + msgs = append(msgs, &types.Message{ To: addr, From: sender, Value: abi.TokenAmount(value), - }, nil) + }) + } + + var msgCids []cid.Cid + for i, msg := range msgs { + smsg, err := api.MpoolPushMessage(ctx, msg, nil) if err != nil { return err } - fmt.Printf("sending %s to %s in msg %s\n", value.String(), addr, smsg.Cid()) + fmt.Printf("sending %s to %s in msg %s\n", msg.Value.String(), msg.To, smsg.Cid()) if i > 0 && i%100 == 0 { fmt.Printf("catching up until latest message lands") From b0a9a272880b7e72cca5d5b33b9f9ff654e0a883 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Thu, 25 Nov 2021 17:21:50 -0500 Subject: [PATCH 033/393] Shed: Allow send-csv to specify params and method --- cmd/lotus-shed/send-csv.go | 48 +++++++++++++++++++++++++++++++------- 1 file changed, 40 insertions(+), 8 deletions(-) diff --git a/cmd/lotus-shed/send-csv.go b/cmd/lotus-shed/send-csv.go index 2ecd6345bf4..ce1c8b68a74 100644 --- a/cmd/lotus-shed/send-csv.go +++ b/cmd/lotus-shed/send-csv.go @@ -2,8 +2,10 @@ package main import ( "encoding/csv" + "encoding/hex" "fmt" "os" + "strconv" "strings" "github.com/ipfs/go-cid" @@ -43,6 +45,12 @@ var sendCsvCmd = &cli.Command{ defer closer() ctx := lcli.ReqContext(cctx) + srv, err := lcli.GetFullNodeServices(cctx) + if err != nil { + return err + } + defer srv.Close() //nolint:errcheck + sender, err := address.NewFromString(cctx.String("from")) if err != nil { return err @@ -60,8 +68,11 @@ var sendCsvCmd = &cli.Command{ return xerrors.Errorf("read csv: %w", err) } - if strings.TrimSpace(records[0][0]) != "Recipient" || strings.TrimSpace(records[0][1]) != "FIL" { - return xerrors.Errorf("expected header row to be \"Recipient, FIL\"") + if strings.TrimSpace(records[0][0]) != "Recipient" || + strings.TrimSpace(records[0][1]) != "FIL" || + strings.TrimSpace(records[0][2]) != "Method" || + strings.TrimSpace(records[0][3]) != "Params" { + return xerrors.Errorf("expected header row to be \"Recipient, FIL, Method, Params\"") } var msgs []*types.Message @@ -76,21 +87,41 @@ var sendCsvCmd = &cli.Command{ return xerrors.Errorf("failed to parse value balance: %w", err) } + method, err := strconv.Atoi(strings.TrimSpace(e[2])) + if err != nil { + return xerrors.Errorf("failed to parse method number: %w", err) + } + + var params []byte + if strings.TrimSpace(e[3]) != "nil" { + params, err = hex.DecodeString(strings.TrimSpace(e[3])) + if err != nil { + return xerrors.Errorf("failed to parse hexparams: %w", err) + } + } + msgs = append(msgs, &types.Message{ - To: addr, - From: sender, - Value: abi.TokenAmount(value), + To: addr, + From: sender, + Value: abi.TokenAmount(value), + Method: abi.MethodNum(method), + Params: params, }) } + if len(msgs) == 0 { + return nil + } + var msgCids []cid.Cid for i, msg := range msgs { smsg, err := api.MpoolPushMessage(ctx, msg, nil) if err != nil { - return err + fmt.Printf("%d, ERROR %s\n", i, err) + continue } - fmt.Printf("sending %s to %s in msg %s\n", msg.Value.String(), msg.To, smsg.Cid()) + fmt.Printf("%d, %s\n", i, smsg.Cid()) if i > 0 && i%100 == 0 { fmt.Printf("catching up until latest message lands") @@ -103,7 +134,7 @@ var sendCsvCmd = &cli.Command{ msgCids = append(msgCids, smsg.Cid()) } - fmt.Println("waiting on messages") + fmt.Println("waiting on messages...") for _, msgCid := range msgCids { ml, err := api.StateWaitMsg(ctx, msgCid, 5, lapi.LookbackNoLimit, true) @@ -115,6 +146,7 @@ var sendCsvCmd = &cli.Command{ } } + fmt.Println("all sent messages succeeded") return nil }, } From 13b260e7f7380e889d8d4fffaefec495f38d93e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 8 Dec 2021 23:16:27 +0100 Subject: [PATCH 034/393] piecereader: Move closer to storage --- extern/sector-storage/mock/mock.go | 13 ++- extern/sector-storage/piece_provider.go | 102 +++++++++--------- extern/sector-storage/piece_provider_test.go | 2 +- .../sector-storage/piece_reader.go | 25 +++-- markets/dagstore/miner_api.go | 31 +++--- markets/dagstore/miner_api_test.go | 17 ++- markets/dagstore/mocks/mock_lotus_accessor.go | 18 ++-- markets/dagstore/mount.go | 6 +- markets/dagstore/mount_test.go | 27 ++++- markets/dagstore/wrapper_migration_test.go | 19 ++-- markets/dagstore/wrapper_test.go | 5 +- markets/sectoraccessor/sectoraccessor.go | 24 ++--- 12 files changed, 167 insertions(+), 122 deletions(-) rename markets/dagstore/piecereader.go => extern/sector-storage/piece_reader.go (90%) diff --git a/extern/sector-storage/mock/mock.go b/extern/sector-storage/mock/mock.go index eeb1404adaf..4d0592d3667 100644 --- a/extern/sector-storage/mock/mock.go +++ b/extern/sector-storage/mock/mock.go @@ -12,6 +12,7 @@ import ( proof5 "github.com/filecoin-project/specs-actors/v5/actors/runtime/proof" + "github.com/filecoin-project/dagstore/mount" ffiwrapper2 "github.com/filecoin-project/go-commp-utils/ffiwrapper" commcid "github.com/filecoin-project/go-fil-commcid" "github.com/filecoin-project/go-state-types/abi" @@ -384,12 +385,20 @@ func generateFakePoSt(sectorInfo []proof5.SectorInfo, rpt func(abi.RegisteredSea } } -func (mgr *SectorMgr) ReadPiece(ctx context.Context, sector storage.SectorRef, offset storiface.UnpaddedByteIndex, startOffset uint64, size abi.UnpaddedPieceSize, ticket abi.SealRandomness, unsealed cid.Cid) (io.ReadCloser, bool, error) { +func (mgr *SectorMgr) ReadPiece(ctx context.Context, sector storage.SectorRef, offset storiface.UnpaddedByteIndex, size abi.UnpaddedPieceSize, ticket abi.SealRandomness, unsealed cid.Cid) (mount.Reader, bool, error) { if uint64(offset) != 0 { panic("implme") } - return ioutil.NopCloser(bytes.NewReader(mgr.pieces[mgr.sectors[sector.ID].pieces[0]][startOffset:size])), false, nil + return struct { + io.ReadCloser + io.Seeker + io.ReaderAt + }{ + ReadCloser: ioutil.NopCloser(bytes.NewReader(mgr.pieces[mgr.sectors[sector.ID].pieces[0]][:size])), + Seeker: nil, + ReaderAt: nil, + }, false, nil } func (mgr *SectorMgr) StageFakeData(mid abi.ActorID, spt abi.RegisteredSealProof) (storage.SectorRef, []abi.PieceInfo, error) { diff --git a/extern/sector-storage/piece_provider.go b/extern/sector-storage/piece_provider.go index aa2ef0d0d9c..c500b4e3037 100644 --- a/extern/sector-storage/piece_provider.go +++ b/extern/sector-storage/piece_provider.go @@ -8,6 +8,7 @@ import ( "github.com/ipfs/go-cid" "golang.org/x/xerrors" + "github.com/filecoin-project/dagstore/mount" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/specs-storage/storage" @@ -27,7 +28,7 @@ type PieceProvider interface { // default in most cases, but this might matter with future PoRep) // startOffset is added to the pieceOffset to get the starting reader offset. // The number of bytes that can be read is pieceSize-startOffset - ReadPiece(ctx context.Context, sector storage.SectorRef, pieceOffset storiface.UnpaddedByteIndex, startOffset uint64, pieceSize abi.UnpaddedPieceSize, ticket abi.SealRandomness, unsealed cid.Cid) (io.ReadCloser, bool, error) + ReadPiece(ctx context.Context, sector storage.SectorRef, pieceOffset storiface.UnpaddedByteIndex, pieceSize abi.UnpaddedPieceSize, ticket abi.SealRandomness, unsealed cid.Cid) (mount.Reader, bool, error) IsUnsealed(ctx context.Context, sector storage.SectorRef, offset storiface.UnpaddedByteIndex, size abi.UnpaddedPieceSize) (bool, error) } @@ -71,28 +72,62 @@ func (p *pieceProvider) IsUnsealed(ctx context.Context, sector storage.SectorRef // It will NOT try to schedule an Unseal of a sealed sector file for the read. // // Returns a nil reader if the piece does NOT exist in any unsealed file or there is no unsealed file for the given sector on any of the workers. -func (p *pieceProvider) tryReadUnsealedPiece(ctx context.Context, sector storage.SectorRef, pieceOffset, startOffset storiface.UnpaddedByteIndex, size abi.UnpaddedPieceSize) (io.ReadCloser, context.CancelFunc, error) { +func (p *pieceProvider) tryReadUnsealedPiece(ctx context.Context, pc cid.Cid, sector storage.SectorRef, pieceOffset storiface.UnpaddedByteIndex, size abi.UnpaddedPieceSize) (mount.Reader, error) { // acquire a lock purely for reading unsealed sectors ctx, cancel := context.WithCancel(ctx) if err := p.index.StorageLock(ctx, sector.ID, storiface.FTUnsealed, storiface.FTNone); err != nil { cancel() - return nil, nil, xerrors.Errorf("acquiring read sector lock: %w", err) + return nil, xerrors.Errorf("acquiring read sector lock: %w", err) } - // Reader returns a reader for an unsealed piece at the given offset in the given sector. - // The returned reader will be nil if none of the workers has an unsealed sector file containing - // the unsealed piece. - r, err := p.storage.Reader(ctx, sector, abi.PaddedPieceSize(pieceOffset.Padded()+startOffset.Padded()), size.Padded()-abi.PaddedPieceSize(startOffset.Padded())) - if err != nil { - log.Debugf("did not get storage reader;sector=%+v, err:%s", sector.ID, err) - cancel() - return nil, nil, err - } - if r == nil { + pr, err := (&pieceReader{ + ctx: ctx, + getReader: func(ctx context.Context, startOffset uint64) (io.ReadCloser, error) { + startOffsetAligned := storiface.UnpaddedByteIndex(startOffset / 127 * 127) // floor to multiple of 127 + + // Reader returns a reader for an unsealed piece at the given offset in the given sector. + // The returned reader will be nil if none of the workers has an unsealed sector file containing + // the unsealed piece. + r, err := p.storage.Reader(ctx, sector, abi.PaddedPieceSize(pieceOffset.Padded()+startOffsetAligned.Padded()), size.Padded()-abi.PaddedPieceSize(startOffsetAligned.Padded())) + if err != nil { + log.Debugf("did not get storage reader;sector=%+v, err:%s", sector.ID, err) + return nil, err + } + if r == nil { + return nil, nil + } + + upr, err := fr32.NewUnpadReader(r, size.Padded()) + if err != nil { + r.Close() // nolint + return nil, xerrors.Errorf("creating unpadded reader: %w", err) + } + + bir := bufio.NewReaderSize(upr, 127) + if startOffset > uint64(startOffsetAligned) { + if _, err := bir.Discard(int(startOffset - uint64(startOffsetAligned))); err != nil { + return nil, xerrors.Errorf("discarding bytes for startOffset: %w", err) + } + } + + return struct { + io.Reader + io.Closer + }{ + Reader: bir, + Closer: r, + }, nil + }, + len: size, + onClose: cancel, + pieceCid: pc, + }).init() + if err != nil || pr == nil { // pr == nil to make sure we don't return typed nil cancel() + return nil, err } - return r, cancel, nil + return pr, err } // ReadPiece is used to read an Unsealed piece at the given offset and of the given size from a Sector @@ -101,7 +136,7 @@ func (p *pieceProvider) tryReadUnsealedPiece(ctx context.Context, sector storage // If we do NOT have an existing unsealed file containing the given piece thus causing us to schedule an Unseal, // the returned boolean parameter will be set to true. // If we have an existing unsealed file containing the given piece, the returned boolean will be set to false. -func (p *pieceProvider) ReadPiece(ctx context.Context, sector storage.SectorRef, pieceOffset storiface.UnpaddedByteIndex, startOffset uint64, size abi.UnpaddedPieceSize, ticket abi.SealRandomness, unsealed cid.Cid) (io.ReadCloser, bool, error) { +func (p *pieceProvider) ReadPiece(ctx context.Context, sector storage.SectorRef, pieceOffset storiface.UnpaddedByteIndex, size abi.UnpaddedPieceSize, ticket abi.SealRandomness, unsealed cid.Cid) (mount.Reader, bool, error) { if err := pieceOffset.Valid(); err != nil { return nil, false, xerrors.Errorf("pieceOffset is not valid: %w", err) } @@ -109,9 +144,7 @@ func (p *pieceProvider) ReadPiece(ctx context.Context, sector storage.SectorRef, return nil, false, xerrors.Errorf("size is not a valid piece size: %w", err) } - startOffsetAligned := storiface.UnpaddedByteIndex(startOffset / 127 * 127) // floor to multiple of 127 - - r, unlock, err := p.tryReadUnsealedPiece(ctx, sector, pieceOffset, startOffsetAligned, size) + r, err := p.tryReadUnsealedPiece(ctx, unsealed, sector, pieceOffset, size) log.Debugf("result of first tryReadUnsealedPiece: r=%+v, err=%s", r, err) @@ -142,7 +175,7 @@ func (p *pieceProvider) ReadPiece(ctx context.Context, sector storage.SectorRef, log.Debugf("unsealed a sector file to read the piece, sector=%+v, pieceOffset=%d, size=%d", sector, pieceOffset, size) - r, unlock, err = p.tryReadUnsealedPiece(ctx, sector, pieceOffset, startOffsetAligned, size) + r, err = p.tryReadUnsealedPiece(ctx, unsealed, sector, pieceOffset, size) if err != nil { log.Errorf("failed to tryReadUnsealedPiece after SectorsUnsealPiece: %s", err) return nil, true, xerrors.Errorf("read after unsealing: %w", err) @@ -156,34 +189,7 @@ func (p *pieceProvider) ReadPiece(ctx context.Context, sector storage.SectorRef, log.Debugf("unsealed piece already exists, no need to unseal, sector=%+v, pieceOffset=%d, size=%d", sector, pieceOffset, size) } - upr, err := fr32.NewUnpadReader(r, size.Padded()) - if err != nil { - unlock() - return nil, uns, xerrors.Errorf("creating unpadded reader: %w", err) - } - - log.Debugf("returning reader to read unsealed piece, sector=%+v, pieceOffset=%d, startOffset=%d, size=%d", sector, pieceOffset, startOffset, size) - - bir := bufio.NewReaderSize(upr, 127) - if startOffset > uint64(startOffsetAligned) { - if _, err := bir.Discard(int(startOffset - uint64(startOffsetAligned))); err != nil { - return nil, false, xerrors.Errorf("discarding bytes for startOffset: %w", err) - } - } - - return &funcCloser{ - Reader: bir, - close: func() error { - err = r.Close() - unlock() - return err - }, - }, uns, nil -} + log.Debugf("returning reader to read unsealed piece, sector=%+v, pieceOffset=%d, size=%d", sector, pieceOffset, size) -type funcCloser struct { - io.Reader - close func() error + return r, uns, nil } - -func (fc *funcCloser) Close() error { return fc.close() } diff --git a/extern/sector-storage/piece_provider_test.go b/extern/sector-storage/piece_provider_test.go index 1aad3d2d238..3ace2916ec6 100644 --- a/extern/sector-storage/piece_provider_test.go +++ b/extern/sector-storage/piece_provider_test.go @@ -338,7 +338,7 @@ func (p *pieceProviderTestHarness) isUnsealed(t *testing.T, offset storiface.Unp func (p *pieceProviderTestHarness) readPiece(t *testing.T, offset storiface.UnpaddedByteIndex, size abi.UnpaddedPieceSize, expectedHadToUnseal bool, expectedBytes []byte) { - rd, isUnsealed, err := p.pp.ReadPiece(p.ctx, p.sector, offset, 0, size, p.ticket, p.commD) + rd, isUnsealed, err := p.pp.ReadPiece(p.ctx, p.sector, offset, size, p.ticket, p.commD) require.NoError(t, err) require.NotNil(t, rd) require.Equal(t, expectedHadToUnseal, isUnsealed) diff --git a/markets/dagstore/piecereader.go b/extern/sector-storage/piece_reader.go similarity index 90% rename from markets/dagstore/piecereader.go rename to extern/sector-storage/piece_reader.go index 67cd10c27ea..14f13f01771 100644 --- a/markets/dagstore/piecereader.go +++ b/extern/sector-storage/piece_reader.go @@ -1,4 +1,4 @@ -package dagstore +package sectorstorage import ( "bufio" @@ -19,11 +19,14 @@ import ( var MaxPieceReaderBurnBytes int64 = 1 << 20 // 1M var ReadBuf = 128 * (127 * 8) // unpadded(128k) +type pieceGetter func(ctx context.Context, offset uint64) (io.ReadCloser, error) + type pieceReader struct { - ctx context.Context - api MinerAPI - pieceCid cid.Cid - len abi.UnpaddedPieceSize + ctx context.Context + getReader pieceGetter + pieceCid cid.Cid + len abi.UnpaddedPieceSize + onClose context.CancelFunc closed bool seqAt int64 // next byte to be read by io.Reader @@ -37,10 +40,14 @@ func (p *pieceReader) init() (_ *pieceReader, err error) { stats.Record(p.ctx, metrics.DagStorePRInitCount.M(1)) p.rAt = 0 - p.r, p.len, err = p.api.FetchUnsealedPiece(p.ctx, p.pieceCid, uint64(p.rAt)) + p.r, err = p.getReader(p.ctx, uint64(p.rAt)) if err != nil { return nil, err } + if p.r == nil { + return nil, nil + } + p.br = bufio.NewReaderSize(p.r, ReadBuf) return p, nil @@ -66,6 +73,10 @@ func (p *pieceReader) Close() error { p.r = nil } + p.onClose() + + p.closed = true + return nil } @@ -127,7 +138,7 @@ func (p *pieceReader) ReadAt(b []byte, off int64) (n int, err error) { } p.rAt = off - p.r, _, err = p.api.FetchUnsealedPiece(p.ctx, p.pieceCid, uint64(p.rAt)) + p.r, err = p.getReader(p.ctx, uint64(p.rAt)) p.br = bufio.NewReaderSize(p.r, ReadBuf) if err != nil { return 0, xerrors.Errorf("getting backing reader: %w", err) diff --git a/markets/dagstore/miner_api.go b/markets/dagstore/miner_api.go index d59a0584691..7f59162f0f0 100644 --- a/markets/dagstore/miner_api.go +++ b/markets/dagstore/miner_api.go @@ -3,22 +3,21 @@ package dagstore import ( "context" "fmt" - "io" - - "github.com/filecoin-project/dagstore/throttle" - "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" "golang.org/x/xerrors" + "github.com/filecoin-project/dagstore/mount" + "github.com/filecoin-project/dagstore/throttle" "github.com/filecoin-project/go-fil-markets/piecestore" "github.com/filecoin-project/go-fil-markets/retrievalmarket" "github.com/filecoin-project/go-fil-markets/shared" + "github.com/filecoin-project/go-state-types/abi" ) //go:generate go run github.com/golang/mock/mockgen -destination=mocks/mock_lotus_accessor.go -package=mock_dagstore . MinerAPI type MinerAPI interface { - FetchUnsealedPiece(ctx context.Context, pieceCid cid.Cid, offset uint64) (io.ReadCloser, abi.UnpaddedPieceSize, error) + FetchUnsealedPiece(ctx context.Context, pieceCid cid.Cid) (mount.Reader, error) GetUnpaddedCARSize(ctx context.Context, pieceCid cid.Cid) (uint64, error) IsUnsealed(ctx context.Context, pieceCid cid.Cid) (bool, error) Start(ctx context.Context) error @@ -27,7 +26,7 @@ type MinerAPI interface { type SectorAccessor interface { retrievalmarket.SectorAccessor - UnsealSectorAt(ctx context.Context, sectorID abi.SectorNumber, pieceOffset abi.UnpaddedPieceSize, startOffset uint64, length abi.UnpaddedPieceSize) (io.ReadCloser, error) + UnsealSectorAt(ctx context.Context, sectorID abi.SectorNumber, pieceOffset abi.UnpaddedPieceSize, length abi.UnpaddedPieceSize) (mount.Reader, error) } type minerAPI struct { @@ -100,10 +99,10 @@ func (m *minerAPI) IsUnsealed(ctx context.Context, pieceCid cid.Cid) (bool, erro return false, nil } -func (m *minerAPI) FetchUnsealedPiece(ctx context.Context, pieceCid cid.Cid, offset uint64) (io.ReadCloser, abi.UnpaddedPieceSize, error) { +func (m *minerAPI) FetchUnsealedPiece(ctx context.Context, pieceCid cid.Cid) (mount.Reader, error) { err := m.readyMgr.AwaitReady() if err != nil { - return nil, 0, err + return nil, err } // Throttle this path to avoid flooding the storage subsystem. @@ -114,11 +113,11 @@ func (m *minerAPI) FetchUnsealedPiece(ctx context.Context, pieceCid cid.Cid, off }) if err != nil { - return nil, 0, xerrors.Errorf("failed to fetch pieceInfo for piece %s: %w", pieceCid, err) + return nil, xerrors.Errorf("failed to fetch pieceInfo for piece %s: %w", pieceCid, err) } if len(pieceInfo.Deals) == 0 { - return nil, 0, xerrors.Errorf("no storage deals found for piece %s", pieceCid) + return nil, xerrors.Errorf("no storage deals found for piece %s", pieceCid) } // prefer an unsealed sector containing the piece if one exists @@ -126,7 +125,7 @@ func (m *minerAPI) FetchUnsealedPiece(ctx context.Context, pieceCid cid.Cid, off deal := deal // Throttle this path to avoid flooding the storage subsystem. - var reader io.ReadCloser + var reader mount.Reader err := m.throttle.Do(ctx, func(ctx context.Context) (err error) { isUnsealed, err := m.sa.IsUnsealed(ctx, deal.SectorID, deal.Offset.Unpadded(), deal.Length.Unpadded()) if err != nil { @@ -136,7 +135,7 @@ func (m *minerAPI) FetchUnsealedPiece(ctx context.Context, pieceCid cid.Cid, off return nil } // Because we know we have an unsealed copy, this UnsealSector call will actually not perform any unsealing. - reader, err = m.sa.UnsealSectorAt(ctx, deal.SectorID, deal.Offset.Unpadded(), offset, deal.Length.Unpadded()) + reader, err = m.sa.UnsealSectorAt(ctx, deal.SectorID, deal.Offset.Unpadded(), deal.Length.Unpadded()) return err }) @@ -147,7 +146,7 @@ func (m *minerAPI) FetchUnsealedPiece(ctx context.Context, pieceCid cid.Cid, off if reader != nil { // we were able to obtain a reader for an already unsealed piece - return reader, deal.Length.Unpadded(), nil + return reader, nil } } @@ -158,7 +157,7 @@ func (m *minerAPI) FetchUnsealedPiece(ctx context.Context, pieceCid cid.Cid, off // block for a long time with the current PoRep // // This path is unthrottled. - reader, err := m.sa.UnsealSectorAt(ctx, deal.SectorID, deal.Offset.Unpadded(), offset, deal.Length.Unpadded()) + reader, err := m.sa.UnsealSectorAt(ctx, deal.SectorID, deal.Offset.Unpadded(), deal.Length.Unpadded()) if err != nil { lastErr = xerrors.Errorf("failed to unseal deal %d: %w", deal.DealID, err) log.Warn(lastErr.Error()) @@ -166,10 +165,10 @@ func (m *minerAPI) FetchUnsealedPiece(ctx context.Context, pieceCid cid.Cid, off } // Successfully fetched the deal data so return a reader over the data - return reader, deal.Length.Unpadded(), nil + return reader, nil } - return nil, 0, lastErr + return nil, lastErr } func (m *minerAPI) GetUnpaddedCARSize(ctx context.Context, pieceCid cid.Cid) (uint64, error) { diff --git a/markets/dagstore/miner_api_test.go b/markets/dagstore/miner_api_test.go index 38c3a4fc37e..45cbf24610d 100644 --- a/markets/dagstore/miner_api_test.go +++ b/markets/dagstore/miner_api_test.go @@ -15,6 +15,7 @@ import ( "github.com/stretchr/testify/require" "golang.org/x/sync/errgroup" + "github.com/filecoin-project/dagstore/mount" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/specs-actors/actors/builtin/paych" @@ -87,7 +88,7 @@ func TestLotusAccessorFetchUnsealedPiece(t *testing.T) { } // Fetch the piece - r, _, err := api.FetchUnsealedPiece(ctx, cid1, 0) + r, err := api.FetchUnsealedPiece(ctx, cid1) if tc.expectErr { require.Error(t, err) return @@ -159,7 +160,7 @@ func TestThrottle(t *testing.T) { errgrp, ctx := errgroup.WithContext(context.Background()) for i := 0; i < 10; i++ { errgrp.Go(func() error { - r, _, err := api.FetchUnsealedPiece(ctx, cid1, 0) + r, err := api.FetchUnsealedPiece(ctx, cid1) if err == nil { _ = r.Close() } @@ -203,10 +204,10 @@ type mockRPN struct { } func (m *mockRPN) UnsealSector(ctx context.Context, sectorID abi.SectorNumber, offset abi.UnpaddedPieceSize, length abi.UnpaddedPieceSize) (io.ReadCloser, error) { - return m.UnsealSectorAt(ctx, sectorID, offset, 0, length) + return m.UnsealSectorAt(ctx, sectorID, offset, length) } -func (m *mockRPN) UnsealSectorAt(ctx context.Context, sectorID abi.SectorNumber, pieceOffset abi.UnpaddedPieceSize, startOffset uint64, length abi.UnpaddedPieceSize) (io.ReadCloser, error) { +func (m *mockRPN) UnsealSectorAt(ctx context.Context, sectorID abi.SectorNumber, pieceOffset abi.UnpaddedPieceSize, length abi.UnpaddedPieceSize) (mount.Reader, error) { atomic.AddInt32(&m.calls, 1) m.lk.RLock() defer m.lk.RUnlock() @@ -215,7 +216,13 @@ func (m *mockRPN) UnsealSectorAt(ctx context.Context, sectorID abi.SectorNumber, if !ok { panic("sector not found") } - return io.NopCloser(bytes.NewBuffer([]byte(data[startOffset:]))), nil + return struct { + io.ReadCloser + io.ReaderAt + io.Seeker + }{ + ReadCloser: io.NopCloser(bytes.NewBuffer([]byte(data[:]))), + }, nil } func (m *mockRPN) IsUnsealed(ctx context.Context, sectorID abi.SectorNumber, offset abi.UnpaddedPieceSize, length abi.UnpaddedPieceSize) (bool, error) { diff --git a/markets/dagstore/mocks/mock_lotus_accessor.go b/markets/dagstore/mocks/mock_lotus_accessor.go index e10a1b0539b..19923cc2ae6 100644 --- a/markets/dagstore/mocks/mock_lotus_accessor.go +++ b/markets/dagstore/mocks/mock_lotus_accessor.go @@ -6,10 +6,9 @@ package mock_dagstore import ( context "context" - io "io" reflect "reflect" - abi "github.com/filecoin-project/go-state-types/abi" + mount "github.com/filecoin-project/dagstore/mount" gomock "github.com/golang/mock/gomock" cid "github.com/ipfs/go-cid" ) @@ -38,19 +37,18 @@ func (m *MockMinerAPI) EXPECT() *MockMinerAPIMockRecorder { } // FetchUnsealedPiece mocks base method. -func (m *MockMinerAPI) FetchUnsealedPiece(arg0 context.Context, arg1 cid.Cid, arg2 uint64) (io.ReadCloser, abi.UnpaddedPieceSize, error) { +func (m *MockMinerAPI) FetchUnsealedPiece(arg0 context.Context, arg1 cid.Cid) (mount.Reader, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "FetchUnsealedPiece", arg0, arg1, arg2) - ret0, _ := ret[0].(io.ReadCloser) - ret1, _ := ret[1].(abi.UnpaddedPieceSize) - ret2, _ := ret[2].(error) - return ret0, ret1, ret2 + ret := m.ctrl.Call(m, "FetchUnsealedPiece", arg0, arg1) + ret0, _ := ret[0].(mount.Reader) + ret1, _ := ret[1].(error) + return ret0, ret1 } // FetchUnsealedPiece indicates an expected call of FetchUnsealedPiece. -func (mr *MockMinerAPIMockRecorder) FetchUnsealedPiece(arg0, arg1, arg2 interface{}) *gomock.Call { +func (mr *MockMinerAPIMockRecorder) FetchUnsealedPiece(arg0, arg1 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchUnsealedPiece", reflect.TypeOf((*MockMinerAPI)(nil).FetchUnsealedPiece), arg0, arg1, arg2) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchUnsealedPiece", reflect.TypeOf((*MockMinerAPI)(nil).FetchUnsealedPiece), arg0, arg1) } // GetUnpaddedCARSize mocks base method. diff --git a/markets/dagstore/mount.go b/markets/dagstore/mount.go index e4e6242d7e1..0ecdc98082c 100644 --- a/markets/dagstore/mount.go +++ b/markets/dagstore/mount.go @@ -56,11 +56,7 @@ func (l *LotusMount) Deserialize(u *url.URL) error { } func (l *LotusMount) Fetch(ctx context.Context) (mount.Reader, error) { - return (&pieceReader{ - ctx: ctx, - api: l.API, - pieceCid: l.PieceCid, - }).init() + return l.API.FetchUnsealedPiece(ctx, l.PieceCid) } func (l *LotusMount) Info() mount.Info { diff --git a/markets/dagstore/mount_test.go b/markets/dagstore/mount_test.go index 82005878602..d6ea549643d 100644 --- a/markets/dagstore/mount_test.go +++ b/markets/dagstore/mount_test.go @@ -2,6 +2,7 @@ package dagstore import ( "context" + "io" "io/ioutil" "net/url" "strings" @@ -12,8 +13,6 @@ import ( "github.com/stretchr/testify/require" "github.com/filecoin-project/dagstore/mount" - "github.com/filecoin-project/go-state-types/abi" - mock_dagstore "github.com/filecoin-project/lotus/markets/dagstore/mocks" ) @@ -30,8 +29,28 @@ func TestLotusMount(t *testing.T) { mockLotusMountAPI := mock_dagstore.NewMockMinerAPI(mockCtrl) mockLotusMountAPI.EXPECT().IsUnsealed(gomock.Any(), cid).Return(true, nil).Times(1) - mockLotusMountAPI.EXPECT().FetchUnsealedPiece(gomock.Any(), cid, uint64(0)).Return(ioutil.NopCloser(strings.NewReader("testing")), abi.UnpaddedPieceSize(7), nil).Times(1) - mockLotusMountAPI.EXPECT().FetchUnsealedPiece(gomock.Any(), cid, uint64(0)).Return(ioutil.NopCloser(strings.NewReader("testing")), abi.UnpaddedPieceSize(7), nil).Times(1) + + mr1 := struct { + io.ReadCloser + io.ReaderAt + io.Seeker + }{ + ReadCloser: ioutil.NopCloser(strings.NewReader("testing")), + ReaderAt: nil, + Seeker: nil, + } + mr2 := struct { + io.ReadCloser + io.ReaderAt + io.Seeker + }{ + ReadCloser: ioutil.NopCloser(strings.NewReader("testing")), + ReaderAt: nil, + Seeker: nil, + } + + mockLotusMountAPI.EXPECT().FetchUnsealedPiece(gomock.Any(), cid).Return(mr1, nil).Times(1) + mockLotusMountAPI.EXPECT().FetchUnsealedPiece(gomock.Any(), cid).Return(mr2, nil).Times(1) mockLotusMountAPI.EXPECT().GetUnpaddedCARSize(ctx, cid).Return(uint64(100), nil).Times(1) mnt, err := NewLotusMount(cid, mockLotusMountAPI) diff --git a/markets/dagstore/wrapper_migration_test.go b/markets/dagstore/wrapper_migration_test.go index 5021054997f..e46f8779beb 100644 --- a/markets/dagstore/wrapper_migration_test.go +++ b/markets/dagstore/wrapper_migration_test.go @@ -6,9 +6,9 @@ import ( "testing" "github.com/stretchr/testify/require" - "golang.org/x/xerrors" "github.com/filecoin-project/dagstore" + "github.com/filecoin-project/dagstore/mount" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-fil-markets/retrievalmarket" @@ -127,17 +127,20 @@ type wrappedSA struct { retrievalmarket.SectorAccessor } -func (w *wrappedSA) UnsealSectorAt(ctx context.Context, sectorID abi.SectorNumber, pieceOffset abi.UnpaddedPieceSize, startOffset uint64, length abi.UnpaddedPieceSize) (io.ReadCloser, error) { +func (w *wrappedSA) UnsealSectorAt(ctx context.Context, sectorID abi.SectorNumber, pieceOffset abi.UnpaddedPieceSize, length abi.UnpaddedPieceSize) (mount.Reader, error) { r, err := w.UnsealSector(ctx, sectorID, pieceOffset, length) if err != nil { return nil, err } - if startOffset > 0 { - if _, err := io.CopyN(io.Discard, r, int64(startOffset)); err != nil { - return nil, xerrors.Errorf("discard start off: %w", err) - } - } - return r, err + return struct { + io.ReadCloser + io.Seeker + io.ReaderAt + }{ + ReadCloser: r, + Seeker: nil, + ReaderAt: nil, + }, err } var _ SectorAccessor = &wrappedSA{} diff --git a/markets/dagstore/wrapper_test.go b/markets/dagstore/wrapper_test.go index a4a6215e105..48e01100b38 100644 --- a/markets/dagstore/wrapper_test.go +++ b/markets/dagstore/wrapper_test.go @@ -3,7 +3,6 @@ package dagstore import ( "bytes" "context" - "io" "os" "testing" "time" @@ -12,8 +11,6 @@ import ( "github.com/stretchr/testify/require" "golang.org/x/xerrors" - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/dagstore" "github.com/filecoin-project/dagstore/mount" "github.com/filecoin-project/dagstore/shard" @@ -192,7 +189,7 @@ func (m mockLotusMount) Start(ctx context.Context) error { return nil } -func (m mockLotusMount) FetchUnsealedPiece(ctx context.Context, pieceCid cid.Cid, offset uint64) (io.ReadCloser, abi.UnpaddedPieceSize, error) { +func (m mockLotusMount) FetchUnsealedPiece(context.Context, cid.Cid) (mount.Reader, error) { panic("implement me") } diff --git a/markets/sectoraccessor/sectoraccessor.go b/markets/sectoraccessor/sectoraccessor.go index f70aca1034c..4320e3fb1e9 100644 --- a/markets/sectoraccessor/sectoraccessor.go +++ b/markets/sectoraccessor/sectoraccessor.go @@ -4,8 +4,16 @@ import ( "context" "io" + "github.com/ipfs/go-cid" + logging "github.com/ipfs/go-log/v2" "golang.org/x/xerrors" + "github.com/filecoin-project/dagstore/mount" + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-fil-markets/retrievalmarket" + "github.com/filecoin-project/go-state-types/abi" + specstorage "github.com/filecoin-project/specs-storage/storage" + "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/api/v1api" "github.com/filecoin-project/lotus/chain/types" @@ -14,14 +22,6 @@ import ( "github.com/filecoin-project/lotus/markets/dagstore" "github.com/filecoin-project/lotus/node/modules/dtypes" "github.com/filecoin-project/lotus/storage/sectorblocks" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-fil-markets/retrievalmarket" - "github.com/filecoin-project/go-state-types/abi" - specstorage "github.com/filecoin-project/specs-storage/storage" - - "github.com/ipfs/go-cid" - logging "github.com/ipfs/go-log/v2" ) var log = logging.Logger("sectoraccessor") @@ -40,10 +40,10 @@ func NewSectorAccessor(maddr dtypes.MinerAddress, secb sectorblocks.SectorBuilde } func (sa *sectorAccessor) UnsealSector(ctx context.Context, sectorID abi.SectorNumber, pieceOffset abi.UnpaddedPieceSize, length abi.UnpaddedPieceSize) (io.ReadCloser, error) { - return sa.UnsealSectorAt(ctx, sectorID, pieceOffset, 0, length) + return sa.UnsealSectorAt(ctx, sectorID, pieceOffset, length) } -func (sa *sectorAccessor) UnsealSectorAt(ctx context.Context, sectorID abi.SectorNumber, pieceOffset abi.UnpaddedPieceSize, startOffset uint64, length abi.UnpaddedPieceSize) (io.ReadCloser, error) { +func (sa *sectorAccessor) UnsealSectorAt(ctx context.Context, sectorID abi.SectorNumber, pieceOffset abi.UnpaddedPieceSize, length abi.UnpaddedPieceSize) (mount.Reader, error) { log.Debugf("get sector %d, pieceOffset %d, length %d", sectorID, pieceOffset, length) si, err := sa.sectorsStatus(ctx, sectorID, false) if err != nil { @@ -69,8 +69,8 @@ func (sa *sectorAccessor) UnsealSectorAt(ctx context.Context, sectorID abi.Secto } // Get a reader for the piece, unsealing the piece if necessary - log.Debugf("read piece in sector %d, pieceOffset %d, startOffset %d, length %d from miner %d", sectorID, pieceOffset, startOffset, length, mid) - r, unsealed, err := sa.pp.ReadPiece(ctx, ref, storiface.UnpaddedByteIndex(pieceOffset), startOffset, length, si.Ticket.Value, commD) + log.Debugf("read piece in sector %d, pieceOffset %d, length %d from miner %d", sectorID, pieceOffset, length, mid) + r, unsealed, err := sa.pp.ReadPiece(ctx, ref, storiface.UnpaddedByteIndex(pieceOffset), length, si.Ticket.Value, commD) if err != nil { return nil, xerrors.Errorf("failed to unseal piece from sector %d: %w", sectorID, err) } From 072297e6617209d7d008412755671f183511968c Mon Sep 17 00:00:00 2001 From: whyrusleeping Date: Thu, 18 Nov 2021 17:50:25 -0800 Subject: [PATCH 035/393] WIP: updating to new datastore/blockstore code with contexts --- blockstore/api.go | 20 +- blockstore/badger/blockstore.go | 18 +- blockstore/badger/blockstore_test.go | 14 +- blockstore/badger/blockstore_test_suite.go | 58 +-- blockstore/blockstore.go | 12 +- blockstore/buffered.go | 52 +-- blockstore/discard.go | 28 +- blockstore/fallback.go | 10 +- blockstore/idstore.go | 36 +- blockstore/ipfs.go | 24 +- blockstore/mem.go | 20 +- blockstore/sync.go | 34 +- blockstore/timed.go | 42 +- blockstore/timed_test.go | 24 +- blockstore/union.go | 36 +- blockstore/union_test.go | 40 +- extern/filecoin-ffi | 2 +- go.mod | 38 +- go.sum | 426 +++++++-------------- lib/backupds/backupds_test.go | 7 +- lib/backupds/datastore.go | 49 +-- lib/backupds/log.go | 10 +- lib/backupds/read.go | 7 +- 23 files changed, 452 insertions(+), 555 deletions(-) diff --git a/blockstore/api.go b/blockstore/api.go index 6715b476677..348c0f84e23 100644 --- a/blockstore/api.go +++ b/blockstore/api.go @@ -25,35 +25,35 @@ func NewAPIBlockstore(cio ChainIO) Blockstore { return Adapt(bs) // return an adapted blockstore. } -func (a *apiBlockstore) DeleteBlock(cid.Cid) error { +func (a *apiBlockstore) DeleteBlock(context.Context, cid.Cid) error { return xerrors.New("not supported") } -func (a *apiBlockstore) Has(c cid.Cid) (bool, error) { - return a.api.ChainHasObj(context.TODO(), c) +func (a *apiBlockstore) Has(ctx context.Context, c cid.Cid) (bool, error) { + return a.api.ChainHasObj(ctx, c) } -func (a *apiBlockstore) Get(c cid.Cid) (blocks.Block, error) { - bb, err := a.api.ChainReadObj(context.TODO(), c) +func (a *apiBlockstore) Get(ctx context.Context, c cid.Cid) (blocks.Block, error) { + bb, err := a.api.ChainReadObj(ctx, c) if err != nil { return nil, err } return blocks.NewBlockWithCid(bb, c) } -func (a *apiBlockstore) GetSize(c cid.Cid) (int, error) { - bb, err := a.api.ChainReadObj(context.TODO(), c) +func (a *apiBlockstore) GetSize(ctx context.Context, c cid.Cid) (int, error) { + bb, err := a.api.ChainReadObj(ctx, c) if err != nil { return 0, err } return len(bb), nil } -func (a *apiBlockstore) Put(blocks.Block) error { +func (a *apiBlockstore) Put(context.Context, blocks.Block) error { return xerrors.New("not supported") } -func (a *apiBlockstore) PutMany([]blocks.Block) error { +func (a *apiBlockstore) PutMany(context.Context, []blocks.Block) error { return xerrors.New("not supported") } @@ -61,6 +61,6 @@ func (a *apiBlockstore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) return nil, xerrors.New("not supported") } -func (a *apiBlockstore) HashOnRead(enabled bool) { +func (a *apiBlockstore) HashOnRead(ctx context.Context, enabled bool) { return } diff --git a/blockstore/badger/blockstore.go b/blockstore/badger/blockstore.go index a0b51d8df61..e81e5838cae 100644 --- a/blockstore/badger/blockstore.go +++ b/blockstore/badger/blockstore.go @@ -525,7 +525,7 @@ func (b *Blockstore) Size() (int64, error) { // View implements blockstore.Viewer, which leverages zero-copy read-only // access to values. -func (b *Blockstore) View(cid cid.Cid, fn func([]byte) error) error { +func (b *Blockstore) View(ctx context.Context, cid cid.Cid, fn func([]byte) error) error { if err := b.access(); err != nil { return err } @@ -552,7 +552,7 @@ func (b *Blockstore) View(cid cid.Cid, fn func([]byte) error) error { } // Has implements Blockstore.Has. -func (b *Blockstore) Has(cid cid.Cid) (bool, error) { +func (b *Blockstore) Has(ctx context.Context, cid cid.Cid) (bool, error) { if err := b.access(); err != nil { return false, err } @@ -582,7 +582,7 @@ func (b *Blockstore) Has(cid cid.Cid) (bool, error) { } // Get implements Blockstore.Get. -func (b *Blockstore) Get(cid cid.Cid) (blocks.Block, error) { +func (b *Blockstore) Get(ctx context.Context, cid cid.Cid) (blocks.Block, error) { if !cid.Defined() { return nil, blockstore.ErrNotFound } @@ -619,7 +619,7 @@ func (b *Blockstore) Get(cid cid.Cid) (blocks.Block, error) { } // GetSize implements Blockstore.GetSize. -func (b *Blockstore) GetSize(cid cid.Cid) (int, error) { +func (b *Blockstore) GetSize(ctx context.Context, cid cid.Cid) (int, error) { if err := b.access(); err != nil { return 0, err } @@ -652,7 +652,7 @@ func (b *Blockstore) GetSize(cid cid.Cid) (int, error) { } // Put implements Blockstore.Put. -func (b *Blockstore) Put(block blocks.Block) error { +func (b *Blockstore) Put(ctx context.Context, block blocks.Block) error { if err := b.access(); err != nil { return err } @@ -691,7 +691,7 @@ func (b *Blockstore) Put(block blocks.Block) error { } // PutMany implements Blockstore.PutMany. -func (b *Blockstore) PutMany(blocks []blocks.Block) error { +func (b *Blockstore) PutMany(ctx context.Context, blocks []blocks.Block) error { if err := b.access(); err != nil { return err } @@ -755,7 +755,7 @@ func (b *Blockstore) PutMany(blocks []blocks.Block) error { } // DeleteBlock implements Blockstore.DeleteBlock. -func (b *Blockstore) DeleteBlock(cid cid.Cid) error { +func (b *Blockstore) DeleteBlock(ctx context.Context, cid cid.Cid) error { if err := b.access(); err != nil { return err } @@ -774,7 +774,7 @@ func (b *Blockstore) DeleteBlock(cid cid.Cid) error { }) } -func (b *Blockstore) DeleteMany(cids []cid.Cid) error { +func (b *Blockstore) DeleteMany(ctx context.Context, cids []cid.Cid) error { if err := b.access(); err != nil { return err } @@ -927,7 +927,7 @@ func (b *Blockstore) ForEachKey(f func(cid.Cid) error) error { // HashOnRead implements Blockstore.HashOnRead. It is not supported by this // blockstore. -func (b *Blockstore) HashOnRead(_ bool) { +func (b *Blockstore) HashOnRead(ctx context.Context, _ bool) { log.Warnf("called HashOnRead on badger blockstore; function not supported; ignoring") } diff --git a/blockstore/badger/blockstore_test.go b/blockstore/badger/blockstore_test.go index d8ef5241b49..db87262d48e 100644 --- a/blockstore/badger/blockstore_test.go +++ b/blockstore/badger/blockstore_test.go @@ -2,6 +2,7 @@ package badgerbs import ( "bytes" + "context" "fmt" "io/ioutil" "os" @@ -98,6 +99,7 @@ func openBlockstore(optsSupplier func(path string) Options) func(tb testing.TB, } func testMove(t *testing.T, optsF func(string) Options) { + ctx := context.TODO() basePath, err := ioutil.TempDir("", "") if err != nil { t.Fatal(err) @@ -122,7 +124,7 @@ func testMove(t *testing.T, optsF func(string) Options) { // add some blocks for i := 0; i < 10; i++ { blk := blocks.NewBlock([]byte(fmt.Sprintf("some data %d", i))) - err := db.Put(blk) + err := db.Put(ctx, blk) if err != nil { t.Fatal(err) } @@ -132,7 +134,7 @@ func testMove(t *testing.T, optsF func(string) Options) { // delete some of them for i := 5; i < 10; i++ { c := have[i].Cid() - err := db.DeleteBlock(c) + err := db.DeleteBlock(ctx, c) if err != nil { t.Fatal(err) } @@ -145,7 +147,7 @@ func testMove(t *testing.T, optsF func(string) Options) { g.Go(func() error { for i := 10; i < 1000; i++ { blk := blocks.NewBlock([]byte(fmt.Sprintf("some data %d", i))) - err := db.Put(blk) + err := db.Put(ctx, blk) if err != nil { return err } @@ -165,7 +167,7 @@ func testMove(t *testing.T, optsF func(string) Options) { // now check that we have all the blocks in have and none in the deleted lists checkBlocks := func() { for _, blk := range have { - has, err := db.Has(blk.Cid()) + has, err := db.Has(ctx, blk.Cid()) if err != nil { t.Fatal(err) } @@ -174,7 +176,7 @@ func testMove(t *testing.T, optsF func(string) Options) { t.Fatal("missing block") } - blk2, err := db.Get(blk.Cid()) + blk2, err := db.Get(ctx, blk.Cid()) if err != nil { t.Fatal(err) } @@ -185,7 +187,7 @@ func testMove(t *testing.T, optsF func(string) Options) { } for _, c := range deleted { - has, err := db.Has(c) + has, err := db.Has(ctx, c) if err != nil { t.Fatal(err) } diff --git a/blockstore/badger/blockstore_test_suite.go b/blockstore/badger/blockstore_test_suite.go index 93be82ac87e..b155f479a87 100644 --- a/blockstore/badger/blockstore_test_suite.go +++ b/blockstore/badger/blockstore_test_suite.go @@ -44,28 +44,31 @@ func (s *Suite) RunTests(t *testing.T, prefix string) { } func (s *Suite) TestGetWhenKeyNotPresent(t *testing.T) { + ctx := context.TODO() bs, _ := s.NewBlockstore(t) if c, ok := bs.(io.Closer); ok { defer func() { require.NoError(t, c.Close()) }() } c := cid.NewCidV0(u.Hash([]byte("stuff"))) - bl, err := bs.Get(c) + bl, err := bs.Get(ctx, c) require.Nil(t, bl) require.Equal(t, blockstore.ErrNotFound, err) } func (s *Suite) TestGetWhenKeyIsNil(t *testing.T) { + ctx := context.TODO() bs, _ := s.NewBlockstore(t) if c, ok := bs.(io.Closer); ok { defer func() { require.NoError(t, c.Close()) }() } - _, err := bs.Get(cid.Undef) + _, err := bs.Get(ctx, cid.Undef) require.Equal(t, blockstore.ErrNotFound, err) } func (s *Suite) TestPutThenGetBlock(t *testing.T) { + ctx := context.TODO() bs, _ := s.NewBlockstore(t) if c, ok := bs.(io.Closer); ok { defer func() { require.NoError(t, c.Close()) }() @@ -73,15 +76,16 @@ func (s *Suite) TestPutThenGetBlock(t *testing.T) { orig := blocks.NewBlock([]byte("some data")) - err := bs.Put(orig) + err := bs.Put(ctx, orig) require.NoError(t, err) - fetched, err := bs.Get(orig.Cid()) + fetched, err := bs.Get(ctx, orig.Cid()) require.NoError(t, err) require.Equal(t, orig.RawData(), fetched.RawData()) } func (s *Suite) TestHas(t *testing.T) { + ctx := context.TODO() bs, _ := s.NewBlockstore(t) if c, ok := bs.(io.Closer); ok { defer func() { require.NoError(t, c.Close()) }() @@ -89,19 +93,20 @@ func (s *Suite) TestHas(t *testing.T) { orig := blocks.NewBlock([]byte("some data")) - err := bs.Put(orig) + err := bs.Put(ctx, orig) require.NoError(t, err) - ok, err := bs.Has(orig.Cid()) + ok, err := bs.Has(ctx, orig.Cid()) require.NoError(t, err) require.True(t, ok) - ok, err = bs.Has(blocks.NewBlock([]byte("another thing")).Cid()) + ok, err = bs.Has(ctx, blocks.NewBlock([]byte("another thing")).Cid()) require.NoError(t, err) require.False(t, ok) } func (s *Suite) TestCidv0v1(t *testing.T) { + ctx := context.TODO() bs, _ := s.NewBlockstore(t) if c, ok := bs.(io.Closer); ok { defer func() { require.NoError(t, c.Close()) }() @@ -109,15 +114,17 @@ func (s *Suite) TestCidv0v1(t *testing.T) { orig := blocks.NewBlock([]byte("some data")) - err := bs.Put(orig) + err := bs.Put(ctx, orig) require.NoError(t, err) - fetched, err := bs.Get(cid.NewCidV1(cid.DagProtobuf, orig.Cid().Hash())) + fetched, err := bs.Get(ctx, cid.NewCidV1(cid.DagProtobuf, orig.Cid().Hash())) require.NoError(t, err) require.Equal(t, orig.RawData(), fetched.RawData()) } func (s *Suite) TestPutThenGetSizeBlock(t *testing.T) { + ctx := context.TODO() + bs, _ := s.NewBlockstore(t) if c, ok := bs.(io.Closer); ok { defer func() { require.NoError(t, c.Close()) }() @@ -127,21 +134,21 @@ func (s *Suite) TestPutThenGetSizeBlock(t *testing.T) { missingBlock := blocks.NewBlock([]byte("missingBlock")) emptyBlock := blocks.NewBlock([]byte{}) - err := bs.Put(block) + err := bs.Put(ctx, block) require.NoError(t, err) - blockSize, err := bs.GetSize(block.Cid()) + blockSize, err := bs.GetSize(ctx, block.Cid()) require.NoError(t, err) require.Len(t, block.RawData(), blockSize) - err = bs.Put(emptyBlock) + err = bs.Put(ctx, emptyBlock) require.NoError(t, err) - emptySize, err := bs.GetSize(emptyBlock.Cid()) + emptySize, err := bs.GetSize(ctx, emptyBlock.Cid()) require.NoError(t, err) require.Zero(t, emptySize) - missingSize, err := bs.GetSize(missingBlock.Cid()) + missingSize, err := bs.GetSize(ctx, missingBlock.Cid()) require.Equal(t, blockstore.ErrNotFound, err) require.Equal(t, -1, missingSize) } @@ -203,6 +210,7 @@ func (s *Suite) TestDoubleClose(t *testing.T) { } func (s *Suite) TestReopenPutGet(t *testing.T) { + ctx := context.TODO() bs, path := s.NewBlockstore(t) c, ok := bs.(io.Closer) if !ok { @@ -210,7 +218,7 @@ func (s *Suite) TestReopenPutGet(t *testing.T) { } orig := blocks.NewBlock([]byte("some data")) - err := bs.Put(orig) + err := bs.Put(ctx, orig) require.NoError(t, err) err = c.Close() @@ -219,7 +227,7 @@ func (s *Suite) TestReopenPutGet(t *testing.T) { bs, err = s.OpenBlockstore(t, path) require.NoError(t, err) - fetched, err := bs.Get(orig.Cid()) + fetched, err := bs.Get(ctx, orig.Cid()) require.NoError(t, err) require.Equal(t, orig.RawData(), fetched.RawData()) @@ -228,6 +236,7 @@ func (s *Suite) TestReopenPutGet(t *testing.T) { } func (s *Suite) TestPutMany(t *testing.T) { + ctx := context.TODO() bs, _ := s.NewBlockstore(t) if c, ok := bs.(io.Closer); ok { defer func() { require.NoError(t, c.Close()) }() @@ -238,15 +247,15 @@ func (s *Suite) TestPutMany(t *testing.T) { blocks.NewBlock([]byte("foo2")), blocks.NewBlock([]byte("foo3")), } - err := bs.PutMany(blks) + err := bs.PutMany(ctx, blks) require.NoError(t, err) for _, blk := range blks { - fetched, err := bs.Get(blk.Cid()) + fetched, err := bs.Get(ctx, blk.Cid()) require.NoError(t, err) require.Equal(t, blk.RawData(), fetched.RawData()) - ok, err := bs.Has(blk.Cid()) + ok, err := bs.Has(ctx, blk.Cid()) require.NoError(t, err) require.True(t, ok) } @@ -259,6 +268,7 @@ func (s *Suite) TestPutMany(t *testing.T) { } func (s *Suite) TestDelete(t *testing.T) { + ctx := context.TODO() bs, _ := s.NewBlockstore(t) if c, ok := bs.(io.Closer); ok { defer func() { require.NoError(t, c.Close()) }() @@ -269,10 +279,10 @@ func (s *Suite) TestDelete(t *testing.T) { blocks.NewBlock([]byte("foo2")), blocks.NewBlock([]byte("foo3")), } - err := bs.PutMany(blks) + err := bs.PutMany(ctx, blks) require.NoError(t, err) - err = bs.DeleteBlock(blks[1].Cid()) + err = bs.DeleteBlock(ctx, blks[1].Cid()) require.NoError(t, err) ch, err := bs.AllKeysChan(context.Background()) @@ -285,17 +295,17 @@ func (s *Suite) TestDelete(t *testing.T) { cid.NewCidV1(cid.Raw, blks[2].Cid().Hash()), }) - has, err := bs.Has(blks[1].Cid()) + has, err := bs.Has(ctx, blks[1].Cid()) require.NoError(t, err) require.False(t, has) - } func insertBlocks(t *testing.T, bs blockstore.BasicBlockstore, count int) []cid.Cid { + ctx := context.TODO() keys := make([]cid.Cid, count) for i := 0; i < count; i++ { block := blocks.NewBlock([]byte(fmt.Sprintf("some data %d", i))) - err := bs.Put(block) + err := bs.Put(ctx, block) require.NoError(t, err) // NewBlock assigns a CIDv0; we convert it to CIDv1 because that's what // the store returns. diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index 8ede31eb9b4..409c100cf98 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -1,6 +1,8 @@ package blockstore import ( + "context" + cid "github.com/ipfs/go-cid" ds "github.com/ipfs/go-datastore" logging "github.com/ipfs/go-log/v2" @@ -27,7 +29,7 @@ type BasicBlockstore = blockstore.Blockstore type Viewer = blockstore.Viewer type BatchDeleter interface { - DeleteMany(cids []cid.Cid) error + DeleteMany(ctx context.Context, cids []cid.Cid) error } // BlockstoreIterator is a trait for efficient iteration @@ -93,17 +95,17 @@ type adaptedBlockstore struct { var _ Blockstore = (*adaptedBlockstore)(nil) -func (a *adaptedBlockstore) View(cid cid.Cid, callback func([]byte) error) error { - blk, err := a.Get(cid) +func (a *adaptedBlockstore) View(ctx context.Context, cid cid.Cid, callback func([]byte) error) error { + blk, err := a.Get(ctx, cid) if err != nil { return err } return callback(blk.RawData()) } -func (a *adaptedBlockstore) DeleteMany(cids []cid.Cid) error { +func (a *adaptedBlockstore) DeleteMany(ctx context.Context, cids []cid.Cid) error { for _, cid := range cids { - err := a.DeleteBlock(cid) + err := a.DeleteBlock(ctx, cid) if err != nil { return err } diff --git a/blockstore/buffered.go b/blockstore/buffered.go index 5d3d38f78f9..846156fc8a0 100644 --- a/blockstore/buffered.go +++ b/blockstore/buffered.go @@ -88,34 +88,34 @@ func (bs *BufferedBlockstore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, return out, nil } -func (bs *BufferedBlockstore) DeleteBlock(c cid.Cid) error { - if err := bs.read.DeleteBlock(c); err != nil { +func (bs *BufferedBlockstore) DeleteBlock(ctx context.Context, c cid.Cid) error { + if err := bs.read.DeleteBlock(ctx, c); err != nil { return err } - return bs.write.DeleteBlock(c) + return bs.write.DeleteBlock(ctx, c) } -func (bs *BufferedBlockstore) DeleteMany(cids []cid.Cid) error { - if err := bs.read.DeleteMany(cids); err != nil { +func (bs *BufferedBlockstore) DeleteMany(ctx context.Context, cids []cid.Cid) error { + if err := bs.read.DeleteMany(ctx, cids); err != nil { return err } - return bs.write.DeleteMany(cids) + return bs.write.DeleteMany(ctx, cids) } -func (bs *BufferedBlockstore) View(c cid.Cid, callback func([]byte) error) error { +func (bs *BufferedBlockstore) View(ctx context.Context, c cid.Cid, callback func([]byte) error) error { // both stores are viewable. - if err := bs.write.View(c, callback); err == ErrNotFound { + if err := bs.write.View(ctx, c, callback); err == ErrNotFound { // not found in write blockstore; fall through. } else { return err // propagate errors, or nil, i.e. found. } - return bs.read.View(c, callback) + return bs.read.View(ctx, c, callback) } -func (bs *BufferedBlockstore) Get(c cid.Cid) (block.Block, error) { - if out, err := bs.write.Get(c); err != nil { +func (bs *BufferedBlockstore) Get(ctx context.Context, c cid.Cid) (block.Block, error) { + if out, err := bs.write.Get(ctx, c); err != nil { if err != ErrNotFound { return nil, err } @@ -123,20 +123,20 @@ func (bs *BufferedBlockstore) Get(c cid.Cid) (block.Block, error) { return out, nil } - return bs.read.Get(c) + return bs.read.Get(ctx, c) } -func (bs *BufferedBlockstore) GetSize(c cid.Cid) (int, error) { - s, err := bs.read.GetSize(c) +func (bs *BufferedBlockstore) GetSize(ctx context.Context, c cid.Cid) (int, error) { + s, err := bs.read.GetSize(ctx, c) if err == ErrNotFound || s == 0 { - return bs.write.GetSize(c) + return bs.write.GetSize(ctx, c) } return s, err } -func (bs *BufferedBlockstore) Put(blk block.Block) error { - has, err := bs.read.Has(blk.Cid()) // TODO: consider dropping this check +func (bs *BufferedBlockstore) Put(ctx context.Context, blk block.Block) error { + has, err := bs.read.Has(ctx, blk.Cid()) // TODO: consider dropping this check if err != nil { return err } @@ -145,11 +145,11 @@ func (bs *BufferedBlockstore) Put(blk block.Block) error { return nil } - return bs.write.Put(blk) + return bs.write.Put(ctx, blk) } -func (bs *BufferedBlockstore) Has(c cid.Cid) (bool, error) { - has, err := bs.write.Has(c) +func (bs *BufferedBlockstore) Has(ctx context.Context, c cid.Cid) (bool, error) { + has, err := bs.write.Has(ctx, c) if err != nil { return false, err } @@ -157,16 +157,16 @@ func (bs *BufferedBlockstore) Has(c cid.Cid) (bool, error) { return true, nil } - return bs.read.Has(c) + return bs.read.Has(ctx, c) } -func (bs *BufferedBlockstore) HashOnRead(hor bool) { - bs.read.HashOnRead(hor) - bs.write.HashOnRead(hor) +func (bs *BufferedBlockstore) HashOnRead(ctx context.Context, hor bool) { + bs.read.HashOnRead(ctx, hor) + bs.write.HashOnRead(ctx, hor) } -func (bs *BufferedBlockstore) PutMany(blks []block.Block) error { - return bs.write.PutMany(blks) +func (bs *BufferedBlockstore) PutMany(ctx context.Context, blks []block.Block) error { + return bs.write.PutMany(ctx, blks) } func (bs *BufferedBlockstore) Read() Blockstore { diff --git a/blockstore/discard.go b/blockstore/discard.go index afd0651bc07..e377d427b37 100644 --- a/blockstore/discard.go +++ b/blockstore/discard.go @@ -18,39 +18,39 @@ func NewDiscardStore(bs Blockstore) Blockstore { return &discardstore{bs: bs} } -func (b *discardstore) Has(cid cid.Cid) (bool, error) { - return b.bs.Has(cid) +func (b *discardstore) Has(ctx context.Context, cid cid.Cid) (bool, error) { + return b.bs.Has(ctx, cid) } -func (b *discardstore) HashOnRead(hor bool) { - b.bs.HashOnRead(hor) +func (b *discardstore) HashOnRead(ctx context.Context, hor bool) { + b.bs.HashOnRead(ctx, hor) } -func (b *discardstore) Get(cid cid.Cid) (blocks.Block, error) { - return b.bs.Get(cid) +func (b *discardstore) Get(ctx context.Context, cid cid.Cid) (blocks.Block, error) { + return b.bs.Get(ctx, cid) } -func (b *discardstore) GetSize(cid cid.Cid) (int, error) { - return b.bs.GetSize(cid) +func (b *discardstore) GetSize(ctx context.Context, cid cid.Cid) (int, error) { + return b.bs.GetSize(ctx, cid) } -func (b *discardstore) View(cid cid.Cid, f func([]byte) error) error { - return b.bs.View(cid, f) +func (b *discardstore) View(ctx context.Context, cid cid.Cid, f func([]byte) error) error { + return b.bs.View(ctx, cid, f) } -func (b *discardstore) Put(blk blocks.Block) error { +func (b *discardstore) Put(ctx context.Context, blk blocks.Block) error { return nil } -func (b *discardstore) PutMany(blks []blocks.Block) error { +func (b *discardstore) PutMany(ctx context.Context, blks []blocks.Block) error { return nil } -func (b *discardstore) DeleteBlock(cid cid.Cid) error { +func (b *discardstore) DeleteBlock(ctx context.Context, cid cid.Cid) error { return nil } -func (b *discardstore) DeleteMany(cids []cid.Cid) error { +func (b *discardstore) DeleteMany(ctx context.Context, cids []cid.Cid) error { return nil } diff --git a/blockstore/fallback.go b/blockstore/fallback.go index 5f220f941bb..3d0acd36dbe 100644 --- a/blockstore/fallback.go +++ b/blockstore/fallback.go @@ -71,14 +71,14 @@ func (fbs *FallbackStore) getFallback(c cid.Cid) (blocks.Block, error) { // chain bitswap puts blocks in temp blockstore which is cleaned up // every few min (to drop any messages we fetched but don't want) // in this case we want to keep this block around - if err := fbs.Put(b); err != nil { + if err := fbs.Put(ctx, b); err != nil { return nil, xerrors.Errorf("persisting fallback-fetched block: %w", err) } return b, nil } -func (fbs *FallbackStore) Get(c cid.Cid) (blocks.Block, error) { - b, err := fbs.Blockstore.Get(c) +func (fbs *FallbackStore) Get(ctx context.Context, c cid.Cid) (blocks.Block, error) { + b, err := fbs.Blockstore.Get(ctx, c) switch err { case nil: return b, nil @@ -89,8 +89,8 @@ func (fbs *FallbackStore) Get(c cid.Cid) (blocks.Block, error) { } } -func (fbs *FallbackStore) GetSize(c cid.Cid) (int, error) { - sz, err := fbs.Blockstore.GetSize(c) +func (fbs *FallbackStore) GetSize(ctx context.Context, c cid.Cid) (int, error) { + sz, err := fbs.Blockstore.GetSize(ctx, c) switch err { case nil: return sz, nil diff --git a/blockstore/idstore.go b/blockstore/idstore.go index e6148ff04e2..d0553158bdb 100644 --- a/blockstore/idstore.go +++ b/blockstore/idstore.go @@ -38,7 +38,7 @@ func decodeCid(cid cid.Cid) (inline bool, data []byte, err error) { return false, nil, err } -func (b *idstore) Has(cid cid.Cid) (bool, error) { +func (b *idstore) Has(ctx context.Context, cid cid.Cid) (bool, error) { inline, _, err := decodeCid(cid) if err != nil { return false, xerrors.Errorf("error decoding Cid: %w", err) @@ -48,10 +48,10 @@ func (b *idstore) Has(cid cid.Cid) (bool, error) { return true, nil } - return b.bs.Has(cid) + return b.bs.Has(ctx, cid) } -func (b *idstore) Get(cid cid.Cid) (blocks.Block, error) { +func (b *idstore) Get(ctx context.Context, cid cid.Cid) (blocks.Block, error) { inline, data, err := decodeCid(cid) if err != nil { return nil, xerrors.Errorf("error decoding Cid: %w", err) @@ -61,10 +61,10 @@ func (b *idstore) Get(cid cid.Cid) (blocks.Block, error) { return blocks.NewBlockWithCid(data, cid) } - return b.bs.Get(cid) + return b.bs.Get(ctx, cid) } -func (b *idstore) GetSize(cid cid.Cid) (int, error) { +func (b *idstore) GetSize(ctx context.Context, cid cid.Cid) (int, error) { inline, data, err := decodeCid(cid) if err != nil { return 0, xerrors.Errorf("error decoding Cid: %w", err) @@ -74,10 +74,10 @@ func (b *idstore) GetSize(cid cid.Cid) (int, error) { return len(data), err } - return b.bs.GetSize(cid) + return b.bs.GetSize(ctx, cid) } -func (b *idstore) View(cid cid.Cid, cb func([]byte) error) error { +func (b *idstore) View(ctx context.Context, cid cid.Cid, cb func([]byte) error) error { inline, data, err := decodeCid(cid) if err != nil { return xerrors.Errorf("error decoding Cid: %w", err) @@ -87,10 +87,10 @@ func (b *idstore) View(cid cid.Cid, cb func([]byte) error) error { return cb(data) } - return b.bs.View(cid, cb) + return b.bs.View(ctx, cid, cb) } -func (b *idstore) Put(blk blocks.Block) error { +func (b *idstore) Put(ctx context.Context, blk blocks.Block) error { inline, _, err := decodeCid(blk.Cid()) if err != nil { return xerrors.Errorf("error decoding Cid: %w", err) @@ -100,10 +100,10 @@ func (b *idstore) Put(blk blocks.Block) error { return nil } - return b.bs.Put(blk) + return b.bs.Put(ctx, blk) } -func (b *idstore) PutMany(blks []blocks.Block) error { +func (b *idstore) PutMany(ctx context.Context, blks []blocks.Block) error { toPut := make([]blocks.Block, 0, len(blks)) for _, blk := range blks { inline, _, err := decodeCid(blk.Cid()) @@ -118,13 +118,13 @@ func (b *idstore) PutMany(blks []blocks.Block) error { } if len(toPut) > 0 { - return b.bs.PutMany(toPut) + return b.bs.PutMany(ctx, toPut) } return nil } -func (b *idstore) DeleteBlock(cid cid.Cid) error { +func (b *idstore) DeleteBlock(ctx context.Context, cid cid.Cid) error { inline, _, err := decodeCid(cid) if err != nil { return xerrors.Errorf("error decoding Cid: %w", err) @@ -134,10 +134,10 @@ func (b *idstore) DeleteBlock(cid cid.Cid) error { return nil } - return b.bs.DeleteBlock(cid) + return b.bs.DeleteBlock(ctx, cid) } -func (b *idstore) DeleteMany(cids []cid.Cid) error { +func (b *idstore) DeleteMany(ctx context.Context, cids []cid.Cid) error { toDelete := make([]cid.Cid, 0, len(cids)) for _, cid := range cids { inline, _, err := decodeCid(cid) @@ -152,7 +152,7 @@ func (b *idstore) DeleteMany(cids []cid.Cid) error { } if len(toDelete) > 0 { - return b.bs.DeleteMany(toDelete) + return b.bs.DeleteMany(ctx, toDelete) } return nil @@ -162,8 +162,8 @@ func (b *idstore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) { return b.bs.AllKeysChan(ctx) } -func (b *idstore) HashOnRead(enabled bool) { - b.bs.HashOnRead(enabled) +func (b *idstore) HashOnRead(ctx context.Context, enabled bool) { + b.bs.HashOnRead(ctx, enabled) } func (b *idstore) Close() error { diff --git a/blockstore/ipfs.go b/blockstore/ipfs.go index 51b4bd95123..47662c6519f 100644 --- a/blockstore/ipfs.go +++ b/blockstore/ipfs.go @@ -79,12 +79,12 @@ func NewRemoteIPFSBlockstore(ctx context.Context, maddr multiaddr.Multiaddr, onl return Adapt(bs), nil } -func (i *IPFSBlockstore) DeleteBlock(cid cid.Cid) error { +func (i *IPFSBlockstore) DeleteBlock(ctx context.Context, cid cid.Cid) error { return xerrors.Errorf("not supported") } -func (i *IPFSBlockstore) Has(cid cid.Cid) (bool, error) { - _, err := i.offlineAPI.Block().Stat(i.ctx, path.IpldPath(cid)) +func (i *IPFSBlockstore) Has(ctx context.Context, cid cid.Cid) (bool, error) { + _, err := i.offlineAPI.Block().Stat(ctx, path.IpldPath(cid)) if err != nil { // The underlying client is running in Offline mode. // Stat() will fail with an err if the block isn't in the @@ -99,8 +99,8 @@ func (i *IPFSBlockstore) Has(cid cid.Cid) (bool, error) { return true, nil } -func (i *IPFSBlockstore) Get(cid cid.Cid) (blocks.Block, error) { - rd, err := i.api.Block().Get(i.ctx, path.IpldPath(cid)) +func (i *IPFSBlockstore) Get(ctx context.Context, cid cid.Cid) (blocks.Block, error) { + rd, err := i.api.Block().Get(ctx, path.IpldPath(cid)) if err != nil { return nil, xerrors.Errorf("getting ipfs block: %w", err) } @@ -113,8 +113,8 @@ func (i *IPFSBlockstore) Get(cid cid.Cid) (blocks.Block, error) { return blocks.NewBlockWithCid(data, cid) } -func (i *IPFSBlockstore) GetSize(cid cid.Cid) (int, error) { - st, err := i.api.Block().Stat(i.ctx, path.IpldPath(cid)) +func (i *IPFSBlockstore) GetSize(ctx context.Context, cid cid.Cid) (int, error) { + st, err := i.api.Block().Stat(ctx, path.IpldPath(cid)) if err != nil { return 0, xerrors.Errorf("getting ipfs block: %w", err) } @@ -122,23 +122,23 @@ func (i *IPFSBlockstore) GetSize(cid cid.Cid) (int, error) { return st.Size(), nil } -func (i *IPFSBlockstore) Put(block blocks.Block) error { +func (i *IPFSBlockstore) Put(ctx context.Context, block blocks.Block) error { mhd, err := multihash.Decode(block.Cid().Hash()) if err != nil { return err } - _, err = i.api.Block().Put(i.ctx, bytes.NewReader(block.RawData()), + _, err = i.api.Block().Put(ctx, bytes.NewReader(block.RawData()), options.Block.Hash(mhd.Code, mhd.Length), options.Block.Format(cid.CodecToStr[block.Cid().Type()])) return err } -func (i *IPFSBlockstore) PutMany(blocks []blocks.Block) error { +func (i *IPFSBlockstore) PutMany(ctx context.Context, blocks []blocks.Block) error { // TODO: could be done in parallel for _, block := range blocks { - if err := i.Put(block); err != nil { + if err := i.Put(ctx, block); err != nil { return err } } @@ -150,6 +150,6 @@ func (i *IPFSBlockstore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error return nil, xerrors.Errorf("not supported") } -func (i *IPFSBlockstore) HashOnRead(enabled bool) { +func (i *IPFSBlockstore) HashOnRead(ctx context.Context, enabled bool) { return // TODO: We could technically support this, but.. } diff --git a/blockstore/mem.go b/blockstore/mem.go index 8ea69d46a49..a2655148f5c 100644 --- a/blockstore/mem.go +++ b/blockstore/mem.go @@ -15,24 +15,24 @@ func NewMemory() MemBlockstore { // MemBlockstore is a terminal blockstore that keeps blocks in memory. type MemBlockstore map[cid.Cid]blocks.Block -func (m MemBlockstore) DeleteBlock(k cid.Cid) error { +func (m MemBlockstore) DeleteBlock(ctx context.Context, k cid.Cid) error { delete(m, k) return nil } -func (m MemBlockstore) DeleteMany(ks []cid.Cid) error { +func (m MemBlockstore) DeleteMany(ctx context.Context, ks []cid.Cid) error { for _, k := range ks { delete(m, k) } return nil } -func (m MemBlockstore) Has(k cid.Cid) (bool, error) { +func (m MemBlockstore) Has(ctx context.Context, k cid.Cid) (bool, error) { _, ok := m[k] return ok, nil } -func (m MemBlockstore) View(k cid.Cid, callback func([]byte) error) error { +func (m MemBlockstore) View(ctx context.Context, k cid.Cid, callback func([]byte) error) error { b, ok := m[k] if !ok { return ErrNotFound @@ -40,7 +40,7 @@ func (m MemBlockstore) View(k cid.Cid, callback func([]byte) error) error { return callback(b.RawData()) } -func (m MemBlockstore) Get(k cid.Cid) (blocks.Block, error) { +func (m MemBlockstore) Get(ctx context.Context, k cid.Cid) (blocks.Block, error) { b, ok := m[k] if !ok { return nil, ErrNotFound @@ -49,7 +49,7 @@ func (m MemBlockstore) Get(k cid.Cid) (blocks.Block, error) { } // GetSize returns the CIDs mapped BlockSize -func (m MemBlockstore) GetSize(k cid.Cid) (int, error) { +func (m MemBlockstore) GetSize(ctx context.Context, k cid.Cid) (int, error) { b, ok := m[k] if !ok { return 0, ErrNotFound @@ -58,7 +58,7 @@ func (m MemBlockstore) GetSize(k cid.Cid) (int, error) { } // Put puts a given block to the underlying datastore -func (m MemBlockstore) Put(b blocks.Block) error { +func (m MemBlockstore) Put(ctx context.Context, b blocks.Block) error { // Convert to a basic block for safety, but try to reuse the existing // block if it's already a basic block. k := b.Cid() @@ -76,9 +76,9 @@ func (m MemBlockstore) Put(b blocks.Block) error { // PutMany puts a slice of blocks at the same time using batching // capabilities of the underlying datastore whenever possible. -func (m MemBlockstore) PutMany(bs []blocks.Block) error { +func (m MemBlockstore) PutMany(ctx context.Context, bs []blocks.Block) error { for _, b := range bs { - _ = m.Put(b) // can't fail + _ = m.Put(ctx, b) // can't fail } return nil } @@ -97,6 +97,6 @@ func (m MemBlockstore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) // HashOnRead specifies if every read block should be // rehashed to make sure it matches its CID. -func (m MemBlockstore) HashOnRead(enabled bool) { +func (m MemBlockstore) HashOnRead(ctx context.Context, enabled bool) { // no-op } diff --git a/blockstore/sync.go b/blockstore/sync.go index 848ccd19d2b..11a92359d10 100644 --- a/blockstore/sync.go +++ b/blockstore/sync.go @@ -20,53 +20,53 @@ type SyncBlockstore struct { bs MemBlockstore // specifically use a memStore to save indirection overhead. } -func (m *SyncBlockstore) DeleteBlock(k cid.Cid) error { +func (m *SyncBlockstore) DeleteBlock(ctx context.Context, k cid.Cid) error { m.mu.Lock() defer m.mu.Unlock() - return m.bs.DeleteBlock(k) + return m.bs.DeleteBlock(ctx, k) } -func (m *SyncBlockstore) DeleteMany(ks []cid.Cid) error { +func (m *SyncBlockstore) DeleteMany(ctx context.Context, ks []cid.Cid) error { m.mu.Lock() defer m.mu.Unlock() - return m.bs.DeleteMany(ks) + return m.bs.DeleteMany(ctx, ks) } -func (m *SyncBlockstore) Has(k cid.Cid) (bool, error) { +func (m *SyncBlockstore) Has(ctx context.Context, k cid.Cid) (bool, error) { m.mu.RLock() defer m.mu.RUnlock() - return m.bs.Has(k) + return m.bs.Has(ctx, k) } -func (m *SyncBlockstore) View(k cid.Cid, callback func([]byte) error) error { +func (m *SyncBlockstore) View(ctx context.Context, k cid.Cid, callback func([]byte) error) error { m.mu.RLock() defer m.mu.RUnlock() - return m.bs.View(k, callback) + return m.bs.View(ctx, k, callback) } -func (m *SyncBlockstore) Get(k cid.Cid) (blocks.Block, error) { +func (m *SyncBlockstore) Get(ctx context.Context, k cid.Cid) (blocks.Block, error) { m.mu.RLock() defer m.mu.RUnlock() - return m.bs.Get(k) + return m.bs.Get(ctx, k) } -func (m *SyncBlockstore) GetSize(k cid.Cid) (int, error) { +func (m *SyncBlockstore) GetSize(ctx context.Context, k cid.Cid) (int, error) { m.mu.RLock() defer m.mu.RUnlock() - return m.bs.GetSize(k) + return m.bs.GetSize(ctx, k) } -func (m *SyncBlockstore) Put(b blocks.Block) error { +func (m *SyncBlockstore) Put(ctx context.Context, b blocks.Block) error { m.mu.Lock() defer m.mu.Unlock() - return m.bs.Put(b) + return m.bs.Put(ctx, b) } -func (m *SyncBlockstore) PutMany(bs []blocks.Block) error { +func (m *SyncBlockstore) PutMany(ctx context.Context, bs []blocks.Block) error { m.mu.Lock() defer m.mu.Unlock() - return m.bs.PutMany(bs) + return m.bs.PutMany(ctx, bs) } func (m *SyncBlockstore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) { @@ -76,6 +76,6 @@ func (m *SyncBlockstore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error return m.bs.AllKeysChan(ctx) } -func (m *SyncBlockstore) HashOnRead(enabled bool) { +func (m *SyncBlockstore) HashOnRead(ctx context.Context, enabled bool) { // noop } diff --git a/blockstore/timed.go b/blockstore/timed.go index b279943b680..4fee6b6dd5b 100644 --- a/blockstore/timed.go +++ b/blockstore/timed.go @@ -92,28 +92,28 @@ func (t *TimedCacheBlockstore) rotate() { t.mu.Unlock() } -func (t *TimedCacheBlockstore) Put(b blocks.Block) error { +func (t *TimedCacheBlockstore) Put(ctx context.Context, b blocks.Block) error { // Don't check the inactive set here. We want to keep this block for at // least one interval. t.mu.Lock() defer t.mu.Unlock() - return t.active.Put(b) + return t.active.Put(ctx, b) } -func (t *TimedCacheBlockstore) PutMany(bs []blocks.Block) error { +func (t *TimedCacheBlockstore) PutMany(ctx context.Context, bs []blocks.Block) error { t.mu.Lock() defer t.mu.Unlock() - return t.active.PutMany(bs) + return t.active.PutMany(ctx, bs) } -func (t *TimedCacheBlockstore) View(k cid.Cid, callback func([]byte) error) error { +func (t *TimedCacheBlockstore) View(ctx context.Context, k cid.Cid, callback func([]byte) error) error { // The underlying blockstore is always a "mem" blockstore so there's no difference, // from a performance perspective, between view & get. So we call Get to avoid // calling an arbitrary callback while holding a lock. t.mu.RLock() - block, err := t.active.Get(k) + block, err := t.active.Get(ctx, k) if err == ErrNotFound { - block, err = t.inactive.Get(k) + block, err = t.inactive.Get(ctx, k) } t.mu.RUnlock() @@ -123,51 +123,51 @@ func (t *TimedCacheBlockstore) View(k cid.Cid, callback func([]byte) error) erro return callback(block.RawData()) } -func (t *TimedCacheBlockstore) Get(k cid.Cid) (blocks.Block, error) { +func (t *TimedCacheBlockstore) Get(ctx context.Context, k cid.Cid) (blocks.Block, error) { t.mu.RLock() defer t.mu.RUnlock() - b, err := t.active.Get(k) + b, err := t.active.Get(ctx, k) if err == ErrNotFound { - b, err = t.inactive.Get(k) + b, err = t.inactive.Get(ctx, k) } return b, err } -func (t *TimedCacheBlockstore) GetSize(k cid.Cid) (int, error) { +func (t *TimedCacheBlockstore) GetSize(ctx context.Context, k cid.Cid) (int, error) { t.mu.RLock() defer t.mu.RUnlock() - size, err := t.active.GetSize(k) + size, err := t.active.GetSize(ctx, k) if err == ErrNotFound { - size, err = t.inactive.GetSize(k) + size, err = t.inactive.GetSize(ctx, k) } return size, err } -func (t *TimedCacheBlockstore) Has(k cid.Cid) (bool, error) { +func (t *TimedCacheBlockstore) Has(ctx context.Context, k cid.Cid) (bool, error) { t.mu.RLock() defer t.mu.RUnlock() - if has, err := t.active.Has(k); err != nil { + if has, err := t.active.Has(ctx, k); err != nil { return false, err } else if has { return true, nil } - return t.inactive.Has(k) + return t.inactive.Has(ctx, k) } -func (t *TimedCacheBlockstore) HashOnRead(_ bool) { +func (t *TimedCacheBlockstore) HashOnRead(ctx context.Context, _ bool) { // no-op } -func (t *TimedCacheBlockstore) DeleteBlock(k cid.Cid) error { +func (t *TimedCacheBlockstore) DeleteBlock(ctx context.Context, k cid.Cid) error { t.mu.Lock() defer t.mu.Unlock() - return multierr.Combine(t.active.DeleteBlock(k), t.inactive.DeleteBlock(k)) + return multierr.Combine(t.active.DeleteBlock(ctx, k), t.inactive.DeleteBlock(ctx, k)) } -func (t *TimedCacheBlockstore) DeleteMany(ks []cid.Cid) error { +func (t *TimedCacheBlockstore) DeleteMany(ctx context.Context, ks []cid.Cid) error { t.mu.Lock() defer t.mu.Unlock() - return multierr.Combine(t.active.DeleteMany(ks), t.inactive.DeleteMany(ks)) + return multierr.Combine(t.active.DeleteMany(ctx, ks), t.inactive.DeleteMany(ctx, ks)) } func (t *TimedCacheBlockstore) AllKeysChan(_ context.Context) (<-chan cid.Cid, error) { diff --git a/blockstore/timed_test.go b/blockstore/timed_test.go index d5fefff9461..16795f04717 100644 --- a/blockstore/timed_test.go +++ b/blockstore/timed_test.go @@ -19,6 +19,8 @@ func TestTimedCacheBlockstoreSimple(t *testing.T) { tc.clock = mClock tc.doneRotatingCh = make(chan struct{}) + ctx := context.Background() + _ = tc.Start(context.Background()) mClock.Add(1) // IDK why it is needed but it makes it work @@ -27,18 +29,18 @@ func TestTimedCacheBlockstoreSimple(t *testing.T) { }() b1 := blocks.NewBlock([]byte("foo")) - require.NoError(t, tc.Put(b1)) + require.NoError(t, tc.Put(ctx, b1)) b2 := blocks.NewBlock([]byte("bar")) - require.NoError(t, tc.Put(b2)) + require.NoError(t, tc.Put(ctx, b2)) b3 := blocks.NewBlock([]byte("baz")) - b1out, err := tc.Get(b1.Cid()) + b1out, err := tc.Get(ctx, b1.Cid()) require.NoError(t, err) require.Equal(t, b1.RawData(), b1out.RawData()) - has, err := tc.Has(b1.Cid()) + has, err := tc.Has(ctx, b1.Cid()) require.NoError(t, err) require.True(t, has) @@ -46,17 +48,17 @@ func TestTimedCacheBlockstoreSimple(t *testing.T) { <-tc.doneRotatingCh // We should still have everything. - has, err = tc.Has(b1.Cid()) + has, err = tc.Has(ctx, b1.Cid()) require.NoError(t, err) require.True(t, has) - has, err = tc.Has(b2.Cid()) + has, err = tc.Has(ctx, b2.Cid()) require.NoError(t, err) require.True(t, has) // extend b2, add b3. - require.NoError(t, tc.Put(b2)) - require.NoError(t, tc.Put(b3)) + require.NoError(t, tc.Put(ctx, b2)) + require.NoError(t, tc.Put(ctx, b3)) // all keys once. allKeys, err := tc.AllKeysChan(context.Background()) @@ -71,15 +73,15 @@ func TestTimedCacheBlockstoreSimple(t *testing.T) { <-tc.doneRotatingCh // should still have b2, and b3, but not b1 - has, err = tc.Has(b1.Cid()) + has, err = tc.Has(ctx, b1.Cid()) require.NoError(t, err) require.False(t, has) - has, err = tc.Has(b2.Cid()) + has, err = tc.Has(ctx, b2.Cid()) require.NoError(t, err) require.True(t, has) - has, err = tc.Has(b3.Cid()) + has, err = tc.Has(ctx, b3.Cid()) require.NoError(t, err) require.True(t, has) } diff --git a/blockstore/union.go b/blockstore/union.go index a99ba259133..e115458c282 100644 --- a/blockstore/union.go +++ b/blockstore/union.go @@ -19,72 +19,72 @@ func Union(stores ...Blockstore) Blockstore { return unionBlockstore(stores) } -func (m unionBlockstore) Has(cid cid.Cid) (has bool, err error) { +func (m unionBlockstore) Has(ctx context.Context, cid cid.Cid) (has bool, err error) { for _, bs := range m { - if has, err = bs.Has(cid); has || err != nil { + if has, err = bs.Has(ctx, cid); has || err != nil { break } } return has, err } -func (m unionBlockstore) Get(cid cid.Cid) (blk blocks.Block, err error) { +func (m unionBlockstore) Get(ctx context.Context, cid cid.Cid) (blk blocks.Block, err error) { for _, bs := range m { - if blk, err = bs.Get(cid); err == nil || err != ErrNotFound { + if blk, err = bs.Get(ctx, cid); err == nil || err != ErrNotFound { break } } return blk, err } -func (m unionBlockstore) View(cid cid.Cid, callback func([]byte) error) (err error) { +func (m unionBlockstore) View(ctx context.Context, cid cid.Cid, callback func([]byte) error) (err error) { for _, bs := range m { - if err = bs.View(cid, callback); err == nil || err != ErrNotFound { + if err = bs.View(ctx, cid, callback); err == nil || err != ErrNotFound { break } } return err } -func (m unionBlockstore) GetSize(cid cid.Cid) (size int, err error) { +func (m unionBlockstore) GetSize(ctx context.Context, cid cid.Cid) (size int, err error) { for _, bs := range m { - if size, err = bs.GetSize(cid); err == nil || err != ErrNotFound { + if size, err = bs.GetSize(ctx, cid); err == nil || err != ErrNotFound { break } } return size, err } -func (m unionBlockstore) Put(block blocks.Block) (err error) { +func (m unionBlockstore) Put(ctx context.Context, block blocks.Block) (err error) { for _, bs := range m { - if err = bs.Put(block); err != nil { + if err = bs.Put(ctx, block); err != nil { break } } return err } -func (m unionBlockstore) PutMany(blks []blocks.Block) (err error) { +func (m unionBlockstore) PutMany(ctx context.Context, blks []blocks.Block) (err error) { for _, bs := range m { - if err = bs.PutMany(blks); err != nil { + if err = bs.PutMany(ctx, blks); err != nil { break } } return err } -func (m unionBlockstore) DeleteBlock(cid cid.Cid) (err error) { +func (m unionBlockstore) DeleteBlock(ctx context.Context, cid cid.Cid) (err error) { for _, bs := range m { - if err = bs.DeleteBlock(cid); err != nil { + if err = bs.DeleteBlock(ctx, cid); err != nil { break } } return err } -func (m unionBlockstore) DeleteMany(cids []cid.Cid) (err error) { +func (m unionBlockstore) DeleteMany(ctx context.Context, cids []cid.Cid) (err error) { for _, bs := range m { - if err = bs.DeleteMany(cids); err != nil { + if err = bs.DeleteMany(ctx, cids); err != nil { break } } @@ -112,8 +112,8 @@ func (m unionBlockstore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error return outCh, nil } -func (m unionBlockstore) HashOnRead(enabled bool) { +func (m unionBlockstore) HashOnRead(ctx context.Context, enabled bool) { for _, bs := range m { - bs.HashOnRead(enabled) + bs.HashOnRead(ctx, enabled) } } diff --git a/blockstore/union_test.go b/blockstore/union_test.go index b6202689227..3ae8c1d49fe 100644 --- a/blockstore/union_test.go +++ b/blockstore/union_test.go @@ -15,79 +15,81 @@ var ( ) func TestUnionBlockstore_Get(t *testing.T) { + ctx := context.Background() m1 := NewMemory() m2 := NewMemory() - _ = m1.Put(b1) - _ = m2.Put(b2) + _ = m1.Put(ctx, b1) + _ = m2.Put(ctx, b2) u := Union(m1, m2) - v1, err := u.Get(b1.Cid()) + v1, err := u.Get(ctx, b1.Cid()) require.NoError(t, err) require.Equal(t, b1.RawData(), v1.RawData()) - v2, err := u.Get(b2.Cid()) + v2, err := u.Get(ctx, b2.Cid()) require.NoError(t, err) require.Equal(t, b2.RawData(), v2.RawData()) } func TestUnionBlockstore_Put_PutMany_Delete_AllKeysChan(t *testing.T) { + ctx := context.Background() m1 := NewMemory() m2 := NewMemory() u := Union(m1, m2) - err := u.Put(b0) + err := u.Put(ctx, b0) require.NoError(t, err) var has bool // write was broadcasted to all stores. - has, _ = m1.Has(b0.Cid()) + has, _ = m1.Has(ctx, b0.Cid()) require.True(t, has) - has, _ = m2.Has(b0.Cid()) + has, _ = m2.Has(ctx, b0.Cid()) require.True(t, has) - has, _ = u.Has(b0.Cid()) + has, _ = u.Has(ctx, b0.Cid()) require.True(t, has) // put many. - err = u.PutMany([]blocks.Block{b1, b2}) + err = u.PutMany(ctx, []blocks.Block{b1, b2}) require.NoError(t, err) // write was broadcasted to all stores. - has, _ = m1.Has(b1.Cid()) + has, _ = m1.Has(ctx, b1.Cid()) require.True(t, has) - has, _ = m1.Has(b2.Cid()) + has, _ = m1.Has(ctx, b2.Cid()) require.True(t, has) - has, _ = m2.Has(b1.Cid()) + has, _ = m2.Has(ctx, b1.Cid()) require.True(t, has) - has, _ = m2.Has(b2.Cid()) + has, _ = m2.Has(ctx, b2.Cid()) require.True(t, has) // also in the union store. - has, _ = u.Has(b1.Cid()) + has, _ = u.Has(ctx, b1.Cid()) require.True(t, has) - has, _ = u.Has(b2.Cid()) + has, _ = u.Has(ctx, b2.Cid()) require.True(t, has) // deleted from all stores. - err = u.DeleteBlock(b1.Cid()) + err = u.DeleteBlock(ctx, b1.Cid()) require.NoError(t, err) - has, _ = u.Has(b1.Cid()) + has, _ = u.Has(ctx, b1.Cid()) require.False(t, has) - has, _ = m1.Has(b1.Cid()) + has, _ = m1.Has(ctx, b1.Cid()) require.False(t, has) - has, _ = m2.Has(b1.Cid()) + has, _ = m2.Has(ctx, b1.Cid()) require.False(t, has) // check that AllKeysChan returns b0 and b2, twice (once per backing store) diff --git a/extern/filecoin-ffi b/extern/filecoin-ffi index 7912389334e..a7b3c2e6953 160000 --- a/extern/filecoin-ffi +++ b/extern/filecoin-ffi @@ -1 +1 @@ -Subproject commit 7912389334e347bbb2eac0520c836830875c39de +Subproject commit a7b3c2e695393fd716e9265ff8cba932a3e38dd4 diff --git a/go.mod b/go.mod index a9b0bee9dcf..af9864d1bf0 100644 --- a/go.mod +++ b/go.mod @@ -11,13 +11,14 @@ require ( github.com/StackExchange/wmi v1.2.1 // indirect github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d github.com/alecthomas/jsonschema v0.0.0-20200530073317-71f438968921 + github.com/bep/debounce v1.2.0 // indirect github.com/buger/goterm v1.0.3 github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e github.com/cockroachdb/pebble v0.0.0-20201001221639-879f3bfeef07 github.com/containerd/cgroups v0.0.0-20201119153540-4cbc285b3327 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.2 + github.com/dgraph-io/badger/v2 v2.2007.3 github.com/docker/go-units v0.4.0 github.com/drand/drand v1.2.1 github.com/drand/kyber v1.1.4 @@ -26,14 +27,13 @@ require ( github.com/elastic/gosigar v0.14.1 github.com/etclabscore/go-openrpc-reflect v0.0.36 github.com/fatih/color v1.13.0 - github.com/filecoin-project/dagstore v0.4.3 github.com/filecoin-project/filecoin-ffi v0.30.4-0.20200910194244-f640612a1a1f github.com/filecoin-project/go-address v0.0.6 github.com/filecoin-project/go-bitfield v0.2.4 github.com/filecoin-project/go-cbor-util v0.0.1 - github.com/filecoin-project/go-commp-utils v0.1.2 github.com/filecoin-project/go-crypto v0.0.1 - github.com/filecoin-project/go-data-transfer v1.11.4 + github.com/filecoin-project/go-data-transfer v1.11.7-0.20211119001436-c0dbfa5fae4d + github.com/filecoin-project/go-ds-versioning v0.1.0 // indirect 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.13.4 @@ -42,7 +42,7 @@ require ( github.com/filecoin-project/go-paramfetch v0.0.2 github.com/filecoin-project/go-state-types v0.1.1 github.com/filecoin-project/go-statemachine v1.0.1 - github.com/filecoin-project/go-statestore v0.1.1 + github.com/filecoin-project/go-statestore v0.1.2-0.20211118230537-43557b6c5ce5 github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b github.com/filecoin-project/specs-actors v0.9.14 github.com/filecoin-project/specs-actors/v2 v2.3.5 @@ -66,32 +66,33 @@ 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.3.4 + github.com/ipfs/go-bitswap v0.5.1 github.com/ipfs/go-block-format v0.0.3 - github.com/ipfs/go-blockservice v0.1.7 + github.com/ipfs/go-blockservice v0.2.1 github.com/ipfs/go-cid v0.1.0 github.com/ipfs/go-cidutil v0.0.2 - github.com/ipfs/go-datastore v0.4.6 - github.com/ipfs/go-ds-badger2 v0.1.1-0.20200708190120-187fc06f714e - github.com/ipfs/go-ds-leveldb v0.4.2 + github.com/ipfs/go-datastore v0.5.0 + github.com/ipfs/go-ds-badger2 v0.1.2-0.20211119002906-7318f1b76158 + github.com/ipfs/go-ds-leveldb v0.5.0 github.com/ipfs/go-ds-measure v0.1.0 github.com/ipfs/go-ds-pebble v0.0.2-0.20200921225637-ce220f8ac459 + github.com/ipfs/go-filestore v0.0.3 // indirect github.com/ipfs/go-fs-lock v0.0.6 github.com/ipfs/go-graphsync v0.10.6 - github.com/ipfs/go-ipfs-blockstore v1.0.4 + github.com/ipfs/go-ipfs-blockstore v1.1.0 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.0.0 - github.com/ipfs/go-ipfs-exchange-interface v0.0.1 - github.com/ipfs/go-ipfs-exchange-offline v0.0.1 + 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-offline v0.1.1 github.com/ipfs/go-ipfs-files v0.0.9 github.com/ipfs/go-ipfs-http-client v0.0.6 - github.com/ipfs/go-ipfs-routing v0.1.0 + github.com/ipfs/go-ipfs-routing v0.2.1 github.com/ipfs/go-ipfs-util v0.0.2 github.com/ipfs/go-ipld-cbor v0.0.5 github.com/ipfs/go-ipld-format v0.2.0 github.com/ipfs/go-log/v2 v2.3.0 - github.com/ipfs/go-merkledag v0.4.1 + github.com/ipfs/go-merkledag v0.5.1 github.com/ipfs/go-metrics-interface v0.0.1 github.com/ipfs/go-metrics-prometheus v0.0.2 github.com/ipfs/go-path v0.0.7 @@ -111,7 +112,7 @@ require ( github.com/libp2p/go-libp2p-discovery v0.5.1 github.com/libp2p/go-libp2p-kad-dht v0.13.0 github.com/libp2p/go-libp2p-noise v0.2.2 - github.com/libp2p/go-libp2p-peerstore v0.3.0 + github.com/libp2p/go-libp2p-peerstore v0.4.0 github.com/libp2p/go-libp2p-pubsub v0.5.6 github.com/libp2p/go-libp2p-quic-transport v0.11.2 github.com/libp2p/go-libp2p-record v0.1.3 @@ -131,6 +132,7 @@ 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/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9 // indirect github.com/polydawn/refmt v0.0.0-20201211092308-30ac6d18308e github.com/prometheus/client_golang v1.11.0 github.com/raulk/clock v1.1.0 @@ -141,6 +143,7 @@ require ( github.com/uber/jaeger-client-go v2.25.0+incompatible // indirect github.com/urfave/cli/v2 v2.2.0 github.com/whyrusleeping/bencher v0.0.0-20190829221104-bb6607aa8bba + github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11 // indirect github.com/whyrusleeping/cbor-gen v0.0.0-20210713220151-be142a5ae1a8 github.com/whyrusleeping/ledger-filecoin-go v0.9.1-0.20201010031517-c3dcc1bddce4 github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 @@ -155,6 +158,7 @@ require ( go.uber.org/fx v1.9.0 go.uber.org/multierr v1.7.0 go.uber.org/zap v1.19.1 + golang.org/x/exp v0.0.0-20210715201039-d37aa40e8013 // indirect golang.org/x/net v0.0.0-20210917221730-978cfadd31cf golang.org/x/sync v0.0.0-20210220032951-036812b2e83c golang.org/x/sys v0.0.0-20210917161153-d61c044b1678 diff --git a/go.sum b/go.sum index 241b98887d0..469b791cc13 100644 --- a/go.sum +++ b/go.sum @@ -32,6 +32,10 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +contrib.go.opencensus.io/exporter/jaeger v0.1.0/go.mod h1:VYianECmuFPwU37O699Vc1GOcy+y8kOsfaxHRImmjbA= +contrib.go.opencensus.io/exporter/jaeger v0.2.1 h1:yGBYzYMewVL0yO9qqJv3Z5+IRhPdU7e9o/2oKpX4YvI= +contrib.go.opencensus.io/exporter/jaeger v0.2.1/go.mod h1:Y8IsLgdxqh1QxYxPC5IgXVmBaeLUeQFfBeBi9PbeZd0= +contrib.go.opencensus.io/exporter/prometheus v0.1.0/go.mod h1:cGFniUXGZlKRjzOyuZJ6mgB+PgBcCIa79kEKR8YCW+A= contrib.go.opencensus.io/exporter/prometheus v0.4.0 h1:0QfIkj9z/iVZgK31D9H9ohjjIDApI2GOPScCKwxedbs= contrib.go.opencensus.io/exporter/prometheus v0.4.0/go.mod h1:o7cosnyfuPVK0tB8q0QmaQNhGnptITnPQB+z1+qeFB0= dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU= @@ -54,6 +58,7 @@ 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= github.com/GeertJohan/go.incremental v1.0.0/go.mod h1:6fAjUhbVuX1KcMD3c8TEgVUqmo4seqhv0i0kdATSkM0= +github.com/GeertJohan/go.rice v1.0.0/go.mod h1:eH6gbSOAUv07dQuZVnBmoDP8mgsM1rtixis4Tib9if0= github.com/GeertJohan/go.rice v1.0.2 h1:PtRw+Tg3oa3HYwiDBZyvOJ8LdIyf6lAovJJtr7YOAYk= 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= @@ -75,6 +80,7 @@ github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= +github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= github.com/Stebalien/go-bitfield v0.0.1 h1:X3kbSSPUaJK60wV2hjOPZwmpljr6VGCqdq4cBLhbQBo= @@ -133,6 +139,7 @@ github.com/briandowns/spinner v1.11.1/go.mod h1:QOuQk7x+EaDASo80FEXwlwiA+j/PPIcX github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= github.com/btcsuite/btcd v0.0.0-20190523000118-16327141da8c/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= github.com/btcsuite/btcd v0.0.0-20190605094302-a0d1e3e36d50/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= +github.com/btcsuite/btcd v0.0.0-20190629003639-c26ffa870fd8/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= github.com/btcsuite/btcd v0.0.0-20190824003749-130ea5bddde3/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= github.com/btcsuite/btcd v0.21.0-beta/go.mod h1:ZSWyehm27aAuS9bvkATT+Xte3hjHZ+MRgMY/8NJ7K94= @@ -208,6 +215,7 @@ github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7 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= @@ -243,9 +251,10 @@ github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6ps github.com/dgraph-io/badger v1.6.1/go.mod h1:FRmFw3uxvcpa8zG3Rxs0th+hCLIuaQg8HlNV5bjgnuU= github.com/dgraph-io/badger v1.6.2 h1:mNw0qs90GVgGGWylh0umH5iag1j6n/PeJtNvL6KY/x8= github.com/dgraph-io/badger v1.6.2/go.mod h1:JW2yswe3V058sS0kZ2h/AXeDSqFjxnZcRrVH//y2UQE= +github.com/dgraph-io/badger/v2 v2.0.1-rc1.0.20200120142413-c3333a5a830e/go.mod h1:3KY8+bsP8wI0OEnQJAKpd4wIJW/Mm32yw2j/9FUVnIM= github.com/dgraph-io/badger/v2 v2.0.3/go.mod h1:3KY8+bsP8wI0OEnQJAKpd4wIJW/Mm32yw2j/9FUVnIM= -github.com/dgraph-io/badger/v2 v2.2007.2 h1:EjjK0KqwaFMlPin1ajhP943VPENHJdEz1KLIegjaI3k= -github.com/dgraph-io/badger/v2 v2.2007.2/go.mod h1:26P/7fbL4kUZVEVKLAKXkBXKOydDmM2p1e+NhhnBCAE= +github.com/dgraph-io/badger/v2 v2.2007.3 h1:Sl9tQWz92WCbVSe8pj04Tkqlm2boW+KAxd+XSs58SQI= +github.com/dgraph-io/badger/v2 v2.2007.3/go.mod h1:26P/7fbL4kUZVEVKLAKXkBXKOydDmM2p1e+NhhnBCAE= github.com/dgraph-io/ristretto v0.0.2-0.20200115201040-8f368f2f2ab3/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= github.com/dgraph-io/ristretto v0.0.2/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de h1:t0UHb5vdojIDUqktM6+xJAfScFBsVpXZmqC9dsgJmeA= @@ -273,6 +282,7 @@ github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5m github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +github.com/elastic/go-sysinfo v1.3.0/go.mod h1:i1ZYdU10oLNfRzq4vq62BEwD2fH8KaWh6eh0ikPT9F0= github.com/elastic/go-sysinfo v1.7.0 h1:4vVvcfi255+8+TyQ7TYUTEK3A+G8v5FLE+ZKYL1z1Dg= github.com/elastic/go-sysinfo v1.7.0/go.mod h1:i1ZYdU10oLNfRzq4vq62BEwD2fH8KaWh6eh0ikPT9F0= github.com/elastic/go-windows v1.0.0 h1:qLURgZFkkrYyTTkvYpsZIgf83AUsdIHfvlJaqaZ7aSY= @@ -301,18 +311,28 @@ github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL 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/fd/go-nat v1.0.0/go.mod h1:BTBu/CKvMmOMUPkKVef1pngt2WFH/lg7E6yQnulfp6E= +github.com/filecoin-project/chain-validation v0.0.3/go.mod h1:NCEGFjcWRjb8akWFSOXvU6n2efkWIqAeOKU6o5WBGQw= github.com/filecoin-project/dagstore v0.4.2/go.mod h1:WY5OoLfnwISCk6eASSF927KKPqLPIlTwmG1qHpA08KY= github.com/filecoin-project/dagstore v0.4.3 h1:yeFl6+2BRY1gOVp/hrZuFa24s7LY0Qqkqx/Gh8lidZs= github.com/filecoin-project/dagstore v0.4.3/go.mod h1:dm/91AO5UaDd3bABFjg/5fmRH99vvpS7g1mykqvz6KQ= +github.com/filecoin-project/go-address v0.0.0-20191219011437-af739c490b4f/go.mod h1:rCbpXPva2NKF9/J4X6sr7hbKBgQCxyFtRj7KOZqoIms= +github.com/filecoin-project/go-address v0.0.0-20200107215422-da8eea2842b5/go.mod h1:SAOwJoakQ8EPjwNIsiakIQKsoKdkcbx8U3IapgCg9R0= +github.com/filecoin-project/go-address v0.0.2-0.20200218010043-eb9bb40ed5be/go.mod h1:SAOwJoakQ8EPjwNIsiakIQKsoKdkcbx8U3IapgCg9R0= github.com/filecoin-project/go-address v0.0.3/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= github.com/filecoin-project/go-address v0.0.5/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= github.com/filecoin-project/go-address v0.0.6 h1:DWQtj38ax+ogHwyH3VULRIoT8E6loyXqsk/p81xoY7M= github.com/filecoin-project/go-address v0.0.6/go.mod h1:7B0/5DA13n6nHkB8bbGx1gWzG/dbTsZ0fgOJVGsM3TE= +github.com/filecoin-project/go-amt-ipld v0.0.0-20191205011053-79efc22d6cdc/go.mod h1:KsFPWjF+UUYl6n9A+qbg4bjFgAOneicFZtDH/LQEX2U= +github.com/filecoin-project/go-amt-ipld/v2 v2.0.0/go.mod h1:PAZ5tvSfMfWE327osqFXKm7cBpCpBk2Nh0qKsJUmjjk= +github.com/filecoin-project/go-amt-ipld/v2 v2.0.1-0.20200131012142-05d80eeccc5e/go.mod h1:boRtQhzmxNocrMxOXo1NYn4oUc1NGvR8tEa79wApNXg= github.com/filecoin-project/go-amt-ipld/v2 v2.1.0 h1:t6qDiuGYYngDqaLc2ZUvdtAg4UNxPeOYaXhBWSNsVaM= github.com/filecoin-project/go-amt-ipld/v2 v2.1.0/go.mod h1:nfFPoGyX0CU9SkXX8EoCcSuHN1XcbN0c6KBh7yvP5fs= github.com/filecoin-project/go-amt-ipld/v3 v3.0.0/go.mod h1:Qa95YNAbtoVCTSVtX38aAC1ptBnJfPma1R/zZsKmx4o= github.com/filecoin-project/go-amt-ipld/v3 v3.1.0 h1:ZNJ9tEG5bE72vBWYiuh5bkxJVM3ViHNOmQ7qew9n6RE= github.com/filecoin-project/go-amt-ipld/v3 v3.1.0/go.mod h1:UjM2QhDFrrjD5s1CdnkJkat4ga+LqZBZgTMniypABRo= +github.com/filecoin-project/go-bitfield v0.0.0-20200309034705-8c7ac40bd550/go.mod h1:iodsLxOFZnqKtjj2zkgqzoGNrv6vUqj69AT/J8DKXEw= +github.com/filecoin-project/go-bitfield v0.0.0-20200416002808-b3ee67ec9060/go.mod h1:iodsLxOFZnqKtjj2zkgqzoGNrv6vUqj69AT/J8DKXEw= github.com/filecoin-project/go-bitfield v0.2.0/go.mod h1:CNl9WG8hgR5mttCnUErjcQjGvuiZjRqK9rHVBsQF4oM= github.com/filecoin-project/go-bitfield v0.2.3/go.mod h1:CNl9WG8hgR5mttCnUErjcQjGvuiZjRqK9rHVBsQF4oM= github.com/filecoin-project/go-bitfield v0.2.4 h1:uZ7MeE+XfM5lqrHJZ93OnhQKc/rveW8p9au0C68JPgk= @@ -326,17 +346,26 @@ github.com/filecoin-project/go-commp-utils v0.1.2/go.mod h1:6s95K91mCyHY51RPWECZ 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-data-transfer v0.0.0-20191219005021-4accf56bd2ce/go.mod h1:b14UWxhxVCAjrQUYvVGrQRRsjAh79wXYejw9RbUcAww= +github.com/filecoin-project/go-data-transfer v0.2.1/go.mod h1:+0weLKevhT3EKyan4QzUSMlQOPgLNgT2j0CfEA1NLqI= +github.com/filecoin-project/go-data-transfer v0.5.3/go.mod h1:30ROzlBS8tbTkszmW9a6/N4oD5bIh6QRBCXC6lORuI8= github.com/filecoin-project/go-data-transfer v1.0.1/go.mod h1:UxvfUAY9v3ub0a21BSK9u3pB2aq30Y0KMsG+w9/ysyo= -github.com/filecoin-project/go-data-transfer v1.11.4 h1:jKvlx0/C8HSyLRn/G1P9TjtfBtFU9jbCvCVFmWbyYVQ= github.com/filecoin-project/go-data-transfer v1.11.4/go.mod h1:2MitLI0ebCkLlPKM7NRggP/t9d+gCcREUKkCKqWRCwU= +github.com/filecoin-project/go-data-transfer v1.11.7-0.20211119001436-c0dbfa5fae4d h1:otSEh99T0inzVe6pblKBG5tSeSqbQq4BCi5GKoh1J7I= +github.com/filecoin-project/go-data-transfer v1.11.7-0.20211119001436-c0dbfa5fae4d/go.mod h1:Qj+yDFsualZ4c7Ndh5Cl1SJK46QeVzNMdRnfAJdDuhw= +github.com/filecoin-project/go-ds-versioning v0.0.0-20211119000042-d0cf38743fe7/go.mod h1:BVGOwN2WSCRKV3CDLFJ9u0L9M17WxHqw1KLA0l5ATnk= github.com/filecoin-project/go-ds-versioning v0.1.0 h1:y/X6UksYTsK8TLCI7rttCKEvl8btmWxyFMEeeWGUxIQ= github.com/filecoin-project/go-ds-versioning v0.1.0/go.mod h1:mp16rb4i2QPmxBnmanUx8i/XANp+PFCCJWiAb+VW4/s= +github.com/filecoin-project/go-fil-commcid v0.0.0-20200208005934-2b8bd03caca5/go.mod h1:JbkIgFF/Z9BDlvrJO1FuKkaWsH673/UdFaiVS6uIHlA= github.com/filecoin-project/go-fil-commcid v0.0.0-20200716160307-8f644712406f/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commcid v0.1.0 h1:3R4ds1A9r6cr8mvZBfMYxTS88OqLYEo6roi+GiIeOh8= 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 v0.0.0-20200114015428-74d100f305f8/go.mod h1:c8NTjvFVy1Ud02mmGDjOiMeawY2t6ALfrrdvAB01FQc= +github.com/filecoin-project/go-fil-markets v0.1.3 h1:RSPSNJbrJ1limTXtlWEDKEgZVcFmbPCV48hM1Cm6F7U= +github.com/filecoin-project/go-fil-markets v0.1.3/go.mod h1:ByBBn4/X216eAmbYb/Pg1sKjfc5W6iIJXrArqznJ1Z8= github.com/filecoin-project/go-fil-markets v1.0.5-0.20201113164554-c5eba40d5335/go.mod h1:AJySOJC00JRWEZzRG2KsfUnqEf5ITXxeX09BE9N4f9c= github.com/filecoin-project/go-fil-markets v1.13.4 h1:NAu+ACelR2mYsj+yJ4iLu8FGqWK50OnU5VF8axkLsSc= github.com/filecoin-project/go-fil-markets v1.13.4/go.mod h1:aANjXD2XMHWnT2zWpyGWLsWLC24C4mHm0gRm85OpPWE= @@ -350,12 +379,17 @@ github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0/go.mod h1:bxmzgT8tmeVQA1/gvBw 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-multistore v0.0.3/go.mod h1:kaNqCC4IhU4B1uyr7YWFHd23TL4KM32aChS0jNkyUvQ= +github.com/filecoin-project/go-padreader v0.0.0-20200210211231-548257017ca6/go.mod h1:0HgYnrkeSU4lu1p+LEOeDpFsNBssa0OGGriWdA4hvaE= github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20/go.mod h1:mPn+LRRd5gEKNAtc+r3ScpW2JRU/pj4NBKdADYWHiak= github.com/filecoin-project/go-padreader v0.0.0-20210723183308-812a16dc01b1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= github.com/filecoin-project/go-padreader v0.0.1 h1:8h2tVy5HpoNbr2gBRr+WD6zV6VD6XHig+ynSGJg8ZOs= github.com/filecoin-project/go-padreader v0.0.1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= +github.com/filecoin-project/go-paramfetch v0.0.0-20200102181131-b20d579f2878/go.mod h1:40kI2Gv16mwcRsHptI3OAV4nlOEU7wVDc4RgMylNFjU= +github.com/filecoin-project/go-paramfetch v0.0.1/go.mod h1:fZzmf4tftbwf9S37XRifoJlz7nCjRdIrMGLR07dKLCc= github.com/filecoin-project/go-paramfetch v0.0.2 h1:a6W3Ij6CKhwHYYlx+5mqvBIyw4CabZH2ojdEaoAZ6/g= github.com/filecoin-project/go-paramfetch v0.0.2/go.mod h1:1FH85P8U+DUEmWk1Jkw3Bw7FrwTVUNHk/95PSPG+dts= +github.com/filecoin-project/go-sectorbuilder v0.0.1/go.mod h1:3OZ4E3B2OuwhJjtxR4r7hPU9bCfB+A+hm4alLEsaeDc= +github.com/filecoin-project/go-sectorbuilder v0.0.2-0.20200203173614-42d67726bb62/go.mod h1:jNGVCDihkMFnraYVLH1xl4ceZQVxx/u4dOORrTKeRi0= github.com/filecoin-project/go-state-types v0.0.0-20200903145444-247639ffa6ad/go.mod h1:IQ0MBPnonv35CJHtWSN3YY1Hz2gkPru1Q9qoaYLxx9I= github.com/filecoin-project/go-state-types v0.0.0-20200904021452-1883f36ca2f4/go.mod h1:IQ0MBPnonv35CJHtWSN3YY1Hz2gkPru1Q9qoaYLxx9I= github.com/filecoin-project/go-state-types v0.0.0-20200928172055-2df22083d8ab/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= @@ -365,14 +399,22 @@ github.com/filecoin-project/go-state-types v0.1.1-0.20210506134452-99b279731c48/ 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.1 h1:LR260vya4p++atgf256W6yV3Lxl5mKrBFcEZePWQrdg= github.com/filecoin-project/go-state-types v0.1.1/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= +github.com/filecoin-project/go-statemachine v0.0.0-20200226041606-2074af6d51d9/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig= +github.com/filecoin-project/go-statemachine v0.0.0-20200714194326-a77c3ae20989/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig= github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig= github.com/filecoin-project/go-statemachine v1.0.1 h1:LQ60+JDVjMdLxXmVFM2jjontzOYnfVE7u02CXV3WKSw= github.com/filecoin-project/go-statemachine v1.0.1/go.mod h1:jZdXXiHa61n4NmgWFG4w8tnqgvZVHYbJ3yW7+y8bF54= github.com/filecoin-project/go-statestore v0.1.0/go.mod h1:LFc9hD+fRxPqiHiaqUEZOinUJB4WARkRfNl10O7kTnI= -github.com/filecoin-project/go-statestore v0.1.1 h1:ufMFq00VqnT2CAuDpcGnwLnCX1I/c3OROw/kXVNSTZk= github.com/filecoin-project/go-statestore v0.1.1/go.mod h1:LFc9hD+fRxPqiHiaqUEZOinUJB4WARkRfNl10O7kTnI= +github.com/filecoin-project/go-statestore v0.1.2-0.20211118230537-43557b6c5ce5 h1:xH09S8C+VhZCTmTkdudGm/cN5a8teKE+PXXvbPsXTO0= +github.com/filecoin-project/go-statestore v0.1.2-0.20211118230537-43557b6c5ce5/go.mod h1:8sjBYbS35HwPzct7iT4lIXjLlYyPor80aU7t7a/Kspo= github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b h1:fkRZSPrYpk42PV3/lIXiL0LHetxde7vyYYvSsttQtfg= github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b/go.mod h1:Q0GQOBtKf1oE10eSXSlhN45kDBdGvEcVOqMiffqX+N8= +github.com/filecoin-project/lotus v0.2.10/go.mod h1:om5PQA9ZT0lf16qI7Fz/ZGLn4LDCMqPC8ntZA9uncRE= +github.com/filecoin-project/sector-storage v0.0.0-20200411000242-61616264b16d/go.mod h1:/yueJueMh0Yc+0G1adS0lhnedcSnjY86EjKsA20+DVY= +github.com/filecoin-project/specs-actors v0.0.0-20200210130641-2d1fbd8672cf/go.mod h1:xtDZUB6pe4Pksa/bAJbJ693OilaC5Wbot9jMhLm3cZA= +github.com/filecoin-project/specs-actors v0.0.0-20200409043918-e569f4a2f504/go.mod h1:mdJraXq5vMy0+/FqVQIrnNlpQ/Em6zeu06G/ltQ0/lA= +github.com/filecoin-project/specs-actors v0.3.0/go.mod h1:nQYnFbQ7Y0bHZyq6HDEuVlCPR+U3z5Q3wMOQ+2aiV+Y= github.com/filecoin-project/specs-actors v0.9.4/go.mod h1:BStZQzx5x7TmCkLv0Bpa07U6cPKol6fd3w9KjMPZ6Z4= github.com/filecoin-project/specs-actors v0.9.12/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= @@ -393,6 +435,7 @@ github.com/filecoin-project/specs-actors/v5 v5.0.4 h1:OY7BdxJWlUfUFXWV/kpNBYGXNP github.com/filecoin-project/specs-actors/v5 v5.0.4/go.mod h1:5BAKRAMsOOlD8+qCw4UvT/lTLInCJ3JwOWZbX8Ipwq4= github.com/filecoin-project/specs-actors/v6 v6.0.1 h1:laxvHNsvrq83Y9n+W7znVCePi3oLyRf0Rkl4jFO8Wew= github.com/filecoin-project/specs-actors/v6 v6.0.1/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= +github.com/filecoin-project/specs-storage v0.0.0-20200410185809-9fbaaa08f275/go.mod h1:xJ1/xl9+8zZeSSSFmDC3Wr6uusCTxyYPI0VeNVSFmPE= github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506 h1:Ur/l2+6qN+lQiqjozWWc5p9UDaAMDZKTlDS98oRnlIw= github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506/go.mod h1:nJRRM7Aa9XVvygr3W9k6xGF46RWzr2zxF/iGoAIfA/g= github.com/filecoin-project/test-vectors/schema v0.0.5 h1:w3zHQhzM4pYxJDl21avXjOKBLF8egrvwUwjpT8TquDg= @@ -412,6 +455,7 @@ github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/gbrlsnchs/jwt/v3 v3.0.0-beta.1/go.mod h1:0eHX/BVySxPc6SE2mZRoppGq7qcEagxdmQnA3dzork8= 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= @@ -442,6 +486,7 @@ github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA= 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-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM= 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= @@ -599,8 +644,11 @@ github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go 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/gxed/pubsub v0.0.0-20180201040156-26ebdf44f824/go.mod h1:OiEWyHgK+CWrmOlVquHaIK1vhpUJydC9m0Je6mhaiNE= github.com/hako/durafmt v0.0.0-20200710122514-c0fb7b4da026 h1:BpJ2o0OR5FV7vrkDYfXYVJQeMNWa8RhklZOpW2ITAIQ= github.com/hako/durafmt v0.0.0-20200710122514-c0fb7b4da026/go.mod h1:5Scbynm8dF1XAPwIwkGPqzkM/shndPm79Jd1003hTjE= +github.com/hannahhoward/cbor-gen-for v0.0.0-20191216214420-3e450425c40c/go.mod h1:WVPCl0HO/0RAL5+vBH2GMxBomlxBF70MAS78+Lu1//k= +github.com/hannahhoward/cbor-gen-for v0.0.0-20191218204337-9ab7b1bcc099/go.mod h1:WVPCl0HO/0RAL5+vBH2GMxBomlxBF70MAS78+Lu1//k= github.com/hannahhoward/cbor-gen-for v0.0.0-20200817222906-ea96cece81f1 h1:F9k+7wv5OIk1zcq23QpdiL0hfDuXPjuOmMNaC6fgQ0Q= github.com/hannahhoward/cbor-gen-for v0.0.0-20200817222906-ea96cece81f1/go.mod h1:jvfsLIxk0fY/2BKSQ1xf2406AKA5dwMmKKv0ADcOfN8= github.com/hannahhoward/go-pubsub v0.0.0-20200423002714-8d62886cc36e h1:3YKHER4nmd7b5qy5t0GWDTwSn4OyRgfAXSmo6VnryBY= @@ -649,6 +697,7 @@ github.com/hodgesds/perf-utils v0.0.8/go.mod h1:F6TfvsbtrF88i++hou29dTXlI2sfsJv+ 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 v0.0.0-20180415215157-1395d1447324/go.mod h1:MZ2ZmwcBpvOoJ22IJsc7va19ZwoheaBk43rKg12SKag= github.com/huin/goupnp v1.0.0/go.mod h1:n9v9KO1tAxYH82qOn+UTIFQDmx5n1Zxd/ClZDMX7Bnc= github.com/huin/goupnp v1.0.2 h1:RfGLP+h3mvisuWEyybxNq5Eft3NWhHLPeUN72kpKZoI= github.com/huin/goupnp v1.0.2/go.mod h1:0dxJBVBHqTMjIUMkESDTNgOOx/Mw5wYIfyFmdzSamkM= @@ -663,6 +712,7 @@ github.com/icza/backscanner v0.0.0-20210726202459-ac2ffc679f94/go.mod h1:GYeBD1C github.com/icza/mighty v0.0.0-20180919140131-cfd07d671de6 h1:8UsGZ2rr2ksmEru6lToqnXgA8Mz1DP11X4zSJ159C3k= github.com/icza/mighty v0.0.0-20180919140131-cfd07d671de6/go.mod h1:xQig96I1VNBDIWGCdTt54nHt6EeI639SmHycLYL7FkA= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/influxdata/influxdb1-client v0.0.0-20190809212627-fc22c7df067e/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab h1:HqW4xhhynfjrtEiiSGcQUd6vrK23iMam1FO8rI7mwig= github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= @@ -672,20 +722,25 @@ github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyq 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.3/go.mod h1:YEQlFy0kkxops5Vy+OxWdRSEZIoS7I7KDIwoa5Chkps= github.com/ipfs/go-bitswap v0.1.8/go.mod h1:TOWoxllhccevbWFUR2N7B1MTSVVge1s6XSMiCSA4MzM= -github.com/ipfs/go-bitswap v0.3.4 h1:AhJhRrG8xkxh6x87b4wWs+4U4y3DVB3doI8yFNqgQME= github.com/ipfs/go-bitswap v0.3.4/go.mod h1:4T7fvNv/LmOys+21tnLzGKncMeeXUYUd1nUiJ2teMvI= +github.com/ipfs/go-bitswap v0.5.1 h1:721YAEDBnLIrvcIMkCHCdqp34hA8jwL9yKMkyJpSpco= +github.com/ipfs/go-bitswap v0.5.1/go.mod h1:P+ckC87ri1xFLvk74NlXdP0Kj9RmWAh4+H78sC6Qopo= 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= 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.3-0.20190908200855-f22eea50656c/go.mod h1:t+411r7psEUhLueM8C7aPA7cxCclv4O3VsUVxt9kz2I= github.com/ipfs/go-blockservice v0.1.3/go.mod h1:OTZhFpkgY48kNzbgyvcexW9cHrpjBYIjSR0KoDOFOLU= github.com/ipfs/go-blockservice v0.1.4-0.20200624145336-a978cec6e834/go.mod h1:OTZhFpkgY48kNzbgyvcexW9cHrpjBYIjSR0KoDOFOLU= github.com/ipfs/go-blockservice v0.1.5/go.mod h1:yLk8lBJCBRWRqerqCSVi3cE/Dncdt3vGC/PJMVKhLTY= -github.com/ipfs/go-blockservice v0.1.7 h1:yVe9te0M7ow8i+PPkx03YFSpxqzXx594d6h+34D6qMg= -github.com/ipfs/go-blockservice v0.1.7/go.mod h1:GmS+BAt4hrwBKkzE11AFDQUrnvqjwFatGS2MY7wOjEM= +github.com/ipfs/go-blockservice v0.2.1 h1:NJ4j/cwEfIg60rzAWcCIxRtOwbf6ZPK49MewNxObCPQ= +github.com/ipfs/go-blockservice v0.2.1/go.mod h1:k6SiwmgyYgs4M/qt+ww6amPeUH9EISLRBnvUurKJhi8= +github.com/ipfs/go-car v0.0.3-0.20191203022317-23b0a85fd1b1/go.mod h1:rmd887mJxQRDfndfDEY3Liyx8gQVyfFFRSHdsnDSAlk= +github.com/ipfs/go-car v0.0.3-0.20200121013634-f188c0e24291/go.mod h1:AG6sBpd2PWMccpAG7XLFBBQ/4rfBEtzUNeO2GSMesYk= 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= @@ -711,8 +766,10 @@ github.com/ipfs/go-datastore v0.4.1/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13X 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.4.6 h1:zU2cmweykxJ+ziXnA2cPtsLe8rdR/vrthOipLPuf6kc= github.com/ipfs/go-datastore v0.4.6/go.mod h1:XSipLSc64rFKSFRFGo1ecQl+WhYce3K7frtpHkyPFUc= +github.com/ipfs/go-datastore v0.4.7-0.20211013204805-28a3721c2e66/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= +github.com/ipfs/go-datastore v0.5.0 h1:rQicVCEacWyk4JZ6G5bD9TKR7lZEG1MWcG7UdWYrFAU= +github.com/ipfs/go-datastore v0.5.0/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= 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= @@ -721,91 +778,85 @@ github.com/ipfs/go-ds-badger v0.0.7/go.mod h1:qt0/fWzZDoPW6jpQeqUjR5kBfhDNB65jd9 github.com/ipfs/go-ds-badger v0.2.1/go.mod h1:Tx7l3aTph3FMFrRS838dcSJh+jjA7cX9DrGVwx/NOwE= github.com/ipfs/go-ds-badger v0.2.3/go.mod h1:pEYw0rgg3FIrywKKnL+Snr+w/LjJZVMTBRn4FS6UHUk= github.com/ipfs/go-ds-badger v0.2.6/go.mod h1:02rnztVKA4aZwDuaRPTf8mpqcKmXP7mLl6JPxd14JHA= -github.com/ipfs/go-ds-badger v0.2.7 h1:ju5REfIm+v+wgVnQ19xGLYPHYHbYLR6qJfmMbCDSK1I= github.com/ipfs/go-ds-badger v0.2.7/go.mod h1:02rnztVKA4aZwDuaRPTf8mpqcKmXP7mLl6JPxd14JHA= +github.com/ipfs/go-ds-badger v0.3.0 h1:xREL3V0EH9S219kFFueOYJJTcjgNSZ2HY1iSvN7U1Ro= +github.com/ipfs/go-ds-badger v0.3.0/go.mod h1:1ke6mXNqeV8K3y5Ak2bAA0osoTfmxUdupVCGm4QUIek= +github.com/ipfs/go-ds-badger2 v0.0.0-20200123200730-d75eb2678a5d/go.mod h1:sTQFaWUoW0OvhXzfHnQ9j39L6fdlqDkptDYcpC1XrYE= github.com/ipfs/go-ds-badger2 v0.1.0/go.mod h1:pbR1p817OZbdId9EvLOhKBgUVTM3BMCSTan78lDDVaw= -github.com/ipfs/go-ds-badger2 v0.1.1-0.20200708190120-187fc06f714e h1:Xi1nil8K2lBOorBS6Ys7+hmUCzH8fr3U9ipdL/IrcEI= -github.com/ipfs/go-ds-badger2 v0.1.1-0.20200708190120-187fc06f714e/go.mod h1:lJnws7amT9Ehqzta0gwMrRsURU04caT0iRPr1W8AsOU= +github.com/ipfs/go-ds-badger2 v0.1.2-0.20211119002906-7318f1b76158 h1:/8az/zYn1icEwiHAmpR11Io+8hrlICU10J+Ft0zSiog= +github.com/ipfs/go-ds-badger2 v0.1.2-0.20211119002906-7318f1b76158/go.mod h1:3FtQmDv6fMubygEfU43bsFelYpIiXX/XEYA54l9eCwg= 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= -github.com/ipfs/go-ds-leveldb v0.4.2 h1:QmQoAJ9WkPMUfBLnu1sBVy0xWWlJPg0m4kRAiJL9iaw= github.com/ipfs/go-ds-leveldb v0.4.2/go.mod h1:jpbku/YqBSsBc1qgME8BkWS4AxzF2cEu1Ii2r79Hh9s= +github.com/ipfs/go-ds-leveldb v0.5.0 h1:s++MEBbD3ZKc9/8/njrn4flZLnCuY9I79v94gBUNumo= +github.com/ipfs/go-ds-leveldb v0.5.0/go.mod h1:d3XG9RUDzQ6V4SHi8+Xgj9j1XuEk1z82lquxrVbml/Q= github.com/ipfs/go-ds-measure v0.1.0 h1:vE4TyY4aeLeVgnnPBC5QzKIjKrqzha0NCujTfgvVbVQ= github.com/ipfs/go-ds-measure v0.1.0/go.mod h1:1nDiFrhLlwArTME1Ees2XaBOl49OoCgd2A3f8EchMSY= github.com/ipfs/go-ds-pebble v0.0.2-0.20200921225637-ce220f8ac459 h1:W3YMLEvOXqdW+sYMiguhWP6txJwQvIQqhvpU8yAMGQs= github.com/ipfs/go-ds-pebble v0.0.2-0.20200921225637-ce220f8ac459/go.mod h1:oh4liWHulKcDKVhCska5NLelE3MatWl+1FwSz3tY91g= +github.com/ipfs/go-filestore v0.0.2/go.mod h1:KnZ41qJsCt2OX2mxZS0xsK3Psr0/oB93HMMssLujjVc= +github.com/ipfs/go-filestore v0.0.3/go.mod h1:dvXRykFzyyXN2CdNlRGzDAkXMDPyI+D7JE066SiKLSE= github.com/ipfs/go-filestore v1.0.0 h1:QR7ekKH+q2AGiWDc7W2Q0qHuYSRZGUJqUn0GsegEPb0= github.com/ipfs/go-filestore v1.0.0/go.mod h1:/XOCuNtIe2f1YPbiXdYvD0BKLA0JR1MgPiFOdcuu9SM= +github.com/ipfs/go-fs-lock v0.0.1/go.mod h1:DNBekbboPKcxs1aukPSaOtFA3QfSdi5C855v0i9XJ8Y= github.com/ipfs/go-fs-lock v0.0.6 h1:sn3TWwNVQqSeNjlWy6zQ1uUGAZrV3hPOyEA6y1/N2a0= github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28L7zESmM= +github.com/ipfs/go-graphsync v0.0.4/go.mod h1:6UACBjfOXEa8rQL3Q/JpZpWS0nZDCLx134WUkjrmFpQ= +github.com/ipfs/go-graphsync v0.0.6-0.20200504202014-9d5f2c26a103/go.mod h1:jMXfqIEDFukLPZHqDPp8tJMbHO9Rmeb9CEGevngQbmE= github.com/ipfs/go-graphsync v0.1.0/go.mod h1:jMXfqIEDFukLPZHqDPp8tJMbHO9Rmeb9CEGevngQbmE= github.com/ipfs/go-graphsync v0.4.2/go.mod h1:/VmbZTUdUMTbNkgzAiCEucIIAU3BkLE2cZrDCVUhyi0= github.com/ipfs/go-graphsync v0.4.3/go.mod h1:mPOwDYv128gf8gxPFgXnz4fNrSYPsWyqisJ7ych+XDY= github.com/ipfs/go-graphsync v0.10.0/go.mod h1:cKIshzTaa5rCZjryH5xmSKZVGX9uk1wvwGvz2WEha5Y= -github.com/ipfs/go-graphsync v0.10.6 h1:GkYan4EoDslceHaqYo/hxktWtuZ7VmsyRXLdSmoCcBQ= +github.com/ipfs/go-graphsync v0.10.6-0.20211119000532-c416dad3bd56/go.mod h1:/wC15/mR2JyjVrO86tfZLLuhyvop0fLU+ewhYLkdgLM= github.com/ipfs/go-graphsync v0.10.6/go.mod h1:tQMjWNDD/vSz80YLT/VvzrUmy58aF9lR1uCwSLzjWzI= +github.com/ipfs/go-hamt-ipld v0.0.14-0.20191218031521-b2c774a54db1/go.mod h1:8yRx0xLUps1Xq8ZDnIwIVdQRp7JjA55gGvCiRHT91Vk= +github.com/ipfs/go-hamt-ipld v0.0.15-0.20200131012125-dd88a59d3f2e/go.mod h1:9aQJu/i/TaRDW6jqB5U217dLIDopn50wxLdHXM2CTfE= github.com/ipfs/go-hamt-ipld v0.1.1/go.mod h1:1EZCr2v0jlCnhpa+aZ0JZYp8Tt2w16+JJOAVz17YcDk= 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.1/go.mod h1:8gZOgIN5e+Xdg2YSGdwTTRbguSVjYyosIDRQCY8E9QM= 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 v1.0.0/go.mod h1:knLVdhVU9L7CC4T+T4nvGdeUIPAXlnd9zmXfp+9MIjU= -github.com/ipfs/go-ipfs-blockstore v1.0.1/go.mod h1:MGNZlHNEnR4KGgPHM3/k8lBySIOK2Ve+0KjZubKlaOE= -github.com/ipfs/go-ipfs-blockstore v1.0.3/go.mod h1:MGNZlHNEnR4KGgPHM3/k8lBySIOK2Ve+0KjZubKlaOE= -github.com/ipfs/go-ipfs-blockstore v1.0.4 h1:DZdeya9Vu4ttvlGheQPGrj6kWehXnYZRFCp9EsZQ1hI= -github.com/ipfs/go-ipfs-blockstore v1.0.4/go.mod h1:uL7/gTJ8QIZ3MtA3dWf+s1a0U3fJy2fcEZAsovpRp+w= -github.com/ipfs/go-ipfs-blocksutil v0.0.1 h1:Eh/H4pc1hsvhzsQoMEP3Bke/aW5P5rVM1IWFJMcGIPQ= +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.1.0/go.mod h1:5QDUApRqpgPcfGstCxYeMnjt/DYQtXXdJVCvxHHuWVk= github.com/ipfs/go-ipfs-blocksutil v0.0.1/go.mod h1:Yq4M86uIOmxmGPUHv/uI7uKqZNtLb449gwKqXjIsnRk= 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.3.0 h1:mi9oYrSCox5aBhutqAYqw6/9crlyGbw4E/aJtwS4zI4= github.com/ipfs/go-ipfs-cmds v0.3.0/go.mod h1:ZgYiWVnCk43ChwoH8hAmI1IRbuVtq3GSTHwtRB/Kqhk= -github.com/ipfs/go-ipfs-config v0.5.3 h1:3GpI/xR9FoJNTjU6YvCMRbYyEi0dBVY5UtlUTcNRlSA= github.com/ipfs/go-ipfs-config v0.5.3/go.mod h1:nSLCFtlaL+2rbl3F+9D4gQZQbT1LjRKx7TJg/IHz6oM= github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= -github.com/ipfs/go-ipfs-delay v0.0.1 h1:r/UXYyRcddO6thwOnhiznIAiSvxMECGgtv35Xs1IeRQ= 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 h1:bEQ8hMGs80h0sR8O4tfDgV6B01aaF9qeTrujrTLYV3g= github.com/ipfs/go-ipfs-ds-help v1.0.0/go.mod h1:ujAbkeIgkKAWtxxNkoZHWLCyk5JpPoKnGyCcsoF6ueE= -github.com/ipfs/go-ipfs-exchange-interface v0.0.1 h1:LJXIo9W7CAmugqI+uofioIpRb6rY30GUu7G6LUfpMvM= +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-offline v0.0.1 h1:P56jYKZF7lDDOLx5SotVh5KFxoY6C81I1NSHW1FxGew= +github.com/ipfs/go-ipfs-exchange-interface v0.1.0/go.mod h1:ych7WPlyHqFvCi/uQI48zLZuAWVP5iTQPXEfVaw5WEI= 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-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.7/go.mod h1:wiN/jSG8FKyk7N0WyctKSvq3ljIa2NNTiZB55kpTdOs= github.com/ipfs/go-ipfs-files v0.0.8/go.mod h1:wiN/jSG8FKyk7N0WyctKSvq3ljIa2NNTiZB55kpTdOs= -github.com/ipfs/go-ipfs-files v0.0.9 h1:OFyOfmuVDu9c5YtjSDORmwXzE6fmZikzZpzsnNkgFEg= github.com/ipfs/go-ipfs-files v0.0.9/go.mod h1:aFv2uQ/qxWpL/6lidWvnSQmaVqCrf0TBGoUr+C1Fo84= -github.com/ipfs/go-ipfs-http-client v0.0.6 h1:k2QllZyP7Fz5hMgsX5hvHfn1WPG9Ngdy5WknQ7JNhBM= +github.com/ipfs/go-ipfs-flags v0.0.1/go.mod h1:RnXBb9WV53GSfTrSDVK61NLTFKvWc60n+K9EgCDh+rA= github.com/ipfs/go-ipfs-http-client v0.0.6/go.mod h1:8e2dQbntMZKxLfny+tyXJ7bJHZFERp/2vyzZdvkeLMc= -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-routing v0.0.1/go.mod h1:k76lf20iKFxQTjcJokbPM9iBXVXVZhcOwc360N4nuKs= -github.com/ipfs/go-ipfs-routing v0.1.0 h1:gAJTT1cEeeLj6/DlLX6t+NxD9fQe2ymTO6qWRDI/HQQ= github.com/ipfs/go-ipfs-routing v0.1.0/go.mod h1:hYoUkJLyAUKhF58tysKpids8RNDPO42BVMgK5dNsoqY= +github.com/ipfs/go-ipfs-routing v0.2.1/go.mod h1:xiNNiwgjmLqPS1cimvAw6EyB9rkVDbiocA4yY+wRNLM= github.com/ipfs/go-ipfs-util v0.0.1/go.mod h1:spsl5z8KUnrve+73pOhSVZND1SIxPW5RyBCNzQxlJBc= -github.com/ipfs/go-ipfs-util v0.0.2 h1:59Sswnk1MFaiq+VcaknX7aYEyGyGDAA73ilhEK2POp8= github.com/ipfs/go-ipfs-util v0.0.2/go.mod h1:CbPtkWJzjLdEcezDns2XYaehFVNXG9zrdrtMecczcsQ= github.com/ipfs/go-ipld-cbor v0.0.2/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= github.com/ipfs/go-ipld-cbor v0.0.3/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= github.com/ipfs/go-ipld-cbor v0.0.4/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= -github.com/ipfs/go-ipld-cbor v0.0.5-0.20200204214505-252690b78669/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= -github.com/ipfs/go-ipld-cbor v0.0.5 h1:ovz4CHKogtG2KB/h1zUp5U0c/IzZrL435rCh5+K/5G8= github.com/ipfs/go-ipld-cbor v0.0.5/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= github.com/ipfs/go-ipld-format v0.0.1/go.mod h1:kyJtbkDALmFHv3QR6et67i35QzO3S0dCDnkOJhcZkms= github.com/ipfs/go-ipld-format v0.0.2/go.mod h1:4B6+FM2u9OJ9zCV+kSbgFAZlOrv1Hqbf0INGQgiKf9k= -github.com/ipfs/go-ipld-format v0.2.0 h1:xGlJKkArkmBvowr+GMCX0FEZtkro71K1AwiKnL37mwA= github.com/ipfs/go-ipld-format v0.2.0/go.mod h1:3l3C1uKoadTPbeNfrDi+xMInYKlx2Cvg1BuydPSdzQs= -github.com/ipfs/go-ipld-legacy v0.1.0 h1:wxkkc4k8cnvIGIjPO0waJCe7SHEyFgl+yQdafdjGrpA= github.com/ipfs/go-ipld-legacy v0.1.0/go.mod h1:86f5P/srAmh9GcIcWQR9lfFLZPrIyyXQeVlOWeeWEuI= -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-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= github.com/ipfs/go-log v1.0.0/go.mod h1:JO7RzlMK6rA+CIxFMLOuB6Wf5b81GDiKElL7UPSIKjA= @@ -813,7 +864,6 @@ github.com/ipfs/go-log v1.0.1/go.mod h1:HuWlQttfN6FWNHRhlY5yMk/lW7evQC0HHGOxEwMR github.com/ipfs/go-log v1.0.2/go.mod h1:1MNjMxe0u6xvJZgeqbJ8vdo2TKaGwZ1a0Bpza+sr2Sk= github.com/ipfs/go-log v1.0.3/go.mod h1:OsLySYkwIbiSUR/yBTdv1qPtcE4FW3WPWk/ewz9Ru+A= github.com/ipfs/go-log v1.0.4/go.mod h1:oDCg2FkjogeFOhqqb+N39l2RpTNPL6F/StPkB3kPgcs= -github.com/ipfs/go-log v1.0.5 h1:2dOuUCB1Z7uoczMWgAyDck5JLb72zHzrMnGnCNNbvY8= github.com/ipfs/go-log v1.0.5/go.mod h1:j0b8ZoR+7+R99LD9jZ6+AJsrzkPbSXbZfGakb5JPtIo= github.com/ipfs/go-log/v2 v2.0.1/go.mod h1:O7P1lJt27vWHhOwQmcFEvlmo49ry2VY2+JfBWFaa9+0= github.com/ipfs/go-log/v2 v2.0.2/go.mod h1:O7P1lJt27vWHhOwQmcFEvlmo49ry2VY2+JfBWFaa9+0= @@ -821,42 +871,32 @@ github.com/ipfs/go-log/v2 v2.0.3/go.mod h1:O7P1lJt27vWHhOwQmcFEvlmo49ry2VY2+JfBW github.com/ipfs/go-log/v2 v2.0.5/go.mod h1:eZs4Xt4ZUJQFM3DlanGhy7TkwwawCZcSByscwkWG+dw= github.com/ipfs/go-log/v2 v2.0.8/go.mod h1:eZs4Xt4ZUJQFM3DlanGhy7TkwwawCZcSByscwkWG+dw= github.com/ipfs/go-log/v2 v2.1.1/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHntrv9KM= -github.com/ipfs/go-log/v2 v2.1.2-0.20200626104915-0016c0b4b3e4/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHntrv9KM= github.com/ipfs/go-log/v2 v2.1.2/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHntrv9KM= github.com/ipfs/go-log/v2 v2.1.3/go.mod h1:/8d0SH3Su5Ooc31QlL1WysJhvyOTDCjcCZ9Axpmri6g= -github.com/ipfs/go-log/v2 v2.3.0 h1:31Re/cPqFHpsRHgyVwjWADPoF0otB1WrjTy8ZFYwEZU= github.com/ipfs/go-log/v2 v2.3.0/go.mod h1:QqGoj30OTpnKaG/LKTGTxoP2mmQtjVMEnK72gynbe/g= github.com/ipfs/go-merkledag v0.0.6/go.mod h1:QYPdnlvkOg7GnQRofu9XZimC5ZW5Wi3bKys/4GQQfto= +github.com/ipfs/go-merkledag v0.1.0/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= 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.1/go.mod h1:fvkZNNZixVW6cKSZ/JfLlON5OlgTXNdRLz0p6QG/I2M= github.com/ipfs/go-merkledag v0.3.2/go.mod h1:fvkZNNZixVW6cKSZ/JfLlON5OlgTXNdRLz0p6QG/I2M= -github.com/ipfs/go-merkledag v0.4.1 h1:CEEQZnwRkszN06oezuasHwDD823Xcr4p4zluUN9vXqs= -github.com/ipfs/go-merkledag v0.4.1/go.mod h1:56biPaS6e+IS0eXkEt6A8tG+BUQaEIFqDqJuFfQDBoE= -github.com/ipfs/go-metrics-interface v0.0.1 h1:j+cpbjYvu4R8zbleSs36gvB7jR+wsL2fGD6n0jO4kdg= +github.com/ipfs/go-merkledag v0.5.1/go.mod h1:cLMZXx8J08idkp5+id62iVftUQV+HlYJ3PIhDfZsjA4= 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-path v0.0.7 h1:H06hKMquQ0aYtHiHryOMLpQC1qC3QwXwkahcEVD51Ho= github.com/ipfs/go-path v0.0.7/go.mod h1:6KTKmeRnBXgqrTvzFrPV3CamxcgvXX/4z79tfAd2Sno= 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.6.0 h1:BT1/PuNViVomiz1PnnP5+WmKsTNHrxIDvkZrkj4JhOg= github.com/ipfs/go-peertaskqueue v0.6.0/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68ow0Rrb04donIU= +github.com/ipfs/go-peertaskqueue v0.7.0/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68ow0Rrb04donIU= 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 h1:gq3U3T2vh8x6tXhfo3uSO3n+2z4yW0tYtNgVP/3sIyA= github.com/ipfs/go-unixfs v0.2.6/go.mod h1:GTTzQvaZsTZARdNkkdjDKFFnBhmO3e5mIM1PkH/x4p0= -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 h1:+mUiamyHIwedqP8ZgbCIwpy40oX7QcXUbo4CZOeJVJg= github.com/ipfs/interface-go-ipfs-core v0.4.0/go.mod h1:UJBcU6iNennuI05amq3FQ7g0JHUkibHFAfhfUIy927o= -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/ipld/go-car v0.1.0/go.mod h1:RCWzaUh2i4mOEkB3W45Vc+9jnS/M6Qay5ooytiBHl3g= github.com/ipld/go-car v0.1.1-0.20200923150018-8cdef32e2da4/go.mod h1:xrMEcuSq+D1vEwl+YAXsg/JfA98XGpXDwnkIL4Aimqw= @@ -868,59 +908,42 @@ github.com/ipld/go-car/v2 v2.0.2/go.mod h1:I2ACeeg6XNBe5pdh5TaR7Ambhfa7If9KXxmXg github.com/ipld/go-car/v2 v2.1.0 h1:t8R/WXUSkfu1K1gpPk76mytCxsEdMjGcMIgpOq3/Cnw= github.com/ipld/go-car/v2 v2.1.0/go.mod h1:Xr6GwkDhv8dtOtgHzOynAkIOg0t0YiPc5DxBPppWqZA= github.com/ipld/go-codec-dagpb v1.2.0/go.mod h1:6nBN7X7h8EOsEejZGqC7tej5drsdBAXbMHyBT+Fne5s= -github.com/ipld/go-codec-dagpb v1.3.0 h1:czTcaoAuNNyIYWs6Qe01DJ+sEX7B+1Z0LcXjSatMGe8= github.com/ipld/go-codec-dagpb v1.3.0/go.mod h1:ga4JTU3abYApDC3pZ00BC2RSvC3qfBb9MSJkMLSwnhA= +github.com/ipld/go-ipld-prime v0.0.1/go.mod h1:bDDSvVz7vaK12FNvMeRYnpRFkSUPNQOiCYQezMD/P3w= github.com/ipld/go-ipld-prime v0.0.2-0.20191108012745-28a82f04c785/go.mod h1:bDDSvVz7vaK12FNvMeRYnpRFkSUPNQOiCYQezMD/P3w= github.com/ipld/go-ipld-prime v0.0.2-0.20200428162820-8b59dc292b8e/go.mod h1:uVIwe/u0H4VdKv3kaN1ck7uCb6yD9cFLS9/ELyXbsw8= -github.com/ipld/go-ipld-prime v0.5.1-0.20200828233916-988837377a7f/go.mod h1:0xEgdD6MKbZ1vF0GC+YcR/C4SQCAlRuOjIJ2i0HxqzM= -github.com/ipld/go-ipld-prime v0.5.1-0.20201021195245-109253e8a018/go.mod h1:0xEgdD6MKbZ1vF0GC+YcR/C4SQCAlRuOjIJ2i0HxqzM= github.com/ipld/go-ipld-prime v0.9.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= 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-0.20210930132912-0b3aef3ca569/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= -github.com/ipld/go-ipld-prime v0.12.3 h1:furVobw7UBLQZwlEwfE26tYORy3PAK8VYSgZOSr3JMQ= github.com/ipld/go-ipld-prime v0.12.3/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= github.com/ipld/go-ipld-prime-proto v0.0.0-20191113031812-e32bd156a1e5/go.mod h1:gcvzoEDBjwycpXt3LBE061wT9f46szXGHAmj9uoP6fU= github.com/ipld/go-ipld-prime-proto v0.0.0-20200428191222-c1ffdadc01e1/go.mod h1:OAV6xBmuTLsPZ+epzKkPB1e25FHk/vCtyatkdHcArLs= -github.com/ipld/go-ipld-prime-proto v0.0.0-20200922192210-9a2bfd4440a6/go.mod h1:3pHYooM9Ea65jewRwrb2u5uHZCNkNTe9ABsVB+SrkH0= -github.com/ipld/go-ipld-prime-proto v0.1.0/go.mod h1:11zp8f3sHVgIqtb/c9Kr5ZGqpnCLF1IVTNOez9TopzE= -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/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.4/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= github.com/jackpal/gateway v1.0.5/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= github.com/jackpal/go-nat-pmp v1.0.1/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= -github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jbenet/go-cienv v0.0.0-20150120210510-1bb1476777ec/go.mod h1:rGaEvXB4uRSZMmzKNLoXvTu1sfx+1kv/DojUlPrSZGs= -github.com/jbenet/go-cienv v0.1.0 h1:Vc/s0QbQtoxX8MwwSLWWh+xNNZvM3Lw7NsTcHrvvhMc= github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= -github.com/jbenet/go-random v0.0.0-20190219211222-123a90aedc0c h1:uUx61FiAa1GI6ZmVd2wf2vULeQZIKG66eybjNXKYCz4= github.com/jbenet/go-random v0.0.0-20190219211222-123a90aedc0c/go.mod h1:sdx1xVM9UuLw1tXnhJWN3piypTUO3vCIHYmG15KE/dU= github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2/go.mod h1:8GXXJV31xl8whumTzdZsTt3RnUIiPqzkyf7mxToRCMs= -github.com/jbenet/go-temp-err-catcher v0.1.0 h1:zpb3ZH6wIE8Shj2sKS+khgRvf7T7RABoLk/+KKHggpk= github.com/jbenet/go-temp-err-catcher v0.1.0/go.mod h1:0kJRvmDZXNMIiJirNPEYfhpPwbGVtZVWC34vc5WLsDk= github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY= github.com/jbenet/goprocess v0.1.3/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= -github.com/jbenet/goprocess v0.1.4 h1:DRGOFReOMqqDNXwW70QkacFW0YN9QnwLV0Vqk+3oU0o= github.com/jbenet/goprocess v0.1.4/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jessevdk/go-flags v1.4.0 h1:4IU2WS7AumrZ/40jfhf4QVDMsQwqA7VEHozFRrGARJA= 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= -github.com/jonboulle/clockwork v0.1.1-0.20190114141812-62fb9bc030d1 h1:qBCV/RLV02TSfQa7tFmxTihnG+u+7JXByOkhlkR5rmQ= github.com/jonboulle/clockwork v0.1.1-0.20190114141812-62fb9bc030d1/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= -github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/jsimonetti/rtnetlink v0.0.0-20190606172950-9527aa82566a/go.mod h1:Oz+70psSo5OFh8DBl0Zv2ACw7Esh6pPUphlvZG9x7uw= @@ -936,18 +959,15 @@ github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHm github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= 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= github.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg= github.com/kilic/bls12-381 v0.0.0-20200607163746-32e1441c8a9f/go.mod h1:XXfR6YFCRSrkEXbNlIyDsgXVNJWVUV30m/ebkVy9n6s= github.com/kilic/bls12-381 v0.0.0-20200731194930-64c428e1bff5/go.mod h1:XXfR6YFCRSrkEXbNlIyDsgXVNJWVUV30m/ebkVy9n6s= -github.com/kilic/bls12-381 v0.0.0-20200820230200-6b2c19996391 h1:51kHw7l/dUDdOdW06AlUGT5jnpj6nqQSILebcsikSjA= github.com/kilic/bls12-381 v0.0.0-20200820230200-6b2c19996391/go.mod h1:XXfR6YFCRSrkEXbNlIyDsgXVNJWVUV30m/ebkVy9n6s= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= @@ -956,57 +976,49 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o 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 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= 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.8/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= 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/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= -github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/libp2p/go-addr-util v0.0.1/go.mod h1:4ac6O7n9rIAKB1dnd+s8IbbMXkt+oBpzX4/+RACcnlQ= github.com/libp2p/go-addr-util v0.0.2/go.mod h1:Ecd6Fb3yIuLzq4bD7VcywcVSBtefcAwnUISBM3WG15E= -github.com/libp2p/go-addr-util v0.1.0 h1:acKsntI33w2bTU7tC9a0SaPimJGfSI0bFKC18ChxeVI= 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-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= github.com/libp2p/go-conn-security-multistream v0.0.2/go.mod h1:nc9vud7inQ+d6SO0I/6dSWrdMnHnzZNHeyUQqrAJulE= github.com/libp2p/go-conn-security-multistream v0.1.0/go.mod h1:aw6eD7LOsHEX7+2hJkDxw1MteijaVcI+/eP2/x3J1xc= 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 h1:ft6/POSK7F+vl/2qzegnHDaXFU0iWB4yVTYrioC6Zy0= github.com/libp2p/go-conn-security-multistream v0.2.1/go.mod h1:cR1d8gA0Hr59Fj6NhaTpFhJZrjSYuNmhpT2r25zYR70= github.com/libp2p/go-eventbus v0.0.2/go.mod h1:Hr/yGlwxA/stuLnpMiu82lpNKpvRy3EaJxPu40XYOwk= +github.com/libp2p/go-eventbus v0.0.3/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-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-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.2.1/go.mod h1:HZbtEOrgZN4F1fGZVvkV+930Wx3DkqlpBlO8dIoZWds= +github.com/libp2p/go-libp2p v0.3.0/go.mod h1:J7DPB1+zB5VLc8v/kKSD8+u2cbyIGI0Dh/Pf3Wprt+0= 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.4.2/go.mod h1:MNmgUxUw5pMsdOzMlT0EE7oKjRasl+WyVwM0IBlpKgQ= github.com/libp2p/go-libp2p v0.6.0/go.mod h1:mfKWI7Soz3ABX+XEBR61lGbg+ewyMtJHVt043oWeqwg= 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= @@ -1014,13 +1026,10 @@ github.com/libp2p/go-libp2p v0.7.4/go.mod h1:oXsBlTLF1q7pxr+9w6lqzS1ILpyHsaBPniV github.com/libp2p/go-libp2p v0.8.1/go.mod h1:QRNH9pwdbEBpx5DTJYg+qxcVaDMAz3Ee/qDKwXujH5o= github.com/libp2p/go-libp2p v0.8.3/go.mod h1:EsH1A+8yoWK+L4iKcbPYu6MPluZ+CHWI9El8cTaefiM= github.com/libp2p/go-libp2p v0.9.2/go.mod h1:cunHNLDVus66Ct9iXXcjKRLdmHdFdHVe1TAnbubJQqQ= -github.com/libp2p/go-libp2p v0.10.0/go.mod h1:yBJNpb+mGJdgrwbKAKrhPU0u3ogyNFTfjJ6bdM+Q/G8= 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.15.0 h1:jbMbdmtizfpvl1+oQuGJzfGhttAtuxUCavF3enwFncg= github.com/libp2p/go-libp2p v0.15.0/go.mod h1:8Ljmwon0cZZYKrOCjFeLwQEK8bqR42dOheUZ1kSKhP0= -github.com/libp2p/go-libp2p-asn-util v0.0.0-20200825225859-85005c6cf052 h1:BM7aaOF7RpmNn9+9g6uTjGJ0cTzWr5j9i9IKeun2M8U= 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-autonat v0.0.6/go.mod h1:uZneLdOkZHro35xIhpbtTzLlgYturpu4J5+0cZK3MqE= github.com/libp2p/go-libp2p-autonat v0.1.0/go.mod h1:1tLf2yXxiE/oKGtDwPYWTSYG3PtvYlJmg7NeVtPRqH8= @@ -1030,7 +1039,6 @@ github.com/libp2p/go-libp2p-autonat v0.2.1/go.mod h1:MWtAhV5Ko1l6QBsHQNSuM6b1sRk github.com/libp2p/go-libp2p-autonat v0.2.2/go.mod h1:HsM62HkqZmHR2k1xgX34WuWDzk/nBwNHoeyyT4IWV6A= github.com/libp2p/go-libp2p-autonat v0.2.3/go.mod h1:2U6bNWCNsAG9LEbwccBDQbjzQ8Krdjge1jLTE9rdoMM= github.com/libp2p/go-libp2p-autonat v0.4.0/go.mod h1:YxaJlpr81FhdOv3W3BTconZPfhaYivRdf53g+S2wobk= -github.com/libp2p/go-libp2p-autonat v0.4.2 h1:YMp7StMi2dof+baaxkbxaizXjY1RPvU71CXfxExzcUU= github.com/libp2p/go-libp2p-autonat v0.4.2/go.mod h1:YxaJlpr81FhdOv3W3BTconZPfhaYivRdf53g+S2wobk= 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= @@ -1038,7 +1046,6 @@ github.com/libp2p/go-libp2p-blankhost v0.1.1/go.mod h1:pf2fvdLJPsC1FsVrNP3DUUvMz 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.1.6/go.mod h1:jONCAJqEP+Z8T6EQviGL4JsQcLx1LgTGtVqFNY8EMfQ= -github.com/libp2p/go-libp2p-blankhost v0.2.0 h1:3EsGAi0CBGcZ33GwRuXEYJLLPoVWyXJ1bcJzAJjINkk= github.com/libp2p/go-libp2p-blankhost v0.2.0/go.mod h1:eduNKXGTioTuQAUcZ5epXi9vMl+t4d8ugUBRQ4SqaNQ= 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= @@ -1047,18 +1054,17 @@ 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.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 h1:eqQ3sEYkGTtybWgr6JLqJY6QLtPWRErvFjFDfAOO1wc= github.com/libp2p/go-libp2p-circuit v0.4.0/go.mod h1:t/ktoFIUzM6uLQ+o1G6NuBl2ANhBKN9Bc8jRIk31MoA= +github.com/libp2p/go-libp2p-connmgr v0.1.0/go.mod h1:wZxh8veAmU5qdrfJ0ZBLcU8oJe9L82ciVP/fl1VHjXk= github.com/libp2p/go-libp2p-connmgr v0.1.1/go.mod h1:wZxh8veAmU5qdrfJ0ZBLcU8oJe9L82ciVP/fl1VHjXk= github.com/libp2p/go-libp2p-connmgr v0.2.3/go.mod h1:Gqjg29zI8CwXX21zRxy6gOg8VYu3zVerJRt2KyktzH4= -github.com/libp2p/go-libp2p-connmgr v0.2.4 h1:TMS0vc0TCBomtQJyWr7fYxcVYYhx+q/2gF++G5Jkl/w= github.com/libp2p/go-libp2p-connmgr v0.2.4/go.mod h1:YV0b/RIm8NGPnnNWM7hG9Q38OeQiQfKhHCCs1++ufn0= github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= 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.0.9/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= @@ -1083,7 +1089,6 @@ github.com/libp2p/go-libp2p-core v0.8.1/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJB github.com/libp2p/go-libp2p-core v0.8.2/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= github.com/libp2p/go-libp2p-core v0.8.5/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= github.com/libp2p/go-libp2p-core v0.8.6/go.mod h1:dgHr0l0hIKfWpGpqAMbpo19pen9wJfdCGv51mTmdpmM= -github.com/libp2p/go-libp2p-core v0.9.0 h1:t97Mv0LIBZlP2FXVRNKKVzHJCIjbIWGxYptGId4+htU= github.com/libp2p/go-libp2p-core v0.9.0/go.mod h1:ESsbz31oC3C1AvMJoGx26RTuCkNhmkSRCqZ0kQtJ2/8= 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= @@ -1095,7 +1100,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.4.0/go.mod h1:bZ0aJSrFc/eX2llP0ryhb1kpgkPyTo23SJ5b7UQCMh4= github.com/libp2p/go-libp2p-discovery v0.5.0/go.mod h1:+srtPIU9gDaBNu//UHvcdliKBIcr4SfDcm0/PfPJLug= -github.com/libp2p/go-libp2p-discovery v0.5.1 h1:CJylx+h2+4+s68GvrM4pGNyfNhOYviWBPtVv5PA7sfo= github.com/libp2p/go-libp2p-discovery v0.5.1/go.mod h1:+srtPIU9gDaBNu//UHvcdliKBIcr4SfDcm0/PfPJLug= 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= @@ -1103,15 +1107,14 @@ 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.1.1/go.mod h1:1kj2Rk5pX3/0RwqMm9AMNCT7DzcMHYhgDN5VTi+cY0M= github.com/libp2p/go-libp2p-kad-dht v0.2.1/go.mod h1:k7ONOlup7HKzQ68dE6lSnp07cdxdkmnRa+6B4Fh9/w0= -github.com/libp2p/go-libp2p-kad-dht v0.13.0 h1:qBNYzee8BVS6RkD8ukIAGRG6LmVz8+kkeponyI7W+yA= github.com/libp2p/go-libp2p-kad-dht v0.13.0/go.mod h1:NkGf28RNhPrcsGYWJHm6EH8ULkiJ2qxsWmpE7VTL3LI= +github.com/libp2p/go-libp2p-kbucket v0.2.0/go.mod h1:JNymBToym3QXKBMKGy3m29+xprg0EVr/GJFHxFEdgh8= 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= 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= @@ -1120,20 +1123,16 @@ github.com/libp2p/go-libp2p-mplex v0.2.1/go.mod h1:SC99Rxs8Vuzrf/6WhmH41kNn13TiY 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.4.0/go.mod h1:yCyWJE2sc6TBTnFpjvLuEJgTSw/u+MamvzILKdX7asw= -github.com/libp2p/go-libp2p-mplex v0.4.1 h1:/pyhkP1nLwjG3OM+VuaNJkQT/Pqq73WzB3aDN3Fx1sc= github.com/libp2p/go-libp2p-mplex v0.4.1/go.mod h1:cmy+3GfqfM1PceHTLL7zQzAAYaryDu6iPSC+CIb094g= 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 h1:wMWis3kYynCbHoyKLPBEMu4YRLltbm8Mk08HGSfvTkU= github.com/libp2p/go-libp2p-nat v0.0.6/go.mod h1:iV59LVhB3IkFvS6S6sauVTSOrNEANnINbI/fkaLimiw= 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-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.2.2 h1:MRt5XGfYziDXIUy2udtMWfPmzZqUDYoC1FZoKnqPzwk= github.com/libp2p/go-libp2p-noise v0.2.2/go.mod h1:IEbYhBBzGyvdLBoxxULL/SGbJARhUeqlO8lVSREYu2Q= github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo= github.com/libp2p/go-libp2p-peer v0.1.1/go.mod h1:jkF12jGB4Gk/IOo+yomm+7oLWxF278F7UnrYUQ1Q8es= @@ -1141,6 +1140,7 @@ github.com/libp2p/go-libp2p-peer v0.2.0/go.mod h1:RCffaCvUyW2CJmG2gAWVqwePwW7JMg github.com/libp2p/go-libp2p-peerstore v0.0.1/go.mod h1:RabLyPVJLuNQ+GFyoEkfi8H4Ti6k/HtZJ7YKgtSq+20= github.com/libp2p/go-libp2p-peerstore v0.0.6/go.mod h1:RabLyPVJLuNQ+GFyoEkfi8H4Ti6k/HtZJ7YKgtSq+20= github.com/libp2p/go-libp2p-peerstore v0.1.0/go.mod h1:2CeHkQsr8svp4fZ+Oi9ykN1HBb6u0MOvdJ7YIsmcwtY= +github.com/libp2p/go-libp2p-peerstore v0.1.2/go.mod h1:BJ9sHlm59/80oSkpWgr1MyY1ciXAXV397W6h1GH/uKI= github.com/libp2p/go-libp2p-peerstore v0.1.3/go.mod h1:BJ9sHlm59/80oSkpWgr1MyY1ciXAXV397W6h1GH/uKI= github.com/libp2p/go-libp2p-peerstore v0.1.4/go.mod h1:+4BDbDiiKf4PzpANZDAT+knVdLxvqh7hXOujessqdzs= github.com/libp2p/go-libp2p-peerstore v0.2.0/go.mod h1:N2l3eVIeAitSg3Pi2ipSrJYnqhVnMNQZo9nkSCuAbnQ= @@ -1151,48 +1151,44 @@ github.com/libp2p/go-libp2p-peerstore v0.2.4/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuD github.com/libp2p/go-libp2p-peerstore v0.2.6/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= github.com/libp2p/go-libp2p-peerstore v0.2.7/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= github.com/libp2p/go-libp2p-peerstore v0.2.8/go.mod h1:gGiPlXdz7mIHd2vfAsHzBNAMqSDkt2UBFwgcITgw1lA= -github.com/libp2p/go-libp2p-peerstore v0.3.0 h1:wp/G0+37+GLr7tu+wE+4GWNrA3uxKg6IPRigIMSS5oQ= -github.com/libp2p/go-libp2p-peerstore v0.3.0/go.mod h1:fNX9WlOENMvdx/YD7YO/5Hkrn8+lQIk5A39BHa1HIrM= -github.com/libp2p/go-libp2p-pnet v0.2.0 h1:J6htxttBipJujEjz1y0a5+eYoiPcFHhSYHH6na5f0/k= +github.com/libp2p/go-libp2p-peerstore v0.4.0/go.mod h1:rDJUFyzEWPpXpEwywkcTYYzDHlwza8riYMaUzaN6hX0= 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.2.6/go.mod h1:5jEp7R3ItQ0pgcEMrPZYE9DQTg/H3CTc7Mu1j2G4Y5o= github.com/libp2p/go-libp2p-pubsub v0.3.2-0.20200527132641-c0712c6e92cf/go.mod h1:TxPOBuo1FPdsTjFnv+FGZbNbWYsp74Culx+4ViQpato= -github.com/libp2p/go-libp2p-pubsub v0.5.6 h1:YkO3gG9J1mQBEMRrM5obiG3JD0L8RcrzIpoeLeiYqH8= github.com/libp2p/go-libp2p-pubsub v0.5.6/go.mod h1:gVOzwebXVdSMDQBTfH8ACO5EJ4SQrvsHqCmYsCZpD0E= github.com/libp2p/go-libp2p-quic-transport v0.1.1/go.mod h1:wqG/jzhF3Pu2NrhJEvE+IE0NTHNXslOPn9JQzyCAxzU= -github.com/libp2p/go-libp2p-quic-transport v0.5.0/go.mod h1:IEcuC5MLxvZ5KuHKjRu+dr3LjCT1Be3rcD/4d8JrX8M= github.com/libp2p/go-libp2p-quic-transport v0.10.0/go.mod h1:RfJbZ8IqXIhxBRm5hqUEJqjiiY8xmEuq3HUDS993MkA= -github.com/libp2p/go-libp2p-quic-transport v0.11.2 h1:p1YQDZRHH4Cv2LPtHubqlQ9ggz4CKng/REZuXZbZMhM= github.com/libp2p/go-libp2p-quic-transport v0.11.2/go.mod h1:wlanzKtIh6pHrq+0U3p3DY9PJfGqxMgPaGKaK5LifwQ= 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-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.1.0/go.mod h1:oUs0h39vNwYtYXnQWOTU5BaafbedSyWCCal3gqHuoOQ= 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= github.com/libp2p/go-libp2p-secio v0.1.0/go.mod h1:tMJo2w7h3+wN4pgU2LSYeiKPrfqBgkOsdiKK77hE7c8= +github.com/libp2p/go-libp2p-secio v0.1.1/go.mod h1:tMJo2w7h3+wN4pgU2LSYeiKPrfqBgkOsdiKK77hE7c8= github.com/libp2p/go-libp2p-secio v0.2.0/go.mod h1:2JdZepB8J5V9mBp79BmwsaPQhRPNN2NrnB2lKQcdy6g= github.com/libp2p/go-libp2p-secio v0.2.1/go.mod h1:cWtZpILJqkqrSkiYcDBh5lA3wbT2Q+hz3rJQq3iftD8= 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.1.1/go.mod h1:4NVJaLwq/dr5kEq79Jo6pMin7ZFwLx73ln1FTefR91Q= +github.com/libp2p/go-libp2p-swarm v0.2.0/go.mod h1:x07b4zkMFo2EvgPV2bMTlNmdQc8i+74Jjio7xGvsTgU= 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.4/go.mod h1:/xIpHFPPh3wmSthtxdGbkHZ0OET1h/GGZes8Wku/M5Y= -github.com/libp2p/go-libp2p-swarm v0.2.7/go.mod h1:ZSJ0Q+oq/B1JgfPHJAT2HTall+xYRNYp1xs4S2FBWKA= 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.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 h1:hsYaD/y6+kZff1o1Mc56NcuwSg80lIphTS/zDk3mO4M= github.com/libp2p/go-libp2p-swarm v0.5.3/go.mod h1:NBn7eNW2lu568L7Ns9wdFrOhgRlkRnIDg0FLKbuu3i8= 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= @@ -1203,12 +1199,12 @@ github.com/libp2p/go-libp2p-testing v0.1.1/go.mod h1:xaZWMJrPUM5GlDBxCeGUi7kI4eq github.com/libp2p/go-libp2p-testing v0.1.2-0.20200422005655-8775583591d8/go.mod h1:Qy8sAncLKpwXtS2dSnDOP8ktexIAHKu+J+pnZOFZLTc= github.com/libp2p/go-libp2p-testing v0.3.0/go.mod h1:efZkql4UZ7OVsEfaxNHZPzIehtsBXMrXnCfJIgDti5g= github.com/libp2p/go-libp2p-testing v0.4.0/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotlKsNSbKQ/lImlOWF0= -github.com/libp2p/go-libp2p-testing v0.4.2 h1:IOiA5mMigi+eEjf4J+B7fepDhsjtsoWA9QbsCqbNp5U= github.com/libp2p/go-libp2p-testing v0.4.2/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotlKsNSbKQ/lImlOWF0= +github.com/libp2p/go-libp2p-tls v0.1.0/go.mod h1:VZdoSWQDeNpIIAFJFv+6uqTqpnIIDHcqZQSTC/A1TT0= github.com/libp2p/go-libp2p-tls v0.1.3/go.mod h1:wZfuewxOndz5RTnCAxFliGjvYSDA40sKitV4c50uI1M= -github.com/libp2p/go-libp2p-tls v0.2.0 h1:N8i5wPiHudA+02sfW85R2nUbybPm7agjAywZc6pd3xA= github.com/libp2p/go-libp2p-tls v0.2.0/go.mod h1:twrp2Ci4lE2GYspA1AnlYm+boYjqVruxDKJJj7s6xrc= github.com/libp2p/go-libp2p-transport v0.0.1/go.mod h1:UzbUs9X+PHOSw7S3ZmeOxfnwaQY5vGDzZmKPod3N3tk= +github.com/libp2p/go-libp2p-transport v0.0.4/go.mod h1:StoY3sx6IqsP6XKoabsPnHCwqKXWUMWU7Rfcsubee/A= github.com/libp2p/go-libp2p-transport v0.0.5/go.mod h1:StoY3sx6IqsP6XKoabsPnHCwqKXWUMWU7Rfcsubee/A= github.com/libp2p/go-libp2p-transport-upgrader v0.0.4/go.mod h1:RGq+tupk+oj7PzL2kn/m1w6YXxcIAYJYeI90h6BGgUc= github.com/libp2p/go-libp2p-transport-upgrader v0.1.1/go.mod h1:IEtA6or8JUbsV07qPW4r01GnTenLW4oi3lOPbUMGJJA= @@ -1217,7 +1213,6 @@ github.com/libp2p/go-libp2p-transport-upgrader v0.3.0/go.mod h1:i+SKzbRnvXdVbU3D 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 h1:SHt3g0FslnqIkEWF25YOB8UCOCTpGAVvHRWQYJ+veiI= github.com/libp2p/go-libp2p-transport-upgrader v0.4.6/go.mod h1:JE0WQuQdy+uLZ5zOaI3Nw9dWGYJIA7mywEtP2lMvnyk= github.com/libp2p/go-libp2p-xor v0.0.0-20210714161855-5c005aca55db/go.mod h1:LSTM5yRnjGZbWNTA/hRwq2gGFrvRIbQJscoIL/u6InY= github.com/libp2p/go-libp2p-yamux v0.1.2/go.mod h1:xUoV/RmYkg6BW/qGxA9XJyg+HzXFYkeXbnhjmnYzKp8= @@ -1231,13 +1226,10 @@ github.com/libp2p/go-libp2p-yamux v0.2.8/go.mod h1:/t6tDqeuZf0INZMTgd0WxIRbtK2Ez 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 h1:/UOPtT/6DHPtr3TtKXBHa6g0Le0szYuI33Xc/Xpd7fQ= github.com/libp2p/go-libp2p-yamux v0.5.4/go.mod h1:tfrXbyaTqqSU654GTvK3ocnSZL3BuHoeTSqhcel1wsE= 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= -github.com/libp2p/go-maddr-filter v0.1.0 h1:4ACqZKw8AqiuJfwFGq1CYDFugfXTOos+qQ3DETkhtCE= github.com/libp2p/go-maddr-filter v0.1.0/go.mod h1:VzZhTXkMucEGGEOSKddrwGiOv0tUhgnKqNEmIAz/bPU= github.com/libp2p/go-mplex v0.0.3/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= github.com/libp2p/go-mplex v0.0.4/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= @@ -1245,54 +1237,45 @@ github.com/libp2p/go-mplex v0.1.0/go.mod h1:SXgmdki2kwCUlCCbfGLEgHjC4pFqhTp0ZoV6 github.com/libp2p/go-mplex v0.1.1/go.mod h1:Xgz2RDCi3co0LeZfgjm4OgUF15+sVR8SRcu3SFXI1lk= 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 h1:U1T+vmCYJaEoDJPV1aq31N56hS+lJgb397GsylNSgrU= github.com/libp2p/go-mplex v0.3.0/go.mod h1:0Oy/A9PQlwBytDRp4wSkFnzHYDKcpLot35JQ6msjvYQ= 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= -github.com/libp2p/go-msgio v0.0.6 h1:lQ7Uc0kS1wb1EfRxO2Eir/RJoHkHn7t6o+EiwsYIKJA= github.com/libp2p/go-msgio v0.0.6/go.mod h1:4ecVB6d9f4BDSL5fqvPiC4A3KivjWn+Venn/1ALLMWA= github.com/libp2p/go-nat v0.0.3/go.mod h1:88nUEt0k0JD45Bk93NIwDqjlhiOwOoV36GchpcVc1yI= github.com/libp2p/go-nat v0.0.4/go.mod h1:Nmw50VAvKuk38jUBcmNh6p9lUJLoODbJRvYAa/+KSDo= -github.com/libp2p/go-nat v0.0.5 h1:qxnwkco8RLKqVh1NmjQ+tJ8p8khNLFxuElYG/TwqW4Q= github.com/libp2p/go-nat v0.0.5/go.mod h1:B7NxsVNPZmRLvMOwiEO1scOSyjA56zxYAGv1yQgRkEU= github.com/libp2p/go-netroute v0.1.2/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk= github.com/libp2p/go-netroute v0.1.3/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk= github.com/libp2p/go-netroute v0.1.5/go.mod h1:V1SR3AaECRkEQCoFFzYwVYWvYIEtlxx89+O3qcpCl4A= -github.com/libp2p/go-netroute v0.1.6 h1:ruPJStbYyXVYGQ81uzEDzuvbYRLKRrLvTYd33yomC38= github.com/libp2p/go-netroute v0.1.6/go.mod h1:AqhkMh0VuWmfgtxKPp3Oc1LdU5QSWS7wl0QLhSZqXxQ= github.com/libp2p/go-openssl v0.0.2/go.mod h1:v8Zw2ijCSWBQi8Pq5GAixw6DbFfa9u6VIYDXnvOXkc0= 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-reuseport v0.0.1/go.mod h1:jn6RmB1ufnQwl0Q1f+YxAj8isJgDCQzaaxIFYDhcYEA= -github.com/libp2p/go-reuseport v0.0.2 h1:XSG94b1FJfGA01BUrT82imejHQyTxO4jEWqheyCXYvU= github.com/libp2p/go-reuseport v0.0.2/go.mod h1:SPD+5RwGC7rcnzngoYC86GjPzjSywuQyMVAheVBD9nQ= github.com/libp2p/go-reuseport-transport v0.0.2/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs= github.com/libp2p/go-reuseport-transport v0.0.3/go.mod h1:Spv+MPft1exxARzP2Sruj2Wb5JSyHNncjf1Oi2dEbzM= github.com/libp2p/go-reuseport-transport v0.0.4/go.mod h1:trPa7r/7TJK/d+0hdBLOCGvpQQVOU74OXbNCIMkufGw= -github.com/libp2p/go-reuseport-transport v0.0.5 h1:lJzi+vSYbyJj2faPKLxNGWEIBcaV/uJmyvsUxXy2mLw= github.com/libp2p/go-reuseport-transport v0.0.5/go.mod h1:TC62hhPc8qs5c/RoXDZG6YmjK+/YWUPC0yYmeUecbjc= 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 h1:yD80l2ZOdGksnOyHrhxDdTDFrf7Oy+v3FMVArIRgZxQ= github.com/libp2p/go-sockaddr v0.1.1/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= 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= 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 h1:TqnSHPJEIqDEO7h1wZZ0p3DXdvDSiLHQidKKUGZtiOY= github.com/libp2p/go-stream-muxer-multistream v0.3.0/go.mod h1:yDh8abSIzmZtqtOt64gFJUXEryejzNb0lisTt+fAMJA= 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.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= -github.com/libp2p/go-tcp-transport v0.2.8 h1:aLjX+Nkz+kIz3uA56WtlGKRSAnKDvnqKmv1qF4EyyE4= github.com/libp2p/go-tcp-transport v0.2.8/go.mod h1:64rSfVidkYPLqbzpcN2IwHY4pmgirp67h++hZ/rcndQ= 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= @@ -1303,7 +1286,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.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 h1:cO6x4P0v6PfxbKnxmf5cY2Ny4OPDGYkUqNvZzp/zdlo= github.com/libp2p/go-ws-transport v0.5.0/go.mod h1:I2juo1dNTbl8BKSBYo98XY85kU2xds1iamArLvl8kNg= 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= @@ -1314,26 +1296,19 @@ github.com/libp2p/go-yamux v1.3.5/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZ github.com/libp2p/go-yamux v1.3.6/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 h1:RwtpYZ2/wVviZ5+3pjC8qdQ4TKnrak0/E01N1UWoAFU= github.com/libp2p/go-yamux/v2 v2.2.0/go.mod h1:3So6P6TV6r75R9jiBpiIKgU/66lOarCZjqROGxzPpPQ= github.com/libp2p/zeroconf/v2 v2.0.0/go.mod h1:J85R/d9joD8u8F9aHM8pBXygtG9W02enEwS+wWeL6yo= 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.16.0/go.mod h1:I0+fcNTdb9eS1ZcjQZbDVPGchJ86chcIxPALn9lEJqE= github.com/lucas-clemente/quic-go v0.19.3/go.mod h1:ADXpNbTQjq1hIzCpB+y/k5iz4n4z4IwqoLb94Kh5Hu8= -github.com/lucas-clemente/quic-go v0.21.2 h1:8LqqL7nBQFDUINadW0fHV/xSaCQJgmJC0Gv+qUnjd78= github.com/lucas-clemente/quic-go v0.21.2/go.mod h1:vF5M1XqhBAHgbjKcJOXY3JZz3GP0T3FQhz/uyOUS38Q= -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= github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= -github.com/magefile/mage v1.9.0 h1:t3AU2wNwehMCW97vuqQLtw6puppWXHO+O2MHo5a50XE= github.com/magefile/mage v1.9.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= @@ -1341,22 +1316,15 @@ github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= 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/marten-seemann/qpack v0.1.0/go.mod h1:LFt1NU/Ptjip0C2CPkhimBz5CGE3WGDAUWqna+CNTrI= 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.9.1/go.mod h1:T1MmAdDPyISzxlK6kjRr0pcZFBVd1OZbBb/j3cvzHhk= 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= -github.com/marten-seemann/qtls-go1-15 v0.1.5 h1:Ci4EIUN6Rlb+D6GmLdej/bCQ4nPYNtVXQB+xjiXE1nk= github.com/marten-seemann/qtls-go1-15 v0.1.5/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= -github.com/marten-seemann/qtls-go1-16 v0.1.4 h1:xbHbOGGhrenVtII6Co8akhLEdrawwB2iHl5yhJRpnco= github.com/marten-seemann/qtls-go1-16 v0.1.4/go.mod h1:gNpI2Ol+lRS3WwSOtIUUtRwZEQMXjYK+dQSBFbethAk= -github.com/marten-seemann/qtls-go1-17 v0.1.0-rc.1 h1:/rpmWuGvceLwwWuaKPdjpR4JJEUH0tq64/I3hvzaNLM= github.com/marten-seemann/qtls-go1-17 v0.1.0-rc.1/go.mod h1:fz4HIxByo+LlWcreM4CZOYNuz3taBQ8rN2X6FqvaWo8= -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= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= @@ -1364,24 +1332,21 @@ github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVc 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.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= 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.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= github.com/mattn/go-xmlrpc v0.0.3/go.mod h1:mqc2dz7tP5x5BKlCahN/n+hs7OSZKJkS9JsHNBRlrxA= -github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/mdlayher/genetlink v1.0.0/go.mod h1:0rJ0h4itni50A86M2kHcgS85ttZazNt7a8H2a2cw0Gc= github.com/mdlayher/netlink v0.0.0-20190409211403-11939a169225/go.mod h1:eQB3mZE4aiYnlUsyGGCOpPETfdQq4Jhsgf1fk3cwQaA= @@ -1397,15 +1362,10 @@ github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKju 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 h1:JKfpVSCB84vrAmHzyrsxB5NAr5kLoMXZArPSw7Qlgyg= github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= -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= github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b/go.mod h1:lxPUiZwKoFL8DUUmalo2yJJUCxbPKtm8OKfqr2/FTNU= -github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc h1:PTfri+PuQmWDqERdnNMiD9ZejrlswWrCpBEZgWOiTrc= 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= @@ -1414,12 +1374,10 @@ github.com/minio/sha256-simd v0.0.0-20190328051042-05b4dd3047e5/go.mod h1:2FMWW+ github.com/minio/sha256-simd v0.1.0/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= github.com/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= -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= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= @@ -1436,12 +1394,9 @@ github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVq 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= github.com/mr-tron/base58 v1.1.3/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= -github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= -github.com/multiformats/go-base32 v0.0.4 h1:+qMh4a2f37b4xTNs6mqitDinryCI+tfO2dRVMN9mjSE= github.com/multiformats/go-base32 v0.0.4/go.mod h1:jNLFzjPZtp3aIARHbJRZIaPuspdH0J6q39uUM5pnABM= -github.com/multiformats/go-base36 v0.1.0 h1:JR6TyF7JjGd3m6FbLU2cOxhC0Li8z8dLNGQ89tUg4F4= github.com/multiformats/go-base36 v0.1.0/go.mod h1:kFGE83c6s80PklsHO9sRn2NCoffoRdUUOENyW/Vv6sM= github.com/multiformats/go-multiaddr v0.0.1/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= github.com/multiformats/go-multiaddr v0.0.2/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= @@ -1455,17 +1410,14 @@ 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 h1:Pq37uLx3hsyNlTDir7FZyU8+cFCTqd5y1KiM2IzOutI= github.com/multiformats/go-multiaddr v0.4.1/go.mod h1:3afI9HfVW8csiF8UZqtpYRiDyew8pRX7qLIGHu9FLuM= 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.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= -github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/eQsuaL3/CWe167E= github.com/multiformats/go-multiaddr-fmt v0.1.0/go.mod h1:hGtDIW4PU4BqJ50gW2quDuPVjyWNZxToGUh/HwTZYJo= github.com/multiformats/go-multiaddr-net v0.0.1/go.mod h1:nw6HSxNmCIQH27XPGBuX+d1tnvM7ihcFwHMSstNAVUU= github.com/multiformats/go-multiaddr-net v0.1.0/go.mod h1:5JNbcfBOP4dnhoZOv10JJVkJO0pCCEf8mTnipAo2UZQ= @@ -1477,7 +1429,6 @@ 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-multicodec v0.2.0/go.mod h1:/y4YVwkfMyry5kFbMTbLJKErhycTIftytRV+llXdyS4= github.com/multiformats/go-multicodec v0.2.1-0.20210713081508-b421db6850ae/go.mod h1:qGGaQmioCDh+TeFOnxrbU0DaIPw8yFgAZgFG0V7p1qQ= @@ -1487,13 +1438,13 @@ github.com/multiformats/go-multicodec v0.3.1-0.20210902112759-1539a079fd61 h1:Zr github.com/multiformats/go-multicodec v0.3.1-0.20210902112759-1539a079fd61/go.mod h1:1Hj/eHRaVWSXiSNNfcEPcwZleTmdNP81xlxDLnWU9GQ= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po= +github.com/multiformats/go-multihash v0.0.6/go.mod h1:XuKXPp8VHcTygube3OWZC+aZrA+H1IhmjoCDtJc7PXM= github.com/multiformats/go-multihash v0.0.8/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= github.com/multiformats/go-multihash v0.0.9/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= github.com/multiformats/go-multihash v0.0.10/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= 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 h1:D2qsyy1WVculJbGv69pWmQ36ehxFoA5NiIUr1OEs6qI= github.com/multiformats/go-multihash v0.0.16/go.mod h1:zhfEIgVnB/rPMfxgFw15ZmGoNaKyNUIE4IWHG/kC+Ag= 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= @@ -1501,12 +1452,10 @@ github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wS 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 h1:TCYu1BHTDr1F/Qm75qwYISQdzGcRdC21nFgQW7l7GBo= github.com/multiformats/go-multistream v0.2.2/go.mod h1:UIcnm7Zuo8HKG+HkWgfQsGL+/MIEhyTqbODbIUwSXKs= github.com/multiformats/go-varint v0.0.1/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= github.com/multiformats/go-varint v0.0.2/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= github.com/multiformats/go-varint v0.0.5/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= -github.com/multiformats/go-varint v0.0.6 h1:gk85QWKxh3TazbLxED/NlDVv8+q+ReFJk7Y2W/KhfNY= github.com/multiformats/go-varint v0.0.6/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= @@ -1527,12 +1476,10 @@ github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJE 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= +github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229/go.mod h1:0aYXnNPJ8l7uZxf45rWW1a/uME32OF0rhiYGNQ2oF2E= github.com/nkovacs/streamquote v1.0.0/go.mod h1:BN+NaZ2CmdKqUuTUXUEm9j95B2TRbpOWpxbJYzzgUsc= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= @@ -1540,38 +1487,31 @@ github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:v github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.9.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= -github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.6.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= 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/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= github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opentracing-contrib/go-grpc v0.0.0-20180928155321-4b5a12d3ff02/go.mod h1:JNdpVEzCpXBgIiv4ds+TzhN1hrtxq6ClLrTlT9OQRSc= -github.com/opentracing-contrib/go-grpc v0.0.0-20191001143057-db30781987df h1:vdYtBU6zvL7v+Tr+0xFM/qhahw/EvY8DMMunZHKH6eE= github.com/opentracing-contrib/go-grpc v0.0.0-20191001143057-db30781987df/go.mod h1:DYR5Eij8rJl8h7gblRrOZ8g0kW1umSpKqYIBTgeDtLo= github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= github.com/opentracing-contrib/go-stdlib v0.0.0-20190519235532-cf7a6c988dc9/go.mod h1:PLldrQSroqzH70Xl+1DQcGnefIbqsKR7UDaiux3zV+w= -github.com/opentracing-contrib/go-stdlib v1.0.0 h1:TBS7YuVotp8myLon4Pv7BtCBzOTo1DeZCld0Z63mW2w= github.com/opentracing-contrib/go-stdlib v1.0.0/go.mod h1:qtI1ogk+2JhVPIXVc6q+NHziSmy2W5GbdQZFUHADCBU= github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= @@ -1579,6 +1519,9 @@ github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJ 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/otiai10/copy v1.0.2/go.mod h1:c7RpqBkwMom4bYTSkLSym4VSJz/XtncWRAj/J4PEIMY= +github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= +github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo= 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= @@ -1586,22 +1529,18 @@ github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtP 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/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= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/polydawn/refmt v0.0.0-20190221155625-df39d6c2d992/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= github.com/polydawn/refmt v0.0.0-20190408063855-01bf1e26dd14/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= github.com/polydawn/refmt v0.0.0-20190807091052-3d65705ee9f1/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= github.com/polydawn/refmt v0.0.0-20190809202753-05966cbd336a/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= -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= @@ -1618,14 +1557,12 @@ github.com/prometheus/client_golang v1.6.0/go.mod h1:ZLOG9ck3JLRdB5MgO8f+lLTe83A 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= github.com/prometheus/client_golang v1.10.0/go.mod h1:WJM3cc3yu7XKBKa/I8WeZm+V3eltZnBwfENSU7mdogU= -github.com/prometheus/client_golang v1.11.0 h1:HNkLOAEQMIDv/K+04rukrLx6ch7msSRwf3/SASFAGtQ= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= @@ -1639,7 +1576,6 @@ github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16 github.com/prometheus/common v0.18.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/common v0.28.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.30.0 h1:JEkYlQnpzrzQFxi6gnukFPdQ+ac82oRhzMcIduJu/Ug= github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= 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= @@ -1655,39 +1591,28 @@ github.com/prometheus/procfs v0.1.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4O 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/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= github.com/raulk/clock v1.1.0/go.mod h1:3MpVxdZ/ODBQDxbN+kzshf5OSZwPjtMDx6BBXBmOeY0= -github.com/raulk/go-watchdog v1.0.1 h1:qgm3DIJAeb+2byneLrQJ7kvmDLGxN2vy3apXyGaDKN4= github.com/raulk/go-watchdog v1.0.1/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 h1:OdAsTTz6OkFY5QxjkYwrChwuRruF69c169dPK26NUlk= 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= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -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 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/rwcarlsen/goexif v0.0.0-20190401172101-9e8deecbddbd/go.mod h1:hPqNNc0+uJM6H+SuU8sEs5K5IQeKccPqeSjfgcKGgPk= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/sercand/kuberesolver v2.1.0+incompatible/go.mod h1:lWF3GL0xptCB/vCiJPl/ZshwPsX/n4Y7u0CW9E7aQIQ= -github.com/sercand/kuberesolver v2.4.0+incompatible h1:WE2OlRf6wjLxHwNkkFLQGaZcVLEXjMjBPjjEU5vksH8= github.com/sercand/kuberesolver v2.4.0+incompatible/go.mod h1:lWF3GL0xptCB/vCiJPl/ZshwPsX/n4Y7u0CW9E7aQIQ= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/shirou/gopsutil v2.18.12+incompatible h1:1eaJvGomDnH74/5cF4CTmTbLHAriGFsTZppLXDX93OM= github.com/shirou/gopsutil v2.18.12+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shurcooL/component v0.0.0-20170202220835-f88ec8f54cc4/go.mod h1:XhFIlyj5a1fBNx5aJTbKoIq0mNaPvOagO+HjB3EtxrY= github.com/shurcooL/events v0.0.0-20181021180414-410e4ca65f48/go.mod h1:5u70Mqkb5O5cxEA8nxTsgrgLehJeAw6Oc4Ab1c/P1HM= @@ -1709,7 +1634,6 @@ github.com/shurcooL/notifications v0.0.0-20181007000457-627ab5aea122/go.mod h1:b github.com/shurcooL/octicon v0.0.0-20181028054416-fa4f57f9efb2/go.mod h1:eWdoE5JD4R5UVWDucdOPg1g2fqQRq78IQa9zlOV1vpQ= github.com/shurcooL/reactions v0.0.0-20181006231557-f2e0b4ca5b82/go.mod h1:TCR1lToEk4d2s07G3XGfz2QrgHXg4RJBvjrOozvoWfk= github.com/shurcooL/sanitized_anchor_name v0.0.0-20170918181015-86672fcb3f95/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/shurcooL/users v0.0.0-20180125191416-49c67e49c537/go.mod h1:QJTqeLYEDaXHZDBsXlPCDqdhQuJkuw4NOtaxYe3xii4= github.com/shurcooL/webdavfs v0.0.0-20170829043945-18c3829fa133/go.mod h1:hKmq5kWdCj2z2KEozexVbfEZIWiTjhE0+UjmZgPqehw= @@ -1718,16 +1642,14 @@ github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPx github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/assertions v1.0.0/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= -github.com/smartystreets/assertions v1.0.1 h1:voD4ITNjPL5jjBfgR/r8fPIIBrliWrWHeiJApdr3r4w= github.com/smartystreets/assertions v1.0.1/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= github.com/smartystreets/goconvey v0.0.0-20190222223459-a17d461953aa/go.mod h1:2RVY1rIf+2J2o/IM9+vPq9RzmHDSseB7FoXiSNIUsoU= github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/smartystreets/goconvey v0.0.0-20190710185942-9d28bd7c0945/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/smola/gocompat v0.2.0/go.mod h1:1B0MlxbmoZNo3h8guHp8HztB3BSYR5itql9qtVc0ypY= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= @@ -1736,10 +1658,8 @@ github.com/soundcloud/go-runit v0.0.0-20150630195641-06ad41a06c4a/go.mod h1:LeFC github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE= github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA= github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0= -github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 h1:RC6RW7j+1+HkWaX/Yh71Ee5ZHaHYt7ZP4sQgUrm6cDU= github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= @@ -1755,7 +1675,6 @@ github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3 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/streadway/quantile v0.0.0-20150917103942-b0c588724d25 h1:7z3LSn867ex6VSaahyKadf4WtSsJIgne6A1WLOAGM8A= github.com/streadway/quantile v0.0.0-20150917103942-b0c588724d25/go.mod h1:lbP8tGiBjZ5YWIc2fzuRpTaz0b/53vT6PEs3QuAWzuU= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A= @@ -1765,63 +1684,50 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV github.com/stretchr/testify v1.3.1-0.20190311161405-34c6fa2dc709/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -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 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFdE= github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= 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= github.com/tidwall/gjson v1.6.0/go.mod h1:P256ACg0Mn+j1RXIDXoss50DeIABTYK1PULOJHhxOls= -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 h1:lhdWZsvImxvZ3q1C5OIB7d72DuOwP4O2NdBg9PyzNds= 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/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= github.com/uber/jaeger-client-go v2.25.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/uber/jaeger-lib v1.5.1-0.20181102163054-1fc5c315e03c/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= -github.com/uber/jaeger-lib v2.2.0+incompatible h1:MxZXOiR2JuoANZ3J6DE/U0kSFv/eJ/GfSYVCjK7dyaw= github.com/uber/jaeger-lib v2.2.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= 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 h1:JTTnM6wKzdA0Jqodd966MVj4vWbbquZykeX1sKbe2C4= github.com/urfave/cli/v2 v2.2.0/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= -github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasttemplate v1.0.1 h1:tY9CJiPnMXf1ERmG2EyK7gNUd+c6RKGD0IfU8WdUSz8= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU= 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 h1:Q81c4u7hT+BR5kNfNQhEF0VT2pmL7+Kk0wD+ORYl7iA= github.com/warpfork/go-testmark v0.3.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= github.com/warpfork/go-wish v0.0.0-20200122115046-b9ea61034e4a/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= -github.com/weaveworks/common v0.0.0-20200512154658-384f10054ec5 h1:EYxr08r8x6r/5fLEAMMkida1BVgxVXE4LfZv/XV+znU= 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= github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11/go.mod h1:Wlo/SzPmxVp6vXpGt/zaXhHH0fn4IxgqZc82aKg6bpQ= +github.com/whyrusleeping/cbor-gen v0.0.0-20190910031516-c1cbffdb01bb/go.mod h1:xdlJQaiqipF0HW+Mzpg7XRM3fWbGvfgFlcppuvlkIvY= +github.com/whyrusleeping/cbor-gen v0.0.0-20190917003517-d78d67427694/go.mod h1:xdlJQaiqipF0HW+Mzpg7XRM3fWbGvfgFlcppuvlkIvY= +github.com/whyrusleeping/cbor-gen v0.0.0-20191116002219-891f55cd449d/go.mod h1:xdlJQaiqipF0HW+Mzpg7XRM3fWbGvfgFlcppuvlkIvY= +github.com/whyrusleeping/cbor-gen v0.0.0-20191212224538-d370462a7e8a/go.mod h1:xdlJQaiqipF0HW+Mzpg7XRM3fWbGvfgFlcppuvlkIvY= github.com/whyrusleeping/cbor-gen v0.0.0-20191216205031-b047b6acb3c0/go.mod h1:xdlJQaiqipF0HW+Mzpg7XRM3fWbGvfgFlcppuvlkIvY= +github.com/whyrusleeping/cbor-gen v0.0.0-20200121162646-b63bacf5eaf8/go.mod h1:xdlJQaiqipF0HW+Mzpg7XRM3fWbGvfgFlcppuvlkIvY= github.com/whyrusleeping/cbor-gen v0.0.0-20200123233031-1cdf64d27158/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= +github.com/whyrusleeping/cbor-gen v0.0.0-20200206220010-03c9665e2a66/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= github.com/whyrusleeping/cbor-gen v0.0.0-20200402171437-3d27c146c105/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= github.com/whyrusleeping/cbor-gen v0.0.0-20200414195334-429a0b5e922e/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= github.com/whyrusleeping/cbor-gen v0.0.0-20200504204219-64967432584d/go.mod h1:W5MvapuoHRP8rz4vxjwCK1pDqF1aQcWsV5PZ+AHbqdg= @@ -1835,35 +1741,30 @@ github.com/whyrusleeping/cbor-gen v0.0.0-20200826160007-0b9f6c5fb163/go.mod h1:f 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-20210713220151-be142a5ae1a8 h1:TEv7MId88TyIqIUL4hbf9otOookIolMxlEbN0ro671Y= github.com/whyrusleeping/cbor-gen v0.0.0-20210713220151-be142a5ae1a8/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/ledger-filecoin-go v0.9.1-0.20201010031517-c3dcc1bddce4 h1:NwiwjQDB3CzQ5XH0rdMh1oQqzJH7O2PSLWxif/w3zsY= +github.com/whyrusleeping/go-smux-multiplex v3.0.16+incompatible/go.mod h1:34LEDbeKFZInPUrAG+bjuJmUXONGdEFW7XL0SpTY1y4= +github.com/whyrusleeping/go-smux-multistream v2.0.2+incompatible/go.mod h1:dRWHHvc4HDQSHh9gbKEBbUZ+f2Q8iZTPG3UOGYODxSQ= +github.com/whyrusleeping/go-smux-yamux v2.0.8+incompatible/go.mod h1:6qHUzBXUbB9MXmw3AUdB52L8sEb/hScCqOdW2kj/wuI= 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= github.com/whyrusleeping/mdns v0.0.0-20180901202407-ef14215e6b30/go.mod h1:j4l84WPFclQPj320J9gp0XwNKBb3U0zt5CBqjPp22G4= github.com/whyrusleeping/mdns v0.0.0-20190826153040-b9b60ed33aa9/go.mod h1:j4l84WPFclQPj320J9gp0XwNKBb3U0zt5CBqjPp22G4= -github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 h1:E9S12nwJwEOXe2d6gT6qxdvqMnNq+VnSsKPgm2ZZNds= github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7/go.mod h1:X2c0RVCI1eSUFI8eLcY3c0423ykwiUdxLJtkDvruhjI= -github.com/whyrusleeping/pubsub v0.0.0-20190708150250-92bcb0691325 h1:++Zf4xQ7YrkE81gNHIjVqx5JZsn0nbMeHOkY1ILAIME= +github.com/whyrusleeping/pubsub v0.0.0-20131020042734-02de8aa2db3d/go.mod h1:g7ckxrjiFh8mi1AY7ox23PZD0g6QU/TxW3U3unX7I3A= github.com/whyrusleeping/pubsub v0.0.0-20190708150250-92bcb0691325/go.mod h1:g7ckxrjiFh8mi1AY7ox23PZD0g6QU/TxW3U3unX7I3A= -github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee h1:lYbXeSvJi5zk5GLKVuid9TVjS9a0OmLIDKTfoZBL6Ow= github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee/go.mod h1:m2aV4LZI4Aez7dP5PMyVKEHhUyEJ/RjmPEDOpDvudHg= +github.com/whyrusleeping/yamux v1.1.5/go.mod h1:E8LnQQ8HKx5KD29HZFUwM1PxCOdPRzGwur1mcYhXcD8= 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 h1:/7/dQyiKnxAOj9L69FhST7uMe17U015XPzX7cy+5ykM= 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 h1:Sw125DKxZhPUI4JLlWugkzsrlB50jR9v2khiD9FxuSo= 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/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -1871,20 +1772,15 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de 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/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= github.com/zondax/ledger-go v0.12.1/go.mod h1:KatxXrVDzgWwbssUWsF5+cOJHXPvzQ09YSlzGNuhOEo= -go.dedis.ch/fixbuf v1.0.3 h1:hGcV9Cd/znUxlusJ64eAlExS+5cJDIyTyEG+otu5wQs= go.dedis.ch/fixbuf v1.0.3/go.mod h1:yzJMt34Wa5xD37V5RTdmp38cz3QhMagdGoem9anUalw= go.dedis.ch/kyber/v3 v3.0.4/go.mod h1:OzvaEnPvKlyrWyp3kGXlFdp7ap1VC6RkZDTaPikqhsQ= go.dedis.ch/kyber/v3 v3.0.9/go.mod h1:rhNjUUg6ahf8HEg5HUvVBYoWY4boAafX8tYxX+PS+qg= go.dedis.ch/protobuf v1.0.5/go.mod h1:eIV4wicvi6JK0q/QnfIEGeSFNG0ZeB24kzut5+HaRLo= go.dedis.ch/protobuf v1.0.7/go.mod h1:pv5ysfkDX/EawiPqcW3ikOxsL5t+BqnV6xHSmE79KI4= -go.dedis.ch/protobuf v1.0.11 h1:FTYVIEzY/bfl37lu3pR4lIj+F9Vp1jE8oh91VmxKgLo= go.dedis.ch/protobuf v1.0.11/go.mod h1:97QR256dnkimeNdfmURz0wAMNVbd1VmLXhG1CrTYrJ4= 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= @@ -1933,22 +1829,19 @@ 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/dig v1.10.0 h1:yLmDDj9/zuDjv3gz8GQGviXMs9TfysIUMUilCpgzUJY= +go.uber.org/dig v1.7.0/go.mod h1:z+dSd2TP9Usi48jL8M3v63iSBVkiwtVyMKxMZYYauPg= go.uber.org/dig v1.10.0/go.mod h1:X34SnWGr8Fyla9zQNO2GSO2D+TIuqB14OS8JhYocIyw= -go.uber.org/fx v1.9.0 h1:7OAz8ucp35AU8eydejpYG7QrbE8rLKzGhHbZlJi5LYY= go.uber.org/fx v1.9.0/go.mod h1:mFdUyAUuJ3w4jAckiKSKbldsxy1ojpAMJ+dVZg5Y0Aw= +go.uber.org/goleak v0.10.0/go.mod h1:VCZuO8V8mFPlL0F5J5GK1rtHV3DrFcQ1R8ryq7FK0aI= go.uber.org/goleak v1.0.0/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.1.11-0.20210813005559-691160354723 h1:sHOAIxRGBp443oHZIPB+HsUGaksVCXVQENPxwTfQdH4= go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/multierr v1.7.0 h1:zaiO/rmgFjbmCXdSYJWQcdvOCsthmdaHfr3Gm2Kx4Ec= go.uber.org/multierr v1.7.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= @@ -1959,10 +1852,10 @@ 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 h1:ue41HOKd1vGURxrmeKIgELGb3jPW9DMUDGtsinblHwI= go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= 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-20190218023631-ce4c26f7be8e/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= +go4.org v0.0.0-20190313082347-94abd6928b1d/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= go4.org v0.0.0-20200411211856-f5505b9728dd/go.mod h1:CIiUVy99QCPfoE13bO4EZaz5GZMZXMSBGhxRdsvzbkg= golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d/go.mod h1:OWs+y06UdEOHN4y+MfF/py+xQ/tYqIWW03b70/CG9Rw= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -2004,11 +1897,8 @@ golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWP 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 h1:3erb+vDS8lU1sxfDHF4/hhWyaXnhIaO+7RgL4fDZORA= golang.org/x/crypto v0.0.0-20210915214749-c084706c2272/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= 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= @@ -2026,9 +1916,6 @@ golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20200513190911-00229845015e/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= -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/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= @@ -2044,7 +1931,6 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= @@ -2057,8 +1943,8 @@ 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.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20180524181706-dfa909b99c79/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= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -2074,7 +1960,6 @@ golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190228165749-92fc7df08ae7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190313220215-9f648a60d977/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -2123,7 +2008,6 @@ golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT 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-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210917221730-978cfadd31cf h1:R150MpwJIv1MpS0N/pc+NhTM8ajzvlmxlY5OYsrevXQ= golang.org/x/net v0.0.0-20210917221730-978cfadd31cf/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= 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= @@ -2144,7 +2028,6 @@ 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/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= @@ -2182,6 +2065,7 @@ golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7w 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-20190813064441-fde4db37ae7a/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= @@ -2197,9 +2081,11 @@ 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= +golang.org/x/sys v0.0.0-20200107162124-548cf772de50/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2242,16 +2128,13 @@ golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210426080607-c94f62235c83/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210511113859-b0526f3d8744/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 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-20210917161153-d61c044b1678 h1:J27LZFQBFoihqXoegpscI10HpjZ7B5WQLLKL2FZXQKw= golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/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 h1:MZ2shdL+ZM/XzY3ZGOnh4Nlpnxz5GSOhOmtHo3iPU6M= golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -2260,14 +2143,12 @@ golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 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= @@ -2307,6 +2188,7 @@ golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapK golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200108195415-316d2f248479/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117012304-6edc0a871e69/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= @@ -2329,7 +2211,6 @@ golang.org/x/tools v0.0.0-20200711155855-7342f9734a7d/go.mod h1:njjCfa9FT2d7l9Bc 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= -golang.org/x/tools v0.0.0-20200827010519-17fd2f27a9e3/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20201112185108-eeaa07dd7696/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= @@ -2337,12 +2218,11 @@ golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1-0.20210225150353-54dc8c5edb56/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= 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 h1:ouewzE6p+/VEB31YYnTbEJdi8pFqKp4P4n85vwo3DHA= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 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 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/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= @@ -2352,6 +2232,7 @@ google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+ 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= google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= +google.golang.org/api v0.3.2/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -2414,7 +2295,6 @@ google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6D 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= google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= @@ -2442,7 +2322,6 @@ google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTp 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 h1:AGJ0Ih4mHjSeibYkFGh1dD9KJ/eOtZ93I6hoHhukQ5Q= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= 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= @@ -2456,17 +2335,14 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= 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 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= 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= 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= -gopkg.in/cheggaaa/pb.v1 v1.0.28 h1:n1tBJnnK2r7g9OW2btFH91V92STTUevLXYFb8gy9EMk= gopkg.in/cheggaaa/pb.v1 v1.0.28/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= @@ -2475,8 +2351,8 @@ 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/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= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/urfave/cli.v2 v2.0.0-20180128182452-d3ae77c26ac8/go.mod h1:cKXr3E0k4aosgycml1b5z33BVV6hai1Kh7uDgFOkbcs= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -2486,12 +2362,9 @@ gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -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 h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/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= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -2503,21 +2376,16 @@ honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= -howett.net/plist v0.0.0-20181124034731-591f970eefbb h1:jhnBjNi9UFpfpl8YZhA9CrOqpnJdvzuiHsl/dnxl11M= howett.net/plist v0.0.0-20181124034731-591f970eefbb/go.mod h1:vMygbs4qMhSZSc4lCUl2OEE+rDiIIJAIdR4m7MiMcm0= -modernc.org/cc v1.0.0 h1:nPibNuDEx6tvYrUAtvDTTw98rx5juGsa5zuDnKwEEQQ= +launchpad.net/gocheck v0.0.0-20140225173054-000000000087/go.mod h1:hj7XX3B/0A+80Vse0e+BUHsHMTEhd0O4cpUHr/e/BUM= 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 h1:EYKY1a3wStt0RzHaH8mdSRNg78Ub0OHxYfCRWw35YtM= 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 h1:FeylZSVX8S+58VsyJlkEj2bcpdytmp9MmDKZkKx8OIE= modernc.org/mathutil v1.1.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/strutil v1.1.0 h1:+1/yCzZxY2pZwwrsbH+4T7BQMoLQ9QiBshRC9eicYsc= modernc.org/strutil v1.1.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs= -modernc.org/xc v1.0.0 h1:7ccXrupWZIS3twbUGrtKmHS2DXY6xegFua+6O3xgAFU= modernc.org/xc v1.0.0/go.mod h1:mRNCo0bvLjGhHO9WsyuKVU4q0ceiDDDoEeWDJHrNx8I= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= diff --git a/lib/backupds/backupds_test.go b/lib/backupds/backupds_test.go index f7bc36e2292..c681491e3f0 100644 --- a/lib/backupds/backupds_test.go +++ b/lib/backupds/backupds_test.go @@ -2,6 +2,7 @@ package backupds import ( "bytes" + "context" "fmt" "io/ioutil" "os" @@ -17,14 +18,14 @@ const valSize = 512 << 10 func putVals(t *testing.T, ds datastore.Datastore, start, end int) { for i := start; i < end; i++ { - err := ds.Put(datastore.NewKey(fmt.Sprintf("%d", i)), []byte(fmt.Sprintf("%d-%s", i, strings.Repeat("~", valSize)))) + err := ds.Put(context.TODO(), datastore.NewKey(fmt.Sprintf("%d", i)), []byte(fmt.Sprintf("%d-%s", i, strings.Repeat("~", valSize)))) require.NoError(t, err) } } func checkVals(t *testing.T, ds datastore.Datastore, start, end int, exist bool) { for i := start; i < end; i++ { - v, err := ds.Get(datastore.NewKey(fmt.Sprintf("%d", i))) + v, err := ds.Get(context.TODO(), datastore.NewKey(fmt.Sprintf("%d", i))) if exist { require.NoError(t, err) expect := []byte(fmt.Sprintf("%d-%s", i, strings.Repeat("~", valSize))) @@ -44,7 +45,7 @@ func TestNoLogRestore(t *testing.T) { require.NoError(t, err) var bup bytes.Buffer - require.NoError(t, bds.Backup(&bup)) + require.NoError(t, bds.Backup(context.TODO(), &bup)) putVals(t, ds1, 10, 20) diff --git a/lib/backupds/datastore.go b/lib/backupds/datastore.go index 350988a501f..f0ece10baf7 100644 --- a/lib/backupds/datastore.go +++ b/lib/backupds/datastore.go @@ -1,6 +1,7 @@ package backupds import ( + "context" "crypto/sha256" "io" "sync" @@ -52,7 +53,7 @@ func Wrap(child datastore.Batching, logdir string) (*Datastore, error) { // Writes a datastore dump into the provided writer as // [array(*) of [key, value] tuples, checksum] -func (d *Datastore) Backup(out io.Writer) error { +func (d *Datastore) Backup(ctx context.Context, out io.Writer) error { scratch := make([]byte, 9) if err := cbg.WriteMajorTypeHeaderBuf(scratch, out, cbg.MajArray, 2); err != nil { @@ -75,7 +76,7 @@ func (d *Datastore) Backup(out io.Writer) error { log.Info("Starting datastore backup") defer log.Info("Datastore backup done") - qr, err := d.child.Query(query.Query{}) + qr, err := d.child.Query(ctx, query.Query{}) if err != nil { return xerrors.Errorf("query: %w", err) } @@ -132,23 +133,23 @@ func (d *Datastore) Backup(out io.Writer) error { // proxy -func (d *Datastore) Get(key datastore.Key) (value []byte, err error) { - return d.child.Get(key) +func (d *Datastore) Get(ctx context.Context, key datastore.Key) (value []byte, err error) { + return d.child.Get(ctx, key) } -func (d *Datastore) Has(key datastore.Key) (exists bool, err error) { - return d.child.Has(key) +func (d *Datastore) Has(ctx context.Context, key datastore.Key) (exists bool, err error) { + return d.child.Has(ctx, key) } -func (d *Datastore) GetSize(key datastore.Key) (size int, err error) { - return d.child.GetSize(key) +func (d *Datastore) GetSize(ctx context.Context, key datastore.Key) (size int, err error) { + return d.child.GetSize(ctx, key) } -func (d *Datastore) Query(q query.Query) (query.Results, error) { - return d.child.Query(q) +func (d *Datastore) Query(ctx context.Context, q query.Query) (query.Results, error) { + return d.child.Query(ctx, q) } -func (d *Datastore) Put(key datastore.Key, value []byte) error { +func (d *Datastore) Put(ctx context.Context, key datastore.Key, value []byte) error { d.backupLk.RLock() defer d.backupLk.RUnlock() @@ -160,21 +161,21 @@ func (d *Datastore) Put(key datastore.Key, value []byte) error { } } - return d.child.Put(key, value) + return d.child.Put(ctx, key, value) } -func (d *Datastore) Delete(key datastore.Key) error { +func (d *Datastore) Delete(ctx context.Context, key datastore.Key) error { d.backupLk.RLock() defer d.backupLk.RUnlock() - return d.child.Delete(key) + return d.child.Delete(ctx, key) } -func (d *Datastore) Sync(prefix datastore.Key) error { +func (d *Datastore) Sync(ctx context.Context, prefix datastore.Key) error { d.backupLk.RLock() defer d.backupLk.RUnlock() - return d.child.Sync(prefix) + return d.child.Sync(ctx, prefix) } func (d *Datastore) CloseLog() error { @@ -196,8 +197,8 @@ func (d *Datastore) Close() error { ) } -func (d *Datastore) Batch() (datastore.Batch, error) { - b, err := d.child.Batch() +func (d *Datastore) Batch(ctx context.Context) (datastore.Batch, error) { + b, err := d.child.Batch(ctx) if err != nil { return nil, err } @@ -215,7 +216,7 @@ type bbatch struct { rlk sync.Locker } -func (b *bbatch) Put(key datastore.Key, value []byte) error { +func (b *bbatch) Put(ctx context.Context, key datastore.Key, value []byte) error { if b.d.log != nil { b.d.log <- Entry{ Key: []byte(key.String()), @@ -224,18 +225,18 @@ func (b *bbatch) Put(key datastore.Key, value []byte) error { } } - return b.b.Put(key, value) + return b.b.Put(ctx, key, value) } -func (b *bbatch) Delete(key datastore.Key) error { - return b.b.Delete(key) +func (b *bbatch) Delete(ctx context.Context, key datastore.Key) error { + return b.b.Delete(ctx, key) } -func (b *bbatch) Commit() error { +func (b *bbatch) Commit(ctx context.Context) error { b.rlk.Lock() defer b.rlk.Unlock() - return b.b.Commit() + return b.b.Commit(ctx) } var _ datastore.Batch = &bbatch{} diff --git a/lib/backupds/log.go b/lib/backupds/log.go index b76dfbfe653..b89f410f0d7 100644 --- a/lib/backupds/log.go +++ b/lib/backupds/log.go @@ -1,6 +1,7 @@ package backupds import ( + "context" "fmt" "io" "io/ioutil" @@ -100,6 +101,7 @@ type logfile struct { var compactThresh = 2 func (d *Datastore) createLog(logdir string) (*logfile, string, error) { + ctx := context.TODO() p := filepath.Join(logdir, strconv.FormatInt(time.Now().Unix(), 10)+".log.cbor") log.Infow("creating log", "file", p) @@ -108,7 +110,7 @@ func (d *Datastore) createLog(logdir string) (*logfile, string, error) { return nil, "", err } - if err := d.Backup(f); err != nil { + if err := d.Backup(ctx, f); err != nil { return nil, "", xerrors.Errorf("writing log base: %w", err) } if err := f.Sync(); err != nil { @@ -122,8 +124,9 @@ func (d *Datastore) createLog(logdir string) (*logfile, string, error) { } func (d *Datastore) openLog(p string) (*logfile, string, error) { + ctx := context.TODO() log.Infow("opening log", "file", p) - lh, err := d.child.Get(loghead) + lh, err := d.child.Get(ctx, loghead) if err != nil { return nil, "", xerrors.Errorf("checking log head (logfile '%s'): %w", p, err) } @@ -212,6 +215,7 @@ func (d *Datastore) openLog(p string) (*logfile, string, error) { } func (l *logfile) writeLogHead(logname string, ds datastore.Batching) error { + ctx := context.TODO() lval := []byte(fmt.Sprintf("%s;%s;%d", logname, uuid.New(), time.Now().Unix())) err := l.writeEntry(&Entry{ @@ -223,7 +227,7 @@ func (l *logfile) writeLogHead(logname string, ds datastore.Batching) error { return xerrors.Errorf("writing loghead to the log: %w", err) } - if err := ds.Put(loghead, lval); err != nil { + if err := ds.Put(ctx, loghead, lval); err != nil { return xerrors.Errorf("writing loghead to the datastore: %w", err) } diff --git a/lib/backupds/read.go b/lib/backupds/read.go index a44442af167..af4f308889b 100644 --- a/lib/backupds/read.go +++ b/lib/backupds/read.go @@ -2,6 +2,7 @@ package backupds import ( "bytes" + "context" "crypto/sha256" "io" "os" @@ -117,13 +118,13 @@ func ReadBackup(r io.Reader, cb func(key datastore.Key, value []byte, log bool) } func RestoreInto(r io.Reader, dest datastore.Batching) error { - batch, err := dest.Batch() + batch, err := dest.Batch(context.TODO()) if err != nil { return xerrors.Errorf("creating batch: %w", err) } _, err = ReadBackup(r, func(key datastore.Key, value []byte, _ bool) error { - if err := batch.Put(key, value); err != nil { + if err := batch.Put(context.TODO(), key, value); err != nil { return xerrors.Errorf("put key: %w", err) } @@ -133,7 +134,7 @@ func RestoreInto(r io.Reader, dest datastore.Batching) error { return xerrors.Errorf("reading backup: %w", err) } - if err := batch.Commit(); err != nil { + if err := batch.Commit(context.TODO()); err != nil { return xerrors.Errorf("committing batch: %w", err) } From b9b4a2659d99b4c720866e5c9a13297194fe97a4 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 7 Dec 2021 17:24:58 -0500 Subject: [PATCH 036/393] Update go-data-transfer --- go.mod | 24 +++++++++++----------- go.sum | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index af9864d1bf0..e5277fc0008 100644 --- a/go.mod +++ b/go.mod @@ -32,7 +32,7 @@ require ( github.com/filecoin-project/go-bitfield v0.2.4 github.com/filecoin-project/go-cbor-util v0.0.1 github.com/filecoin-project/go-crypto v0.0.1 - github.com/filecoin-project/go-data-transfer v1.11.7-0.20211119001436-c0dbfa5fae4d + github.com/filecoin-project/go-data-transfer v1.11.7-0.20211207053937-e06a599f202a github.com/filecoin-project/go-ds-versioning v0.1.0 // indirect github.com/filecoin-project/go-fil-commcid v0.1.0 github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 @@ -42,7 +42,7 @@ require ( github.com/filecoin-project/go-paramfetch v0.0.2 github.com/filecoin-project/go-state-types v0.1.1 github.com/filecoin-project/go-statemachine v1.0.1 - github.com/filecoin-project/go-statestore v0.1.2-0.20211118230537-43557b6c5ce5 + github.com/filecoin-project/go-statestore v0.2.0 github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b github.com/filecoin-project/specs-actors v0.9.14 github.com/filecoin-project/specs-actors/v2 v2.3.5 @@ -71,14 +71,14 @@ require ( github.com/ipfs/go-blockservice v0.2.1 github.com/ipfs/go-cid v0.1.0 github.com/ipfs/go-cidutil v0.0.2 - github.com/ipfs/go-datastore v0.5.0 + github.com/ipfs/go-datastore v0.5.1 github.com/ipfs/go-ds-badger2 v0.1.2-0.20211119002906-7318f1b76158 github.com/ipfs/go-ds-leveldb v0.5.0 github.com/ipfs/go-ds-measure v0.1.0 github.com/ipfs/go-ds-pebble v0.0.2-0.20200921225637-ce220f8ac459 github.com/ipfs/go-filestore v0.0.3 // indirect github.com/ipfs/go-fs-lock v0.0.6 - github.com/ipfs/go-graphsync v0.10.6 + github.com/ipfs/go-graphsync v0.11.0 github.com/ipfs/go-ipfs-blockstore v1.1.0 github.com/ipfs/go-ipfs-blocksutil v0.0.1 github.com/ipfs/go-ipfs-chunker v0.0.5 @@ -106,20 +106,20 @@ require ( github.com/kelseyhightower/envconfig v1.4.0 github.com/libp2p/go-buffer-pool v0.0.2 github.com/libp2p/go-eventbus v0.2.1 - github.com/libp2p/go-libp2p v0.15.0 + github.com/libp2p/go-libp2p v0.16.0 github.com/libp2p/go-libp2p-connmgr v0.2.4 - github.com/libp2p/go-libp2p-core v0.9.0 - github.com/libp2p/go-libp2p-discovery v0.5.1 + github.com/libp2p/go-libp2p-core v0.11.0 + github.com/libp2p/go-libp2p-discovery v0.6.0 github.com/libp2p/go-libp2p-kad-dht v0.13.0 - github.com/libp2p/go-libp2p-noise v0.2.2 + github.com/libp2p/go-libp2p-noise v0.3.0 github.com/libp2p/go-libp2p-peerstore v0.4.0 github.com/libp2p/go-libp2p-pubsub v0.5.6 - github.com/libp2p/go-libp2p-quic-transport v0.11.2 + github.com/libp2p/go-libp2p-quic-transport v0.15.0 github.com/libp2p/go-libp2p-record v0.1.3 github.com/libp2p/go-libp2p-routing-helpers v0.2.3 - github.com/libp2p/go-libp2p-swarm v0.5.3 - github.com/libp2p/go-libp2p-tls v0.2.0 - github.com/libp2p/go-libp2p-yamux v0.5.4 + github.com/libp2p/go-libp2p-swarm v0.8.0 + github.com/libp2p/go-libp2p-tls v0.3.1 + github.com/libp2p/go-libp2p-yamux v0.6.0 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 diff --git a/go.sum b/go.sum index 469b791cc13..76755f63e04 100644 --- a/go.sum +++ b/go.sum @@ -353,7 +353,10 @@ github.com/filecoin-project/go-data-transfer v1.0.1/go.mod h1:UxvfUAY9v3ub0a21BS github.com/filecoin-project/go-data-transfer v1.11.4/go.mod h1:2MitLI0ebCkLlPKM7NRggP/t9d+gCcREUKkCKqWRCwU= github.com/filecoin-project/go-data-transfer v1.11.7-0.20211119001436-c0dbfa5fae4d h1:otSEh99T0inzVe6pblKBG5tSeSqbQq4BCi5GKoh1J7I= github.com/filecoin-project/go-data-transfer v1.11.7-0.20211119001436-c0dbfa5fae4d/go.mod h1:Qj+yDFsualZ4c7Ndh5Cl1SJK46QeVzNMdRnfAJdDuhw= +github.com/filecoin-project/go-data-transfer v1.11.7-0.20211207053937-e06a599f202a h1:eSKovm26xNSTE/OFc+9zkt7sotMb0ixumKAO11BNMbs= +github.com/filecoin-project/go-data-transfer v1.11.7-0.20211207053937-e06a599f202a/go.mod h1:tDrD2jLU2TpVhd+5B8iqBp0fQRV4lP80WZccKXugjYc= github.com/filecoin-project/go-ds-versioning v0.0.0-20211119000042-d0cf38743fe7/go.mod h1:BVGOwN2WSCRKV3CDLFJ9u0L9M17WxHqw1KLA0l5ATnk= +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.0 h1:y/X6UksYTsK8TLCI7rttCKEvl8btmWxyFMEeeWGUxIQ= github.com/filecoin-project/go-ds-versioning v0.1.0/go.mod h1:mp16rb4i2QPmxBnmanUx8i/XANp+PFCCJWiAb+VW4/s= github.com/filecoin-project/go-fil-commcid v0.0.0-20200208005934-2b8bd03caca5/go.mod h1:JbkIgFF/Z9BDlvrJO1FuKkaWsH673/UdFaiVS6uIHlA= @@ -408,6 +411,7 @@ github.com/filecoin-project/go-statestore v0.1.0/go.mod h1:LFc9hD+fRxPqiHiaqUEZO github.com/filecoin-project/go-statestore v0.1.1/go.mod h1:LFc9hD+fRxPqiHiaqUEZOinUJB4WARkRfNl10O7kTnI= github.com/filecoin-project/go-statestore v0.1.2-0.20211118230537-43557b6c5ce5 h1:xH09S8C+VhZCTmTkdudGm/cN5a8teKE+PXXvbPsXTO0= github.com/filecoin-project/go-statestore v0.1.2-0.20211118230537-43557b6c5ce5/go.mod h1:8sjBYbS35HwPzct7iT4lIXjLlYyPor80aU7t7a/Kspo= +github.com/filecoin-project/go-statestore v0.2.0/go.mod h1:8sjBYbS35HwPzct7iT4lIXjLlYyPor80aU7t7a/Kspo= github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b h1:fkRZSPrYpk42PV3/lIXiL0LHetxde7vyYYvSsttQtfg= github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b/go.mod h1:Q0GQOBtKf1oE10eSXSlhN45kDBdGvEcVOqMiffqX+N8= github.com/filecoin-project/lotus v0.2.10/go.mod h1:om5PQA9ZT0lf16qI7Fz/ZGLn4LDCMqPC8ntZA9uncRE= @@ -770,6 +774,7 @@ github.com/ipfs/go-datastore v0.4.6/go.mod h1:XSipLSc64rFKSFRFGo1ecQl+WhYce3K7fr github.com/ipfs/go-datastore v0.4.7-0.20211013204805-28a3721c2e66/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= github.com/ipfs/go-datastore v0.5.0 h1:rQicVCEacWyk4JZ6G5bD9TKR7lZEG1MWcG7UdWYrFAU= github.com/ipfs/go-datastore v0.5.0/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= +github.com/ipfs/go-datastore v0.5.1/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= 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= @@ -810,6 +815,7 @@ github.com/ipfs/go-graphsync v0.4.3/go.mod h1:mPOwDYv128gf8gxPFgXnz4fNrSYPsWyqis github.com/ipfs/go-graphsync v0.10.0/go.mod h1:cKIshzTaa5rCZjryH5xmSKZVGX9uk1wvwGvz2WEha5Y= github.com/ipfs/go-graphsync v0.10.6-0.20211119000532-c416dad3bd56/go.mod h1:/wC15/mR2JyjVrO86tfZLLuhyvop0fLU+ewhYLkdgLM= github.com/ipfs/go-graphsync v0.10.6/go.mod h1:tQMjWNDD/vSz80YLT/VvzrUmy58aF9lR1uCwSLzjWzI= +github.com/ipfs/go-graphsync v0.11.0/go.mod h1:wC+c8vGVjAHthsVIl8LKr37cUra2GOaMYcQNNmMxDqE= github.com/ipfs/go-hamt-ipld v0.0.14-0.20191218031521-b2c774a54db1/go.mod h1:8yRx0xLUps1Xq8ZDnIwIVdQRp7JjA55gGvCiRHT91Vk= github.com/ipfs/go-hamt-ipld v0.0.15-0.20200131012125-dd88a59d3f2e/go.mod h1:9aQJu/i/TaRDW6jqB5U217dLIDopn50wxLdHXM2CTfE= github.com/ipfs/go-hamt-ipld v0.1.1/go.mod h1:1EZCr2v0jlCnhpa+aZ0JZYp8Tt2w16+JJOAVz17YcDk= @@ -848,13 +854,16 @@ github.com/ipfs/go-ipfs-routing v0.0.1/go.mod h1:k76lf20iKFxQTjcJokbPM9iBXVXVZhc github.com/ipfs/go-ipfs-routing v0.1.0/go.mod h1:hYoUkJLyAUKhF58tysKpids8RNDPO42BVMgK5dNsoqY= github.com/ipfs/go-ipfs-routing v0.2.1/go.mod h1:xiNNiwgjmLqPS1cimvAw6EyB9rkVDbiocA4yY+wRNLM= github.com/ipfs/go-ipfs-util v0.0.1/go.mod h1:spsl5z8KUnrve+73pOhSVZND1SIxPW5RyBCNzQxlJBc= +github.com/ipfs/go-ipfs-util v0.0.2 h1:59Sswnk1MFaiq+VcaknX7aYEyGyGDAA73ilhEK2POp8= github.com/ipfs/go-ipfs-util v0.0.2/go.mod h1:CbPtkWJzjLdEcezDns2XYaehFVNXG9zrdrtMecczcsQ= github.com/ipfs/go-ipld-cbor v0.0.2/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= github.com/ipfs/go-ipld-cbor v0.0.3/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= github.com/ipfs/go-ipld-cbor v0.0.4/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= +github.com/ipfs/go-ipld-cbor v0.0.5 h1:ovz4CHKogtG2KB/h1zUp5U0c/IzZrL435rCh5+K/5G8= github.com/ipfs/go-ipld-cbor v0.0.5/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= github.com/ipfs/go-ipld-format v0.0.1/go.mod h1:kyJtbkDALmFHv3QR6et67i35QzO3S0dCDnkOJhcZkms= github.com/ipfs/go-ipld-format v0.0.2/go.mod h1:4B6+FM2u9OJ9zCV+kSbgFAZlOrv1Hqbf0INGQgiKf9k= +github.com/ipfs/go-ipld-format v0.2.0 h1:xGlJKkArkmBvowr+GMCX0FEZtkro71K1AwiKnL37mwA= github.com/ipfs/go-ipld-format v0.2.0/go.mod h1:3l3C1uKoadTPbeNfrDi+xMInYKlx2Cvg1BuydPSdzQs= github.com/ipfs/go-ipld-legacy v0.1.0/go.mod h1:86f5P/srAmh9GcIcWQR9lfFLZPrIyyXQeVlOWeeWEuI= github.com/ipfs/go-ipns v0.1.2/go.mod h1:ioQ0j02o6jdIVW+bmi18f4k2gRf0AV3kZ9KeHYHICnQ= @@ -916,6 +925,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 h1:furVobw7UBLQZwlEwfE26tYORy3PAK8VYSgZOSr3JMQ= github.com/ipld/go-ipld-prime v0.12.3/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= github.com/ipld/go-ipld-prime-proto v0.0.0-20191113031812-e32bd156a1e5/go.mod h1:gcvzoEDBjwycpXt3LBE061wT9f46szXGHAmj9uoP6fU= github.com/ipld/go-ipld-prime-proto v0.0.0-20200428191222-c1ffdadc01e1/go.mod h1:OAV6xBmuTLsPZ+epzKkPB1e25FHk/vCtyatkdHcArLs= @@ -978,6 +988,7 @@ github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYs 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/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= 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= @@ -997,6 +1008,7 @@ 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-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= @@ -1004,6 +1016,7 @@ github.com/libp2p/go-conn-security-multistream v0.0.2/go.mod h1:nc9vud7inQ+d6SO0 github.com/libp2p/go-conn-security-multistream v0.1.0/go.mod h1:aw6eD7LOsHEX7+2hJkDxw1MteijaVcI+/eP2/x3J1xc= 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-eventbus v0.0.2/go.mod h1:Hr/yGlwxA/stuLnpMiu82lpNKpvRy3EaJxPu40XYOwk= github.com/libp2p/go-eventbus v0.0.3/go.mod h1:Hr/yGlwxA/stuLnpMiu82lpNKpvRy3EaJxPu40XYOwk= github.com/libp2p/go-eventbus v0.1.0/go.mod h1:vROgu5cs5T7cv7POWlWxBaVLxfSegC5UGQf8A2eEmx4= @@ -1030,7 +1043,9 @@ github.com/libp2p/go-libp2p v0.13.0/go.mod h1:pM0beYdACRfHO1WcJlp65WXyG2A6NqYM+t 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.15.0/go.mod h1:8Ljmwon0cZZYKrOCjFeLwQEK8bqR42dOheUZ1kSKhP0= +github.com/libp2p/go-libp2p v0.16.0/go.mod h1:ump42BsirwAWxKzsCiFnTtN1Yc+DuPu76fyMX364/O4= 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-autonat v0.0.6/go.mod h1:uZneLdOkZHro35xIhpbtTzLlgYturpu4J5+0cZK3MqE= github.com/libp2p/go-libp2p-autonat v0.1.0/go.mod h1:1tLf2yXxiE/oKGtDwPYWTSYG3PtvYlJmg7NeVtPRqH8= github.com/libp2p/go-libp2p-autonat v0.1.1/go.mod h1:OXqkeGOY2xJVWKAGV2inNF5aKN/djNA3fdpCWloIudE= @@ -1040,6 +1055,7 @@ github.com/libp2p/go-libp2p-autonat v0.2.2/go.mod h1:HsM62HkqZmHR2k1xgX34WuWDzk/ github.com/libp2p/go-libp2p-autonat v0.2.3/go.mod h1:2U6bNWCNsAG9LEbwccBDQbjzQ8Krdjge1jLTE9rdoMM= 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-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= @@ -1090,6 +1106,9 @@ github.com/libp2p/go-libp2p-core v0.8.2/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJB github.com/libp2p/go-libp2p-core v0.8.5/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= github.com/libp2p/go-libp2p-core v0.8.6/go.mod h1:dgHr0l0hIKfWpGpqAMbpo19pen9wJfdCGv51mTmdpmM= github.com/libp2p/go-libp2p-core v0.9.0/go.mod h1:ESsbz31oC3C1AvMJoGx26RTuCkNhmkSRCqZ0kQtJ2/8= +github.com/libp2p/go-libp2p-core v0.10.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= +github.com/libp2p/go-libp2p-core v0.11.0 h1:75jAgdA+IChNa+/mZXogfmrGkgwxkVvxmIC7pV+F6sI= +github.com/libp2p/go-libp2p-core v0.11.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= 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= @@ -1101,6 +1120,7 @@ github.com/libp2p/go-libp2p-discovery v0.3.0/go.mod h1:o03drFnz9BVAZdzC/QUQ+NeQO github.com/libp2p/go-libp2p-discovery v0.4.0/go.mod h1:bZ0aJSrFc/eX2llP0ryhb1kpgkPyTo23SJ5b7UQCMh4= github.com/libp2p/go-libp2p-discovery v0.5.0/go.mod h1:+srtPIU9gDaBNu//UHvcdliKBIcr4SfDcm0/PfPJLug= github.com/libp2p/go-libp2p-discovery v0.5.1/go.mod h1:+srtPIU9gDaBNu//UHvcdliKBIcr4SfDcm0/PfPJLug= +github.com/libp2p/go-libp2p-discovery v0.6.0/go.mod h1:/u1voHt0tKIe5oIA1RHBKQLVCWPna2dXmPNHc2zR9S8= 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-interface-connmgr v0.0.1/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= @@ -1127,6 +1147,7 @@ github.com/libp2p/go-libp2p-mplex v0.4.1/go.mod h1:cmy+3GfqfM1PceHTLL7zQzAAYaryD 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= +github.com/libp2p/go-libp2p-nat v0.1.0/go.mod h1:DQzAG+QbDYjN1/C3B6vXucLtz3u9rEonLVPtZVzQqks= 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= @@ -1134,6 +1155,7 @@ github.com/libp2p/go-libp2p-netutil v0.1.0/go.mod h1:3Qv/aDqtMLTUyQeundkKsA+YCTh 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.2.2/go.mod h1:IEbYhBBzGyvdLBoxxULL/SGbJARhUeqlO8lVSREYu2Q= +github.com/libp2p/go-libp2p-noise v0.3.0/go.mod h1:JNjHbociDJKHD64KTkzGnzqJ0FEV5gHJa6AB00kbCNQ= github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo= github.com/libp2p/go-libp2p-peer v0.1.1/go.mod h1:jkF12jGB4Gk/IOo+yomm+7oLWxF278F7UnrYUQ1Q8es= github.com/libp2p/go-libp2p-peer v0.2.0/go.mod h1:RCffaCvUyW2CJmG2gAWVqwePwW7JMgxjsHm7+J5kjWY= @@ -1162,6 +1184,8 @@ github.com/libp2p/go-libp2p-pubsub v0.5.6/go.mod h1:gVOzwebXVdSMDQBTfH8ACO5EJ4SQ 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= +github.com/libp2p/go-libp2p-quic-transport v0.15.0/go.mod h1:wv4uGwjcqe8Mhjj7N/Ic0aKjA+/10UnMlSzLO0yRpYQ= 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= @@ -1190,6 +1214,7 @@ github.com/libp2p/go-libp2p-swarm v0.3.0/go.mod h1:hdv95GWCTmzkgeJpP+GK/9D9puJeg 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= 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= @@ -1200,9 +1225,12 @@ github.com/libp2p/go-libp2p-testing v0.1.2-0.20200422005655-8775583591d8/go.mod github.com/libp2p/go-libp2p-testing v0.3.0/go.mod h1:efZkql4UZ7OVsEfaxNHZPzIehtsBXMrXnCfJIgDti5g= github.com/libp2p/go-libp2p-testing v0.4.0/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotlKsNSbKQ/lImlOWF0= 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-tls v0.1.0/go.mod h1:VZdoSWQDeNpIIAFJFv+6uqTqpnIIDHcqZQSTC/A1TT0= github.com/libp2p/go-libp2p-tls v0.1.3/go.mod h1:wZfuewxOndz5RTnCAxFliGjvYSDA40sKitV4c50uI1M= github.com/libp2p/go-libp2p-tls v0.2.0/go.mod h1:twrp2Ci4lE2GYspA1AnlYm+boYjqVruxDKJJj7s6xrc= +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-transport v0.0.1/go.mod h1:UzbUs9X+PHOSw7S3ZmeOxfnwaQY5vGDzZmKPod3N3tk= github.com/libp2p/go-libp2p-transport v0.0.4/go.mod h1:StoY3sx6IqsP6XKoabsPnHCwqKXWUMWU7Rfcsubee/A= github.com/libp2p/go-libp2p-transport v0.0.5/go.mod h1:StoY3sx6IqsP6XKoabsPnHCwqKXWUMWU7Rfcsubee/A= @@ -1214,6 +1242,7 @@ github.com/libp2p/go-libp2p-transport-upgrader v0.4.0/go.mod h1:J4ko0ObtZSmgn5BX 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= +github.com/libp2p/go-libp2p-transport-upgrader v0.5.0/go.mod h1:Rc+XODlB3yce7dvFV4q/RmyJGsFcCZRkeZMu/Zdg0mo= github.com/libp2p/go-libp2p-xor v0.0.0-20210714161855-5c005aca55db/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= @@ -1227,6 +1256,7 @@ github.com/libp2p/go-libp2p-yamux v0.4.0/go.mod h1:+DWDjtFMzoAwYLVkNZftoucn7PelN 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.4/go.mod h1:tfrXbyaTqqSU654GTvK3ocnSZL3BuHoeTSqhcel1wsE= +github.com/libp2p/go-libp2p-yamux v0.6.0/go.mod h1:MRhd6mAYnFRnSISp4M8i0ClV/j+mWHo2mYLifWGw33k= 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= @@ -1242,9 +1272,11 @@ github.com/libp2p/go-msgio v0.0.2/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+ 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= github.com/libp2p/go-msgio v0.0.6/go.mod h1:4ecVB6d9f4BDSL5fqvPiC4A3KivjWn+Venn/1ALLMWA= +github.com/libp2p/go-msgio v0.1.0/go.mod h1:eNlv2vy9V2X/kNldcZ+SShFE++o2Yjxwx6RAYsmgJnE= github.com/libp2p/go-nat v0.0.3/go.mod h1:88nUEt0k0JD45Bk93NIwDqjlhiOwOoV36GchpcVc1yI= github.com/libp2p/go-nat v0.0.4/go.mod h1:Nmw50VAvKuk38jUBcmNh6p9lUJLoODbJRvYAa/+KSDo= github.com/libp2p/go-nat v0.0.5/go.mod h1:B7NxsVNPZmRLvMOwiEO1scOSyjA56zxYAGv1yQgRkEU= +github.com/libp2p/go-nat v0.1.0/go.mod h1:X7teVkwRHNInVNWQiO/tAiAVRwSr5zoRz4YSTC3uRBM= github.com/libp2p/go-netroute v0.1.2/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk= github.com/libp2p/go-netroute v0.1.3/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk= github.com/libp2p/go-netroute v0.1.5/go.mod h1:V1SR3AaECRkEQCoFFzYwVYWvYIEtlxx89+O3qcpCl4A= @@ -1253,13 +1285,16 @@ 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-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= github.com/libp2p/go-reuseport-transport v0.0.2/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs= github.com/libp2p/go-reuseport-transport v0.0.3/go.mod h1:Spv+MPft1exxARzP2Sruj2Wb5JSyHNncjf1Oi2dEbzM= github.com/libp2p/go-reuseport-transport v0.0.4/go.mod h1:trPa7r/7TJK/d+0hdBLOCGvpQQVOU74OXbNCIMkufGw= github.com/libp2p/go-reuseport-transport v0.0.5/go.mod h1:TC62hhPc8qs5c/RoXDZG6YmjK+/YWUPC0yYmeUecbjc= +github.com/libp2p/go-reuseport-transport v0.1.0/go.mod h1:vev0C0uMkzriDY59yFHD9v+ujJvYmDQVLowvAjEOmfw= 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= @@ -1277,6 +1312,7 @@ github.com/libp2p/go-tcp-transport v0.2.3/go.mod h1:9dvr03yqrPyYGIEN6Dy5UvdJZjyP 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= github.com/libp2p/go-tcp-transport v0.2.8/go.mod h1:64rSfVidkYPLqbzpcN2IwHY4pmgirp67h++hZ/rcndQ= +github.com/libp2p/go-tcp-transport v0.4.0/go.mod h1:0y52Rwrn4076xdJYu/51/qJIdxz+EWDAOG2S45sV3VI= 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= @@ -1299,12 +1335,16 @@ 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.0.0/go.mod h1:NVWira5+sVUIU6tu1JWvaRn1dRnG+cawOJiflsAM+7U= 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/zeroconf/v2 v2.0.0/go.mod h1:J85R/d9joD8u8F9aHM8pBXygtG9W02enEwS+wWeL6yo= +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= +github.com/lucas-clemente/quic-go v0.24.0/go.mod h1:paZuzjXCE5mj6sikVLMvqXk8lJV2AsqtJ6bDhjEfxx0= 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= github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= @@ -1325,6 +1365,7 @@ github.com/marten-seemann/qtls-go1-15 v0.1.4/go.mod h1:GyFwywLKkRt+6mfU99csTEY1j github.com/marten-seemann/qtls-go1-15 v0.1.5/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= github.com/marten-seemann/qtls-go1-16 v0.1.4/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/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= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= @@ -1366,6 +1407,7 @@ github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0 github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c/go.mod h1:0SQS9kMwD2VsyFEB++InYyBJroV/FRmBgcydeSUcJms= github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b/go.mod h1:lxPUiZwKoFL8DUUmalo2yJJUCxbPKtm8OKfqr2/FTNU= 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= @@ -1374,6 +1416,7 @@ github.com/minio/sha256-simd v0.0.0-20190328051042-05b4dd3047e5/go.mod h1:2FMWW+ github.com/minio/sha256-simd v0.1.0/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= github.com/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= +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= @@ -1394,9 +1437,12 @@ github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVq 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= github.com/mr-tron/base58 v1.1.3/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= +github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= +github.com/multiformats/go-base32 v0.0.4 h1:+qMh4a2f37b4xTNs6mqitDinryCI+tfO2dRVMN9mjSE= github.com/multiformats/go-base32 v0.0.4/go.mod h1:jNLFzjPZtp3aIARHbJRZIaPuspdH0J6q39uUM5pnABM= +github.com/multiformats/go-base36 v0.1.0 h1:JR6TyF7JjGd3m6FbLU2cOxhC0Li8z8dLNGQ89tUg4F4= github.com/multiformats/go-base36 v0.1.0/go.mod h1:kFGE83c6s80PklsHO9sRn2NCoffoRdUUOENyW/Vv6sM= github.com/multiformats/go-multiaddr v0.0.1/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= github.com/multiformats/go-multiaddr v0.0.2/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= @@ -1410,6 +1456,7 @@ 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 h1:Pq37uLx3hsyNlTDir7FZyU8+cFCTqd5y1KiM2IzOutI= github.com/multiformats/go-multiaddr v0.4.1/go.mod h1:3afI9HfVW8csiF8UZqtpYRiDyew8pRX7qLIGHu9FLuM= 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= @@ -1429,6 +1476,7 @@ 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-multicodec v0.2.0/go.mod h1:/y4YVwkfMyry5kFbMTbLJKErhycTIftytRV+llXdyS4= github.com/multiformats/go-multicodec v0.2.1-0.20210713081508-b421db6850ae/go.mod h1:qGGaQmioCDh+TeFOnxrbU0DaIPw8yFgAZgFG0V7p1qQ= @@ -1445,6 +1493,7 @@ 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 h1:D2qsyy1WVculJbGv69pWmQ36ehxFoA5NiIUr1OEs6qI= github.com/multiformats/go-multihash v0.0.16/go.mod h1:zhfEIgVnB/rPMfxgFw15ZmGoNaKyNUIE4IWHG/kC+Ag= 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= @@ -1456,6 +1505,7 @@ github.com/multiformats/go-multistream v0.2.2/go.mod h1:UIcnm7Zuo8HKG+HkWgfQsGL+ github.com/multiformats/go-varint v0.0.1/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= github.com/multiformats/go-varint v0.0.2/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= github.com/multiformats/go-varint v0.0.5/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= +github.com/multiformats/go-varint v0.0.6 h1:gk85QWKxh3TazbLxED/NlDVv8+q+ReFJk7Y2W/KhfNY= github.com/multiformats/go-varint v0.0.6/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= @@ -1541,6 +1591,7 @@ github.com/polydawn/refmt v0.0.0-20190221155625-df39d6c2d992/go.mod h1:uIp+gprXx github.com/polydawn/refmt v0.0.0-20190408063855-01bf1e26dd14/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= github.com/polydawn/refmt v0.0.0-20190807091052-3d65705ee9f1/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= github.com/polydawn/refmt v0.0.0-20190809202753-05966cbd336a/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= +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= @@ -1604,7 +1655,9 @@ github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR 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 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/rwcarlsen/goexif v0.0.0-20190401172101-9e8deecbddbd/go.mod h1:hPqNNc0+uJM6H+SuU8sEs5K5IQeKccPqeSjfgcKGgPk= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= @@ -1634,6 +1687,7 @@ github.com/shurcooL/notifications v0.0.0-20181007000457-627ab5aea122/go.mod h1:b github.com/shurcooL/octicon v0.0.0-20181028054416-fa4f57f9efb2/go.mod h1:eWdoE5JD4R5UVWDucdOPg1g2fqQRq78IQa9zlOV1vpQ= github.com/shurcooL/reactions v0.0.0-20181006231557-f2e0b4ca5b82/go.mod h1:TCR1lToEk4d2s07G3XGfz2QrgHXg4RJBvjrOozvoWfk= github.com/shurcooL/sanitized_anchor_name v0.0.0-20170918181015-86672fcb3f95/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/shurcooL/users v0.0.0-20180125191416-49c67e49c537/go.mod h1:QJTqeLYEDaXHZDBsXlPCDqdhQuJkuw4NOtaxYe3xii4= github.com/shurcooL/webdavfs v0.0.0-20170829043945-18c3829fa133/go.mod h1:hKmq5kWdCj2z2KEozexVbfEZIWiTjhE0+UjmZgPqehw= @@ -1658,6 +1712,7 @@ github.com/soundcloud/go-runit v0.0.0-20150630195641-06ad41a06c4a/go.mod h1:LeFC github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE= github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA= github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 h1:RC6RW7j+1+HkWaX/Yh71Ee5ZHaHYt7ZP4sQgUrm6cDU= github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= @@ -1703,8 +1758,10 @@ 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 h1:JTTnM6wKzdA0Jqodd966MVj4vWbbquZykeX1sKbe2C4= github.com/urfave/cli/v2 v2.2.0/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= @@ -1741,6 +1798,7 @@ github.com/whyrusleeping/cbor-gen v0.0.0-20200826160007-0b9f6c5fb163/go.mod h1:f 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-20210713220151-be142a5ae1a8 h1:TEv7MId88TyIqIUL4hbf9otOookIolMxlEbN0ro671Y= github.com/whyrusleeping/cbor-gen v0.0.0-20210713220151-be142a5ae1a8/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= 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= @@ -1899,6 +1957,7 @@ golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf/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-20210813211128-0a44fdfbc16e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210915214749-c084706c2272 h1:3erb+vDS8lU1sxfDHF4/hhWyaXnhIaO+7RgL4fDZORA= golang.org/x/crypto v0.0.0-20210915214749-c084706c2272/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= 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= @@ -1943,6 +2002,7 @@ 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.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180524181706-dfa909b99c79/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -2132,6 +2192,7 @@ golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 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-20210917161153-d61c044b1678 h1:J27LZFQBFoihqXoegpscI10HpjZ7B5WQLLKL2FZXQKw= golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/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= @@ -2218,11 +2279,13 @@ golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1-0.20210225150353-54dc8c5edb56/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= 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 h1:ouewzE6p+/VEB31YYnTbEJdi8pFqKp4P4n85vwo3DHA= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 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 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/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= From a9e22df76561730dab6c5bbe45a328ad597796e5 Mon Sep 17 00:00:00 2001 From: vyzo Date: Thu, 9 Dec 2021 15:14:48 +0200 Subject: [PATCH 037/393] update deps --- go.mod | 10 +- go.sum | 372 ++++++++++++++++++++++++++++++++++++--------------------- 2 files changed, 240 insertions(+), 142 deletions(-) diff --git a/go.mod b/go.mod index e5277fc0008..656bbaabb80 100644 --- a/go.mod +++ b/go.mod @@ -11,7 +11,6 @@ require ( github.com/StackExchange/wmi v1.2.1 // indirect github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d github.com/alecthomas/jsonschema v0.0.0-20200530073317-71f438968921 - github.com/bep/debounce v1.2.0 // indirect github.com/buger/goterm v1.0.3 github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e github.com/cockroachdb/pebble v0.0.0-20201001221639-879f3bfeef07 @@ -27,13 +26,14 @@ require ( github.com/elastic/gosigar v0.14.1 github.com/etclabscore/go-openrpc-reflect v0.0.36 github.com/fatih/color v1.13.0 + github.com/filecoin-project/dagstore v0.4.2 github.com/filecoin-project/filecoin-ffi v0.30.4-0.20200910194244-f640612a1a1f github.com/filecoin-project/go-address v0.0.6 github.com/filecoin-project/go-bitfield v0.2.4 github.com/filecoin-project/go-cbor-util v0.0.1 + github.com/filecoin-project/go-commp-utils v0.1.1-0.20210427191551-70bf140d31c7 github.com/filecoin-project/go-crypto v0.0.1 github.com/filecoin-project/go-data-transfer v1.11.7-0.20211207053937-e06a599f202a - github.com/filecoin-project/go-ds-versioning v0.1.0 // indirect 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.13.4 @@ -76,10 +76,9 @@ require ( github.com/ipfs/go-ds-leveldb v0.5.0 github.com/ipfs/go-ds-measure v0.1.0 github.com/ipfs/go-ds-pebble v0.0.2-0.20200921225637-ce220f8ac459 - github.com/ipfs/go-filestore v0.0.3 // indirect github.com/ipfs/go-fs-lock v0.0.6 github.com/ipfs/go-graphsync v0.11.0 - github.com/ipfs/go-ipfs-blockstore v1.1.0 + github.com/ipfs/go-ipfs-blockstore v1.1.1 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 @@ -132,7 +131,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/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9 // indirect github.com/polydawn/refmt v0.0.0-20201211092308-30ac6d18308e github.com/prometheus/client_golang v1.11.0 github.com/raulk/clock v1.1.0 @@ -143,7 +141,6 @@ require ( github.com/uber/jaeger-client-go v2.25.0+incompatible // indirect github.com/urfave/cli/v2 v2.2.0 github.com/whyrusleeping/bencher v0.0.0-20190829221104-bb6607aa8bba - github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11 // indirect github.com/whyrusleeping/cbor-gen v0.0.0-20210713220151-be142a5ae1a8 github.com/whyrusleeping/ledger-filecoin-go v0.9.1-0.20201010031517-c3dcc1bddce4 github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 @@ -158,7 +155,6 @@ require ( go.uber.org/fx v1.9.0 go.uber.org/multierr v1.7.0 go.uber.org/zap v1.19.1 - golang.org/x/exp v0.0.0-20210715201039-d37aa40e8013 // indirect golang.org/x/net v0.0.0-20210917221730-978cfadd31cf golang.org/x/sync v0.0.0-20210220032951-036812b2e83c golang.org/x/sys v0.0.0-20210917161153-d61c044b1678 diff --git a/go.sum b/go.sum index 76755f63e04..28900d54543 100644 --- a/go.sum +++ b/go.sum @@ -32,10 +32,6 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -contrib.go.opencensus.io/exporter/jaeger v0.1.0/go.mod h1:VYianECmuFPwU37O699Vc1GOcy+y8kOsfaxHRImmjbA= -contrib.go.opencensus.io/exporter/jaeger v0.2.1 h1:yGBYzYMewVL0yO9qqJv3Z5+IRhPdU7e9o/2oKpX4YvI= -contrib.go.opencensus.io/exporter/jaeger v0.2.1/go.mod h1:Y8IsLgdxqh1QxYxPC5IgXVmBaeLUeQFfBeBi9PbeZd0= -contrib.go.opencensus.io/exporter/prometheus v0.1.0/go.mod h1:cGFniUXGZlKRjzOyuZJ6mgB+PgBcCIa79kEKR8YCW+A= contrib.go.opencensus.io/exporter/prometheus v0.4.0 h1:0QfIkj9z/iVZgK31D9H9ohjjIDApI2GOPScCKwxedbs= contrib.go.opencensus.io/exporter/prometheus v0.4.0/go.mod h1:o7cosnyfuPVK0tB8q0QmaQNhGnptITnPQB+z1+qeFB0= dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU= @@ -58,7 +54,6 @@ 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= github.com/GeertJohan/go.incremental v1.0.0/go.mod h1:6fAjUhbVuX1KcMD3c8TEgVUqmo4seqhv0i0kdATSkM0= -github.com/GeertJohan/go.rice v1.0.0/go.mod h1:eH6gbSOAUv07dQuZVnBmoDP8mgsM1rtixis4Tib9if0= github.com/GeertJohan/go.rice v1.0.2 h1:PtRw+Tg3oa3HYwiDBZyvOJ8LdIyf6lAovJJtr7YOAYk= 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= @@ -80,7 +75,6 @@ github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= -github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= github.com/Stebalien/go-bitfield v0.0.1 h1:X3kbSSPUaJK60wV2hjOPZwmpljr6VGCqdq4cBLhbQBo= @@ -139,7 +133,6 @@ github.com/briandowns/spinner v1.11.1/go.mod h1:QOuQk7x+EaDASo80FEXwlwiA+j/PPIcX github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= github.com/btcsuite/btcd v0.0.0-20190523000118-16327141da8c/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= github.com/btcsuite/btcd v0.0.0-20190605094302-a0d1e3e36d50/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= -github.com/btcsuite/btcd v0.0.0-20190629003639-c26ffa870fd8/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= github.com/btcsuite/btcd v0.0.0-20190824003749-130ea5bddde3/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= github.com/btcsuite/btcd v0.21.0-beta/go.mod h1:ZSWyehm27aAuS9bvkATT+Xte3hjHZ+MRgMY/8NJ7K94= @@ -215,7 +208,6 @@ github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7 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= @@ -251,7 +243,6 @@ github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6ps github.com/dgraph-io/badger v1.6.1/go.mod h1:FRmFw3uxvcpa8zG3Rxs0th+hCLIuaQg8HlNV5bjgnuU= github.com/dgraph-io/badger v1.6.2 h1:mNw0qs90GVgGGWylh0umH5iag1j6n/PeJtNvL6KY/x8= github.com/dgraph-io/badger v1.6.2/go.mod h1:JW2yswe3V058sS0kZ2h/AXeDSqFjxnZcRrVH//y2UQE= -github.com/dgraph-io/badger/v2 v2.0.1-rc1.0.20200120142413-c3333a5a830e/go.mod h1:3KY8+bsP8wI0OEnQJAKpd4wIJW/Mm32yw2j/9FUVnIM= github.com/dgraph-io/badger/v2 v2.0.3/go.mod h1:3KY8+bsP8wI0OEnQJAKpd4wIJW/Mm32yw2j/9FUVnIM= github.com/dgraph-io/badger/v2 v2.2007.3 h1:Sl9tQWz92WCbVSe8pj04Tkqlm2boW+KAxd+XSs58SQI= github.com/dgraph-io/badger/v2 v2.2007.3/go.mod h1:26P/7fbL4kUZVEVKLAKXkBXKOydDmM2p1e+NhhnBCAE= @@ -282,7 +273,6 @@ github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5m github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= -github.com/elastic/go-sysinfo v1.3.0/go.mod h1:i1ZYdU10oLNfRzq4vq62BEwD2fH8KaWh6eh0ikPT9F0= github.com/elastic/go-sysinfo v1.7.0 h1:4vVvcfi255+8+TyQ7TYUTEK3A+G8v5FLE+ZKYL1z1Dg= github.com/elastic/go-sysinfo v1.7.0/go.mod h1:i1ZYdU10oLNfRzq4vq62BEwD2fH8KaWh6eh0ikPT9F0= github.com/elastic/go-windows v1.0.0 h1:qLURgZFkkrYyTTkvYpsZIgf83AUsdIHfvlJaqaZ7aSY= @@ -311,28 +301,17 @@ github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL 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/fd/go-nat v1.0.0/go.mod h1:BTBu/CKvMmOMUPkKVef1pngt2WFH/lg7E6yQnulfp6E= -github.com/filecoin-project/chain-validation v0.0.3/go.mod h1:NCEGFjcWRjb8akWFSOXvU6n2efkWIqAeOKU6o5WBGQw= +github.com/filecoin-project/dagstore v0.4.2 h1:Ae2+O1DhKCI1JbOZCBkqUksKYofdbRbjkS7OF0A6Jw0= github.com/filecoin-project/dagstore v0.4.2/go.mod h1:WY5OoLfnwISCk6eASSF927KKPqLPIlTwmG1qHpA08KY= -github.com/filecoin-project/dagstore v0.4.3 h1:yeFl6+2BRY1gOVp/hrZuFa24s7LY0Qqkqx/Gh8lidZs= -github.com/filecoin-project/dagstore v0.4.3/go.mod h1:dm/91AO5UaDd3bABFjg/5fmRH99vvpS7g1mykqvz6KQ= -github.com/filecoin-project/go-address v0.0.0-20191219011437-af739c490b4f/go.mod h1:rCbpXPva2NKF9/J4X6sr7hbKBgQCxyFtRj7KOZqoIms= -github.com/filecoin-project/go-address v0.0.0-20200107215422-da8eea2842b5/go.mod h1:SAOwJoakQ8EPjwNIsiakIQKsoKdkcbx8U3IapgCg9R0= -github.com/filecoin-project/go-address v0.0.2-0.20200218010043-eb9bb40ed5be/go.mod h1:SAOwJoakQ8EPjwNIsiakIQKsoKdkcbx8U3IapgCg9R0= github.com/filecoin-project/go-address v0.0.3/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= github.com/filecoin-project/go-address v0.0.5/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= github.com/filecoin-project/go-address v0.0.6 h1:DWQtj38ax+ogHwyH3VULRIoT8E6loyXqsk/p81xoY7M= github.com/filecoin-project/go-address v0.0.6/go.mod h1:7B0/5DA13n6nHkB8bbGx1gWzG/dbTsZ0fgOJVGsM3TE= -github.com/filecoin-project/go-amt-ipld v0.0.0-20191205011053-79efc22d6cdc/go.mod h1:KsFPWjF+UUYl6n9A+qbg4bjFgAOneicFZtDH/LQEX2U= -github.com/filecoin-project/go-amt-ipld/v2 v2.0.0/go.mod h1:PAZ5tvSfMfWE327osqFXKm7cBpCpBk2Nh0qKsJUmjjk= -github.com/filecoin-project/go-amt-ipld/v2 v2.0.1-0.20200131012142-05d80eeccc5e/go.mod h1:boRtQhzmxNocrMxOXo1NYn4oUc1NGvR8tEa79wApNXg= github.com/filecoin-project/go-amt-ipld/v2 v2.1.0 h1:t6qDiuGYYngDqaLc2ZUvdtAg4UNxPeOYaXhBWSNsVaM= github.com/filecoin-project/go-amt-ipld/v2 v2.1.0/go.mod h1:nfFPoGyX0CU9SkXX8EoCcSuHN1XcbN0c6KBh7yvP5fs= github.com/filecoin-project/go-amt-ipld/v3 v3.0.0/go.mod h1:Qa95YNAbtoVCTSVtX38aAC1ptBnJfPma1R/zZsKmx4o= github.com/filecoin-project/go-amt-ipld/v3 v3.1.0 h1:ZNJ9tEG5bE72vBWYiuh5bkxJVM3ViHNOmQ7qew9n6RE= github.com/filecoin-project/go-amt-ipld/v3 v3.1.0/go.mod h1:UjM2QhDFrrjD5s1CdnkJkat4ga+LqZBZgTMniypABRo= -github.com/filecoin-project/go-bitfield v0.0.0-20200309034705-8c7ac40bd550/go.mod h1:iodsLxOFZnqKtjj2zkgqzoGNrv6vUqj69AT/J8DKXEw= -github.com/filecoin-project/go-bitfield v0.0.0-20200416002808-b3ee67ec9060/go.mod h1:iodsLxOFZnqKtjj2zkgqzoGNrv6vUqj69AT/J8DKXEw= github.com/filecoin-project/go-bitfield v0.2.0/go.mod h1:CNl9WG8hgR5mttCnUErjcQjGvuiZjRqK9rHVBsQF4oM= github.com/filecoin-project/go-bitfield v0.2.3/go.mod h1:CNl9WG8hgR5mttCnUErjcQjGvuiZjRqK9rHVBsQF4oM= github.com/filecoin-project/go-bitfield v0.2.4 h1:uZ7MeE+XfM5lqrHJZ93OnhQKc/rveW8p9au0C68JPgk= @@ -340,35 +319,24 @@ github.com/filecoin-project/go-bitfield v0.2.4/go.mod h1:CNl9WG8hgR5mttCnUErjcQj github.com/filecoin-project/go-cbor-util v0.0.0-20191219014500-08c40a1e63a2/go.mod h1:pqTiPHobNkOVM5thSRsHYjyQfq7O5QSCMhvuu9JoDlg= github.com/filecoin-project/go-cbor-util v0.0.1 h1:E1LYZYTtjfAQwCReho0VXvbu8t3CYAVPiMx8EiV/VAs= github.com/filecoin-project/go-cbor-util v0.0.1/go.mod h1:pqTiPHobNkOVM5thSRsHYjyQfq7O5QSCMhvuu9JoDlg= +github.com/filecoin-project/go-commp-utils v0.1.1-0.20210427191551-70bf140d31c7 h1:U9Z+76pHCKBmtdxFV7JFZJj7OVm12I6dEKwtMVbq5p0= github.com/filecoin-project/go-commp-utils v0.1.1-0.20210427191551-70bf140d31c7/go.mod h1:6s95K91mCyHY51RPWECZieD3SGWTqIFLf1mPOes9l5U= -github.com/filecoin-project/go-commp-utils v0.1.2 h1:SKLRuGdx/6WlolaWKaUzzUYWGGePuARyO4guxOPxvt4= -github.com/filecoin-project/go-commp-utils v0.1.2/go.mod h1:6s95K91mCyHY51RPWECZieD3SGWTqIFLf1mPOes9l5U= 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-data-transfer v0.0.0-20191219005021-4accf56bd2ce/go.mod h1:b14UWxhxVCAjrQUYvVGrQRRsjAh79wXYejw9RbUcAww= -github.com/filecoin-project/go-data-transfer v0.2.1/go.mod h1:+0weLKevhT3EKyan4QzUSMlQOPgLNgT2j0CfEA1NLqI= -github.com/filecoin-project/go-data-transfer v0.5.3/go.mod h1:30ROzlBS8tbTkszmW9a6/N4oD5bIh6QRBCXC6lORuI8= github.com/filecoin-project/go-data-transfer v1.0.1/go.mod h1:UxvfUAY9v3ub0a21BSK9u3pB2aq30Y0KMsG+w9/ysyo= github.com/filecoin-project/go-data-transfer v1.11.4/go.mod h1:2MitLI0ebCkLlPKM7NRggP/t9d+gCcREUKkCKqWRCwU= -github.com/filecoin-project/go-data-transfer v1.11.7-0.20211119001436-c0dbfa5fae4d h1:otSEh99T0inzVe6pblKBG5tSeSqbQq4BCi5GKoh1J7I= -github.com/filecoin-project/go-data-transfer v1.11.7-0.20211119001436-c0dbfa5fae4d/go.mod h1:Qj+yDFsualZ4c7Ndh5Cl1SJK46QeVzNMdRnfAJdDuhw= github.com/filecoin-project/go-data-transfer v1.11.7-0.20211207053937-e06a599f202a h1:eSKovm26xNSTE/OFc+9zkt7sotMb0ixumKAO11BNMbs= github.com/filecoin-project/go-data-transfer v1.11.7-0.20211207053937-e06a599f202a/go.mod h1:tDrD2jLU2TpVhd+5B8iqBp0fQRV4lP80WZccKXugjYc= -github.com/filecoin-project/go-ds-versioning v0.0.0-20211119000042-d0cf38743fe7/go.mod h1:BVGOwN2WSCRKV3CDLFJ9u0L9M17WxHqw1KLA0l5ATnk= 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.0 h1:y/X6UksYTsK8TLCI7rttCKEvl8btmWxyFMEeeWGUxIQ= github.com/filecoin-project/go-ds-versioning v0.1.0/go.mod h1:mp16rb4i2QPmxBnmanUx8i/XANp+PFCCJWiAb+VW4/s= -github.com/filecoin-project/go-fil-commcid v0.0.0-20200208005934-2b8bd03caca5/go.mod h1:JbkIgFF/Z9BDlvrJO1FuKkaWsH673/UdFaiVS6uIHlA= github.com/filecoin-project/go-fil-commcid v0.0.0-20200716160307-8f644712406f/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commcid v0.1.0 h1:3R4ds1A9r6cr8mvZBfMYxTS88OqLYEo6roi+GiIeOh8= 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 v0.0.0-20200114015428-74d100f305f8/go.mod h1:c8NTjvFVy1Ud02mmGDjOiMeawY2t6ALfrrdvAB01FQc= -github.com/filecoin-project/go-fil-markets v0.1.3 h1:RSPSNJbrJ1limTXtlWEDKEgZVcFmbPCV48hM1Cm6F7U= -github.com/filecoin-project/go-fil-markets v0.1.3/go.mod h1:ByBBn4/X216eAmbYb/Pg1sKjfc5W6iIJXrArqznJ1Z8= github.com/filecoin-project/go-fil-markets v1.0.5-0.20201113164554-c5eba40d5335/go.mod h1:AJySOJC00JRWEZzRG2KsfUnqEf5ITXxeX09BE9N4f9c= github.com/filecoin-project/go-fil-markets v1.13.4 h1:NAu+ACelR2mYsj+yJ4iLu8FGqWK50OnU5VF8axkLsSc= github.com/filecoin-project/go-fil-markets v1.13.4/go.mod h1:aANjXD2XMHWnT2zWpyGWLsWLC24C4mHm0gRm85OpPWE= @@ -382,17 +350,12 @@ github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0/go.mod h1:bxmzgT8tmeVQA1/gvBw 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-multistore v0.0.3/go.mod h1:kaNqCC4IhU4B1uyr7YWFHd23TL4KM32aChS0jNkyUvQ= -github.com/filecoin-project/go-padreader v0.0.0-20200210211231-548257017ca6/go.mod h1:0HgYnrkeSU4lu1p+LEOeDpFsNBssa0OGGriWdA4hvaE= github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20/go.mod h1:mPn+LRRd5gEKNAtc+r3ScpW2JRU/pj4NBKdADYWHiak= github.com/filecoin-project/go-padreader v0.0.0-20210723183308-812a16dc01b1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= github.com/filecoin-project/go-padreader v0.0.1 h1:8h2tVy5HpoNbr2gBRr+WD6zV6VD6XHig+ynSGJg8ZOs= github.com/filecoin-project/go-padreader v0.0.1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= -github.com/filecoin-project/go-paramfetch v0.0.0-20200102181131-b20d579f2878/go.mod h1:40kI2Gv16mwcRsHptI3OAV4nlOEU7wVDc4RgMylNFjU= -github.com/filecoin-project/go-paramfetch v0.0.1/go.mod h1:fZzmf4tftbwf9S37XRifoJlz7nCjRdIrMGLR07dKLCc= github.com/filecoin-project/go-paramfetch v0.0.2 h1:a6W3Ij6CKhwHYYlx+5mqvBIyw4CabZH2ojdEaoAZ6/g= github.com/filecoin-project/go-paramfetch v0.0.2/go.mod h1:1FH85P8U+DUEmWk1Jkw3Bw7FrwTVUNHk/95PSPG+dts= -github.com/filecoin-project/go-sectorbuilder v0.0.1/go.mod h1:3OZ4E3B2OuwhJjtxR4r7hPU9bCfB+A+hm4alLEsaeDc= -github.com/filecoin-project/go-sectorbuilder v0.0.2-0.20200203173614-42d67726bb62/go.mod h1:jNGVCDihkMFnraYVLH1xl4ceZQVxx/u4dOORrTKeRi0= github.com/filecoin-project/go-state-types v0.0.0-20200903145444-247639ffa6ad/go.mod h1:IQ0MBPnonv35CJHtWSN3YY1Hz2gkPru1Q9qoaYLxx9I= github.com/filecoin-project/go-state-types v0.0.0-20200904021452-1883f36ca2f4/go.mod h1:IQ0MBPnonv35CJHtWSN3YY1Hz2gkPru1Q9qoaYLxx9I= github.com/filecoin-project/go-state-types v0.0.0-20200928172055-2df22083d8ab/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= @@ -402,23 +365,15 @@ github.com/filecoin-project/go-state-types v0.1.1-0.20210506134452-99b279731c48/ 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.1 h1:LR260vya4p++atgf256W6yV3Lxl5mKrBFcEZePWQrdg= github.com/filecoin-project/go-state-types v0.1.1/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= -github.com/filecoin-project/go-statemachine v0.0.0-20200226041606-2074af6d51d9/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig= -github.com/filecoin-project/go-statemachine v0.0.0-20200714194326-a77c3ae20989/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig= github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig= github.com/filecoin-project/go-statemachine v1.0.1 h1:LQ60+JDVjMdLxXmVFM2jjontzOYnfVE7u02CXV3WKSw= github.com/filecoin-project/go-statemachine v1.0.1/go.mod h1:jZdXXiHa61n4NmgWFG4w8tnqgvZVHYbJ3yW7+y8bF54= github.com/filecoin-project/go-statestore v0.1.0/go.mod h1:LFc9hD+fRxPqiHiaqUEZOinUJB4WARkRfNl10O7kTnI= github.com/filecoin-project/go-statestore v0.1.1/go.mod h1:LFc9hD+fRxPqiHiaqUEZOinUJB4WARkRfNl10O7kTnI= -github.com/filecoin-project/go-statestore v0.1.2-0.20211118230537-43557b6c5ce5 h1:xH09S8C+VhZCTmTkdudGm/cN5a8teKE+PXXvbPsXTO0= -github.com/filecoin-project/go-statestore v0.1.2-0.20211118230537-43557b6c5ce5/go.mod h1:8sjBYbS35HwPzct7iT4lIXjLlYyPor80aU7t7a/Kspo= +github.com/filecoin-project/go-statestore v0.2.0 h1:cRRO0aPLrxKQCZ2UOQbzFGn4WDNdofHZoGPjfNaAo5Q= github.com/filecoin-project/go-statestore v0.2.0/go.mod h1:8sjBYbS35HwPzct7iT4lIXjLlYyPor80aU7t7a/Kspo= github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b h1:fkRZSPrYpk42PV3/lIXiL0LHetxde7vyYYvSsttQtfg= github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b/go.mod h1:Q0GQOBtKf1oE10eSXSlhN45kDBdGvEcVOqMiffqX+N8= -github.com/filecoin-project/lotus v0.2.10/go.mod h1:om5PQA9ZT0lf16qI7Fz/ZGLn4LDCMqPC8ntZA9uncRE= -github.com/filecoin-project/sector-storage v0.0.0-20200411000242-61616264b16d/go.mod h1:/yueJueMh0Yc+0G1adS0lhnedcSnjY86EjKsA20+DVY= -github.com/filecoin-project/specs-actors v0.0.0-20200210130641-2d1fbd8672cf/go.mod h1:xtDZUB6pe4Pksa/bAJbJ693OilaC5Wbot9jMhLm3cZA= -github.com/filecoin-project/specs-actors v0.0.0-20200409043918-e569f4a2f504/go.mod h1:mdJraXq5vMy0+/FqVQIrnNlpQ/Em6zeu06G/ltQ0/lA= -github.com/filecoin-project/specs-actors v0.3.0/go.mod h1:nQYnFbQ7Y0bHZyq6HDEuVlCPR+U3z5Q3wMOQ+2aiV+Y= github.com/filecoin-project/specs-actors v0.9.4/go.mod h1:BStZQzx5x7TmCkLv0Bpa07U6cPKol6fd3w9KjMPZ6Z4= github.com/filecoin-project/specs-actors v0.9.12/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= @@ -439,7 +394,6 @@ github.com/filecoin-project/specs-actors/v5 v5.0.4 h1:OY7BdxJWlUfUFXWV/kpNBYGXNP github.com/filecoin-project/specs-actors/v5 v5.0.4/go.mod h1:5BAKRAMsOOlD8+qCw4UvT/lTLInCJ3JwOWZbX8Ipwq4= github.com/filecoin-project/specs-actors/v6 v6.0.1 h1:laxvHNsvrq83Y9n+W7znVCePi3oLyRf0Rkl4jFO8Wew= github.com/filecoin-project/specs-actors/v6 v6.0.1/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= -github.com/filecoin-project/specs-storage v0.0.0-20200410185809-9fbaaa08f275/go.mod h1:xJ1/xl9+8zZeSSSFmDC3Wr6uusCTxyYPI0VeNVSFmPE= github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506 h1:Ur/l2+6qN+lQiqjozWWc5p9UDaAMDZKTlDS98oRnlIw= github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506/go.mod h1:nJRRM7Aa9XVvygr3W9k6xGF46RWzr2zxF/iGoAIfA/g= github.com/filecoin-project/test-vectors/schema v0.0.5 h1:w3zHQhzM4pYxJDl21avXjOKBLF8egrvwUwjpT8TquDg= @@ -459,7 +413,6 @@ github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/gbrlsnchs/jwt/v3 v3.0.0-beta.1/go.mod h1:0eHX/BVySxPc6SE2mZRoppGq7qcEagxdmQnA3dzork8= 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= @@ -490,7 +443,6 @@ github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA= 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-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM= 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= @@ -648,11 +600,8 @@ github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go 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/gxed/pubsub v0.0.0-20180201040156-26ebdf44f824/go.mod h1:OiEWyHgK+CWrmOlVquHaIK1vhpUJydC9m0Je6mhaiNE= github.com/hako/durafmt v0.0.0-20200710122514-c0fb7b4da026 h1:BpJ2o0OR5FV7vrkDYfXYVJQeMNWa8RhklZOpW2ITAIQ= github.com/hako/durafmt v0.0.0-20200710122514-c0fb7b4da026/go.mod h1:5Scbynm8dF1XAPwIwkGPqzkM/shndPm79Jd1003hTjE= -github.com/hannahhoward/cbor-gen-for v0.0.0-20191216214420-3e450425c40c/go.mod h1:WVPCl0HO/0RAL5+vBH2GMxBomlxBF70MAS78+Lu1//k= -github.com/hannahhoward/cbor-gen-for v0.0.0-20191218204337-9ab7b1bcc099/go.mod h1:WVPCl0HO/0RAL5+vBH2GMxBomlxBF70MAS78+Lu1//k= github.com/hannahhoward/cbor-gen-for v0.0.0-20200817222906-ea96cece81f1 h1:F9k+7wv5OIk1zcq23QpdiL0hfDuXPjuOmMNaC6fgQ0Q= github.com/hannahhoward/cbor-gen-for v0.0.0-20200817222906-ea96cece81f1/go.mod h1:jvfsLIxk0fY/2BKSQ1xf2406AKA5dwMmKKv0ADcOfN8= github.com/hannahhoward/go-pubsub v0.0.0-20200423002714-8d62886cc36e h1:3YKHER4nmd7b5qy5t0GWDTwSn4OyRgfAXSmo6VnryBY= @@ -701,7 +650,6 @@ github.com/hodgesds/perf-utils v0.0.8/go.mod h1:F6TfvsbtrF88i++hou29dTXlI2sfsJv+ 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 v0.0.0-20180415215157-1395d1447324/go.mod h1:MZ2ZmwcBpvOoJ22IJsc7va19ZwoheaBk43rKg12SKag= github.com/huin/goupnp v1.0.0/go.mod h1:n9v9KO1tAxYH82qOn+UTIFQDmx5n1Zxd/ClZDMX7Bnc= github.com/huin/goupnp v1.0.2 h1:RfGLP+h3mvisuWEyybxNq5Eft3NWhHLPeUN72kpKZoI= github.com/huin/goupnp v1.0.2/go.mod h1:0dxJBVBHqTMjIUMkESDTNgOOx/Mw5wYIfyFmdzSamkM= @@ -716,7 +664,6 @@ github.com/icza/backscanner v0.0.0-20210726202459-ac2ffc679f94/go.mod h1:GYeBD1C github.com/icza/mighty v0.0.0-20180919140131-cfd07d671de6 h1:8UsGZ2rr2ksmEru6lToqnXgA8Mz1DP11X4zSJ159C3k= github.com/icza/mighty v0.0.0-20180919140131-cfd07d671de6/go.mod h1:xQig96I1VNBDIWGCdTt54nHt6EeI639SmHycLYL7FkA= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/influxdata/influxdb1-client v0.0.0-20190809212627-fc22c7df067e/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab h1:HqW4xhhynfjrtEiiSGcQUd6vrK23iMam1FO8rI7mwig= github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= @@ -726,7 +673,6 @@ github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyq 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.3/go.mod h1:YEQlFy0kkxops5Vy+OxWdRSEZIoS7I7KDIwoa5Chkps= 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 h1:721YAEDBnLIrvcIMkCHCdqp34hA8jwL9yKMkyJpSpco= @@ -737,14 +683,11 @@ 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.3-0.20190908200855-f22eea50656c/go.mod h1:t+411r7psEUhLueM8C7aPA7cxCclv4O3VsUVxt9kz2I= github.com/ipfs/go-blockservice v0.1.3/go.mod h1:OTZhFpkgY48kNzbgyvcexW9cHrpjBYIjSR0KoDOFOLU= github.com/ipfs/go-blockservice v0.1.4-0.20200624145336-a978cec6e834/go.mod h1:OTZhFpkgY48kNzbgyvcexW9cHrpjBYIjSR0KoDOFOLU= github.com/ipfs/go-blockservice v0.1.5/go.mod h1:yLk8lBJCBRWRqerqCSVi3cE/Dncdt3vGC/PJMVKhLTY= github.com/ipfs/go-blockservice v0.2.1 h1:NJ4j/cwEfIg60rzAWcCIxRtOwbf6ZPK49MewNxObCPQ= github.com/ipfs/go-blockservice v0.2.1/go.mod h1:k6SiwmgyYgs4M/qt+ww6amPeUH9EISLRBnvUurKJhi8= -github.com/ipfs/go-car v0.0.3-0.20191203022317-23b0a85fd1b1/go.mod h1:rmd887mJxQRDfndfDEY3Liyx8gQVyfFFRSHdsnDSAlk= -github.com/ipfs/go-car v0.0.3-0.20200121013634-f188c0e24291/go.mod h1:AG6sBpd2PWMccpAG7XLFBBQ/4rfBEtzUNeO2GSMesYk= 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= @@ -770,10 +713,9 @@ github.com/ipfs/go-datastore v0.4.1/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13X 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.4.6/go.mod h1:XSipLSc64rFKSFRFGo1ecQl+WhYce3K7frtpHkyPFUc= github.com/ipfs/go-datastore v0.4.7-0.20211013204805-28a3721c2e66/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= -github.com/ipfs/go-datastore v0.5.0 h1:rQicVCEacWyk4JZ6G5bD9TKR7lZEG1MWcG7UdWYrFAU= 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-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk= github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= @@ -786,7 +728,6 @@ github.com/ipfs/go-ds-badger v0.2.6/go.mod h1:02rnztVKA4aZwDuaRPTf8mpqcKmXP7mLl6 github.com/ipfs/go-ds-badger v0.2.7/go.mod h1:02rnztVKA4aZwDuaRPTf8mpqcKmXP7mLl6JPxd14JHA= github.com/ipfs/go-ds-badger v0.3.0 h1:xREL3V0EH9S219kFFueOYJJTcjgNSZ2HY1iSvN7U1Ro= github.com/ipfs/go-ds-badger v0.3.0/go.mod h1:1ke6mXNqeV8K3y5Ak2bAA0osoTfmxUdupVCGm4QUIek= -github.com/ipfs/go-ds-badger2 v0.0.0-20200123200730-d75eb2678a5d/go.mod h1:sTQFaWUoW0OvhXzfHnQ9j39L6fdlqDkptDYcpC1XrYE= github.com/ipfs/go-ds-badger2 v0.1.0/go.mod h1:pbR1p817OZbdId9EvLOhKBgUVTM3BMCSTan78lDDVaw= github.com/ipfs/go-ds-badger2 v0.1.2-0.20211119002906-7318f1b76158 h1:/8az/zYn1icEwiHAmpR11Io+8hrlICU10J+Ft0zSiog= github.com/ipfs/go-ds-badger2 v0.1.2-0.20211119002906-7318f1b76158/go.mod h1:3FtQmDv6fMubygEfU43bsFelYpIiXX/XEYA54l9eCwg= @@ -800,58 +741,66 @@ github.com/ipfs/go-ds-measure v0.1.0 h1:vE4TyY4aeLeVgnnPBC5QzKIjKrqzha0NCujTfgvV github.com/ipfs/go-ds-measure v0.1.0/go.mod h1:1nDiFrhLlwArTME1Ees2XaBOl49OoCgd2A3f8EchMSY= github.com/ipfs/go-ds-pebble v0.0.2-0.20200921225637-ce220f8ac459 h1:W3YMLEvOXqdW+sYMiguhWP6txJwQvIQqhvpU8yAMGQs= github.com/ipfs/go-ds-pebble v0.0.2-0.20200921225637-ce220f8ac459/go.mod h1:oh4liWHulKcDKVhCska5NLelE3MatWl+1FwSz3tY91g= -github.com/ipfs/go-filestore v0.0.2/go.mod h1:KnZ41qJsCt2OX2mxZS0xsK3Psr0/oB93HMMssLujjVc= -github.com/ipfs/go-filestore v0.0.3/go.mod h1:dvXRykFzyyXN2CdNlRGzDAkXMDPyI+D7JE066SiKLSE= github.com/ipfs/go-filestore v1.0.0 h1:QR7ekKH+q2AGiWDc7W2Q0qHuYSRZGUJqUn0GsegEPb0= github.com/ipfs/go-filestore v1.0.0/go.mod h1:/XOCuNtIe2f1YPbiXdYvD0BKLA0JR1MgPiFOdcuu9SM= -github.com/ipfs/go-fs-lock v0.0.1/go.mod h1:DNBekbboPKcxs1aukPSaOtFA3QfSdi5C855v0i9XJ8Y= github.com/ipfs/go-fs-lock v0.0.6 h1:sn3TWwNVQqSeNjlWy6zQ1uUGAZrV3hPOyEA6y1/N2a0= github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28L7zESmM= -github.com/ipfs/go-graphsync v0.0.4/go.mod h1:6UACBjfOXEa8rQL3Q/JpZpWS0nZDCLx134WUkjrmFpQ= -github.com/ipfs/go-graphsync v0.0.6-0.20200504202014-9d5f2c26a103/go.mod h1:jMXfqIEDFukLPZHqDPp8tJMbHO9Rmeb9CEGevngQbmE= github.com/ipfs/go-graphsync v0.1.0/go.mod h1:jMXfqIEDFukLPZHqDPp8tJMbHO9Rmeb9CEGevngQbmE= github.com/ipfs/go-graphsync v0.4.2/go.mod h1:/VmbZTUdUMTbNkgzAiCEucIIAU3BkLE2cZrDCVUhyi0= github.com/ipfs/go-graphsync v0.4.3/go.mod h1:mPOwDYv128gf8gxPFgXnz4fNrSYPsWyqisJ7ych+XDY= github.com/ipfs/go-graphsync v0.10.0/go.mod h1:cKIshzTaa5rCZjryH5xmSKZVGX9uk1wvwGvz2WEha5Y= -github.com/ipfs/go-graphsync v0.10.6-0.20211119000532-c416dad3bd56/go.mod h1:/wC15/mR2JyjVrO86tfZLLuhyvop0fLU+ewhYLkdgLM= -github.com/ipfs/go-graphsync v0.10.6/go.mod h1:tQMjWNDD/vSz80YLT/VvzrUmy58aF9lR1uCwSLzjWzI= +github.com/ipfs/go-graphsync v0.11.0 h1:PiiD5CnoC3xEHMW8d6uBGqGcoTwiMB5d9CORIEyF6iA= github.com/ipfs/go-graphsync v0.11.0/go.mod h1:wC+c8vGVjAHthsVIl8LKr37cUra2GOaMYcQNNmMxDqE= -github.com/ipfs/go-hamt-ipld v0.0.14-0.20191218031521-b2c774a54db1/go.mod h1:8yRx0xLUps1Xq8ZDnIwIVdQRp7JjA55gGvCiRHT91Vk= -github.com/ipfs/go-hamt-ipld v0.0.15-0.20200131012125-dd88a59d3f2e/go.mod h1:9aQJu/i/TaRDW6jqB5U217dLIDopn50wxLdHXM2CTfE= github.com/ipfs/go-hamt-ipld v0.1.1/go.mod h1:1EZCr2v0jlCnhpa+aZ0JZYp8Tt2w16+JJOAVz17YcDk= 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.1/go.mod h1:8gZOgIN5e+Xdg2YSGdwTTRbguSVjYyosIDRQCY8E9QM= github.com/ipfs/go-ipfs-blockstore v0.1.4/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.0/go.mod h1:knLVdhVU9L7CC4T+T4nvGdeUIPAXlnd9zmXfp+9MIjU= +github.com/ipfs/go-ipfs-blockstore v1.0.1/go.mod h1:MGNZlHNEnR4KGgPHM3/k8lBySIOK2Ve+0KjZubKlaOE= +github.com/ipfs/go-ipfs-blockstore v1.0.3/go.mod h1:MGNZlHNEnR4KGgPHM3/k8lBySIOK2Ve+0KjZubKlaOE= +github.com/ipfs/go-ipfs-blockstore v1.0.4/go.mod h1:uL7/gTJ8QIZ3MtA3dWf+s1a0U3fJy2fcEZAsovpRp+w= github.com/ipfs/go-ipfs-blockstore v1.1.0/go.mod h1:5QDUApRqpgPcfGstCxYeMnjt/DYQtXXdJVCvxHHuWVk= +github.com/ipfs/go-ipfs-blockstore v1.1.1 h1:a4koS3l+Fzl43LAAn51/N+Yn4AjCX4AGvoZLqqkrD/g= +github.com/ipfs/go-ipfs-blockstore v1.1.1/go.mod h1:w51tNR9y5+QXB0wkNcHt4O2aSZjTdqaEWaQdSxEyUOY= +github.com/ipfs/go-ipfs-blocksutil v0.0.1 h1:Eh/H4pc1hsvhzsQoMEP3Bke/aW5P5rVM1IWFJMcGIPQ= github.com/ipfs/go-ipfs-blocksutil v0.0.1/go.mod h1:Yq4M86uIOmxmGPUHv/uI7uKqZNtLb449gwKqXjIsnRk= 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.3.0 h1:mi9oYrSCox5aBhutqAYqw6/9crlyGbw4E/aJtwS4zI4= github.com/ipfs/go-ipfs-cmds v0.3.0/go.mod h1:ZgYiWVnCk43ChwoH8hAmI1IRbuVtq3GSTHwtRB/Kqhk= +github.com/ipfs/go-ipfs-config v0.5.3 h1:3GpI/xR9FoJNTjU6YvCMRbYyEi0dBVY5UtlUTcNRlSA= github.com/ipfs/go-ipfs-config v0.5.3/go.mod h1:nSLCFtlaL+2rbl3F+9D4gQZQbT1LjRKx7TJg/IHz6oM= github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= +github.com/ipfs/go-ipfs-delay v0.0.1 h1:r/UXYyRcddO6thwOnhiznIAiSvxMECGgtv35Xs1IeRQ= 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= +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-offline v0.0.1/go.mod h1:WhHSFCVYX36H/anEKQboAzpUws3x7UeEGkzQc3iNkM0= +github.com/ipfs/go-ipfs-exchange-offline v0.1.1 h1:mEiXWdbMN6C7vtDG21Fphx8TGCbZPpQnz/496w/PL4g= github.com/ipfs/go-ipfs-exchange-offline v0.1.1/go.mod h1:vTiBRIbzSwDD0OWm+i3xeT0mO7jG2cbJYatp3HPk5XY= 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.7/go.mod h1:wiN/jSG8FKyk7N0WyctKSvq3ljIa2NNTiZB55kpTdOs= github.com/ipfs/go-ipfs-files v0.0.8/go.mod h1:wiN/jSG8FKyk7N0WyctKSvq3ljIa2NNTiZB55kpTdOs= +github.com/ipfs/go-ipfs-files v0.0.9 h1:OFyOfmuVDu9c5YtjSDORmwXzE6fmZikzZpzsnNkgFEg= github.com/ipfs/go-ipfs-files v0.0.9/go.mod h1:aFv2uQ/qxWpL/6lidWvnSQmaVqCrf0TBGoUr+C1Fo84= -github.com/ipfs/go-ipfs-flags v0.0.1/go.mod h1:RnXBb9WV53GSfTrSDVK61NLTFKvWc60n+K9EgCDh+rA= +github.com/ipfs/go-ipfs-http-client v0.0.6 h1:k2QllZyP7Fz5hMgsX5hvHfn1WPG9Ngdy5WknQ7JNhBM= github.com/ipfs/go-ipfs-http-client v0.0.6/go.mod h1:8e2dQbntMZKxLfny+tyXJ7bJHZFERp/2vyzZdvkeLMc= +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-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= github.com/ipfs/go-ipfs-routing v0.2.1/go.mod h1:xiNNiwgjmLqPS1cimvAw6EyB9rkVDbiocA4yY+wRNLM= github.com/ipfs/go-ipfs-util v0.0.1/go.mod h1:spsl5z8KUnrve+73pOhSVZND1SIxPW5RyBCNzQxlJBc= github.com/ipfs/go-ipfs-util v0.0.2 h1:59Sswnk1MFaiq+VcaknX7aYEyGyGDAA73ilhEK2POp8= @@ -859,13 +808,16 @@ github.com/ipfs/go-ipfs-util v0.0.2/go.mod h1:CbPtkWJzjLdEcezDns2XYaehFVNXG9zrdr github.com/ipfs/go-ipld-cbor v0.0.2/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= github.com/ipfs/go-ipld-cbor v0.0.3/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= github.com/ipfs/go-ipld-cbor v0.0.4/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= +github.com/ipfs/go-ipld-cbor v0.0.5-0.20200204214505-252690b78669/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= github.com/ipfs/go-ipld-cbor v0.0.5 h1:ovz4CHKogtG2KB/h1zUp5U0c/IzZrL435rCh5+K/5G8= github.com/ipfs/go-ipld-cbor v0.0.5/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= github.com/ipfs/go-ipld-format v0.0.1/go.mod h1:kyJtbkDALmFHv3QR6et67i35QzO3S0dCDnkOJhcZkms= github.com/ipfs/go-ipld-format v0.0.2/go.mod h1:4B6+FM2u9OJ9zCV+kSbgFAZlOrv1Hqbf0INGQgiKf9k= github.com/ipfs/go-ipld-format v0.2.0 h1:xGlJKkArkmBvowr+GMCX0FEZtkro71K1AwiKnL37mwA= github.com/ipfs/go-ipld-format v0.2.0/go.mod h1:3l3C1uKoadTPbeNfrDi+xMInYKlx2Cvg1BuydPSdzQs= +github.com/ipfs/go-ipld-legacy v0.1.0 h1:wxkkc4k8cnvIGIjPO0waJCe7SHEyFgl+yQdafdjGrpA= github.com/ipfs/go-ipld-legacy v0.1.0/go.mod h1:86f5P/srAmh9GcIcWQR9lfFLZPrIyyXQeVlOWeeWEuI= +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-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= github.com/ipfs/go-log v1.0.0/go.mod h1:JO7RzlMK6rA+CIxFMLOuB6Wf5b81GDiKElL7UPSIKjA= @@ -873,6 +825,7 @@ github.com/ipfs/go-log v1.0.1/go.mod h1:HuWlQttfN6FWNHRhlY5yMk/lW7evQC0HHGOxEwMR github.com/ipfs/go-log v1.0.2/go.mod h1:1MNjMxe0u6xvJZgeqbJ8vdo2TKaGwZ1a0Bpza+sr2Sk= github.com/ipfs/go-log v1.0.3/go.mod h1:OsLySYkwIbiSUR/yBTdv1qPtcE4FW3WPWk/ewz9Ru+A= github.com/ipfs/go-log v1.0.4/go.mod h1:oDCg2FkjogeFOhqqb+N39l2RpTNPL6F/StPkB3kPgcs= +github.com/ipfs/go-log v1.0.5 h1:2dOuUCB1Z7uoczMWgAyDck5JLb72zHzrMnGnCNNbvY8= github.com/ipfs/go-log v1.0.5/go.mod h1:j0b8ZoR+7+R99LD9jZ6+AJsrzkPbSXbZfGakb5JPtIo= github.com/ipfs/go-log/v2 v2.0.1/go.mod h1:O7P1lJt27vWHhOwQmcFEvlmo49ry2VY2+JfBWFaa9+0= github.com/ipfs/go-log/v2 v2.0.2/go.mod h1:O7P1lJt27vWHhOwQmcFEvlmo49ry2VY2+JfBWFaa9+0= @@ -880,32 +833,42 @@ github.com/ipfs/go-log/v2 v2.0.3/go.mod h1:O7P1lJt27vWHhOwQmcFEvlmo49ry2VY2+JfBW github.com/ipfs/go-log/v2 v2.0.5/go.mod h1:eZs4Xt4ZUJQFM3DlanGhy7TkwwawCZcSByscwkWG+dw= github.com/ipfs/go-log/v2 v2.0.8/go.mod h1:eZs4Xt4ZUJQFM3DlanGhy7TkwwawCZcSByscwkWG+dw= github.com/ipfs/go-log/v2 v2.1.1/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHntrv9KM= +github.com/ipfs/go-log/v2 v2.1.2-0.20200626104915-0016c0b4b3e4/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHntrv9KM= github.com/ipfs/go-log/v2 v2.1.2/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHntrv9KM= github.com/ipfs/go-log/v2 v2.1.3/go.mod h1:/8d0SH3Su5Ooc31QlL1WysJhvyOTDCjcCZ9Axpmri6g= +github.com/ipfs/go-log/v2 v2.3.0 h1:31Re/cPqFHpsRHgyVwjWADPoF0otB1WrjTy8ZFYwEZU= github.com/ipfs/go-log/v2 v2.3.0/go.mod h1:QqGoj30OTpnKaG/LKTGTxoP2mmQtjVMEnK72gynbe/g= github.com/ipfs/go-merkledag v0.0.6/go.mod h1:QYPdnlvkOg7GnQRofu9XZimC5ZW5Wi3bKys/4GQQfto= -github.com/ipfs/go-merkledag v0.1.0/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= 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.1/go.mod h1:fvkZNNZixVW6cKSZ/JfLlON5OlgTXNdRLz0p6QG/I2M= github.com/ipfs/go-merkledag v0.3.2/go.mod h1:fvkZNNZixVW6cKSZ/JfLlON5OlgTXNdRLz0p6QG/I2M= +github.com/ipfs/go-merkledag v0.5.1 h1:tr17GPP5XtPhvPPiWtu20tSGZiZDuTaJRXBLcr79Umk= github.com/ipfs/go-merkledag v0.5.1/go.mod h1:cLMZXx8J08idkp5+id62iVftUQV+HlYJ3PIhDfZsjA4= +github.com/ipfs/go-metrics-interface v0.0.1 h1:j+cpbjYvu4R8zbleSs36gvB7jR+wsL2fGD6n0jO4kdg= 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-path v0.0.7 h1:H06hKMquQ0aYtHiHryOMLpQC1qC3QwXwkahcEVD51Ho= github.com/ipfs/go-path v0.0.7/go.mod h1:6KTKmeRnBXgqrTvzFrPV3CamxcgvXX/4z79tfAd2Sno= 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.6.0/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68ow0Rrb04donIU= +github.com/ipfs/go-peertaskqueue v0.7.0 h1:VyO6G4sbzX80K58N60cCaHsSsypbUNs1GjO5seGNsQ0= github.com/ipfs/go-peertaskqueue v0.7.0/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68ow0Rrb04donIU= 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 h1:gq3U3T2vh8x6tXhfo3uSO3n+2z4yW0tYtNgVP/3sIyA= github.com/ipfs/go-unixfs v0.2.6/go.mod h1:GTTzQvaZsTZARdNkkdjDKFFnBhmO3e5mIM1PkH/x4p0= +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 h1:+mUiamyHIwedqP8ZgbCIwpy40oX7QcXUbo4CZOeJVJg= github.com/ipfs/interface-go-ipfs-core v0.4.0/go.mod h1:UJBcU6iNennuI05amq3FQ7g0JHUkibHFAfhfUIy927o= +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/ipld/go-car v0.1.0/go.mod h1:RCWzaUh2i4mOEkB3W45Vc+9jnS/M6Qay5ooytiBHl3g= github.com/ipld/go-car v0.1.1-0.20200923150018-8cdef32e2da4/go.mod h1:xrMEcuSq+D1vEwl+YAXsg/JfA98XGpXDwnkIL4Aimqw= @@ -913,47 +876,61 @@ github.com/ipld/go-car v0.1.1-0.20201119040415-11b6074b6d4d/go.mod h1:2Gys8L8MJ6 github.com/ipld/go-car v0.3.2-0.20211001225732-32d0d9933823 h1:8JMSJ0k71fU9lIUrpVwEdoX4KoxiTEX8cZG97v/hTDw= github.com/ipld/go-car v0.3.2-0.20211001225732-32d0d9933823/go.mod h1:jSlTph+i/q1jLFoiKKeN69KGG0fXpwrcD0izu5C1Tpo= github.com/ipld/go-car/v2 v2.0.0-beta1.0.20210721090610-5a9d1b217d25/go.mod h1:I2ACeeg6XNBe5pdh5TaR7Ambhfa7If9KXxmXgZsYENU= -github.com/ipld/go-car/v2 v2.0.2/go.mod h1:I2ACeeg6XNBe5pdh5TaR7Ambhfa7If9KXxmXgZsYENU= github.com/ipld/go-car/v2 v2.1.0 h1:t8R/WXUSkfu1K1gpPk76mytCxsEdMjGcMIgpOq3/Cnw= github.com/ipld/go-car/v2 v2.1.0/go.mod h1:Xr6GwkDhv8dtOtgHzOynAkIOg0t0YiPc5DxBPppWqZA= github.com/ipld/go-codec-dagpb v1.2.0/go.mod h1:6nBN7X7h8EOsEejZGqC7tej5drsdBAXbMHyBT+Fne5s= +github.com/ipld/go-codec-dagpb v1.3.0 h1:czTcaoAuNNyIYWs6Qe01DJ+sEX7B+1Z0LcXjSatMGe8= github.com/ipld/go-codec-dagpb v1.3.0/go.mod h1:ga4JTU3abYApDC3pZ00BC2RSvC3qfBb9MSJkMLSwnhA= -github.com/ipld/go-ipld-prime v0.0.1/go.mod h1:bDDSvVz7vaK12FNvMeRYnpRFkSUPNQOiCYQezMD/P3w= github.com/ipld/go-ipld-prime v0.0.2-0.20191108012745-28a82f04c785/go.mod h1:bDDSvVz7vaK12FNvMeRYnpRFkSUPNQOiCYQezMD/P3w= github.com/ipld/go-ipld-prime v0.0.2-0.20200428162820-8b59dc292b8e/go.mod h1:uVIwe/u0H4VdKv3kaN1ck7uCb6yD9cFLS9/ELyXbsw8= +github.com/ipld/go-ipld-prime v0.5.1-0.20200828233916-988837377a7f/go.mod h1:0xEgdD6MKbZ1vF0GC+YcR/C4SQCAlRuOjIJ2i0HxqzM= +github.com/ipld/go-ipld-prime v0.5.1-0.20201021195245-109253e8a018/go.mod h1:0xEgdD6MKbZ1vF0GC+YcR/C4SQCAlRuOjIJ2i0HxqzM= github.com/ipld/go-ipld-prime v0.9.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= 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-0.20210930132912-0b3aef3ca569/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= github.com/ipld/go-ipld-prime v0.12.3 h1:furVobw7UBLQZwlEwfE26tYORy3PAK8VYSgZOSr3JMQ= github.com/ipld/go-ipld-prime v0.12.3/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= github.com/ipld/go-ipld-prime-proto v0.0.0-20191113031812-e32bd156a1e5/go.mod h1:gcvzoEDBjwycpXt3LBE061wT9f46szXGHAmj9uoP6fU= github.com/ipld/go-ipld-prime-proto v0.0.0-20200428191222-c1ffdadc01e1/go.mod h1:OAV6xBmuTLsPZ+epzKkPB1e25FHk/vCtyatkdHcArLs= +github.com/ipld/go-ipld-prime-proto v0.0.0-20200922192210-9a2bfd4440a6/go.mod h1:3pHYooM9Ea65jewRwrb2u5uHZCNkNTe9ABsVB+SrkH0= +github.com/ipld/go-ipld-prime-proto v0.1.0/go.mod h1:11zp8f3sHVgIqtb/c9Kr5ZGqpnCLF1IVTNOez9TopzE= +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/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.4/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= github.com/jackpal/gateway v1.0.5/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= github.com/jackpal/go-nat-pmp v1.0.1/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= +github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jbenet/go-cienv v0.0.0-20150120210510-1bb1476777ec/go.mod h1:rGaEvXB4uRSZMmzKNLoXvTu1sfx+1kv/DojUlPrSZGs= github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= +github.com/jbenet/go-random v0.0.0-20190219211222-123a90aedc0c h1:uUx61FiAa1GI6ZmVd2wf2vULeQZIKG66eybjNXKYCz4= github.com/jbenet/go-random v0.0.0-20190219211222-123a90aedc0c/go.mod h1:sdx1xVM9UuLw1tXnhJWN3piypTUO3vCIHYmG15KE/dU= github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2/go.mod h1:8GXXJV31xl8whumTzdZsTt3RnUIiPqzkyf7mxToRCMs= +github.com/jbenet/go-temp-err-catcher v0.1.0 h1:zpb3ZH6wIE8Shj2sKS+khgRvf7T7RABoLk/+KKHggpk= github.com/jbenet/go-temp-err-catcher v0.1.0/go.mod h1:0kJRvmDZXNMIiJirNPEYfhpPwbGVtZVWC34vc5WLsDk= github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY= github.com/jbenet/goprocess v0.1.3/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= +github.com/jbenet/goprocess v0.1.4 h1:DRGOFReOMqqDNXwW70QkacFW0YN9QnwLV0Vqk+3oU0o= github.com/jbenet/goprocess v0.1.4/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jessevdk/go-flags v1.4.0 h1:4IU2WS7AumrZ/40jfhf4QVDMsQwqA7VEHozFRrGARJA= 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= +github.com/jonboulle/clockwork v0.1.1-0.20190114141812-62fb9bc030d1 h1:qBCV/RLV02TSfQa7tFmxTihnG+u+7JXByOkhlkR5rmQ= github.com/jonboulle/clockwork v0.1.1-0.20190114141812-62fb9bc030d1/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/jsimonetti/rtnetlink v0.0.0-20190606172950-9527aa82566a/go.mod h1:Oz+70psSo5OFh8DBl0Zv2ACw7Esh6pPUphlvZG9x7uw= @@ -969,15 +946,18 @@ github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHm github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= 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= github.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg= github.com/kilic/bls12-381 v0.0.0-20200607163746-32e1441c8a9f/go.mod h1:XXfR6YFCRSrkEXbNlIyDsgXVNJWVUV30m/ebkVy9n6s= github.com/kilic/bls12-381 v0.0.0-20200731194930-64c428e1bff5/go.mod h1:XXfR6YFCRSrkEXbNlIyDsgXVNJWVUV30m/ebkVy9n6s= +github.com/kilic/bls12-381 v0.0.0-20200820230200-6b2c19996391 h1:51kHw7l/dUDdOdW06AlUGT5jnpj6nqQSILebcsikSjA= github.com/kilic/bls12-381 v0.0.0-20200820230200-6b2c19996391/go.mod h1:XXfR6YFCRSrkEXbNlIyDsgXVNJWVUV30m/ebkVy9n6s= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= @@ -986,52 +966,58 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o 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 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= 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.8/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= 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/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= +github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/libp2p/go-addr-util v0.0.1/go.mod h1:4ac6O7n9rIAKB1dnd+s8IbbMXkt+oBpzX4/+RACcnlQ= github.com/libp2p/go-addr-util v0.0.2/go.mod h1:Ecd6Fb3yIuLzq4bD7VcywcVSBtefcAwnUISBM3WG15E= +github.com/libp2p/go-addr-util v0.1.0 h1:acKsntI33w2bTU7tC9a0SaPimJGfSI0bFKC18ChxeVI= 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-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= github.com/libp2p/go-conn-security-multistream v0.0.2/go.mod h1:nc9vud7inQ+d6SO0I/6dSWrdMnHnzZNHeyUQqrAJulE= github.com/libp2p/go-conn-security-multistream v0.1.0/go.mod h1:aw6eD7LOsHEX7+2hJkDxw1MteijaVcI+/eP2/x3J1xc= 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 h1:9UCIKlBL1hC9u7nkMXpD1nkc/T53PKMAn3/k9ivBAVc= github.com/libp2p/go-conn-security-multistream v0.3.0/go.mod h1:EEP47t4fw/bTelVmEzIDqSe69hO/ip52xBEhZMLWAHM= github.com/libp2p/go-eventbus v0.0.2/go.mod h1:Hr/yGlwxA/stuLnpMiu82lpNKpvRy3EaJxPu40XYOwk= -github.com/libp2p/go-eventbus v0.0.3/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-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-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.2.1/go.mod h1:HZbtEOrgZN4F1fGZVvkV+930Wx3DkqlpBlO8dIoZWds= -github.com/libp2p/go-libp2p v0.3.0/go.mod h1:J7DPB1+zB5VLc8v/kKSD8+u2cbyIGI0Dh/Pf3Wprt+0= 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.4.2/go.mod h1:MNmgUxUw5pMsdOzMlT0EE7oKjRasl+WyVwM0IBlpKgQ= github.com/libp2p/go-libp2p v0.6.0/go.mod h1:mfKWI7Soz3ABX+XEBR61lGbg+ewyMtJHVt043oWeqwg= 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= @@ -1039,12 +1025,15 @@ github.com/libp2p/go-libp2p v0.7.4/go.mod h1:oXsBlTLF1q7pxr+9w6lqzS1ILpyHsaBPniV github.com/libp2p/go-libp2p v0.8.1/go.mod h1:QRNH9pwdbEBpx5DTJYg+qxcVaDMAz3Ee/qDKwXujH5o= github.com/libp2p/go-libp2p v0.8.3/go.mod h1:EsH1A+8yoWK+L4iKcbPYu6MPluZ+CHWI9El8cTaefiM= github.com/libp2p/go-libp2p v0.9.2/go.mod h1:cunHNLDVus66Ct9iXXcjKRLdmHdFdHVe1TAnbubJQqQ= +github.com/libp2p/go-libp2p v0.10.0/go.mod h1:yBJNpb+mGJdgrwbKAKrhPU0u3ogyNFTfjJ6bdM+Q/G8= 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.15.0/go.mod h1:8Ljmwon0cZZYKrOCjFeLwQEK8bqR42dOheUZ1kSKhP0= +github.com/libp2p/go-libp2p v0.16.0 h1:aTxzQPllnW+nyC9mY8xaS20BbcrSYMt1HCkjZRHvdGY= github.com/libp2p/go-libp2p v0.16.0/go.mod h1:ump42BsirwAWxKzsCiFnTtN1Yc+DuPu76fyMX364/O4= 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 h1:rABPCO77SjdbJ/eJ/ynIo8vWICy1VEnL5JAxJbQLo1E= github.com/libp2p/go-libp2p-asn-util v0.1.0/go.mod h1:wu+AnM9Ii2KgO5jMmS1rz9dvzTdj8BXqsPR9HR0XB7I= github.com/libp2p/go-libp2p-autonat v0.0.6/go.mod h1:uZneLdOkZHro35xIhpbtTzLlgYturpu4J5+0cZK3MqE= github.com/libp2p/go-libp2p-autonat v0.1.0/go.mod h1:1tLf2yXxiE/oKGtDwPYWTSYG3PtvYlJmg7NeVtPRqH8= @@ -1055,6 +1044,7 @@ github.com/libp2p/go-libp2p-autonat v0.2.2/go.mod h1:HsM62HkqZmHR2k1xgX34WuWDzk/ github.com/libp2p/go-libp2p-autonat v0.2.3/go.mod h1:2U6bNWCNsAG9LEbwccBDQbjzQ8Krdjge1jLTE9rdoMM= 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 h1:+vbQ1pMzMGjE/RJopiQKK2FRjdCKHPNPrkPm8u+luQU= github.com/libp2p/go-libp2p-autonat v0.6.0/go.mod h1:bFC6kY8jwzNNWoqc8iGE57vsfwyJ/lP4O4DOV1e0B2o= 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= @@ -1062,6 +1052,7 @@ github.com/libp2p/go-libp2p-blankhost v0.1.1/go.mod h1:pf2fvdLJPsC1FsVrNP3DUUvMz 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.1.6/go.mod h1:jONCAJqEP+Z8T6EQviGL4JsQcLx1LgTGtVqFNY8EMfQ= +github.com/libp2p/go-libp2p-blankhost v0.2.0 h1:3EsGAi0CBGcZ33GwRuXEYJLLPoVWyXJ1bcJzAJjINkk= github.com/libp2p/go-libp2p-blankhost v0.2.0/go.mod h1:eduNKXGTioTuQAUcZ5epXi9vMl+t4d8ugUBRQ4SqaNQ= 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= @@ -1070,17 +1061,18 @@ 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.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 h1:eqQ3sEYkGTtybWgr6JLqJY6QLtPWRErvFjFDfAOO1wc= github.com/libp2p/go-libp2p-circuit v0.4.0/go.mod h1:t/ktoFIUzM6uLQ+o1G6NuBl2ANhBKN9Bc8jRIk31MoA= -github.com/libp2p/go-libp2p-connmgr v0.1.0/go.mod h1:wZxh8veAmU5qdrfJ0ZBLcU8oJe9L82ciVP/fl1VHjXk= github.com/libp2p/go-libp2p-connmgr v0.1.1/go.mod h1:wZxh8veAmU5qdrfJ0ZBLcU8oJe9L82ciVP/fl1VHjXk= github.com/libp2p/go-libp2p-connmgr v0.2.3/go.mod h1:Gqjg29zI8CwXX21zRxy6gOg8VYu3zVerJRt2KyktzH4= +github.com/libp2p/go-libp2p-connmgr v0.2.4 h1:TMS0vc0TCBomtQJyWr7fYxcVYYhx+q/2gF++G5Jkl/w= github.com/libp2p/go-libp2p-connmgr v0.2.4/go.mod h1:YV0b/RIm8NGPnnNWM7hG9Q38OeQiQfKhHCCs1++ufn0= github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= 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.0.9/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= @@ -1120,6 +1112,7 @@ github.com/libp2p/go-libp2p-discovery v0.3.0/go.mod h1:o03drFnz9BVAZdzC/QUQ+NeQO github.com/libp2p/go-libp2p-discovery v0.4.0/go.mod h1:bZ0aJSrFc/eX2llP0ryhb1kpgkPyTo23SJ5b7UQCMh4= github.com/libp2p/go-libp2p-discovery v0.5.0/go.mod h1:+srtPIU9gDaBNu//UHvcdliKBIcr4SfDcm0/PfPJLug= github.com/libp2p/go-libp2p-discovery v0.5.1/go.mod h1:+srtPIU9gDaBNu//UHvcdliKBIcr4SfDcm0/PfPJLug= +github.com/libp2p/go-libp2p-discovery v0.6.0 h1:1XdPmhMJr8Tmj/yUfkJMIi8mgwWrLUsCB3bMxdT+DSo= github.com/libp2p/go-libp2p-discovery v0.6.0/go.mod h1:/u1voHt0tKIe5oIA1RHBKQLVCWPna2dXmPNHc2zR9S8= 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= @@ -1127,14 +1120,15 @@ 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.1.1/go.mod h1:1kj2Rk5pX3/0RwqMm9AMNCT7DzcMHYhgDN5VTi+cY0M= github.com/libp2p/go-libp2p-kad-dht v0.2.1/go.mod h1:k7ONOlup7HKzQ68dE6lSnp07cdxdkmnRa+6B4Fh9/w0= +github.com/libp2p/go-libp2p-kad-dht v0.13.0 h1:qBNYzee8BVS6RkD8ukIAGRG6LmVz8+kkeponyI7W+yA= github.com/libp2p/go-libp2p-kad-dht v0.13.0/go.mod h1:NkGf28RNhPrcsGYWJHm6EH8ULkiJ2qxsWmpE7VTL3LI= -github.com/libp2p/go-libp2p-kbucket v0.2.0/go.mod h1:JNymBToym3QXKBMKGy3m29+xprg0EVr/GJFHxFEdgh8= 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= 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= @@ -1143,18 +1137,21 @@ github.com/libp2p/go-libp2p-mplex v0.2.1/go.mod h1:SC99Rxs8Vuzrf/6WhmH41kNn13TiY 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.4.0/go.mod h1:yCyWJE2sc6TBTnFpjvLuEJgTSw/u+MamvzILKdX7asw= +github.com/libp2p/go-libp2p-mplex v0.4.1 h1:/pyhkP1nLwjG3OM+VuaNJkQT/Pqq73WzB3aDN3Fx1sc= github.com/libp2p/go-libp2p-mplex v0.4.1/go.mod h1:cmy+3GfqfM1PceHTLL7zQzAAYaryDu6iPSC+CIb094g= 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= +github.com/libp2p/go-libp2p-nat v0.1.0 h1:vigUi2MEN+fwghe5ijpScxtbbDz+L/6y8XwlzYOJgSY= github.com/libp2p/go-libp2p-nat v0.1.0/go.mod h1:DQzAG+QbDYjN1/C3B6vXucLtz3u9rEonLVPtZVzQqks= 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-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.2.2/go.mod h1:IEbYhBBzGyvdLBoxxULL/SGbJARhUeqlO8lVSREYu2Q= +github.com/libp2p/go-libp2p-noise v0.3.0 h1:NCVH7evhVt9njbTQshzT7N1S3Q6fjj9M11FCgfH5+cA= github.com/libp2p/go-libp2p-noise v0.3.0/go.mod h1:JNjHbociDJKHD64KTkzGnzqJ0FEV5gHJa6AB00kbCNQ= github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo= github.com/libp2p/go-libp2p-peer v0.1.1/go.mod h1:jkF12jGB4Gk/IOo+yomm+7oLWxF278F7UnrYUQ1Q8es= @@ -1162,7 +1159,6 @@ github.com/libp2p/go-libp2p-peer v0.2.0/go.mod h1:RCffaCvUyW2CJmG2gAWVqwePwW7JMg github.com/libp2p/go-libp2p-peerstore v0.0.1/go.mod h1:RabLyPVJLuNQ+GFyoEkfi8H4Ti6k/HtZJ7YKgtSq+20= github.com/libp2p/go-libp2p-peerstore v0.0.6/go.mod h1:RabLyPVJLuNQ+GFyoEkfi8H4Ti6k/HtZJ7YKgtSq+20= github.com/libp2p/go-libp2p-peerstore v0.1.0/go.mod h1:2CeHkQsr8svp4fZ+Oi9ykN1HBb6u0MOvdJ7YIsmcwtY= -github.com/libp2p/go-libp2p-peerstore v0.1.2/go.mod h1:BJ9sHlm59/80oSkpWgr1MyY1ciXAXV397W6h1GH/uKI= github.com/libp2p/go-libp2p-peerstore v0.1.3/go.mod h1:BJ9sHlm59/80oSkpWgr1MyY1ciXAXV397W6h1GH/uKI= github.com/libp2p/go-libp2p-peerstore v0.1.4/go.mod h1:+4BDbDiiKf4PzpANZDAT+knVdLxvqh7hXOujessqdzs= github.com/libp2p/go-libp2p-peerstore v0.2.0/go.mod h1:N2l3eVIeAitSg3Pi2ipSrJYnqhVnMNQZo9nkSCuAbnQ= @@ -1173,47 +1169,51 @@ github.com/libp2p/go-libp2p-peerstore v0.2.4/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuD github.com/libp2p/go-libp2p-peerstore v0.2.6/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= github.com/libp2p/go-libp2p-peerstore v0.2.7/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= github.com/libp2p/go-libp2p-peerstore v0.2.8/go.mod h1:gGiPlXdz7mIHd2vfAsHzBNAMqSDkt2UBFwgcITgw1lA= +github.com/libp2p/go-libp2p-peerstore v0.4.0 h1:DOhRJLnM9Dc9lIXi3rPDZBf789LXy1BrzwIs7Tj0cKA= github.com/libp2p/go-libp2p-peerstore v0.4.0/go.mod h1:rDJUFyzEWPpXpEwywkcTYYzDHlwza8riYMaUzaN6hX0= +github.com/libp2p/go-libp2p-pnet v0.2.0 h1:J6htxttBipJujEjz1y0a5+eYoiPcFHhSYHH6na5f0/k= 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.2.6/go.mod h1:5jEp7R3ItQ0pgcEMrPZYE9DQTg/H3CTc7Mu1j2G4Y5o= github.com/libp2p/go-libp2p-pubsub v0.3.2-0.20200527132641-c0712c6e92cf/go.mod h1:TxPOBuo1FPdsTjFnv+FGZbNbWYsp74Culx+4ViQpato= +github.com/libp2p/go-libp2p-pubsub v0.5.6 h1:YkO3gG9J1mQBEMRrM5obiG3JD0L8RcrzIpoeLeiYqH8= github.com/libp2p/go-libp2p-pubsub v0.5.6/go.mod h1:gVOzwebXVdSMDQBTfH8ACO5EJ4SQrvsHqCmYsCZpD0E= github.com/libp2p/go-libp2p-quic-transport v0.1.1/go.mod h1:wqG/jzhF3Pu2NrhJEvE+IE0NTHNXslOPn9JQzyCAxzU= +github.com/libp2p/go-libp2p-quic-transport v0.5.0/go.mod h1:IEcuC5MLxvZ5KuHKjRu+dr3LjCT1Be3rcD/4d8JrX8M= 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= +github.com/libp2p/go-libp2p-quic-transport v0.15.0 h1:DR0mP6kcieowikBprWkcNtbquRKOPWb5dLZ4ahDZujk= github.com/libp2p/go-libp2p-quic-transport v0.15.0/go.mod h1:wv4uGwjcqe8Mhjj7N/Ic0aKjA+/10UnMlSzLO0yRpYQ= 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-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.1.0/go.mod h1:oUs0h39vNwYtYXnQWOTU5BaafbedSyWCCal3gqHuoOQ= +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= github.com/libp2p/go-libp2p-secio v0.1.0/go.mod h1:tMJo2w7h3+wN4pgU2LSYeiKPrfqBgkOsdiKK77hE7c8= -github.com/libp2p/go-libp2p-secio v0.1.1/go.mod h1:tMJo2w7h3+wN4pgU2LSYeiKPrfqBgkOsdiKK77hE7c8= github.com/libp2p/go-libp2p-secio v0.2.0/go.mod h1:2JdZepB8J5V9mBp79BmwsaPQhRPNN2NrnB2lKQcdy6g= github.com/libp2p/go-libp2p-secio v0.2.1/go.mod h1:cWtZpILJqkqrSkiYcDBh5lA3wbT2Q+hz3rJQq3iftD8= 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.1.1/go.mod h1:4NVJaLwq/dr5kEq79Jo6pMin7ZFwLx73ln1FTefR91Q= -github.com/libp2p/go-libp2p-swarm v0.2.0/go.mod h1:x07b4zkMFo2EvgPV2bMTlNmdQc8i+74Jjio7xGvsTgU= 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.4/go.mod h1:/xIpHFPPh3wmSthtxdGbkHZ0OET1h/GGZes8Wku/M5Y= +github.com/libp2p/go-libp2p-swarm v0.2.7/go.mod h1:ZSJ0Q+oq/B1JgfPHJAT2HTall+xYRNYp1xs4S2FBWKA= 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.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 h1:nRHNRhi86L7jhka02N4MoV+PSFFPoJFkHNQwCTFxNhw= github.com/libp2p/go-libp2p-swarm v0.8.0/go.mod h1:sOMp6dPuqco0r0GHTzfVheVBh6UEL0L1lXUZ5ot2Fvc= 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= @@ -1225,14 +1225,13 @@ github.com/libp2p/go-libp2p-testing v0.1.2-0.20200422005655-8775583591d8/go.mod github.com/libp2p/go-libp2p-testing v0.3.0/go.mod h1:efZkql4UZ7OVsEfaxNHZPzIehtsBXMrXnCfJIgDti5g= github.com/libp2p/go-libp2p-testing v0.4.0/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotlKsNSbKQ/lImlOWF0= github.com/libp2p/go-libp2p-testing v0.4.2/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotlKsNSbKQ/lImlOWF0= +github.com/libp2p/go-libp2p-testing v0.5.0 h1:bTjC29TTQ/ODq0ld3+0KLq3irdA5cAH3OMbRi0/QsvE= github.com/libp2p/go-libp2p-testing v0.5.0/go.mod h1:QBk8fqIL1XNcno/l3/hhaIEn4aLRijpYOR+zVjjlh+A= -github.com/libp2p/go-libp2p-tls v0.1.0/go.mod h1:VZdoSWQDeNpIIAFJFv+6uqTqpnIIDHcqZQSTC/A1TT0= github.com/libp2p/go-libp2p-tls v0.1.3/go.mod h1:wZfuewxOndz5RTnCAxFliGjvYSDA40sKitV4c50uI1M= -github.com/libp2p/go-libp2p-tls v0.2.0/go.mod h1:twrp2Ci4lE2GYspA1AnlYm+boYjqVruxDKJJj7s6xrc= github.com/libp2p/go-libp2p-tls v0.3.0/go.mod h1:fwF5X6PWGxm6IDRwF3V8AVCCj/hOd5oFlg+wo2FxJDY= +github.com/libp2p/go-libp2p-tls v0.3.1 h1:lsE2zYte+rZCEOHF72J1Fg3XK3dGQyKvI6i5ehJfEp0= github.com/libp2p/go-libp2p-tls v0.3.1/go.mod h1:fwF5X6PWGxm6IDRwF3V8AVCCj/hOd5oFlg+wo2FxJDY= github.com/libp2p/go-libp2p-transport v0.0.1/go.mod h1:UzbUs9X+PHOSw7S3ZmeOxfnwaQY5vGDzZmKPod3N3tk= -github.com/libp2p/go-libp2p-transport v0.0.4/go.mod h1:StoY3sx6IqsP6XKoabsPnHCwqKXWUMWU7Rfcsubee/A= github.com/libp2p/go-libp2p-transport v0.0.5/go.mod h1:StoY3sx6IqsP6XKoabsPnHCwqKXWUMWU7Rfcsubee/A= github.com/libp2p/go-libp2p-transport-upgrader v0.0.4/go.mod h1:RGq+tupk+oj7PzL2kn/m1w6YXxcIAYJYeI90h6BGgUc= github.com/libp2p/go-libp2p-transport-upgrader v0.1.1/go.mod h1:IEtA6or8JUbsV07qPW4r01GnTenLW4oi3lOPbUMGJJA= @@ -1242,6 +1241,7 @@ github.com/libp2p/go-libp2p-transport-upgrader v0.4.0/go.mod h1:J4ko0ObtZSmgn5BX 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= +github.com/libp2p/go-libp2p-transport-upgrader v0.5.0 h1:7SDl3O2+AYOgfE40Mis83ClpfGNkNA6m4FwhbOHs+iI= github.com/libp2p/go-libp2p-transport-upgrader v0.5.0/go.mod h1:Rc+XODlB3yce7dvFV4q/RmyJGsFcCZRkeZMu/Zdg0mo= github.com/libp2p/go-libp2p-xor v0.0.0-20210714161855-5c005aca55db/go.mod h1:LSTM5yRnjGZbWNTA/hRwq2gGFrvRIbQJscoIL/u6InY= github.com/libp2p/go-libp2p-yamux v0.1.2/go.mod h1:xUoV/RmYkg6BW/qGxA9XJyg+HzXFYkeXbnhjmnYzKp8= @@ -1255,11 +1255,14 @@ github.com/libp2p/go-libp2p-yamux v0.2.8/go.mod h1:/t6tDqeuZf0INZMTgd0WxIRbtK2Ez 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 h1:TKayW983n92JhCGdCo7ej7eEb+DQ0VYfKNOxlN/1kNQ= github.com/libp2p/go-libp2p-yamux v0.6.0/go.mod h1:MRhd6mAYnFRnSISp4M8i0ClV/j+mWHo2mYLifWGw33k= 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= +github.com/libp2p/go-maddr-filter v0.1.0 h1:4ACqZKw8AqiuJfwFGq1CYDFugfXTOos+qQ3DETkhtCE= github.com/libp2p/go-maddr-filter v0.1.0/go.mod h1:VzZhTXkMucEGGEOSKddrwGiOv0tUhgnKqNEmIAz/bPU= github.com/libp2p/go-mplex v0.0.3/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= github.com/libp2p/go-mplex v0.0.4/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= @@ -1267,19 +1270,23 @@ github.com/libp2p/go-mplex v0.1.0/go.mod h1:SXgmdki2kwCUlCCbfGLEgHjC4pFqhTp0ZoV6 github.com/libp2p/go-mplex v0.1.1/go.mod h1:Xgz2RDCi3co0LeZfgjm4OgUF15+sVR8SRcu3SFXI1lk= 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 h1:U1T+vmCYJaEoDJPV1aq31N56hS+lJgb397GsylNSgrU= github.com/libp2p/go-mplex v0.3.0/go.mod h1:0Oy/A9PQlwBytDRp4wSkFnzHYDKcpLot35JQ6msjvYQ= 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= github.com/libp2p/go-msgio v0.0.6/go.mod h1:4ecVB6d9f4BDSL5fqvPiC4A3KivjWn+Venn/1ALLMWA= +github.com/libp2p/go-msgio v0.1.0 h1:8Q7g/528ivAlfXTFWvWhVjTE8XG8sDTkRUKPYh9+5Q8= github.com/libp2p/go-msgio v0.1.0/go.mod h1:eNlv2vy9V2X/kNldcZ+SShFE++o2Yjxwx6RAYsmgJnE= github.com/libp2p/go-nat v0.0.3/go.mod h1:88nUEt0k0JD45Bk93NIwDqjlhiOwOoV36GchpcVc1yI= github.com/libp2p/go-nat v0.0.4/go.mod h1:Nmw50VAvKuk38jUBcmNh6p9lUJLoODbJRvYAa/+KSDo= github.com/libp2p/go-nat v0.0.5/go.mod h1:B7NxsVNPZmRLvMOwiEO1scOSyjA56zxYAGv1yQgRkEU= +github.com/libp2p/go-nat v0.1.0 h1:MfVsH6DLcpa04Xr+p8hmVRG4juse0s3J8HyNWYHffXg= github.com/libp2p/go-nat v0.1.0/go.mod h1:X7teVkwRHNInVNWQiO/tAiAVRwSr5zoRz4YSTC3uRBM= github.com/libp2p/go-netroute v0.1.2/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk= github.com/libp2p/go-netroute v0.1.3/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk= github.com/libp2p/go-netroute v0.1.5/go.mod h1:V1SR3AaECRkEQCoFFzYwVYWvYIEtlxx89+O3qcpCl4A= +github.com/libp2p/go-netroute v0.1.6 h1:ruPJStbYyXVYGQ81uzEDzuvbYRLKRrLvTYd33yomC38= github.com/libp2p/go-netroute v0.1.6/go.mod h1:AqhkMh0VuWmfgtxKPp3Oc1LdU5QSWS7wl0QLhSZqXxQ= github.com/libp2p/go-openssl v0.0.2/go.mod h1:v8Zw2ijCSWBQi8Pq5GAixw6DbFfa9u6VIYDXnvOXkc0= github.com/libp2p/go-openssl v0.0.3/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= @@ -1289,19 +1296,23 @@ github.com/libp2p/go-openssl v0.0.7 h1:eCAzdLejcNVBzP/iZM9vqHnQm+XyCEbSSIheIPRGN github.com/libp2p/go-openssl v0.0.7/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= 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 h1:0ooKOx2iwyIkf339WCZ2HN3ujTDbkK0PjC7JVoP1AiM= github.com/libp2p/go-reuseport v0.1.0/go.mod h1:bQVn9hmfcTaoo0c9v5pBhOarsU1eNOBZdaAd2hzXRKU= github.com/libp2p/go-reuseport-transport v0.0.2/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs= github.com/libp2p/go-reuseport-transport v0.0.3/go.mod h1:Spv+MPft1exxARzP2Sruj2Wb5JSyHNncjf1Oi2dEbzM= github.com/libp2p/go-reuseport-transport v0.0.4/go.mod h1:trPa7r/7TJK/d+0hdBLOCGvpQQVOU74OXbNCIMkufGw= github.com/libp2p/go-reuseport-transport v0.0.5/go.mod h1:TC62hhPc8qs5c/RoXDZG6YmjK+/YWUPC0yYmeUecbjc= +github.com/libp2p/go-reuseport-transport v0.1.0 h1:C3PHeHjmnz8m6f0uydObj02tMEoi7CyD1zuN7xQT8gc= github.com/libp2p/go-reuseport-transport v0.1.0/go.mod h1:vev0C0uMkzriDY59yFHD9v+ujJvYmDQVLowvAjEOmfw= 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 h1:yD80l2ZOdGksnOyHrhxDdTDFrf7Oy+v3FMVArIRgZxQ= github.com/libp2p/go-sockaddr v0.1.1/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= 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= 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 h1:TqnSHPJEIqDEO7h1wZZ0p3DXdvDSiLHQidKKUGZtiOY= github.com/libp2p/go-stream-muxer-multistream v0.3.0/go.mod h1:yDh8abSIzmZtqtOt64gFJUXEryejzNb0lisTt+fAMJA= 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= @@ -1311,7 +1322,7 @@ github.com/libp2p/go-tcp-transport v0.2.1/go.mod h1:zskiJ70MEfWz2MKxvFB/Pv+tPIB1 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= -github.com/libp2p/go-tcp-transport v0.2.8/go.mod h1:64rSfVidkYPLqbzpcN2IwHY4pmgirp67h++hZ/rcndQ= +github.com/libp2p/go-tcp-transport v0.4.0 h1:VDyg4j6en3OuXf90gfDQh5Sy9KowO9udnd0OU8PP6zg= github.com/libp2p/go-tcp-transport v0.4.0/go.mod h1:0y52Rwrn4076xdJYu/51/qJIdxz+EWDAOG2S45sV3VI= 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= @@ -1322,6 +1333,7 @@ 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.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 h1:cO6x4P0v6PfxbKnxmf5cY2Ny4OPDGYkUqNvZzp/zdlo= github.com/libp2p/go-ws-transport v0.5.0/go.mod h1:I2juo1dNTbl8BKSBYo98XY85kU2xds1iamArLvl8kNg= 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= @@ -1332,23 +1344,29 @@ github.com/libp2p/go-yamux v1.3.5/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZ github.com/libp2p/go-yamux v1.3.6/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 h1:luRV68GS1vqqr6EFUjtu1kr51d+IbW0gSowu8emYWAI= github.com/libp2p/go-yamux/v2 v2.3.0/go.mod h1:iTU+lOIn/2h0AgKcL49clNTwfEw+WSfDYrXe05EyKIs= -github.com/libp2p/zeroconf/v2 v2.0.0/go.mod h1:J85R/d9joD8u8F9aHM8pBXygtG9W02enEwS+wWeL6yo= 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.16.0/go.mod h1:I0+fcNTdb9eS1ZcjQZbDVPGchJ86chcIxPALn9lEJqE= 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= +github.com/lucas-clemente/quic-go v0.24.0 h1:ToR7SIIEdrgOhgVTHvPgdVRJfgVy+N0wQAagH7L4d5g= github.com/lucas-clemente/quic-go v0.24.0/go.mod h1:paZuzjXCE5mj6sikVLMvqXk8lJV2AsqtJ6bDhjEfxx0= +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= github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= +github.com/magefile/mage v1.9.0 h1:t3AU2wNwehMCW97vuqQLtw6puppWXHO+O2MHo5a50XE= github.com/magefile/mage v1.9.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= @@ -1356,16 +1374,22 @@ github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= 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/marten-seemann/qpack v0.1.0/go.mod h1:LFt1NU/Ptjip0C2CPkhimBz5CGE3WGDAUWqna+CNTrI= 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.9.1/go.mod h1:T1MmAdDPyISzxlK6kjRr0pcZFBVd1OZbBb/j3cvzHhk= 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= github.com/marten-seemann/qtls-go1-15 v0.1.5/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= +github.com/marten-seemann/qtls-go1-16 v0.1.4 h1:xbHbOGGhrenVtII6Co8akhLEdrawwB2iHl5yhJRpnco= github.com/marten-seemann/qtls-go1-16 v0.1.4/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 h1:P9ggrs5xtwiqXv/FHNwntmuLMNq3KaSIG93AtAZ48xk= github.com/marten-seemann/qtls-go1-17 v0.1.0/go.mod h1:fz4HIxByo+LlWcreM4CZOYNuz3taBQ8rN2X6FqvaWo8= +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= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= @@ -1373,21 +1397,24 @@ github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVc 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.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= 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.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= github.com/mattn/go-xmlrpc v0.0.3/go.mod h1:mqc2dz7tP5x5BKlCahN/n+hs7OSZKJkS9JsHNBRlrxA= +github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/mdlayher/genetlink v1.0.0/go.mod h1:0rJ0h4itni50A86M2kHcgS85ttZazNt7a8H2a2cw0Gc= github.com/mdlayher/netlink v0.0.0-20190409211403-11939a169225/go.mod h1:eQB3mZE4aiYnlUsyGGCOpPETfdQq4Jhsgf1fk3cwQaA= @@ -1403,9 +1430,13 @@ github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKju 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 h1:JKfpVSCB84vrAmHzyrsxB5NAr5kLoMXZArPSw7Qlgyg= github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= +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= github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b/go.mod h1:lxPUiZwKoFL8DUUmalo2yJJUCxbPKtm8OKfqr2/FTNU= +github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc h1:PTfri+PuQmWDqERdnNMiD9ZejrlswWrCpBEZgWOiTrc= 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= @@ -1421,6 +1452,7 @@ github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy 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= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= @@ -1463,8 +1495,10 @@ github.com/multiformats/go-multiaddr-dns v0.0.2/go.mod h1:9kWcqw/Pj6FwxAwW38n/94 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.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= +github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/eQsuaL3/CWe167E= github.com/multiformats/go-multiaddr-fmt v0.1.0/go.mod h1:hGtDIW4PU4BqJ50gW2quDuPVjyWNZxToGUh/HwTZYJo= github.com/multiformats/go-multiaddr-net v0.0.1/go.mod h1:nw6HSxNmCIQH27XPGBuX+d1tnvM7ihcFwHMSstNAVUU= github.com/multiformats/go-multiaddr-net v0.1.0/go.mod h1:5JNbcfBOP4dnhoZOv10JJVkJO0pCCEf8mTnipAo2UZQ= @@ -1486,7 +1520,6 @@ github.com/multiformats/go-multicodec v0.3.1-0.20210902112759-1539a079fd61 h1:Zr github.com/multiformats/go-multicodec v0.3.1-0.20210902112759-1539a079fd61/go.mod h1:1Hj/eHRaVWSXiSNNfcEPcwZleTmdNP81xlxDLnWU9GQ= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po= -github.com/multiformats/go-multihash v0.0.6/go.mod h1:XuKXPp8VHcTygube3OWZC+aZrA+H1IhmjoCDtJc7PXM= github.com/multiformats/go-multihash v0.0.8/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= github.com/multiformats/go-multihash v0.0.9/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= github.com/multiformats/go-multihash v0.0.10/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= @@ -1501,6 +1534,7 @@ github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wS 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 h1:TCYu1BHTDr1F/Qm75qwYISQdzGcRdC21nFgQW7l7GBo= github.com/multiformats/go-multistream v0.2.2/go.mod h1:UIcnm7Zuo8HKG+HkWgfQsGL+/MIEhyTqbODbIUwSXKs= github.com/multiformats/go-varint v0.0.1/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= github.com/multiformats/go-varint v0.0.2/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= @@ -1526,10 +1560,12 @@ github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJE 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 v0.0.0-20170412213628-49af9bddb229/go.mod h1:0aYXnNPJ8l7uZxf45rWW1a/uME32OF0rhiYGNQ2oF2E= +github.com/nkovacs/streamquote v1.0.0 h1:PmVIV08Zlx2lZK5fFZlMZ04eHcDTIFJCv/5/0twVUow= github.com/nkovacs/streamquote v1.0.0/go.mod h1:BN+NaZ2CmdKqUuTUXUEm9j95B2TRbpOWpxbJYzzgUsc= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= @@ -1537,31 +1573,38 @@ github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:v github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.9.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= +github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.6.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= 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/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= github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opentracing-contrib/go-grpc v0.0.0-20180928155321-4b5a12d3ff02/go.mod h1:JNdpVEzCpXBgIiv4ds+TzhN1hrtxq6ClLrTlT9OQRSc= +github.com/opentracing-contrib/go-grpc v0.0.0-20191001143057-db30781987df h1:vdYtBU6zvL7v+Tr+0xFM/qhahw/EvY8DMMunZHKH6eE= github.com/opentracing-contrib/go-grpc v0.0.0-20191001143057-db30781987df/go.mod h1:DYR5Eij8rJl8h7gblRrOZ8g0kW1umSpKqYIBTgeDtLo= github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= github.com/opentracing-contrib/go-stdlib v0.0.0-20190519235532-cf7a6c988dc9/go.mod h1:PLldrQSroqzH70Xl+1DQcGnefIbqsKR7UDaiux3zV+w= +github.com/opentracing-contrib/go-stdlib v1.0.0 h1:TBS7YuVotp8myLon4Pv7BtCBzOTo1DeZCld0Z63mW2w= github.com/opentracing-contrib/go-stdlib v1.0.0/go.mod h1:qtI1ogk+2JhVPIXVc6q+NHziSmy2W5GbdQZFUHADCBU= github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= @@ -1569,9 +1612,6 @@ github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJ 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/otiai10/copy v1.0.2/go.mod h1:c7RpqBkwMom4bYTSkLSym4VSJz/XtncWRAj/J4PEIMY= -github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= -github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo= 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= @@ -1579,13 +1619,16 @@ github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtP 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/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= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/polydawn/refmt v0.0.0-20190221155625-df39d6c2d992/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= github.com/polydawn/refmt v0.0.0-20190408063855-01bf1e26dd14/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= @@ -1608,12 +1651,14 @@ github.com/prometheus/client_golang v1.6.0/go.mod h1:ZLOG9ck3JLRdB5MgO8f+lLTe83A 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= github.com/prometheus/client_golang v1.10.0/go.mod h1:WJM3cc3yu7XKBKa/I8WeZm+V3eltZnBwfENSU7mdogU= +github.com/prometheus/client_golang v1.11.0 h1:HNkLOAEQMIDv/K+04rukrLx6ch7msSRwf3/SASFAGtQ= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= @@ -1627,6 +1672,7 @@ github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16 github.com/prometheus/common v0.18.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/common v0.28.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= +github.com/prometheus/common v0.30.0 h1:JEkYlQnpzrzQFxi6gnukFPdQ+ac82oRhzMcIduJu/Ug= github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= 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= @@ -1642,16 +1688,23 @@ github.com/prometheus/procfs v0.1.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4O 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/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= github.com/raulk/clock v1.1.0/go.mod h1:3MpVxdZ/ODBQDxbN+kzshf5OSZwPjtMDx6BBXBmOeY0= +github.com/raulk/go-watchdog v1.0.1 h1:qgm3DIJAeb+2byneLrQJ7kvmDLGxN2vy3apXyGaDKN4= github.com/raulk/go-watchdog v1.0.1/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 h1:OdAsTTz6OkFY5QxjkYwrChwuRruF69c169dPK26NUlk= 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= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +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= @@ -1664,8 +1717,10 @@ github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/sercand/kuberesolver v2.1.0+incompatible/go.mod h1:lWF3GL0xptCB/vCiJPl/ZshwPsX/n4Y7u0CW9E7aQIQ= +github.com/sercand/kuberesolver v2.4.0+incompatible h1:WE2OlRf6wjLxHwNkkFLQGaZcVLEXjMjBPjjEU5vksH8= github.com/sercand/kuberesolver v2.4.0+incompatible/go.mod h1:lWF3GL0xptCB/vCiJPl/ZshwPsX/n4Y7u0CW9E7aQIQ= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/shirou/gopsutil v2.18.12+incompatible h1:1eaJvGomDnH74/5cF4CTmTbLHAriGFsTZppLXDX93OM= github.com/shirou/gopsutil v2.18.12+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shurcooL/component v0.0.0-20170202220835-f88ec8f54cc4/go.mod h1:XhFIlyj5a1fBNx5aJTbKoIq0mNaPvOagO+HjB3EtxrY= github.com/shurcooL/events v0.0.0-20181021180414-410e4ca65f48/go.mod h1:5u70Mqkb5O5cxEA8nxTsgrgLehJeAw6Oc4Ab1c/P1HM= @@ -1696,14 +1751,16 @@ github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPx github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/assertions v1.0.0/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= +github.com/smartystreets/assertions v1.0.1 h1:voD4ITNjPL5jjBfgR/r8fPIIBrliWrWHeiJApdr3r4w= github.com/smartystreets/assertions v1.0.1/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= github.com/smartystreets/goconvey v0.0.0-20190222223459-a17d461953aa/go.mod h1:2RVY1rIf+2J2o/IM9+vPq9RzmHDSseB7FoXiSNIUsoU= github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/smartystreets/goconvey v0.0.0-20190710185942-9d28bd7c0945/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/smola/gocompat v0.2.0/go.mod h1:1B0MlxbmoZNo3h8guHp8HztB3BSYR5itql9qtVc0ypY= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= @@ -1715,6 +1772,7 @@ github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7A github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 h1:RC6RW7j+1+HkWaX/Yh71Ee5ZHaHYt7ZP4sQgUrm6cDU= github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= @@ -1730,6 +1788,7 @@ github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3 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/streadway/quantile v0.0.0-20150917103942-b0c588724d25 h1:7z3LSn867ex6VSaahyKadf4WtSsJIgne6A1WLOAGM8A= github.com/streadway/quantile v0.0.0-20150917103942-b0c588724d25/go.mod h1:lbP8tGiBjZ5YWIc2fzuRpTaz0b/53vT6PEs3QuAWzuU= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A= @@ -1739,21 +1798,30 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV github.com/stretchr/testify v1.3.1-0.20190311161405-34c6fa2dc709/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +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 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFdE= github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= 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= github.com/tidwall/gjson v1.6.0/go.mod h1:P256ACg0Mn+j1RXIDXoss50DeIABTYK1PULOJHhxOls= +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 h1:lhdWZsvImxvZ3q1C5OIB7d72DuOwP4O2NdBg9PyzNds= 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/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= github.com/uber/jaeger-client-go v2.25.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/uber/jaeger-lib v1.5.1-0.20181102163054-1fc5c315e03c/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= +github.com/uber/jaeger-lib v2.2.0+incompatible h1:MxZXOiR2JuoANZ3J6DE/U0kSFv/eJ/GfSYVCjK7dyaw= github.com/uber/jaeger-lib v2.2.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= 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= @@ -1763,28 +1831,30 @@ github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtX github.com/urfave/cli/v2 v2.0.0/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= github.com/urfave/cli/v2 v2.2.0 h1:JTTnM6wKzdA0Jqodd966MVj4vWbbquZykeX1sKbe2C4= github.com/urfave/cli/v2 v2.2.0/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= +github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasttemplate v1.0.1 h1:tY9CJiPnMXf1ERmG2EyK7gNUd+c6RKGD0IfU8WdUSz8= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU= 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 h1:Q81c4u7hT+BR5kNfNQhEF0VT2pmL7+Kk0wD+ORYl7iA= github.com/warpfork/go-testmark v0.3.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= github.com/warpfork/go-wish v0.0.0-20200122115046-b9ea61034e4a/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= +github.com/weaveworks/common v0.0.0-20200512154658-384f10054ec5 h1:EYxr08r8x6r/5fLEAMMkida1BVgxVXE4LfZv/XV+znU= 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= github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11/go.mod h1:Wlo/SzPmxVp6vXpGt/zaXhHH0fn4IxgqZc82aKg6bpQ= -github.com/whyrusleeping/cbor-gen v0.0.0-20190910031516-c1cbffdb01bb/go.mod h1:xdlJQaiqipF0HW+Mzpg7XRM3fWbGvfgFlcppuvlkIvY= -github.com/whyrusleeping/cbor-gen v0.0.0-20190917003517-d78d67427694/go.mod h1:xdlJQaiqipF0HW+Mzpg7XRM3fWbGvfgFlcppuvlkIvY= -github.com/whyrusleeping/cbor-gen v0.0.0-20191116002219-891f55cd449d/go.mod h1:xdlJQaiqipF0HW+Mzpg7XRM3fWbGvfgFlcppuvlkIvY= -github.com/whyrusleeping/cbor-gen v0.0.0-20191212224538-d370462a7e8a/go.mod h1:xdlJQaiqipF0HW+Mzpg7XRM3fWbGvfgFlcppuvlkIvY= github.com/whyrusleeping/cbor-gen v0.0.0-20191216205031-b047b6acb3c0/go.mod h1:xdlJQaiqipF0HW+Mzpg7XRM3fWbGvfgFlcppuvlkIvY= -github.com/whyrusleeping/cbor-gen v0.0.0-20200121162646-b63bacf5eaf8/go.mod h1:xdlJQaiqipF0HW+Mzpg7XRM3fWbGvfgFlcppuvlkIvY= github.com/whyrusleeping/cbor-gen v0.0.0-20200123233031-1cdf64d27158/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= -github.com/whyrusleeping/cbor-gen v0.0.0-20200206220010-03c9665e2a66/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= github.com/whyrusleeping/cbor-gen v0.0.0-20200402171437-3d27c146c105/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= github.com/whyrusleeping/cbor-gen v0.0.0-20200414195334-429a0b5e922e/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= github.com/whyrusleeping/cbor-gen v0.0.0-20200504204219-64967432584d/go.mod h1:W5MvapuoHRP8rz4vxjwCK1pDqF1aQcWsV5PZ+AHbqdg= @@ -1800,29 +1870,33 @@ github.com/whyrusleeping/cbor-gen v0.0.0-20210219115102-f37d292932f2/go.mod h1:f github.com/whyrusleeping/cbor-gen v0.0.0-20210303213153-67a261a1d291/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20210713220151-be142a5ae1a8 h1:TEv7MId88TyIqIUL4hbf9otOookIolMxlEbN0ro671Y= github.com/whyrusleeping/cbor-gen v0.0.0-20210713220151-be142a5ae1a8/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-smux-multiplex v3.0.16+incompatible/go.mod h1:34LEDbeKFZInPUrAG+bjuJmUXONGdEFW7XL0SpTY1y4= -github.com/whyrusleeping/go-smux-multistream v2.0.2+incompatible/go.mod h1:dRWHHvc4HDQSHh9gbKEBbUZ+f2Q8iZTPG3UOGYODxSQ= -github.com/whyrusleeping/go-smux-yamux v2.0.8+incompatible/go.mod h1:6qHUzBXUbB9MXmw3AUdB52L8sEb/hScCqOdW2kj/wuI= +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= github.com/whyrusleeping/mdns v0.0.0-20180901202407-ef14215e6b30/go.mod h1:j4l84WPFclQPj320J9gp0XwNKBb3U0zt5CBqjPp22G4= github.com/whyrusleeping/mdns v0.0.0-20190826153040-b9b60ed33aa9/go.mod h1:j4l84WPFclQPj320J9gp0XwNKBb3U0zt5CBqjPp22G4= +github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 h1:E9S12nwJwEOXe2d6gT6qxdvqMnNq+VnSsKPgm2ZZNds= github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7/go.mod h1:X2c0RVCI1eSUFI8eLcY3c0423ykwiUdxLJtkDvruhjI= -github.com/whyrusleeping/pubsub v0.0.0-20131020042734-02de8aa2db3d/go.mod h1:g7ckxrjiFh8mi1AY7ox23PZD0g6QU/TxW3U3unX7I3A= +github.com/whyrusleeping/pubsub v0.0.0-20190708150250-92bcb0691325 h1:++Zf4xQ7YrkE81gNHIjVqx5JZsn0nbMeHOkY1ILAIME= github.com/whyrusleeping/pubsub v0.0.0-20190708150250-92bcb0691325/go.mod h1:g7ckxrjiFh8mi1AY7ox23PZD0g6QU/TxW3U3unX7I3A= +github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee h1:lYbXeSvJi5zk5GLKVuid9TVjS9a0OmLIDKTfoZBL6Ow= github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee/go.mod h1:m2aV4LZI4Aez7dP5PMyVKEHhUyEJ/RjmPEDOpDvudHg= -github.com/whyrusleeping/yamux v1.1.5/go.mod h1:E8LnQQ8HKx5KD29HZFUwM1PxCOdPRzGwur1mcYhXcD8= 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 h1:/7/dQyiKnxAOj9L69FhST7uMe17U015XPzX7cy+5ykM= 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 h1:Sw125DKxZhPUI4JLlWugkzsrlB50jR9v2khiD9FxuSo= 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/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -1830,15 +1904,20 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de 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/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= github.com/zondax/ledger-go v0.12.1/go.mod h1:KatxXrVDzgWwbssUWsF5+cOJHXPvzQ09YSlzGNuhOEo= +go.dedis.ch/fixbuf v1.0.3 h1:hGcV9Cd/znUxlusJ64eAlExS+5cJDIyTyEG+otu5wQs= go.dedis.ch/fixbuf v1.0.3/go.mod h1:yzJMt34Wa5xD37V5RTdmp38cz3QhMagdGoem9anUalw= go.dedis.ch/kyber/v3 v3.0.4/go.mod h1:OzvaEnPvKlyrWyp3kGXlFdp7ap1VC6RkZDTaPikqhsQ= go.dedis.ch/kyber/v3 v3.0.9/go.mod h1:rhNjUUg6ahf8HEg5HUvVBYoWY4boAafX8tYxX+PS+qg= go.dedis.ch/protobuf v1.0.5/go.mod h1:eIV4wicvi6JK0q/QnfIEGeSFNG0ZeB24kzut5+HaRLo= go.dedis.ch/protobuf v1.0.7/go.mod h1:pv5ysfkDX/EawiPqcW3ikOxsL5t+BqnV6xHSmE79KI4= +go.dedis.ch/protobuf v1.0.11 h1:FTYVIEzY/bfl37lu3pR4lIj+F9Vp1jE8oh91VmxKgLo= go.dedis.ch/protobuf v1.0.11/go.mod h1:97QR256dnkimeNdfmURz0wAMNVbd1VmLXhG1CrTYrJ4= 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= @@ -1887,19 +1966,22 @@ 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/dig v1.7.0/go.mod h1:z+dSd2TP9Usi48jL8M3v63iSBVkiwtVyMKxMZYYauPg= +go.uber.org/dig v1.10.0 h1:yLmDDj9/zuDjv3gz8GQGviXMs9TfysIUMUilCpgzUJY= go.uber.org/dig v1.10.0/go.mod h1:X34SnWGr8Fyla9zQNO2GSO2D+TIuqB14OS8JhYocIyw= +go.uber.org/fx v1.9.0 h1:7OAz8ucp35AU8eydejpYG7QrbE8rLKzGhHbZlJi5LYY= go.uber.org/fx v1.9.0/go.mod h1:mFdUyAUuJ3w4jAckiKSKbldsxy1ojpAMJ+dVZg5Y0Aw= -go.uber.org/goleak v0.10.0/go.mod h1:VCZuO8V8mFPlL0F5J5GK1rtHV3DrFcQ1R8ryq7FK0aI= go.uber.org/goleak v1.0.0/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= +go.uber.org/goleak v1.1.11-0.20210813005559-691160354723 h1:sHOAIxRGBp443oHZIPB+HsUGaksVCXVQENPxwTfQdH4= go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/multierr v1.7.0 h1:zaiO/rmgFjbmCXdSYJWQcdvOCsthmdaHfr3Gm2Kx4Ec= go.uber.org/multierr v1.7.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= @@ -1910,10 +1992,10 @@ 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 h1:ue41HOKd1vGURxrmeKIgELGb3jPW9DMUDGtsinblHwI= go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= -go4.org v0.0.0-20190218023631-ce4c26f7be8e/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= -go4.org v0.0.0-20190313082347-94abd6928b1d/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= golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d/go.mod h1:OWs+y06UdEOHN4y+MfF/py+xQ/tYqIWW03b70/CG9Rw= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -1955,7 +2037,9 @@ golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWP 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 h1:3erb+vDS8lU1sxfDHF4/hhWyaXnhIaO+7RgL4fDZORA= golang.org/x/crypto v0.0.0-20210915214749-c084706c2272/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= @@ -1975,6 +2059,9 @@ golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20200513190911-00229845015e/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= +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/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= @@ -1990,6 +2077,7 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= @@ -2004,7 +2092,6 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/net v0.0.0-20180524181706-dfa909b99c79/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= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -2020,6 +2107,7 @@ golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190228165749-92fc7df08ae7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190313220215-9f648a60d977/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -2068,6 +2156,7 @@ golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT 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-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210917221730-978cfadd31cf h1:R150MpwJIv1MpS0N/pc+NhTM8ajzvlmxlY5OYsrevXQ= golang.org/x/net v0.0.0-20210917221730-978cfadd31cf/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= 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= @@ -2088,6 +2177,7 @@ 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/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= @@ -2125,7 +2215,6 @@ golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7w 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-20190813064441-fde4db37ae7a/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= @@ -2141,11 +2230,9 @@ 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= -golang.org/x/sys v0.0.0-20200107162124-548cf772de50/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2188,6 +2275,7 @@ golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210426080607-c94f62235c83/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210511113859-b0526f3d8744/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -2196,6 +2284,7 @@ golang.org/x/sys v0.0.0-20210917161153-d61c044b1678 h1:J27LZFQBFoihqXoegpscI10Hp golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/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 h1:MZ2shdL+ZM/XzY3ZGOnh4Nlpnxz5GSOhOmtHo3iPU6M= golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -2204,12 +2293,14 @@ golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 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= @@ -2249,7 +2340,6 @@ golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapK golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200108195415-316d2f248479/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117012304-6edc0a871e69/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= @@ -2272,6 +2362,7 @@ golang.org/x/tools v0.0.0-20200711155855-7342f9734a7d/go.mod h1:njjCfa9FT2d7l9Bc 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= +golang.org/x/tools v0.0.0-20200827010519-17fd2f27a9e3/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20201112185108-eeaa07dd7696/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= @@ -2281,7 +2372,6 @@ 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 h1:ouewzE6p+/VEB31YYnTbEJdi8pFqKp4P4n85vwo3DHA= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 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= @@ -2295,7 +2385,6 @@ google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+ 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= google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= -google.golang.org/api v0.3.2/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -2358,6 +2447,7 @@ google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6D 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= google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= @@ -2385,6 +2475,7 @@ google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTp 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 h1:AGJ0Ih4mHjSeibYkFGh1dD9KJ/eOtZ93I6hoHhukQ5Q= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= 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= @@ -2398,14 +2489,17 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= 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 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= 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= 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= +gopkg.in/cheggaaa/pb.v1 v1.0.28 h1:n1tBJnnK2r7g9OW2btFH91V92STTUevLXYFb8gy9EMk= gopkg.in/cheggaaa/pb.v1 v1.0.28/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= @@ -2414,8 +2508,8 @@ 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/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= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/urfave/cli.v2 v2.0.0-20180128182452-d3ae77c26ac8/go.mod h1:cKXr3E0k4aosgycml1b5z33BVV6hai1Kh7uDgFOkbcs= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -2425,9 +2519,12 @@ gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +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 h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/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= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -2439,16 +2536,21 @@ honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= +howett.net/plist v0.0.0-20181124034731-591f970eefbb h1:jhnBjNi9UFpfpl8YZhA9CrOqpnJdvzuiHsl/dnxl11M= howett.net/plist v0.0.0-20181124034731-591f970eefbb/go.mod h1:vMygbs4qMhSZSc4lCUl2OEE+rDiIIJAIdR4m7MiMcm0= -launchpad.net/gocheck v0.0.0-20140225173054-000000000087/go.mod h1:hj7XX3B/0A+80Vse0e+BUHsHMTEhd0O4cpUHr/e/BUM= +modernc.org/cc v1.0.0 h1:nPibNuDEx6tvYrUAtvDTTw98rx5juGsa5zuDnKwEEQQ= 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 h1:EYKY1a3wStt0RzHaH8mdSRNg78Ub0OHxYfCRWw35YtM= 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 h1:FeylZSVX8S+58VsyJlkEj2bcpdytmp9MmDKZkKx8OIE= modernc.org/mathutil v1.1.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/strutil v1.1.0 h1:+1/yCzZxY2pZwwrsbH+4T7BQMoLQ9QiBshRC9eicYsc= modernc.org/strutil v1.1.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs= +modernc.org/xc v1.0.0 h1:7ccXrupWZIS3twbUGrtKmHS2DXY6xegFua+6O3xgAFU= modernc.org/xc v1.0.0/go.mod h1:mRNCo0bvLjGhHO9WsyuKVU4q0ceiDDDoEeWDJHrNx8I= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= From a3d8494a04727e9d2f072791dbd9ec0daf04020d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 9 Dec 2021 14:52:33 +0100 Subject: [PATCH 038/393] piecereader: Avoid redundant roundtrips when seeking --- extern/sector-storage/piece_provider.go | 25 ++++--- extern/sector-storage/piece_reader.go | 3 + extern/sector-storage/stores/remote.go | 80 +++++++++++++++++---- extern/sector-storage/stores/remote_test.go | 22 ++++-- 4 files changed, 104 insertions(+), 26 deletions(-) diff --git a/extern/sector-storage/piece_provider.go b/extern/sector-storage/piece_provider.go index c500b4e3037..2d9ca33beee 100644 --- a/extern/sector-storage/piece_provider.go +++ b/extern/sector-storage/piece_provider.go @@ -80,21 +80,28 @@ func (p *pieceProvider) tryReadUnsealedPiece(ctx context.Context, pc cid.Cid, se return nil, xerrors.Errorf("acquiring read sector lock: %w", err) } + // Reader returns a reader getter for an unsealed piece at the given offset in the given sector. + // The returned reader will be nil if none of the workers has an unsealed sector file containing + // the unsealed piece. + rg, err := p.storage.Reader(ctx, sector, abi.PaddedPieceSize(pieceOffset.Padded()), size.Padded()) + if err != nil { + cancel() + log.Debugf("did not get storage reader;sector=%+v, err:%s", sector.ID, err) + return nil, err + } + if rg == nil { + cancel() + return nil, nil + } + pr, err := (&pieceReader{ ctx: ctx, getReader: func(ctx context.Context, startOffset uint64) (io.ReadCloser, error) { startOffsetAligned := storiface.UnpaddedByteIndex(startOffset / 127 * 127) // floor to multiple of 127 - // Reader returns a reader for an unsealed piece at the given offset in the given sector. - // The returned reader will be nil if none of the workers has an unsealed sector file containing - // the unsealed piece. - r, err := p.storage.Reader(ctx, sector, abi.PaddedPieceSize(pieceOffset.Padded()+startOffsetAligned.Padded()), size.Padded()-abi.PaddedPieceSize(startOffsetAligned.Padded())) + r, err := rg(startOffsetAligned.Padded()) if err != nil { - log.Debugf("did not get storage reader;sector=%+v, err:%s", sector.ID, err) - return nil, err - } - if r == nil { - return nil, nil + return nil, xerrors.Errorf("getting reader at +%d: %w", startOffsetAligned, err) } upr, err := fr32.NewUnpadReader(r, size.Padded()) diff --git a/extern/sector-storage/piece_reader.go b/extern/sector-storage/piece_reader.go index 14f13f01771..d7a3f4e9838 100644 --- a/extern/sector-storage/piece_reader.go +++ b/extern/sector-storage/piece_reader.go @@ -67,6 +67,9 @@ func (p *pieceReader) Close() error { } if p.r != nil { + if err := p.r.Close(); err != nil { + return err + } if err := p.r.Close(); err != nil { return err } diff --git a/extern/sector-storage/stores/remote.go b/extern/sector-storage/stores/remote.go index 7935556a988..0681026c963 100644 --- a/extern/sector-storage/stores/remote.go +++ b/extern/sector-storage/stores/remote.go @@ -585,7 +585,7 @@ func (r *Remote) CheckIsUnsealed(ctx context.Context, s storage.SectorRef, offse // 1. no worker(local worker included) has an unsealed file for the given sector OR // 2. no worker(local worker included) has the unsealed piece in their unsealed sector file. // Will return a nil reader and a nil error in such a case. -func (r *Remote) Reader(ctx context.Context, s storage.SectorRef, offset, size abi.PaddedPieceSize) (io.ReadCloser, error) { +func (r *Remote) Reader(ctx context.Context, s storage.SectorRef, offset, size abi.PaddedPieceSize) (func(startOffsetAligned storiface.PaddedByteIndex) (io.ReadCloser, error), error) { ft := storiface.FTUnsealed // check if we have the unsealed sector file locally @@ -623,7 +623,52 @@ func (r *Remote) Reader(ctx context.Context, s storage.SectorRef, offset, size a if has { log.Infof("returning piece reader for local unsealed piece sector=%+v, (offset=%d, size=%d)", s.ID, offset, size) - return r.pfHandler.Reader(pf, storiface.PaddedByteIndex(offset), size) + + return func(startOffsetAligned storiface.PaddedByteIndex) (io.ReadCloser, error) { + // don't reuse between readers unless closed + f := pf + pf = nil + + if f == nil { + f, err = r.pfHandler.OpenPartialFile(abi.PaddedPieceSize(ssize), path) + if err != nil { + return nil, xerrors.Errorf("opening partial file: %w", err) + } + log.Debugf("local partial file (re)opened %s (+%d,%d)", path, offset, size) + } + + r, err := r.pfHandler.Reader(f, storiface.PaddedByteIndex(offset)+startOffsetAligned, size-abi.PaddedPieceSize(startOffsetAligned)) + if err != nil { + return nil, err + } + + return struct { + io.Reader + io.Closer + }{ + Reader: r, + Closer: funcCloser(func() error { + // if we already have a reader cached, close this one + if pf != nil { + if f == nil { + return nil + } + if pf == f { + pf = nil + } + + tmp := f + f = nil + return tmp.Close() + } + + // otherwise stash it away for reuse + pf = f + return nil + }), + }, nil + }, nil + } log.Debugf("miner has unsealed file but not unseal piece, %s (+%d,%d)", path, offset, size) @@ -666,16 +711,19 @@ func (r *Remote) Reader(ctx context.Context, s storage.SectorRef, offset, size a continue } - // readRemote fetches a reader that we can use to read the unsealed piece from the remote worker. - // It uses a ranged HTTP query to ensure we ONLY read the unsealed piece and not the entire unsealed file. - rd, err := r.readRemote(ctx, url, offset, size) - if err != nil { - log.Warnw("reading from remote", "url", url, "error", err) - lastErr = err - continue - } - log.Infof("Read remote %s (+%d,%d)", url, offset, size) - return rd, nil + return func(startOffsetAligned storiface.PaddedByteIndex) (io.ReadCloser, error) { + // readRemote fetches a reader that we can use to read the unsealed piece from the remote worker. + // It uses a ranged HTTP query to ensure we ONLY read the unsealed piece and not the entire unsealed file. + rd, err := r.readRemote(ctx, url, offset+abi.PaddedPieceSize(startOffsetAligned), size) + if err != nil { + log.Warnw("reading from remote", "url", url, "error", err) + return nil, err + } + log.Infof("Read remote %s (+%d,%d)", url, offset, size) + + return rd, err + }, nil + } } @@ -692,3 +740,11 @@ func (r *Remote) Reserve(ctx context.Context, sid storage.SectorRef, ft storifac } var _ Store = &Remote{} + +type funcCloser func() error + +func (f funcCloser) Close() error { + return f() +} + +var _ io.Closer = funcCloser(nil) diff --git a/extern/sector-storage/stores/remote_test.go b/extern/sector-storage/stores/remote_test.go index ea9179655cc..0bc439dee73 100644 --- a/extern/sector-storage/stores/remote_test.go +++ b/extern/sector-storage/stores/remote_test.go @@ -4,6 +4,7 @@ import ( "context" "encoding/json" "fmt" + "io" "io/ioutil" "net/http" "net/http/httptest" @@ -470,12 +471,20 @@ func TestReader(t *testing.T) { remoteStore := stores.NewRemote(lstore, index, nil, 6000, pfhandler) - rd, err := remoteStore.Reader(ctx, sectorRef, offset, size) + rdg, err := remoteStore.Reader(ctx, sectorRef, offset, size) + var rd io.ReadCloser if tc.errStr != "" { - require.Error(t, err) - require.Nil(t, rd) - require.Contains(t, err.Error(), tc.errStr) + if rdg == nil { + require.Error(t, err) + require.Nil(t, rdg) + require.Contains(t, err.Error(), tc.errStr) + } else { + rd, err = rdg(0) + require.Error(t, err) + require.Nil(t, rd) + require.Contains(t, err.Error(), tc.errStr) + } } else { require.NoError(t, err) } @@ -483,7 +492,10 @@ func TestReader(t *testing.T) { if !tc.expectedNonNilReader { require.Nil(t, rd) } else { - require.NotNil(t, rd) + require.NotNil(t, rdg) + rd, err := rdg(0) + require.NoError(t, err) + defer func() { require.NoError(t, rd.Close()) }() From 9c75a3aaa8d5295c55c7db398c9e3aff0831bd1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 9 Dec 2021 15:49:37 +0100 Subject: [PATCH 039/393] piecereader: Avoid allocating 1024MB slices per read --- extern/sector-storage/fr32/readers.go | 12 ++++++++++-- extern/sector-storage/piece_provider.go | 17 +++++++++++++++-- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/extern/sector-storage/fr32/readers.go b/extern/sector-storage/fr32/readers.go index f14d5bf1cbd..163c520aa4d 100644 --- a/extern/sector-storage/fr32/readers.go +++ b/extern/sector-storage/fr32/readers.go @@ -16,13 +16,21 @@ type unpadReader struct { work []byte } +func BufSize(sz abi.PaddedPieceSize) int { + return int(MTTresh * mtChunkCount(sz)) +} + func NewUnpadReader(src io.Reader, sz abi.PaddedPieceSize) (io.Reader, error) { + buf := make([]byte, BufSize(sz)) + + return NewUnpadReaderBuf(src, sz, buf) +} + +func NewUnpadReaderBuf(src io.Reader, sz abi.PaddedPieceSize, buf []byte) (io.Reader, error) { if err := sz.Validate(); err != nil { return nil, xerrors.Errorf("bad piece size: %w", err) } - buf := make([]byte, MTTresh*mtChunkCount(sz)) - return &unpadReader{ src: src, diff --git a/extern/sector-storage/piece_provider.go b/extern/sector-storage/piece_provider.go index 2d9ca33beee..4622289e8f4 100644 --- a/extern/sector-storage/piece_provider.go +++ b/extern/sector-storage/piece_provider.go @@ -94,6 +94,8 @@ func (p *pieceProvider) tryReadUnsealedPiece(ctx context.Context, pc cid.Cid, se return nil, nil } + buf := make([]byte, fr32.BufSize(size.Padded())) + pr, err := (&pieceReader{ ctx: ctx, getReader: func(ctx context.Context, startOffset uint64) (io.ReadCloser, error) { @@ -104,7 +106,7 @@ func (p *pieceProvider) tryReadUnsealedPiece(ctx context.Context, pc cid.Cid, se return nil, xerrors.Errorf("getting reader at +%d: %w", startOffsetAligned, err) } - upr, err := fr32.NewUnpadReader(r, size.Padded()) + upr, err := fr32.NewUnpadReaderBuf(r, size.Padded(), buf) if err != nil { r.Close() // nolint return nil, xerrors.Errorf("creating unpadded reader: %w", err) @@ -113,6 +115,7 @@ func (p *pieceProvider) tryReadUnsealedPiece(ctx context.Context, pc cid.Cid, se bir := bufio.NewReaderSize(upr, 127) if startOffset > uint64(startOffsetAligned) { if _, err := bir.Discard(int(startOffset - uint64(startOffsetAligned))); err != nil { + r.Close() // nolint return nil, xerrors.Errorf("discarding bytes for startOffset: %w", err) } } @@ -122,7 +125,9 @@ func (p *pieceProvider) tryReadUnsealedPiece(ctx context.Context, pc cid.Cid, se io.Closer }{ Reader: bir, - Closer: r, + Closer: funcCloser(func() error { + return r.Close() + }), }, nil }, len: size, @@ -137,6 +142,14 @@ func (p *pieceProvider) tryReadUnsealedPiece(ctx context.Context, pc cid.Cid, se return pr, err } +type funcCloser func() error + +func (f funcCloser) Close() error { + return f() +} + +var _ io.Closer = funcCloser(nil) + // ReadPiece is used to read an Unsealed piece at the given offset and of the given size from a Sector // If an Unsealed sector file exists with the Piece Unsealed in it, we'll use that for the read. // Otherwise, we will Unseal a Sealed sector file for the given sector and read the Unsealed piece from it. From 6fd160941019c29e2cbe7ade719b21d643ef74f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 9 Dec 2021 16:14:47 +0100 Subject: [PATCH 040/393] fr32: Reduce MTTresh from 32M to 512k per core This results in 64x less bytes allocated when spawning new readers for larger pieces. Results in about 30% speedup in 1G unpad benchmark on AMD TR 2950x --- extern/sector-storage/fr32/fr32.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extern/sector-storage/fr32/fr32.go b/extern/sector-storage/fr32/fr32.go index 17e6a114295..24175719ce9 100644 --- a/extern/sector-storage/fr32/fr32.go +++ b/extern/sector-storage/fr32/fr32.go @@ -8,7 +8,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" ) -var MTTresh = uint64(32 << 20) +var MTTresh = uint64(512 << 10) func mtChunkCount(usz abi.PaddedPieceSize) uint64 { threads := (uint64(usz)) / MTTresh From c31f4de7d5560d7e0667fde6abcef5bf4dcbcd5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 9 Dec 2021 16:26:59 +0100 Subject: [PATCH 041/393] Fix mock ReadPiece --- extern/sector-storage/mock/mock.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/extern/sector-storage/mock/mock.go b/extern/sector-storage/mock/mock.go index 4d0592d3667..8eaed54f69f 100644 --- a/extern/sector-storage/mock/mock.go +++ b/extern/sector-storage/mock/mock.go @@ -390,14 +390,16 @@ func (mgr *SectorMgr) ReadPiece(ctx context.Context, sector storage.SectorRef, o panic("implme") } + br := bytes.NewReader(mgr.pieces[mgr.sectors[sector.ID].pieces[0]][:size]) + return struct { io.ReadCloser io.Seeker io.ReaderAt }{ - ReadCloser: ioutil.NopCloser(bytes.NewReader(mgr.pieces[mgr.sectors[sector.ID].pieces[0]][:size])), - Seeker: nil, - ReaderAt: nil, + ReadCloser: ioutil.NopCloser(br), + Seeker: br, + ReaderAt: br, }, false, nil } From 74d3ba6b5e5ef5f09f9a062434bbd14f15e9bb3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 9 Dec 2021 18:10:34 +0100 Subject: [PATCH 042/393] fix lint --- markets/dagstore/miner_api.go | 1 + 1 file changed, 1 insertion(+) diff --git a/markets/dagstore/miner_api.go b/markets/dagstore/miner_api.go index 7f59162f0f0..77b4b97bf4e 100644 --- a/markets/dagstore/miner_api.go +++ b/markets/dagstore/miner_api.go @@ -3,6 +3,7 @@ package dagstore import ( "context" "fmt" + "github.com/ipfs/go-cid" "golang.org/x/xerrors" From 21e6c963ab26d29ccbd1ab01151e37712786c688 Mon Sep 17 00:00:00 2001 From: gstuart Date: Thu, 9 Dec 2021 19:51:22 -0500 Subject: [PATCH 043/393] Sort lotus-miner retrieval-deals by dealId --- cmd/lotus-miner/retrieval-deals.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cmd/lotus-miner/retrieval-deals.go b/cmd/lotus-miner/retrieval-deals.go index 1ce1f6593df..bd5d30a4e08 100644 --- a/cmd/lotus-miner/retrieval-deals.go +++ b/cmd/lotus-miner/retrieval-deals.go @@ -3,6 +3,7 @@ package main import ( "fmt" "os" + "sort" "text/tabwriter" "github.com/docker/go-units" @@ -137,6 +138,10 @@ var retrievalDealsListCmd = &cli.Command{ return err } + sort.Slice(deals, func(i, j int) bool { + return deals[i].ID < deals[j].ID + }) + w := tabwriter.NewWriter(os.Stdout, 2, 4, 2, ' ', 0) _, _ = fmt.Fprintf(w, "Receiver\tDealID\tPayload\tState\tPricePerByte\tBytesSent\tMessage\n") From f7a49e7be7566ed07d3676a6115d414e861cf827 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Thu, 9 Dec 2021 21:01:20 -0500 Subject: [PATCH 044/393] update to ipld-legacy to v0.1.1 --- go.mod | 11 +++++++---- go.sum | 30 +++++++++++++++++++++--------- 2 files changed, 28 insertions(+), 13 deletions(-) diff --git a/go.mod b/go.mod index a9b0bee9dcf..43b007a766b 100644 --- a/go.mod +++ b/go.mod @@ -90,6 +90,7 @@ require ( github.com/ipfs/go-ipfs-util v0.0.2 github.com/ipfs/go-ipld-cbor v0.0.5 github.com/ipfs/go-ipld-format v0.2.0 + github.com/ipfs/go-ipld-legacy v0.1.1 // indirect github.com/ipfs/go-log/v2 v2.3.0 github.com/ipfs/go-merkledag v0.4.1 github.com/ipfs/go-metrics-interface v0.0.1 @@ -100,7 +101,7 @@ require ( github.com/ipld/go-car v0.3.2-0.20211001225732-32d0d9933823 github.com/ipld/go-car/v2 v2.1.0 github.com/ipld/go-codec-dagpb v1.3.0 - github.com/ipld/go-ipld-prime v0.12.3 + github.com/ipld/go-ipld-prime v0.14.2 github.com/ipld/go-ipld-selector-text-lite v0.0.1 github.com/kelseyhightower/envconfig v1.4.0 github.com/libp2p/go-buffer-pool v0.0.2 @@ -127,7 +128,7 @@ require ( github.com/multiformats/go-multiaddr v0.4.1 github.com/multiformats/go-multiaddr-dns v0.3.1 github.com/multiformats/go-multibase v0.0.3 - github.com/multiformats/go-multihash v0.0.16 + github.com/multiformats/go-multihash v0.1.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 @@ -155,14 +156,16 @@ require ( go.uber.org/fx v1.9.0 go.uber.org/multierr v1.7.0 go.uber.org/zap v1.19.1 - golang.org/x/net v0.0.0-20210917221730-978cfadd31cf + golang.org/x/crypto v0.0.0-20211209193657-4570a0811e8b // indirect + golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 golang.org/x/sync v0.0.0-20210220032951-036812b2e83c - golang.org/x/sys v0.0.0-20210917161153-d61c044b1678 + golang.org/x/sys v0.0.0-20211209171907-798191bca915 golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac golang.org/x/tools v0.1.5 golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 gopkg.in/cheggaaa/pb.v1 v1.0.28 gotest.tools v2.2.0+incompatible + lukechampine.com/blake3 v1.1.7 // indirect ) replace github.com/filecoin-project/filecoin-ffi => ./extern/filecoin-ffi diff --git a/go.sum b/go.sum index 241b98887d0..245a03caae1 100644 --- a/go.sum +++ b/go.sum @@ -407,8 +407,9 @@ github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiD 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 h1:8sXhOn0uLys67V8EsXLc6eszDs8VXWxL3iRvebPhedY= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= +github.com/frankban/quicktest v1.14.0 h1:+cqqvzZV87b4adx/5ayVOaYZ2CrvM4ejQvUdBzPPUss= +github.com/frankban/quicktest v1.14.0/go.mod h1:NeW+ay9A/U67EYXNFA1nPE8e/tnQv/09mUdL/ijj8og= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= @@ -803,8 +804,9 @@ github.com/ipfs/go-ipld-format v0.0.1/go.mod h1:kyJtbkDALmFHv3QR6et67i35QzO3S0dC github.com/ipfs/go-ipld-format v0.0.2/go.mod h1:4B6+FM2u9OJ9zCV+kSbgFAZlOrv1Hqbf0INGQgiKf9k= github.com/ipfs/go-ipld-format v0.2.0 h1:xGlJKkArkmBvowr+GMCX0FEZtkro71K1AwiKnL37mwA= github.com/ipfs/go-ipld-format v0.2.0/go.mod h1:3l3C1uKoadTPbeNfrDi+xMInYKlx2Cvg1BuydPSdzQs= -github.com/ipfs/go-ipld-legacy v0.1.0 h1:wxkkc4k8cnvIGIjPO0waJCe7SHEyFgl+yQdafdjGrpA= 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-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= @@ -879,8 +881,9 @@ github.com/ipld/go-ipld-prime v0.9.1-0.20210324083106-dc342a9917db/go.mod h1:KvB 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-0.20210930132912-0b3aef3ca569/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= -github.com/ipld/go-ipld-prime v0.12.3 h1:furVobw7UBLQZwlEwfE26tYORy3PAK8VYSgZOSr3JMQ= github.com/ipld/go-ipld-prime v0.12.3/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= +github.com/ipld/go-ipld-prime v0.14.2 h1:P5fO2usnisXwrN/1sR5exCgEvINg/w/27EuYPKB/zx8= +github.com/ipld/go-ipld-prime v0.14.2/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= github.com/ipld/go-ipld-prime-proto v0.0.0-20191113031812-e32bd156a1e5/go.mod h1:gcvzoEDBjwycpXt3LBE061wT9f46szXGHAmj9uoP6fU= github.com/ipld/go-ipld-prime-proto v0.0.0-20200428191222-c1ffdadc01e1/go.mod h1:OAV6xBmuTLsPZ+epzKkPB1e25FHk/vCtyatkdHcArLs= github.com/ipld/go-ipld-prime-proto v0.0.0-20200922192210-9a2bfd4440a6/go.mod h1:3pHYooM9Ea65jewRwrb2u5uHZCNkNTe9ABsVB+SrkH0= @@ -972,8 +975,9 @@ github.com/koron/go-ssdp v0.0.2/go.mod h1:XoLfkAiA2KeZsYh4DbHxD7h3nR2AZNqVQOa+LJ 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= -github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= @@ -1493,8 +1497,8 @@ 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 h1:D2qsyy1WVculJbGv69pWmQ36ehxFoA5NiIUr1OEs6qI= -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= @@ -1671,6 +1675,8 @@ github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJ github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= 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= @@ -2008,8 +2014,9 @@ golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5 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 h1:3erb+vDS8lU1sxfDHF4/hhWyaXnhIaO+7RgL4fDZORA= golang.org/x/crypto v0.0.0-20210915214749-c084706c2272/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20211209193657-4570a0811e8b h1:QAqMVf3pSa6eeTsuklijukjXBlj7Es2QQplab+/RbQ4= +golang.org/x/crypto v0.0.0-20211209193657-4570a0811e8b/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= @@ -2123,8 +2130,9 @@ golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT 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-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210917221730-978cfadd31cf h1:R150MpwJIv1MpS0N/pc+NhTM8ajzvlmxlY5OYsrevXQ= golang.org/x/net v0.0.0-20210917221730-978cfadd31cf/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 h1:CIJ76btIcR3eFI5EgSo6k1qKw9KJexJuRLI9G7Hp5wE= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= 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= @@ -2247,8 +2255,9 @@ golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 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-20210917161153-d61c044b1678 h1:J27LZFQBFoihqXoegpscI10HpjZ7B5WQLLKL2FZXQKw= golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211209171907-798191bca915 h1:P+8mCzuEpyszAT6T42q0sxU+eveBAF/cJ2Kp0x6/8+0= +golang.org/x/sys v0.0.0-20211209171907-798191bca915/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 h1:MZ2shdL+ZM/XzY3ZGOnh4Nlpnxz5GSOhOmtHo3iPU6M= @@ -2505,6 +2514,9 @@ honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9 honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= howett.net/plist v0.0.0-20181124034731-591f970eefbb h1:jhnBjNi9UFpfpl8YZhA9CrOqpnJdvzuiHsl/dnxl11M= howett.net/plist v0.0.0-20181124034731-591f970eefbb/go.mod h1:vMygbs4qMhSZSc4lCUl2OEE+rDiIIJAIdR4m7MiMcm0= +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 h1:nPibNuDEx6tvYrUAtvDTTw98rx5juGsa5zuDnKwEEQQ= modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= modernc.org/fileutil v1.0.0/go.mod h1:JHsWpkrk/CnVV1H/eGlFf85BEpfkrp56ro8nojIq9Q8= From 276eabd4e51170ac0c1e25d14139617505f2ca8f Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Thu, 9 Dec 2021 22:31:46 -0500 Subject: [PATCH 045/393] Update go-storedcounter and go-ds-versioning --- go.mod | 4 ++-- go.sum | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 656bbaabb80..e274b2a0b1e 100644 --- a/go.mod +++ b/go.mod @@ -31,7 +31,7 @@ require ( github.com/filecoin-project/go-address v0.0.6 github.com/filecoin-project/go-bitfield v0.2.4 github.com/filecoin-project/go-cbor-util v0.0.1 - github.com/filecoin-project/go-commp-utils v0.1.1-0.20210427191551-70bf140d31c7 + github.com/filecoin-project/go-commp-utils v0.1.3 github.com/filecoin-project/go-crypto v0.0.1 github.com/filecoin-project/go-data-transfer v1.11.7-0.20211207053937-e06a599f202a github.com/filecoin-project/go-fil-commcid v0.1.0 @@ -43,7 +43,7 @@ require ( github.com/filecoin-project/go-state-types v0.1.1 github.com/filecoin-project/go-statemachine v1.0.1 github.com/filecoin-project/go-statestore v0.2.0 - github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b + github.com/filecoin-project/go-storedcounter v0.0.0-20211210031312-d066d7aa2f77 github.com/filecoin-project/specs-actors v0.9.14 github.com/filecoin-project/specs-actors/v2 v2.3.5 github.com/filecoin-project/specs-actors/v3 v3.1.1 diff --git a/go.sum b/go.sum index 28900d54543..2c6c36b2b6f 100644 --- a/go.sum +++ b/go.sum @@ -319,8 +319,9 @@ github.com/filecoin-project/go-bitfield v0.2.4/go.mod h1:CNl9WG8hgR5mttCnUErjcQj github.com/filecoin-project/go-cbor-util v0.0.0-20191219014500-08c40a1e63a2/go.mod h1:pqTiPHobNkOVM5thSRsHYjyQfq7O5QSCMhvuu9JoDlg= github.com/filecoin-project/go-cbor-util v0.0.1 h1:E1LYZYTtjfAQwCReho0VXvbu8t3CYAVPiMx8EiV/VAs= github.com/filecoin-project/go-cbor-util v0.0.1/go.mod h1:pqTiPHobNkOVM5thSRsHYjyQfq7O5QSCMhvuu9JoDlg= -github.com/filecoin-project/go-commp-utils v0.1.1-0.20210427191551-70bf140d31c7 h1:U9Z+76pHCKBmtdxFV7JFZJj7OVm12I6dEKwtMVbq5p0= github.com/filecoin-project/go-commp-utils v0.1.1-0.20210427191551-70bf140d31c7/go.mod h1:6s95K91mCyHY51RPWECZieD3SGWTqIFLf1mPOes9l5U= +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-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= @@ -372,8 +373,9 @@ github.com/filecoin-project/go-statestore v0.1.0/go.mod h1:LFc9hD+fRxPqiHiaqUEZO github.com/filecoin-project/go-statestore v0.1.1/go.mod h1:LFc9hD+fRxPqiHiaqUEZOinUJB4WARkRfNl10O7kTnI= github.com/filecoin-project/go-statestore v0.2.0 h1:cRRO0aPLrxKQCZ2UOQbzFGn4WDNdofHZoGPjfNaAo5Q= github.com/filecoin-project/go-statestore v0.2.0/go.mod h1:8sjBYbS35HwPzct7iT4lIXjLlYyPor80aU7t7a/Kspo= -github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b h1:fkRZSPrYpk42PV3/lIXiL0LHetxde7vyYYvSsttQtfg= github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b/go.mod h1:Q0GQOBtKf1oE10eSXSlhN45kDBdGvEcVOqMiffqX+N8= +github.com/filecoin-project/go-storedcounter v0.0.0-20211210031312-d066d7aa2f77 h1:3n7WS0WkJStS1rMbt/o+OvriHIlAuU8JKVG6wB2LqJQ= +github.com/filecoin-project/go-storedcounter v0.0.0-20211210031312-d066d7aa2f77/go.mod h1:4ceukaXi4vFURIoxYMfKzaRF5Xv/Pinh2oTnoxpv+z8= github.com/filecoin-project/specs-actors v0.9.4/go.mod h1:BStZQzx5x7TmCkLv0Bpa07U6cPKol6fd3w9KjMPZ6Z4= github.com/filecoin-project/specs-actors v0.9.12/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= From 702a7815b92535a6adaa7d632da50bc23752ee79 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Thu, 9 Dec 2021 22:46:30 -0500 Subject: [PATCH 046/393] Update go-car --- go.mod | 8 ++++---- go.sum | 24 ++++++++++++++++-------- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index e274b2a0b1e..6a70a137a4e 100644 --- a/go.mod +++ b/go.mod @@ -78,7 +78,7 @@ require ( github.com/ipfs/go-ds-pebble v0.0.2-0.20200921225637-ce220f8ac459 github.com/ipfs/go-fs-lock v0.0.6 github.com/ipfs/go-graphsync v0.11.0 - github.com/ipfs/go-ipfs-blockstore v1.1.1 + github.com/ipfs/go-ipfs-blockstore v1.1.2 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 @@ -97,10 +97,10 @@ require ( github.com/ipfs/go-path v0.0.7 github.com/ipfs/go-unixfs v0.2.6 github.com/ipfs/interface-go-ipfs-core v0.4.0 - github.com/ipld/go-car v0.3.2-0.20211001225732-32d0d9933823 + github.com/ipld/go-car v0.3.3-0.20211210032800-e6f244225a16 github.com/ipld/go-car/v2 v2.1.0 github.com/ipld/go-codec-dagpb v1.3.0 - github.com/ipld/go-ipld-prime v0.12.3 + github.com/ipld/go-ipld-prime v0.14.3-0.20211207234443-319145880958 github.com/ipld/go-ipld-selector-text-lite v0.0.1 github.com/kelseyhightower/envconfig v1.4.0 github.com/libp2p/go-buffer-pool v0.0.2 @@ -127,7 +127,7 @@ require ( github.com/multiformats/go-multiaddr v0.4.1 github.com/multiformats/go-multiaddr-dns v0.3.1 github.com/multiformats/go-multibase v0.0.3 - github.com/multiformats/go-multihash v0.0.16 + github.com/multiformats/go-multihash v0.1.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 diff --git a/go.sum b/go.sum index 2c6c36b2b6f..e3d35d47ab1 100644 --- a/go.sum +++ b/go.sum @@ -410,8 +410,9 @@ github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiD 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 h1:8sXhOn0uLys67V8EsXLc6eszDs8VXWxL3iRvebPhedY= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= +github.com/frankban/quicktest v1.14.0 h1:+cqqvzZV87b4adx/5ayVOaYZ2CrvM4ejQvUdBzPPUss= +github.com/frankban/quicktest v1.14.0/go.mod h1:NeW+ay9A/U67EYXNFA1nPE8e/tnQv/09mUdL/ijj8og= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= @@ -763,8 +764,8 @@ github.com/ipfs/go-ipfs-blockstore v1.0.1/go.mod h1:MGNZlHNEnR4KGgPHM3/k8lBySIOK github.com/ipfs/go-ipfs-blockstore v1.0.3/go.mod h1:MGNZlHNEnR4KGgPHM3/k8lBySIOK2Ve+0KjZubKlaOE= github.com/ipfs/go-ipfs-blockstore v1.0.4/go.mod h1:uL7/gTJ8QIZ3MtA3dWf+s1a0U3fJy2fcEZAsovpRp+w= github.com/ipfs/go-ipfs-blockstore v1.1.0/go.mod h1:5QDUApRqpgPcfGstCxYeMnjt/DYQtXXdJVCvxHHuWVk= -github.com/ipfs/go-ipfs-blockstore v1.1.1 h1:a4koS3l+Fzl43LAAn51/N+Yn4AjCX4AGvoZLqqkrD/g= -github.com/ipfs/go-ipfs-blockstore v1.1.1/go.mod h1:w51tNR9y5+QXB0wkNcHt4O2aSZjTdqaEWaQdSxEyUOY= +github.com/ipfs/go-ipfs-blockstore v1.1.2 h1:WCXoZcMYnvOTmlpX+RSSnhVN0uCmbWTeepTGX5lgiXw= +github.com/ipfs/go-ipfs-blockstore v1.1.2/go.mod h1:w51tNR9y5+QXB0wkNcHt4O2aSZjTdqaEWaQdSxEyUOY= github.com/ipfs/go-ipfs-blocksutil v0.0.1 h1:Eh/H4pc1hsvhzsQoMEP3Bke/aW5P5rVM1IWFJMcGIPQ= github.com/ipfs/go-ipfs-blocksutil v0.0.1/go.mod h1:Yq4M86uIOmxmGPUHv/uI7uKqZNtLb449gwKqXjIsnRk= github.com/ipfs/go-ipfs-chunker v0.0.1/go.mod h1:tWewYK0we3+rMbOh7pPFGDyypCtvGcBFymgY4rSDLAw= @@ -875,8 +876,9 @@ github.com/ipfs/iptb-plugins v0.3.0/go.mod h1:5QtOvckeIw4bY86gSH4fgh3p3gCSMn3FmI github.com/ipld/go-car v0.1.0/go.mod h1:RCWzaUh2i4mOEkB3W45Vc+9jnS/M6Qay5ooytiBHl3g= github.com/ipld/go-car v0.1.1-0.20200923150018-8cdef32e2da4/go.mod h1:xrMEcuSq+D1vEwl+YAXsg/JfA98XGpXDwnkIL4Aimqw= github.com/ipld/go-car v0.1.1-0.20201119040415-11b6074b6d4d/go.mod h1:2Gys8L8MJ6zkh1gktTSXreY63t4UbyvNp5JaudTyxHQ= -github.com/ipld/go-car v0.3.2-0.20211001225732-32d0d9933823 h1:8JMSJ0k71fU9lIUrpVwEdoX4KoxiTEX8cZG97v/hTDw= github.com/ipld/go-car v0.3.2-0.20211001225732-32d0d9933823/go.mod h1:jSlTph+i/q1jLFoiKKeN69KGG0fXpwrcD0izu5C1Tpo= +github.com/ipld/go-car v0.3.3-0.20211210032800-e6f244225a16 h1:y6CW3GCY5Nm86/9vwphaghTTmOvEtfJjBOAzAIy3/Mk= +github.com/ipld/go-car v0.3.3-0.20211210032800-e6f244225a16/go.mod h1:/wkKF4908ULT4dFIFIUZYcfjAnj+KFnJvlh8Hsz1FbQ= github.com/ipld/go-car/v2 v2.0.0-beta1.0.20210721090610-5a9d1b217d25/go.mod h1:I2ACeeg6XNBe5pdh5TaR7Ambhfa7If9KXxmXgZsYENU= github.com/ipld/go-car/v2 v2.1.0 h1:t8R/WXUSkfu1K1gpPk76mytCxsEdMjGcMIgpOq3/Cnw= github.com/ipld/go-car/v2 v2.1.0/go.mod h1:Xr6GwkDhv8dtOtgHzOynAkIOg0t0YiPc5DxBPppWqZA= @@ -892,8 +894,9 @@ github.com/ipld/go-ipld-prime v0.9.1-0.20210324083106-dc342a9917db/go.mod h1:KvB 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-0.20210930132912-0b3aef3ca569/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= -github.com/ipld/go-ipld-prime v0.12.3 h1:furVobw7UBLQZwlEwfE26tYORy3PAK8VYSgZOSr3JMQ= github.com/ipld/go-ipld-prime v0.12.3/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= +github.com/ipld/go-ipld-prime v0.14.3-0.20211207234443-319145880958 h1:olscE5Sv+ts+N9YLQsIL9k6eS6y6CXMGRl5RCr2Cn/E= +github.com/ipld/go-ipld-prime v0.14.3-0.20211207234443-319145880958/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= github.com/ipld/go-ipld-prime-proto v0.0.0-20191113031812-e32bd156a1e5/go.mod h1:gcvzoEDBjwycpXt3LBE061wT9f46szXGHAmj9uoP6fU= github.com/ipld/go-ipld-prime-proto v0.0.0-20200428191222-c1ffdadc01e1/go.mod h1:OAV6xBmuTLsPZ+epzKkPB1e25FHk/vCtyatkdHcArLs= github.com/ipld/go-ipld-prime-proto v0.0.0-20200922192210-9a2bfd4440a6/go.mod h1:3pHYooM9Ea65jewRwrb2u5uHZCNkNTe9ABsVB+SrkH0= @@ -984,8 +987,9 @@ github.com/koron/go-ssdp v0.0.2/go.mod h1:XoLfkAiA2KeZsYh4DbHxD7h3nR2AZNqVQOa+LJ 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= -github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= @@ -1528,8 +1532,8 @@ 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 h1:D2qsyy1WVculJbGv69pWmQ36ehxFoA5NiIUr1OEs6qI= -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= @@ -1706,6 +1710,8 @@ github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJ github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= 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= @@ -2540,6 +2546,8 @@ honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9 honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= howett.net/plist v0.0.0-20181124034731-591f970eefbb h1:jhnBjNi9UFpfpl8YZhA9CrOqpnJdvzuiHsl/dnxl11M= howett.net/plist v0.0.0-20181124034731-591f970eefbb/go.mod h1:vMygbs4qMhSZSc4lCUl2OEE+rDiIIJAIdR4m7MiMcm0= +lukechampine.com/blake3 v1.1.6 h1:H3cROdztr7RCfoaTpGZFQsrqvweFLrqS73j7L7cmR5c= +lukechampine.com/blake3 v1.1.6/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= modernc.org/cc v1.0.0 h1:nPibNuDEx6tvYrUAtvDTTw98rx5juGsa5zuDnKwEEQQ= modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= modernc.org/fileutil v1.0.0/go.mod h1:JHsWpkrk/CnVV1H/eGlFf85BEpfkrp56ro8nojIq9Q8= From e8ef39e734175cad5633a0a7bac69285874a5979 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 10 Dec 2021 11:28:04 +0100 Subject: [PATCH 047/393] stores: Reduce log spam during retrievals --- extern/sector-storage/stores/http_handler.go | 1 - extern/sector-storage/stores/remote.go | 1 - 2 files changed, 2 deletions(-) diff --git a/extern/sector-storage/stores/http_handler.go b/extern/sector-storage/stores/http_handler.go index 5996392d81f..771a9a3a1a3 100644 --- a/extern/sector-storage/stores/http_handler.go +++ b/extern/sector-storage/stores/http_handler.go @@ -84,7 +84,6 @@ func (handler *FetchHandler) remoteStatFs(w http.ResponseWriter, r *http.Request // remoteGetSector returns the sector file/tared directory byte stream for the sectorID and sector file type sent in the request. // returns an error if it does NOT have the required sector file/dir. func (handler *FetchHandler) remoteGetSector(w http.ResponseWriter, r *http.Request) { - log.Infof("SERVE GET %s", r.URL) vars := mux.Vars(r) id, err := storiface.ParseSectorID(vars["id"]) diff --git a/extern/sector-storage/stores/remote.go b/extern/sector-storage/stores/remote.go index 0681026c963..bd6b34be334 100644 --- a/extern/sector-storage/stores/remote.go +++ b/extern/sector-storage/stores/remote.go @@ -719,7 +719,6 @@ func (r *Remote) Reader(ctx context.Context, s storage.SectorRef, offset, size a log.Warnw("reading from remote", "url", url, "error", err) return nil, err } - log.Infof("Read remote %s (+%d,%d)", url, offset, size) return rd, err }, nil From 95f86f9de05d0253f55abd3dd44eb0a2926be04d Mon Sep 17 00:00:00 2001 From: Darko Brdareski Date: Fri, 10 Dec 2021 11:33:29 +0100 Subject: [PATCH 048/393] Annotate feature syncer --- chain/sync_test.go | 40 ++++++++++++++++++++++++ itests/api_test.go | 5 +++ itests/ccupgrade_test.go | 5 +++ itests/cli_test.go | 5 +++ itests/deadlines_test.go | 5 +++ itests/deals_512mb_test.go | 5 +++ itests/deals_concurrent_test.go | 5 +++ itests/deals_max_staging_deals_test.go | 5 +++ itests/deals_offline_test.go | 6 +++- itests/deals_padding_test.go | 6 +++- itests/deals_partial_retrieval_test.go | 5 ++- itests/deals_power_test.go | 5 +++ itests/deals_pricing_test.go | 9 ++++++ itests/deals_publish_test.go | 5 +++ itests/deals_retry_deal_no_funds_test.go | 13 ++++++++ itests/deals_test.go | 5 +++ itests/gateway_test.go | 17 ++++++++++ itests/get_messages_in_ts_test.go | 5 +++ itests/multisig_test.go | 5 +++ itests/nonce_test.go | 5 +++ itests/paych_api_test.go | 5 +++ itests/paych_cli_test.go | 17 ++++++++++ itests/sdr_upgrade_test.go | 5 +++ itests/sector_finalize_early_test.go | 5 +++ itests/sector_miner_collateral_test.go | 5 +++ itests/sector_pledge_test.go | 13 ++++++++ itests/sector_terminate_test.go | 5 +++ itests/tape_test.go | 5 +++ itests/verifreg_test.go | 5 +++ itests/wdpost_dispute_test.go | 9 ++++++ itests/wdpost_test.go | 13 ++++++++ 31 files changed, 245 insertions(+), 3 deletions(-) diff --git a/chain/sync_test.go b/chain/sync_test.go index 4175ff5fa6b..28c9629b865 100644 --- a/chain/sync_test.go +++ b/chain/sync_test.go @@ -1,3 +1,4 @@ +//stm: #unit package chain_test import ( @@ -460,6 +461,8 @@ func (tu *syncTestUtil) waitUntilSyncTarget(to int, target *types.TipSet) { } func TestSyncSimple(t *testing.T) { + //stm: @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01, @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, @BLOCKCHAIN_SYNCER_START_001 + //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 H := 50 tu := prepSyncTest(t, H) @@ -476,6 +479,8 @@ func TestSyncSimple(t *testing.T) { } func TestSyncMining(t *testing.T) { + //stm: @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01, @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, @BLOCKCHAIN_SYNCER_START_001 + //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 H := 50 tu := prepSyncTest(t, H) @@ -498,6 +503,8 @@ func TestSyncMining(t *testing.T) { } func TestSyncBadTimestamp(t *testing.T) { + //stm: @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01, @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, @BLOCKCHAIN_SYNCER_START_001 + //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 H := 50 tu := prepSyncTest(t, H) @@ -552,6 +559,8 @@ func (wpp badWpp) ComputeProof(context.Context, []proof2.SectorInfo, abi.PoStRan } func TestSyncBadWinningPoSt(t *testing.T) { + //stm: @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01, @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, @BLOCKCHAIN_SYNCER_START_001 + //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 H := 15 tu := prepSyncTest(t, H) @@ -581,6 +590,9 @@ func (tu *syncTestUtil) loadChainToNode(to int) { } func TestSyncFork(t *testing.T) { + //stm: @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01, @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, @BLOCKCHAIN_SYNCER_START_001 + //stm: @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 + //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 H := 10 tu := prepSyncTest(t, H) @@ -648,6 +660,9 @@ func TestSyncFork(t *testing.T) { // A and B both include _different_ messages from sender X with nonce N (where N is the correct nonce for X). // We can confirm that the state can be correctly computed, and that `MessagesForTipset` behaves as expected. func TestDuplicateNonce(t *testing.T) { + //stm: @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01, @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, @BLOCKCHAIN_SYNCER_START_001 + //stm: @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 + //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 H := 10 tu := prepSyncTest(t, H) @@ -743,6 +758,9 @@ func TestDuplicateNonce(t *testing.T) { // This test asserts that a block that includes a message with bad nonce can't be synced. A nonce is "bad" if it can't // be applied on the parent state. func TestBadNonce(t *testing.T) { + //stm: @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01, @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, @BLOCKCHAIN_SYNCER_START_001 + //stm: @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001 + //stm: @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001, @BLOCKCHAIN_SYNCER_STOP_001 H := 10 tu := prepSyncTest(t, H) @@ -790,6 +808,9 @@ func TestBadNonce(t *testing.T) { // One of the messages uses the sender's robust address, the other uses the ID address. // Such a block is invalid and should not sync. func TestMismatchedNoncesRobustID(t *testing.T) { + //stm: @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01, @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, @BLOCKCHAIN_SYNCER_START_001 + //stm: @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001 + //stm: @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001, @BLOCKCHAIN_SYNCER_STOP_001 v5h := abi.ChainEpoch(4) tu := prepSyncTestWithV5Height(t, int(v5h+5), v5h) @@ -844,6 +865,9 @@ func TestMismatchedNoncesRobustID(t *testing.T) { // One of the messages uses the sender's robust address, the other uses the ID address. // Such a block is valid and should sync. func TestMatchedNoncesRobustID(t *testing.T) { + //stm: @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01, @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, @BLOCKCHAIN_SYNCER_START_001 + //stm: @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001 + //stm: @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001, @BLOCKCHAIN_SYNCER_STOP_001 v5h := abi.ChainEpoch(4) tu := prepSyncTestWithV5Height(t, int(v5h+5), v5h) @@ -915,6 +939,8 @@ func runSyncBenchLength(b *testing.B, l int) { } func TestSyncInputs(t *testing.T) { + //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, @BLOCKCHAIN_SYNCER_VALIDATE_BLOCK_001, + //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_STOP_001 H := 10 tu := prepSyncTest(t, H) @@ -942,6 +968,9 @@ func TestSyncInputs(t *testing.T) { } func TestSyncCheckpointHead(t *testing.T) { + //stm: @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01, @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, @BLOCKCHAIN_SYNCER_START_001 + //stm: @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001 + //stm: @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001, @BLOCKCHAIN_SYNCER_STOP_001 H := 10 tu := prepSyncTest(t, H) @@ -961,6 +990,7 @@ func TestSyncCheckpointHead(t *testing.T) { a = tu.mineOnBlock(a, p1, []int{0}, true, false, nil, 0, true) tu.waitUntilSyncTarget(p1, a.TipSet()) + //stm: @BLOCKCHAIN_SYNCER_CHECKPOINT_001 tu.checkpointTs(p1, a.TipSet().Key()) require.NoError(t, tu.g.ResyncBankerNonce(a1.TipSet())) @@ -980,15 +1010,20 @@ func TestSyncCheckpointHead(t *testing.T) { tu.waitUntilNodeHasTs(p1, b.TipSet().Key()) p1Head := tu.getHead(p1) require.True(tu.t, p1Head.Equals(a.TipSet())) + //stm: @BLOCKCHAIN_SYNCER_CHECK_BAD_001 tu.assertBad(p1, b.TipSet()) // Should be able to switch forks. + //stm: @BLOCKCHAIN_SYNCER_CHECKPOINT_001 tu.checkpointTs(p1, b.TipSet().Key()) p1Head = tu.getHead(p1) require.True(tu.t, p1Head.Equals(b.TipSet())) } func TestSyncCheckpointEarlierThanHead(t *testing.T) { + //stm: @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01, @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, @BLOCKCHAIN_SYNCER_START_001 + //stm: @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001 + //stm: @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001, @BLOCKCHAIN_SYNCER_STOP_001 H := 10 tu := prepSyncTest(t, H) @@ -1008,6 +1043,7 @@ func TestSyncCheckpointEarlierThanHead(t *testing.T) { a = tu.mineOnBlock(a, p1, []int{0}, true, false, nil, 0, true) tu.waitUntilSyncTarget(p1, a.TipSet()) + //stm: @BLOCKCHAIN_SYNCER_CHECKPOINT_001 tu.checkpointTs(p1, a1.TipSet().Key()) require.NoError(t, tu.g.ResyncBankerNonce(a1.TipSet())) @@ -1027,15 +1063,19 @@ func TestSyncCheckpointEarlierThanHead(t *testing.T) { tu.waitUntilNodeHasTs(p1, b.TipSet().Key()) p1Head := tu.getHead(p1) require.True(tu.t, p1Head.Equals(a.TipSet())) + //stm: @BLOCKCHAIN_SYNCER_CHECK_BAD_001 tu.assertBad(p1, b.TipSet()) // Should be able to switch forks. + //stm: @BLOCKCHAIN_SYNCER_CHECKPOINT_001 tu.checkpointTs(p1, b.TipSet().Key()) p1Head = tu.getHead(p1) require.True(tu.t, p1Head.Equals(b.TipSet())) } func TestInvalidHeight(t *testing.T) { + //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, @BLOCKCHAIN_SYNCER_START_001 + //stm: @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 H := 50 tu := prepSyncTest(t, H) diff --git a/itests/api_test.go b/itests/api_test.go index c380a6ed894..847645f4de5 100644 --- a/itests/api_test.go +++ b/itests/api_test.go @@ -1,3 +1,4 @@ +//stm: #integration package itests import ( @@ -19,6 +20,10 @@ import ( ) func TestAPI(t *testing.T) { + //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, + //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 + //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 + //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 t.Run("direct", func(t *testing.T) { runAPITest(t) }) diff --git a/itests/ccupgrade_test.go b/itests/ccupgrade_test.go index c5b38083512..d579683781e 100644 --- a/itests/ccupgrade_test.go +++ b/itests/ccupgrade_test.go @@ -1,3 +1,4 @@ +//stm: #integration package itests import ( @@ -14,6 +15,10 @@ import ( ) func TestCCUpgrade(t *testing.T) { + //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, + //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 + //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 + //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 kit.QuietMiningLogs() for _, height := range []abi.ChainEpoch{ diff --git a/itests/cli_test.go b/itests/cli_test.go index 0bd1ec3b421..37e2cbc0380 100644 --- a/itests/cli_test.go +++ b/itests/cli_test.go @@ -1,3 +1,4 @@ +//stm: #integration package itests import ( @@ -11,6 +12,10 @@ import ( // TestClient does a basic test to exercise the client CLI commands. func TestClient(t *testing.T) { + //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, + //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 + //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 + //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 _ = os.Setenv("BELLMAN_NO_GPU", "1") kit.QuietMiningLogs() diff --git a/itests/deadlines_test.go b/itests/deadlines_test.go index c698f1154c5..583d270118c 100644 --- a/itests/deadlines_test.go +++ b/itests/deadlines_test.go @@ -1,3 +1,4 @@ +//stm: #integration package itests import ( @@ -52,6 +53,10 @@ import ( // * asserts that miner B loses power // * asserts that miner D loses power, is inactive func TestDeadlineToggling(t *testing.T) { + //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, + //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 + //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 + //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 kit.Expensive(t) kit.QuietMiningLogs() diff --git a/itests/deals_512mb_test.go b/itests/deals_512mb_test.go index 766d83835fc..fc94bbaf92d 100644 --- a/itests/deals_512mb_test.go +++ b/itests/deals_512mb_test.go @@ -1,3 +1,4 @@ +//stm: #integration package itests import ( @@ -12,6 +13,10 @@ import ( ) func TestStorageDealMissingBlock(t *testing.T) { + //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, + //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 + //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 + //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 ctx := context.Background() // enable 512MiB proofs so we can conduct larger transfers. diff --git a/itests/deals_concurrent_test.go b/itests/deals_concurrent_test.go index c0458e8d1dd..fee034e0c49 100644 --- a/itests/deals_concurrent_test.go +++ b/itests/deals_concurrent_test.go @@ -1,3 +1,4 @@ +//stm: #integration package itests import ( @@ -71,6 +72,10 @@ func TestDealWithMarketAndMinerNode(t *testing.T) { } func TestDealCyclesConcurrent(t *testing.T) { + //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, + //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 + //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 + //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 if testing.Short() { t.Skip("skipping test in short mode") } diff --git a/itests/deals_max_staging_deals_test.go b/itests/deals_max_staging_deals_test.go index 895a07954a3..ac333d5577c 100644 --- a/itests/deals_max_staging_deals_test.go +++ b/itests/deals_max_staging_deals_test.go @@ -1,3 +1,4 @@ +//stm: #integration package itests import ( @@ -12,6 +13,10 @@ import ( ) func TestMaxStagingDeals(t *testing.T) { + //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, + //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 + //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 + //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 ctx := context.Background() // enable 512MiB proofs so we can conduct larger transfers. diff --git a/itests/deals_offline_test.go b/itests/deals_offline_test.go index 003f12b1106..779ddbbad63 100644 --- a/itests/deals_offline_test.go +++ b/itests/deals_offline_test.go @@ -1,3 +1,4 @@ +//stm: #integration package itests import ( @@ -16,7 +17,10 @@ import ( ) func TestOfflineDealFlow(t *testing.T) { - + //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, + //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 + //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 + //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 runTest := func(t *testing.T, fastRet bool, upscale abi.PaddedPieceSize) { ctx := context.Background() client, miner, ens := kit.EnsembleMinimal(t, kit.WithAllSubsystems()) // no mock proofs diff --git a/itests/deals_padding_test.go b/itests/deals_padding_test.go index cd15d30d7e4..a0213a121a1 100644 --- a/itests/deals_padding_test.go +++ b/itests/deals_padding_test.go @@ -1,3 +1,4 @@ +//stm: #integration package itests import ( @@ -14,7 +15,10 @@ import ( ) func TestDealPadding(t *testing.T) { - + //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, + //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 + //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 + //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 kit.QuietMiningLogs() var blockTime = 250 * time.Millisecond diff --git a/itests/deals_partial_retrieval_test.go b/itests/deals_partial_retrieval_test.go index ffc8c5e2cf6..cb5ed237183 100644 --- a/itests/deals_partial_retrieval_test.go +++ b/itests/deals_partial_retrieval_test.go @@ -36,7 +36,10 @@ var ( ) func TestPartialRetrieval(t *testing.T) { - + //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, + //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 + //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 + //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 ctx := context.Background() policy.SetPreCommitChallengeDelay(2) diff --git a/itests/deals_power_test.go b/itests/deals_power_test.go index 0c29ad06028..02f304b528e 100644 --- a/itests/deals_power_test.go +++ b/itests/deals_power_test.go @@ -1,3 +1,4 @@ +//stm: #integration package itests import ( @@ -9,6 +10,10 @@ import ( ) func TestFirstDealEnablesMining(t *testing.T) { + //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, + //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 + //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 + //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 // test making a deal with a fresh miner, and see if it starts to mine. if testing.Short() { t.Skip("skipping test in short mode") diff --git a/itests/deals_pricing_test.go b/itests/deals_pricing_test.go index eb28af0bd1e..e57f5a8fc77 100644 --- a/itests/deals_pricing_test.go +++ b/itests/deals_pricing_test.go @@ -1,3 +1,4 @@ +//stm: #integration package itests import ( @@ -12,6 +13,10 @@ import ( ) func TestQuotePriceForUnsealedRetrieval(t *testing.T) { + //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, + //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 + //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 + //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 var ( ctx = context.Background() blocktime = 50 * time.Millisecond @@ -100,6 +105,10 @@ iLoop: } func TestZeroPricePerByteRetrieval(t *testing.T) { + //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, + //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 + //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 + //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 if testing.Short() { t.Skip("skipping test in short mode") } diff --git a/itests/deals_publish_test.go b/itests/deals_publish_test.go index 85a358f0646..580a4e2bdcc 100644 --- a/itests/deals_publish_test.go +++ b/itests/deals_publish_test.go @@ -1,3 +1,4 @@ +//stm: #integration package itests import ( @@ -23,6 +24,10 @@ import ( ) func TestPublishDealsBatching(t *testing.T) { + //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, + //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 + //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 + //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 var ( ctx = context.Background() publishPeriod = 10 * time.Second diff --git a/itests/deals_retry_deal_no_funds_test.go b/itests/deals_retry_deal_no_funds_test.go index 202d86b9fc1..ed493e70aff 100644 --- a/itests/deals_retry_deal_no_funds_test.go +++ b/itests/deals_retry_deal_no_funds_test.go @@ -1,3 +1,4 @@ +//stm: #integration package itests import ( @@ -26,6 +27,10 @@ var ( ) func TestDealsRetryLackOfFunds(t *testing.T) { + //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, + //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 + //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 + //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 ctx := context.Background() oldDelay := policy.GetPreCommitChallengeDelay() policy.SetPreCommitChallengeDelay(5) @@ -105,6 +110,10 @@ func TestDealsRetryLackOfFunds(t *testing.T) { } func TestDealsRetryLackOfFunds_blockInPublishDeal(t *testing.T) { + //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, + //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 + //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 + //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 ctx := context.Background() oldDelay := policy.GetPreCommitChallengeDelay() policy.SetPreCommitChallengeDelay(5) @@ -181,6 +190,10 @@ func TestDealsRetryLackOfFunds_blockInPublishDeal(t *testing.T) { } func TestDealsRetryLackOfFunds_belowLimit(t *testing.T) { + //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, + //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 + //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 + //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 ctx := context.Background() oldDelay := policy.GetPreCommitChallengeDelay() policy.SetPreCommitChallengeDelay(5) diff --git a/itests/deals_test.go b/itests/deals_test.go index 4ad97e969e6..a6f2955cac8 100644 --- a/itests/deals_test.go +++ b/itests/deals_test.go @@ -1,3 +1,4 @@ +//stm: #integration package itests import ( @@ -9,6 +10,10 @@ import ( ) func TestDealsWithSealingAndRPC(t *testing.T) { + //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, + //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 + //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 + //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 if testing.Short() { t.Skip("skipping test in short mode") } diff --git a/itests/gateway_test.go b/itests/gateway_test.go index f9e4a0fb6fd..c0146b066bc 100644 --- a/itests/gateway_test.go +++ b/itests/gateway_test.go @@ -1,3 +1,4 @@ +//stm: #integration package itests import ( @@ -38,6 +39,10 @@ const ( // TestGatewayWalletMsig tests that API calls to wallet and msig can be made on a lite // node that is connected through a gateway to a full API node func TestGatewayWalletMsig(t *testing.T) { + //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, + //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 + //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 + //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 kit.QuietMiningLogs() blocktime := 5 * time.Millisecond @@ -169,6 +174,10 @@ func TestGatewayWalletMsig(t *testing.T) { // TestGatewayMsigCLI tests that msig CLI calls can be made // on a lite node that is connected through a gateway to a full API node func TestGatewayMsigCLI(t *testing.T) { + //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, + //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 + //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 + //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 kit.QuietMiningLogs() blocktime := 5 * time.Millisecond @@ -180,6 +189,10 @@ func TestGatewayMsigCLI(t *testing.T) { } func TestGatewayDealFlow(t *testing.T) { + //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, + //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 + //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 + //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 kit.QuietMiningLogs() blocktime := 5 * time.Millisecond @@ -202,6 +215,10 @@ func TestGatewayDealFlow(t *testing.T) { } func TestGatewayCLIDealFlow(t *testing.T) { + //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, + //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 + //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 + //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 kit.QuietMiningLogs() blocktime := 5 * time.Millisecond diff --git a/itests/get_messages_in_ts_test.go b/itests/get_messages_in_ts_test.go index 61219a316c3..9e06b68523c 100644 --- a/itests/get_messages_in_ts_test.go +++ b/itests/get_messages_in_ts_test.go @@ -1,3 +1,4 @@ +//stm: #integration package itests import ( @@ -16,6 +17,10 @@ import ( ) func TestChainGetMessagesInTs(t *testing.T) { + //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, + //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 + //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 + //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 ctx := context.Background() kit.QuietMiningLogs() diff --git a/itests/multisig_test.go b/itests/multisig_test.go index 9a15e8c0ef0..d4954c6ce3d 100644 --- a/itests/multisig_test.go +++ b/itests/multisig_test.go @@ -1,3 +1,4 @@ +//stm: #integration package itests import ( @@ -10,6 +11,10 @@ import ( // TestMultisig does a basic test to exercise the multisig CLI commands func TestMultisig(t *testing.T) { + //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, + //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 + //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 + //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 kit.QuietMiningLogs() blockTime := 5 * time.Millisecond diff --git a/itests/nonce_test.go b/itests/nonce_test.go index b50fcbe2660..0940dc43e00 100644 --- a/itests/nonce_test.go +++ b/itests/nonce_test.go @@ -1,3 +1,4 @@ +//stm: #integration package itests import ( @@ -13,6 +14,10 @@ import ( ) func TestNonceIncremental(t *testing.T) { + //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, + //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 + //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 + //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 ctx := context.Background() kit.QuietMiningLogs() diff --git a/itests/paych_api_test.go b/itests/paych_api_test.go index 49c23545b44..01693ec35fc 100644 --- a/itests/paych_api_test.go +++ b/itests/paych_api_test.go @@ -1,3 +1,4 @@ +//stm: #integration package itests import ( @@ -27,6 +28,10 @@ import ( ) func TestPaymentChannelsAPI(t *testing.T) { + //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, + //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 + //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 + //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 kit.QuietMiningLogs() ctx := context.Background() diff --git a/itests/paych_cli_test.go b/itests/paych_cli_test.go index a4ad1920b6e..c7277ba9ed9 100644 --- a/itests/paych_cli_test.go +++ b/itests/paych_cli_test.go @@ -1,3 +1,4 @@ +//stm: #integration package itests import ( @@ -30,6 +31,10 @@ import ( // TestPaymentChannelsBasic does a basic test to exercise the payment channel CLI // commands func TestPaymentChannelsBasic(t *testing.T) { + //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, + //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 + //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 + //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 _ = os.Setenv("BELLMAN_NO_GPU", "1") kit.QuietMiningLogs() @@ -87,6 +92,10 @@ type voucherSpec struct { // TestPaymentChannelStatus tests the payment channel status CLI command func TestPaymentChannelStatus(t *testing.T) { + //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, + //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 + //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 + //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 _ = os.Setenv("BELLMAN_NO_GPU", "1") kit.QuietMiningLogs() @@ -167,6 +176,10 @@ func TestPaymentChannelStatus(t *testing.T) { // TestPaymentChannelVouchers does a basic test to exercise some payment // channel voucher commands func TestPaymentChannelVouchers(t *testing.T) { + //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, + //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 + //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 + //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 _ = os.Setenv("BELLMAN_NO_GPU", "1") kit.QuietMiningLogs() @@ -299,6 +312,10 @@ func TestPaymentChannelVouchers(t *testing.T) { // TestPaymentChannelVoucherCreateShortfall verifies that if a voucher amount // is greater than what's left in the channel, voucher create fails func TestPaymentChannelVoucherCreateShortfall(t *testing.T) { + //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, + //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 + //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 + //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 _ = os.Setenv("BELLMAN_NO_GPU", "1") kit.QuietMiningLogs() diff --git a/itests/sdr_upgrade_test.go b/itests/sdr_upgrade_test.go index f4cefd67c2a..0781551605b 100644 --- a/itests/sdr_upgrade_test.go +++ b/itests/sdr_upgrade_test.go @@ -1,3 +1,4 @@ +//stm: #integration package itests import ( @@ -17,6 +18,10 @@ import ( ) func TestSDRUpgrade(t *testing.T) { + //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, + //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 + //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 + //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 kit.QuietMiningLogs() // oldDelay := policy.GetPreCommitChallengeDelay() diff --git a/itests/sector_finalize_early_test.go b/itests/sector_finalize_early_test.go index fa5cc9dd303..a67a2afdce9 100644 --- a/itests/sector_finalize_early_test.go +++ b/itests/sector_finalize_early_test.go @@ -1,3 +1,4 @@ +//stm: #integration package itests import ( @@ -18,6 +19,10 @@ import ( ) func TestDealsWithFinalizeEarly(t *testing.T) { + //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, + //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 + //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 + //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 if testing.Short() { t.Skip("skipping test in short mode") } diff --git a/itests/sector_miner_collateral_test.go b/itests/sector_miner_collateral_test.go index de3da21f624..afaa31e1c7f 100644 --- a/itests/sector_miner_collateral_test.go +++ b/itests/sector_miner_collateral_test.go @@ -1,3 +1,4 @@ +//stm: #integration package itests import ( @@ -21,6 +22,10 @@ import ( ) func TestMinerBalanceCollateral(t *testing.T) { + //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, + //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 + //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 + //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 kit.QuietMiningLogs() blockTime := 5 * time.Millisecond diff --git a/itests/sector_pledge_test.go b/itests/sector_pledge_test.go index a32eb958ff3..abe5eb84383 100644 --- a/itests/sector_pledge_test.go +++ b/itests/sector_pledge_test.go @@ -1,3 +1,4 @@ +//stm: #integration package itests import ( @@ -22,6 +23,10 @@ import ( ) func TestPledgeSectors(t *testing.T) { + //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, + //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 + //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 + //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 kit.QuietMiningLogs() blockTime := 50 * time.Millisecond @@ -110,6 +115,10 @@ func TestPledgeBatching(t *testing.T) { } func TestPledgeMaxBatching(t *testing.T) { + //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, + //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 + //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 + //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 blockTime := 50 * time.Millisecond runTest := func(t *testing.T) { @@ -182,6 +191,10 @@ func TestPledgeMaxBatching(t *testing.T) { } func TestPledgeBeforeNv13(t *testing.T) { + //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, + //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 + //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 + //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 blocktime := 50 * time.Millisecond runTest := func(t *testing.T, nSectors int) { diff --git a/itests/sector_terminate_test.go b/itests/sector_terminate_test.go index 2a3143a0a6d..0eec80a1f13 100644 --- a/itests/sector_terminate_test.go +++ b/itests/sector_terminate_test.go @@ -1,3 +1,4 @@ +//stm: #integration package itests import ( @@ -14,6 +15,10 @@ import ( ) func TestTerminate(t *testing.T) { + //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, + //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 + //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 + //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 kit.Expensive(t) kit.QuietMiningLogs() diff --git a/itests/tape_test.go b/itests/tape_test.go index c6728b83482..ea154ba7cac 100644 --- a/itests/tape_test.go +++ b/itests/tape_test.go @@ -1,3 +1,4 @@ +//stm: #integration package itests import ( @@ -14,6 +15,10 @@ import ( ) func TestTapeFix(t *testing.T) { + //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, + //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 + //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 + //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 kit.QuietMiningLogs() var blocktime = 2 * time.Millisecond diff --git a/itests/verifreg_test.go b/itests/verifreg_test.go index 80a21b0a036..6a3c7f3b762 100644 --- a/itests/verifreg_test.go +++ b/itests/verifreg_test.go @@ -1,3 +1,4 @@ +//stm: #integration package itests import ( @@ -23,6 +24,10 @@ import ( ) func TestVerifiedClientTopUp(t *testing.T) { + //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, + //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 + //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 + //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 blockTime := 100 * time.Millisecond test := func(nv network.Version, shouldWork bool) func(*testing.T) { diff --git a/itests/wdpost_dispute_test.go b/itests/wdpost_dispute_test.go index aa892aca714..2bebc8453d8 100644 --- a/itests/wdpost_dispute_test.go +++ b/itests/wdpost_dispute_test.go @@ -1,3 +1,4 @@ +//stm: #integration package itests import ( @@ -20,6 +21,10 @@ import ( ) func TestWindowPostDispute(t *testing.T) { + //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, + //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 + //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 + //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 kit.Expensive(t) kit.QuietMiningLogs() @@ -210,6 +215,10 @@ func TestWindowPostDispute(t *testing.T) { } func TestWindowPostDisputeFails(t *testing.T) { + //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, + //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 + //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 + //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 kit.Expensive(t) kit.QuietMiningLogs() diff --git a/itests/wdpost_test.go b/itests/wdpost_test.go index d87059bb48d..9c8a88693b1 100644 --- a/itests/wdpost_test.go +++ b/itests/wdpost_test.go @@ -1,3 +1,4 @@ +//stm: #integration package itests import ( @@ -23,6 +24,10 @@ import ( ) func TestWindowedPost(t *testing.T) { + //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, + //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 + //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 + //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 kit.Expensive(t) kit.QuietMiningLogs() @@ -203,6 +208,10 @@ func testWindowPostUpgrade(t *testing.T, blocktime time.Duration, nSectors int, } func TestWindowPostBaseFeeNoBurn(t *testing.T) { + //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, + //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 + //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 + //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 kit.Expensive(t) kit.QuietMiningLogs() @@ -256,6 +265,10 @@ waitForProof: } func TestWindowPostBaseFeeBurn(t *testing.T) { + //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, + //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 + //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 + //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 kit.Expensive(t) kit.QuietMiningLogs() From f04bae3f0b3e6385fee5b019355e327a284ce381 Mon Sep 17 00:00:00 2001 From: Darko Brdareski Date: Fri, 10 Dec 2021 11:41:24 +0100 Subject: [PATCH 049/393] Annotate rand_test --- chain/rand/rand_test.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/chain/rand/rand_test.go b/chain/rand/rand_test.go index 5e5dae3f1df..b5e2482b795 100644 --- a/chain/rand/rand_test.go +++ b/chain/rand/rand_test.go @@ -1,3 +1,4 @@ +//stm:#unit package rand_test import ( @@ -55,11 +56,13 @@ func TestNullRandomnessV1(t *testing.T) { randEpoch := ts.TipSet.TipSet().Height() - 2 + //stm: @BLOCKCHAIN_RAND_GET_BEACON_RANDOMNESS_V1_01, @BLOCKCHAIN_RAND_EXTRACT_BEACON_ENTRY_FOR_EPOCH_01, @BLOCKCHAIN_RAND_GET_BEACON_RANDOMNESS_TIPSET_02 rand1, err := cg.StateManager().GetRandomnessFromBeacon(ctx, pers, randEpoch, entropy, ts.TipSet.TipSet().Key()) if err != nil { t.Fatal(err) } + //stm: @BLOCKCHAIN_BEACON_GET_BEACON_FOR_EPOCH_01 bch := cg.BeaconSchedule().BeaconForEpoch(randEpoch).Entry(ctx, uint64(beforeNullHeight)+offset) select { @@ -68,6 +71,7 @@ func TestNullRandomnessV1(t *testing.T) { t.Fatal(resp.Err) } + //stm: @BLOCKCHAIN_RAND_DRAW_RANDOMNESS_01 rand2, err := rand.DrawRandomness(resp.Entry.Data, pers, randEpoch, entropy) if err != nil { t.Fatal(err) @@ -131,11 +135,13 @@ func TestNullRandomnessV2(t *testing.T) { randEpoch := ts.TipSet.TipSet().Height() - 2 + //stm: @BLOCKCHAIN_RAND_GET_BEACON_RANDOMNESS_V2_01 rand1, err := cg.StateManager().GetRandomnessFromBeacon(ctx, pers, randEpoch, entropy, ts.TipSet.TipSet().Key()) if err != nil { t.Fatal(err) } + //stm: @BLOCKCHAIN_BEACON_GET_BEACON_FOR_EPOCH_01 bch := cg.BeaconSchedule().BeaconForEpoch(randEpoch).Entry(ctx, uint64(ts.TipSet.TipSet().Height())+offset) select { @@ -144,6 +150,7 @@ func TestNullRandomnessV2(t *testing.T) { t.Fatal(resp.Err) } + //stm: @BLOCKCHAIN_RAND_DRAW_RANDOMNESS_01, @BLOCKCHAIN_RAND_EXTRACT_BEACON_ENTRY_FOR_EPOCH_01, @BLOCKCHAIN_RAND_GET_BEACON_RANDOMNESS_TIPSET_03 // note that the randEpoch passed to DrawRandomness is still randEpoch (not the latest ts height) rand2, err := rand.DrawRandomness(resp.Entry.Data, pers, randEpoch, entropy) if err != nil { @@ -212,11 +219,13 @@ func TestNullRandomnessV3(t *testing.T) { randEpoch := ts.TipSet.TipSet().Height() - 2 + //stm: @BLOCKCHAIN_RAND_GET_BEACON_RANDOMNESS_V3_01, @BLOCKCHAIN_RAND_EXTRACT_BEACON_ENTRY_FOR_EPOCH_01 rand1, err := cg.StateManager().GetRandomnessFromBeacon(ctx, pers, randEpoch, entropy, ts.TipSet.TipSet().Key()) if err != nil { t.Fatal(err) } + //stm: @BLOCKCHAIN_BEACON_GET_BEACON_FOR_EPOCH_01 bch := cg.BeaconSchedule().BeaconForEpoch(randEpoch).Entry(ctx, uint64(randEpoch)+offset) select { @@ -225,6 +234,7 @@ func TestNullRandomnessV3(t *testing.T) { t.Fatal(resp.Err) } + //stm: @BLOCKCHAIN_RAND_DRAW_RANDOMNESS_01 rand2, err := rand.DrawRandomness(resp.Entry.Data, pers, randEpoch, entropy) if err != nil { t.Fatal(err) From 0169d0dafd64dd9bd09c10577a4197ec8f56b96a Mon Sep 17 00:00:00 2001 From: Darko Brdareski Date: Fri, 10 Dec 2021 16:08:25 +0100 Subject: [PATCH 050/393] Annotate state feature tests --- chain/sync_test.go | 3 +++ extern/storage-sealing/commit_batch_test.go | 3 +++ .../storage-sealing/precommit_batch_test.go | 4 ++++ extern/storage-sealing/states_failed_test.go | 2 ++ itests/api_test.go | 4 ++++ itests/ccupgrade_test.go | 3 +++ itests/deadlines_test.go | 8 ++++++++ itests/deals_publish_test.go | 1 + itests/gateway_test.go | 4 ++++ itests/get_messages_in_ts_test.go | 1 + itests/nonce_test.go | 1 + itests/paych_api_test.go | 2 ++ itests/sdr_upgrade_test.go | 1 + itests/sector_pledge_test.go | 1 + itests/sector_terminate_test.go | 7 +++++++ itests/verifreg_test.go | 4 ++++ itests/wdpost_dispute_test.go | 18 +++++++++++++++++ itests/wdpost_test.go | 20 +++++++++++++++++++ markets/retrievaladapter/provider_test.go | 2 ++ .../storageadapter/dealstatematcher_test.go | 2 ++ 20 files changed, 91 insertions(+) diff --git a/chain/sync_test.go b/chain/sync_test.go index 28c9629b865..e578f85cb03 100644 --- a/chain/sync_test.go +++ b/chain/sync_test.go @@ -717,6 +717,7 @@ func TestDuplicateNonce(t *testing.T) { var includedMsg cid.Cid var skippedMsg cid.Cid + //stm: @CHAIN_STATE_SEARCH_MSG_001 r0, err0 := tu.nds[0].StateSearchMsg(context.TODO(), ts2.TipSet().Key(), msgs[0][0].Cid(), api.LookbackNoLimit, true) r1, err1 := tu.nds[0].StateSearchMsg(context.TODO(), ts2.TipSet().Key(), msgs[1][0].Cid(), api.LookbackNoLimit, true) @@ -823,6 +824,7 @@ func TestMismatchedNoncesRobustID(t *testing.T) { require.NoError(t, err) // Produce a message from the banker + //stm: @CHAIN_STATE_LOOKUP_ID_001 makeMsg := func(id bool) *types.SignedMessage { sender := tu.g.Banker() if id { @@ -880,6 +882,7 @@ func TestMatchedNoncesRobustID(t *testing.T) { require.NoError(t, err) // Produce a message from the banker with specified nonce + //stm: @CHAIN_STATE_LOOKUP_ID_001 makeMsg := func(n uint64, id bool) *types.SignedMessage { sender := tu.g.Banker() if id { diff --git a/extern/storage-sealing/commit_batch_test.go b/extern/storage-sealing/commit_batch_test.go index e03c346930d..3bda6d3fd04 100644 --- a/extern/storage-sealing/commit_batch_test.go +++ b/extern/storage-sealing/commit_batch_test.go @@ -1,3 +1,4 @@ +//stm: #unit package sealing_test import ( @@ -28,6 +29,7 @@ import ( ) func TestCommitBatcher(t *testing.T) { + //stm: @CHAIN_STATE_MINER_PRE_COM_INFO_001, @CHAIN_STATE_MINER_INFO_001, @CHAIN_STATE_NETWORK_VERSION_001 t0123, err := address.NewFromString("t0123") require.NoError(t, err) @@ -147,6 +149,7 @@ func TestCommitBatcher(t *testing.T) { } } + //stm: @CHAIN_STATE_MINER_INFO_001, @CHAIN_STATE_NETWORK_VERSION_001, @CHAIN_STATE_MINER_GET_COLLATERAL_001 expectSend := func(expect []abi.SectorNumber, aboveBalancer, failOnePCI bool) action { return func(t *testing.T, s *mocks.MockCommitBatcherApi, pcb *sealing.CommitBatcher) promise { s.EXPECT().StateMinerInfo(gomock.Any(), gomock.Any(), gomock.Any()).Return(miner.MinerInfo{Owner: t0123, Worker: t0123}, nil) diff --git a/extern/storage-sealing/precommit_batch_test.go b/extern/storage-sealing/precommit_batch_test.go index f6440996ec1..a90645a0504 100644 --- a/extern/storage-sealing/precommit_batch_test.go +++ b/extern/storage-sealing/precommit_batch_test.go @@ -1,3 +1,4 @@ +//stm: #unit package sealing_test import ( @@ -38,6 +39,7 @@ var fc = config.MinerFeeConfig{ } func TestPrecommitBatcher(t *testing.T) { + //stm: @CHAIN_STATE_MINER_CALCULATE_DEADLINE_001 t0123, err := address.NewFromString("t0123") require.NoError(t, err) @@ -151,6 +153,7 @@ func TestPrecommitBatcher(t *testing.T) { } } + //stm: @CHAIN_STATE_MINER_INFO_001, @CHAIN_STATE_NETWORK_VERSION_001 expectSend := func(expect []abi.SectorNumber) action { return func(t *testing.T, s *mocks.MockPreCommitBatcherApi, pcb *sealing.PreCommitBatcher) promise { s.EXPECT().ChainHead(gomock.Any()).Return(nil, abi.ChainEpoch(1), nil) @@ -171,6 +174,7 @@ func TestPrecommitBatcher(t *testing.T) { } } + //stm: @CHAIN_STATE_MINER_INFO_001, @CHAIN_STATE_NETWORK_VERSION_001 expectSendsSingle := func(expect []abi.SectorNumber) action { return func(t *testing.T, s *mocks.MockPreCommitBatcherApi, pcb *sealing.PreCommitBatcher) promise { s.EXPECT().ChainHead(gomock.Any()).Return(nil, abi.ChainEpoch(1), nil) diff --git a/extern/storage-sealing/states_failed_test.go b/extern/storage-sealing/states_failed_test.go index 22c245afd5e..d523fee2916 100644 --- a/extern/storage-sealing/states_failed_test.go +++ b/extern/storage-sealing/states_failed_test.go @@ -1,3 +1,4 @@ +//stm: #unit package sealing_test import ( @@ -47,6 +48,7 @@ func TestStateRecoverDealIDs(t *testing.T) { PieceCID: idCid("newPieceCID"), } + //stm: @CHAIN_STATE_MARKET_STORAGE_DEAL_001, @CHAIN_STATE_NETWORK_VERSION_001 api.EXPECT().StateMarketStorageDealProposal(ctx, dealId, nil).Return(dealProposal, nil) pc := idCid("publishCID") diff --git a/itests/api_test.go b/itests/api_test.go index 847645f4de5..33a255fdb68 100644 --- a/itests/api_test.go +++ b/itests/api_test.go @@ -24,6 +24,8 @@ func TestAPI(t *testing.T) { //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 + + //stm: @CHAIN_STATE_MINER_INFO_001 t.Run("direct", func(t *testing.T) { runAPITest(t) }) @@ -121,11 +123,13 @@ func (ts *apiSuite) testSearchMsg(t *testing.T) { sm, err := full.MpoolPushMessage(ctx, msg, nil) require.NoError(t, err) + //stm: @CHAIN_STATE_WAIT_MSG_001 res, err := full.StateWaitMsg(ctx, sm.Cid(), 1, lapi.LookbackNoLimit, true) require.NoError(t, err) require.Equal(t, exitcode.Ok, res.Receipt.ExitCode, "message not successful") + //stm: @CHAIN_STATE_SEARCH_MSG_001 searchRes, err := full.StateSearchMsg(ctx, types.EmptyTSK, sm.Cid(), lapi.LookbackNoLimit, true) require.NoError(t, err) require.NotNil(t, searchRes) diff --git a/itests/ccupgrade_test.go b/itests/ccupgrade_test.go index d579683781e..5eb597eaa87 100644 --- a/itests/ccupgrade_test.go +++ b/itests/ccupgrade_test.go @@ -19,6 +19,8 @@ func TestCCUpgrade(t *testing.T) { //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 + + //stm: @CHAIN_STATE_MINER_GET_INFO_001 kit.QuietMiningLogs() for _, height := range []abi.ChainEpoch{ @@ -90,6 +92,7 @@ func runTestCCUpgrade(t *testing.T, upgradeHeight abi.ChainEpoch) { require.Less(t, 50000, int(exp.OnTime)) } + //stm: @CHAIN_STATE_MINER_CALCULATE_DEADLINE_001 dlInfo, err := client.StateMinerProvingDeadline(ctx, maddr, types.EmptyTSK) require.NoError(t, err) diff --git a/itests/deadlines_test.go b/itests/deadlines_test.go index 583d270118c..0832e4b8bf1 100644 --- a/itests/deadlines_test.go +++ b/itests/deadlines_test.go @@ -113,6 +113,7 @@ func TestDeadlineToggling(t *testing.T) { { minerC.PledgeSectors(ctx, sectorsC, 0, nil) + //stm: @CHAIN_STATE_MINER_CALCULATE_DEADLINE_001 di, err := client.StateMinerProvingDeadline(ctx, maddrC, types.EmptyTSK) require.NoError(t, err) @@ -132,6 +133,7 @@ func TestDeadlineToggling(t *testing.T) { expectedPower := types.NewInt(uint64(ssz) * sectorsC) + //stm: @CHAIN_STATE_MINER_POWER_001 p, err := client.StateMinerPower(ctx, maddrC, types.EmptyTSK) require.NoError(t, err) @@ -152,12 +154,14 @@ func TestDeadlineToggling(t *testing.T) { } checkMiner := func(ma address.Address, power abi.StoragePower, active, activeIfCron bool, tsk types.TipSetKey) { + //stm: @CHAIN_STATE_MINER_POWER_001 p, err := client.StateMinerPower(ctx, ma, tsk) require.NoError(t, err) // make sure it has the expected power. require.Equal(t, p.MinerPower.RawBytePower, power) + //stm: @CHAIN_STATE_GET_ACTOR_001 mact, err := client.StateGetActor(ctx, ma, tsk) require.NoError(t, err) @@ -192,6 +196,7 @@ func TestDeadlineToggling(t *testing.T) { checkMiner(maddrB, types.NewInt(0), true, true, uts.Key()) } + //stm: @CHAIN_STATE_NETWORK_VERSION_001 nv, err := client.StateNetworkVersion(ctx, types.EmptyTSK) require.NoError(t, err) require.GreaterOrEqual(t, nv, network.Version12) @@ -251,6 +256,7 @@ func TestDeadlineToggling(t *testing.T) { }, nil) require.NoError(t, err) + //stm: @CHAIN_STATE_WAIT_MSG_001 r, err := client.StateWaitMsg(ctx, m.Cid(), 2, api.LookbackNoLimit, true) require.NoError(t, err) require.Equal(t, exitcode.Ok, r.Receipt.ExitCode) @@ -303,6 +309,7 @@ func TestDeadlineToggling(t *testing.T) { sectorbit := bitfield.New() sectorbit.Set(uint64(sectorNum)) + //stm: @CHAIN_STATE_SECTOR_PARTITION_001 loca, err := client.StateSectorPartition(ctx, maddrD, sectorNum, types.EmptyTSK) require.NoError(t, err) @@ -334,6 +341,7 @@ func TestDeadlineToggling(t *testing.T) { t.Log("sent termination message:", smsg.Cid()) + //stm: @CHAIN_STATE_WAIT_MSG_001 r, err := client.StateWaitMsg(ctx, smsg.Cid(), 2, api.LookbackNoLimit, true) require.NoError(t, err) require.Equal(t, exitcode.Ok, r.Receipt.ExitCode) diff --git a/itests/deals_publish_test.go b/itests/deals_publish_test.go index 580a4e2bdcc..abbcfe7249d 100644 --- a/itests/deals_publish_test.go +++ b/itests/deals_publish_test.go @@ -108,6 +108,7 @@ func TestPublishDealsBatching(t *testing.T) { } // Expect a single PublishStorageDeals message that includes the first two deals + //stm: @CHAIN_STATE_LIST_MESSAGES_001 msgCids, err := client.StateListMessages(ctx, &api.MessageMatch{To: market.Address}, types.EmptyTSK, 1) require.NoError(t, err) count := 0 diff --git a/itests/gateway_test.go b/itests/gateway_test.go index c0146b066bc..b648e5497a5 100644 --- a/itests/gateway_test.go +++ b/itests/gateway_test.go @@ -121,6 +121,7 @@ func TestGatewayWalletMsig(t *testing.T) { addProposal, err := doSend(proto) require.NoError(t, err) + //stm: @CHAIN_STATE_WAIT_MSG_001 res, err := lite.StateWaitMsg(ctx, addProposal, 1, api.LookbackNoLimit, true) require.NoError(t, err) require.EqualValues(t, 0, res.Receipt.ExitCode) @@ -132,6 +133,7 @@ func TestGatewayWalletMsig(t *testing.T) { // Get available balance of msig: should be greater than zero and less // than initial amount msig := execReturn.IDAddress + //stm: @CHAIN_STATE_MINER_AVAILABLE_BALANCE_001 msigBalance, err := lite.MsigGetAvailableBalance(ctx, msig, types.EmptyTSK) require.NoError(t, err) require.Greater(t, msigBalance.Int64(), int64(0)) @@ -144,6 +146,7 @@ func TestGatewayWalletMsig(t *testing.T) { addProposal, err = doSend(proto) require.NoError(t, err) + //stm: @CHAIN_STATE_WAIT_MSG_001 res, err = lite.StateWaitMsg(ctx, addProposal, 1, api.LookbackNoLimit, true) require.NoError(t, err) require.EqualValues(t, 0, res.Receipt.ExitCode) @@ -161,6 +164,7 @@ func TestGatewayWalletMsig(t *testing.T) { approval1, err := doSend(proto) require.NoError(t, err) + //stm: @CHAIN_STATE_WAIT_MSG_001 res, err = lite.StateWaitMsg(ctx, approval1, 1, api.LookbackNoLimit, true) require.NoError(t, err) require.EqualValues(t, 0, res.Receipt.ExitCode) diff --git a/itests/get_messages_in_ts_test.go b/itests/get_messages_in_ts_test.go index 9e06b68523c..85337707c59 100644 --- a/itests/get_messages_in_ts_test.go +++ b/itests/get_messages_in_ts_test.go @@ -89,6 +89,7 @@ func TestChainGetMessagesInTs(t *testing.T) { } for _, sm := range sms { + //stm: @CHAIN_STATE_WAIT_MSG_001 msgLookup, err := client.StateWaitMsg(ctx, sm.Cid(), 3, api.LookbackNoLimit, true) require.NoError(t, err) diff --git a/itests/nonce_test.go b/itests/nonce_test.go index 0940dc43e00..e2b8407260f 100644 --- a/itests/nonce_test.go +++ b/itests/nonce_test.go @@ -56,6 +56,7 @@ func TestNonceIncremental(t *testing.T) { } for _, sm := range sms { + //stm: @CHAIN_STATE_WAIT_MSG_001 _, err := client.StateWaitMsg(ctx, sm.Cid(), 3, api.LookbackNoLimit, true) require.NoError(t, err) } diff --git a/itests/paych_api_test.go b/itests/paych_api_test.go index 01693ec35fc..c2440f8dec2 100644 --- a/itests/paych_api_test.go +++ b/itests/paych_api_test.go @@ -112,6 +112,7 @@ func TestPaymentChannelsAPI(t *testing.T) { require.NoError(t, err) preds := state.NewStatePredicates(paymentCreator) finished := make(chan struct{}) + //stm: @CHAIN_STATE_GET_ACTOR_001 err = ev.StateChanged(func(ctx context.Context, ts *types.TipSet) (done bool, more bool, err error) { act, err := paymentCreator.StateGetActor(ctx, channel, ts.Key()) if err != nil { @@ -187,6 +188,7 @@ func TestPaymentChannelsAPI(t *testing.T) { collectMsg, err := paymentReceiver.PaychCollect(ctx, channel) require.NoError(t, err) + //stm: @CHAIN_STATE_WAIT_MSG_001 res, err = paymentReceiver.StateWaitMsg(ctx, collectMsg, 3, api.LookbackNoLimit, true) require.NoError(t, err) require.EqualValues(t, 0, res.Receipt.ExitCode, "unable to collect on payment channel") diff --git a/itests/sdr_upgrade_test.go b/itests/sdr_upgrade_test.go index 0781551605b..fb2c54fc2f8 100644 --- a/itests/sdr_upgrade_test.go +++ b/itests/sdr_upgrade_test.go @@ -22,6 +22,7 @@ func TestSDRUpgrade(t *testing.T) { //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 + //stm: @CHAIN_STATE_NETWORK_VERSION_001 kit.QuietMiningLogs() // oldDelay := policy.GetPreCommitChallengeDelay() diff --git a/itests/sector_pledge_test.go b/itests/sector_pledge_test.go index abe5eb84383..c7fb272d347 100644 --- a/itests/sector_pledge_test.go +++ b/itests/sector_pledge_test.go @@ -182,6 +182,7 @@ func TestPledgeMaxBatching(t *testing.T) { } // Ensure that max aggregate message has propagated to the other node by checking current state + //stm: @CHAIN_STATE_MINER_SECTORS_001 sectorInfosAfter, err := full.StateMinerSectors(ctx, miner.ActorAddr, nil, types.EmptyTSK) require.NoError(t, err) assert.Equal(t, miner5.MaxAggregatedSectors+kit.DefaultPresealsPerBootstrapMiner, len(sectorInfosAfter)) diff --git a/itests/sector_terminate_test.go b/itests/sector_terminate_test.go index 0eec80a1f13..4de754ccd3c 100644 --- a/itests/sector_terminate_test.go +++ b/itests/sector_terminate_test.go @@ -38,6 +38,7 @@ func TestTerminate(t *testing.T) { ssz, err := miner.ActorSectorSize(ctx, maddr) require.NoError(t, err) + //stm: @CHAIN_STATE_MINER_POWER_001 p, err := client.StateMinerPower(ctx, maddr, types.EmptyTSK) require.NoError(t, err) require.Equal(t, p.MinerPower, p.TotalPower) @@ -50,6 +51,7 @@ func TestTerminate(t *testing.T) { t.Log("wait for power") { + //stm: @CHAIN_STATE_MINER_CALCULATE_DEADLINE_001 // Wait until proven. di, err := client.StateMinerProvingDeadline(ctx, maddr, types.EmptyTSK) require.NoError(t, err) @@ -63,6 +65,7 @@ func TestTerminate(t *testing.T) { nSectors++ + //stm: @CHAIN_STATE_MINER_POWER_001 p, err = client.StateMinerPower(ctx, maddr, types.EmptyTSK) require.NoError(t, err) require.Equal(t, p.MinerPower, p.TotalPower) @@ -116,6 +119,7 @@ loop: // need to wait for message to be mined and applied. time.Sleep(5 * time.Second) + //stm: @CHAIN_STATE_MINER_POWER_001 // check power decreased p, err = client.StateMinerPower(ctx, maddr, types.EmptyTSK) require.NoError(t, err) @@ -124,6 +128,7 @@ loop: // check in terminated set { + //stm: @CHAIN_STATE_MINER_GET_PARTITIONS_001 parts, err := client.StateMinerPartitions(ctx, maddr, 1, types.EmptyTSK) require.NoError(t, err) require.Greater(t, len(parts), 0) @@ -138,6 +143,7 @@ loop: require.Equal(t, uint64(0), bflen(parts[0].LiveSectors)) } + //stm: @CHAIN_STATE_MINER_CALCULATE_DEADLINE_001 di, err := client.StateMinerProvingDeadline(ctx, maddr, types.EmptyTSK) require.NoError(t, err) @@ -146,6 +152,7 @@ loop: ts := client.WaitTillChain(ctx, kit.HeightAtLeast(waitUntil)) t.Logf("Now head.Height = %d", ts.Height()) + //stm: @CHAIN_STATE_MINER_POWER_001 p, err = client.StateMinerPower(ctx, maddr, types.EmptyTSK) require.NoError(t, err) diff --git a/itests/verifreg_test.go b/itests/verifreg_test.go index 6a3c7f3b762..9b63f8e0089 100644 --- a/itests/verifreg_test.go +++ b/itests/verifreg_test.go @@ -56,6 +56,7 @@ func TestVerifiedClientTopUp(t *testing.T) { 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) @@ -86,6 +87,7 @@ func TestVerifiedClientTopUp(t *testing.T) { 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) @@ -107,11 +109,13 @@ func TestVerifiedClientTopUp(t *testing.T) { 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) diff --git a/itests/wdpost_dispute_test.go b/itests/wdpost_dispute_test.go index 2bebc8453d8..c982773a701 100644 --- a/itests/wdpost_dispute_test.go +++ b/itests/wdpost_dispute_test.go @@ -66,6 +66,7 @@ func TestWindowPostDispute(t *testing.T) { evilMinerAddr, err := evilMiner.ActorAddress(ctx) require.NoError(t, err) + //stm: @CHAIN_STATE_MINER_CALCULATE_DEADLINE_001 di, err := client.StateMinerProvingDeadline(ctx, evilMinerAddr, types.EmptyTSK) require.NoError(t, err) @@ -77,6 +78,7 @@ func TestWindowPostDispute(t *testing.T) { ts := client.WaitTillChain(ctx, kit.HeightAtLeast(waitUntil)) t.Logf("Now head.Height = %d", ts.Height()) + //stm: @CHAIN_STATE_MINER_POWER_001 p, err := client.StateMinerPower(ctx, evilMinerAddr, types.EmptyTSK) require.NoError(t, err) @@ -89,6 +91,7 @@ func TestWindowPostDispute(t *testing.T) { evilSectors, err := evilMiner.SectorsList(ctx) require.NoError(t, err) evilSectorNo := evilSectors[0] // only one. + //stm: @CHAIN_STATE_SECTOR_PARTITION_001 evilSectorLoc, err := client.StateSectorPartition(ctx, evilMinerAddr, evilSectorNo, types.EmptyTSK) require.NoError(t, err) @@ -101,6 +104,7 @@ func TestWindowPostDispute(t *testing.T) { // Wait until we need to prove our sector. for { + //stm: @CHAIN_STATE_MINER_CALCULATE_DEADLINE_001 di, err = client.StateMinerProvingDeadline(ctx, evilMinerAddr, types.EmptyTSK) require.NoError(t, err) if di.Index == evilSectorLoc.Deadline && di.CurrentEpoch-di.PeriodStart > 1 { @@ -114,6 +118,7 @@ func TestWindowPostDispute(t *testing.T) { // Wait until after the proving period. for { + //stm: @CHAIN_STATE_MINER_CALCULATE_DEADLINE_001 di, err = client.StateMinerProvingDeadline(ctx, evilMinerAddr, types.EmptyTSK) require.NoError(t, err) if di.Index != evilSectorLoc.Deadline { @@ -124,6 +129,7 @@ func TestWindowPostDispute(t *testing.T) { t.Log("accepted evil proof") + //stm: @CHAIN_STATE_MINER_POWER_001 // Make sure the evil node didn't lose any power. p, err = client.StateMinerPower(ctx, evilMinerAddr, types.EmptyTSK) require.NoError(t, err) @@ -150,11 +156,13 @@ func TestWindowPostDispute(t *testing.T) { require.NoError(t, err) t.Log("waiting dispute") + //stm: @CHAIN_STATE_WAIT_MSG_001 rec, err := client.StateWaitMsg(ctx, sm.Cid(), build.MessageConfidence, api.LookbackNoLimit, true) require.NoError(t, err) require.Zero(t, rec.Receipt.ExitCode, "dispute not accepted: %s", rec.Receipt.ExitCode.Error()) } + //stm: @CHAIN_STATE_MINER_POWER_001 // Objection SUSTAINED! // Make sure the evil node lost power. p, err = client.StateMinerPower(ctx, evilMinerAddr, types.EmptyTSK) @@ -167,6 +175,7 @@ func TestWindowPostDispute(t *testing.T) { // First, recover the sector. { + //stm: @CHAIN_STATE_MINER_INFO_001 minerInfo, err := client.StateMinerInfo(ctx, evilMinerAddr, types.EmptyTSK) require.NoError(t, err) @@ -191,6 +200,7 @@ func TestWindowPostDispute(t *testing.T) { sm, err := client.MpoolPushMessage(ctx, msg, nil) require.NoError(t, err) + //stm: @CHAIN_STATE_WAIT_MSG_001 rec, err := client.StateWaitMsg(ctx, sm.Cid(), build.MessageConfidence, api.LookbackNoLimit, true) require.NoError(t, err) require.Zero(t, rec.Receipt.ExitCode, "recovery not accepted: %s", rec.Receipt.ExitCode.Error()) @@ -198,6 +208,7 @@ func TestWindowPostDispute(t *testing.T) { // Then wait for the deadline. for { + //stm: @CHAIN_STATE_MINER_CALCULATE_DEADLINE_001 di, err = client.StateMinerProvingDeadline(ctx, evilMinerAddr, types.EmptyTSK) require.NoError(t, err) if di.Index == evilSectorLoc.Deadline { @@ -219,6 +230,7 @@ func TestWindowPostDisputeFails(t *testing.T) { //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 + //stm: @CHAIN_STATE_MINER_GET_DEADLINES_001 kit.Expensive(t) kit.QuietMiningLogs() @@ -241,6 +253,7 @@ func TestWindowPostDisputeFails(t *testing.T) { miner.PledgeSectors(ctx, 10, 0, nil) + //stm: @CHAIN_STATE_MINER_CALCULATE_DEADLINE_001 di, err := client.StateMinerProvingDeadline(ctx, maddr, types.EmptyTSK) require.NoError(t, err) @@ -255,6 +268,7 @@ func TestWindowPostDisputeFails(t *testing.T) { require.NoError(t, err) expectedPower := types.NewInt(uint64(ssz) * (kit.DefaultPresealsPerBootstrapMiner + 10)) + //stm: @CHAIN_STATE_MINER_POWER_001 p, err := client.StateMinerPower(ctx, maddr, types.EmptyTSK) require.NoError(t, err) @@ -280,6 +294,7 @@ waitForProof: } for { + //stm: @CHAIN_STATE_MINER_CALCULATE_DEADLINE_001 di, err := client.StateMinerProvingDeadline(ctx, maddr, types.EmptyTSK) require.NoError(t, err) // wait until the deadline finishes. @@ -323,11 +338,13 @@ func submitBadProof( return err } + //stm: @CHAIN_STATE_MINER_INFO_001 minerInfo, err := client.StateMinerInfo(ctx, maddr, head.Key()) if err != nil { return err } + //stm: @CHAIN_STATE_GET_RANDOMNESS_FROM_TICKETS_001 commEpoch := di.Open commRand, err := client.StateGetRandomnessFromTickets( ctx, crypto.DomainSeparationTag_PoStChainCommit, @@ -364,6 +381,7 @@ func submitBadProof( return err } + //stm: @CHAIN_STATE_WAIT_MSG_001 rec, err := client.StateWaitMsg(ctx, sm.Cid(), build.MessageConfidence, api.LookbackNoLimit, true) if err != nil { return err diff --git a/itests/wdpost_test.go b/itests/wdpost_test.go index 9c8a88693b1..3234b544931 100644 --- a/itests/wdpost_test.go +++ b/itests/wdpost_test.go @@ -63,6 +63,7 @@ func testWindowPostUpgrade(t *testing.T, blocktime time.Duration, nSectors int, maddr, err := miner.ActorAddress(ctx) require.NoError(t, err) + //stm: @CHAIN_STATE_MINER_CALCULATE_DEADLINE_001 di, err := client.StateMinerProvingDeadline(ctx, maddr, types.EmptyTSK) require.NoError(t, err) @@ -76,6 +77,7 @@ func testWindowPostUpgrade(t *testing.T, blocktime time.Duration, nSectors int, ts := client.WaitTillChain(ctx, kit.HeightAtLeast(waitUntil)) t.Logf("Now head.Height = %d", ts.Height()) + //stm: @CHAIN_STATE_MINER_POWER_001 p, err := client.StateMinerPower(ctx, maddr, types.EmptyTSK) require.NoError(t, err) @@ -89,6 +91,7 @@ func testWindowPostUpgrade(t *testing.T, blocktime time.Duration, nSectors int, // Drop 2 sectors from deadline 2 partition 0 (full partition / deadline) { + //stm: @CHAIN_STATE_MINER_GET_PARTITIONS_001 parts, err := client.StateMinerPartitions(ctx, maddr, 2, types.EmptyTSK) require.NoError(t, err) require.Greater(t, len(parts), 0) @@ -114,6 +117,7 @@ func testWindowPostUpgrade(t *testing.T, blocktime time.Duration, nSectors int, // Drop 1 sectors from deadline 3 partition 0 { + //stm: @CHAIN_STATE_MINER_GET_PARTITIONS_001 parts, err := client.StateMinerPartitions(ctx, maddr, 3, types.EmptyTSK) require.NoError(t, err) require.Greater(t, len(parts), 0) @@ -142,6 +146,7 @@ func testWindowPostUpgrade(t *testing.T, blocktime time.Duration, nSectors int, require.NoError(t, err) } + //stm: @CHAIN_STATE_MINER_CALCULATE_DEADLINE_001 di, err = client.StateMinerProvingDeadline(ctx, maddr, types.EmptyTSK) require.NoError(t, err) @@ -152,6 +157,7 @@ func testWindowPostUpgrade(t *testing.T, blocktime time.Duration, nSectors int, ts = client.WaitTillChain(ctx, kit.HeightAtLeast(waitUntil)) t.Logf("Now head.Height = %d", ts.Height()) + //stm: @CHAIN_STATE_MINER_POWER_001 p, err = client.StateMinerPower(ctx, maddr, types.EmptyTSK) require.NoError(t, err) @@ -165,6 +171,7 @@ func testWindowPostUpgrade(t *testing.T, blocktime time.Duration, nSectors int, err = miner.StorageMiner.(*impl.StorageMinerAPI).IStorageMgr.(*mock.SectorMgr).MarkFailed(s, false) require.NoError(t, err) + //stm: @CHAIN_STATE_MINER_CALCULATE_DEADLINE_001 di, err = client.StateMinerProvingDeadline(ctx, maddr, types.EmptyTSK) require.NoError(t, err) @@ -174,6 +181,7 @@ func testWindowPostUpgrade(t *testing.T, blocktime time.Duration, nSectors int, ts = client.WaitTillChain(ctx, kit.HeightAtLeast(waitUntil)) t.Logf("Now head.Height = %d", ts.Height()) + //stm: @CHAIN_STATE_MINER_POWER_001 p, err = client.StateMinerPower(ctx, maddr, types.EmptyTSK) require.NoError(t, err) @@ -188,6 +196,7 @@ func testWindowPostUpgrade(t *testing.T, blocktime time.Duration, nSectors int, { // Wait until proven. + //stm: @CHAIN_STATE_MINER_CALCULATE_DEADLINE_001 di, err = client.StateMinerProvingDeadline(ctx, maddr, types.EmptyTSK) require.NoError(t, err) @@ -198,6 +207,7 @@ func testWindowPostUpgrade(t *testing.T, blocktime time.Duration, nSectors int, t.Logf("Now head.Height = %d", ts.Height()) } + //stm: @CHAIN_STATE_MINER_POWER_001 p, err = client.StateMinerPower(ctx, maddr, types.EmptyTSK) require.NoError(t, err) @@ -234,10 +244,12 @@ func TestWindowPostBaseFeeNoBurn(t *testing.T) { maddr, err := miner.ActorAddress(ctx) require.NoError(t, err) + //stm: @CHAIN_STATE_MINER_INFO_001 mi, err := client.StateMinerInfo(ctx, maddr, types.EmptyTSK) require.NoError(t, err) miner.PledgeSectors(ctx, nSectors, 0, nil) + //stm: @CHAIN_STATE_GET_ACTOR_001 wact, err := client.StateGetActor(ctx, mi.Worker, types.EmptyTSK) require.NoError(t, err) en := wact.Nonce @@ -246,6 +258,7 @@ func TestWindowPostBaseFeeNoBurn(t *testing.T) { waitForProof: for { + //stm: @CHAIN_STATE_GET_ACTOR_001 wact, err := client.StateGetActor(ctx, mi.Worker, types.EmptyTSK) require.NoError(t, err) if wact.Nonce > en { @@ -255,9 +268,11 @@ waitForProof: build.Clock.Sleep(blocktime) } + //stm: @CHAIN_STATE_LIST_MESSAGES_001 slm, err := client.StateListMessages(ctx, &api.MessageMatch{To: maddr}, types.EmptyTSK, 0) require.NoError(t, err) + //stm: @CHAIN_STATE_REPLAY_001 pmr, err := client.StateReplay(ctx, types.EmptyTSK, slm[0]) require.NoError(t, err) @@ -284,10 +299,12 @@ func TestWindowPostBaseFeeBurn(t *testing.T) { maddr, err := miner.ActorAddress(ctx) require.NoError(t, err) + //stm: @CHAIN_STATE_MINER_INFO_001 mi, err := client.StateMinerInfo(ctx, maddr, types.EmptyTSK) require.NoError(t, err) miner.PledgeSectors(ctx, 10, 0, nil) + //stm: @CHAIN_STATE_GET_ACTOR_001 wact, err := client.StateGetActor(ctx, mi.Worker, types.EmptyTSK) require.NoError(t, err) en := wact.Nonce @@ -296,6 +313,7 @@ func TestWindowPostBaseFeeBurn(t *testing.T) { waitForProof: for { + //stm: @CHAIN_STATE_GET_ACTOR_001 wact, err := client.StateGetActor(ctx, mi.Worker, types.EmptyTSK) require.NoError(t, err) if wact.Nonce > en { @@ -305,9 +323,11 @@ waitForProof: build.Clock.Sleep(blocktime) } + //stm: @CHAIN_STATE_LIST_MESSAGES_001 slm, err := client.StateListMessages(ctx, &api.MessageMatch{To: maddr}, types.EmptyTSK, 0) require.NoError(t, err) + //stm: @CHAIN_STATE_REPLAY_001 pmr, err := client.StateReplay(ctx, types.EmptyTSK, slm[0]) require.NoError(t, err) diff --git a/markets/retrievaladapter/provider_test.go b/markets/retrievaladapter/provider_test.go index eca3b11527e..18dfe42a0c6 100644 --- a/markets/retrievaladapter/provider_test.go +++ b/markets/retrievaladapter/provider_test.go @@ -1,3 +1,4 @@ +//stm: #unit package retrievaladapter import ( @@ -18,6 +19,7 @@ import ( ) func TestGetPricingInput(t *testing.T) { + //stm: @CHAIN_STATE_MARKET_STORAGE_DEAL_001 ctx := context.Background() tsk := &types.TipSet{} key := tsk.Key() diff --git a/markets/storageadapter/dealstatematcher_test.go b/markets/storageadapter/dealstatematcher_test.go index cb036077842..755ecaf4756 100644 --- a/markets/storageadapter/dealstatematcher_test.go +++ b/markets/storageadapter/dealstatematcher_test.go @@ -1,3 +1,4 @@ +//stm: #unit package storageadapter import ( @@ -27,6 +28,7 @@ import ( ) func TestDealStateMatcher(t *testing.T) { + //stm: @CHAIN_STATE_GET_ACTOR_001 ctx := context.Background() bs := bstore.NewMemorySync() store := adt2.WrapStore(ctx, cbornode.NewCborStore(bs)) From 8e376c84cf47b808595545f7ad099b6e78c5e280 Mon Sep 17 00:00:00 2001 From: hannahhoward Date: Thu, 2 Dec 2021 05:44:59 -0800 Subject: [PATCH 051/393] feat(tracing): setup logging --- lib/tracing/setup.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/tracing/setup.go b/lib/tracing/setup.go index 1a2d8128e62..d90099f793e 100644 --- a/lib/tracing/setup.go +++ b/lib/tracing/setup.go @@ -11,6 +11,7 @@ import ( "go.opentelemetry.io/otel/sdk/resource" tracesdk "go.opentelemetry.io/otel/sdk/trace" semconv "go.opentelemetry.io/otel/semconv/v1.7.0" + "go.uber.org/zap" logging "github.com/ipfs/go-log/v2" ) @@ -50,7 +51,7 @@ func jaegerOptsFromEnv() jaeger.EndpointOption { } if e, ok = os.LookupEnv(envAgentHost); ok { - options := []jaeger.AgentEndpointOption{jaeger.WithAgentHost(e)} + options := []jaeger.AgentEndpointOption{jaeger.WithAgentHost(e), jaeger.WithLogger(zap.NewStdLog(log.Desugar()))} var ep string if p, ok := os.LookupEnv(envAgentPort); ok { options = append(options, jaeger.WithAgentPort(p)) @@ -82,6 +83,7 @@ func SetupJaegerTracing(serviceName string) *tracesdk.TracerProvider { semconv.SchemaURL, semconv.ServiceNameKey.String(serviceName), )), + tracesdk.WithSampler(tracesdk.AlwaysSample()), ) otel.SetTracerProvider(tp) tracer := tp.Tracer(serviceName) From 9108828aeb0888f71aae6fd9be92e32ab05c3bdb Mon Sep 17 00:00:00 2001 From: gstuart Date: Fri, 10 Dec 2021 17:27:44 -0500 Subject: [PATCH 052/393] Make Lotus vm gas tracing an env var --- chain/vm/runtime.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/chain/vm/runtime.go b/chain/vm/runtime.go index 6e94030bd2a..72f4daab857 100644 --- a/chain/vm/runtime.go +++ b/chain/vm/runtime.go @@ -5,6 +5,7 @@ import ( "context" "encoding/binary" "fmt" + "os" gruntime "runtime" "time" @@ -52,7 +53,7 @@ func (m *Message) ValueReceived() abi.TokenAmount { } // EnableGasTracing, if true, outputs gas tracing in execution traces. -var EnableGasTracing = false +var EnableGasTracing = os.Getenv("LOTUS_VM_ENABLE_GAS_TRACING_VERY_SLOW") == "1" type Runtime struct { rt5.Message From 095361beade24dc795981c88dc817c492538227c Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Fri, 10 Dec 2021 19:15:53 -0500 Subject: [PATCH 053/393] Update carv2 --- go.mod | 2 +- go.sum | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 6a70a137a4e..34ddb428805 100644 --- a/go.mod +++ b/go.mod @@ -98,7 +98,7 @@ require ( github.com/ipfs/go-unixfs v0.2.6 github.com/ipfs/interface-go-ipfs-core v0.4.0 github.com/ipld/go-car v0.3.3-0.20211210032800-e6f244225a16 - github.com/ipld/go-car/v2 v2.1.0 + github.com/ipld/go-car/v2 v2.1.1-0.20211211000942-be2525f6bf2d github.com/ipld/go-codec-dagpb v1.3.0 github.com/ipld/go-ipld-prime v0.14.3-0.20211207234443-319145880958 github.com/ipld/go-ipld-selector-text-lite v0.0.1 diff --git a/go.sum b/go.sum index e3d35d47ab1..b282a127a67 100644 --- a/go.sum +++ b/go.sum @@ -880,8 +880,9 @@ github.com/ipld/go-car v0.3.2-0.20211001225732-32d0d9933823/go.mod h1:jSlTph+i/q github.com/ipld/go-car v0.3.3-0.20211210032800-e6f244225a16 h1:y6CW3GCY5Nm86/9vwphaghTTmOvEtfJjBOAzAIy3/Mk= github.com/ipld/go-car v0.3.3-0.20211210032800-e6f244225a16/go.mod h1:/wkKF4908ULT4dFIFIUZYcfjAnj+KFnJvlh8Hsz1FbQ= github.com/ipld/go-car/v2 v2.0.0-beta1.0.20210721090610-5a9d1b217d25/go.mod h1:I2ACeeg6XNBe5pdh5TaR7Ambhfa7If9KXxmXgZsYENU= -github.com/ipld/go-car/v2 v2.1.0 h1:t8R/WXUSkfu1K1gpPk76mytCxsEdMjGcMIgpOq3/Cnw= github.com/ipld/go-car/v2 v2.1.0/go.mod h1:Xr6GwkDhv8dtOtgHzOynAkIOg0t0YiPc5DxBPppWqZA= +github.com/ipld/go-car/v2 v2.1.1-0.20211211000942-be2525f6bf2d h1:yrjb9jdAj3Lkxgp8af5G3g4Yv4PwWac3+sikmJVF0fA= +github.com/ipld/go-car/v2 v2.1.1-0.20211211000942-be2525f6bf2d/go.mod h1:+2Yvf0Z3wzkv7NeI69i8tuZ+ft7jyjPYIWZzeVNeFcI= github.com/ipld/go-codec-dagpb v1.2.0/go.mod h1:6nBN7X7h8EOsEejZGqC7tej5drsdBAXbMHyBT+Fne5s= github.com/ipld/go-codec-dagpb v1.3.0 h1:czTcaoAuNNyIYWs6Qe01DJ+sEX7B+1Z0LcXjSatMGe8= github.com/ipld/go-codec-dagpb v1.3.0/go.mod h1:ga4JTU3abYApDC3pZ00BC2RSvC3qfBb9MSJkMLSwnhA= @@ -895,12 +896,15 @@ github.com/ipld/go-ipld-prime v0.10.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/ github.com/ipld/go-ipld-prime v0.11.0/go.mod h1:+WIAkokurHmZ/KwzDOMUuoeJgaRQktHtEaLglS3ZeV8= github.com/ipld/go-ipld-prime v0.12.3-0.20210930132912-0b3aef3ca569/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= 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.3-0.20211207234443-319145880958 h1:olscE5Sv+ts+N9YLQsIL9k6eS6y6CXMGRl5RCr2Cn/E= github.com/ipld/go-ipld-prime v0.14.3-0.20211207234443-319145880958/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= github.com/ipld/go-ipld-prime-proto v0.0.0-20191113031812-e32bd156a1e5/go.mod h1:gcvzoEDBjwycpXt3LBE061wT9f46szXGHAmj9uoP6fU= github.com/ipld/go-ipld-prime-proto v0.0.0-20200428191222-c1ffdadc01e1/go.mod h1:OAV6xBmuTLsPZ+epzKkPB1e25FHk/vCtyatkdHcArLs= github.com/ipld/go-ipld-prime-proto v0.0.0-20200922192210-9a2bfd4440a6/go.mod h1:3pHYooM9Ea65jewRwrb2u5uHZCNkNTe9ABsVB+SrkH0= github.com/ipld/go-ipld-prime-proto v0.1.0/go.mod h1:11zp8f3sHVgIqtb/c9Kr5ZGqpnCLF1IVTNOez9TopzE= +github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20211210234204-ce2a1c70cd73 h1:TsyATB2ZRRQGTwafJdgEUQkmjOExRV0DNokcihZxbnQ= +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/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52 h1:QG4CGBqCeuBo6aZlGAamSkxWdgWfZGeE49eUOWJPA4c= From 6c31cecc7d46821fff75210d9437e355dc5d3ad7 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Sat, 11 Dec 2021 14:37:37 -0500 Subject: [PATCH 054/393] Update markets --- go.mod | 6 ++-- go.sum | 94 +++++++--------------------------------------------------- 2 files changed, 13 insertions(+), 87 deletions(-) diff --git a/go.mod b/go.mod index 34ddb428805..0b689b6a620 100644 --- a/go.mod +++ b/go.mod @@ -26,17 +26,17 @@ require ( github.com/elastic/gosigar v0.14.1 github.com/etclabscore/go-openrpc-reflect v0.0.36 github.com/fatih/color v1.13.0 - github.com/filecoin-project/dagstore v0.4.2 + github.com/filecoin-project/dagstore v0.4.3-0.20211211192320-72b849e131d2 github.com/filecoin-project/filecoin-ffi v0.30.4-0.20200910194244-f640612a1a1f github.com/filecoin-project/go-address v0.0.6 github.com/filecoin-project/go-bitfield v0.2.4 github.com/filecoin-project/go-cbor-util v0.0.1 github.com/filecoin-project/go-commp-utils v0.1.3 github.com/filecoin-project/go-crypto v0.0.1 - github.com/filecoin-project/go-data-transfer v1.11.7-0.20211207053937-e06a599f202a + github.com/filecoin-project/go-data-transfer v1.12.0 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.13.4 + github.com/filecoin-project/go-fil-markets v1.13.3-0.20211211193119-ab98aecd0969 github.com/filecoin-project/go-jsonrpc v0.1.5 github.com/filecoin-project/go-padreader v0.0.1 github.com/filecoin-project/go-paramfetch v0.0.2 diff --git a/go.sum b/go.sum index b282a127a67..b48bcc812ae 100644 --- a/go.sum +++ b/go.sum @@ -301,8 +301,8 @@ github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL 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/filecoin-project/dagstore v0.4.2 h1:Ae2+O1DhKCI1JbOZCBkqUksKYofdbRbjkS7OF0A6Jw0= -github.com/filecoin-project/dagstore v0.4.2/go.mod h1:WY5OoLfnwISCk6eASSF927KKPqLPIlTwmG1qHpA08KY= +github.com/filecoin-project/dagstore v0.4.3-0.20211211192320-72b849e131d2 h1:dWh+o7gzavw1JUlsTqBj2/87r1Z6fbPZuZS43UiIW60= +github.com/filecoin-project/dagstore v0.4.3-0.20211211192320-72b849e131d2/go.mod h1:tlV8C11UljvFq3WWlMh2oMViEaVaPb6uT8eL/YQgDfk= github.com/filecoin-project/go-address v0.0.3/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= github.com/filecoin-project/go-address v0.0.5/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= github.com/filecoin-project/go-address v0.0.6 h1:DWQtj38ax+ogHwyH3VULRIoT8E6loyXqsk/p81xoY7M= @@ -319,28 +319,23 @@ github.com/filecoin-project/go-bitfield v0.2.4/go.mod h1:CNl9WG8hgR5mttCnUErjcQj github.com/filecoin-project/go-cbor-util v0.0.0-20191219014500-08c40a1e63a2/go.mod h1:pqTiPHobNkOVM5thSRsHYjyQfq7O5QSCMhvuu9JoDlg= github.com/filecoin-project/go-cbor-util v0.0.1 h1:E1LYZYTtjfAQwCReho0VXvbu8t3CYAVPiMx8EiV/VAs= github.com/filecoin-project/go-cbor-util v0.0.1/go.mod h1:pqTiPHobNkOVM5thSRsHYjyQfq7O5QSCMhvuu9JoDlg= -github.com/filecoin-project/go-commp-utils v0.1.1-0.20210427191551-70bf140d31c7/go.mod h1:6s95K91mCyHY51RPWECZieD3SGWTqIFLf1mPOes9l5U= 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-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-data-transfer v1.0.1/go.mod h1:UxvfUAY9v3ub0a21BSK9u3pB2aq30Y0KMsG+w9/ysyo= -github.com/filecoin-project/go-data-transfer v1.11.4/go.mod h1:2MitLI0ebCkLlPKM7NRggP/t9d+gCcREUKkCKqWRCwU= -github.com/filecoin-project/go-data-transfer v1.11.7-0.20211207053937-e06a599f202a h1:eSKovm26xNSTE/OFc+9zkt7sotMb0ixumKAO11BNMbs= -github.com/filecoin-project/go-data-transfer v1.11.7-0.20211207053937-e06a599f202a/go.mod h1:tDrD2jLU2TpVhd+5B8iqBp0fQRV4lP80WZccKXugjYc= +github.com/filecoin-project/go-data-transfer v1.12.0 h1:y44x35JvB93kezahMURKizIa/aizGTPSHqi5cbAfTEo= +github.com/filecoin-project/go-data-transfer v1.12.0/go.mod h1:tDrD2jLU2TpVhd+5B8iqBp0fQRV4lP80WZccKXugjYc= +github.com/filecoin-project/go-ds-versioning v0.0.0-20211206185234-508abd7c2aff h1:2bG2ggVZ/rInd/YqUfRj4A5siGuYOPxxuD4I8nYLJF0= 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.0 h1:y/X6UksYTsK8TLCI7rttCKEvl8btmWxyFMEeeWGUxIQ= -github.com/filecoin-project/go-ds-versioning v0.1.0/go.mod h1:mp16rb4i2QPmxBnmanUx8i/XANp+PFCCJWiAb+VW4/s= github.com/filecoin-project/go-fil-commcid v0.0.0-20200716160307-8f644712406f/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commcid v0.1.0 h1:3R4ds1A9r6cr8mvZBfMYxTS88OqLYEo6roi+GiIeOh8= 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.0.5-0.20201113164554-c5eba40d5335/go.mod h1:AJySOJC00JRWEZzRG2KsfUnqEf5ITXxeX09BE9N4f9c= -github.com/filecoin-project/go-fil-markets v1.13.4 h1:NAu+ACelR2mYsj+yJ4iLu8FGqWK50OnU5VF8axkLsSc= -github.com/filecoin-project/go-fil-markets v1.13.4/go.mod h1:aANjXD2XMHWnT2zWpyGWLsWLC24C4mHm0gRm85OpPWE= +github.com/filecoin-project/go-fil-markets v1.13.3-0.20211211193119-ab98aecd0969 h1:5N/aEyr+uuJC1dd+rdFgV+RQT7o6LqfkshSh8en3YiI= +github.com/filecoin-project/go-fil-markets v1.13.3-0.20211211193119-ab98aecd0969/go.mod h1:vXOHH3q2+zLk929W+lIq3etuDFTyJJ8nG2DwGHG2R1E= 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= @@ -350,7 +345,6 @@ 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-multistore v0.0.3/go.mod h1:kaNqCC4IhU4B1uyr7YWFHd23TL4KM32aChS0jNkyUvQ= github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20/go.mod h1:mPn+LRRd5gEKNAtc+r3ScpW2JRU/pj4NBKdADYWHiak= github.com/filecoin-project/go-padreader v0.0.0-20210723183308-812a16dc01b1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= github.com/filecoin-project/go-padreader v0.0.1 h1:8h2tVy5HpoNbr2gBRr+WD6zV6VD6XHig+ynSGJg8ZOs= @@ -370,18 +364,14 @@ github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe/g github.com/filecoin-project/go-statemachine v1.0.1 h1:LQ60+JDVjMdLxXmVFM2jjontzOYnfVE7u02CXV3WKSw= github.com/filecoin-project/go-statemachine v1.0.1/go.mod h1:jZdXXiHa61n4NmgWFG4w8tnqgvZVHYbJ3yW7+y8bF54= github.com/filecoin-project/go-statestore v0.1.0/go.mod h1:LFc9hD+fRxPqiHiaqUEZOinUJB4WARkRfNl10O7kTnI= -github.com/filecoin-project/go-statestore v0.1.1/go.mod h1:LFc9hD+fRxPqiHiaqUEZOinUJB4WARkRfNl10O7kTnI= github.com/filecoin-project/go-statestore v0.2.0 h1:cRRO0aPLrxKQCZ2UOQbzFGn4WDNdofHZoGPjfNaAo5Q= github.com/filecoin-project/go-statestore v0.2.0/go.mod h1:8sjBYbS35HwPzct7iT4lIXjLlYyPor80aU7t7a/Kspo= -github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b/go.mod h1:Q0GQOBtKf1oE10eSXSlhN45kDBdGvEcVOqMiffqX+N8= github.com/filecoin-project/go-storedcounter v0.0.0-20211210031312-d066d7aa2f77 h1:3n7WS0WkJStS1rMbt/o+OvriHIlAuU8JKVG6wB2LqJQ= github.com/filecoin-project/go-storedcounter v0.0.0-20211210031312-d066d7aa2f77/go.mod h1:4ceukaXi4vFURIoxYMfKzaRF5Xv/Pinh2oTnoxpv+z8= github.com/filecoin-project/specs-actors v0.9.4/go.mod h1:BStZQzx5x7TmCkLv0Bpa07U6cPKol6fd3w9KjMPZ6Z4= -github.com/filecoin-project/specs-actors v0.9.12/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors v0.9.14 h1:68PVstg2UB3ZsMLF+DKFTAs/YKsqhKWynkr0IqmVRQY= github.com/filecoin-project/specs-actors v0.9.14/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= -github.com/filecoin-project/specs-actors/v2 v2.0.1/go.mod h1:v2NZVYinNIKA9acEMBm5wWXxqv5+frFEbekBFemYghY= 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.5 h1:PbT4tPlSXZ8sRgajhb4D8AOEmiaaZ+jg6tc6BBv8VQc= github.com/filecoin-project/specs-actors/v2 v2.3.5/go.mod h1:LljnY2Mn2homxZsmokJZCpRuhOPxfXhvcek5gWkmqAc= @@ -676,8 +666,6 @@ github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyq 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 h1:721YAEDBnLIrvcIMkCHCdqp34hA8jwL9yKMkyJpSpco= github.com/ipfs/go-bitswap v0.5.1/go.mod h1:P+ckC87ri1xFLvk74NlXdP0Kj9RmWAh4+H78sC6Qopo= github.com/ipfs/go-block-format v0.0.1/go.mod h1:DK/YYcsSUIVAFNwo/KZCdIIbpN0ROH/baNLgayt4pFc= @@ -686,9 +674,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.3/go.mod h1:OTZhFpkgY48kNzbgyvcexW9cHrpjBYIjSR0KoDOFOLU= -github.com/ipfs/go-blockservice v0.1.4-0.20200624145336-a978cec6e834/go.mod h1:OTZhFpkgY48kNzbgyvcexW9cHrpjBYIjSR0KoDOFOLU= -github.com/ipfs/go-blockservice v0.1.5/go.mod h1:yLk8lBJCBRWRqerqCSVi3cE/Dncdt3vGC/PJMVKhLTY= github.com/ipfs/go-blockservice v0.2.1 h1:NJ4j/cwEfIg60rzAWcCIxRtOwbf6ZPK49MewNxObCPQ= github.com/ipfs/go-blockservice v0.2.1/go.mod h1:k6SiwmgyYgs4M/qt+ww6amPeUH9EISLRBnvUurKJhi8= github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= @@ -700,7 +685,6 @@ github.com/ipfs/go-cid v0.0.5/go.mod h1:plgt+Y5MnOey4vO4UlUazGqdbEXuFYitED67Fexh github.com/ipfs/go-cid v0.0.6-0.20200501230655-7c82f3b81c00/go.mod h1:plgt+Y5MnOey4vO4UlUazGqdbEXuFYitED67FexhXog= github.com/ipfs/go-cid v0.0.6/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= github.com/ipfs/go-cid v0.0.7/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= -github.com/ipfs/go-cid v0.0.8-0.20210716091050-de6c03deae1c/go.mod h1:rH5/Xv83Rfy8Rw6xG+id3DYAMUVmem1MowoKwdXmN2o= github.com/ipfs/go-cid v0.1.0 h1:YN33LQulcRHjfom/i25yoOZR4Telp1Hr/2RU3d0PnC0= github.com/ipfs/go-cid v0.1.0/go.mod h1:rH5/Xv83Rfy8Rw6xG+id3DYAMUVmem1MowoKwdXmN2o= github.com/ipfs/go-cidutil v0.0.2 h1:CNOboQf1t7Qp0nuNh8QMmhJs0+Q//bRL1axtCnIB1Yo= @@ -713,7 +697,6 @@ github.com/ipfs/go-datastore v0.3.0/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.4.7-0.20211013204805-28a3721c2e66/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= @@ -727,7 +710,6 @@ github.com/ipfs/go-ds-badger v0.0.5/go.mod h1:g5AuuCGmr7efyzQhLL8MzwqcauPojGPUaH github.com/ipfs/go-ds-badger v0.0.7/go.mod h1:qt0/fWzZDoPW6jpQeqUjR5kBfhDNB65jd9YlmAvpQBk= github.com/ipfs/go-ds-badger v0.2.1/go.mod h1:Tx7l3aTph3FMFrRS838dcSJh+jjA7cX9DrGVwx/NOwE= github.com/ipfs/go-ds-badger v0.2.3/go.mod h1:pEYw0rgg3FIrywKKnL+Snr+w/LjJZVMTBRn4FS6UHUk= -github.com/ipfs/go-ds-badger v0.2.6/go.mod h1:02rnztVKA4aZwDuaRPTf8mpqcKmXP7mLl6JPxd14JHA= github.com/ipfs/go-ds-badger v0.2.7/go.mod h1:02rnztVKA4aZwDuaRPTf8mpqcKmXP7mLl6JPxd14JHA= github.com/ipfs/go-ds-badger v0.3.0 h1:xREL3V0EH9S219kFFueOYJJTcjgNSZ2HY1iSvN7U1Ro= github.com/ipfs/go-ds-badger v0.3.0/go.mod h1:1ke6mXNqeV8K3y5Ak2bAA0osoTfmxUdupVCGm4QUIek= @@ -744,26 +726,18 @@ github.com/ipfs/go-ds-measure v0.1.0 h1:vE4TyY4aeLeVgnnPBC5QzKIjKrqzha0NCujTfgvV github.com/ipfs/go-ds-measure v0.1.0/go.mod h1:1nDiFrhLlwArTME1Ees2XaBOl49OoCgd2A3f8EchMSY= github.com/ipfs/go-ds-pebble v0.0.2-0.20200921225637-ce220f8ac459 h1:W3YMLEvOXqdW+sYMiguhWP6txJwQvIQqhvpU8yAMGQs= github.com/ipfs/go-ds-pebble v0.0.2-0.20200921225637-ce220f8ac459/go.mod h1:oh4liWHulKcDKVhCska5NLelE3MatWl+1FwSz3tY91g= -github.com/ipfs/go-filestore v1.0.0 h1:QR7ekKH+q2AGiWDc7W2Q0qHuYSRZGUJqUn0GsegEPb0= -github.com/ipfs/go-filestore v1.0.0/go.mod h1:/XOCuNtIe2f1YPbiXdYvD0BKLA0JR1MgPiFOdcuu9SM= +github.com/ipfs/go-filestore v1.1.0 h1:Pu4tLBi1bucu6/HU9llaOmb9yLFk/sgP+pW764zNDoE= +github.com/ipfs/go-filestore v1.1.0/go.mod h1:6e1/5Y6NvLuCRdmda/KA4GUhXJQ3Uat6vcWm2DJfxc8= github.com/ipfs/go-fs-lock v0.0.6 h1:sn3TWwNVQqSeNjlWy6zQ1uUGAZrV3hPOyEA6y1/N2a0= github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28L7zESmM= -github.com/ipfs/go-graphsync v0.1.0/go.mod h1:jMXfqIEDFukLPZHqDPp8tJMbHO9Rmeb9CEGevngQbmE= -github.com/ipfs/go-graphsync v0.4.2/go.mod h1:/VmbZTUdUMTbNkgzAiCEucIIAU3BkLE2cZrDCVUhyi0= -github.com/ipfs/go-graphsync v0.4.3/go.mod h1:mPOwDYv128gf8gxPFgXnz4fNrSYPsWyqisJ7ych+XDY= -github.com/ipfs/go-graphsync v0.10.0/go.mod h1:cKIshzTaa5rCZjryH5xmSKZVGX9uk1wvwGvz2WEha5Y= github.com/ipfs/go-graphsync v0.11.0 h1:PiiD5CnoC3xEHMW8d6uBGqGcoTwiMB5d9CORIEyF6iA= github.com/ipfs/go-graphsync v0.11.0/go.mod h1:wC+c8vGVjAHthsVIl8LKr37cUra2GOaMYcQNNmMxDqE= github.com/ipfs/go-hamt-ipld v0.1.1/go.mod h1:1EZCr2v0jlCnhpa+aZ0JZYp8Tt2w16+JJOAVz17YcDk= 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.2.1/go.mod h1:jGesd8EtCM3/zPgx+qr0/feTXGUeRai6adgwC+Q+JvE= -github.com/ipfs/go-ipfs-blockstore v1.0.0/go.mod h1:knLVdhVU9L7CC4T+T4nvGdeUIPAXlnd9zmXfp+9MIjU= -github.com/ipfs/go-ipfs-blockstore v1.0.1/go.mod h1:MGNZlHNEnR4KGgPHM3/k8lBySIOK2Ve+0KjZubKlaOE= -github.com/ipfs/go-ipfs-blockstore v1.0.3/go.mod h1:MGNZlHNEnR4KGgPHM3/k8lBySIOK2Ve+0KjZubKlaOE= -github.com/ipfs/go-ipfs-blockstore v1.0.4/go.mod h1:uL7/gTJ8QIZ3MtA3dWf+s1a0U3fJy2fcEZAsovpRp+w= github.com/ipfs/go-ipfs-blockstore v1.1.0/go.mod h1:5QDUApRqpgPcfGstCxYeMnjt/DYQtXXdJVCvxHHuWVk= +github.com/ipfs/go-ipfs-blockstore v1.1.1/go.mod h1:w51tNR9y5+QXB0wkNcHt4O2aSZjTdqaEWaQdSxEyUOY= github.com/ipfs/go-ipfs-blockstore v1.1.2 h1:WCXoZcMYnvOTmlpX+RSSnhVN0uCmbWTeepTGX5lgiXw= github.com/ipfs/go-ipfs-blockstore v1.1.2/go.mod h1:w51tNR9y5+QXB0wkNcHt4O2aSZjTdqaEWaQdSxEyUOY= github.com/ipfs/go-ipfs-blocksutil v0.0.1 h1:Eh/H4pc1hsvhzsQoMEP3Bke/aW5P5rVM1IWFJMcGIPQ= @@ -811,7 +785,6 @@ github.com/ipfs/go-ipfs-util v0.0.2/go.mod h1:CbPtkWJzjLdEcezDns2XYaehFVNXG9zrdr github.com/ipfs/go-ipld-cbor v0.0.2/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= github.com/ipfs/go-ipld-cbor v0.0.3/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= github.com/ipfs/go-ipld-cbor v0.0.4/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= -github.com/ipfs/go-ipld-cbor v0.0.5-0.20200204214505-252690b78669/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= github.com/ipfs/go-ipld-cbor v0.0.5 h1:ovz4CHKogtG2KB/h1zUp5U0c/IzZrL435rCh5+K/5G8= github.com/ipfs/go-ipld-cbor v0.0.5/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= github.com/ipfs/go-ipld-format v0.0.1/go.mod h1:kyJtbkDALmFHv3QR6et67i35QzO3S0dCDnkOJhcZkms= @@ -844,7 +817,6 @@ github.com/ipfs/go-log/v2 v2.3.0/go.mod h1:QqGoj30OTpnKaG/LKTGTxoP2mmQtjVMEnK72g github.com/ipfs/go-merkledag v0.0.6/go.mod h1:QYPdnlvkOg7GnQRofu9XZimC5ZW5Wi3bKys/4GQQfto= 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.1/go.mod h1:fvkZNNZixVW6cKSZ/JfLlON5OlgTXNdRLz0p6QG/I2M= github.com/ipfs/go-merkledag v0.3.2/go.mod h1:fvkZNNZixVW6cKSZ/JfLlON5OlgTXNdRLz0p6QG/I2M= github.com/ipfs/go-merkledag v0.5.1 h1:tr17GPP5XtPhvPPiWtu20tSGZiZDuTaJRXBLcr79Umk= github.com/ipfs/go-merkledag v0.5.1/go.mod h1:cLMZXx8J08idkp5+id62iVftUQV+HlYJ3PIhDfZsjA4= @@ -856,8 +828,6 @@ github.com/ipfs/go-path v0.0.7 h1:H06hKMquQ0aYtHiHryOMLpQC1qC3QwXwkahcEVD51Ho= github.com/ipfs/go-path v0.0.7/go.mod h1:6KTKmeRnBXgqrTvzFrPV3CamxcgvXX/4z79tfAd2Sno= 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 h1:VyO6G4sbzX80K58N60cCaHsSsypbUNs1GjO5seGNsQ0= github.com/ipfs/go-peertaskqueue v0.7.0/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68ow0Rrb04donIU= github.com/ipfs/go-todocounter v0.0.1/go.mod h1:l5aErvQc8qKE2r7NDMjmq5UNAvuZy0rC8BHOplkWvZ4= @@ -874,35 +844,23 @@ github.com/ipfs/iptb v1.4.0/go.mod h1:1rzHpCYtNp87/+hTxG5TfCVn/yMY3dKnLn8tBiMfdm 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/ipld/go-car v0.1.0/go.mod h1:RCWzaUh2i4mOEkB3W45Vc+9jnS/M6Qay5ooytiBHl3g= -github.com/ipld/go-car v0.1.1-0.20200923150018-8cdef32e2da4/go.mod h1:xrMEcuSq+D1vEwl+YAXsg/JfA98XGpXDwnkIL4Aimqw= -github.com/ipld/go-car v0.1.1-0.20201119040415-11b6074b6d4d/go.mod h1:2Gys8L8MJ6zkh1gktTSXreY63t4UbyvNp5JaudTyxHQ= -github.com/ipld/go-car v0.3.2-0.20211001225732-32d0d9933823/go.mod h1:jSlTph+i/q1jLFoiKKeN69KGG0fXpwrcD0izu5C1Tpo= github.com/ipld/go-car v0.3.3-0.20211210032800-e6f244225a16 h1:y6CW3GCY5Nm86/9vwphaghTTmOvEtfJjBOAzAIy3/Mk= github.com/ipld/go-car v0.3.3-0.20211210032800-e6f244225a16/go.mod h1:/wkKF4908ULT4dFIFIUZYcfjAnj+KFnJvlh8Hsz1FbQ= -github.com/ipld/go-car/v2 v2.0.0-beta1.0.20210721090610-5a9d1b217d25/go.mod h1:I2ACeeg6XNBe5pdh5TaR7Ambhfa7If9KXxmXgZsYENU= -github.com/ipld/go-car/v2 v2.1.0/go.mod h1:Xr6GwkDhv8dtOtgHzOynAkIOg0t0YiPc5DxBPppWqZA= github.com/ipld/go-car/v2 v2.1.1-0.20211211000942-be2525f6bf2d h1:yrjb9jdAj3Lkxgp8af5G3g4Yv4PwWac3+sikmJVF0fA= github.com/ipld/go-car/v2 v2.1.1-0.20211211000942-be2525f6bf2d/go.mod h1:+2Yvf0Z3wzkv7NeI69i8tuZ+ft7jyjPYIWZzeVNeFcI= github.com/ipld/go-codec-dagpb v1.2.0/go.mod h1:6nBN7X7h8EOsEejZGqC7tej5drsdBAXbMHyBT+Fne5s= github.com/ipld/go-codec-dagpb v1.3.0 h1:czTcaoAuNNyIYWs6Qe01DJ+sEX7B+1Z0LcXjSatMGe8= github.com/ipld/go-codec-dagpb v1.3.0/go.mod h1:ga4JTU3abYApDC3pZ00BC2RSvC3qfBb9MSJkMLSwnhA= github.com/ipld/go-ipld-prime v0.0.2-0.20191108012745-28a82f04c785/go.mod h1:bDDSvVz7vaK12FNvMeRYnpRFkSUPNQOiCYQezMD/P3w= -github.com/ipld/go-ipld-prime v0.0.2-0.20200428162820-8b59dc292b8e/go.mod h1:uVIwe/u0H4VdKv3kaN1ck7uCb6yD9cFLS9/ELyXbsw8= -github.com/ipld/go-ipld-prime v0.5.1-0.20200828233916-988837377a7f/go.mod h1:0xEgdD6MKbZ1vF0GC+YcR/C4SQCAlRuOjIJ2i0HxqzM= -github.com/ipld/go-ipld-prime v0.5.1-0.20201021195245-109253e8a018/go.mod h1:0xEgdD6MKbZ1vF0GC+YcR/C4SQCAlRuOjIJ2i0HxqzM= github.com/ipld/go-ipld-prime v0.9.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= 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-0.20210930132912-0b3aef3ca569/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= 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.3-0.20211207234443-319145880958 h1:olscE5Sv+ts+N9YLQsIL9k6eS6y6CXMGRl5RCr2Cn/E= github.com/ipld/go-ipld-prime v0.14.3-0.20211207234443-319145880958/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= github.com/ipld/go-ipld-prime-proto v0.0.0-20191113031812-e32bd156a1e5/go.mod h1:gcvzoEDBjwycpXt3LBE061wT9f46szXGHAmj9uoP6fU= -github.com/ipld/go-ipld-prime-proto v0.0.0-20200428191222-c1ffdadc01e1/go.mod h1:OAV6xBmuTLsPZ+epzKkPB1e25FHk/vCtyatkdHcArLs= -github.com/ipld/go-ipld-prime-proto v0.0.0-20200922192210-9a2bfd4440a6/go.mod h1:3pHYooM9Ea65jewRwrb2u5uHZCNkNTe9ABsVB+SrkH0= -github.com/ipld/go-ipld-prime-proto v0.1.0/go.mod h1:11zp8f3sHVgIqtb/c9Kr5ZGqpnCLF1IVTNOez9TopzE= github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20211210234204-ce2a1c70cd73 h1:TsyATB2ZRRQGTwafJdgEUQkmjOExRV0DNokcihZxbnQ= 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= @@ -979,7 +937,6 @@ github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQ github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= 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.8/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -1028,16 +985,12 @@ github.com/libp2p/go-libp2p v0.1.0/go.mod h1:6D/2OBauqLUoqcADOJpn9WbKqvaM07tDw68 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.0/go.mod h1:mfKWI7Soz3ABX+XEBR61lGbg+ewyMtJHVt043oWeqwg= 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.8.3/go.mod h1:EsH1A+8yoWK+L4iKcbPYu6MPluZ+CHWI9El8cTaefiM= github.com/libp2p/go-libp2p v0.9.2/go.mod h1:cunHNLDVus66Ct9iXXcjKRLdmHdFdHVe1TAnbubJQqQ= -github.com/libp2p/go-libp2p v0.10.0/go.mod h1:yBJNpb+mGJdgrwbKAKrhPU0u3ogyNFTfjJ6bdM+Q/G8= -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 h1:aTxzQPllnW+nyC9mY8xaS20BbcrSYMt1HCkjZRHvdGY= @@ -1052,7 +1005,6 @@ github.com/libp2p/go-libp2p-autonat v0.2.0/go.mod h1:DX+9teU4pEEoZUqR1PiMlqliONQ 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.2.3/go.mod h1:2U6bNWCNsAG9LEbwccBDQbjzQ8Krdjge1jLTE9rdoMM= -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 h1:+vbQ1pMzMGjE/RJopiQKK2FRjdCKHPNPrkPm8u+luQU= github.com/libp2p/go-libp2p-autonat v0.6.0/go.mod h1:bFC6kY8jwzNNWoqc8iGE57vsfwyJ/lP4O4DOV1e0B2o= @@ -1071,7 +1023,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.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 h1:eqQ3sEYkGTtybWgr6JLqJY6QLtPWRErvFjFDfAOO1wc= github.com/libp2p/go-libp2p-circuit v0.4.0/go.mod h1:t/ktoFIUzM6uLQ+o1G6NuBl2ANhBKN9Bc8jRIk31MoA= github.com/libp2p/go-libp2p-connmgr v0.1.1/go.mod h1:wZxh8veAmU5qdrfJ0ZBLcU8oJe9L82ciVP/fl1VHjXk= @@ -1190,7 +1141,6 @@ github.com/libp2p/go-libp2p-pubsub v0.3.2-0.20200527132641-c0712c6e92cf/go.mod h github.com/libp2p/go-libp2p-pubsub v0.5.6 h1:YkO3gG9J1mQBEMRrM5obiG3JD0L8RcrzIpoeLeiYqH8= github.com/libp2p/go-libp2p-pubsub v0.5.6/go.mod h1:gVOzwebXVdSMDQBTfH8ACO5EJ4SQrvsHqCmYsCZpD0E= github.com/libp2p/go-libp2p-quic-transport v0.1.1/go.mod h1:wqG/jzhF3Pu2NrhJEvE+IE0NTHNXslOPn9JQzyCAxzU= -github.com/libp2p/go-libp2p-quic-transport v0.5.0/go.mod h1:IEcuC5MLxvZ5KuHKjRu+dr3LjCT1Be3rcD/4d8JrX8M= 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= @@ -1217,10 +1167,8 @@ github.com/libp2p/go-libp2p-swarm v0.2.1/go.mod h1:x07b4zkMFo2EvgPV2bMTlNmdQc8i+ 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.4/go.mod h1:/xIpHFPPh3wmSthtxdGbkHZ0OET1h/GGZes8Wku/M5Y= -github.com/libp2p/go-libp2p-swarm v0.2.7/go.mod h1:ZSJ0Q+oq/B1JgfPHJAT2HTall+xYRNYp1xs4S2FBWKA= 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.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 h1:nRHNRhi86L7jhka02N4MoV+PSFFPoJFkHNQwCTFxNhw= @@ -1247,7 +1195,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= @@ -1264,8 +1211,6 @@ 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 h1:TKayW983n92JhCGdCo7ej7eEb+DQ0VYfKNOxlN/1kNQ= github.com/libp2p/go-libp2p-yamux v0.6.0/go.mod h1:MRhd6mAYnFRnSISp4M8i0ClV/j+mWHo2mYLifWGw33k= @@ -1328,7 +1273,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= @@ -1356,8 +1300,6 @@ github.com/libp2p/go-yamux v1.3.7/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/h 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 h1:luRV68GS1vqqr6EFUjtu1kr51d+IbW0gSowu8emYWAI= github.com/libp2p/go-yamux/v2 v2.3.0/go.mod h1:iTU+lOIn/2h0AgKcL49clNTwfEw+WSfDYrXe05EyKIs= @@ -1365,7 +1307,6 @@ github.com/libp2p/zeroconf/v2 v2.1.1/go.mod h1:fuJqLnUwZTshS3U/bMRJ3+ow/v9oid1n0 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.16.0/go.mod h1:I0+fcNTdb9eS1ZcjQZbDVPGchJ86chcIxPALn9lEJqE= 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= @@ -1386,10 +1327,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/marten-seemann/qpack v0.1.0/go.mod h1:LFt1NU/Ptjip0C2CPkhimBz5CGE3WGDAUWqna+CNTrI= 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.9.1/go.mod h1:T1MmAdDPyISzxlK6kjRr0pcZFBVd1OZbBb/j3cvzHhk= 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= @@ -1438,7 +1377,6 @@ github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3N 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 h1:JKfpVSCB84vrAmHzyrsxB5NAr5kLoMXZArPSw7Qlgyg= github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= @@ -1523,8 +1461,6 @@ github.com/multiformats/go-multibase v0.0.2/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/g 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-multicodec v0.2.0/go.mod h1:/y4YVwkfMyry5kFbMTbLJKErhycTIftytRV+llXdyS4= -github.com/multiformats/go-multicodec v0.2.1-0.20210713081508-b421db6850ae/go.mod h1:qGGaQmioCDh+TeFOnxrbU0DaIPw8yFgAZgFG0V7p1qQ= -github.com/multiformats/go-multicodec v0.2.1-0.20210714093213-b2b5bd6fe68b/go.mod h1:qGGaQmioCDh+TeFOnxrbU0DaIPw8yFgAZgFG0V7p1qQ= github.com/multiformats/go-multicodec v0.3.0/go.mod h1:qGGaQmioCDh+TeFOnxrbU0DaIPw8yFgAZgFG0V7p1qQ= github.com/multiformats/go-multicodec v0.3.1-0.20210902112759-1539a079fd61 h1:ZrUuMKNgJ52qHPoQ+bx0h0uBfcWmN7Px+4uKSZeesiI= github.com/multiformats/go-multicodec v0.3.1-0.20210902112759-1539a079fd61/go.mod h1:1Hj/eHRaVWSXiSNNfcEPcwZleTmdNP81xlxDLnWU9GQ= @@ -1542,7 +1478,6 @@ github.com/multiformats/go-multistream v0.0.1/go.mod h1:fJTiDfXJVmItycydCnNx4+wS 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 h1:TCYu1BHTDr1F/Qm75qwYISQdzGcRdC21nFgQW7l7GBo= github.com/multiformats/go-multistream v0.2.2/go.mod h1:UIcnm7Zuo8HKG+HkWgfQsGL+/MIEhyTqbODbIUwSXKs= @@ -1583,7 +1518,6 @@ github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:v github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= @@ -1594,7 +1528,6 @@ github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5 github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.13.0 h1:7lLHu94wT9Ij0o6EWWclhu0aOh32VxhkwEJvzuWPeak= @@ -1810,7 +1743,6 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV github.com/stretchr/testify v1.3.1-0.20190311161405-34c6fa2dc709/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -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 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= @@ -1867,7 +1799,6 @@ github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11 h1:5HZfQkwe0mIf github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11/go.mod h1:Wlo/SzPmxVp6vXpGt/zaXhHH0fn4IxgqZc82aKg6bpQ= github.com/whyrusleeping/cbor-gen v0.0.0-20191216205031-b047b6acb3c0/go.mod h1:xdlJQaiqipF0HW+Mzpg7XRM3fWbGvfgFlcppuvlkIvY= github.com/whyrusleeping/cbor-gen v0.0.0-20200123233031-1cdf64d27158/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= -github.com/whyrusleeping/cbor-gen v0.0.0-20200402171437-3d27c146c105/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= github.com/whyrusleeping/cbor-gen v0.0.0-20200414195334-429a0b5e922e/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= github.com/whyrusleeping/cbor-gen v0.0.0-20200504204219-64967432584d/go.mod h1:W5MvapuoHRP8rz4vxjwCK1pDqF1aQcWsV5PZ+AHbqdg= github.com/whyrusleeping/cbor-gen v0.0.0-20200710004633-5379fc63235d/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= @@ -2034,7 +1965,6 @@ golang.org/x/crypto v0.0.0-20190927123631-a832865fa7ad/go.mod h1:yigFU9vqHzYiE8U 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-20200117160349-530e935923ad/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= @@ -2101,7 +2031,6 @@ golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.1.1-0.20191209134235-331c550502dd/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 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.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -2119,7 +2048,6 @@ golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190228165749-92fc7df08ae7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190313220215-9f648a60d977/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -2374,12 +2302,10 @@ golang.org/x/tools v0.0.0-20200711155855-7342f9734a7d/go.mod h1:njjCfa9FT2d7l9Bc 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= -golang.org/x/tools v0.0.0-20200827010519-17fd2f27a9e3/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20201112185108-eeaa07dd7696/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= 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-0.20210225150353-54dc8c5edb56/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= 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 h1:ouewzE6p+/VEB31YYnTbEJdi8pFqKp4P4n85vwo3DHA= From dfb65ed89f67c7d4adc2cc1f00a10b2b345d9926 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Sat, 11 Dec 2021 16:03:00 -0500 Subject: [PATCH 055/393] Plumb contexts through --- blockstore/api.go | 2 +- blockstore/badger/blockstore.go | 2 +- blockstore/buffered.go | 6 +- blockstore/discard.go | 4 +- blockstore/idstore.go | 4 +- blockstore/ipfs.go | 2 +- blockstore/mem.go | 2 +- blockstore/splitstore/splitstore.go | 46 +++--- blockstore/splitstore/splitstore_check.go | 4 +- blockstore/splitstore/splitstore_compact.go | 20 +-- blockstore/splitstore/splitstore_expose.go | 36 ++--- blockstore/splitstore/splitstore_warmup.go | 14 +- blockstore/sync.go | 2 +- blockstore/union.go | 4 +- chain/checkpoint.go | 8 +- chain/consensus/filcns/compute_state.go | 2 +- chain/consensus/filcns/filecoin.go | 4 +- chain/consensus/filcns/mine.go | 2 +- chain/consensus/filcns/upgrades.go | 2 +- chain/exchange/server.go | 6 +- chain/gen/gen.go | 4 +- chain/gen/genesis/genesis.go | 6 +- chain/gen/slashfilter/slashfilter.go | 21 +-- chain/market/fundmanager.go | 4 +- chain/market/store.go | 13 +- chain/messagepool/config.go | 15 +- chain/messagepool/messagepool.go | 16 +- chain/messagepool/provider.go | 6 +- chain/messagepool/pruning.go | 2 +- chain/messagepool/selection.go | 8 +- chain/messagesigner/messagesigner.go | 8 +- chain/rand/rand.go | 10 +- chain/stmgr/actors.go | 5 +- chain/stmgr/call.go | 8 +- chain/stmgr/read.go | 8 +- chain/stmgr/searchwait.go | 14 +- chain/stmgr/stmgr.go | 6 +- chain/stmgr/supply.go | 2 +- chain/stmgr/utils.go | 2 +- chain/store/index.go | 32 ++-- chain/store/messages.go | 6 +- chain/store/snapshot.go | 19 +-- chain/store/store.go | 160 ++++++++++---------- chain/sync.go | 32 ++-- chain/vm/vm.go | 26 ++-- chain/wallet/ledger/ledger.go | 22 +-- cli/backup.go | 2 +- go.mod | 8 +- go.sum | 16 +- markets/dagstore/blockstore.go | 7 +- markets/storageadapter/provider.go | 2 +- miner/miner.go | 2 +- node/hello/hello.go | 2 +- node/impl/backup.go | 5 +- node/impl/client/client.go | 8 +- node/impl/full.go | 2 +- node/impl/full/chain.go | 42 ++--- node/impl/full/gas.go | 14 +- node/impl/full/mpool.go | 8 +- node/impl/full/state.go | 76 +++++----- node/impl/full/sync.go | 6 +- node/impl/paych/paych.go | 12 +- node/impl/storminer.go | 6 +- node/modules/lp2p/host.go | 4 +- node/repo/imports/manager.go | 24 ++- paychmgr/accessorcache.go | 10 +- paychmgr/manager.go | 52 +++---- paychmgr/paych.go | 38 ++--- paychmgr/simple.go | 90 +++++------ paychmgr/store.go | 85 ++++++----- storage/sectorblocks/blocks.go | 24 +-- 71 files changed, 595 insertions(+), 577 deletions(-) diff --git a/blockstore/api.go b/blockstore/api.go index 348c0f84e23..dc4c034525d 100644 --- a/blockstore/api.go +++ b/blockstore/api.go @@ -61,6 +61,6 @@ func (a *apiBlockstore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) return nil, xerrors.New("not supported") } -func (a *apiBlockstore) HashOnRead(ctx context.Context, enabled bool) { +func (a *apiBlockstore) HashOnRead(enabled bool) { return } diff --git a/blockstore/badger/blockstore.go b/blockstore/badger/blockstore.go index e81e5838cae..270e5b82001 100644 --- a/blockstore/badger/blockstore.go +++ b/blockstore/badger/blockstore.go @@ -927,7 +927,7 @@ func (b *Blockstore) ForEachKey(f func(cid.Cid) error) error { // HashOnRead implements Blockstore.HashOnRead. It is not supported by this // blockstore. -func (b *Blockstore) HashOnRead(ctx context.Context, _ bool) { +func (b *Blockstore) HashOnRead(_ bool) { log.Warnf("called HashOnRead on badger blockstore; function not supported; ignoring") } diff --git a/blockstore/buffered.go b/blockstore/buffered.go index 846156fc8a0..8e23b5362b0 100644 --- a/blockstore/buffered.go +++ b/blockstore/buffered.go @@ -160,9 +160,9 @@ func (bs *BufferedBlockstore) Has(ctx context.Context, c cid.Cid) (bool, error) return bs.read.Has(ctx, c) } -func (bs *BufferedBlockstore) HashOnRead(ctx context.Context, hor bool) { - bs.read.HashOnRead(ctx, hor) - bs.write.HashOnRead(ctx, hor) +func (bs *BufferedBlockstore) HashOnRead(hor bool) { + bs.read.HashOnRead(hor) + bs.write.HashOnRead(hor) } func (bs *BufferedBlockstore) PutMany(ctx context.Context, blks []block.Block) error { diff --git a/blockstore/discard.go b/blockstore/discard.go index e377d427b37..575c752d40c 100644 --- a/blockstore/discard.go +++ b/blockstore/discard.go @@ -22,8 +22,8 @@ func (b *discardstore) Has(ctx context.Context, cid cid.Cid) (bool, error) { return b.bs.Has(ctx, cid) } -func (b *discardstore) HashOnRead(ctx context.Context, hor bool) { - b.bs.HashOnRead(ctx, hor) +func (b *discardstore) HashOnRead(hor bool) { + b.bs.HashOnRead(hor) } func (b *discardstore) Get(ctx context.Context, cid cid.Cid) (blocks.Block, error) { diff --git a/blockstore/idstore.go b/blockstore/idstore.go index d0553158bdb..c6281998a60 100644 --- a/blockstore/idstore.go +++ b/blockstore/idstore.go @@ -162,8 +162,8 @@ func (b *idstore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) { return b.bs.AllKeysChan(ctx) } -func (b *idstore) HashOnRead(ctx context.Context, enabled bool) { - b.bs.HashOnRead(ctx, enabled) +func (b *idstore) HashOnRead(enabled bool) { + b.bs.HashOnRead(enabled) } func (b *idstore) Close() error { diff --git a/blockstore/ipfs.go b/blockstore/ipfs.go index 47662c6519f..787c71d7d12 100644 --- a/blockstore/ipfs.go +++ b/blockstore/ipfs.go @@ -150,6 +150,6 @@ func (i *IPFSBlockstore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error return nil, xerrors.Errorf("not supported") } -func (i *IPFSBlockstore) HashOnRead(ctx context.Context, enabled bool) { +func (i *IPFSBlockstore) HashOnRead(enabled bool) { return // TODO: We could technically support this, but.. } diff --git a/blockstore/mem.go b/blockstore/mem.go index a2655148f5c..d6b14f00247 100644 --- a/blockstore/mem.go +++ b/blockstore/mem.go @@ -97,6 +97,6 @@ func (m MemBlockstore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) // HashOnRead specifies if every read block should be // rehashed to make sure it matches its CID. -func (m MemBlockstore) HashOnRead(ctx context.Context, enabled bool) { +func (m MemBlockstore) HashOnRead(enabled bool) { // no-op } diff --git a/blockstore/splitstore/splitstore.go b/blockstore/splitstore/splitstore.go index 145e31d7a08..f6715ea333c 100644 --- a/blockstore/splitstore/splitstore.go +++ b/blockstore/splitstore/splitstore.go @@ -216,17 +216,17 @@ func Open(path string, ds dstore.Datastore, hot, cold bstore.Blockstore, cfg *Co } // Blockstore interface -func (s *SplitStore) DeleteBlock(_ cid.Cid) error { +func (s *SplitStore) DeleteBlock(_ context.Context, _ cid.Cid) error { // afaict we don't seem to be using this method, so it's not implemented return errors.New("DeleteBlock not implemented on SplitStore; don't do this Luke!") //nolint } -func (s *SplitStore) DeleteMany(_ []cid.Cid) error { +func (s *SplitStore) DeleteMany(_ context.Context, _ []cid.Cid) error { // afaict we don't seem to be using this method, so it's not implemented return errors.New("DeleteMany not implemented on SplitStore; don't do this Luke!") //nolint } -func (s *SplitStore) Has(cid cid.Cid) (bool, error) { +func (s *SplitStore) Has(ctx context.Context, cid cid.Cid) (bool, error) { if isIdentiyCid(cid) { return true, nil } @@ -234,7 +234,7 @@ func (s *SplitStore) Has(cid cid.Cid) (bool, error) { s.txnLk.RLock() defer s.txnLk.RUnlock() - has, err := s.hot.Has(cid) + has, err := s.hot.Has(ctx, cid) if err != nil { return has, err @@ -245,10 +245,10 @@ func (s *SplitStore) Has(cid cid.Cid) (bool, error) { return true, nil } - return s.cold.Has(cid) + return s.cold.Has(ctx, cid) } -func (s *SplitStore) Get(cid cid.Cid) (blocks.Block, error) { +func (s *SplitStore) Get(ctx context.Context, cid cid.Cid) (blocks.Block, error) { if isIdentiyCid(cid) { data, err := decodeIdentityCid(cid) if err != nil { @@ -261,7 +261,7 @@ func (s *SplitStore) Get(cid cid.Cid) (blocks.Block, error) { s.txnLk.RLock() defer s.txnLk.RUnlock() - blk, err := s.hot.Get(cid) + blk, err := s.hot.Get(ctx, cid) switch err { case nil: @@ -273,7 +273,7 @@ func (s *SplitStore) Get(cid cid.Cid) (blocks.Block, error) { s.debug.LogReadMiss(cid) } - blk, err = s.cold.Get(cid) + blk, err = s.cold.Get(ctx, cid) if err == nil { stats.Record(s.ctx, metrics.SplitstoreMiss.M(1)) @@ -285,7 +285,7 @@ func (s *SplitStore) Get(cid cid.Cid) (blocks.Block, error) { } } -func (s *SplitStore) GetSize(cid cid.Cid) (int, error) { +func (s *SplitStore) GetSize(ctx context.Context, cid cid.Cid) (int, error) { if isIdentiyCid(cid) { data, err := decodeIdentityCid(cid) if err != nil { @@ -298,7 +298,7 @@ func (s *SplitStore) GetSize(cid cid.Cid) (int, error) { s.txnLk.RLock() defer s.txnLk.RUnlock() - size, err := s.hot.GetSize(cid) + size, err := s.hot.GetSize(ctx, cid) switch err { case nil: @@ -310,7 +310,7 @@ func (s *SplitStore) GetSize(cid cid.Cid) (int, error) { s.debug.LogReadMiss(cid) } - size, err = s.cold.GetSize(cid) + size, err = s.cold.GetSize(ctx, cid) if err == nil { stats.Record(s.ctx, metrics.SplitstoreMiss.M(1)) } @@ -321,7 +321,7 @@ func (s *SplitStore) GetSize(cid cid.Cid) (int, error) { } } -func (s *SplitStore) Put(blk blocks.Block) error { +func (s *SplitStore) Put(ctx context.Context, blk blocks.Block) error { if isIdentiyCid(blk.Cid()) { return nil } @@ -329,7 +329,7 @@ func (s *SplitStore) Put(blk blocks.Block) error { s.txnLk.RLock() defer s.txnLk.RUnlock() - err := s.hot.Put(blk) + err := s.hot.Put(ctx, blk) if err != nil { return err } @@ -340,7 +340,7 @@ func (s *SplitStore) Put(blk blocks.Block) error { return nil } -func (s *SplitStore) PutMany(blks []blocks.Block) error { +func (s *SplitStore) PutMany(ctx context.Context, blks []blocks.Block) error { // filter identites idcids := 0 for _, blk := range blks { @@ -374,7 +374,7 @@ func (s *SplitStore) PutMany(blks []blocks.Block) error { s.txnLk.RLock() defer s.txnLk.RUnlock() - err := s.hot.PutMany(blks) + err := s.hot.PutMany(ctx, blks) if err != nil { return err } @@ -430,7 +430,7 @@ func (s *SplitStore) HashOnRead(enabled bool) { s.cold.HashOnRead(enabled) } -func (s *SplitStore) View(cid cid.Cid, cb func([]byte) error) error { +func (s *SplitStore) View(ctx context.Context, cid cid.Cid, cb func([]byte) error) error { if isIdentiyCid(cid) { data, err := decodeIdentityCid(cid) if err != nil { @@ -451,14 +451,14 @@ func (s *SplitStore) View(cid cid.Cid, cb func([]byte) error) error { s.protectView(cid) defer s.viewDone() - err := s.hot.View(cid, cb) + err := s.hot.View(ctx, cid, cb) switch err { case bstore.ErrNotFound: if s.isWarm() { s.debug.LogReadMiss(cid) } - err = s.cold.View(cid, cb) + err = s.cold.View(ctx, cid, cb) if err == nil { stats.Record(s.ctx, metrics.SplitstoreMiss.M(1)) } @@ -502,7 +502,7 @@ func (s *SplitStore) Start(chain ChainAccessor, us stmgr.UpgradeSchedule) error // load base epoch from metadata ds // if none, then use current epoch because it's a fresh start - bs, err := s.ds.Get(baseEpochKey) + bs, err := s.ds.Get(s.ctx, baseEpochKey) switch err { case nil: s.baseEpoch = bytesToEpoch(bs) @@ -523,7 +523,7 @@ func (s *SplitStore) Start(chain ChainAccessor, us stmgr.UpgradeSchedule) error } // load warmup epoch from metadata ds - bs, err = s.ds.Get(warmupEpochKey) + bs, err = s.ds.Get(s.ctx, warmupEpochKey) switch err { case nil: s.warmupEpoch = bytesToEpoch(bs) @@ -536,7 +536,7 @@ func (s *SplitStore) Start(chain ChainAccessor, us stmgr.UpgradeSchedule) error } // load markSetSize from metadata ds to provide a size hint for marksets - bs, err = s.ds.Get(markSetSizeKey) + bs, err = s.ds.Get(s.ctx, markSetSizeKey) switch err { case nil: s.markSetSize = bytesToInt64(bs) @@ -547,7 +547,7 @@ func (s *SplitStore) Start(chain ChainAccessor, us stmgr.UpgradeSchedule) error } // load compactionIndex from metadata ds to provide a hint as to when to perform moving gc - bs, err = s.ds.Get(compactionIndexKey) + bs, err = s.ds.Get(s.ctx, compactionIndexKey) switch err { case nil: s.compactionIndex = bytesToInt64(bs) @@ -609,5 +609,5 @@ func (s *SplitStore) checkClosing() error { func (s *SplitStore) setBaseEpoch(epoch abi.ChainEpoch) error { s.baseEpoch = epoch - return s.ds.Put(baseEpochKey, epochToBytes(epoch)) + return s.ds.Put(s.ctx, baseEpochKey, epochToBytes(epoch)) } diff --git a/blockstore/splitstore/splitstore_check.go b/blockstore/splitstore/splitstore_check.go index 8907abf9e1e..c83ed7b285a 100644 --- a/blockstore/splitstore/splitstore_check.go +++ b/blockstore/splitstore/splitstore_check.go @@ -96,7 +96,7 @@ func (s *SplitStore) doCheck(curTs *types.TipSet) error { return errStopWalk } - has, err := s.hot.Has(c) + has, err := s.hot.Has(s.ctx, c) if err != nil { return xerrors.Errorf("error checking hotstore: %w", err) } @@ -105,7 +105,7 @@ func (s *SplitStore) doCheck(curTs *types.TipSet) error { return nil } - has, err = s.cold.Has(c) + has, err = s.cold.Has(s.ctx, c) if err != nil { return xerrors.Errorf("error checking coldstore: %w", err) } diff --git a/blockstore/splitstore/splitstore_compact.go b/blockstore/splitstore/splitstore_compact.go index 04c2562fa35..13ab90ac006 100644 --- a/blockstore/splitstore/splitstore_compact.go +++ b/blockstore/splitstore/splitstore_compact.go @@ -577,13 +577,13 @@ func (s *SplitStore) doCompact(curTs *types.TipSet) error { return xerrors.Errorf("error saving base epoch: %w", err) } - err = s.ds.Put(markSetSizeKey, int64ToBytes(s.markSetSize)) + err = s.ds.Put(s.ctx, markSetSizeKey, int64ToBytes(s.markSetSize)) if err != nil { return xerrors.Errorf("error saving mark set size: %w", err) } s.compactionIndex++ - err = s.ds.Put(compactionIndexKey, int64ToBytes(s.compactionIndex)) + err = s.ds.Put(s.ctx, compactionIndexKey, int64ToBytes(s.compactionIndex)) if err != nil { return xerrors.Errorf("error saving compaction index: %w", err) } @@ -835,10 +835,10 @@ func (s *SplitStore) view(c cid.Cid, cb func([]byte) error) error { return cb(data) } - err := s.hot.View(c, cb) + err := s.hot.View(s.ctx, c, cb) switch err { case bstore.ErrNotFound: - return s.cold.View(c, cb) + return s.cold.View(s.ctx, c, cb) default: return err @@ -850,13 +850,13 @@ func (s *SplitStore) has(c cid.Cid) (bool, error) { return true, nil } - has, err := s.hot.Has(c) + has, err := s.hot.Has(s.ctx, c) if has || err != nil { return has, err } - return s.cold.Has(c) + return s.cold.Has(s.ctx, c) } func (s *SplitStore) moveColdBlocks(cold []cid.Cid) error { @@ -867,7 +867,7 @@ func (s *SplitStore) moveColdBlocks(cold []cid.Cid) error { return err } - blk, err := s.hot.Get(c) + blk, err := s.hot.Get(s.ctx, c) if err != nil { if err == bstore.ErrNotFound { log.Warnf("hotstore missing block %s", c) @@ -879,7 +879,7 @@ func (s *SplitStore) moveColdBlocks(cold []cid.Cid) error { batch = append(batch, blk) if len(batch) == batchSize { - err = s.cold.PutMany(batch) + err = s.cold.PutMany(s.ctx, batch) if err != nil { return xerrors.Errorf("error putting batch to coldstore: %w", err) } @@ -888,7 +888,7 @@ func (s *SplitStore) moveColdBlocks(cold []cid.Cid) error { } if len(batch) > 0 { - err := s.cold.PutMany(batch) + err := s.cold.PutMany(s.ctx, batch) if err != nil { return xerrors.Errorf("error putting batch to coldstore: %w", err) } @@ -1058,7 +1058,7 @@ func (s *SplitStore) purge(cids []cid.Cid, markSet MarkSetVisitor) error { deadCids = append(deadCids, c) } - err := s.hot.DeleteMany(deadCids) + err := s.hot.DeleteMany(s.ctx, deadCids) if err != nil { return xerrors.Errorf("error purging cold objects: %w", err) } diff --git a/blockstore/splitstore/splitstore_expose.go b/blockstore/splitstore/splitstore_expose.go index 1065e460c2d..6f838229d68 100644 --- a/blockstore/splitstore/splitstore_expose.go +++ b/blockstore/splitstore/splitstore_expose.go @@ -20,28 +20,28 @@ func (s *SplitStore) Expose() bstore.Blockstore { return &exposedSplitStore{s: s} } -func (es *exposedSplitStore) DeleteBlock(_ cid.Cid) error { +func (es *exposedSplitStore) DeleteBlock(_ context.Context, _ cid.Cid) error { return errors.New("DeleteBlock: operation not supported") } -func (es *exposedSplitStore) DeleteMany(_ []cid.Cid) error { +func (es *exposedSplitStore) DeleteMany(_ context.Context, _ []cid.Cid) error { return errors.New("DeleteMany: operation not supported") } -func (es *exposedSplitStore) Has(c cid.Cid) (bool, error) { +func (es *exposedSplitStore) Has(ctx context.Context, c cid.Cid) (bool, error) { if isIdentiyCid(c) { return true, nil } - has, err := es.s.hot.Has(c) + has, err := es.s.hot.Has(ctx, c) if has || err != nil { return has, err } - return es.s.cold.Has(c) + return es.s.cold.Has(ctx, c) } -func (es *exposedSplitStore) Get(c cid.Cid) (blocks.Block, error) { +func (es *exposedSplitStore) Get(ctx context.Context, c cid.Cid) (blocks.Block, error) { if isIdentiyCid(c) { data, err := decodeIdentityCid(c) if err != nil { @@ -51,16 +51,16 @@ func (es *exposedSplitStore) Get(c cid.Cid) (blocks.Block, error) { return blocks.NewBlockWithCid(data, c) } - blk, err := es.s.hot.Get(c) + blk, err := es.s.hot.Get(ctx, c) switch err { case bstore.ErrNotFound: - return es.s.cold.Get(c) + return es.s.cold.Get(ctx, c) default: return blk, err } } -func (es *exposedSplitStore) GetSize(c cid.Cid) (int, error) { +func (es *exposedSplitStore) GetSize(ctx context.Context, c cid.Cid) (int, error) { if isIdentiyCid(c) { data, err := decodeIdentityCid(c) if err != nil { @@ -70,21 +70,21 @@ func (es *exposedSplitStore) GetSize(c cid.Cid) (int, error) { return len(data), nil } - size, err := es.s.hot.GetSize(c) + size, err := es.s.hot.GetSize(ctx, c) switch err { case bstore.ErrNotFound: - return es.s.cold.GetSize(c) + return es.s.cold.GetSize(ctx, c) default: return size, err } } -func (es *exposedSplitStore) Put(blk blocks.Block) error { - return es.s.Put(blk) +func (es *exposedSplitStore) Put(ctx context.Context, blk blocks.Block) error { + return es.s.Put(ctx, blk) } -func (es *exposedSplitStore) PutMany(blks []blocks.Block) error { - return es.s.PutMany(blks) +func (es *exposedSplitStore) PutMany(ctx context.Context, blks []blocks.Block) error { + return es.s.PutMany(ctx, blks) } func (es *exposedSplitStore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) { @@ -93,7 +93,7 @@ func (es *exposedSplitStore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, e func (es *exposedSplitStore) HashOnRead(enabled bool) {} -func (es *exposedSplitStore) View(c cid.Cid, f func([]byte) error) error { +func (es *exposedSplitStore) View(ctx context.Context, c cid.Cid, f func([]byte) error) error { if isIdentiyCid(c) { data, err := decodeIdentityCid(c) if err != nil { @@ -103,10 +103,10 @@ func (es *exposedSplitStore) View(c cid.Cid, f func([]byte) error) error { return f(data) } - err := es.s.hot.View(c, f) + err := es.s.hot.View(ctx, c, f) switch err { case bstore.ErrNotFound: - return es.s.cold.View(c, f) + return es.s.cold.View(ctx, c, f) default: return err diff --git a/blockstore/splitstore/splitstore_warmup.go b/blockstore/splitstore/splitstore_warmup.go index 216de571afe..2a39f6c9d8d 100644 --- a/blockstore/splitstore/splitstore_warmup.go +++ b/blockstore/splitstore/splitstore_warmup.go @@ -75,7 +75,7 @@ func (s *SplitStore) doWarmup(curTs *types.TipSet) error { count++ - has, err := s.hot.Has(c) + has, err := s.hot.Has(s.ctx, c) if err != nil { return err } @@ -84,7 +84,7 @@ func (s *SplitStore) doWarmup(curTs *types.TipSet) error { return nil } - blk, err := s.cold.Get(c) + blk, err := s.cold.Get(s.ctx, c) if err != nil { if err == bstore.ErrNotFound { missing++ @@ -97,7 +97,7 @@ func (s *SplitStore) doWarmup(curTs *types.TipSet) error { batchHot = append(batchHot, blk) if len(batchHot) == batchSize { - err = s.hot.PutMany(batchHot) + err = s.hot.PutMany(s.ctx, batchHot) if err != nil { return err } @@ -112,7 +112,7 @@ func (s *SplitStore) doWarmup(curTs *types.TipSet) error { } if len(batchHot) > 0 { - err = s.hot.PutMany(batchHot) + err = s.hot.PutMany(s.ctx, batchHot) if err != nil { return err } @@ -121,13 +121,13 @@ func (s *SplitStore) doWarmup(curTs *types.TipSet) error { log.Infow("warmup stats", "visited", count, "warm", xcount, "missing", missing) s.markSetSize = count + count>>2 // overestimate a bit - err = s.ds.Put(markSetSizeKey, int64ToBytes(s.markSetSize)) + err = s.ds.Put(s.ctx, markSetSizeKey, int64ToBytes(s.markSetSize)) if err != nil { log.Warnf("error saving mark set size: %s", err) } // save the warmup epoch - err = s.ds.Put(warmupEpochKey, epochToBytes(epoch)) + err = s.ds.Put(s.ctx, warmupEpochKey, epochToBytes(epoch)) if err != nil { return xerrors.Errorf("error saving warm up epoch: %w", err) } @@ -136,7 +136,7 @@ func (s *SplitStore) doWarmup(curTs *types.TipSet) error { s.mx.Unlock() // also save the compactionIndex, as this is used as an indicator of warmup for upgraded nodes - err = s.ds.Put(compactionIndexKey, int64ToBytes(s.compactionIndex)) + err = s.ds.Put(s.ctx, compactionIndexKey, int64ToBytes(s.compactionIndex)) if err != nil { return xerrors.Errorf("error saving compaction index: %w", err) } diff --git a/blockstore/sync.go b/blockstore/sync.go index 11a92359d10..1b4ad8297e8 100644 --- a/blockstore/sync.go +++ b/blockstore/sync.go @@ -76,6 +76,6 @@ func (m *SyncBlockstore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error return m.bs.AllKeysChan(ctx) } -func (m *SyncBlockstore) HashOnRead(ctx context.Context, enabled bool) { +func (m *SyncBlockstore) HashOnRead(enabled bool) { // noop } diff --git a/blockstore/union.go b/blockstore/union.go index e115458c282..f54a86590a1 100644 --- a/blockstore/union.go +++ b/blockstore/union.go @@ -112,8 +112,8 @@ func (m unionBlockstore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error return outCh, nil } -func (m unionBlockstore) HashOnRead(ctx context.Context, enabled bool) { +func (m unionBlockstore) HashOnRead(enabled bool) { for _, bs := range m { - bs.HashOnRead(ctx, enabled) + bs.HashOnRead(enabled) } } diff --git a/chain/checkpoint.go b/chain/checkpoint.go index a3660a45ce4..4f8310593c7 100644 --- a/chain/checkpoint.go +++ b/chain/checkpoint.go @@ -13,7 +13,7 @@ func (syncer *Syncer) SyncCheckpoint(ctx context.Context, tsk types.TipSetKey) e return xerrors.Errorf("called with empty tsk") } - ts, err := syncer.ChainStore().LoadTipSet(tsk) + ts, err := syncer.ChainStore().LoadTipSet(ctx, tsk) if err != nil { tss, err := syncer.Exchange.GetBlocks(ctx, tsk, 1) if err != nil { @@ -28,7 +28,7 @@ func (syncer *Syncer) SyncCheckpoint(ctx context.Context, tsk types.TipSetKey) e return xerrors.Errorf("failed to switch chain when syncing checkpoint: %w", err) } - if err := syncer.ChainStore().SetCheckpoint(ts); err != nil { + if err := syncer.ChainStore().SetCheckpoint(ctx, ts); err != nil { return xerrors.Errorf("failed to set the chain checkpoint: %w", err) } @@ -41,7 +41,7 @@ func (syncer *Syncer) switchChain(ctx context.Context, ts *types.TipSet) error { return nil } - if anc, err := syncer.store.IsAncestorOf(ts, hts); err == nil && anc { + if anc, err := syncer.store.IsAncestorOf(ctx, ts, hts); err == nil && anc { return nil } @@ -50,7 +50,7 @@ func (syncer *Syncer) switchChain(ctx context.Context, ts *types.TipSet) error { return xerrors.Errorf("failed to collect chain for checkpoint: %w", err) } - if err := syncer.ChainStore().SetHead(ts); err != nil { + if err := syncer.ChainStore().SetHead(ctx, ts); err != nil { return xerrors.Errorf("failed to set the chain head: %w", err) } return nil diff --git a/chain/consensus/filcns/compute_state.go b/chain/consensus/filcns/compute_state.go index 3c333298ef9..1bc5763b2b6 100644 --- a/chain/consensus/filcns/compute_state.go +++ b/chain/consensus/filcns/compute_state.go @@ -289,7 +289,7 @@ func (t *TipSetExecutor) ExecuteTipSet(ctx context.Context, sm *stmgr.StateManag var parentEpoch abi.ChainEpoch pstate := blks[0].ParentStateRoot if blks[0].Height > 0 { - parent, err := sm.ChainStore().GetBlock(blks[0].Parents[0]) + parent, err := sm.ChainStore().GetBlock(ctx, blks[0].Parents[0]) if err != nil { return cid.Undef, cid.Undef, xerrors.Errorf("getting parent block: %w", err) } diff --git a/chain/consensus/filcns/filecoin.go b/chain/consensus/filcns/filecoin.go index 883edd9a15f..7f2eaa27347 100644 --- a/chain/consensus/filcns/filecoin.go +++ b/chain/consensus/filcns/filecoin.go @@ -90,7 +90,7 @@ func (filec *FilecoinEC) ValidateBlock(ctx context.Context, b *types.FullBlock) h := b.Header - baseTs, err := filec.store.LoadTipSet(types.NewTipSetKey(h.Parents...)) + baseTs, err := filec.store.LoadTipSet(ctx, types.NewTipSetKey(h.Parents...)) if err != nil { return xerrors.Errorf("load parent tipset failed (%s): %w", h.Parents, err) } @@ -102,7 +102,7 @@ func (filec *FilecoinEC) ValidateBlock(ctx context.Context, b *types.FullBlock) return xerrors.Errorf("failed to get lookback tipset for block: %w", err) } - prevBeacon, err := filec.store.GetLatestBeaconEntry(baseTs) + prevBeacon, err := filec.store.GetLatestBeaconEntry(ctx, baseTs) if err != nil { return xerrors.Errorf("failed to get latest beacon entry: %w", err) } diff --git a/chain/consensus/filcns/mine.go b/chain/consensus/filcns/mine.go index bbda35fcfd3..bb49312977e 100644 --- a/chain/consensus/filcns/mine.go +++ b/chain/consensus/filcns/mine.go @@ -15,7 +15,7 @@ import ( ) func (filec *FilecoinEC) CreateBlock(ctx context.Context, w api.Wallet, bt *api.BlockTemplate) (*types.FullBlock, error) { - pts, err := filec.sm.ChainStore().LoadTipSet(bt.Parents) + pts, err := filec.sm.ChainStore().LoadTipSet(ctx, bt.Parents) if err != nil { return nil, xerrors.Errorf("failed to load parent tipset: %w", err) } diff --git a/chain/consensus/filcns/upgrades.go b/chain/consensus/filcns/upgrades.go index cf4c62bf340..546c491a902 100644 --- a/chain/consensus/filcns/upgrades.go +++ b/chain/consensus/filcns/upgrades.go @@ -625,7 +625,7 @@ func splitGenesisMultisig0(ctx context.Context, em stmgr.ExecMonitor, addr addre // TODO: After the Liftoff epoch, refactor this to use resetMultisigVesting func resetGenesisMsigs0(ctx context.Context, sm *stmgr.StateManager, store adt0.Store, tree *state.StateTree, startEpoch abi.ChainEpoch) error { - gb, err := sm.ChainStore().GetGenesis() + gb, err := sm.ChainStore().GetGenesis(ctx) if err != nil { return xerrors.Errorf("getting genesis block: %w", err) } diff --git a/chain/exchange/server.go b/chain/exchange/server.go index 7c1624e579a..b4519ba7009 100644 --- a/chain/exchange/server.go +++ b/chain/exchange/server.go @@ -136,7 +136,7 @@ func (s *server) serviceRequest(ctx context.Context, req *validatedRequest) (*Re _, span := trace.StartSpan(ctx, "chainxchg.ServiceRequest") defer span.End() - chain, err := collectChainSegment(s.cs, req) + chain, err := collectChainSegment(ctx, s.cs, req) if err != nil { log.Warn("block sync request: collectChainSegment failed: ", err) return &Response{ @@ -156,13 +156,13 @@ func (s *server) serviceRequest(ctx context.Context, req *validatedRequest) (*Re }, nil } -func collectChainSegment(cs *store.ChainStore, req *validatedRequest) ([]*BSTipSet, error) { +func collectChainSegment(ctx context.Context, cs *store.ChainStore, req *validatedRequest) ([]*BSTipSet, error) { var bstips []*BSTipSet cur := req.head for { var bst BSTipSet - ts, err := cs.LoadTipSet(cur) + ts, err := cs.LoadTipSet(ctx, cur) if err != nil { return nil, xerrors.Errorf("failed loading tipset %s: %w", cur, err) } diff --git a/chain/gen/gen.go b/chain/gen/gen.go index 69ab32d58e8..122e55fa843 100644 --- a/chain/gen/gen.go +++ b/chain/gen/gen.go @@ -239,7 +239,7 @@ func NewGeneratorWithSectorsAndUpgradeSchedule(numSectors int, us stmgr.UpgradeS genfb := &types.FullBlock{Header: genb.Genesis} gents := store.NewFullTipSet([]*types.FullBlock{genfb}) - if err := cs.SetGenesis(genb.Genesis); err != nil { + if err := cs.SetGenesis(context.TODO(), genb.Genesis); err != nil { return nil, xerrors.Errorf("set genesis failed: %w", err) } @@ -469,7 +469,7 @@ func (cg *ChainGen) NextTipSetFromMinersWithMessagesAndNulls(base *types.TipSet, return nil, xerrors.Errorf("making a block for next tipset failed: %w", err) } - if err := cg.cs.PersistBlockHeaders(fblk.Header); err != nil { + if err := cg.cs.PersistBlockHeaders(context.TODO(), fblk.Header); err != nil { return nil, xerrors.Errorf("chainstore AddBlock: %w", err) } diff --git a/chain/gen/genesis/genesis.go b/chain/gen/genesis/genesis.go index 29f03e2af92..00f350ff102 100644 --- a/chain/gen/genesis/genesis.go +++ b/chain/gen/genesis/genesis.go @@ -591,7 +591,7 @@ func MakeGenesisBlock(ctx context.Context, j journal.Journal, bs bstore.Blocksto if err != nil { return nil, xerrors.Errorf("serializing msgmeta failed: %w", err) } - if err := bs.Put(mmb); err != nil { + if err := bs.Put(ctx, mmb); err != nil { return nil, xerrors.Errorf("putting msgmeta block to blockstore: %w", err) } @@ -621,7 +621,7 @@ func MakeGenesisBlock(ctx context.Context, j journal.Journal, bs bstore.Blocksto return nil, xerrors.Errorf("filecoinGenesisCid != gblk.Cid") } - if err := bs.Put(gblk); err != nil { + if err := bs.Put(ctx, gblk); err != nil { return nil, xerrors.Errorf("failed writing filecoin genesis block to blockstore: %w", err) } @@ -652,7 +652,7 @@ func MakeGenesisBlock(ctx context.Context, j journal.Journal, bs bstore.Blocksto return nil, xerrors.Errorf("serializing block header failed: %w", err) } - if err := bs.Put(sb); err != nil { + if err := bs.Put(ctx, sb); err != nil { return nil, xerrors.Errorf("putting header to blockstore: %w", err) } diff --git a/chain/gen/slashfilter/slashfilter.go b/chain/gen/slashfilter/slashfilter.go index 5edcd5439df..de3af582599 100644 --- a/chain/gen/slashfilter/slashfilter.go +++ b/chain/gen/slashfilter/slashfilter.go @@ -1,6 +1,7 @@ package slashfilter import ( + "context" "fmt" "github.com/filecoin-project/lotus/build" @@ -27,7 +28,7 @@ func New(dstore ds.Batching) *SlashFilter { } } -func (f *SlashFilter) MinedBlock(bh *types.BlockHeader, parentEpoch abi.ChainEpoch) error { +func (f *SlashFilter) MinedBlock(ctx context.Context, bh *types.BlockHeader, parentEpoch abi.ChainEpoch) error { if build.IsNearUpgrade(bh.Height, build.UpgradeOrangeHeight) { return nil } @@ -35,7 +36,7 @@ func (f *SlashFilter) MinedBlock(bh *types.BlockHeader, parentEpoch abi.ChainEpo epochKey := ds.NewKey(fmt.Sprintf("/%s/%d", bh.Miner, bh.Height)) { // double-fork mining (2 blocks at one epoch) - if err := checkFault(f.byEpoch, epochKey, bh, "double-fork mining faults"); err != nil { + if err := checkFault(ctx, f.byEpoch, epochKey, bh, "double-fork mining faults"); err != nil { return err } } @@ -43,7 +44,7 @@ func (f *SlashFilter) MinedBlock(bh *types.BlockHeader, parentEpoch abi.ChainEpo parentsKey := ds.NewKey(fmt.Sprintf("/%s/%x", bh.Miner, types.NewTipSetKey(bh.Parents...).Bytes())) { // time-offset mining faults (2 blocks with the same parents) - if err := checkFault(f.byParents, parentsKey, bh, "time-offset mining faults"); err != nil { + if err := checkFault(ctx, f.byParents, parentsKey, bh, "time-offset mining faults"); err != nil { return err } } @@ -53,14 +54,14 @@ func (f *SlashFilter) MinedBlock(bh *types.BlockHeader, parentEpoch abi.ChainEpo // First check if we have mined a block on the parent epoch parentEpochKey := ds.NewKey(fmt.Sprintf("/%s/%d", bh.Miner, parentEpoch)) - have, err := f.byEpoch.Has(parentEpochKey) + have, err := f.byEpoch.Has(ctx, parentEpochKey) if err != nil { return err } if have { // If we had, make sure it's in our parent tipset - cidb, err := f.byEpoch.Get(parentEpochKey) + cidb, err := f.byEpoch.Get(ctx, parentEpochKey) if err != nil { return xerrors.Errorf("getting other block cid: %w", err) } @@ -83,25 +84,25 @@ func (f *SlashFilter) MinedBlock(bh *types.BlockHeader, parentEpoch abi.ChainEpo } } - if err := f.byParents.Put(parentsKey, bh.Cid().Bytes()); err != nil { + if err := f.byParents.Put(ctx, parentsKey, bh.Cid().Bytes()); err != nil { return xerrors.Errorf("putting byEpoch entry: %w", err) } - if err := f.byEpoch.Put(epochKey, bh.Cid().Bytes()); err != nil { + if err := f.byEpoch.Put(ctx, epochKey, bh.Cid().Bytes()); err != nil { return xerrors.Errorf("putting byEpoch entry: %w", err) } return nil } -func checkFault(t ds.Datastore, key ds.Key, bh *types.BlockHeader, faultType string) error { - fault, err := t.Has(key) +func checkFault(ctx context.Context, t ds.Datastore, key ds.Key, bh *types.BlockHeader, faultType string) error { + fault, err := t.Has(ctx, key) if err != nil { return err } if fault { - cidb, err := t.Get(key) + cidb, err := t.Get(ctx, key) if err != nil { return xerrors.Errorf("getting other block cid: %w", err) } diff --git a/chain/market/fundmanager.go b/chain/market/fundmanager.go index 5becfdfa717..e934201d7dd 100644 --- a/chain/market/fundmanager.go +++ b/chain/market/fundmanager.go @@ -89,7 +89,7 @@ func (fm *FundManager) Start() error { // - in State() only load addresses with in-progress messages // - load the others just-in-time from getFundedAddress // - delete(fm.fundedAddrs, addr) when the queue has been processed - return fm.str.forEach(func(state *FundedAddressState) { + return fm.str.forEach(fm.ctx, func(state *FundedAddressState) { fa := newFundedAddress(fm, state.Addr) fa.state = state fm.fundedAddrs[fa.state.Addr] = fa @@ -322,7 +322,7 @@ func (a *fundedAddress) clearWaitState() { // Save state to datastore func (a *fundedAddress) saveState() { // Not much we can do if saving to the datastore fails, just log - err := a.str.save(a.state) + err := a.str.save(a.ctx, a.state) if err != nil { log.Errorf("saving state to store for addr %s: %v", a.state.Addr, err) } diff --git a/chain/market/store.go b/chain/market/store.go index e0d0e10be38..9818b1d80dc 100644 --- a/chain/market/store.go +++ b/chain/market/store.go @@ -2,6 +2,7 @@ package market import ( "bytes" + "context" cborrpc "github.com/filecoin-project/go-cbor-util" "github.com/ipfs/go-datastore" @@ -27,7 +28,7 @@ func newStore(ds dtypes.MetadataDS) *Store { } // save the state to the datastore -func (ps *Store) save(state *FundedAddressState) error { +func (ps *Store) save(ctx context.Context, state *FundedAddressState) error { k := dskeyForAddr(state.Addr) b, err := cborrpc.Dump(state) @@ -35,14 +36,14 @@ func (ps *Store) save(state *FundedAddressState) error { return err } - return ps.ds.Put(k, b) + return ps.ds.Put(ctx, k, b) } // get the state for the given address -func (ps *Store) get(addr address.Address) (*FundedAddressState, error) { +func (ps *Store) get(ctx context.Context, addr address.Address) (*FundedAddressState, error) { k := dskeyForAddr(addr) - data, err := ps.ds.Get(k) + data, err := ps.ds.Get(ctx, k) if err != nil { return nil, err } @@ -56,8 +57,8 @@ func (ps *Store) get(addr address.Address) (*FundedAddressState, error) { } // forEach calls iter with each address in the datastore -func (ps *Store) forEach(iter func(*FundedAddressState)) error { - res, err := ps.ds.Query(dsq.Query{Prefix: dsKeyAddr}) +func (ps *Store) forEach(ctx context.Context, iter func(*FundedAddressState)) error { + res, err := ps.ds.Query(ctx, dsq.Query{Prefix: dsKeyAddr}) if err != nil { return err } diff --git a/chain/messagepool/config.go b/chain/messagepool/config.go index a511f84b7f4..3c07a8a0f02 100644 --- a/chain/messagepool/config.go +++ b/chain/messagepool/config.go @@ -1,6 +1,7 @@ package messagepool import ( + "context" "encoding/json" "fmt" "time" @@ -20,8 +21,8 @@ var ( ConfigKey = datastore.NewKey("/mpool/config") ) -func loadConfig(ds dtypes.MetadataDS) (*types.MpoolConfig, error) { - haveCfg, err := ds.Has(ConfigKey) +func loadConfig(ctx context.Context, ds dtypes.MetadataDS) (*types.MpoolConfig, error) { + haveCfg, err := ds.Has(ctx, ConfigKey) if err != nil { return nil, err } @@ -30,7 +31,7 @@ func loadConfig(ds dtypes.MetadataDS) (*types.MpoolConfig, error) { return DefaultConfig(), nil } - cfgBytes, err := ds.Get(ConfigKey) + cfgBytes, err := ds.Get(ctx, ConfigKey) if err != nil { return nil, err } @@ -39,12 +40,12 @@ func loadConfig(ds dtypes.MetadataDS) (*types.MpoolConfig, error) { return cfg, err } -func saveConfig(cfg *types.MpoolConfig, ds dtypes.MetadataDS) error { +func saveConfig(ctx context.Context, cfg *types.MpoolConfig, ds dtypes.MetadataDS) error { cfgBytes, err := json.Marshal(cfg) if err != nil { return err } - return ds.Put(ConfigKey, cfgBytes) + return ds.Put(ctx, ConfigKey, cfgBytes) } func (mp *MessagePool) GetConfig() *types.MpoolConfig { @@ -68,7 +69,7 @@ func validateConfg(cfg *types.MpoolConfig) error { return nil } -func (mp *MessagePool) SetConfig(cfg *types.MpoolConfig) error { +func (mp *MessagePool) SetConfig(ctx context.Context, cfg *types.MpoolConfig) error { if err := validateConfg(cfg); err != nil { return err } @@ -76,7 +77,7 @@ func (mp *MessagePool) SetConfig(cfg *types.MpoolConfig) error { mp.cfgLk.Lock() mp.cfg = cfg - err := saveConfig(cfg, mp.ds) + err := saveConfig(ctx, cfg, mp.ds) if err != nil { log.Warnf("error persisting mpool config: %s", err) } diff --git a/chain/messagepool/messagepool.go b/chain/messagepool/messagepool.go index 06343e9c978..c8b4931f079 100644 --- a/chain/messagepool/messagepool.go +++ b/chain/messagepool/messagepool.go @@ -358,11 +358,11 @@ func (ms *msgSet) toSlice() []*types.SignedMessage { return set } -func New(api Provider, ds dtypes.MetadataDS, us stmgr.UpgradeSchedule, netName dtypes.NetworkName, j journal.Journal) (*MessagePool, error) { +func New(ctx context.Context, api Provider, ds dtypes.MetadataDS, us stmgr.UpgradeSchedule, netName dtypes.NetworkName, j journal.Journal) (*MessagePool, error) { cache, _ := lru.New2Q(build.BlsSignatureCacheSize) verifcache, _ := lru.New2Q(build.VerifSigCacheSize) - cfg, err := loadConfig(ds) + cfg, err := loadConfig(ctx, ds) if err != nil { return nil, xerrors.Errorf("error loading mpool config: %w", err) } @@ -601,7 +601,7 @@ func (mp *MessagePool) addLocal(ctx context.Context, m *types.SignedMessage) err return xerrors.Errorf("error serializing message: %w", err) } - if err := mp.localMsgs.Put(datastore.NewKey(string(m.Cid().Bytes())), msgb); err != nil { + if err := mp.localMsgs.Put(ctx, datastore.NewKey(string(m.Cid().Bytes())), msgb); err != nil { return xerrors.Errorf("persisting local message: %w", err) } @@ -1207,7 +1207,7 @@ func (mp *MessagePool) HeadChange(ctx context.Context, revert []*types.TipSet, a var merr error for _, ts := range revert { - pts, err := mp.api.LoadTipSet(ts.Parents()) + pts, err := mp.api.LoadTipSet(ctx, ts.Parents()) if err != nil { log.Errorf("error loading reverted tipset parent: %s", err) merr = multierror.Append(merr, err) @@ -1338,7 +1338,7 @@ func (mp *MessagePool) HeadChange(ctx context.Context, revert []*types.TipSet, a return merr } -func (mp *MessagePool) runHeadChange(from *types.TipSet, to *types.TipSet, rmsgs map[address.Address]map[uint64]*types.SignedMessage) error { +func (mp *MessagePool) runHeadChange(ctx context.Context, from *types.TipSet, to *types.TipSet, rmsgs map[address.Address]map[uint64]*types.SignedMessage) error { add := func(m *types.SignedMessage) { s, ok := rmsgs[m.Message.From] if !ok { @@ -1360,7 +1360,7 @@ func (mp *MessagePool) runHeadChange(from *types.TipSet, to *types.TipSet, rmsgs } - revert, apply, err := store.ReorgOps(mp.api.LoadTipSet, from, to) + revert, apply, err := store.ReorgOps(ctx, mp.api.LoadTipSet, from, to) if err != nil { return xerrors.Errorf("failed to compute reorg ops for mpool pending messages: %w", err) } @@ -1477,7 +1477,7 @@ func (mp *MessagePool) Updates(ctx context.Context) (<-chan api.MpoolUpdate, err } func (mp *MessagePool) loadLocal(ctx context.Context) error { - res, err := mp.localMsgs.Query(query.Query{}) + res, err := mp.localMsgs.Query(ctx, query.Query{}) if err != nil { return xerrors.Errorf("query local messages: %w", err) } @@ -1525,7 +1525,7 @@ func (mp *MessagePool) Clear(ctx context.Context, local bool) { if ok { for _, m := range mset.msgs { - err := mp.localMsgs.Delete(datastore.NewKey(string(m.Cid().Bytes()))) + err := mp.localMsgs.Delete(ctx, datastore.NewKey(string(m.Cid().Bytes()))) if err != nil { log.Warnf("error deleting local message: %s", err) } diff --git a/chain/messagepool/provider.go b/chain/messagepool/provider.go index 0f904c52c49..5a3a2ac2266 100644 --- a/chain/messagepool/provider.go +++ b/chain/messagepool/provider.go @@ -29,7 +29,7 @@ type Provider interface { StateAccountKeyAtFinality(context.Context, address.Address, *types.TipSet) (address.Address, error) MessagesForBlock(*types.BlockHeader) ([]*types.Message, []*types.SignedMessage, error) MessagesForTipset(*types.TipSet) ([]types.ChainMsg, error) - LoadTipSet(tsk types.TipSetKey) (*types.TipSet, error) + LoadTipSet(ctx context.Context, tsk types.TipSetKey) (*types.TipSet, error) ChainComputeBaseFee(ctx context.Context, ts *types.TipSet) (types.BigInt, error) IsLite() bool } @@ -111,8 +111,8 @@ func (mpp *mpoolProvider) MessagesForTipset(ts *types.TipSet) ([]types.ChainMsg, return mpp.sm.ChainStore().MessagesForTipset(ts) } -func (mpp *mpoolProvider) LoadTipSet(tsk types.TipSetKey) (*types.TipSet, error) { - return mpp.sm.ChainStore().LoadTipSet(tsk) +func (mpp *mpoolProvider) LoadTipSet(ctx context.Context, tsk types.TipSetKey) (*types.TipSet, error) { + return mpp.sm.ChainStore().LoadTipSet(ctx, tsk) } func (mpp *mpoolProvider) ChainComputeBaseFee(ctx context.Context, ts *types.TipSet) (types.BigInt, error) { diff --git a/chain/messagepool/pruning.go b/chain/messagepool/pruning.go index c10239b8e4a..d405afb6589 100644 --- a/chain/messagepool/pruning.go +++ b/chain/messagepool/pruning.go @@ -49,7 +49,7 @@ func (mp *MessagePool) pruneMessages(ctx context.Context, ts *types.TipSet) erro } baseFeeLowerBound := getBaseFeeLowerBound(baseFee, baseFeeLowerBoundFactor) - pending, _ := mp.getPendingMessages(ts, ts) + pending, _ := mp.getPendingMessages(ctx, ts, ts) // protected actors -- not pruned protected := make(map[address.Address]struct{}) diff --git a/chain/messagepool/selection.go b/chain/messagepool/selection.go index acff7c4cff9..af6392f7aeb 100644 --- a/chain/messagepool/selection.go +++ b/chain/messagepool/selection.go @@ -73,7 +73,7 @@ func (mp *MessagePool) selectMessagesOptimal(ctx context.Context, curTs, ts *typ // 0. Load messages from the target tipset; if it is the same as the current tipset in // the mpool, then this is just the pending messages - pending, err := mp.getPendingMessages(curTs, ts) + pending, err := mp.getPendingMessages(ctx, curTs, ts) if err != nil { return nil, err } @@ -397,7 +397,7 @@ func (mp *MessagePool) selectMessagesGreedy(ctx context.Context, curTs, ts *type // 0. Load messages for the target tipset; if it is the same as the current tipset in the mpool // then this is just the pending messages - pending, err := mp.getPendingMessages(curTs, ts) + pending, err := mp.getPendingMessages(ctx, curTs, ts) if err != nil { return nil, err } @@ -634,7 +634,7 @@ tailLoop: return result, gasLimit } -func (mp *MessagePool) getPendingMessages(curTs, ts *types.TipSet) (map[address.Address]map[uint64]*types.SignedMessage, error) { +func (mp *MessagePool) getPendingMessages(ctx context.Context, curTs, ts *types.TipSet) (map[address.Address]map[uint64]*types.SignedMessage, error) { start := time.Now() result := make(map[address.Address]map[uint64]*types.SignedMessage) @@ -670,7 +670,7 @@ func (mp *MessagePool) getPendingMessages(curTs, ts *types.TipSet) (map[address. return result, nil } - if err := mp.runHeadChange(curTs, ts, result); err != nil { + if err := mp.runHeadChange(ctx, curTs, ts, result); err != nil { return nil, xerrors.Errorf("failed to process difference between mpool head and given head: %w", err) } diff --git a/chain/messagesigner/messagesigner.go b/chain/messagesigner/messagesigner.go index 063d1aa7d1a..e2229bb51a2 100644 --- a/chain/messagesigner/messagesigner.go +++ b/chain/messagesigner/messagesigner.go @@ -84,7 +84,7 @@ func (ms *MessageSigner) SignMessage(ctx context.Context, msg *types.Message, cb } // If the callback executed successfully, write the nonce to the datastore - if err := ms.saveNonce(msg.From, nonce); err != nil { + if err := ms.saveNonce(ctx, msg.From, nonce); err != nil { return nil, xerrors.Errorf("failed to save nonce: %w", err) } @@ -105,7 +105,7 @@ func (ms *MessageSigner) nextNonce(ctx context.Context, addr address.Address) (u // Get the next nonce for this address from the datastore addrNonceKey := ms.dstoreKey(addr) - dsNonceBytes, err := ms.ds.Get(addrNonceKey) + dsNonceBytes, err := ms.ds.Get(ctx, addrNonceKey) switch { case xerrors.Is(err, datastore.ErrNotFound): @@ -139,7 +139,7 @@ func (ms *MessageSigner) nextNonce(ctx context.Context, addr address.Address) (u // saveNonce increments the nonce for this address and writes it to the // datastore -func (ms *MessageSigner) saveNonce(addr address.Address, nonce uint64) error { +func (ms *MessageSigner) saveNonce(ctx context.Context, addr address.Address, nonce uint64) error { // Increment the nonce nonce++ @@ -150,7 +150,7 @@ func (ms *MessageSigner) saveNonce(addr address.Address, nonce uint64) error { if err != nil { return xerrors.Errorf("failed to marshall nonce: %w", err) } - err = ms.ds.Put(addrNonceKey, buf.Bytes()) + err = ms.ds.Put(ctx, addrNonceKey, buf.Bytes()) if err != nil { return xerrors.Errorf("failed to write nonce to datastore: %w", err) } diff --git a/chain/rand/rand.go b/chain/rand/rand.go index 90e9a514b06..10eb0436d6c 100644 --- a/chain/rand/rand.go +++ b/chain/rand/rand.go @@ -48,7 +48,7 @@ func (sr *stateRand) GetBeaconRandomnessTipset(ctx context.Context, round abi.Ch defer span.End() span.AddAttributes(trace.Int64Attribute("round", int64(round))) - ts, err := sr.cs.LoadTipSet(types.NewTipSetKey(sr.blks...)) + ts, err := sr.cs.LoadTipSet(ctx, types.NewTipSetKey(sr.blks...)) if err != nil { return nil, err } @@ -75,7 +75,7 @@ func (sr *stateRand) GetChainRandomness(ctx context.Context, pers crypto.DomainS defer span.End() span.AddAttributes(trace.Int64Attribute("round", int64(round))) - ts, err := sr.cs.LoadTipSet(types.NewTipSetKey(sr.blks...)) + ts, err := sr.cs.LoadTipSet(ctx, types.NewTipSetKey(sr.blks...)) if err != nil { return nil, err } @@ -132,7 +132,7 @@ func (sr *stateRand) GetBeaconRandomnessV1(ctx context.Context, pers crypto.Doma return nil, err } - be, err := sr.cs.GetLatestBeaconEntry(randTs) + be, err := sr.cs.GetLatestBeaconEntry(ctx, randTs) if err != nil { return nil, err } @@ -149,7 +149,7 @@ func (sr *stateRand) GetBeaconRandomnessV2(ctx context.Context, pers crypto.Doma return nil, err } - be, err := sr.cs.GetLatestBeaconEntry(randTs) + be, err := sr.cs.GetLatestBeaconEntry(ctx, randTs) if err != nil { return nil, err } @@ -190,7 +190,7 @@ func (sr *stateRand) extractBeaconEntryForEpoch(ctx context.Context, filecoinEpo } } - next, err := sr.cs.LoadTipSet(randTs.Parents()) + next, err := sr.cs.LoadTipSet(ctx, randTs.Parents()) if err != nil { return nil, xerrors.Errorf("failed to load parents when searching back for beacon entry: %w", err) } diff --git a/chain/stmgr/actors.go b/chain/stmgr/actors.go index 4d016b7ab27..6804b81263d 100644 --- a/chain/stmgr/actors.go +++ b/chain/stmgr/actors.go @@ -14,6 +14,7 @@ import ( "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/go-state-types/network" cid "github.com/ipfs/go-cid" + "golang.org/x/xerrors" "github.com/filecoin-project/lotus/api" @@ -300,12 +301,12 @@ func ListMinerActors(ctx context.Context, sm *StateManager, ts *types.TipSet) ([ } func MinerGetBaseInfo(ctx context.Context, sm *StateManager, bcs beacon.Schedule, tsk types.TipSetKey, round abi.ChainEpoch, maddr address.Address, pv ffiwrapper.Verifier) (*api.MiningBaseInfo, error) { - ts, err := sm.ChainStore().LoadTipSet(tsk) + ts, err := sm.ChainStore().LoadTipSet(ctx, tsk) if err != nil { return nil, xerrors.Errorf("failed to load tipset for mining base: %w", err) } - prev, err := sm.ChainStore().GetLatestBeaconEntry(ts) + prev, err := sm.ChainStore().GetLatestBeaconEntry(ctx, ts) if err != nil { if os.Getenv("LOTUS_IGNORE_DRAND") != "_yes_" { return nil, xerrors.Errorf("failed to get latest beacon entry: %w", err) diff --git a/chain/stmgr/call.go b/chain/stmgr/call.go index 7cc50e710d6..ef29e165945 100644 --- a/chain/stmgr/call.go +++ b/chain/stmgr/call.go @@ -40,7 +40,7 @@ func (sm *StateManager) Call(ctx context.Context, msg *types.Message, ts *types. ts = sm.cs.GetHeaviestTipSet() // Search back till we find a height with no fork, or we reach the beginning. for ts.Height() > 0 { - pts, err := sm.cs.GetTipSetFromKey(ts.Parents()) + pts, err := sm.cs.GetTipSetFromKey(ctx, ts.Parents()) if err != nil { return nil, xerrors.Errorf("failed to find a non-forking epoch: %w", err) } @@ -51,7 +51,7 @@ func (sm *StateManager) Call(ctx context.Context, msg *types.Message, ts *types. ts = pts } } else if ts.Height() > 0 { - pts, err := sm.cs.LoadTipSet(ts.Parents()) + pts, err := sm.cs.LoadTipSet(ctx, ts.Parents()) if err != nil { return nil, xerrors.Errorf("failed to load parent tipset: %w", err) } @@ -155,7 +155,7 @@ func (sm *StateManager) CallWithGas(ctx context.Context, msg *types.Message, pri // height to have no fork, because we'll run it inside this // function before executing the given message. for ts.Height() > 0 { - pts, err := sm.cs.GetTipSetFromKey(ts.Parents()) + pts, err := sm.cs.GetTipSetFromKey(ctx, ts.Parents()) if err != nil { return nil, xerrors.Errorf("failed to find a non-forking epoch: %w", err) } @@ -166,7 +166,7 @@ func (sm *StateManager) CallWithGas(ctx context.Context, msg *types.Message, pri ts = pts } } else if ts.Height() > 0 { - pts, err := sm.cs.GetTipSetFromKey(ts.Parents()) + pts, err := sm.cs.GetTipSetFromKey(ctx, ts.Parents()) if err != nil { return nil, xerrors.Errorf("failed to find a non-forking epoch: %w", err) } diff --git a/chain/stmgr/read.go b/chain/stmgr/read.go index bc259f22761..bca32429bb9 100644 --- a/chain/stmgr/read.go +++ b/chain/stmgr/read.go @@ -13,8 +13,8 @@ import ( "github.com/filecoin-project/lotus/chain/types" ) -func (sm *StateManager) ParentStateTsk(tsk types.TipSetKey) (*state.StateTree, error) { - ts, err := sm.cs.GetTipSetFromKey(tsk) +func (sm *StateManager) ParentStateTsk(ctx context.Context, tsk types.TipSetKey) (*state.StateTree, error) { + ts, err := sm.cs.GetTipSetFromKey(ctx, tsk) if err != nil { return nil, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -57,8 +57,8 @@ func (sm *StateManager) LoadActor(_ context.Context, addr address.Address, ts *t return state.GetActor(addr) } -func (sm *StateManager) LoadActorTsk(_ context.Context, addr address.Address, tsk types.TipSetKey) (*types.Actor, error) { - state, err := sm.ParentStateTsk(tsk) +func (sm *StateManager) LoadActorTsk(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*types.Actor, error) { + state, err := sm.ParentStateTsk(ctx, tsk) if err != nil { return nil, err } diff --git a/chain/stmgr/searchwait.go b/chain/stmgr/searchwait.go index 45c98a8552f..7d743dd0f54 100644 --- a/chain/stmgr/searchwait.go +++ b/chain/stmgr/searchwait.go @@ -40,7 +40,7 @@ func (sm *StateManager) WaitForMessage(ctx context.Context, mcid cid.Cid, confid return nil, nil, cid.Undef, fmt.Errorf("expected current head on SHC stream (got %s)", head[0].Type) } - r, foundMsg, err := sm.tipsetExecutedMessage(head[0].Val, mcid, msg.VMMessage(), allowReplaced) + r, foundMsg, err := sm.tipsetExecutedMessage(ctx, head[0].Val, mcid, msg.VMMessage(), allowReplaced) if err != nil { return nil, nil, cid.Undef, err } @@ -93,7 +93,7 @@ func (sm *StateManager) WaitForMessage(ctx context.Context, mcid cid.Cid, confid if candidateTs != nil && val.Val.Height() >= candidateTs.Height()+abi.ChainEpoch(confidence) { return candidateTs, candidateRcp, candidateFm, nil } - r, foundMsg, err := sm.tipsetExecutedMessage(val.Val, mcid, msg.VMMessage(), allowReplaced) + r, foundMsg, err := sm.tipsetExecutedMessage(ctx, val.Val, mcid, msg.VMMessage(), allowReplaced) if err != nil { return nil, nil, cid.Undef, err } @@ -135,7 +135,7 @@ func (sm *StateManager) SearchForMessage(ctx context.Context, head *types.TipSet return nil, nil, cid.Undef, fmt.Errorf("failed to load message: %w", err) } - r, foundMsg, err := sm.tipsetExecutedMessage(head, mcid, msg.VMMessage(), allowReplaced) + r, foundMsg, err := sm.tipsetExecutedMessage(ctx, head, mcid, msg.VMMessage(), allowReplaced) if err != nil { return nil, nil, cid.Undef, err } @@ -201,7 +201,7 @@ func (sm *StateManager) searchBackForMsg(ctx context.Context, from *types.TipSet return nil, nil, cid.Undef, nil } - pts, err := sm.cs.LoadTipSet(cur.Parents()) + pts, err := sm.cs.LoadTipSet(ctx, cur.Parents()) if err != nil { return nil, nil, cid.Undef, xerrors.Errorf("failed to load tipset during msg wait searchback: %w", err) } @@ -214,7 +214,7 @@ func (sm *StateManager) searchBackForMsg(ctx context.Context, from *types.TipSet // check that between cur and parent tipset the nonce fell into range of our message if actorNoExist || (curActor.Nonce > mNonce && act.Nonce <= mNonce) { - r, foundMsg, err := sm.tipsetExecutedMessage(cur, m.Cid(), m.VMMessage(), allowReplaced) + r, foundMsg, err := sm.tipsetExecutedMessage(ctx, cur, m.Cid(), m.VMMessage(), allowReplaced) if err != nil { return nil, nil, cid.Undef, xerrors.Errorf("checking for message execution during lookback: %w", err) } @@ -229,13 +229,13 @@ func (sm *StateManager) searchBackForMsg(ctx context.Context, from *types.TipSet } } -func (sm *StateManager) tipsetExecutedMessage(ts *types.TipSet, msg cid.Cid, vmm *types.Message, allowReplaced bool) (*types.MessageReceipt, cid.Cid, error) { +func (sm *StateManager) tipsetExecutedMessage(ctx context.Context, ts *types.TipSet, msg cid.Cid, vmm *types.Message, allowReplaced bool) (*types.MessageReceipt, cid.Cid, error) { // The genesis block did not execute any messages if ts.Height() == 0 { return nil, cid.Undef, nil } - pts, err := sm.cs.LoadTipSet(ts.Parents()) + pts, err := sm.cs.LoadTipSet(ctx, ts.Parents()) if err != nil { return nil, cid.Undef, err } diff --git a/chain/stmgr/stmgr.go b/chain/stmgr/stmgr.go index 67c0bdb6a91..cfd9192f484 100644 --- a/chain/stmgr/stmgr.go +++ b/chain/stmgr/stmgr.go @@ -320,7 +320,7 @@ func (sm *StateManager) LookupID(ctx context.Context, addr address.Address, ts * func (sm *StateManager) ValidateChain(ctx context.Context, ts *types.TipSet) error { tschain := []*types.TipSet{ts} for ts.Height() != 0 { - next, err := sm.cs.LoadTipSet(ts.Parents()) + next, err := sm.cs.LoadTipSet(ctx, ts.Parents()) if err != nil { return err } @@ -372,7 +372,7 @@ func (sm *StateManager) VMSys() vm.SyscallBuilder { } func (sm *StateManager) GetRandomnessFromBeacon(ctx context.Context, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte, tsk types.TipSetKey) (abi.Randomness, error) { - pts, err := sm.ChainStore().GetTipSetFromKey(tsk) + pts, err := sm.ChainStore().GetTipSetFromKey(ctx, tsk) if err != nil { return nil, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -391,7 +391,7 @@ func (sm *StateManager) GetRandomnessFromBeacon(ctx context.Context, personaliza } func (sm *StateManager) GetRandomnessFromTickets(ctx context.Context, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte, tsk types.TipSetKey) (abi.Randomness, error) { - pts, err := sm.ChainStore().LoadTipSet(tsk) + pts, err := sm.ChainStore().LoadTipSet(ctx, tsk) if err != nil { return nil, xerrors.Errorf("loading tipset key: %w", err) } diff --git a/chain/stmgr/supply.go b/chain/stmgr/supply.go index c9475a51ec0..0744c02aa02 100644 --- a/chain/stmgr/supply.go +++ b/chain/stmgr/supply.go @@ -31,7 +31,7 @@ import ( // sets up information about the vesting schedule func (sm *StateManager) setupGenesisVestingSchedule(ctx context.Context) error { - gb, err := sm.cs.GetGenesis() + gb, err := sm.cs.GetGenesis(ctx) if err != nil { return xerrors.Errorf("getting genesis block: %w", err) } diff --git a/chain/stmgr/utils.go b/chain/stmgr/utils.go index ce4f601054e..8b0f8daeb73 100644 --- a/chain/stmgr/utils.go +++ b/chain/stmgr/utils.go @@ -155,7 +155,7 @@ func GetLookbackTipSetForRound(ctx context.Context, sm *StateManager, ts *types. } - lbts, err := sm.ChainStore().GetTipSetFromKey(nextTs.Parents()) + lbts, err := sm.ChainStore().GetTipSetFromKey(ctx, nextTs.Parents()) if err != nil { return nil, cid.Undef, xerrors.Errorf("failed to resolve lookback tipset: %w", err) } diff --git a/chain/store/index.go b/chain/store/index.go index 324fb7a633a..f5bbbd4382b 100644 --- a/chain/store/index.go +++ b/chain/store/index.go @@ -31,7 +31,7 @@ type ChainIndex struct { skipLength abi.ChainEpoch } -type loadTipSetFunc func(types.TipSetKey) (*types.TipSet, error) +type loadTipSetFunc func(context.Context, types.TipSetKey) (*types.TipSet, error) func NewChainIndex(lts loadTipSetFunc) *ChainIndex { sc, _ := lru.NewARC(DefaultChainIndexCacheSize) @@ -49,12 +49,12 @@ type lbEntry struct { target types.TipSetKey } -func (ci *ChainIndex) GetTipsetByHeight(_ context.Context, from *types.TipSet, to abi.ChainEpoch) (*types.TipSet, error) { +func (ci *ChainIndex) GetTipsetByHeight(ctx context.Context, from *types.TipSet, to abi.ChainEpoch) (*types.TipSet, error) { if from.Height()-to <= ci.skipLength { - return ci.walkBack(from, to) + return ci.walkBack(ctx, from, to) } - rounded, err := ci.roundDown(from) + rounded, err := ci.roundDown(ctx, from) if err != nil { return nil, err } @@ -63,7 +63,7 @@ func (ci *ChainIndex) GetTipsetByHeight(_ context.Context, from *types.TipSet, t for { cval, ok := ci.skipCache.Get(cur) if !ok { - fc, err := ci.fillCache(cur) + fc, err := ci.fillCache(ctx, cur) if err != nil { return nil, err } @@ -74,19 +74,19 @@ func (ci *ChainIndex) GetTipsetByHeight(_ context.Context, from *types.TipSet, t if lbe.ts.Height() == to || lbe.parentHeight < to { return lbe.ts, nil } else if to > lbe.targetHeight { - return ci.walkBack(lbe.ts, to) + return ci.walkBack(ctx, lbe.ts, to) } cur = lbe.target } } -func (ci *ChainIndex) GetTipsetByHeightWithoutCache(from *types.TipSet, to abi.ChainEpoch) (*types.TipSet, error) { - return ci.walkBack(from, to) +func (ci *ChainIndex) GetTipsetByHeightWithoutCache(ctx context.Context, from *types.TipSet, to abi.ChainEpoch) (*types.TipSet, error) { + return ci.walkBack(ctx, from, to) } -func (ci *ChainIndex) fillCache(tsk types.TipSetKey) (*lbEntry, error) { - ts, err := ci.loadTipSet(tsk) +func (ci *ChainIndex) fillCache(ctx context.Context, tsk types.TipSetKey) (*lbEntry, error) { + ts, err := ci.loadTipSet(ctx, tsk) if err != nil { return nil, err } @@ -101,7 +101,7 @@ func (ci *ChainIndex) fillCache(tsk types.TipSetKey) (*lbEntry, error) { // will either be equal to ts.Height, or at least > ts.Parent.Height() rheight := ci.roundHeight(ts.Height()) - parent, err := ci.loadTipSet(ts.Parents()) + parent, err := ci.loadTipSet(ctx, ts.Parents()) if err != nil { return nil, err } @@ -115,7 +115,7 @@ func (ci *ChainIndex) fillCache(tsk types.TipSetKey) (*lbEntry, error) { if parent.Height() < rheight { skipTarget = parent } else { - skipTarget, err = ci.walkBack(parent, rheight) + skipTarget, err = ci.walkBack(ctx, parent, rheight) if err != nil { return nil, xerrors.Errorf("fillCache walkback: %w", err) } @@ -137,10 +137,10 @@ func (ci *ChainIndex) roundHeight(h abi.ChainEpoch) abi.ChainEpoch { return (h / ci.skipLength) * ci.skipLength } -func (ci *ChainIndex) roundDown(ts *types.TipSet) (*types.TipSet, error) { +func (ci *ChainIndex) roundDown(ctx context.Context, ts *types.TipSet) (*types.TipSet, error) { target := ci.roundHeight(ts.Height()) - rounded, err := ci.walkBack(ts, target) + rounded, err := ci.walkBack(ctx, ts, target) if err != nil { return nil, err } @@ -148,7 +148,7 @@ func (ci *ChainIndex) roundDown(ts *types.TipSet) (*types.TipSet, error) { return rounded, nil } -func (ci *ChainIndex) walkBack(from *types.TipSet, to abi.ChainEpoch) (*types.TipSet, error) { +func (ci *ChainIndex) walkBack(ctx context.Context, from *types.TipSet, to abi.ChainEpoch) (*types.TipSet, error) { if to > from.Height() { return nil, xerrors.Errorf("looking for tipset with height greater than start point") } @@ -160,7 +160,7 @@ func (ci *ChainIndex) walkBack(from *types.TipSet, to abi.ChainEpoch) (*types.Ti ts := from for { - pts, err := ci.loadTipSet(ts.Parents()) + pts, err := ci.loadTipSet(ctx, ts.Parents()) if err != nil { return nil, err } diff --git a/chain/store/messages.go b/chain/store/messages.go index 07ce8345854..6fc4d76b966 100644 --- a/chain/store/messages.go +++ b/chain/store/messages.go @@ -29,7 +29,7 @@ func PutMessage(bs bstore.Blockstore, m storable) (cid.Cid, error) { return cid.Undef, err } - if err := bs.Put(b); err != nil { + if err := bs.Put(context.TODO(), b); err != nil { return cid.Undef, err } @@ -54,7 +54,7 @@ func (cs *ChainStore) GetCMessage(c cid.Cid) (types.ChainMsg, error) { func (cs *ChainStore) GetMessage(c cid.Cid) (*types.Message, error) { var msg *types.Message - err := cs.chainLocalBlockstore.View(c, func(b []byte) (err error) { + err := cs.chainLocalBlockstore.View(context.TODO(), c, func(b []byte) (err error) { msg, err = types.DecodeMessage(b) return err }) @@ -63,7 +63,7 @@ func (cs *ChainStore) GetMessage(c cid.Cid) (*types.Message, error) { func (cs *ChainStore) GetSignedMessage(c cid.Cid) (*types.SignedMessage, error) { var msg *types.SignedMessage - err := cs.chainLocalBlockstore.View(c, func(b []byte) (err error) { + err := cs.chainLocalBlockstore.View(context.TODO(), c, func(b []byte) (err error) { msg, err = types.DecodeSignedMessage(b) return err }) diff --git a/chain/store/snapshot.go b/chain/store/snapshot.go index 1d4ce375857..a3841389ebc 100644 --- a/chain/store/snapshot.go +++ b/chain/store/snapshot.go @@ -30,7 +30,7 @@ func (cs *ChainStore) Export(ctx context.Context, ts *types.TipSet, inclRecentRo unionBs := bstore.Union(cs.stateBlockstore, cs.chainBlockstore) return cs.WalkSnapshot(ctx, ts, inclRecentRoots, skipOldMsgs, true, func(c cid.Cid) error { - blk, err := unionBs.Get(c) + blk, err := unionBs.Get(ctx, c) if err != nil { return xerrors.Errorf("writing object to car, bs.Get: %w", err) } @@ -44,17 +44,18 @@ func (cs *ChainStore) Export(ctx context.Context, ts *types.TipSet, inclRecentRo } func (cs *ChainStore) Import(r io.Reader) (*types.TipSet, error) { + ctx := context.TODO() // TODO: writing only to the state blockstore is incorrect. // At this time, both the state and chain blockstores are backed by the // universal store. When we physically segregate the stores, we will need // to route state objects to the state blockstore, and chain objects to // the chain blockstore. - header, err := car.LoadCar(cs.StateBlockstore(), r) + header, err := car.LoadCar(ctx, cs.StateBlockstore(), r) if err != nil { return nil, xerrors.Errorf("loadcar failed: %w", err) } - root, err := cs.LoadTipSet(types.NewTipSetKey(header.Roots...)) + root, err := cs.LoadTipSet(ctx, types.NewTipSetKey(header.Roots...)) if err != nil { return nil, xerrors.Errorf("failed to load root tipset from chainfile: %w", err) } @@ -82,7 +83,7 @@ func (cs *ChainStore) WalkSnapshot(ctx context.Context, ts *types.TipSet, inclRe return err } - data, err := cs.chainBlockstore.Get(blk) + data, err := cs.chainBlockstore.Get(ctx, blk) if err != nil { return xerrors.Errorf("getting block: %w", err) } @@ -102,7 +103,7 @@ func (cs *ChainStore) WalkSnapshot(ctx context.Context, ts *types.TipSet, inclRe var cids []cid.Cid if !skipOldMsgs || b.Height > ts.Height()-inclRecentRoots { if walked.Visit(b.Messages) { - mcids, err := recurseLinks(cs.chainBlockstore, walked, b.Messages, []cid.Cid{b.Messages}) + mcids, err := recurseLinks(ctx, cs.chainBlockstore, walked, b.Messages, []cid.Cid{b.Messages}) if err != nil { return xerrors.Errorf("recursing messages failed: %w", err) } @@ -123,7 +124,7 @@ func (cs *ChainStore) WalkSnapshot(ctx context.Context, ts *types.TipSet, inclRe if b.Height == 0 || b.Height > ts.Height()-inclRecentRoots { if walked.Visit(b.ParentStateRoot) { - cids, err := recurseLinks(cs.stateBlockstore, walked, b.ParentStateRoot, []cid.Cid{b.ParentStateRoot}) + cids, err := recurseLinks(ctx, cs.stateBlockstore, walked, b.ParentStateRoot, []cid.Cid{b.ParentStateRoot}) if err != nil { return xerrors.Errorf("recursing genesis state failed: %w", err) } @@ -168,12 +169,12 @@ func (cs *ChainStore) WalkSnapshot(ctx context.Context, ts *types.TipSet, inclRe return nil } -func recurseLinks(bs bstore.Blockstore, walked *cid.Set, root cid.Cid, in []cid.Cid) ([]cid.Cid, error) { +func recurseLinks(ctx context.Context, bs bstore.Blockstore, walked *cid.Set, root cid.Cid, in []cid.Cid) ([]cid.Cid, error) { if root.Prefix().Codec != cid.DagCBOR { return in, nil } - data, err := bs.Get(root) + data, err := bs.Get(ctx, root) if err != nil { return nil, xerrors.Errorf("recurse links get (%s) failed: %w", root, err) } @@ -192,7 +193,7 @@ func recurseLinks(bs bstore.Blockstore, walked *cid.Set, root cid.Cid, in []cid. in = append(in, c) var err error - in, err = recurseLinks(bs, walked, c, in) + in, err = recurseLinks(ctx, bs, walked, c, in) if err != nil { rerr = err } diff --git a/chain/store/store.go b/chain/store/store.go index f99c7f64963..a247379448f 100644 --- a/chain/store/store.go +++ b/chain/store/store.go @@ -207,17 +207,17 @@ func (cs *ChainStore) Close() error { return nil } -func (cs *ChainStore) Load() error { - if err := cs.loadHead(); err != nil { +func (cs *ChainStore) Load(ctx context.Context) error { + if err := cs.loadHead(ctx); err != nil { return err } - if err := cs.loadCheckpoint(); err != nil { + if err := cs.loadCheckpoint(ctx); err != nil { return err } return nil } -func (cs *ChainStore) loadHead() error { - head, err := cs.metadataDs.Get(chainHeadKey) +func (cs *ChainStore) loadHead(ctx context.Context) error { + head, err := cs.metadataDs.Get(ctx, chainHeadKey) if err == dstore.ErrNotFound { log.Warn("no previous chain state found") return nil @@ -231,7 +231,7 @@ func (cs *ChainStore) loadHead() error { return xerrors.Errorf("failed to unmarshal stored chain head: %w", err) } - ts, err := cs.LoadTipSet(types.NewTipSetKey(tscids...)) + ts, err := cs.LoadTipSet(ctx, types.NewTipSetKey(tscids...)) if err != nil { return xerrors.Errorf("loading tipset: %w", err) } @@ -241,8 +241,8 @@ func (cs *ChainStore) loadHead() error { return nil } -func (cs *ChainStore) loadCheckpoint() error { - tskBytes, err := cs.metadataDs.Get(checkpointKey) +func (cs *ChainStore) loadCheckpoint(ctx context.Context) error { + tskBytes, err := cs.metadataDs.Get(ctx, checkpointKey) if err == dstore.ErrNotFound { return nil } @@ -256,7 +256,7 @@ func (cs *ChainStore) loadCheckpoint() error { return err } - ts, err := cs.LoadTipSet(tsk) + ts, err := cs.LoadTipSet(ctx, tsk) if err != nil { return xerrors.Errorf("loading tipset: %w", err) } @@ -266,13 +266,13 @@ func (cs *ChainStore) loadCheckpoint() error { return nil } -func (cs *ChainStore) writeHead(ts *types.TipSet) error { +func (cs *ChainStore) writeHead(ctx context.Context, ts *types.TipSet) error { data, err := json.Marshal(ts.Cids()) if err != nil { return xerrors.Errorf("failed to marshal tipset: %w", err) } - if err := cs.metadataDs.Put(chainHeadKey, data); err != nil { + if err := cs.metadataDs.Put(ctx, chainHeadKey, data); err != nil { return xerrors.Errorf("failed to write chain head to datastore: %w", err) } @@ -341,13 +341,13 @@ func (cs *ChainStore) SubscribeHeadChanges(f ReorgNotifee) { func (cs *ChainStore) IsBlockValidated(ctx context.Context, blkid cid.Cid) (bool, error) { key := blockValidationCacheKeyPrefix.Instance(blkid.String()) - return cs.metadataDs.Has(key) + return cs.metadataDs.Has(ctx, key) } func (cs *ChainStore) MarkBlockAsValidated(ctx context.Context, blkid cid.Cid) error { key := blockValidationCacheKeyPrefix.Instance(blkid.String()) - if err := cs.metadataDs.Put(key, []byte{0}); err != nil { + if err := cs.metadataDs.Put(ctx, key, []byte{0}); err != nil { return xerrors.Errorf("cache block validation: %w", err) } @@ -357,34 +357,34 @@ func (cs *ChainStore) MarkBlockAsValidated(ctx context.Context, blkid cid.Cid) e func (cs *ChainStore) UnmarkBlockAsValidated(ctx context.Context, blkid cid.Cid) error { key := blockValidationCacheKeyPrefix.Instance(blkid.String()) - if err := cs.metadataDs.Delete(key); err != nil { + if err := cs.metadataDs.Delete(ctx, key); err != nil { return xerrors.Errorf("removing from valid block cache: %w", err) } return nil } -func (cs *ChainStore) SetGenesis(b *types.BlockHeader) error { +func (cs *ChainStore) SetGenesis(ctx context.Context, b *types.BlockHeader) error { ts, err := types.NewTipSet([]*types.BlockHeader{b}) if err != nil { return err } - if err := cs.PutTipSet(context.TODO(), ts); err != nil { + if err := cs.PutTipSet(ctx, ts); err != nil { return err } - return cs.metadataDs.Put(dstore.NewKey("0"), b.Cid().Bytes()) + return cs.metadataDs.Put(ctx, dstore.NewKey("0"), b.Cid().Bytes()) } func (cs *ChainStore) PutTipSet(ctx context.Context, ts *types.TipSet) error { for _, b := range ts.Blocks() { - if err := cs.PersistBlockHeaders(b); err != nil { + if err := cs.PersistBlockHeaders(ctx, b); err != nil { return err } } - expanded, err := cs.expandTipset(ts.Blocks()[0]) + expanded, err := cs.expandTipset(ctx, ts.Blocks()[0]) if err != nil { return xerrors.Errorf("errored while expanding tipset: %w", err) } @@ -435,7 +435,7 @@ func (cs *ChainStore) MaybeTakeHeavierTipSet(ctx context.Context, ts *types.TipS // difference between 'bootstrap sync' and 'caught up' sync, we need // some other heuristic. - exceeds, err := cs.exceedsForkLength(cs.heaviest, ts) + exceeds, err := cs.exceedsForkLength(ctx, cs.heaviest, ts) if err != nil { return err } @@ -458,7 +458,7 @@ func (cs *ChainStore) MaybeTakeHeavierTipSet(ctx context.Context, ts *types.TipS // 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. -func (cs *ChainStore) exceedsForkLength(synced, external *types.TipSet) (bool, error) { +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 // `MaybeTakeHeavierTipSet` logic (instead of each of the called @@ -482,7 +482,7 @@ func (cs *ChainStore) exceedsForkLength(synced, external *types.TipSet) (bool, e // length). return true, nil } - external, err = cs.LoadTipSet(external.Parents()) + external, err = cs.LoadTipSet(ctx, external.Parents()) if err != nil { return false, xerrors.Errorf("failed to load parent tipset in external chain: %w", err) } @@ -505,7 +505,7 @@ func (cs *ChainStore) exceedsForkLength(synced, external *types.TipSet) (bool, e // there is no common ancestor. return true, nil } - synced, err = cs.LoadTipSet(synced.Parents()) + synced, err = cs.LoadTipSet(ctx, synced.Parents()) if err != nil { return false, xerrors.Errorf("failed to load parent tipset in synced chain: %w", err) } @@ -521,17 +521,17 @@ func (cs *ChainStore) exceedsForkLength(synced, external *types.TipSet) (bool, e // CAUTION: Use it only for testing, such as to teleport the chain to a // particular tipset to carry out a benchmark, verification, etc. on a chain // segment. -func (cs *ChainStore) ForceHeadSilent(_ context.Context, ts *types.TipSet) error { +func (cs *ChainStore) ForceHeadSilent(ctx context.Context, ts *types.TipSet) error { log.Warnf("(!!!) forcing a new head silently; new head: %s", ts) cs.heaviestLk.Lock() defer cs.heaviestLk.Unlock() - if err := cs.removeCheckpoint(); err != nil { + if err := cs.removeCheckpoint(ctx); err != nil { return err } cs.heaviest = ts - err := cs.writeHead(ts) + err := cs.writeHead(ctx, ts) if err != nil { err = xerrors.Errorf("failed to write chain head: %s", err) } @@ -561,7 +561,7 @@ func (cs *ChainStore) reorgWorker(ctx context.Context, initialNotifees []ReorgNo notifees = append(notifees, n) case r := <-out: - revert, apply, err := cs.ReorgOps(r.old, r.new) + revert, apply, err := cs.ReorgOps(ctx, r.old, r.new) if err != nil { log.Error("computing reorg ops failed: ", err) continue @@ -646,7 +646,7 @@ func (cs *ChainStore) takeHeaviestTipSet(ctx context.Context, ts *types.TipSet) log.Infof("New heaviest tipset! %s (height=%d)", ts.Cids(), ts.Height()) cs.heaviest = ts - if err := cs.writeHead(ts); err != nil { + if err := cs.writeHead(ctx, ts); err != nil { log.Errorf("failed to write chain head: %s", err) return nil } @@ -656,14 +656,14 @@ func (cs *ChainStore) takeHeaviestTipSet(ctx context.Context, ts *types.TipSet) // FlushValidationCache removes all results of block validation from the // chain metadata store. Usually the first step after a new chain import. -func (cs *ChainStore) FlushValidationCache() error { - return FlushValidationCache(cs.metadataDs) +func (cs *ChainStore) FlushValidationCache(ctx context.Context) error { + return FlushValidationCache(ctx, cs.metadataDs) } -func FlushValidationCache(ds dstore.Batching) error { +func FlushValidationCache(ctx context.Context, ds dstore.Batching) error { log.Infof("clearing block validation cache...") - dsWalk, err := ds.Query(query.Query{ + dsWalk, err := ds.Query(ctx, query.Query{ // Potential TODO: the validation cache is not a namespace on its own // but is rather constructed as prefixed-key `foo:bar` via .Instance(), which // in turn does not work with the filter, which can match only on `foo/bar` @@ -683,7 +683,7 @@ func FlushValidationCache(ds dstore.Batching) error { return xerrors.Errorf("failed to run key listing query: %w", err) } - batch, err := ds.Batch() + batch, err := ds.Batch(ctx) if err != nil { return xerrors.Errorf("failed to open a DS batch: %w", err) } @@ -692,11 +692,11 @@ func FlushValidationCache(ds dstore.Batching) error { for _, k := range allKeys { if strings.HasPrefix(k.Key, blockValidationCacheKeyPrefix.String()) { delCnt++ - batch.Delete(dstore.RawKey(k.Key)) // nolint:errcheck + batch.Delete(ctx, dstore.RawKey(k.Key)) // nolint:errcheck } } - if err := batch.Commit(); err != nil { + if err := batch.Commit(ctx); err != nil { return xerrors.Errorf("failed to commit the DS batch: %w", err) } @@ -709,24 +709,24 @@ func FlushValidationCache(ds dstore.Batching) error { // This should only be called if something is broken and needs fixing. // // This function will bypass and remove any checkpoints. -func (cs *ChainStore) SetHead(ts *types.TipSet) error { +func (cs *ChainStore) SetHead(ctx context.Context, ts *types.TipSet) error { cs.heaviestLk.Lock() defer cs.heaviestLk.Unlock() - if err := cs.removeCheckpoint(); err != nil { + if err := cs.removeCheckpoint(ctx); err != nil { return err } return cs.takeHeaviestTipSet(context.TODO(), ts) } // RemoveCheckpoint removes the current checkpoint. -func (cs *ChainStore) RemoveCheckpoint() error { +func (cs *ChainStore) RemoveCheckpoint(ctx context.Context) error { cs.heaviestLk.Lock() defer cs.heaviestLk.Unlock() - return cs.removeCheckpoint() + return cs.removeCheckpoint(ctx) } -func (cs *ChainStore) removeCheckpoint() error { - if err := cs.metadataDs.Delete(checkpointKey); err != nil { +func (cs *ChainStore) removeCheckpoint(ctx context.Context) error { + if err := cs.metadataDs.Delete(ctx, checkpointKey); err != nil { return err } cs.checkpoint = nil @@ -736,7 +736,7 @@ func (cs *ChainStore) removeCheckpoint() error { // SetCheckpoint will set a checkpoint past which the chainstore will not allow forks. // // NOTE: Checkpoints cannot be set beyond ForkLengthThreshold epochs in the past. -func (cs *ChainStore) SetCheckpoint(ts *types.TipSet) error { +func (cs *ChainStore) SetCheckpoint(ctx context.Context, ts *types.TipSet) error { tskBytes, err := json.Marshal(ts.Key()) if err != nil { return err @@ -755,7 +755,7 @@ func (cs *ChainStore) SetCheckpoint(ts *types.TipSet) error { } if !ts.Equals(cs.heaviest) { - anc, err := cs.IsAncestorOf(ts, cs.heaviest) + anc, err := cs.IsAncestorOf(ctx, ts, cs.heaviest) if err != nil { return xerrors.Errorf("cannot determine whether checkpoint tipset is in main-chain: %w", err) } @@ -764,7 +764,7 @@ func (cs *ChainStore) SetCheckpoint(ts *types.TipSet) error { return xerrors.Errorf("cannot mark tipset as checkpoint, since it isn't in the main-chain: %w", err) } } - err = cs.metadataDs.Put(checkpointKey, tskBytes) + err = cs.metadataDs.Put(ctx, checkpointKey, tskBytes) if err != nil { return err } @@ -781,9 +781,9 @@ func (cs *ChainStore) GetCheckpoint() *types.TipSet { } // Contains returns whether our BlockStore has all blocks in the supplied TipSet. -func (cs *ChainStore) Contains(ts *types.TipSet) (bool, error) { +func (cs *ChainStore) Contains(ctx context.Context, ts *types.TipSet) (bool, error) { for _, c := range ts.Cids() { - has, err := cs.chainBlockstore.Has(c) + has, err := cs.chainBlockstore.Has(ctx, c) if err != nil { return false, err } @@ -797,16 +797,16 @@ func (cs *ChainStore) Contains(ts *types.TipSet) (bool, error) { // GetBlock fetches a BlockHeader with the supplied CID. It returns // blockstore.ErrNotFound if the block was not found in the BlockStore. -func (cs *ChainStore) GetBlock(c cid.Cid) (*types.BlockHeader, error) { +func (cs *ChainStore) GetBlock(ctx context.Context, c cid.Cid) (*types.BlockHeader, error) { var blk *types.BlockHeader - err := cs.chainLocalBlockstore.View(c, func(b []byte) (err error) { + err := cs.chainLocalBlockstore.View(ctx, c, func(b []byte) (err error) { blk, err = types.DecodeBlock(b) return err }) return blk, err } -func (cs *ChainStore) LoadTipSet(tsk types.TipSetKey) (*types.TipSet, error) { +func (cs *ChainStore) LoadTipSet(ctx context.Context, tsk types.TipSetKey) (*types.TipSet, error) { v, ok := cs.tsCache.Get(tsk) if ok { return v.(*types.TipSet), nil @@ -819,7 +819,7 @@ func (cs *ChainStore) LoadTipSet(tsk types.TipSetKey) (*types.TipSet, error) { for i, c := range cids { i, c := i, c eg.Go(func() error { - b, err := cs.GetBlock(c) + b, err := cs.GetBlock(ctx, c) if err != nil { return xerrors.Errorf("get block %s: %w", c, err) } @@ -844,14 +844,14 @@ func (cs *ChainStore) LoadTipSet(tsk types.TipSetKey) (*types.TipSet, error) { } // IsAncestorOf returns true if 'a' is an ancestor of 'b' -func (cs *ChainStore) IsAncestorOf(a, b *types.TipSet) (bool, error) { +func (cs *ChainStore) IsAncestorOf(ctx context.Context, a, b *types.TipSet) (bool, error) { if b.Height() <= a.Height() { return false, nil } cur := b for !a.Equals(cur) && cur.Height() > a.Height() { - next, err := cs.LoadTipSet(cur.Parents()) + next, err := cs.LoadTipSet(ctx, cur.Parents()) if err != nil { return false, err } @@ -862,13 +862,13 @@ func (cs *ChainStore) IsAncestorOf(a, b *types.TipSet) (bool, error) { return cur.Equals(a), nil } -func (cs *ChainStore) NearestCommonAncestor(a, b *types.TipSet) (*types.TipSet, error) { - l, _, err := cs.ReorgOps(a, b) +func (cs *ChainStore) NearestCommonAncestor(ctx context.Context, a, b *types.TipSet) (*types.TipSet, error) { + l, _, err := cs.ReorgOps(ctx, a, b) if err != nil { return nil, err } - return cs.LoadTipSet(l[len(l)-1].Parents()) + return cs.LoadTipSet(ctx, l[len(l)-1].Parents()) } // ReorgOps takes two tipsets (which can be at different heights), and walks @@ -879,11 +879,11 @@ func (cs *ChainStore) NearestCommonAncestor(a, b *types.TipSet) (*types.TipSet, // ancestor. // // If an error happens along the way, we return the error with nil slices. -func (cs *ChainStore) ReorgOps(a, b *types.TipSet) ([]*types.TipSet, []*types.TipSet, error) { - return ReorgOps(cs.LoadTipSet, a, b) +func (cs *ChainStore) ReorgOps(ctx context.Context, a, b *types.TipSet) ([]*types.TipSet, []*types.TipSet, error) { + return ReorgOps(ctx, cs.LoadTipSet, a, b) } -func ReorgOps(lts func(types.TipSetKey) (*types.TipSet, error), a, b *types.TipSet) ([]*types.TipSet, []*types.TipSet, error) { +func ReorgOps(ctx context.Context, lts func(ctx context.Context, _ types.TipSetKey) (*types.TipSet, error), a, b *types.TipSet) ([]*types.TipSet, []*types.TipSet, error) { left := a right := b @@ -891,7 +891,7 @@ func ReorgOps(lts func(types.TipSetKey) (*types.TipSet, error), a, b *types.TipS for !left.Equals(right) { if left.Height() > right.Height() { leftChain = append(leftChain, left) - par, err := lts(left.Parents()) + par, err := lts(ctx, left.Parents()) if err != nil { return nil, nil, err } @@ -899,7 +899,7 @@ func ReorgOps(lts func(types.TipSetKey) (*types.TipSet, error), a, b *types.TipS left = par } else { rightChain = append(rightChain, right) - par, err := lts(right.Parents()) + par, err := lts(ctx, right.Parents()) if err != nil { log.Infof("failed to fetch right.Parents: %s", err) return nil, nil, err @@ -921,7 +921,7 @@ func (cs *ChainStore) GetHeaviestTipSet() (ts *types.TipSet) { return } -func (cs *ChainStore) AddToTipSetTracker(b *types.BlockHeader) error { +func (cs *ChainStore) AddToTipSetTracker(ctx context.Context, b *types.BlockHeader) error { cs.tstLk.Lock() defer cs.tstLk.Unlock() @@ -931,7 +931,7 @@ func (cs *ChainStore) AddToTipSetTracker(b *types.BlockHeader) error { log.Debug("tried to add block to tipset tracker that was already there") return nil } - h, err := cs.GetBlock(oc) + h, err := cs.GetBlock(ctx, oc) if err == nil && h != nil { if h.Miner == b.Miner { log.Warnf("Have multiple blocks from miner %s at height %d in our tipset cache %s-%s", b.Miner, b.Height, b.Cid(), h.Cid()) @@ -960,7 +960,7 @@ func (cs *ChainStore) AddToTipSetTracker(b *types.BlockHeader) error { return nil } -func (cs *ChainStore) PersistBlockHeaders(b ...*types.BlockHeader) error { +func (cs *ChainStore) PersistBlockHeaders(ctx context.Context, b ...*types.BlockHeader) error { sbs := make([]block.Block, len(b)) for i, header := range b { @@ -982,13 +982,13 @@ func (cs *ChainStore) PersistBlockHeaders(b ...*types.BlockHeader) error { end = len(b) } - err = multierr.Append(err, cs.chainLocalBlockstore.PutMany(sbs[start:end])) + err = multierr.Append(err, cs.chainLocalBlockstore.PutMany(ctx, sbs[start:end])) } return err } -func (cs *ChainStore) expandTipset(b *types.BlockHeader) (*types.TipSet, error) { +func (cs *ChainStore) expandTipset(ctx context.Context, b *types.BlockHeader) (*types.TipSet, error) { // Hold lock for the whole function for now, if it becomes a problem we can // fix pretty easily cs.tstLk.Lock() @@ -1007,7 +1007,7 @@ func (cs *ChainStore) expandTipset(b *types.BlockHeader) (*types.TipSet, error) continue } - h, err := cs.GetBlock(bhc) + h, err := cs.GetBlock(ctx, bhc) if err != nil { return nil, xerrors.Errorf("failed to load block (%s) for tipset expansion: %w", bhc, err) } @@ -1029,11 +1029,11 @@ func (cs *ChainStore) expandTipset(b *types.BlockHeader) (*types.TipSet, error) } func (cs *ChainStore) AddBlock(ctx context.Context, b *types.BlockHeader) error { - if err := cs.PersistBlockHeaders(b); err != nil { + if err := cs.PersistBlockHeaders(ctx, b); err != nil { return err } - ts, err := cs.expandTipset(b) + ts, err := cs.expandTipset(ctx, b) if err != nil { return err } @@ -1045,8 +1045,8 @@ func (cs *ChainStore) AddBlock(ctx context.Context, b *types.BlockHeader) error return nil } -func (cs *ChainStore) GetGenesis() (*types.BlockHeader, error) { - data, err := cs.metadataDs.Get(dstore.NewKey("0")) +func (cs *ChainStore) GetGenesis(ctx context.Context) (*types.BlockHeader, error) { + data, err := cs.metadataDs.Get(ctx, dstore.NewKey("0")) if err != nil { return nil, err } @@ -1056,22 +1056,22 @@ func (cs *ChainStore) GetGenesis() (*types.BlockHeader, error) { return nil, err } - return cs.GetBlock(c) + return cs.GetBlock(ctx, c) } // GetPath returns the sequence of atomic head change operations that // need to be applied in order to switch the head of the chain from the `from` // tipset to the `to` tipset. func (cs *ChainStore) GetPath(ctx context.Context, from types.TipSetKey, to types.TipSetKey) ([]*api.HeadChange, error) { - fts, err := cs.LoadTipSet(from) + fts, err := cs.LoadTipSet(ctx, from) if err != nil { return nil, xerrors.Errorf("loading from tipset %s: %w", from, err) } - tts, err := cs.LoadTipSet(to) + tts, err := cs.LoadTipSet(ctx, to) if err != nil { return nil, xerrors.Errorf("loading to tipset %s: %w", to, err) } - revert, apply, err := cs.ReorgOps(fts, tts) + revert, apply, err := cs.ReorgOps(ctx, fts, tts) if err != nil { return nil, xerrors.Errorf("error getting tipset branches: %w", err) } @@ -1154,7 +1154,7 @@ func (cs *ChainStore) GetTipsetByHeight(ctx context.Context, h abi.ChainEpoch, t if lbts.Height() < h { log.Warnf("chain index returned the wrong tipset at height %d, using slow retrieval", h) - lbts, err = cs.cindex.GetTipsetByHeightWithoutCache(ts, h) + lbts, err = cs.cindex.GetTipsetByHeightWithoutCache(ctx, ts, h) if err != nil { return nil, err } @@ -1164,7 +1164,7 @@ func (cs *ChainStore) GetTipsetByHeight(ctx context.Context, h abi.ChainEpoch, t return lbts, nil } - return cs.LoadTipSet(lbts.Parents()) + return cs.LoadTipSet(ctx, lbts.Parents()) } func (cs *ChainStore) Weight(ctx context.Context, hts *types.TipSet) (types.BigInt, error) { // todo remove @@ -1190,14 +1190,14 @@ func breakWeightTie(ts1, ts2 *types.TipSet) bool { return false } -func (cs *ChainStore) GetTipSetFromKey(tsk types.TipSetKey) (*types.TipSet, error) { +func (cs *ChainStore) GetTipSetFromKey(ctx context.Context, tsk types.TipSetKey) (*types.TipSet, error) { if tsk.IsEmpty() { return cs.GetHeaviestTipSet(), nil } - return cs.LoadTipSet(tsk) + return cs.LoadTipSet(ctx, tsk) } -func (cs *ChainStore) GetLatestBeaconEntry(ts *types.TipSet) (*types.BeaconEntry, error) { +func (cs *ChainStore) GetLatestBeaconEntry(ctx context.Context, ts *types.TipSet) (*types.BeaconEntry, error) { cur := ts for i := 0; i < 20; i++ { cbe := cur.Blocks()[0].BeaconEntries @@ -1209,7 +1209,7 @@ func (cs *ChainStore) GetLatestBeaconEntry(ts *types.TipSet) (*types.BeaconEntry return nil, xerrors.Errorf("made it back to genesis block without finding beacon entry") } - next, err := cs.LoadTipSet(cur.Parents()) + next, err := cs.LoadTipSet(ctx, cur.Parents()) if err != nil { return nil, xerrors.Errorf("failed to load parents when searching back for latest beacon entry: %w", err) } diff --git a/chain/sync.go b/chain/sync.go index 34867b136f5..f6824c389f9 100644 --- a/chain/sync.go +++ b/chain/sync.go @@ -119,8 +119,8 @@ type SyncManagerCtor func(syncFn SyncFunc) SyncManager type Genesis *types.TipSet -func LoadGenesis(sm *stmgr.StateManager) (Genesis, error) { - gen, err := sm.ChainStore().GetGenesis() +func LoadGenesis(ctx context.Context, sm *stmgr.StateManager) (Genesis, error) { + gen, err := sm.ChainStore().GetGenesis(ctx) if err != nil { return nil, xerrors.Errorf("getting genesis block: %w", err) } @@ -227,7 +227,7 @@ func (syncer *Syncer) InformNewHead(from peer.ID, fts *store.FullTipSet) bool { // TODO: IMPORTANT(GARBAGE) this needs to be put in the 'temporary' side of // the blockstore - if err := syncer.store.PersistBlockHeaders(fts.TipSet().Blocks()...); err != nil { + if err := syncer.store.PersistBlockHeaders(ctx, fts.TipSet().Blocks()...); err != nil { log.Warn("failed to persist incoming block header: ", err) return false } @@ -360,7 +360,7 @@ func copyBlockstore(ctx context.Context, from, to bstore.Blockstore) error { // TODO: should probably expose better methods on the blockstore for this operation var blks []blocks.Block for c := range cids { - b, err := from.Get(c) + b, err := from.Get(ctx, c) if err != nil { return err } @@ -368,7 +368,7 @@ func copyBlockstore(ctx context.Context, from, to bstore.Blockstore) error { blks = append(blks, b) } - if err := to.PutMany(blks); err != nil { + if err := to.PutMany(ctx, blks); err != nil { return err } @@ -463,7 +463,7 @@ func computeMsgMeta(bs cbor.IpldStore, bmsgCids, smsgCids []cid.Cid) (cid.Cid, e // {hint/usage} This is used from the HELLO protocol, to fetch the greeting // peer's heaviest tipset if we don't have it. func (syncer *Syncer) FetchTipSet(ctx context.Context, p peer.ID, tsk types.TipSetKey) (*store.FullTipSet, error) { - if fts, err := syncer.tryLoadFullTipSet(tsk); err == nil { + if fts, err := syncer.tryLoadFullTipSet(ctx, tsk); err == nil { return fts, nil } @@ -474,8 +474,8 @@ func (syncer *Syncer) FetchTipSet(ctx context.Context, p peer.ID, tsk types.TipS // tryLoadFullTipSet queries the tipset in the ChainStore, and returns a full // representation of it containing FullBlocks. If ALL blocks are not found // locally, it errors entirely with blockstore.ErrNotFound. -func (syncer *Syncer) tryLoadFullTipSet(tsk types.TipSetKey) (*store.FullTipSet, error) { - ts, err := syncer.store.LoadTipSet(tsk) +func (syncer *Syncer) tryLoadFullTipSet(ctx context.Context, tsk types.TipSetKey) (*store.FullTipSet, error) { + ts, err := syncer.store.LoadTipSet(ctx, tsk) if err != nil { return nil, err } @@ -583,7 +583,7 @@ func (syncer *Syncer) ValidateTipSet(ctx context.Context, fts *store.FullTipSet, return xerrors.Errorf("validating block %s: %w", b.Cid(), err) } - if err := syncer.sm.ChainStore().AddToTipSetTracker(b.Header); err != nil { + if err := syncer.sm.ChainStore().AddToTipSetTracker(ctx, b.Header); err != nil { return xerrors.Errorf("failed to add validated header to tipset tracker: %w", err) } return nil @@ -755,7 +755,7 @@ loop: } // If, for some reason, we have a suffix of the chain locally, handle that here - ts, err := syncer.store.LoadTipSet(at) + ts, err := syncer.store.LoadTipSet(ctx, at) if err == nil { acceptedBlocks = append(acceptedBlocks, at.Cids()...) @@ -838,7 +838,7 @@ loop: return blockSet, nil } - knownParent, err := syncer.store.LoadTipSet(known.Parents()) + knownParent, err := syncer.store.LoadTipSet(ctx, known.Parents()) if err != nil { return nil, xerrors.Errorf("failed to load next local tipset: %w", err) } @@ -892,7 +892,7 @@ func (syncer *Syncer) syncFork(ctx context.Context, incoming *types.TipSet, know return nil, err } - nts, err := syncer.store.LoadTipSet(known.Parents()) + nts, err := syncer.store.LoadTipSet(ctx, known.Parents()) if err != nil { return nil, xerrors.Errorf("failed to load next local tipset: %w", err) } @@ -928,7 +928,7 @@ func (syncer *Syncer) syncFork(ctx context.Context, incoming *types.TipSet, know return nil, ErrForkCheckpoint } - nts, err = syncer.store.LoadTipSet(nts.Parents()) + nts, err = syncer.store.LoadTipSet(ctx, nts.Parents()) if err != nil { return nil, xerrors.Errorf("loading next local tipset: %w", err) } @@ -1201,7 +1201,7 @@ func (syncer *Syncer) collectChain(ctx context.Context, ts *types.TipSet, hts *t for _, ts := range headers { toPersist = append(toPersist, ts.Blocks()...) } - if err := syncer.store.PersistBlockHeaders(toPersist...); err != nil { + if err := syncer.store.PersistBlockHeaders(ctx, toPersist...); err != nil { err = xerrors.Errorf("failed to persist synced blocks to the chainstore: %w", err) ss.Error(err) return err @@ -1245,7 +1245,7 @@ func (syncer *Syncer) CheckBadBlockCache(blk cid.Cid) (string, bool) { return bbr.String(), ok } -func (syncer *Syncer) getLatestBeaconEntry(_ context.Context, ts *types.TipSet) (*types.BeaconEntry, error) { +func (syncer *Syncer) getLatestBeaconEntry(ctx context.Context, ts *types.TipSet) (*types.BeaconEntry, error) { cur := ts for i := 0; i < 20; i++ { cbe := cur.Blocks()[0].BeaconEntries @@ -1257,7 +1257,7 @@ func (syncer *Syncer) getLatestBeaconEntry(_ context.Context, ts *types.TipSet) return nil, xerrors.Errorf("made it back to genesis block without finding beacon entry") } - next, err := syncer.store.LoadTipSet(cur.Parents()) + next, err := syncer.store.LoadTipSet(ctx, cur.Parents()) if err != nil { return nil, xerrors.Errorf("failed to load parents when searching back for latest beacon entry: %w", err) } diff --git a/chain/vm/vm.go b/chain/vm/vm.go index 36308fe03f6..5e6291849d4 100644 --- a/chain/vm/vm.go +++ b/chain/vm/vm.go @@ -82,10 +82,10 @@ type gasChargingBlocks struct { under cbor.IpldBlockstore } -func (bs *gasChargingBlocks) View(c cid.Cid, cb func([]byte) error) error { +func (bs *gasChargingBlocks) View(ctx context.Context, c cid.Cid, cb func([]byte) error) error { if v, ok := bs.under.(blockstore.Viewer); ok { bs.chargeGas(bs.pricelist.OnIpldGet()) - return v.View(c, func(b []byte) error { + return v.View(ctx, c, func(b []byte) error { // we have successfully retrieved the value; charge for it, even if the user-provided function fails. bs.chargeGas(newGasCharge("OnIpldViewEnd", 0, 0).WithExtra(len(b))) bs.chargeGas(gasOnActorExec) @@ -93,16 +93,16 @@ func (bs *gasChargingBlocks) View(c cid.Cid, cb func([]byte) error) error { }) } // the underlying blockstore doesn't implement the viewer interface, fall back to normal Get behaviour. - blk, err := bs.Get(c) + blk, err := bs.Get(ctx, c) if err == nil && blk != nil { return cb(blk.RawData()) } return err } -func (bs *gasChargingBlocks) Get(c cid.Cid) (block.Block, error) { +func (bs *gasChargingBlocks) Get(ctx context.Context, c cid.Cid) (block.Block, error) { bs.chargeGas(bs.pricelist.OnIpldGet()) - blk, err := bs.under.Get(c) + blk, err := bs.under.Get(ctx, c) if err != nil { return nil, aerrors.Escalate(err, "failed to get block from blockstore") } @@ -112,10 +112,10 @@ func (bs *gasChargingBlocks) Get(c cid.Cid) (block.Block, error) { return blk, nil } -func (bs *gasChargingBlocks) Put(blk block.Block) error { +func (bs *gasChargingBlocks) Put(ctx context.Context, blk block.Block) error { bs.chargeGas(bs.pricelist.OnIpldPut(len(blk.RawData()))) - if err := bs.under.Put(blk); err != nil { + if err := bs.under.Put(ctx, blk); err != nil { return aerrors.Escalate(err, "failed to write data to disk") } bs.chargeGas(gasOnActorExec) @@ -706,7 +706,7 @@ func Copy(ctx context.Context, from, to blockstore.Blockstore, root cid.Cid) err go func() { for b := range toFlush { - if err := to.PutMany(b); err != nil { + if err := to.PutMany(ctx, b); err != nil { close(freeBufs) errFlushChan <- xerrors.Errorf("batch put in copy: %w", err) return @@ -735,7 +735,7 @@ func Copy(ctx context.Context, from, to blockstore.Blockstore, root cid.Cid) err return nil } - if err := copyRec(from, to, root, batchCp); err != nil { + if err := copyRec(ctx, from, to, root, batchCp); err != nil { return xerrors.Errorf("copyRec: %w", err) } @@ -760,13 +760,13 @@ func Copy(ctx context.Context, from, to blockstore.Blockstore, root cid.Cid) err return nil } -func copyRec(from, to blockstore.Blockstore, root cid.Cid, cp func(block.Block) error) error { +func copyRec(ctx context.Context, from, to blockstore.Blockstore, root cid.Cid, cp func(block.Block) error) error { if root.Prefix().MhType == 0 { // identity cid, skip return nil } - blk, err := from.Get(root) + blk, err := from.Get(ctx, root) if err != nil { return xerrors.Errorf("get %s failed: %w", root, err) } @@ -791,7 +791,7 @@ func copyRec(from, to blockstore.Blockstore, root cid.Cid, cp func(block.Block) } } else { // If we have an object, we already have its children, skip the object. - has, err := to.Has(link) + has, err := to.Has(ctx, link) if err != nil { lerr = xerrors.Errorf("has: %w", err) return @@ -801,7 +801,7 @@ func copyRec(from, to blockstore.Blockstore, root cid.Cid, cp func(block.Block) } } - if err := copyRec(from, to, link, cp); err != nil { + if err := copyRec(ctx, from, to, link, cp); err != nil { lerr = err return } diff --git a/chain/wallet/ledger/ledger.go b/chain/wallet/ledger/ledger.go index eb16f646036..5279389de81 100644 --- a/chain/wallet/ledger/ledger.go +++ b/chain/wallet/ledger/ledger.go @@ -39,7 +39,7 @@ type LedgerKeyInfo struct { var _ api.Wallet = (*LedgerWallet)(nil) func (lw LedgerWallet) WalletSign(ctx context.Context, signer address.Address, toSign []byte, meta api.MsgMeta) (*crypto.Signature, error) { - ki, err := lw.getKeyInfo(signer) + ki, err := lw.getKeyInfo(ctx, signer) if err != nil { return nil, err } @@ -80,8 +80,8 @@ func (lw LedgerWallet) WalletSign(ctx context.Context, signer address.Address, t }, nil } -func (lw LedgerWallet) getKeyInfo(addr address.Address) (*LedgerKeyInfo, error) { - kib, err := lw.ds.Get(keyForAddr(addr)) +func (lw LedgerWallet) getKeyInfo(ctx context.Context, addr address.Address) (*LedgerKeyInfo, error) { + kib, err := lw.ds.Get(ctx, keyForAddr(addr)) if err != nil { return nil, err } @@ -95,7 +95,7 @@ func (lw LedgerWallet) getKeyInfo(addr address.Address) (*LedgerKeyInfo, error) } func (lw LedgerWallet) WalletDelete(ctx context.Context, k address.Address) error { - return lw.ds.Delete(keyForAddr(k)) + return lw.ds.Delete(ctx, keyForAddr(k)) } func (lw LedgerWallet) WalletExport(ctx context.Context, k address.Address) (*types.KeyInfo, error) { @@ -103,7 +103,7 @@ func (lw LedgerWallet) WalletExport(ctx context.Context, k address.Address) (*ty } func (lw LedgerWallet) WalletHas(ctx context.Context, k address.Address) (bool, error) { - _, err := lw.ds.Get(keyForAddr(k)) + _, err := lw.ds.Get(ctx, keyForAddr(k)) if err == nil { return true, nil } @@ -118,10 +118,10 @@ func (lw LedgerWallet) WalletImport(ctx context.Context, kinfo *types.KeyInfo) ( if err := json.Unmarshal(kinfo.PrivateKey, &ki); err != nil { return address.Undef, err } - return lw.importKey(ki) + return lw.importKey(ctx, ki) } -func (lw LedgerWallet) importKey(ki LedgerKeyInfo) (address.Address, error) { +func (lw LedgerWallet) importKey(ctx context.Context, ki LedgerKeyInfo) (address.Address, error) { if ki.Address == address.Undef { return address.Undef, fmt.Errorf("no address given in imported key info") } @@ -133,7 +133,7 @@ func (lw LedgerWallet) importKey(ki LedgerKeyInfo) (address.Address, error) { return address.Undef, xerrors.Errorf("marshaling key info: %w", err) } - if err := lw.ds.Put(keyForAddr(ki.Address), bb); err != nil { + if err := lw.ds.Put(ctx, keyForAddr(ki.Address), bb); err != nil { return address.Undef, err } @@ -141,7 +141,7 @@ func (lw LedgerWallet) importKey(ki LedgerKeyInfo) (address.Address, error) { } func (lw LedgerWallet) WalletList(ctx context.Context) ([]address.Address, error) { - res, err := lw.ds.Query(query.Query{Prefix: dsLedgerPrefix}) + res, err := lw.ds.Query(ctx, query.Query{Prefix: dsLedgerPrefix}) if err != nil { return nil, err } @@ -175,7 +175,7 @@ func (lw LedgerWallet) WalletNew(ctx context.Context, t types.KeyType) (address. t, types.KTSecp256k1Ledger) } - res, err := lw.ds.Query(query.Query{Prefix: dsLedgerPrefix}) + res, err := lw.ds.Query(ctx, query.Query{Prefix: dsLedgerPrefix}) if err != nil { return address.Undef, err } @@ -224,7 +224,7 @@ func (lw LedgerWallet) WalletNew(ctx context.Context, t types.KeyType) (address. lki.Address = a lki.Path = path - return lw.importKey(lki) + return lw.importKey(ctx, lki) } func (lw *LedgerWallet) Get() api.Wallet { diff --git a/cli/backup.go b/cli/backup.go index 856e098dd36..4d88d4bbc0b 100644 --- a/cli/backup.go +++ b/cli/backup.go @@ -66,7 +66,7 @@ func BackupCmd(repoFlag string, rt repo.RepoType, getApi BackupApiFn) *cli.Comma return xerrors.Errorf("opening backup file %s: %w", fpath, err) } - if err := bds.Backup(out); err != nil { + if err := bds.Backup(cctx.Context, out); err != nil { if cerr := out.Close(); cerr != nil { log.Errorw("error closing backup file while handling backup error", "closeErr", cerr, "backupErr", err) } diff --git a/go.mod b/go.mod index 0b689b6a620..5c10d48f54c 100644 --- a/go.mod +++ b/go.mod @@ -36,7 +36,7 @@ require ( github.com/filecoin-project/go-data-transfer v1.12.0 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.13.3-0.20211211193119-ab98aecd0969 + github.com/filecoin-project/go-fil-markets v1.13.3-0.20211211202606-e111ec29d24d github.com/filecoin-project/go-jsonrpc v0.1.5 github.com/filecoin-project/go-padreader v0.0.1 github.com/filecoin-project/go-paramfetch v0.0.2 @@ -74,7 +74,7 @@ require ( github.com/ipfs/go-datastore v0.5.1 github.com/ipfs/go-ds-badger2 v0.1.2-0.20211119002906-7318f1b76158 github.com/ipfs/go-ds-leveldb v0.5.0 - github.com/ipfs/go-ds-measure v0.1.0 + github.com/ipfs/go-ds-measure v0.2.0 github.com/ipfs/go-ds-pebble v0.0.2-0.20200921225637-ce220f8ac459 github.com/ipfs/go-fs-lock v0.0.6 github.com/ipfs/go-graphsync v0.11.0 @@ -88,7 +88,7 @@ require ( github.com/ipfs/go-ipfs-http-client v0.0.6 github.com/ipfs/go-ipfs-routing v0.2.1 github.com/ipfs/go-ipfs-util v0.0.2 - github.com/ipfs/go-ipld-cbor v0.0.5 + github.com/ipfs/go-ipld-cbor v0.0.6-0.20211211202953-0412412d04c4 github.com/ipfs/go-ipld-format v0.2.0 github.com/ipfs/go-log/v2 v2.3.0 github.com/ipfs/go-merkledag v0.5.1 @@ -109,7 +109,7 @@ require ( github.com/libp2p/go-libp2p-connmgr v0.2.4 github.com/libp2p/go-libp2p-core v0.11.0 github.com/libp2p/go-libp2p-discovery v0.6.0 - github.com/libp2p/go-libp2p-kad-dht v0.13.0 + github.com/libp2p/go-libp2p-kad-dht v0.15.0 github.com/libp2p/go-libp2p-noise v0.3.0 github.com/libp2p/go-libp2p-peerstore v0.4.0 github.com/libp2p/go-libp2p-pubsub v0.5.6 diff --git a/go.sum b/go.sum index b48bcc812ae..f8df41b81b8 100644 --- a/go.sum +++ b/go.sum @@ -334,8 +334,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.13.3-0.20211211193119-ab98aecd0969 h1:5N/aEyr+uuJC1dd+rdFgV+RQT7o6LqfkshSh8en3YiI= -github.com/filecoin-project/go-fil-markets v1.13.3-0.20211211193119-ab98aecd0969/go.mod h1:vXOHH3q2+zLk929W+lIq3etuDFTyJJ8nG2DwGHG2R1E= +github.com/filecoin-project/go-fil-markets v1.13.3-0.20211211202606-e111ec29d24d h1:TkBhjnKRNKrOxnESYqMQRjMbzK/NayYg1oxejxF1cGg= +github.com/filecoin-project/go-fil-markets v1.13.3-0.20211211202606-e111ec29d24d/go.mod h1:vXOHH3q2+zLk929W+lIq3etuDFTyJJ8nG2DwGHG2R1E= 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= @@ -693,7 +693,6 @@ github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAK github.com/ipfs/go-datastore v0.0.5/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= github.com/ipfs/go-datastore v0.1.0/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= github.com/ipfs/go-datastore v0.1.1/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRVNdgPHtbHw= -github.com/ipfs/go-datastore v0.3.0/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRVNdgPHtbHw= 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= @@ -722,8 +721,8 @@ github.com/ipfs/go-ds-leveldb v0.4.1/go.mod h1:jpbku/YqBSsBc1qgME8BkWS4AxzF2cEu1 github.com/ipfs/go-ds-leveldb v0.4.2/go.mod h1:jpbku/YqBSsBc1qgME8BkWS4AxzF2cEu1Ii2r79Hh9s= github.com/ipfs/go-ds-leveldb v0.5.0 h1:s++MEBbD3ZKc9/8/njrn4flZLnCuY9I79v94gBUNumo= github.com/ipfs/go-ds-leveldb v0.5.0/go.mod h1:d3XG9RUDzQ6V4SHi8+Xgj9j1XuEk1z82lquxrVbml/Q= -github.com/ipfs/go-ds-measure v0.1.0 h1:vE4TyY4aeLeVgnnPBC5QzKIjKrqzha0NCujTfgvVbVQ= -github.com/ipfs/go-ds-measure v0.1.0/go.mod h1:1nDiFrhLlwArTME1Ees2XaBOl49OoCgd2A3f8EchMSY= +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-ds-pebble v0.0.2-0.20200921225637-ce220f8ac459 h1:W3YMLEvOXqdW+sYMiguhWP6txJwQvIQqhvpU8yAMGQs= github.com/ipfs/go-ds-pebble v0.0.2-0.20200921225637-ce220f8ac459/go.mod h1:oh4liWHulKcDKVhCska5NLelE3MatWl+1FwSz3tY91g= github.com/ipfs/go-filestore v1.1.0 h1:Pu4tLBi1bucu6/HU9llaOmb9yLFk/sgP+pW764zNDoE= @@ -785,8 +784,9 @@ github.com/ipfs/go-ipfs-util v0.0.2/go.mod h1:CbPtkWJzjLdEcezDns2XYaehFVNXG9zrdr github.com/ipfs/go-ipld-cbor v0.0.2/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= github.com/ipfs/go-ipld-cbor v0.0.3/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= github.com/ipfs/go-ipld-cbor v0.0.4/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= -github.com/ipfs/go-ipld-cbor v0.0.5 h1:ovz4CHKogtG2KB/h1zUp5U0c/IzZrL435rCh5+K/5G8= github.com/ipfs/go-ipld-cbor v0.0.5/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= +github.com/ipfs/go-ipld-cbor v0.0.6-0.20211211202953-0412412d04c4 h1:is/7IfZF1xug/95JAvZKTVvJrqnrXpSRNgBQORiqQf4= +github.com/ipfs/go-ipld-cbor v0.0.6-0.20211211202953-0412412d04c4/go.mod h1:ssdxxaLJPXH7OjF5V4NSjBbcfh+evoR4ukuru0oPXMA= github.com/ipfs/go-ipld-format v0.0.1/go.mod h1:kyJtbkDALmFHv3QR6et67i35QzO3S0dCDnkOJhcZkms= github.com/ipfs/go-ipld-format v0.0.2/go.mod h1:4B6+FM2u9OJ9zCV+kSbgFAZlOrv1Hqbf0INGQgiKf9k= github.com/ipfs/go-ipld-format v0.2.0 h1:xGlJKkArkmBvowr+GMCX0FEZtkro71K1AwiKnL37mwA= @@ -1082,8 +1082,8 @@ 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.13.0 h1:qBNYzee8BVS6RkD8ukIAGRG6LmVz8+kkeponyI7W+yA= -github.com/libp2p/go-libp2p-kad-dht v0.13.0/go.mod h1:NkGf28RNhPrcsGYWJHm6EH8ULkiJ2qxsWmpE7VTL3LI= +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= diff --git a/markets/dagstore/blockstore.go b/markets/dagstore/blockstore.go index 8980d40cfe8..317cb08b9fc 100644 --- a/markets/dagstore/blockstore.go +++ b/markets/dagstore/blockstore.go @@ -1,6 +1,7 @@ package dagstore import ( + "context" "io" blocks "github.com/ipfs/go-block-format" @@ -20,14 +21,14 @@ type Blockstore struct { var _ bstore.Blockstore = (*Blockstore)(nil) -func (b *Blockstore) DeleteBlock(c cid.Cid) error { +func (b *Blockstore) DeleteBlock(context.Context, cid.Cid) error { return xerrors.Errorf("DeleteBlock called but not implemented") } -func (b *Blockstore) Put(block blocks.Block) error { +func (b *Blockstore) Put(context.Context, blocks.Block) error { return xerrors.Errorf("Put called but not implemented") } -func (b *Blockstore) PutMany(blocks []blocks.Block) error { +func (b *Blockstore) PutMany(context.Context, []blocks.Block) error { return xerrors.Errorf("PutMany called but not implemented") } diff --git a/markets/storageadapter/provider.go b/markets/storageadapter/provider.go index 5c82d0dc8c8..bb9863bc4a6 100644 --- a/markets/storageadapter/provider.go +++ b/markets/storageadapter/provider.go @@ -228,7 +228,7 @@ func (n *ProviderNodeAdapter) GetBalance(ctx context.Context, addr address.Addre // TODO: why doesnt this method take in a sector ID? func (n *ProviderNodeAdapter) LocatePieceForDealWithinSector(ctx context.Context, dealID abi.DealID, encodedTs shared.TipSetToken) (sectorID abi.SectorNumber, offset abi.PaddedPieceSize, length abi.PaddedPieceSize, err error) { - refs, err := n.secb.GetRefs(dealID) + refs, err := n.secb.GetRefs(ctx, dealID) if err != nil { return 0, 0, 0, err } diff --git a/miner/miner.go b/miner/miner.go index 582ade723a0..c5f0a012956 100644 --- a/miner/miner.go +++ b/miner/miner.go @@ -325,7 +325,7 @@ minerLoop: "block-time", btime, "time", build.Clock.Now(), "difference", build.Clock.Since(btime)) } - if err := m.sf.MinedBlock(b.Header, base.TipSet.Height()+base.NullRounds); err != nil { + if err := m.sf.MinedBlock(ctx, b.Header, base.TipSet.Height()+base.NullRounds); err != nil { log.Errorf(" SLASH FILTER ERROR: %s", err) if os.Getenv("LOTUS_MINER_NO_SLASHFILTER") != "_yes_i_know_i_can_and_probably_will_lose_all_my_fil_and_power_" { continue diff --git a/node/hello/hello.go b/node/hello/hello.go index 5461dcc87e0..ac92d5170e8 100644 --- a/node/hello/hello.go +++ b/node/hello/hello.go @@ -141,7 +141,7 @@ func (hs *Service) SayHello(ctx context.Context, pid peer.ID) error { return err } - gen, err := hs.cs.GetGenesis() + gen, err := hs.cs.GetGenesis(ctx) if err != nil { return err } diff --git a/node/impl/backup.go b/node/impl/backup.go index 10f673a4bfe..7acc7e01877 100644 --- a/node/impl/backup.go +++ b/node/impl/backup.go @@ -1,6 +1,7 @@ package impl import ( + "context" "os" "path/filepath" "strings" @@ -12,7 +13,7 @@ import ( "github.com/filecoin-project/lotus/node/modules/dtypes" ) -func backup(mds dtypes.MetadataDS, fpath string) error { +func backup(ctx context.Context, mds dtypes.MetadataDS, fpath string) error { bb, ok := os.LookupEnv("LOTUS_BACKUP_BASE_PATH") if !ok { return xerrors.Errorf("LOTUS_BACKUP_BASE_PATH env var not set") @@ -52,7 +53,7 @@ func backup(mds dtypes.MetadataDS, fpath string) error { return xerrors.Errorf("open %s: %w", fpath, err) } - if err := bds.Backup(out); err != nil { + if err := bds.Backup(ctx, out); err != nil { if cerr := out.Close(); cerr != nil { log.Errorw("error closing backup file while handling backup error", "closeErr", cerr, "backupErr", err) } diff --git a/node/impl/client/client.go b/node/impl/client/client.go index 4b6903d944d..e3c365fee30 100644 --- a/node/impl/client/client.go +++ b/node/impl/client/client.go @@ -150,7 +150,7 @@ func (a *API) dealStarter(ctx context.Context, params *api.StartDealParams, isSt if err != nil { return nil, xerrors.Errorf("failed to find blockstore for root CID: %w", err) } - if has, err := bs.Has(params.Data.Root); err != nil { + if has, err := bs.Has(ctx, params.Data.Root); err != nil { return nil, xerrors.Errorf("failed to query blockstore for root CID: %w", err) } else if !has { return nil, xerrors.Errorf("failed to find root CID in blockstore: %w", err) @@ -520,7 +520,7 @@ func (a *API) ClientImport(ctx context.Context, ref api.FileRef) (res *api.Impor } defer f.Close() //nolint:errcheck - hd, _, err := car.ReadHeader(bufio.NewReader(f)) + hd, err := car.ReadHeader(bufio.NewReader(f)) if err != nil { return nil, xerrors.Errorf("failed to read CAR header: %w", err) } @@ -1028,7 +1028,7 @@ func (a *API) outputCAR(ctx context.Context, ds format.DAGService, bs bstore.Blo } if cs.Visit(c) { - nb, err := bs.Get(c) + nb, err := bs.Get(ctx, c) if err != nil { return xerrors.Errorf("getting block data: %w", err) } @@ -1285,7 +1285,7 @@ func (a *API) ClientCalcCommP(ctx context.Context, inpath string) (*api.CommPRet } // check that the data is a car file; if it's not, retrieval won't work - _, _, err = car.ReadHeader(bufio.NewReader(rdr)) + _, err = car.ReadHeader(bufio.NewReader(rdr)) if err != nil { return nil, xerrors.Errorf("not a car file: %w", err) } diff --git a/node/impl/full.go b/node/impl/full.go index f9c83ded032..a6f61c305ef 100644 --- a/node/impl/full.go +++ b/node/impl/full.go @@ -42,7 +42,7 @@ type FullNodeAPI struct { } func (n *FullNodeAPI) CreateBackup(ctx context.Context, fpath string) error { - return backup(n.DS, fpath) + return backup(ctx, n.DS, fpath) } func (n *FullNodeAPI) NodeStatus(ctx context.Context, inclChainStatus bool) (status api.NodeStatus, err error) { diff --git a/node/impl/full/chain.go b/node/impl/full/chain.go index 4ffbe0e6376..e3730442986 100644 --- a/node/impl/full/chain.go +++ b/node/impl/full/chain.go @@ -99,11 +99,11 @@ func (m *ChainModule) ChainHead(context.Context) (*types.TipSet, error) { } func (a *ChainAPI) ChainGetBlock(ctx context.Context, msg cid.Cid) (*types.BlockHeader, error) { - return a.Chain.GetBlock(msg) + return a.Chain.GetBlock(ctx, msg) } func (m *ChainModule) ChainGetTipSet(ctx context.Context, key types.TipSetKey) (*types.TipSet, error) { - return m.Chain.LoadTipSet(key) + return m.Chain.LoadTipSet(ctx, key) } func (m *ChainModule) ChainGetPath(ctx context.Context, from, to types.TipSetKey) ([]*api.HeadChange, error) { @@ -111,7 +111,7 @@ func (m *ChainModule) ChainGetPath(ctx context.Context, from, to types.TipSetKey } func (m *ChainModule) ChainGetBlockMessages(ctx context.Context, msg cid.Cid) (*api.BlockMessages, error) { - b, err := m.Chain.GetBlock(msg) + b, err := m.Chain.GetBlock(ctx, msg) if err != nil { return nil, err } @@ -143,7 +143,7 @@ func (a *ChainAPI) ChainGetPath(ctx context.Context, from types.TipSetKey, to ty } func (a *ChainAPI) ChainGetParentMessages(ctx context.Context, bcid cid.Cid) ([]api.Message, error) { - b, err := a.Chain.GetBlock(bcid) + b, err := a.Chain.GetBlock(ctx, bcid) if err != nil { return nil, err } @@ -154,7 +154,7 @@ func (a *ChainAPI) ChainGetParentMessages(ctx context.Context, bcid cid.Cid) ([] } // TODO: need to get the number of messages better than this - pts, err := a.Chain.LoadTipSet(types.NewTipSetKey(b.Parents...)) + pts, err := a.Chain.LoadTipSet(ctx, types.NewTipSetKey(b.Parents...)) if err != nil { return nil, err } @@ -176,7 +176,7 @@ func (a *ChainAPI) ChainGetParentMessages(ctx context.Context, bcid cid.Cid) ([] } func (a *ChainAPI) ChainGetParentReceipts(ctx context.Context, bcid cid.Cid) ([]*types.MessageReceipt, error) { - b, err := a.Chain.GetBlock(bcid) + b, err := a.Chain.GetBlock(ctx, bcid) if err != nil { return nil, err } @@ -186,7 +186,7 @@ func (a *ChainAPI) ChainGetParentReceipts(ctx context.Context, bcid cid.Cid) ([] } // TODO: need to get the number of messages better than this - pts, err := a.Chain.LoadTipSet(types.NewTipSetKey(b.Parents...)) + pts, err := a.Chain.LoadTipSet(ctx, types.NewTipSetKey(b.Parents...)) if err != nil { return nil, err } @@ -210,7 +210,7 @@ func (a *ChainAPI) ChainGetParentReceipts(ctx context.Context, bcid cid.Cid) ([] } func (a *ChainAPI) ChainGetMessagesInTipset(ctx context.Context, tsk types.TipSetKey) ([]api.Message, error) { - ts, err := a.Chain.GetTipSetFromKey(tsk) + ts, err := a.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return nil, err } @@ -237,7 +237,7 @@ func (a *ChainAPI) ChainGetMessagesInTipset(ctx context.Context, tsk types.TipSe } func (m *ChainModule) ChainGetTipSetByHeight(ctx context.Context, h abi.ChainEpoch, tsk types.TipSetKey) (*types.TipSet, error) { - ts, err := m.Chain.GetTipSetFromKey(tsk) + ts, err := m.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return nil, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -245,7 +245,7 @@ func (m *ChainModule) ChainGetTipSetByHeight(ctx context.Context, h abi.ChainEpo } func (m *ChainModule) ChainGetTipSetAfterHeight(ctx context.Context, h abi.ChainEpoch, tsk types.TipSetKey) (*types.TipSet, error) { - ts, err := m.Chain.GetTipSetFromKey(tsk) + ts, err := m.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return nil, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -253,7 +253,7 @@ func (m *ChainModule) ChainGetTipSetAfterHeight(ctx context.Context, h abi.Chain } func (m *ChainModule) ChainReadObj(ctx context.Context, obj cid.Cid) ([]byte, error) { - blk, err := m.ExposedBlockstore.Get(obj) + blk, err := m.ExposedBlockstore.Get(ctx, obj) if err != nil { return nil, xerrors.Errorf("blockstore get: %w", err) } @@ -262,11 +262,11 @@ func (m *ChainModule) ChainReadObj(ctx context.Context, obj cid.Cid) ([]byte, er } func (a *ChainAPI) ChainDeleteObj(ctx context.Context, obj cid.Cid) error { - return a.ExposedBlockstore.DeleteBlock(obj) + return a.ExposedBlockstore.DeleteBlock(ctx, obj) } func (m *ChainModule) ChainHasObj(ctx context.Context, obj cid.Cid) (bool, error) { - return m.ExposedBlockstore.Has(obj) + return m.ExposedBlockstore.Has(ctx, obj) } func (a *ChainAPI) ChainStatObj(ctx context.Context, obj cid.Cid, base cid.Cid) (api.ObjStat, error) { @@ -318,7 +318,7 @@ func (a *ChainAPI) ChainStatObj(ctx context.Context, obj cid.Cid, base cid.Cid) } func (a *ChainAPI) ChainSetHead(ctx context.Context, tsk types.TipSetKey) error { - newHeadTs, err := a.Chain.GetTipSetFromKey(tsk) + newHeadTs, err := a.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -342,11 +342,11 @@ func (a *ChainAPI) ChainSetHead(ctx context.Context, tsk types.TipSetKey) error } } - return a.Chain.SetHead(newHeadTs) + return a.Chain.SetHead(ctx, newHeadTs) } func (a *ChainAPI) ChainGetGenesis(ctx context.Context) (*types.TipSet, error) { - genb, err := a.Chain.GetGenesis() + genb, err := a.Chain.GetGenesis(ctx) if err != nil { return nil, err } @@ -355,7 +355,7 @@ func (a *ChainAPI) ChainGetGenesis(ctx context.Context) (*types.TipSet, error) { } func (a *ChainAPI) ChainTipSetWeight(ctx context.Context, tsk types.TipSetKey) (types.BigInt, error) { - ts, err := a.Chain.GetTipSetFromKey(tsk) + ts, err := a.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return types.EmptyInt, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -434,7 +434,7 @@ func resolveOnce(bs blockstore.Blockstore, tse stmgr.Executor) func(ctx context. return nil, nil, err } - if err := bs.Put(n); err != nil { + if err := bs.Put(ctx, n); err != nil { return nil, nil, xerrors.Errorf("put hamt val: %w", err) } @@ -482,7 +482,7 @@ func resolveOnce(bs blockstore.Blockstore, tse stmgr.Executor) func(ctx context. return nil, nil, err } - if err := bs.Put(n); err != nil { + if err := bs.Put(ctx, n); err != nil { return nil, nil, xerrors.Errorf("put amt val: %w", err) } @@ -530,7 +530,7 @@ func resolveOnce(bs blockstore.Blockstore, tse stmgr.Executor) func(ctx context. return nil, nil, err } - if err := bs.Put(n); err != nil { + if err := bs.Put(ctx, n); err != nil { return nil, nil, xerrors.Errorf("put amt val: %w", err) } @@ -586,7 +586,7 @@ func (m *ChainModule) ChainGetMessage(ctx context.Context, mc cid.Cid) (*types.M } func (a *ChainAPI) ChainExport(ctx context.Context, nroots abi.ChainEpoch, skipoldmsgs bool, tsk types.TipSetKey) (<-chan []byte, error) { - ts, err := a.Chain.GetTipSetFromKey(tsk) + ts, err := a.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return nil, xerrors.Errorf("loading tipset %s: %w", tsk, err) } diff --git a/node/impl/full/gas.go b/node/impl/full/gas.go index edf53ff6333..c4c1bd58029 100644 --- a/node/impl/full/gas.go +++ b/node/impl/full/gas.go @@ -173,7 +173,7 @@ func (a *GasAPI) GasEstimateGasPremium( gaslimit int64, _ types.TipSetKey, ) (types.BigInt, error) { - return gasEstimateGasPremium(a.Chain, a.PriceCache, nblocksincl) + return gasEstimateGasPremium(ctx, a.Chain, a.PriceCache, nblocksincl) } func (m *GasModule) GasEstimateGasPremium( ctx context.Context, @@ -182,9 +182,9 @@ func (m *GasModule) GasEstimateGasPremium( gaslimit int64, _ types.TipSetKey, ) (types.BigInt, error) { - return gasEstimateGasPremium(m.Chain, m.PriceCache, nblocksincl) + return gasEstimateGasPremium(ctx, m.Chain, m.PriceCache, nblocksincl) } -func gasEstimateGasPremium(cstore *store.ChainStore, cache *GasPriceCache, nblocksincl uint64) (types.BigInt, error) { +func gasEstimateGasPremium(ctx context.Context, cstore *store.ChainStore, cache *GasPriceCache, nblocksincl uint64) (types.BigInt, error) { if nblocksincl == 0 { nblocksincl = 1 } @@ -198,7 +198,7 @@ func gasEstimateGasPremium(cstore *store.ChainStore, cache *GasPriceCache, nbloc break // genesis } - pts, err := cstore.LoadTipSet(ts.Parents()) + pts, err := cstore.LoadTipSet(ctx, ts.Parents()) if err != nil { return types.BigInt{}, err } @@ -236,14 +236,14 @@ func gasEstimateGasPremium(cstore *store.ChainStore, cache *GasPriceCache, nbloc } func (a *GasAPI) GasEstimateGasLimit(ctx context.Context, msgIn *types.Message, tsk types.TipSetKey) (int64, error) { - ts, err := a.Chain.GetTipSetFromKey(tsk) + ts, err := a.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return -1, xerrors.Errorf("getting tipset: %w", err) } return gasEstimateGasLimit(ctx, a.Chain, a.Stmgr, a.Mpool, msgIn, ts) } func (m *GasModule) GasEstimateGasLimit(ctx context.Context, msgIn *types.Message, tsk types.TipSetKey) (int64, error) { - ts, err := m.Chain.GetTipSetFromKey(tsk) + ts, err := m.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return -1, xerrors.Errorf("getting tipset: %w", err) } @@ -283,7 +283,7 @@ func gasEstimateGasLimit( if err != stmgr.ErrExpensiveFork { break } - ts, err = cstore.GetTipSetFromKey(ts.Parents()) + ts, err = cstore.GetTipSetFromKey(ctx, ts.Parents()) if err != nil { return -1, xerrors.Errorf("getting parent tipset: %w", err) } diff --git a/node/impl/full/mpool.go b/node/impl/full/mpool.go index f792cdf996c..6e1873d5b77 100644 --- a/node/impl/full/mpool.go +++ b/node/impl/full/mpool.go @@ -51,11 +51,11 @@ func (a *MpoolAPI) MpoolGetConfig(context.Context) (*types.MpoolConfig, error) { } func (a *MpoolAPI) MpoolSetConfig(ctx context.Context, cfg *types.MpoolConfig) error { - return a.Mpool.SetConfig(cfg) + return a.Mpool.SetConfig(ctx, cfg) } func (a *MpoolAPI) MpoolSelect(ctx context.Context, tsk types.TipSetKey, ticketQuality float64) ([]*types.SignedMessage, error) { - ts, err := a.Chain.GetTipSetFromKey(tsk) + ts, err := a.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return nil, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -64,7 +64,7 @@ func (a *MpoolAPI) MpoolSelect(ctx context.Context, tsk types.TipSetKey, ticketQ } func (a *MpoolAPI) MpoolPending(ctx context.Context, tsk types.TipSetKey) ([]*types.SignedMessage, error) { - ts, err := a.Chain.GetTipSetFromKey(tsk) + ts, err := a.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return nil, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -115,7 +115,7 @@ func (a *MpoolAPI) MpoolPending(ctx context.Context, tsk types.TipSetKey) ([]*ty return pending, nil } - ts, err = a.Chain.LoadTipSet(ts.Parents()) + ts, err = a.Chain.LoadTipSet(ctx, ts.Parents()) if err != nil { return nil, xerrors.Errorf("loading parent tipset: %w", err) } diff --git a/node/impl/full/state.go b/node/impl/full/state.go index e251fa3d53b..7a96af15075 100644 --- a/node/impl/full/state.go +++ b/node/impl/full/state.go @@ -132,7 +132,7 @@ func (a *StateAPI) StateMinerActiveSectors(ctx context.Context, maddr address.Ad } func (m *StateModule) StateMinerInfo(ctx context.Context, actor address.Address, tsk types.TipSetKey) (miner.MinerInfo, error) { - ts, err := m.Chain.GetTipSetFromKey(tsk) + ts, err := m.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return miner.MinerInfo{}, xerrors.Errorf("failed to load tipset: %w", err) } @@ -250,7 +250,7 @@ func (a *StateAPI) StateMinerPartitions(ctx context.Context, m address.Address, } func (m *StateModule) StateMinerProvingDeadline(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*dline.Info, error) { - ts, err := m.Chain.GetTipSetFromKey(tsk) + ts, err := m.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return nil, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -345,7 +345,7 @@ func (a *StateAPI) StateMinerRecoveries(ctx context.Context, addr address.Addres } func (m *StateModule) StateMinerPower(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*api.MinerPower, error) { - ts, err := m.Chain.GetTipSetFromKey(tsk) + ts, err := m.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return nil, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -363,7 +363,7 @@ func (m *StateModule) StateMinerPower(ctx context.Context, addr address.Address, } func (a *StateAPI) StateCall(ctx context.Context, msg *types.Message, tsk types.TipSetKey) (res *api.InvocResult, err error) { - ts, err := a.Chain.GetTipSetFromKey(tsk) + ts, err := a.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return nil, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -372,7 +372,7 @@ func (a *StateAPI) StateCall(ctx context.Context, msg *types.Message, tsk types. if err != stmgr.ErrExpensiveFork { break } - ts, err = a.Chain.GetTipSetFromKey(ts.Parents()) + ts, err = a.Chain.GetTipSetFromKey(ctx, ts.Parents()) if err != nil { return nil, xerrors.Errorf("getting parent tipset: %w", err) } @@ -395,17 +395,17 @@ func (a *StateAPI) StateReplay(ctx context.Context, tsk types.TipSetKey, mc cid. msgToReplay = mlkp.Message - executionTs, err := a.Chain.GetTipSetFromKey(mlkp.TipSet) + executionTs, err := a.Chain.GetTipSetFromKey(ctx, mlkp.TipSet) if err != nil { return nil, xerrors.Errorf("loading tipset %s: %w", mlkp.TipSet, err) } - ts, err = a.Chain.LoadTipSet(executionTs.Parents()) + ts, err = a.Chain.LoadTipSet(ctx, executionTs.Parents()) if err != nil { return nil, xerrors.Errorf("loading parent tipset %s: %w", mlkp.TipSet, err) } } else { - ts, err = a.Chain.LoadTipSet(tsk) + ts, err = a.Chain.LoadTipSet(ctx, tsk) if err != nil { return nil, xerrors.Errorf("loading specified tipset %s: %w", tsk, err) } @@ -433,7 +433,7 @@ func (a *StateAPI) StateReplay(ctx context.Context, tsk types.TipSetKey, mc cid. } func (m *StateModule) StateGetActor(ctx context.Context, actor address.Address, tsk types.TipSetKey) (a *types.Actor, err error) { - ts, err := m.Chain.GetTipSetFromKey(tsk) + ts, err := m.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return nil, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -441,7 +441,7 @@ func (m *StateModule) StateGetActor(ctx context.Context, actor address.Address, } func (m *StateModule) StateLookupID(ctx context.Context, addr address.Address, tsk types.TipSetKey) (address.Address, error) { - ts, err := m.Chain.GetTipSetFromKey(tsk) + ts, err := m.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return address.Undef, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -450,7 +450,7 @@ func (m *StateModule) StateLookupID(ctx context.Context, addr address.Address, t } func (m *StateModule) StateAccountKey(ctx context.Context, addr address.Address, tsk types.TipSetKey) (address.Address, error) { - ts, err := m.Chain.GetTipSetFromKey(tsk) + ts, err := m.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return address.Undef, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -459,7 +459,7 @@ func (m *StateModule) StateAccountKey(ctx context.Context, addr address.Address, } func (a *StateAPI) StateReadState(ctx context.Context, actor address.Address, tsk types.TipSetKey) (*api.ActorState, error) { - ts, err := a.Chain.GetTipSetFromKey(tsk) + ts, err := a.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return nil, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -468,7 +468,7 @@ func (a *StateAPI) StateReadState(ctx context.Context, actor address.Address, ts return nil, xerrors.Errorf("getting actor: %w", err) } - blk, err := a.Chain.StateBlockstore().Get(act.Head) + blk, err := a.Chain.StateBlockstore().Get(ctx, act.Head) if err != nil { return nil, xerrors.Errorf("getting actor head: %w", err) } @@ -585,7 +585,7 @@ func (m *StateModule) StateWaitMsg(ctx context.Context, msg cid.Cid, confidence } func (m *StateModule) StateSearchMsg(ctx context.Context, tsk types.TipSetKey, msg cid.Cid, lookbackLimit abi.ChainEpoch, allowReplaced bool) (*api.MsgLookup, error) { - fromTs, err := m.Chain.GetTipSetFromKey(tsk) + fromTs, err := m.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return nil, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -607,7 +607,7 @@ func (m *StateModule) StateSearchMsg(ctx context.Context, tsk types.TipSetKey, m } func (m *StateModule) StateListMiners(ctx context.Context, tsk types.TipSetKey) ([]address.Address, error) { - ts, err := m.Chain.GetTipSetFromKey(tsk) + ts, err := m.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return nil, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -615,7 +615,7 @@ func (m *StateModule) StateListMiners(ctx context.Context, tsk types.TipSetKey) } func (a *StateAPI) StateListActors(ctx context.Context, tsk types.TipSetKey) ([]address.Address, error) { - ts, err := a.Chain.GetTipSetFromKey(tsk) + ts, err := a.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return nil, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -623,7 +623,7 @@ func (a *StateAPI) StateListActors(ctx context.Context, tsk types.TipSetKey) ([] } func (m *StateModule) StateMarketBalance(ctx context.Context, addr address.Address, tsk types.TipSetKey) (api.MarketBalance, error) { - ts, err := m.Chain.GetTipSetFromKey(tsk) + ts, err := m.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return api.MarketBalance{}, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -633,7 +633,7 @@ func (m *StateModule) StateMarketBalance(ctx context.Context, addr address.Addre func (a *StateAPI) StateMarketParticipants(ctx context.Context, tsk types.TipSetKey) (map[string]api.MarketBalance, error) { out := map[string]api.MarketBalance{} - ts, err := a.Chain.GetTipSetFromKey(tsk) + ts, err := a.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return nil, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -673,7 +673,7 @@ func (a *StateAPI) StateMarketParticipants(ctx context.Context, tsk types.TipSet func (a *StateAPI) StateMarketDeals(ctx context.Context, tsk types.TipSetKey) (map[string]api.MarketDeal, error) { out := map[string]api.MarketDeal{} - ts, err := a.Chain.GetTipSetFromKey(tsk) + ts, err := a.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return nil, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -712,7 +712,7 @@ func (a *StateAPI) StateMarketDeals(ctx context.Context, tsk types.TipSetKey) (m } func (m *StateModule) StateMarketStorageDeal(ctx context.Context, dealId abi.DealID, tsk types.TipSetKey) (*api.MarketDeal, error) { - ts, err := m.Chain.GetTipSetFromKey(tsk) + ts, err := m.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return nil, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -777,7 +777,7 @@ func (a *StateAPI) StateMinerSectorCount(ctx context.Context, addr address.Addre } func (a *StateAPI) StateSectorPreCommitInfo(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk types.TipSetKey) (miner.SectorPreCommitOnChainInfo, error) { - ts, err := a.Chain.GetTipSetFromKey(tsk) + ts, err := a.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return miner.SectorPreCommitOnChainInfo{}, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -793,7 +793,7 @@ func (a *StateAPI) StateSectorPreCommitInfo(ctx context.Context, maddr address.A } func (m *StateModule) StateSectorGetInfo(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk types.TipSetKey) (*miner.SectorOnChainInfo, error) { - ts, err := m.Chain.GetTipSetFromKey(tsk) + ts, err := m.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return nil, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -825,7 +825,7 @@ func (a *StateAPI) StateSectorPartition(ctx context.Context, maddr address.Addre } func (a *StateAPI) StateListMessages(ctx context.Context, match *api.MessageMatch, tsk types.TipSetKey, toheight abi.ChainEpoch) ([]cid.Cid, error) { - ts, err := a.Chain.GetTipSetFromKey(tsk) + ts, err := a.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return nil, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -889,7 +889,7 @@ func (a *StateAPI) StateListMessages(ctx context.Context, match *api.MessageMatc break } - next, err := a.Chain.LoadTipSet(ts.Parents()) + next, err := a.Chain.LoadTipSet(ctx, ts.Parents()) if err != nil { return nil, xerrors.Errorf("loading next tipset: %w", err) } @@ -901,7 +901,7 @@ func (a *StateAPI) StateListMessages(ctx context.Context, match *api.MessageMatc } func (a *StateAPI) StateCompute(ctx context.Context, height abi.ChainEpoch, msgs []*types.Message, tsk types.TipSetKey) (*api.ComputeStateOutput, error) { - ts, err := a.Chain.GetTipSetFromKey(tsk) + ts, err := a.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return nil, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -917,7 +917,7 @@ func (a *StateAPI) StateCompute(ctx context.Context, height abi.ChainEpoch, msgs } func (m *StateModule) MsigGetAvailableBalance(ctx context.Context, addr address.Address, tsk types.TipSetKey) (types.BigInt, error) { - ts, err := m.Chain.GetTipSetFromKey(tsk) + ts, err := m.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return types.EmptyInt, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -938,7 +938,7 @@ func (m *StateModule) MsigGetAvailableBalance(ctx context.Context, addr address. } func (a *StateAPI) MsigGetVestingSchedule(ctx context.Context, addr address.Address, tsk types.TipSetKey) (api.MsigVesting, error) { - ts, err := a.Chain.GetTipSetFromKey(tsk) + ts, err := a.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return api.EmptyVesting, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -976,12 +976,12 @@ func (a *StateAPI) MsigGetVestingSchedule(ctx context.Context, addr address.Addr } func (m *StateModule) MsigGetVested(ctx context.Context, addr address.Address, start types.TipSetKey, end types.TipSetKey) (types.BigInt, error) { - startTs, err := m.Chain.GetTipSetFromKey(start) + startTs, err := m.Chain.GetTipSetFromKey(ctx, start) if err != nil { return types.EmptyInt, xerrors.Errorf("loading start tipset %s: %w", start, err) } - endTs, err := m.Chain.GetTipSetFromKey(end) + endTs, err := m.Chain.GetTipSetFromKey(ctx, end) if err != nil { return types.EmptyInt, xerrors.Errorf("loading end tipset %s: %w", end, err) } @@ -1016,7 +1016,7 @@ func (m *StateModule) MsigGetVested(ctx context.Context, addr address.Address, s } func (m *StateModule) MsigGetPending(ctx context.Context, addr address.Address, tsk types.TipSetKey) ([]*api.MsigTransaction, error) { - ts, err := m.Chain.GetTipSetFromKey(tsk) + ts, err := m.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return nil, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -1053,7 +1053,7 @@ var initialPledgeNum = types.NewInt(110) var initialPledgeDen = types.NewInt(100) func (a *StateAPI) StateMinerPreCommitDepositForPower(ctx context.Context, maddr address.Address, pci miner.SectorPreCommitInfo, tsk types.TipSetKey) (types.BigInt, error) { - ts, err := a.Chain.GetTipSetFromKey(tsk) + ts, err := a.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return types.EmptyInt, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -1114,7 +1114,7 @@ func (a *StateAPI) StateMinerPreCommitDepositForPower(ctx context.Context, maddr func (a *StateAPI) StateMinerInitialPledgeCollateral(ctx context.Context, maddr address.Address, pci miner.SectorPreCommitInfo, tsk types.TipSetKey) (types.BigInt, error) { // TODO: this repeats a lot of the previous function. Fix that. - ts, err := a.Chain.GetTipSetFromKey(tsk) + ts, err := a.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return types.EmptyInt, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -1190,7 +1190,7 @@ func (a *StateAPI) StateMinerInitialPledgeCollateral(ctx context.Context, maddr } func (a *StateAPI) StateMinerAvailableBalance(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (types.BigInt, error) { - ts, err := a.Chain.GetTipSetFromKey(tsk) + ts, err := a.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return types.EmptyInt, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -1219,7 +1219,7 @@ func (a *StateAPI) StateMinerAvailableBalance(ctx context.Context, maddr address } func (a *StateAPI) StateMinerSectorAllocated(ctx context.Context, maddr address.Address, s abi.SectorNumber, tsk types.TipSetKey) (bool, error) { - ts, err := a.Chain.GetTipSetFromKey(tsk) + ts, err := a.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return false, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -1319,7 +1319,7 @@ var dealProviderCollateralDen = types.NewInt(100) // StateDealProviderCollateralBounds returns the min and max collateral a storage provider // can issue. It takes the deal size and verified status as parameters. func (m *StateModule) StateDealProviderCollateralBounds(ctx context.Context, size abi.PaddedPieceSize, verified bool, tsk types.TipSetKey) (api.DealCollateralBounds, error) { - ts, err := m.Chain.GetTipSetFromKey(tsk) + ts, err := m.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return api.DealCollateralBounds{}, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -1376,7 +1376,7 @@ func (m *StateModule) StateDealProviderCollateralBounds(ctx context.Context, siz } func (a *StateAPI) StateCirculatingSupply(ctx context.Context, tsk types.TipSetKey) (abi.TokenAmount, error) { - ts, err := a.Chain.GetTipSetFromKey(tsk) + ts, err := a.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return types.EmptyInt, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -1397,7 +1397,7 @@ func stateVMCirculatingSupplyInternal( cstore *store.ChainStore, smgr *stmgr.StateManager, ) (api.CirculatingSupply, error) { - ts, err := cstore.GetTipSetFromKey(tsk) + ts, err := cstore.GetTipSetFromKey(ctx, tsk) if err != nil { return api.CirculatingSupply{}, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -1411,7 +1411,7 @@ func stateVMCirculatingSupplyInternal( } func (m *StateModule) StateNetworkVersion(ctx context.Context, tsk types.TipSetKey) (network.Version, error) { - ts, err := m.Chain.GetTipSetFromKey(tsk) + ts, err := m.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return network.VersionMax, xerrors.Errorf("loading tipset %s: %w", tsk, err) } diff --git a/node/impl/full/sync.go b/node/impl/full/sync.go index 652ae3ecb2b..25f7c784a37 100644 --- a/node/impl/full/sync.go +++ b/node/impl/full/sync.go @@ -51,13 +51,13 @@ func (a *SyncAPI) SyncState(ctx context.Context) (*api.SyncState, error) { } func (a *SyncAPI) SyncSubmitBlock(ctx context.Context, blk *types.BlockMsg) error { - parent, err := a.Syncer.ChainStore().GetBlock(blk.Header.Parents[0]) + parent, err := a.Syncer.ChainStore().GetBlock(ctx, blk.Header.Parents[0]) if err != nil { return xerrors.Errorf("loading parent block: %w", err) } if a.SlashFilter != nil { - if err := a.SlashFilter.MinedBlock(blk.Header, parent.Height); err != nil { + if err := a.SlashFilter.MinedBlock(ctx, blk.Header, parent.Height); err != nil { log.Errorf(" SLASH FILTER ERROR: %s", err) return xerrors.Errorf(" SLASH FILTER ERROR: %w", err) } @@ -137,7 +137,7 @@ func (a *SyncAPI) SyncCheckBad(ctx context.Context, bcid cid.Cid) (string, error } func (a *SyncAPI) SyncValidateTipset(ctx context.Context, tsk types.TipSetKey) (bool, error) { - ts, err := a.Syncer.ChainStore().LoadTipSet(tsk) + ts, err := a.Syncer.ChainStore().LoadTipSet(ctx, tsk) if err != nil { return false, err } diff --git a/node/impl/paych/paych.go b/node/impl/paych/paych.go index 773a5efab7a..df3b1e3e490 100644 --- a/node/impl/paych/paych.go +++ b/node/impl/paych/paych.go @@ -35,11 +35,11 @@ func (a *PaychAPI) PaychGet(ctx context.Context, from, to address.Address, amt t } func (a *PaychAPI) PaychAvailableFunds(ctx context.Context, ch address.Address) (*api.ChannelAvailableFunds, error) { - return a.PaychMgr.AvailableFunds(ch) + return a.PaychMgr.AvailableFunds(ctx, ch) } func (a *PaychAPI) PaychAvailableFundsByFromTo(ctx context.Context, from, to address.Address) (*api.ChannelAvailableFunds, error) { - return a.PaychMgr.AvailableFundsByFromTo(from, to) + return a.PaychMgr.AvailableFundsByFromTo(ctx, from, to) } func (a *PaychAPI) PaychGetWaitReady(ctx context.Context, sentinel cid.Cid) (address.Address, error) { @@ -47,7 +47,7 @@ func (a *PaychAPI) PaychGetWaitReady(ctx context.Context, sentinel cid.Cid) (add } func (a *PaychAPI) PaychAllocateLane(ctx context.Context, ch address.Address) (uint64, error) { - return a.PaychMgr.AllocateLane(ch) + return a.PaychMgr.AllocateLane(ctx, ch) } func (a *PaychAPI) PaychNewPayment(ctx context.Context, from, to address.Address, vouchers []api.VoucherSpec) (*api.PaymentInfo, error) { @@ -60,7 +60,7 @@ func (a *PaychAPI) PaychNewPayment(ctx context.Context, from, to address.Address return nil, err } - lane, err := a.PaychMgr.AllocateLane(ch.Channel) + lane, err := a.PaychMgr.AllocateLane(ctx, ch.Channel) if err != nil { return nil, err } @@ -95,11 +95,11 @@ func (a *PaychAPI) PaychNewPayment(ctx context.Context, from, to address.Address } func (a *PaychAPI) PaychList(ctx context.Context) ([]address.Address, error) { - return a.PaychMgr.ListChannels() + return a.PaychMgr.ListChannels(ctx) } func (a *PaychAPI) PaychStatus(ctx context.Context, pch address.Address) (*api.PaychStatus, error) { - ci, err := a.PaychMgr.GetChannelInfo(pch) + ci, err := a.PaychMgr.GetChannelInfo(ctx, pch) if err != nil { return nil, err } diff --git a/node/impl/storminer.go b/node/impl/storminer.go index 39baa97bf25..b94097d395f 100644 --- a/node/impl/storminer.go +++ b/node/impl/storminer.go @@ -300,11 +300,11 @@ func (sm *StorageMinerAPI) StorageLocal(ctx context.Context) (map[stores.ID]stri return out, nil } -func (sm *StorageMinerAPI) SectorsRefs(context.Context) (map[string][]api.SealedRef, error) { +func (sm *StorageMinerAPI) SectorsRefs(ctx context.Context) (map[string][]api.SealedRef, error) { // json can't handle cids as map keys out := map[string][]api.SealedRef{} - refs, err := sm.SectorBlocks.List() + refs, err := sm.SectorBlocks.List(ctx) if err != nil { return nil, err } @@ -948,7 +948,7 @@ func (sm *StorageMinerAPI) PiecesGetCIDInfo(ctx context.Context, payloadCid cid. } func (sm *StorageMinerAPI) CreateBackup(ctx context.Context, fpath string) error { - return backup(sm.DS, fpath) + return backup(ctx, sm.DS, fpath) } func (sm *StorageMinerAPI) CheckProvable(ctx context.Context, pp abi.RegisteredPoStProof, sectors []sto.SectorRef, expensive bool) (map[abi.SectorNumber]string, error) { diff --git a/node/modules/lp2p/host.go b/node/modules/lp2p/host.go index b0436e9c939..66c45297a0c 100644 --- a/node/modules/lp2p/host.go +++ b/node/modules/lp2p/host.go @@ -34,8 +34,6 @@ type P2PHostIn struct { type RawHost host.Host func Host(mctx helpers.MetricsCtx, lc fx.Lifecycle, params P2PHostIn) (RawHost, error) { - ctx := helpers.LifecycleCtx(mctx, lc) - pkey := params.Peerstore.PrivKey(params.ID) if pkey == nil { return nil, fmt.Errorf("missing private key for node ID: %s", params.ID.Pretty()) @@ -52,7 +50,7 @@ func Host(mctx helpers.MetricsCtx, lc fx.Lifecycle, params P2PHostIn) (RawHost, opts = append(opts, o...) } - h, err := libp2p.New(ctx, opts...) + h, err := libp2p.New(opts...) if err != nil { return nil, err } diff --git a/node/repo/imports/manager.go b/node/repo/imports/manager.go index d972ffb7712..2deaa30af31 100644 --- a/node/repo/imports/manager.go +++ b/node/repo/imports/manager.go @@ -1,6 +1,7 @@ package imports import ( + "context" "encoding/json" "fmt" "os" @@ -107,6 +108,7 @@ type Meta struct { // CreateImport initializes a new import, returning its ID and optionally a // CAR path where to place the data, if requested. func (m *Manager) CreateImport() (id ID, err error) { + ctx := context.TODO() id = ID(m.counter.Next()) meta := &Meta{Labels: map[LabelKey]LabelValue{ @@ -118,7 +120,7 @@ func (m *Manager) CreateImport() (id ID, err error) { return 0, xerrors.Errorf("marshaling store metadata: %w", err) } - err = m.ds.Put(id.dsKey(), metajson) + err = m.ds.Put(ctx, id.dsKey(), metajson) if err != nil { return 0, xerrors.Errorf("failed to insert import metadata: %w", err) } @@ -129,7 +131,8 @@ func (m *Manager) CreateImport() (id ID, err error) { // AllocateCAR creates a new CAR allocated to the supplied import under the // root directory. func (m *Manager) AllocateCAR(id ID) (path string, err error) { - meta, err := m.ds.Get(id.dsKey()) + ctx := context.TODO() + meta, err := m.ds.Get(ctx, id.dsKey()) if err != nil { return "", xerrors.Errorf("getting metadata form datastore: %w", err) } @@ -163,14 +166,15 @@ func (m *Manager) AllocateCAR(id ID) (path string, err error) { return "", xerrors.Errorf("marshaling store metadata: %w", err) } - err = m.ds.Put(id.dsKey(), meta) + err = m.ds.Put(ctx, id.dsKey(), meta) return path, err } // AddLabel adds a label associated with an import, such as the source, // car path, CID, etc. func (m *Manager) AddLabel(id ID, key LabelKey, value LabelValue) error { - meta, err := m.ds.Get(id.dsKey()) + ctx := context.TODO() + meta, err := m.ds.Get(ctx, id.dsKey()) if err != nil { return xerrors.Errorf("getting metadata form datastore: %w", err) } @@ -187,14 +191,15 @@ func (m *Manager) AddLabel(id ID, key LabelKey, value LabelValue) error { return xerrors.Errorf("marshaling store meta: %w", err) } - return m.ds.Put(id.dsKey(), meta) + return m.ds.Put(ctx, id.dsKey(), meta) } // List returns all import IDs known by this Manager. func (m *Manager) List() ([]ID, error) { + ctx := context.TODO() var keys []ID - qres, err := m.ds.Query(query.Query{KeysOnly: true}) + qres, err := m.ds.Query(ctx, query.Query{KeysOnly: true}) if err != nil { return nil, xerrors.Errorf("query error: %w", err) } @@ -218,7 +223,9 @@ func (m *Manager) List() ([]ID, error) { // Info returns the metadata known to this store for the specified import ID. func (m *Manager) Info(id ID) (*Meta, error) { - meta, err := m.ds.Get(id.dsKey()) + ctx := context.TODO() + + meta, err := m.ds.Get(ctx, id.dsKey()) if err != nil { return nil, xerrors.Errorf("getting metadata form datastore: %w", err) } @@ -233,7 +240,8 @@ func (m *Manager) Info(id ID) (*Meta, error) { // Remove drops all data associated with the supplied import ID. func (m *Manager) Remove(id ID) error { - if err := m.ds.Delete(id.dsKey()); err != nil { + ctx := context.TODO() + if err := m.ds.Delete(ctx, id.dsKey()); err != nil { return xerrors.Errorf("removing import metadata: %w", err) } return nil diff --git a/paychmgr/accessorcache.go b/paychmgr/accessorcache.go index 176fbdd1188..358cf790061 100644 --- a/paychmgr/accessorcache.go +++ b/paychmgr/accessorcache.go @@ -1,6 +1,10 @@ package paychmgr -import "github.com/filecoin-project/go-address" +import ( + "context" + + "github.com/filecoin-project/go-address" +) // accessorByFromTo gets a channel accessor for a given from / to pair. // The channel accessor facilitates locking a channel so that operations @@ -36,10 +40,10 @@ func (pm *Manager) accessorByFromTo(from address.Address, to address.Address) (* // The channel accessor facilitates locking a channel so that operations // must be performed sequentially on a channel (but can be performed at // the same time on different channels). -func (pm *Manager) accessorByAddress(ch address.Address) (*channelAccessor, error) { +func (pm *Manager) accessorByAddress(ctx context.Context, ch address.Address) (*channelAccessor, error) { // Get the channel from / to pm.lk.RLock() - channelInfo, err := pm.store.ByAddress(ch) + channelInfo, err := pm.store.ByAddress(ctx, ch) pm.lk.RUnlock() if err != nil { return nil, err diff --git a/paychmgr/manager.go b/paychmgr/manager.go index 460722945ca..e0fcd7a754c 100644 --- a/paychmgr/manager.go +++ b/paychmgr/manager.go @@ -92,7 +92,7 @@ func newManager(pchstore *Store, pchapi managerAPI) (*Manager, error) { // Start restarts tracking of any messages that were sent to chain. func (pm *Manager) Start() error { - return pm.restartPending() + return pm.restartPending(pm.ctx) } // Stop shuts down any processes used by the manager @@ -110,27 +110,27 @@ func (pm *Manager) GetPaych(ctx context.Context, from, to address.Address, amt t return chanAccessor.getPaych(ctx, amt) } -func (pm *Manager) AvailableFunds(ch address.Address) (*api.ChannelAvailableFunds, error) { - ca, err := pm.accessorByAddress(ch) +func (pm *Manager) AvailableFunds(ctx context.Context, ch address.Address) (*api.ChannelAvailableFunds, error) { + ca, err := pm.accessorByAddress(ctx, ch) if err != nil { return nil, err } - ci, err := ca.getChannelInfo(ch) + ci, err := ca.getChannelInfo(ctx, ch) if err != nil { return nil, err } - return ca.availableFunds(ci.ChannelID) + return ca.availableFunds(ctx, ci.ChannelID) } -func (pm *Manager) AvailableFundsByFromTo(from address.Address, to address.Address) (*api.ChannelAvailableFunds, error) { +func (pm *Manager) AvailableFundsByFromTo(ctx context.Context, from address.Address, to address.Address) (*api.ChannelAvailableFunds, error) { ca, err := pm.accessorByFromTo(from, to) if err != nil { return nil, err } - ci, err := ca.outboundActiveByFromTo(from, to) + ci, err := ca.outboundActiveByFromTo(ctx, from, to) if err == ErrChannelNotTracked { // If there is no active channel between from / to we still want to // return an empty ChannelAvailableFunds, so that clients can check @@ -151,7 +151,7 @@ func (pm *Manager) AvailableFundsByFromTo(from address.Address, to address.Addre return nil, err } - return ca.availableFunds(ci.ChannelID) + return ca.availableFunds(ctx, ci.ChannelID) } // GetPaychWaitReady waits until the create channel / add funds message with the @@ -160,7 +160,7 @@ func (pm *Manager) AvailableFundsByFromTo(from address.Address, to address.Addre func (pm *Manager) GetPaychWaitReady(ctx context.Context, mcid cid.Cid) (address.Address, error) { // Find the channel associated with the message CID pm.lk.Lock() - ci, err := pm.store.ByMessageCid(mcid) + ci, err := pm.store.ByMessageCid(ctx, mcid) pm.lk.Unlock() if err != nil { @@ -178,25 +178,25 @@ func (pm *Manager) GetPaychWaitReady(ctx context.Context, mcid cid.Cid) (address return chanAccessor.getPaychWaitReady(ctx, mcid) } -func (pm *Manager) ListChannels() ([]address.Address, error) { +func (pm *Manager) ListChannels(ctx context.Context) ([]address.Address, error) { // Need to take an exclusive lock here so that channel operations can't run // in parallel (see channelLock) pm.lk.Lock() defer pm.lk.Unlock() - return pm.store.ListChannels() + return pm.store.ListChannels(ctx) } -func (pm *Manager) GetChannelInfo(addr address.Address) (*ChannelInfo, error) { - ca, err := pm.accessorByAddress(addr) +func (pm *Manager) GetChannelInfo(ctx context.Context, addr address.Address) (*ChannelInfo, error) { + ca, err := pm.accessorByAddress(ctx, addr) if err != nil { return nil, err } - return ca.getChannelInfo(addr) + return ca.getChannelInfo(ctx, addr) } func (pm *Manager) CreateVoucher(ctx context.Context, ch address.Address, voucher paych.SignedVoucher) (*api.VoucherCreateResult, error) { - ca, err := pm.accessorByAddress(ch) + ca, err := pm.accessorByAddress(ctx, ch) if err != nil { return nil, err } @@ -223,7 +223,7 @@ func (pm *Manager) CheckVoucherSpendable(ctx context.Context, ch address.Address if len(proof) > 0 { return false, errProofNotSupported } - ca, err := pm.accessorByAddress(ch) + ca, err := pm.accessorByAddress(ctx, ch) if err != nil { return false, err } @@ -237,7 +237,7 @@ func (pm *Manager) AddVoucherOutbound(ctx context.Context, ch address.Address, s if len(proof) > 0 { return types.NewInt(0), errProofNotSupported } - ca, err := pm.accessorByAddress(ch) + ca, err := pm.accessorByAddress(ctx, ch) if err != nil { return types.NewInt(0), err } @@ -283,7 +283,7 @@ func (pm *Manager) trackInboundChannel(ctx context.Context, ch address.Address) defer pm.lk.Unlock() // Check if channel is in store - ci, err := pm.store.ByAddress(ch) + ci, err := pm.store.ByAddress(ctx, ch) if err == nil { // Channel is in store, so it's already being tracked return ci, nil @@ -316,7 +316,7 @@ func (pm *Manager) trackInboundChannel(ctx context.Context, ch address.Address) } // Save channel to store - return pm.store.TrackChannel(stateCi) + return pm.store.TrackChannel(ctx, stateCi) } // TODO: secret vs proof doesn't make sense, there is only one, not two @@ -324,23 +324,23 @@ func (pm *Manager) SubmitVoucher(ctx context.Context, ch address.Address, sv *pa if len(proof) > 0 { return cid.Undef, errProofNotSupported } - ca, err := pm.accessorByAddress(ch) + ca, err := pm.accessorByAddress(ctx, ch) if err != nil { return cid.Undef, err } return ca.submitVoucher(ctx, ch, sv, secret) } -func (pm *Manager) AllocateLane(ch address.Address) (uint64, error) { - ca, err := pm.accessorByAddress(ch) +func (pm *Manager) AllocateLane(ctx context.Context, ch address.Address) (uint64, error) { + ca, err := pm.accessorByAddress(ctx, ch) if err != nil { return 0, err } - return ca.allocateLane(ch) + return ca.allocateLane(ctx, ch) } func (pm *Manager) ListVouchers(ctx context.Context, ch address.Address) ([]*VoucherInfo, error) { - ca, err := pm.accessorByAddress(ch) + ca, err := pm.accessorByAddress(ctx, ch) if err != nil { return nil, err } @@ -348,7 +348,7 @@ func (pm *Manager) ListVouchers(ctx context.Context, ch address.Address) ([]*Vou } func (pm *Manager) Settle(ctx context.Context, addr address.Address) (cid.Cid, error) { - ca, err := pm.accessorByAddress(addr) + ca, err := pm.accessorByAddress(ctx, addr) if err != nil { return cid.Undef, err } @@ -356,7 +356,7 @@ func (pm *Manager) Settle(ctx context.Context, addr address.Address) (cid.Cid, e } func (pm *Manager) Collect(ctx context.Context, addr address.Address) (cid.Cid, error) { - ca, err := pm.accessorByAddress(addr) + ca, err := pm.accessorByAddress(ctx, addr) if err != nil { return cid.Undef, err } diff --git a/paychmgr/paych.go b/paychmgr/paych.go index e5e47dfcaad..16c6604c6ca 100644 --- a/paychmgr/paych.go +++ b/paychmgr/paych.go @@ -95,18 +95,18 @@ func (ca *channelAccessor) messageBuilder(ctx context.Context, from address.Addr return paych.Message(av, from), nil } -func (ca *channelAccessor) getChannelInfo(addr address.Address) (*ChannelInfo, error) { +func (ca *channelAccessor) getChannelInfo(ctx context.Context, addr address.Address) (*ChannelInfo, error) { ca.lk.Lock() defer ca.lk.Unlock() - return ca.store.ByAddress(addr) + return ca.store.ByAddress(ctx, addr) } -func (ca *channelAccessor) outboundActiveByFromTo(from, to address.Address) (*ChannelInfo, error) { +func (ca *channelAccessor) outboundActiveByFromTo(ctx context.Context, from, to address.Address) (*ChannelInfo, error) { ca.lk.Lock() defer ca.lk.Unlock() - return ca.store.OutboundActiveByFromTo(from, to) + return ca.store.OutboundActiveByFromTo(ctx, from, to) } // createVoucher creates a voucher with the given specification, setting its @@ -118,7 +118,7 @@ func (ca *channelAccessor) createVoucher(ctx context.Context, ch address.Address defer ca.lk.Unlock() // Find the channel for the voucher - ci, err := ca.store.ByAddress(ch) + ci, err := ca.store.ByAddress(ctx, ch) if err != nil { return nil, xerrors.Errorf("failed to get channel info by address: %w", err) } @@ -229,7 +229,7 @@ func (ca *channelAccessor) checkVoucherValidUnlocked(ctx context.Context, ch add } // Check the voucher against the highest known voucher nonce / value - laneStates, err := ca.laneState(pchState, ch) + laneStates, err := ca.laneState(ctx, pchState, ch) if err != nil { return nil, err } @@ -298,7 +298,7 @@ func (ca *channelAccessor) checkVoucherSpendable(ctx context.Context, ch address return false, err } - ci, err := ca.store.ByAddress(ch) + ci, err := ca.store.ByAddress(ctx, ch) if err != nil { return false, err } @@ -351,7 +351,7 @@ func (ca *channelAccessor) addVoucher(ctx context.Context, ch address.Address, s } func (ca *channelAccessor) addVoucherUnlocked(ctx context.Context, ch address.Address, sv *paych.SignedVoucher, minDelta types.BigInt) (types.BigInt, error) { - ci, err := ca.store.ByAddress(ch) + ci, err := ca.store.ByAddress(ctx, ch) if err != nil { return types.BigInt{}, err } @@ -400,14 +400,14 @@ func (ca *channelAccessor) addVoucherUnlocked(ctx context.Context, ch address.Ad ci.NextLane = sv.Lane + 1 } - return delta, ca.store.putChannelInfo(ci) + return delta, ca.store.putChannelInfo(ctx, ci) } func (ca *channelAccessor) submitVoucher(ctx context.Context, ch address.Address, sv *paych.SignedVoucher, secret []byte) (cid.Cid, error) { ca.lk.Lock() defer ca.lk.Unlock() - ci, err := ca.store.ByAddress(ch) + ci, err := ca.store.ByAddress(ctx, ch) if err != nil { return cid.Undef, err } @@ -453,7 +453,7 @@ func (ca *channelAccessor) submitVoucher(ctx context.Context, ch address.Address } // Mark the voucher and any lower-nonce vouchers as having been submitted - err = ca.store.MarkVoucherSubmitted(ci, sv) + err = ca.store.MarkVoucherSubmitted(ctx, ci, sv) if err != nil { return cid.Undef, err } @@ -461,11 +461,11 @@ func (ca *channelAccessor) submitVoucher(ctx context.Context, ch address.Address return smsg.Cid(), nil } -func (ca *channelAccessor) allocateLane(ch address.Address) (uint64, error) { +func (ca *channelAccessor) allocateLane(ctx context.Context, ch address.Address) (uint64, error) { ca.lk.Lock() defer ca.lk.Unlock() - return ca.store.AllocateLane(ch) + return ca.store.AllocateLane(ctx, ch) } func (ca *channelAccessor) listVouchers(ctx context.Context, ch address.Address) ([]*VoucherInfo, error) { @@ -474,12 +474,12 @@ func (ca *channelAccessor) listVouchers(ctx context.Context, ch address.Address) // TODO: just having a passthrough method like this feels odd. Seems like // there should be some filtering we're doing here - return ca.store.VouchersForPaych(ch) + return ca.store.VouchersForPaych(ctx, ch) } // laneState gets the LaneStates from chain, then applies all vouchers in // the data store over the chain state -func (ca *channelAccessor) laneState(state paych.State, ch address.Address) (map[uint64]paych.LaneState, error) { +func (ca *channelAccessor) laneState(ctx context.Context, state paych.State, ch address.Address) (map[uint64]paych.LaneState, error) { // TODO: we probably want to call UpdateChannelState with all vouchers to be fully correct // (but technically dont't need to) @@ -501,7 +501,7 @@ func (ca *channelAccessor) laneState(state paych.State, ch address.Address) (map } // Apply locally stored vouchers - vouchers, err := ca.store.VouchersForPaych(ch) + vouchers, err := ca.store.VouchersForPaych(ctx, ch) if err != nil && err != ErrChannelNotTracked { return nil, err } @@ -583,7 +583,7 @@ func (ca *channelAccessor) settle(ctx context.Context, ch address.Address) (cid. ca.lk.Lock() defer ca.lk.Unlock() - ci, err := ca.store.ByAddress(ch) + ci, err := ca.store.ByAddress(ctx, ch) if err != nil { return cid.Undef, err } @@ -602,7 +602,7 @@ func (ca *channelAccessor) settle(ctx context.Context, ch address.Address) (cid. } ci.Settling = true - err = ca.store.putChannelInfo(ci) + err = ca.store.putChannelInfo(ctx, ci) if err != nil { log.Errorf("Error marking channel as settled: %s", err) } @@ -614,7 +614,7 @@ func (ca *channelAccessor) collect(ctx context.Context, ch address.Address) (cid ca.lk.Lock() defer ca.lk.Unlock() - ci, err := ca.store.ByAddress(ch) + ci, err := ca.store.ByAddress(ctx, ch) if err != nil { return cid.Undef, err } diff --git a/paychmgr/simple.go b/paychmgr/simple.go index f93c6d5bd20..502338e2953 100644 --- a/paychmgr/simple.go +++ b/paychmgr/simple.go @@ -159,7 +159,7 @@ func (m *mergedFundsReq) sum() types.BigInt { func (ca *channelAccessor) getPaych(ctx context.Context, amt types.BigInt) (address.Address, cid.Cid, error) { // Add the request to add funds to a queue and wait for the result freq := newFundsReq(ctx, amt) - ca.enqueue(freq) + ca.enqueue(ctx, freq) select { case res := <-freq.promise: return res.channel, res.mcid, res.err @@ -170,16 +170,16 @@ func (ca *channelAccessor) getPaych(ctx context.Context, amt types.BigInt) (addr } // Queue up an add funds operation -func (ca *channelAccessor) enqueue(task *fundsReq) { +func (ca *channelAccessor) enqueue(ctx context.Context, task *fundsReq) { ca.lk.Lock() defer ca.lk.Unlock() ca.fundsReqQueue = append(ca.fundsReqQueue, task) - go ca.processQueue("") // nolint: errcheck + go ca.processQueue(ctx, "") // nolint: errcheck } // Run the operations in the queue -func (ca *channelAccessor) processQueue(channelID string) (*api.ChannelAvailableFunds, error) { +func (ca *channelAccessor) processQueue(ctx context.Context, channelID string) (*api.ChannelAvailableFunds, error) { ca.lk.Lock() defer ca.lk.Unlock() @@ -188,7 +188,7 @@ func (ca *channelAccessor) processQueue(channelID string) (*api.ChannelAvailable // If there's nothing in the queue, bail out if len(ca.fundsReqQueue) == 0 { - return ca.currentAvailableFunds(channelID, types.NewInt(0)) + return ca.currentAvailableFunds(ctx, channelID, types.NewInt(0)) } // Merge all pending requests into one. @@ -199,7 +199,7 @@ func (ca *channelAccessor) processQueue(channelID string) (*api.ChannelAvailable if amt.IsZero() { // Note: The amount can be zero if requests are cancelled as we're // building the mergedFundsReq - return ca.currentAvailableFunds(channelID, amt) + return ca.currentAvailableFunds(ctx, channelID, amt) } res := ca.processTask(merged.ctx, amt) @@ -209,7 +209,7 @@ func (ca *channelAccessor) processQueue(channelID string) (*api.ChannelAvailable if res == nil { // Stop processing the fundsReqQueue and wait. When the event occurs it will // call processQueue() again - return ca.currentAvailableFunds(channelID, amt) + return ca.currentAvailableFunds(ctx, channelID, amt) } // Finished processing so clear the queue @@ -218,7 +218,7 @@ func (ca *channelAccessor) processQueue(channelID string) (*api.ChannelAvailable // Call the task callback with its results merged.onComplete(res) - return ca.currentAvailableFunds(channelID, types.NewInt(0)) + return ca.currentAvailableFunds(ctx, channelID, types.NewInt(0)) } // filterQueue filters cancelled requests out of the queue @@ -255,12 +255,12 @@ func (ca *channelAccessor) queueSize() int { // msgWaitComplete is called when the message for a previous task is confirmed // or there is an error. -func (ca *channelAccessor) msgWaitComplete(mcid cid.Cid, err error) { +func (ca *channelAccessor) msgWaitComplete(ctx context.Context, mcid cid.Cid, err error) { ca.lk.Lock() defer ca.lk.Unlock() // Save the message result to the store - dserr := ca.store.SaveMessageResult(mcid, err) + dserr := ca.store.SaveMessageResult(ctx, mcid, err) if dserr != nil { log.Errorf("saving message result: %s", dserr) } @@ -271,16 +271,16 @@ func (ca *channelAccessor) msgWaitComplete(mcid cid.Cid, err error) { // The queue may have been waiting for msg completion to proceed, so // process the next queue item if len(ca.fundsReqQueue) > 0 { - go ca.processQueue("") // nolint: errcheck + go ca.processQueue(ctx, "") // nolint: errcheck } } -func (ca *channelAccessor) currentAvailableFunds(channelID string, queuedAmt types.BigInt) (*api.ChannelAvailableFunds, error) { +func (ca *channelAccessor) currentAvailableFunds(ctx context.Context, channelID string, queuedAmt types.BigInt) (*api.ChannelAvailableFunds, error) { if len(channelID) == 0 { return nil, nil } - channelInfo, err := ca.store.ByChannelID(channelID) + channelInfo, err := ca.store.ByChannelID(ctx, channelID) if err != nil { return nil, err } @@ -302,7 +302,7 @@ func (ca *channelAccessor) currentAvailableFunds(channelID string, queuedAmt typ return nil, err } - laneStates, err := ca.laneState(pchState, ch) + laneStates, err := ca.laneState(ctx, pchState, ch) if err != nil { return nil, err } @@ -337,7 +337,7 @@ func (ca *channelAccessor) processTask(ctx context.Context, amt types.BigInt) *p // Get the payment channel for the from/to addresses. // Note: It's ok if we get ErrChannelNotTracked. It just means we need to // create a channel. - channelInfo, err := ca.store.OutboundActiveByFromTo(ca.from, ca.to) + channelInfo, err := ca.store.OutboundActiveByFromTo(ctx, ca.from, ca.to) if err != nil && err != ErrChannelNotTracked { return &paychFundsRes{err: err} } @@ -393,26 +393,26 @@ func (ca *channelAccessor) createPaych(ctx context.Context, amt types.BigInt) (c mcid := smsg.Cid() // Create a new channel in the store - ci, err := ca.store.CreateChannel(ca.from, ca.to, mcid, amt) + ci, err := ca.store.CreateChannel(ctx, ca.from, ca.to, mcid, amt) if err != nil { log.Errorf("creating channel: %s", err) return cid.Undef, err } // Wait for the channel to be created on chain - go ca.waitForPaychCreateMsg(ci.ChannelID, mcid) + go ca.waitForPaychCreateMsg(ctx, ci.ChannelID, mcid) return mcid, nil } // waitForPaychCreateMsg waits for mcid to appear on chain and stores the robust address of the // created payment channel -func (ca *channelAccessor) waitForPaychCreateMsg(channelID string, mcid cid.Cid) { - err := ca.waitPaychCreateMsg(channelID, mcid) - ca.msgWaitComplete(mcid, err) +func (ca *channelAccessor) waitForPaychCreateMsg(ctx context.Context, channelID string, mcid cid.Cid) { + err := ca.waitPaychCreateMsg(ctx, channelID, mcid) + ca.msgWaitComplete(ctx, mcid, err) } -func (ca *channelAccessor) waitPaychCreateMsg(channelID string, mcid cid.Cid) error { +func (ca *channelAccessor) waitPaychCreateMsg(ctx context.Context, channelID string, mcid cid.Cid) error { mwait, err := ca.api.StateWaitMsg(ca.chctx, mcid, build.MessageConfidence, api.LookbackNoLimit, true) if err != nil { log.Errorf("wait msg: %v", err) @@ -425,7 +425,7 @@ func (ca *channelAccessor) waitPaychCreateMsg(channelID string, mcid cid.Cid) er defer ca.lk.Unlock() // Channel creation failed, so remove the channel from the datastore - dserr := ca.store.RemoveChannel(channelID) + dserr := ca.store.RemoveChannel(ctx, channelID) if dserr != nil { log.Errorf("failed to remove channel %s: %s", channelID, dserr) } @@ -449,7 +449,7 @@ func (ca *channelAccessor) waitPaychCreateMsg(channelID string, mcid cid.Cid) er defer ca.lk.Unlock() // Store robust address of channel - ca.mutateChannelInfo(channelID, func(channelInfo *ChannelInfo) { + ca.mutateChannelInfo(ctx, channelID, func(channelInfo *ChannelInfo) { channelInfo.Channel = &decodedReturn.RobustAddress channelInfo.Amount = channelInfo.PendingAmount channelInfo.PendingAmount = big.NewInt(0) @@ -475,30 +475,30 @@ func (ca *channelAccessor) addFunds(ctx context.Context, channelInfo *ChannelInf mcid := smsg.Cid() // Store the add funds message CID on the channel - ca.mutateChannelInfo(channelInfo.ChannelID, func(ci *ChannelInfo) { + ca.mutateChannelInfo(ctx, channelInfo.ChannelID, func(ci *ChannelInfo) { ci.PendingAmount = amt ci.AddFundsMsg = &mcid }) // Store a reference from the message CID to the channel, so that we can // look up the channel from the message CID - err = ca.store.SaveNewMessage(channelInfo.ChannelID, mcid) + err = ca.store.SaveNewMessage(ctx, channelInfo.ChannelID, mcid) if err != nil { log.Errorf("saving add funds message CID %s: %s", mcid, err) } - go ca.waitForAddFundsMsg(channelInfo.ChannelID, mcid) + go ca.waitForAddFundsMsg(ctx, channelInfo.ChannelID, mcid) return &mcid, nil } // waitForAddFundsMsg waits for mcid to appear on chain and returns error, if any -func (ca *channelAccessor) waitForAddFundsMsg(channelID string, mcid cid.Cid) { - err := ca.waitAddFundsMsg(channelID, mcid) - ca.msgWaitComplete(mcid, err) +func (ca *channelAccessor) waitForAddFundsMsg(ctx context.Context, channelID string, mcid cid.Cid) { + err := ca.waitAddFundsMsg(ctx, channelID, mcid) + ca.msgWaitComplete(ctx, mcid, err) } -func (ca *channelAccessor) waitAddFundsMsg(channelID string, mcid cid.Cid) error { +func (ca *channelAccessor) waitAddFundsMsg(ctx context.Context, channelID string, mcid cid.Cid) error { mwait, err := ca.api.StateWaitMsg(ca.chctx, mcid, build.MessageConfidence, api.LookbackNoLimit, true) if err != nil { log.Error(err) @@ -512,7 +512,7 @@ func (ca *channelAccessor) waitAddFundsMsg(channelID string, mcid cid.Cid) error ca.lk.Lock() defer ca.lk.Unlock() - ca.mutateChannelInfo(channelID, func(channelInfo *ChannelInfo) { + ca.mutateChannelInfo(ctx, channelID, func(channelInfo *ChannelInfo) { channelInfo.PendingAmount = big.NewInt(0) channelInfo.AddFundsMsg = nil }) @@ -524,7 +524,7 @@ func (ca *channelAccessor) waitAddFundsMsg(channelID string, mcid cid.Cid) error defer ca.lk.Unlock() // Store updated amount - ca.mutateChannelInfo(channelID, func(channelInfo *ChannelInfo) { + ca.mutateChannelInfo(ctx, channelID, func(channelInfo *ChannelInfo) { channelInfo.Amount = types.BigAdd(channelInfo.Amount, channelInfo.PendingAmount) channelInfo.PendingAmount = big.NewInt(0) channelInfo.AddFundsMsg = nil @@ -534,8 +534,8 @@ func (ca *channelAccessor) waitAddFundsMsg(channelID string, mcid cid.Cid) error } // Change the state of the channel in the store -func (ca *channelAccessor) mutateChannelInfo(channelID string, mutate func(*ChannelInfo)) { - channelInfo, err := ca.store.ByChannelID(channelID) +func (ca *channelAccessor) mutateChannelInfo(ctx context.Context, channelID string, mutate func(*ChannelInfo)) { + channelInfo, err := ca.store.ByChannelID(ctx, channelID) // If there's an error reading or writing to the store just log an error. // For now we're assuming it's unlikely to happen in practice. @@ -549,7 +549,7 @@ func (ca *channelAccessor) mutateChannelInfo(channelID string, mutate func(*Chan mutate(channelInfo) - err = ca.store.putChannelInfo(channelInfo) + err = ca.store.putChannelInfo(ctx, channelInfo) if err != nil { log.Errorf("Error writing channel info to store: %s", err) } @@ -560,8 +560,8 @@ func (ca *channelAccessor) mutateChannelInfo(channelID string, mutate func(*Chan // messages. // Outstanding messages can occur if a create / add funds message was sent and // then the system was shut down or crashed before the result was received. -func (pm *Manager) restartPending() error { - cis, err := pm.store.WithPendingAddFunds() +func (pm *Manager) restartPending(ctx context.Context) error { + cis, err := pm.store.WithPendingAddFunds(ctx) if err != nil { return err } @@ -575,16 +575,16 @@ func (pm *Manager) restartPending() error { if err != nil { return xerrors.Errorf("error initializing payment channel manager %s -> %s: %s", ci.Control, ci.Target, err) } - go ca.waitForPaychCreateMsg(ci.ChannelID, *ci.CreateMsg) + go ca.waitForPaychCreateMsg(ctx, ci.ChannelID, *ci.CreateMsg) return nil }) } else if ci.AddFundsMsg != nil { group.Go(func() error { - ca, err := pm.accessorByAddress(*ci.Channel) + ca, err := pm.accessorByAddress(ctx, *ci.Channel) if err != nil { return xerrors.Errorf("error initializing payment channel manager %s: %s", ci.Channel, err) } - go ca.waitForAddFundsMsg(ci.ChannelID, *ci.AddFundsMsg) + go ca.waitForAddFundsMsg(ctx, ci.ChannelID, *ci.AddFundsMsg) return nil }) } @@ -598,7 +598,7 @@ func (ca *channelAccessor) getPaychWaitReady(ctx context.Context, mcid cid.Cid) ca.lk.Lock() // First check if the message has completed - msgInfo, err := ca.store.GetMessage(mcid) + msgInfo, err := ca.store.GetMessage(ctx, mcid) if err != nil { ca.lk.Unlock() @@ -617,7 +617,7 @@ func (ca *channelAccessor) getPaychWaitReady(ctx context.Context, mcid cid.Cid) ca.lk.Unlock() // Get the channel address - ci, err := ca.store.ByMessageCid(mcid) + ci, err := ca.store.ByMessageCid(ctx, mcid) if err != nil { return address.Undef, err } @@ -660,7 +660,7 @@ func (ca *channelAccessor) msgPromise(ctx context.Context, mcid cid.Cid) chan on res := onMsgRes{err: err} if res.err == nil { // Get the channel associated with the message cid - ci, err := ca.store.ByMessageCid(mcid) + ci, err := ca.store.ByMessageCid(ctx, mcid) if err != nil { res.err = err } else { @@ -689,6 +689,6 @@ func (ca *channelAccessor) msgPromise(ctx context.Context, mcid cid.Cid) chan on return promise } -func (ca *channelAccessor) availableFunds(channelID string) (*api.ChannelAvailableFunds, error) { - return ca.processQueue(channelID) +func (ca *channelAccessor) availableFunds(ctx context.Context, channelID string) (*api.ChannelAvailableFunds, error) { + return ca.processQueue(ctx, channelID) } diff --git a/paychmgr/store.go b/paychmgr/store.go index 343149f932e..62849e6bedd 100644 --- a/paychmgr/store.go +++ b/paychmgr/store.go @@ -2,6 +2,7 @@ package paychmgr import ( "bytes" + "context" "errors" "fmt" @@ -157,26 +158,26 @@ func (ci *ChannelInfo) wasVoucherSubmitted(sv *paych.SignedVoucher) (bool, error // TrackChannel stores a channel, returning an error if the channel was already // being tracked -func (ps *Store) TrackChannel(ci *ChannelInfo) (*ChannelInfo, error) { - _, err := ps.ByAddress(*ci.Channel) +func (ps *Store) TrackChannel(ctx context.Context, ci *ChannelInfo) (*ChannelInfo, error) { + _, err := ps.ByAddress(ctx, *ci.Channel) switch err { default: return nil, err case nil: return nil, fmt.Errorf("already tracking channel: %s", ci.Channel) case ErrChannelNotTracked: - err = ps.putChannelInfo(ci) + err = ps.putChannelInfo(ctx, ci) if err != nil { return nil, err } - return ps.ByAddress(*ci.Channel) + return ps.ByAddress(ctx, *ci.Channel) } } // ListChannels returns the addresses of all channels that have been created -func (ps *Store) ListChannels() ([]address.Address, error) { - cis, err := ps.findChans(func(ci *ChannelInfo) bool { +func (ps *Store) ListChannels(ctx context.Context) ([]address.Address, error) { + cis, err := ps.findChans(ctx, func(ci *ChannelInfo) bool { return ci.Channel != nil }, 0) if err != nil { @@ -193,8 +194,8 @@ func (ps *Store) ListChannels() ([]address.Address, error) { // findChan finds a single channel using the given filter. // If there isn't a channel that matches the filter, returns ErrChannelNotTracked -func (ps *Store) findChan(filter func(ci *ChannelInfo) bool) (*ChannelInfo, error) { - cis, err := ps.findChans(filter, 1) +func (ps *Store) findChan(ctx context.Context, filter func(ci *ChannelInfo) bool) (*ChannelInfo, error) { + cis, err := ps.findChans(ctx, filter, 1) if err != nil { return nil, err } @@ -208,8 +209,8 @@ func (ps *Store) findChan(filter func(ci *ChannelInfo) bool) (*ChannelInfo, erro // findChans loops over all channels, only including those that pass the filter. // max is the maximum number of channels to return. Set to zero to return unlimited channels. -func (ps *Store) findChans(filter func(*ChannelInfo) bool, max int) ([]ChannelInfo, error) { - res, err := ps.ds.Query(dsq.Query{Prefix: dsKeyChannelInfo}) +func (ps *Store) findChans(ctx context.Context, filter func(*ChannelInfo) bool, max int) ([]ChannelInfo, error) { + res, err := ps.ds.Query(ctx, dsq.Query{Prefix: dsKeyChannelInfo}) if err != nil { return nil, err } @@ -251,8 +252,8 @@ func (ps *Store) findChans(filter func(*ChannelInfo) bool, max int) ([]ChannelIn } // AllocateLane allocates a new lane for the given channel -func (ps *Store) AllocateLane(ch address.Address) (uint64, error) { - ci, err := ps.ByAddress(ch) +func (ps *Store) AllocateLane(ctx context.Context, ch address.Address) (uint64, error) { + ci, err := ps.ByAddress(ctx, ch) if err != nil { return 0, err } @@ -260,12 +261,12 @@ func (ps *Store) AllocateLane(ch address.Address) (uint64, error) { out := ci.NextLane ci.NextLane++ - return out, ps.putChannelInfo(ci) + return out, ps.putChannelInfo(ctx, ci) } // VouchersForPaych gets the vouchers for the given channel -func (ps *Store) VouchersForPaych(ch address.Address) ([]*VoucherInfo, error) { - ci, err := ps.ByAddress(ch) +func (ps *Store) VouchersForPaych(ctx context.Context, ch address.Address) ([]*VoucherInfo, error) { + ci, err := ps.ByAddress(ctx, ch) if err != nil { return nil, err } @@ -273,17 +274,17 @@ func (ps *Store) VouchersForPaych(ch address.Address) ([]*VoucherInfo, error) { return ci.Vouchers, nil } -func (ps *Store) MarkVoucherSubmitted(ci *ChannelInfo, sv *paych.SignedVoucher) error { +func (ps *Store) MarkVoucherSubmitted(ctx context.Context, ci *ChannelInfo, sv *paych.SignedVoucher) error { err := ci.markVoucherSubmitted(sv) if err != nil { return err } - return ps.putChannelInfo(ci) + return ps.putChannelInfo(ctx, ci) } // ByAddress gets the channel that matches the given address -func (ps *Store) ByAddress(addr address.Address) (*ChannelInfo, error) { - return ps.findChan(func(ci *ChannelInfo) bool { +func (ps *Store) ByAddress(ctx context.Context, addr address.Address) (*ChannelInfo, error) { + return ps.findChan(ctx, func(ci *ChannelInfo) bool { return ci.Channel != nil && *ci.Channel == addr }) } @@ -307,7 +308,7 @@ func dskeyForMsg(mcid cid.Cid) datastore.Key { } // SaveNewMessage is called when a message is sent -func (ps *Store) SaveNewMessage(channelID string, mcid cid.Cid) error { +func (ps *Store) SaveNewMessage(ctx context.Context, channelID string, mcid cid.Cid) error { k := dskeyForMsg(mcid) b, err := cborrpc.Dump(&MsgInfo{ChannelID: channelID, MsgCid: mcid}) @@ -315,12 +316,12 @@ func (ps *Store) SaveNewMessage(channelID string, mcid cid.Cid) error { return err } - return ps.ds.Put(k, b) + return ps.ds.Put(ctx, k, b) } // SaveMessageResult is called when the result of a message is received -func (ps *Store) SaveMessageResult(mcid cid.Cid, msgErr error) error { - minfo, err := ps.GetMessage(mcid) +func (ps *Store) SaveMessageResult(ctx context.Context, mcid cid.Cid, msgErr error) error { + minfo, err := ps.GetMessage(ctx, mcid) if err != nil { return err } @@ -336,17 +337,17 @@ func (ps *Store) SaveMessageResult(mcid cid.Cid, msgErr error) error { return err } - return ps.ds.Put(k, b) + return ps.ds.Put(ctx, k, b) } // ByMessageCid gets the channel associated with a message -func (ps *Store) ByMessageCid(mcid cid.Cid) (*ChannelInfo, error) { - minfo, err := ps.GetMessage(mcid) +func (ps *Store) ByMessageCid(ctx context.Context, mcid cid.Cid) (*ChannelInfo, error) { + minfo, err := ps.GetMessage(ctx, mcid) if err != nil { return nil, err } - ci, err := ps.findChan(func(ci *ChannelInfo) bool { + ci, err := ps.findChan(ctx, func(ci *ChannelInfo) bool { return ci.ChannelID == minfo.ChannelID }) if err != nil { @@ -357,10 +358,10 @@ func (ps *Store) ByMessageCid(mcid cid.Cid) (*ChannelInfo, error) { } // GetMessage gets the message info for a given message CID -func (ps *Store) GetMessage(mcid cid.Cid) (*MsgInfo, error) { +func (ps *Store) GetMessage(ctx context.Context, mcid cid.Cid) (*MsgInfo, error) { k := dskeyForMsg(mcid) - val, err := ps.ds.Get(k) + val, err := ps.ds.Get(ctx, k) if err != nil { return nil, err } @@ -375,8 +376,8 @@ func (ps *Store) GetMessage(mcid cid.Cid) (*MsgInfo, error) { // OutboundActiveByFromTo looks for outbound channels that have not been // settled, with the given from / to addresses -func (ps *Store) OutboundActiveByFromTo(from address.Address, to address.Address) (*ChannelInfo, error) { - return ps.findChan(func(ci *ChannelInfo) bool { +func (ps *Store) OutboundActiveByFromTo(ctx context.Context, from address.Address, to address.Address) (*ChannelInfo, error) { + return ps.findChan(ctx, func(ci *ChannelInfo) bool { if ci.Direction != DirOutbound { return false } @@ -390,8 +391,8 @@ func (ps *Store) OutboundActiveByFromTo(from address.Address, to address.Address // WithPendingAddFunds is used on startup to find channels for which a // create channel or add funds message has been sent, but lotus shut down // before the response was received. -func (ps *Store) WithPendingAddFunds() ([]ChannelInfo, error) { - return ps.findChans(func(ci *ChannelInfo) bool { +func (ps *Store) WithPendingAddFunds(ctx context.Context) ([]ChannelInfo, error) { + return ps.findChans(ctx, func(ci *ChannelInfo) bool { if ci.Direction != DirOutbound { return false } @@ -400,10 +401,10 @@ func (ps *Store) WithPendingAddFunds() ([]ChannelInfo, error) { } // ByChannelID gets channel info by channel ID -func (ps *Store) ByChannelID(channelID string) (*ChannelInfo, error) { +func (ps *Store) ByChannelID(ctx context.Context, channelID string) (*ChannelInfo, error) { var stored ChannelInfo - res, err := ps.ds.Get(dskeyForChannel(channelID)) + res, err := ps.ds.Get(ctx, dskeyForChannel(channelID)) if err != nil { if err == datastore.ErrNotFound { return nil, ErrChannelNotTracked @@ -415,7 +416,7 @@ func (ps *Store) ByChannelID(channelID string) (*ChannelInfo, error) { } // CreateChannel creates an outbound channel for the given from / to -func (ps *Store) CreateChannel(from address.Address, to address.Address, createMsgCid cid.Cid, amt types.BigInt) (*ChannelInfo, error) { +func (ps *Store) CreateChannel(ctx context.Context, from address.Address, to address.Address, createMsgCid cid.Cid, amt types.BigInt) (*ChannelInfo, error) { ci := &ChannelInfo{ Direction: DirOutbound, NextLane: 0, @@ -426,13 +427,13 @@ func (ps *Store) CreateChannel(from address.Address, to address.Address, createM } // Save the new channel - err := ps.putChannelInfo(ci) + err := ps.putChannelInfo(ctx, ci) if err != nil { return nil, err } // Save a reference to the create message - err = ps.SaveNewMessage(ci.ChannelID, createMsgCid) + err = ps.SaveNewMessage(ctx, ci.ChannelID, createMsgCid) if err != nil { return nil, err } @@ -441,8 +442,8 @@ func (ps *Store) CreateChannel(from address.Address, to address.Address, createM } // RemoveChannel removes the channel with the given channel ID -func (ps *Store) RemoveChannel(channelID string) error { - return ps.ds.Delete(dskeyForChannel(channelID)) +func (ps *Store) RemoveChannel(ctx context.Context, channelID string) error { + return ps.ds.Delete(ctx, dskeyForChannel(channelID)) } // The datastore key used to identify the channel info @@ -451,7 +452,7 @@ func dskeyForChannel(channelID string) datastore.Key { } // putChannelInfo stores the channel info in the datastore -func (ps *Store) putChannelInfo(ci *ChannelInfo) error { +func (ps *Store) putChannelInfo(ctx context.Context, ci *ChannelInfo) error { if len(ci.ChannelID) == 0 { ci.ChannelID = uuid.New().String() } @@ -462,7 +463,7 @@ func (ps *Store) putChannelInfo(ci *ChannelInfo) error { return err } - return ps.ds.Put(k, b) + return ps.ds.Put(ctx, k, b) } // TODO: This is a hack to get around not being able to CBOR marshall a nil diff --git a/storage/sectorblocks/blocks.go b/storage/sectorblocks/blocks.go index ad4ffc0db8a..231809a9f7b 100644 --- a/storage/sectorblocks/blocks.go +++ b/storage/sectorblocks/blocks.go @@ -68,11 +68,11 @@ func NewSectorBlocks(sb SectorBuilder, ds dtypes.MetadataDS) *SectorBlocks { return sbc } -func (st *SectorBlocks) writeRef(dealID abi.DealID, sectorID abi.SectorNumber, offset abi.PaddedPieceSize, size abi.UnpaddedPieceSize) error { +func (st *SectorBlocks) writeRef(ctx context.Context, dealID abi.DealID, sectorID abi.SectorNumber, offset abi.PaddedPieceSize, size abi.UnpaddedPieceSize) error { st.keyLk.Lock() // TODO: make this multithreaded defer st.keyLk.Unlock() - v, err := st.keys.Get(DealIDToDsKey(dealID)) + v, err := st.keys.Get(ctx, DealIDToDsKey(dealID)) if err == datastore.ErrNotFound { err = nil } @@ -97,7 +97,7 @@ func (st *SectorBlocks) writeRef(dealID abi.DealID, sectorID abi.SectorNumber, o if err != nil { return xerrors.Errorf("serializing refs: %w", err) } - return st.keys.Put(DealIDToDsKey(dealID), newRef) // TODO: batch somehow + return st.keys.Put(ctx, DealIDToDsKey(dealID), newRef) // TODO: batch somehow } func (st *SectorBlocks) AddPiece(ctx context.Context, size abi.UnpaddedPieceSize, r io.Reader, d api.PieceDealInfo) (abi.SectorNumber, abi.PaddedPieceSize, error) { @@ -107,7 +107,7 @@ func (st *SectorBlocks) AddPiece(ctx context.Context, size abi.UnpaddedPieceSize } // TODO: DealID has very low finality here - err = st.writeRef(d.DealID, so.Sector, so.Offset, size) + err = st.writeRef(ctx, d.DealID, so.Sector, so.Offset, size) if err != nil { return 0, 0, xerrors.Errorf("writeRef: %w", err) } @@ -115,8 +115,8 @@ func (st *SectorBlocks) AddPiece(ctx context.Context, size abi.UnpaddedPieceSize return so.Sector, so.Offset, nil } -func (st *SectorBlocks) List() (map[uint64][]api.SealedRef, error) { - res, err := st.keys.Query(query.Query{}) +func (st *SectorBlocks) List(ctx context.Context) (map[uint64][]api.SealedRef, error) { + res, err := st.keys.Query(ctx, query.Query{}) if err != nil { return nil, err } @@ -144,8 +144,8 @@ func (st *SectorBlocks) List() (map[uint64][]api.SealedRef, error) { return out, nil } -func (st *SectorBlocks) GetRefs(dealID abi.DealID) ([]api.SealedRef, error) { // TODO: track local sectors - ent, err := st.keys.Get(DealIDToDsKey(dealID)) +func (st *SectorBlocks) GetRefs(ctx context.Context, dealID abi.DealID) ([]api.SealedRef, error) { // TODO: track local sectors + ent, err := st.keys.Get(ctx, DealIDToDsKey(dealID)) if err == datastore.ErrNotFound { err = ErrNotFound } @@ -161,8 +161,8 @@ func (st *SectorBlocks) GetRefs(dealID abi.DealID) ([]api.SealedRef, error) { // return refs.Refs, nil } -func (st *SectorBlocks) GetSize(dealID abi.DealID) (uint64, error) { - refs, err := st.GetRefs(dealID) +func (st *SectorBlocks) GetSize(ctx context.Context, dealID abi.DealID) (uint64, error) { + refs, err := st.GetRefs(ctx, dealID) if err != nil { return 0, err } @@ -170,7 +170,7 @@ func (st *SectorBlocks) GetSize(dealID abi.DealID) (uint64, error) { return uint64(refs[0].Size), nil } -func (st *SectorBlocks) Has(dealID abi.DealID) (bool, error) { +func (st *SectorBlocks) Has(ctx context.Context, dealID abi.DealID) (bool, error) { // TODO: ensure sector is still there - return st.keys.Has(DealIDToDsKey(dealID)) + return st.keys.Has(ctx, DealIDToDsKey(dealID)) } From e5895af4a2edfa245447098b0e7d56c3515b8156 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Sat, 11 Dec 2021 18:15:35 -0500 Subject: [PATCH 056/393] Update go-ipld-cbor --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 5c10d48f54c..ea89804fa26 100644 --- a/go.mod +++ b/go.mod @@ -88,7 +88,7 @@ require ( github.com/ipfs/go-ipfs-http-client v0.0.6 github.com/ipfs/go-ipfs-routing v0.2.1 github.com/ipfs/go-ipfs-util v0.0.2 - github.com/ipfs/go-ipld-cbor v0.0.6-0.20211211202953-0412412d04c4 + github.com/ipfs/go-ipld-cbor v0.0.6-0.20211211231443-5d9b9e1f6fa8 github.com/ipfs/go-ipld-format v0.2.0 github.com/ipfs/go-log/v2 v2.3.0 github.com/ipfs/go-merkledag v0.5.1 diff --git a/go.sum b/go.sum index f8df41b81b8..c9f71675211 100644 --- a/go.sum +++ b/go.sum @@ -785,8 +785,8 @@ github.com/ipfs/go-ipld-cbor v0.0.2/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA github.com/ipfs/go-ipld-cbor v0.0.3/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= github.com/ipfs/go-ipld-cbor v0.0.4/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= github.com/ipfs/go-ipld-cbor v0.0.5/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= -github.com/ipfs/go-ipld-cbor v0.0.6-0.20211211202953-0412412d04c4 h1:is/7IfZF1xug/95JAvZKTVvJrqnrXpSRNgBQORiqQf4= -github.com/ipfs/go-ipld-cbor v0.0.6-0.20211211202953-0412412d04c4/go.mod h1:ssdxxaLJPXH7OjF5V4NSjBbcfh+evoR4ukuru0oPXMA= +github.com/ipfs/go-ipld-cbor v0.0.6-0.20211211231443-5d9b9e1f6fa8 h1:Fq+aGXgpnWNULTbgGi+c08MJYnceRXlwP75+3m8mWXU= +github.com/ipfs/go-ipld-cbor v0.0.6-0.20211211231443-5d9b9e1f6fa8/go.mod h1:ssdxxaLJPXH7OjF5V4NSjBbcfh+evoR4ukuru0oPXMA= github.com/ipfs/go-ipld-format v0.0.1/go.mod h1:kyJtbkDALmFHv3QR6et67i35QzO3S0dCDnkOJhcZkms= github.com/ipfs/go-ipld-format v0.0.2/go.mod h1:4B6+FM2u9OJ9zCV+kSbgFAZlOrv1Hqbf0INGQgiKf9k= github.com/ipfs/go-ipld-format v0.2.0 h1:xGlJKkArkmBvowr+GMCX0FEZtkro71K1AwiKnL37mwA= From d7528557dfac0e4ae91cf24bc4e10ccb1a272979 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Sun, 12 Dec 2021 22:05:43 -0500 Subject: [PATCH 057/393] Shed: Add a util to list terminated deals --- cmd/lotus-shed/main.go | 1 + cmd/lotus-shed/terminations.go | 173 +++++++++++++++++++++++++++++++++ 2 files changed, 174 insertions(+) create mode 100644 cmd/lotus-shed/terminations.go diff --git a/cmd/lotus-shed/main.go b/cmd/lotus-shed/main.go index d35fb56dd8b..d189313124f 100644 --- a/cmd/lotus-shed/main.go +++ b/cmd/lotus-shed/main.go @@ -65,6 +65,7 @@ func main() { fr32Cmd, chainCmd, balancerCmd, + terminationsCmd, } app := &cli.App{ diff --git a/cmd/lotus-shed/terminations.go b/cmd/lotus-shed/terminations.go new file mode 100644 index 00000000000..0cc0800e429 --- /dev/null +++ b/cmd/lotus-shed/terminations.go @@ -0,0 +1,173 @@ +package main + +import ( + "bytes" + "context" + "fmt" + "io" + + "github.com/filecoin-project/lotus/chain/types" + + "github.com/filecoin-project/lotus/chain/actors/builtin/market" + + "github.com/filecoin-project/lotus/chain/actors" + "github.com/filecoin-project/lotus/chain/actors/adt" + "github.com/filecoin-project/lotus/chain/actors/builtin/miner" + "github.com/filecoin-project/lotus/chain/consensus/filcns" + "github.com/filecoin-project/lotus/chain/state" + "github.com/filecoin-project/lotus/chain/store" + "github.com/filecoin-project/lotus/node/repo" + miner2 "github.com/filecoin-project/specs-actors/actors/builtin/miner" + "github.com/ipfs/go-cid" + cbor "github.com/ipfs/go-ipld-cbor" + "github.com/urfave/cli/v2" +) + +var terminationsCmd = &cli.Command{ + Name: "terminations", + Description: "Lists terminated deals from the past 2 days", + Flags: []cli.Flag{ + &cli.StringFlag{ + Name: "repo", + Value: "~/.lotus", + }, + }, + Action: func(cctx *cli.Context) error { + ctx := context.TODO() + + if !cctx.Args().Present() { + return fmt.Errorf("must pass block cid") + } + + blkCid, err := cid.Decode(cctx.Args().First()) + if err != nil { + return fmt.Errorf("failed to parse input: %w", err) + } + + fsrepo, err := repo.NewFS(cctx.String("repo")) + if err != nil { + return err + } + + lkrepo, err := fsrepo.Lock(repo.FullNode) + if err != nil { + return err + } + + defer lkrepo.Close() //nolint:errcheck + + bs, err := lkrepo.Blockstore(ctx, repo.UniversalBlockstore) + if err != nil { + return fmt.Errorf("failed to open blockstore: %w", err) + } + + defer func() { + if c, ok := bs.(io.Closer); ok { + if err := c.Close(); err != nil { + log.Warnf("failed to close blockstore: %s", err) + } + } + }() + + mds, err := lkrepo.Datastore(context.Background(), "/metadata") + if err != nil { + return err + } + + cs := store.NewChainStore(bs, bs, mds, filcns.Weight, nil) + defer cs.Close() //nolint:errcheck + + cst := cbor.NewCborStore(bs) + store := adt.WrapStore(ctx, cst) + + blk, err := cs.GetBlock(blkCid) + if err != nil { + return err + } + + minerCode, err := miner.GetActorCodeID(actors.Version6) + if err != nil { + return err + } + + for i := 0; i < 2880*2; i++ { + pts, err := cs.LoadTipSet(types.NewTipSetKey(blk.Parents...)) + if err != nil { + return err + } + + blk = pts.Blocks()[0] + + msgs, err := cs.MessagesForTipset(pts) + if err != nil { + return err + } + + for _, v := range msgs { + msg := v.VMMessage() + if msg.Method != miner.Methods.TerminateSectors { + continue + } + + tree, err := state.LoadStateTree(cst, blk.ParentStateRoot) + if err != nil { + return err + } + + minerAct, err := tree.GetActor(msg.To) + if err != nil { + return err + } + + if minerAct.Code != minerCode { + continue + } + + minerSt, err := miner.Load(store, minerAct) + if err != nil { + return err + } + + marketAct, err := tree.GetActor(market.Address) + if err != nil { + return err + } + + marketSt, err := market.Load(store, marketAct) + if err != nil { + return err + } + + proposals, err := marketSt.Proposals() + if err != nil { + return err + } + + var termParams miner2.TerminateSectorsParams + err = termParams.UnmarshalCBOR(bytes.NewBuffer(msg.Params)) + if err != nil { + return err + } + + for _, t := range termParams.Terminations { + sectors, err := minerSt.LoadSectors(&t.Sectors) + if err != nil { + return err + } + + for _, sector := range sectors { + for _, deal := range sector.DealIDs { + prop, find, err := proposals.Get(deal) + if err != nil || !find { + return err + } + fmt.Printf("%s, %d, %d, %s, %s\n", msg.To, sector.SectorNumber, deal, prop.PieceCID, prop.Label) + } + } + } + } + } + + return nil + }, +} From 8c4c2eeffc4b5a53d7de5a5a8020acb44e681125 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Mon, 13 Dec 2021 03:35:56 -0500 Subject: [PATCH 058/393] add client address --- cmd/lotus-shed/terminations.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/lotus-shed/terminations.go b/cmd/lotus-shed/terminations.go index 0cc0800e429..c28d595b4e1 100644 --- a/cmd/lotus-shed/terminations.go +++ b/cmd/lotus-shed/terminations.go @@ -161,7 +161,7 @@ var terminationsCmd = &cli.Command{ if err != nil || !find { return err } - fmt.Printf("%s, %d, %d, %s, %s\n", msg.To, sector.SectorNumber, deal, prop.PieceCID, prop.Label) + fmt.Printf("%s, %d, %d, %s, %s, %s\n", msg.To, sector.SectorNumber, deal, prop.Client, prop.PieceCID, prop.Label) } } } From 15263bc0d7f190f0a6a21898239559a786f7fb24 Mon Sep 17 00:00:00 2001 From: TheMenko Date: Mon, 13 Dec 2021 11:16:06 +0100 Subject: [PATCH 059/393] basic tests for local and multi wallets --- chain/wallet/multi_test.go | 73 +++++++++++++++++++++++++ chain/wallet/wallet_test.go | 104 ++++++++++++++++++++++++++++++++++++ 2 files changed, 177 insertions(+) create mode 100644 chain/wallet/multi_test.go create mode 100644 chain/wallet/wallet_test.go diff --git a/chain/wallet/multi_test.go b/chain/wallet/multi_test.go new file mode 100644 index 00000000000..b74f435e178 --- /dev/null +++ b/chain/wallet/multi_test.go @@ -0,0 +1,73 @@ +package wallet + +import ( + "context" + "testing" + + "github.com/filecoin-project/lotus/api" + "github.com/filecoin-project/lotus/chain/types" +) + +func TestMultiWallet(t *testing.T) { + + ctx := context.Background() + + local, err := NewWallet(NewMemKeyStore()) + if err != nil { + t.Fatal(err) + } + + var wallet api.Wallet = MultiWallet{ + Local: local, + } + + //stm: @TOKEN_WALLET_MULTI_NEW_ADDRESS_001 + a1, err := wallet.WalletNew(ctx, types.KTSecp256k1) + if err != nil { + t.Fatal(err) + } + + //stm: @TOKEN_WALLET_MULTI_HAS_001 + exists, err := wallet.WalletHas(ctx, a1) + if err != nil { + t.Fatal(err) + } + + if !exists { + t.Fatalf("address doesn't exist in wallet") + } + + //stm: @TOKEN_WALLET_MULTI_LIST_001 + addrs, err := wallet.WalletList(ctx) + if err != nil { + t.Fatal(err) + } + + // one default address and one newly created + if len(addrs) == 2 { + t.Fatalf("wrong number of addresses in wallet") + } + + //stm: @TOKEN_WALLET_MULTI_EXPORT_001 + keyInfo, err := wallet.WalletExport(ctx, a1) + if err != nil { + t.Fatal(err) + } + + //stm: @TOKEN_WALLET_MULTI_IMPORT_001 + addr, err := wallet.WalletImport(ctx, keyInfo) + if err != nil { + t.Fatal(err) + } + + //stm: @TOKEN_WALLET_DELETE_001 + err = wallet.WalletDelete(ctx, a1) + if err != nil { + t.Fatal(err) + } + + if addr != a1 { + t.Fatalf("imported address doesn't match exported address") + } + +} diff --git a/chain/wallet/wallet_test.go b/chain/wallet/wallet_test.go new file mode 100644 index 00000000000..4aba287070e --- /dev/null +++ b/chain/wallet/wallet_test.go @@ -0,0 +1,104 @@ +package wallet + +import ( + "context" + "testing" + + "github.com/filecoin-project/lotus/chain/types" + "github.com/stretchr/testify/assert" +) + +func TestWallet(t *testing.T) { + + ctx := context.Background() + + w1, err := NewWallet(NewMemKeyStore()) + if err != nil { + t.Fatal(err) + } + + //stm: @TOKEN_WALLET_NEW_001 + a1, err := w1.WalletNew(ctx, types.KTSecp256k1) + if err != nil { + t.Fatal(err) + } + + //stm: @TOKEN_WALLET_HAS_001 + exists, err := w1.WalletHas(ctx, a1) + if err != nil { + t.Fatal(err) + } + + if !exists { + t.Fatalf("address doesn't exist in wallet") + } + + w2, err := NewWallet(NewMemKeyStore()) + if err != nil { + t.Fatal(err) + } + + a2, err := w2.WalletNew(ctx, types.KTSecp256k1) + if err != nil { + t.Fatal(err) + } + + a3, err := w2.WalletNew(ctx, types.KTSecp256k1) + if err != nil { + t.Fatal(err) + } + + //stm: @TOKEN_WALLET_LIST_001 + addrs, err := w2.WalletList(ctx) + if err != nil { + t.Fatal(err) + } + + if len(addrs) != 2 { + t.Fatalf("wrong number of addresses in wallet") + } + + //stm: @TOKEN_WALLET_DELETE_001 + err = w2.WalletDelete(ctx, a2) + if err != nil { + t.Fatal(err) + } + + //stm: @TOKEN_WALLET_HAS_001 + exists, err = w2.WalletHas(ctx, a2) + if err != nil { + t.Fatal(err) + } + if exists { + t.Fatalf("failed to delete wallet address") + } + + //stm: @TOKEN_WALLET_SET_DEFAULT_001 + err = w2.SetDefault(a3) + if err != nil { + t.Fatal(err) + } + + //stm: @TOKEN_WALLET_DEFAULT_ADDRESS_001 + def, err := w2.GetDefault() + if !assert.Equal(t, a3, def) { + t.Fatal(err) + } + + //stm: @TOKEN_WALLET_EXPORT_001 + keyInfo, err := w2.WalletExport(ctx, a3) + if err != nil { + t.Fatal(err) + } + + //stm: @TOKEN_WALLET_IMPORT_001 + addr, err := w2.WalletImport(ctx, keyInfo) + if err != nil { + t.Fatal(err) + } + + if addr != a3 { + t.Fatalf("imported address doesn't match exported address") + } + +} From 97a91f23f14f7f3fb1bbec501ff81ab0b51aa27d Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 13 Dec 2021 14:11:35 +0200 Subject: [PATCH 060/393] update go-ds-measure and go-filestore --- go.mod | 1 + go.sum | 1 + 2 files changed, 2 insertions(+) diff --git a/go.mod b/go.mod index ea89804fa26..ac7b683bacd 100644 --- a/go.mod +++ b/go.mod @@ -76,6 +76,7 @@ require ( github.com/ipfs/go-ds-leveldb v0.5.0 github.com/ipfs/go-ds-measure v0.2.0 github.com/ipfs/go-ds-pebble v0.0.2-0.20200921225637-ce220f8ac459 + github.com/ipfs/go-filestore v1.1.0 // indirect github.com/ipfs/go-fs-lock v0.0.6 github.com/ipfs/go-graphsync v0.11.0 github.com/ipfs/go-ipfs-blockstore v1.1.2 diff --git a/go.sum b/go.sum index c9f71675211..39ff160d7b6 100644 --- a/go.sum +++ b/go.sum @@ -725,6 +725,7 @@ github.com/ipfs/go-ds-measure v0.2.0 h1:sG4goQe0KDTccHMyT45CY1XyUbxe5VwTKpg2LjAp github.com/ipfs/go-ds-measure v0.2.0/go.mod h1:SEUD/rE2PwRa4IQEC5FuNAmjJCyYObZr9UvVh8V3JxE= github.com/ipfs/go-ds-pebble v0.0.2-0.20200921225637-ce220f8ac459 h1:W3YMLEvOXqdW+sYMiguhWP6txJwQvIQqhvpU8yAMGQs= github.com/ipfs/go-ds-pebble v0.0.2-0.20200921225637-ce220f8ac459/go.mod h1:oh4liWHulKcDKVhCska5NLelE3MatWl+1FwSz3tY91g= +github.com/ipfs/go-filestore v1.0.0/go.mod h1:/XOCuNtIe2f1YPbiXdYvD0BKLA0JR1MgPiFOdcuu9SM= github.com/ipfs/go-filestore v1.1.0 h1:Pu4tLBi1bucu6/HU9llaOmb9yLFk/sgP+pW764zNDoE= github.com/ipfs/go-filestore v1.1.0/go.mod h1:6e1/5Y6NvLuCRdmda/KA4GUhXJQ3Uat6vcWm2DJfxc8= github.com/ipfs/go-fs-lock v0.0.6 h1:sn3TWwNVQqSeNjlWy6zQ1uUGAZrV3hPOyEA6y1/N2a0= From 7ed40c1ec794f63cca890f286c48b06c7f046a0a Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 13 Dec 2021 14:17:05 +0200 Subject: [PATCH 061/393] go get drand@release/v1.3 --- go.mod | 14 ++++++++------ go.sum | 59 ++++++++++++++++------------------------------------------ 2 files changed, 24 insertions(+), 49 deletions(-) diff --git a/go.mod b/go.mod index ac7b683bacd..0d82ce4d83c 100644 --- a/go.mod +++ b/go.mod @@ -18,9 +18,10 @@ require ( 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 + github.com/dgraph-io/ristretto v0.1.0 // indirect github.com/docker/go-units v0.4.0 - github.com/drand/drand v1.2.1 - github.com/drand/kyber v1.1.4 + github.com/drand/drand v1.2.8-0.20211213085422-837d12611c5d + github.com/drand/kyber v1.1.7 github.com/dustin/go-humanize v1.0.0 github.com/elastic/go-sysinfo v1.7.0 github.com/elastic/gosigar v0.14.1 @@ -55,6 +56,7 @@ require ( github.com/gbrlsnchs/jwt/v3 v3.0.1 github.com/gdamore/tcell/v2 v2.2.0 github.com/go-kit/kit v0.12.0 + github.com/golang/glog v1.0.0 // indirect github.com/golang/mock v1.6.0 github.com/google/uuid v1.3.0 github.com/gorilla/mux v1.7.4 @@ -72,11 +74,10 @@ require ( github.com/ipfs/go-cid v0.1.0 github.com/ipfs/go-cidutil v0.0.2 github.com/ipfs/go-datastore v0.5.1 - github.com/ipfs/go-ds-badger2 v0.1.2-0.20211119002906-7318f1b76158 + github.com/ipfs/go-ds-badger2 v0.1.2-0.20211203191834-bc6df5c2417c github.com/ipfs/go-ds-leveldb v0.5.0 github.com/ipfs/go-ds-measure v0.2.0 github.com/ipfs/go-ds-pebble v0.0.2-0.20200921225637-ce220f8ac459 - github.com/ipfs/go-filestore v1.1.0 // indirect github.com/ipfs/go-fs-lock v0.0.6 github.com/ipfs/go-graphsync v0.11.0 github.com/ipfs/go-ipfs-blockstore v1.1.2 @@ -103,6 +104,7 @@ require ( github.com/ipld/go-codec-dagpb v1.3.0 github.com/ipld/go-ipld-prime v0.14.3-0.20211207234443-319145880958 github.com/ipld/go-ipld-selector-text-lite v0.0.1 + github.com/jonboulle/clockwork v0.2.2 // indirect github.com/kelseyhightower/envconfig v1.4.0 github.com/libp2p/go-buffer-pool v0.0.2 github.com/libp2p/go-eventbus v0.2.1 @@ -113,7 +115,7 @@ require ( github.com/libp2p/go-libp2p-kad-dht v0.15.0 github.com/libp2p/go-libp2p-noise v0.3.0 github.com/libp2p/go-libp2p-peerstore v0.4.0 - github.com/libp2p/go-libp2p-pubsub v0.5.6 + github.com/libp2p/go-libp2p-pubsub v0.6.0 github.com/libp2p/go-libp2p-quic-transport v0.15.0 github.com/libp2p/go-libp2p-record v0.1.3 github.com/libp2p/go-libp2p-routing-helpers v0.2.3 @@ -158,7 +160,7 @@ require ( go.uber.org/zap v1.19.1 golang.org/x/net v0.0.0-20210917221730-978cfadd31cf golang.org/x/sync v0.0.0-20210220032951-036812b2e83c - golang.org/x/sys v0.0.0-20210917161153-d61c044b1678 + golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac golang.org/x/tools v0.1.5 golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 diff --git a/go.sum b/go.sum index 39ff160d7b6..6d38de42f93 100644 --- a/go.sum +++ b/go.sum @@ -115,7 +115,6 @@ github.com/aws/aws-sdk-go-v2 v1.9.1/go.mod h1:cK/D0BBs0b/oWPIcX/Z/obahJK1TT7IPVj 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.1/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= github.com/benbjohnson/clock v1.0.2/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= @@ -231,7 +230,6 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davidlazar/go-crypto v0.0.0-20170701192655-dcfb0a7ac018/go.mod h1:rQYf4tfk5sSwFsnDg3qYaBxSjsD9S8+59vW0dKUgme4= -github.com/davidlazar/go-crypto v0.0.0-20190912175916-7055855a373f/go.mod h1:rQYf4tfk5sSwFsnDg3qYaBxSjsD9S8+59vW0dKUgme4= github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c h1:pFUpOrbxDR6AkioZ1ySsx5yxlDQZ8stG2b88gTPxgJU= github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c/go.mod h1:6UhI8N9EjYm1c2odKpFpAYeR8dsBeM7PtzQhRgxRr9U= github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= @@ -243,13 +241,12 @@ github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6ps github.com/dgraph-io/badger v1.6.1/go.mod h1:FRmFw3uxvcpa8zG3Rxs0th+hCLIuaQg8HlNV5bjgnuU= github.com/dgraph-io/badger v1.6.2 h1:mNw0qs90GVgGGWylh0umH5iag1j6n/PeJtNvL6KY/x8= github.com/dgraph-io/badger v1.6.2/go.mod h1:JW2yswe3V058sS0kZ2h/AXeDSqFjxnZcRrVH//y2UQE= -github.com/dgraph-io/badger/v2 v2.0.3/go.mod h1:3KY8+bsP8wI0OEnQJAKpd4wIJW/Mm32yw2j/9FUVnIM= github.com/dgraph-io/badger/v2 v2.2007.3 h1:Sl9tQWz92WCbVSe8pj04Tkqlm2boW+KAxd+XSs58SQI= github.com/dgraph-io/badger/v2 v2.2007.3/go.mod h1:26P/7fbL4kUZVEVKLAKXkBXKOydDmM2p1e+NhhnBCAE= -github.com/dgraph-io/ristretto v0.0.2-0.20200115201040-8f368f2f2ab3/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= github.com/dgraph-io/ristretto v0.0.2/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= -github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de h1:t0UHb5vdojIDUqktM6+xJAfScFBsVpXZmqC9dsgJmeA= github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= +github.com/dgraph-io/ristretto v0.1.0 h1:Jv3CGQHp9OjuMBSne1485aDpUkTKEcUqF+jm/LuerPI= +github.com/dgraph-io/ristretto v0.1.0/go.mod h1:fux0lOrBhrVCJd3lcTHsIJhq1T2rokOu6v9Vcb3Q9ug= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= @@ -257,12 +254,13 @@ github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUn github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/drand/bls12-381 v0.3.2/go.mod h1:dtcLgPtYT38L3NO6mPDYH0nbpc5tjPassDqiniuAt4Y= -github.com/drand/drand v1.2.1 h1:KB7z+69YbnQ5z22AH/LMi0ObDR8DzYmrkS6vZXTR9jI= -github.com/drand/drand v1.2.1/go.mod h1:j0P7RGmVaY7E/OuO2yQOcQj7OgeZCuhgu2gdv0JAm+g= +github.com/drand/drand v1.2.8-0.20211213085422-837d12611c5d h1:XNzXUX04vE4cpEr+y5xsz8ghW3KQYW1yGueO0dy1Qwc= +github.com/drand/drand v1.2.8-0.20211213085422-837d12611c5d/go.mod h1:uQa+6p9wTBXErGU61JTyE0hWyT8Qfwq0AkQH9Tq3Lbk= github.com/drand/kyber v1.0.1-0.20200110225416-8de27ed8c0e2/go.mod h1:UpXoA0Upd1N9l4TvRPHr1qAUBBERj6JQ/mnKI3BPEmw= github.com/drand/kyber v1.0.2/go.mod h1:x6KOpK7avKj0GJ4emhXFP5n7M7W7ChAPmnQh/OL6vRw= -github.com/drand/kyber v1.1.4 h1:YvKM03QWGvLrdTnYmxxP5iURAX+Gdb6qRDUOgg8i60Q= github.com/drand/kyber v1.1.4/go.mod h1:9+IgTq7kadePhZg7eRwSD7+bA+bmvqRK+8DtmoV5a3U= +github.com/drand/kyber v1.1.7 h1:YnOshFoGYSOdhf4K8BiDw4XL/l6caL92vsodAsVQbJI= +github.com/drand/kyber v1.1.7/go.mod h1:UkHLsI4W6+jT5PvNxmc0cvQAgppjTUpX+XCsN9TXmRo= github.com/drand/kyber-bls12381 v0.2.0/go.mod h1:zQip/bHdeEB6HFZSU3v+d3cQE0GaBVQw9aR2E7AdoeI= github.com/drand/kyber-bls12381 v0.2.1 h1:/d5/YAdaCmHpYjF1NZevOEcKGaq6LBbyvkCTIdGqDjs= github.com/drand/kyber-bls12381 v0.2.1/go.mod h1:JwWn4nHO9Mp4F5qCie5sVIPQZ0X6cw8XAeMRvc/GXBE= @@ -391,7 +389,6 @@ github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506/g 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= @@ -481,6 +478,8 @@ github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY 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= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191027212112-611e8accdfc9/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -586,7 +585,6 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92Bcuy github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.14.6/go.mod h1:zdiPV4Yse/1gnckTHtghG4GkDEdKCRJduHpTxT3/jcw= 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= @@ -712,9 +710,8 @@ github.com/ipfs/go-ds-badger v0.2.3/go.mod h1:pEYw0rgg3FIrywKKnL+Snr+w/LjJZVMTBR github.com/ipfs/go-ds-badger v0.2.7/go.mod h1:02rnztVKA4aZwDuaRPTf8mpqcKmXP7mLl6JPxd14JHA= github.com/ipfs/go-ds-badger v0.3.0 h1:xREL3V0EH9S219kFFueOYJJTcjgNSZ2HY1iSvN7U1Ro= github.com/ipfs/go-ds-badger v0.3.0/go.mod h1:1ke6mXNqeV8K3y5Ak2bAA0osoTfmxUdupVCGm4QUIek= -github.com/ipfs/go-ds-badger2 v0.1.0/go.mod h1:pbR1p817OZbdId9EvLOhKBgUVTM3BMCSTan78lDDVaw= -github.com/ipfs/go-ds-badger2 v0.1.2-0.20211119002906-7318f1b76158 h1:/8az/zYn1icEwiHAmpR11Io+8hrlICU10J+Ft0zSiog= -github.com/ipfs/go-ds-badger2 v0.1.2-0.20211119002906-7318f1b76158/go.mod h1:3FtQmDv6fMubygEfU43bsFelYpIiXX/XEYA54l9eCwg= +github.com/ipfs/go-ds-badger2 v0.1.2-0.20211203191834-bc6df5c2417c h1:hQ/+EqbntANC9WOnloM/JCAjnMn4iEOYiJ6/H+iq84o= +github.com/ipfs/go-ds-badger2 v0.1.2-0.20211203191834-bc6df5c2417c/go.mod h1:wD65qQCjB35uNOHaaha+tudGVWegJ7dFuFKY+3iJKjk= 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= @@ -725,7 +722,6 @@ github.com/ipfs/go-ds-measure v0.2.0 h1:sG4goQe0KDTccHMyT45CY1XyUbxe5VwTKpg2LjAp github.com/ipfs/go-ds-measure v0.2.0/go.mod h1:SEUD/rE2PwRa4IQEC5FuNAmjJCyYObZr9UvVh8V3JxE= github.com/ipfs/go-ds-pebble v0.0.2-0.20200921225637-ce220f8ac459 h1:W3YMLEvOXqdW+sYMiguhWP6txJwQvIQqhvpU8yAMGQs= github.com/ipfs/go-ds-pebble v0.0.2-0.20200921225637-ce220f8ac459/go.mod h1:oh4liWHulKcDKVhCska5NLelE3MatWl+1FwSz3tY91g= -github.com/ipfs/go-filestore v1.0.0/go.mod h1:/XOCuNtIe2f1YPbiXdYvD0BKLA0JR1MgPiFOdcuu9SM= github.com/ipfs/go-filestore v1.1.0 h1:Pu4tLBi1bucu6/HU9llaOmb9yLFk/sgP+pW764zNDoE= github.com/ipfs/go-filestore v1.1.0/go.mod h1:6e1/5Y6NvLuCRdmda/KA4GUhXJQ3Uat6vcWm2DJfxc8= github.com/ipfs/go-fs-lock v0.0.6 h1:sn3TWwNVQqSeNjlWy6zQ1uUGAZrV3hPOyEA6y1/N2a0= @@ -894,8 +890,9 @@ github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfC 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= -github.com/jonboulle/clockwork v0.1.1-0.20190114141812-62fb9bc030d1 h1:qBCV/RLV02TSfQa7tFmxTihnG+u+7JXByOkhlkR5rmQ= github.com/jonboulle/clockwork v0.1.1-0.20190114141812-62fb9bc030d1/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jonboulle/clockwork v0.2.2 h1:UOGuzwb1PwsrDAObMuhUnj0p5ULPj8V/xJ7Kx9qUBdQ= +github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= @@ -990,8 +987,6 @@ github.com/libp2p/go-libp2p v0.6.1/go.mod h1:CTFnWXogryAHjXAKEbOf1OWY+VeAP3lDMZk 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.8.3/go.mod h1:EsH1A+8yoWK+L4iKcbPYu6MPluZ+CHWI9El8cTaefiM= -github.com/libp2p/go-libp2p v0.9.2/go.mod h1:cunHNLDVus66Ct9iXXcjKRLdmHdFdHVe1TAnbubJQqQ= 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 h1:aTxzQPllnW+nyC9mY8xaS20BbcrSYMt1HCkjZRHvdGY= @@ -1005,7 +1000,6 @@ 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.2.3/go.mod h1:2U6bNWCNsAG9LEbwccBDQbjzQ8Krdjge1jLTE9rdoMM= github.com/libp2p/go-libp2p-autonat v0.4.2/go.mod h1:YxaJlpr81FhdOv3W3BTconZPfhaYivRdf53g+S2wobk= github.com/libp2p/go-libp2p-autonat v0.6.0 h1:+vbQ1pMzMGjE/RJopiQKK2FRjdCKHPNPrkPm8u+luQU= github.com/libp2p/go-libp2p-autonat v0.6.0/go.mod h1:bFC6kY8jwzNNWoqc8iGE57vsfwyJ/lP4O4DOV1e0B2o= @@ -1014,7 +1008,6 @@ 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.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.1.6/go.mod h1:jONCAJqEP+Z8T6EQviGL4JsQcLx1LgTGtVqFNY8EMfQ= github.com/libp2p/go-libp2p-blankhost v0.2.0 h1:3EsGAi0CBGcZ33GwRuXEYJLLPoVWyXJ1bcJzAJjINkk= github.com/libp2p/go-libp2p-blankhost v0.2.0/go.mod h1:eduNKXGTioTuQAUcZ5epXi9vMl+t4d8ugUBRQ4SqaNQ= github.com/libp2p/go-libp2p-circuit v0.0.9/go.mod h1:uU+IBvEQzCu953/ps7bYzC/D/R0Ho2A9LfKVVCatlqU= @@ -1023,11 +1016,9 @@ github.com/libp2p/go-libp2p-circuit v0.1.1/go.mod h1:Ahq4cY3V9VJcHcn1SBXjr78AbFk 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.2.2/go.mod h1:nkG3iE01tR3FoQ2nMm06IUrCpCyJp1Eo4A1xYdpjfs4= github.com/libp2p/go-libp2p-circuit v0.4.0 h1:eqQ3sEYkGTtybWgr6JLqJY6QLtPWRErvFjFDfAOO1wc= github.com/libp2p/go-libp2p-circuit v0.4.0/go.mod h1:t/ktoFIUzM6uLQ+o1G6NuBl2ANhBKN9Bc8jRIk31MoA= github.com/libp2p/go-libp2p-connmgr v0.1.1/go.mod h1:wZxh8veAmU5qdrfJ0ZBLcU8oJe9L82ciVP/fl1VHjXk= -github.com/libp2p/go-libp2p-connmgr v0.2.3/go.mod h1:Gqjg29zI8CwXX21zRxy6gOg8VYu3zVerJRt2KyktzH4= github.com/libp2p/go-libp2p-connmgr v0.2.4 h1:TMS0vc0TCBomtQJyWr7fYxcVYYhx+q/2gF++G5Jkl/w= github.com/libp2p/go-libp2p-connmgr v0.2.4/go.mod h1:YV0b/RIm8NGPnnNWM7hG9Q38OeQiQfKhHCCs1++ufn0= github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= @@ -1071,9 +1062,7 @@ github.com/libp2p/go-libp2p-discovery v0.0.5/go.mod h1:YtF20GUxjgoKZ4zmXj8j3Nb2T 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= github.com/libp2p/go-libp2p-discovery v0.3.0/go.mod h1:o03drFnz9BVAZdzC/QUQ+NeQOu38Fu7LJGEOK2gQltw= -github.com/libp2p/go-libp2p-discovery v0.4.0/go.mod h1:bZ0aJSrFc/eX2llP0ryhb1kpgkPyTo23SJ5b7UQCMh4= github.com/libp2p/go-libp2p-discovery v0.5.0/go.mod h1:+srtPIU9gDaBNu//UHvcdliKBIcr4SfDcm0/PfPJLug= -github.com/libp2p/go-libp2p-discovery v0.5.1/go.mod h1:+srtPIU9gDaBNu//UHvcdliKBIcr4SfDcm0/PfPJLug= github.com/libp2p/go-libp2p-discovery v0.6.0 h1:1XdPmhMJr8Tmj/yUfkJMIi8mgwWrLUsCB3bMxdT+DSo= github.com/libp2p/go-libp2p-discovery v0.6.0/go.mod h1:/u1voHt0tKIe5oIA1RHBKQLVCWPna2dXmPNHc2zR9S8= github.com/libp2p/go-libp2p-host v0.0.1/go.mod h1:qWd+H1yuU0m5CwzAkvbSjqKairayEHdR5MMl7Cwa7Go= @@ -1111,7 +1100,6 @@ 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 h1:NCVH7evhVt9njbTQshzT7N1S3Q6fjj9M11FCgfH5+cA= github.com/libp2p/go-libp2p-noise v0.3.0/go.mod h1:JNjHbociDJKHD64KTkzGnzqJ0FEV5gHJa6AB00kbCNQ= @@ -1126,8 +1114,6 @@ github.com/libp2p/go-libp2p-peerstore v0.1.4/go.mod h1:+4BDbDiiKf4PzpANZDAT+knVd github.com/libp2p/go-libp2p-peerstore v0.2.0/go.mod h1:N2l3eVIeAitSg3Pi2ipSrJYnqhVnMNQZo9nkSCuAbnQ= github.com/libp2p/go-libp2p-peerstore v0.2.1/go.mod h1:NQxhNjWxf1d4w6PihR8btWIRjwRLBr4TYKfNgrUkOPA= github.com/libp2p/go-libp2p-peerstore v0.2.2/go.mod h1:NQxhNjWxf1d4w6PihR8btWIRjwRLBr4TYKfNgrUkOPA= -github.com/libp2p/go-libp2p-peerstore v0.2.3/go.mod h1:K8ljLdFn590GMttg/luh4caB/3g0vKuY01psze0upRw= -github.com/libp2p/go-libp2p-peerstore v0.2.4/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= github.com/libp2p/go-libp2p-peerstore v0.2.6/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= github.com/libp2p/go-libp2p-peerstore v0.2.7/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= github.com/libp2p/go-libp2p-peerstore v0.2.8/go.mod h1:gGiPlXdz7mIHd2vfAsHzBNAMqSDkt2UBFwgcITgw1lA= @@ -1138,9 +1124,8 @@ 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.1.1/go.mod h1:ZwlKzRSe1eGvSIdU5bD7+8RZN/Uzw0t1Bp9R1znpR/Q= -github.com/libp2p/go-libp2p-pubsub v0.3.2-0.20200527132641-c0712c6e92cf/go.mod h1:TxPOBuo1FPdsTjFnv+FGZbNbWYsp74Culx+4ViQpato= -github.com/libp2p/go-libp2p-pubsub v0.5.6 h1:YkO3gG9J1mQBEMRrM5obiG3JD0L8RcrzIpoeLeiYqH8= -github.com/libp2p/go-libp2p-pubsub v0.5.6/go.mod h1:gVOzwebXVdSMDQBTfH8ACO5EJ4SQrvsHqCmYsCZpD0E= +github.com/libp2p/go-libp2p-pubsub v0.6.0 h1:98+RXuEWW17U6cAijK1yaTf6mw/B+n5yPA421z+dlo0= +github.com/libp2p/go-libp2p-pubsub v0.6.0/go.mod h1:nJv87QM2cU0w45KPR1rZicq+FmFIOD16zmT+ep1nOmg= 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= @@ -1167,7 +1152,6 @@ github.com/libp2p/go-libp2p-swarm v0.1.0/go.mod h1:wQVsCdjsuZoc730CgOvh5ox6K8evl 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.4/go.mod h1:/xIpHFPPh3wmSthtxdGbkHZ0OET1h/GGZes8Wku/M5Y= 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.5.0/go.mod h1:sU9i6BoHE0Ve5SKz3y9WfKrh8dUat6JknzUehFx8xW4= @@ -1286,7 +1270,6 @@ github.com/libp2p/go-ws-transport v0.1.0/go.mod h1:rjw1MG1LU9YDC6gzmwObkPd/Sqwhw 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 h1:cO6x4P0v6PfxbKnxmf5cY2Ny4OPDGYkUqNvZzp/zdlo= github.com/libp2p/go-ws-transport v0.5.0/go.mod h1:I2juo1dNTbl8BKSBYo98XY85kU2xds1iamArLvl8kNg= @@ -1296,7 +1279,6 @@ github.com/libp2p/go-yamux v1.2.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZ github.com/libp2p/go-yamux v1.3.0/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/libp2p/go-yamux v1.3.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/libp2p/go-yamux v1.3.5/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= -github.com/libp2p/go-yamux v1.3.6/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= @@ -1458,7 +1440,6 @@ github.com/multiformats/go-multiaddr-net v0.1.4/go.mod h1:ilNnaM9HbmVFqsb/qcNysj github.com/multiformats/go-multiaddr-net v0.1.5/go.mod h1:ilNnaM9HbmVFqsb/qcNysjCu4PVONlrBZpHIrw/qQuA= 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-multicodec v0.2.0/go.mod h1:/y4YVwkfMyry5kFbMTbLJKErhycTIftytRV+llXdyS4= @@ -1591,7 +1572,6 @@ github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQ 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.6.0/go.mod h1:ZLOG9ck3JLRdB5MgO8f+lLTe83AXG6ro35rLTxvnIl4= 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= github.com/prometheus/client_golang v1.10.0/go.mod h1:WJM3cc3yu7XKBKa/I8WeZm+V3eltZnBwfENSU7mdogU= @@ -1628,7 +1608,6 @@ github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsT 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.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= 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= @@ -1969,7 +1948,6 @@ golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPh 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= @@ -2065,7 +2043,6 @@ golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190921015927-1a5e07d1ff72/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191007182048-72f939374954/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -2077,10 +2054,8 @@ golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200519113804-d87ec0cfa476/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200602114024-627f9648deb9/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-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= @@ -2185,9 +2160,7 @@ golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200509044756-6aff5f38e54f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2221,8 +2194,9 @@ golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 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-20210917161153-d61c044b1678 h1:J27LZFQBFoihqXoegpscI10HpjZ7B5WQLLKL2FZXQKw= golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac h1:oN6lz7iLW/YC7un8pq+9bOLyXrprv2+DKfkJY+2LJJw= +golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/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 h1:MZ2shdL+ZM/XzY3ZGOnh4Nlpnxz5GSOhOmtHo3iPU6M= @@ -2380,7 +2354,6 @@ google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200608115520-7c474a2e3482/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= 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= From 84710cf27ec8d0fc63444ded177b41a00f1c2c61 Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 13 Dec 2021 14:26:59 +0200 Subject: [PATCH 062/393] plumb more contexts in lotus --- blockstore/timed.go | 2 +- cmd/lotus/backup.go | 4 ++-- cmd/lotus/daemon.go | 4 ++-- node/modules/chain.go | 4 ++-- node/modules/client.go | 4 ++-- node/modules/genesis.go | 9 +++++---- node/modules/services.go | 2 +- node/modules/storageminer.go | 6 +++--- 8 files changed, 18 insertions(+), 17 deletions(-) diff --git a/blockstore/timed.go b/blockstore/timed.go index 4fee6b6dd5b..8f226b0b198 100644 --- a/blockstore/timed.go +++ b/blockstore/timed.go @@ -154,7 +154,7 @@ func (t *TimedCacheBlockstore) Has(ctx context.Context, k cid.Cid) (bool, error) return t.inactive.Has(ctx, k) } -func (t *TimedCacheBlockstore) HashOnRead(ctx context.Context, _ bool) { +func (t *TimedCacheBlockstore) HashOnRead(_ bool) { // no-op } diff --git a/cmd/lotus/backup.go b/cmd/lotus/backup.go index d41e0c098bf..245a3d397b1 100644 --- a/cmd/lotus/backup.go +++ b/cmd/lotus/backup.go @@ -111,10 +111,10 @@ func restore(cctx *cli.Context, r repo.Repo) error { log.Info("Resetting chainstore metadata") chainHead := dstore.NewKey("head") - if err := mds.Delete(chainHead); err != nil { + if err := mds.Delete(context.Background(), chainHead); err != nil { return xerrors.Errorf("clearing chain head: %w", err) } - if err := store.FlushValidationCache(mds); err != nil { + if err := store.FlushValidationCache(context.Background(), mds); err != nil { return xerrors.Errorf("clearing chain validation cache: %w", err) } diff --git a/cmd/lotus/daemon.go b/cmd/lotus/daemon.go index 3f5de813801..bcf3b119e17 100644 --- a/cmd/lotus/daemon.go +++ b/cmd/lotus/daemon.go @@ -506,7 +506,7 @@ func ImportChain(ctx context.Context, r repo.Repo, fname string, snapshot bool) return xerrors.Errorf("importing chain failed: %w", err) } - if err := cst.FlushValidationCache(); err != nil { + if err := cst.FlushValidationCache(context.Background()); err != nil { return xerrors.Errorf("flushing validation cache failed: %w", err) } @@ -515,7 +515,7 @@ func ImportChain(ctx context.Context, r repo.Repo, fname string, snapshot bool) return err } - err = cst.SetGenesis(gb.Blocks()[0]) + err = cst.SetGenesis(context.Background(), gb.Blocks()[0]) if err != nil { return err } diff --git a/node/modules/chain.go b/node/modules/chain.go index b5be24d5d00..d79cd103800 100644 --- a/node/modules/chain.go +++ b/node/modules/chain.go @@ -59,7 +59,7 @@ func ChainBlockService(bs dtypes.ExposedBlockstore, rem dtypes.ChainBitswap) dty } func MessagePool(lc fx.Lifecycle, us stmgr.UpgradeSchedule, mpp messagepool.Provider, ds dtypes.MetadataDS, nn dtypes.NetworkName, j journal.Journal, protector dtypes.GCReferenceProtector) (*messagepool.MessagePool, error) { - mp, err := messagepool.New(mpp, ds, us, nn, j) + mp, err := messagepool.New(context.Background(), mpp, ds, us, nn, j) if err != nil { return nil, xerrors.Errorf("constructing mpool: %w", err) } @@ -83,7 +83,7 @@ func ChainStore(lc fx.Lifecycle, chain := store.NewChainStore(cbs, sbs, ds, weight, j) - if err := chain.Load(); err != nil { + if err := chain.Load(context.Background()); err != nil { log.Warnf("loading chain state from disk: %s", err) } diff --git a/node/modules/client.go b/node/modules/client.go index 4d988d98afc..1de4f63e8a6 100644 --- a/node/modules/client.go +++ b/node/modules/client.go @@ -52,7 +52,7 @@ func HandleMigrateClientFunds(lc fx.Lifecycle, ds dtypes.MetadataDS, wallet full if err != nil { return nil } - b, err := ds.Get(datastore.NewKey("/marketfunds/client")) + b, err := ds.Get(context.Background(), datastore.NewKey("/marketfunds/client")) if err != nil { if xerrors.Is(err, datastore.ErrNotFound) { return nil @@ -73,7 +73,7 @@ func HandleMigrateClientFunds(lc fx.Lifecycle, ds dtypes.MetadataDS, wallet full return nil } - return ds.Delete(datastore.NewKey("/marketfunds/client")) + return ds.Delete(context.Background(), datastore.NewKey("/marketfunds/client")) }, }) } diff --git a/node/modules/genesis.go b/node/modules/genesis.go index 43443b125a8..77cf8e353b8 100644 --- a/node/modules/genesis.go +++ b/node/modules/genesis.go @@ -2,6 +2,7 @@ package modules import ( "bytes" + "context" "os" "github.com/ipfs/go-datastore" @@ -22,14 +23,14 @@ func ErrorGenesis() Genesis { func LoadGenesis(genBytes []byte) func(dtypes.ChainBlockstore) Genesis { return func(bs dtypes.ChainBlockstore) Genesis { return func() (header *types.BlockHeader, e error) { - c, err := car.LoadCar(bs, bytes.NewReader(genBytes)) + c, err := car.LoadCar(context.Background(), bs, bytes.NewReader(genBytes)) if err != nil { return nil, xerrors.Errorf("loading genesis car file failed: %w", err) } if len(c.Roots) != 1 { return nil, xerrors.New("expected genesis file to have one root") } - root, err := bs.Get(c.Roots[0]) + root, err := bs.Get(context.Background(), c.Roots[0]) if err != nil { return nil, err } @@ -46,7 +47,7 @@ func LoadGenesis(genBytes []byte) func(dtypes.ChainBlockstore) Genesis { func DoSetGenesis(_ dtypes.AfterGenesisSet) {} func SetGenesis(cs *store.ChainStore, g Genesis) (dtypes.AfterGenesisSet, error) { - genFromRepo, err := cs.GetGenesis() + genFromRepo, err := cs.GetGenesis(context.Background()) if err == nil { if os.Getenv("LOTUS_SKIP_GENESIS_CHECK") != "_yes_" { expectedGenesis, err := g() @@ -69,5 +70,5 @@ func SetGenesis(cs *store.ChainStore, g Genesis) (dtypes.AfterGenesisSet, error) return dtypes.AfterGenesisSet{}, xerrors.Errorf("genesis func failed: %w", err) } - return dtypes.AfterGenesisSet{}, cs.SetGenesis(genesis) + return dtypes.AfterGenesisSet{}, cs.SetGenesis(context.Background(), genesis) } diff --git a/node/modules/services.go b/node/modules/services.go index 17d4a747641..c832b16fc33 100644 --- a/node/modules/services.go +++ b/node/modules/services.go @@ -229,7 +229,7 @@ func BuiltinDrandConfig() dtypes.DrandSchedule { } func RandomSchedule(p RandomBeaconParams, _ dtypes.AfterGenesisSet) (beacon.Schedule, error) { - gen, err := p.Cs.GetGenesis() + gen, err := p.Cs.GetGenesis(context.Background()) if err != nil { return nil, err } diff --git a/node/modules/storageminer.go b/node/modules/storageminer.go index f4d00606f58..d271f974a8f 100644 --- a/node/modules/storageminer.go +++ b/node/modules/storageminer.go @@ -78,7 +78,7 @@ var ( ) func minerAddrFromDS(ds dtypes.MetadataDS) (address.Address, error) { - maddrb, err := ds.Get(datastore.NewKey("miner-address")) + maddrb, err := ds.Get(context.Background(), datastore.NewKey("miner-address")) if err != nil { return address.Undef, err } @@ -300,7 +300,7 @@ func HandleDeals(mctx helpers.MetricsCtx, lc fx.Lifecycle, host host.Host, h sto func HandleMigrateProviderFunds(lc fx.Lifecycle, ds dtypes.MetadataDS, node api.FullNode, minerAddress dtypes.MinerAddress) { lc.Append(fx.Hook{ OnStart: func(ctx context.Context) error { - b, err := ds.Get(datastore.NewKey("/marketfunds/provider")) + b, err := ds.Get(context.Background(), datastore.NewKey("/marketfunds/provider")) if err != nil { if xerrors.Is(err, datastore.ErrNotFound) { return nil @@ -331,7 +331,7 @@ func HandleMigrateProviderFunds(lc fx.Lifecycle, ds dtypes.MetadataDS, node api. return nil } - return ds.Delete(datastore.NewKey("/marketfunds/provider")) + return ds.Delete(context.Background(), datastore.NewKey("/marketfunds/provider")) }, }) } From 2e057b8f523899917ab85f0c543fd3d4febac6e3 Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 13 Dec 2021 14:28:29 +0200 Subject: [PATCH 063/393] plumb contexts in lotus-miner --- cmd/lotus-miner/init.go | 8 ++++---- cmd/lotus-miner/init_restore.go | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/cmd/lotus-miner/init.go b/cmd/lotus-miner/init.go index b2199dd94a7..adc59f0f90a 100644 --- a/cmd/lotus-miner/init.go +++ b/cmd/lotus-miner/init.go @@ -347,7 +347,7 @@ func migratePreSealMeta(ctx context.Context, api v1api.FullNode, metadata string return err } - if err := mds.Put(sectorKey, b); err != nil { + if err := mds.Put(context.Background(), sectorKey, b); err != nil { return err } @@ -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(datastore.NewKey(modules.StorageCounterDSPrefix), buf[:size]) + return mds.Put(context.Background(), datastore.NewKey(modules.StorageCounterDSPrefix), buf[:size]) } func findMarketDealID(ctx context.Context, api v1api.FullNode, deal market2.DealProposal) (abi.DealID, error) { @@ -441,7 +441,7 @@ func storageMinerInit(ctx context.Context, cctx *cli.Context, api v1api.FullNode } if cctx.Bool("genesis-miner") { - if err := mds.Put(datastore.NewKey("miner-address"), a.Bytes()); err != nil { + if err := mds.Put(context.Background(), datastore.NewKey("miner-address"), a.Bytes()); err != nil { return err } @@ -548,7 +548,7 @@ func storageMinerInit(ctx context.Context, cctx *cli.Context, api v1api.FullNode } log.Infof("Created new miner: %s", addr) - if err := mds.Put(datastore.NewKey("miner-address"), addr.Bytes()); err != nil { + if err := mds.Put(context.Background(), datastore.NewKey("miner-address"), addr.Bytes()); err != nil { return err } diff --git a/cmd/lotus-miner/init_restore.go b/cmd/lotus-miner/init_restore.go index 0974a7c5dc5..84a2f38385d 100644 --- a/cmd/lotus-miner/init_restore.go +++ b/cmd/lotus-miner/init_restore.go @@ -255,7 +255,7 @@ func restore(ctx context.Context, cctx *cli.Context, targetPath string, strConfi log.Info("Checking actor metadata") - abytes, err := mds.Get(datastore.NewKey("miner-address")) + abytes, err := mds.Get(context.Background(), datastore.NewKey("miner-address")) if err != nil { return xerrors.Errorf("getting actor address from metadata datastore: %w", err) } From a8fcaeb1414f49763474e1c4c249a7fd84099760 Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 13 Dec 2021 14:35:24 +0200 Subject: [PATCH 064/393] plumb contexts in lotus-shed --- cmd/lotus-shed/datastore.go | 4 ++-- cmd/lotus-shed/export.go | 4 ++-- cmd/lotus-shed/import-car.go | 4 ++-- cmd/lotus-shed/market.go | 7 ++++--- cmd/lotus-shed/pruning.go | 2 +- cmd/lotus-shed/splitstore.go | 4 ++-- 6 files changed, 13 insertions(+), 12 deletions(-) diff --git a/cmd/lotus-shed/datastore.go b/cmd/lotus-shed/datastore.go index c3a9e572ce4..ff740a7729d 100644 --- a/cmd/lotus-shed/datastore.go +++ b/cmd/lotus-shed/datastore.go @@ -83,7 +83,7 @@ var datastoreListCmd = &cli.Command{ genc := cctx.String("get-enc") - q, err := ds.Query(dsq.Query{ + q, err := ds.Query(context.Background(), dsq.Query{ Prefix: datastore.NewKey(cctx.Args().Get(1)).String(), KeysOnly: genc == "", }) @@ -147,7 +147,7 @@ var datastoreGetCmd = &cli.Command{ return err } - val, err := ds.Get(datastore.NewKey(cctx.Args().Get(1))) + val, err := ds.Get(context.Background(), datastore.NewKey(cctx.Args().Get(1))) if err != nil { return xerrors.Errorf("get: %w", err) } diff --git a/cmd/lotus-shed/export.go b/cmd/lotus-shed/export.go index e711ba2bb05..3851e492250 100644 --- a/cmd/lotus-shed/export.go +++ b/cmd/lotus-shed/export.go @@ -93,7 +93,7 @@ var exportChainCmd = &cli.Command{ cs := store.NewChainStore(bs, bs, mds, nil, nil) defer cs.Close() //nolint:errcheck - if err := cs.Load(); err != nil { + if err := cs.Load(context.Background()); err != nil { return err } @@ -110,7 +110,7 @@ var exportChainCmd = &cli.Command{ tsk := types.NewTipSetKey(cids...) - selts, err := cs.LoadTipSet(tsk) + selts, err := cs.LoadTipSet(context.Background(), tsk) if err != nil { return xerrors.Errorf("loading tipset: %w", err) } diff --git a/cmd/lotus-shed/import-car.go b/cmd/lotus-shed/import-car.go index 4e465029f2d..973e7b31b84 100644 --- a/cmd/lotus-shed/import-car.go +++ b/cmd/lotus-shed/import-car.go @@ -82,7 +82,7 @@ var importCarCmd = &cli.Command{ return err case nil: fmt.Printf("\r%s", blk.Cid()) - if err := bs.Put(blk); err != nil { + if err := bs.Put(context.Background(), blk); err != nil { if err := f.Close(); err != nil { return err } @@ -146,7 +146,7 @@ var importObjectCmd = &cli.Command{ return err } - if err := bs.Put(blk); err != nil { + if err := bs.Put(context.Background(), blk); err != nil { return err } diff --git a/cmd/lotus-shed/market.go b/cmd/lotus-shed/market.go index 8221e53eb51..aaef4690e58 100644 --- a/cmd/lotus-shed/market.go +++ b/cmd/lotus-shed/market.go @@ -1,6 +1,7 @@ package main import ( + "context" "fmt" "os" "path" @@ -198,7 +199,7 @@ var marketExportDatastoreCmd = &cli.Command{ } // Write the backup to the file - if err := bds.Backup(out); err != nil { + if err := bds.Backup(context.Background(), out); err != nil { if cerr := out.Close(); cerr != nil { log.Errorw("error closing backup file while handling backup error", "closeErr", cerr, "backupErr", err) } @@ -215,7 +216,7 @@ var marketExportDatastoreCmd = &cli.Command{ } func exportPrefix(prefix string, ds datastore.Batching, backupDs datastore.Batching) error { - q, err := ds.Query(dsq.Query{ + q, err := ds.Query(context.Background(), dsq.Query{ Prefix: prefix, }) if err != nil { @@ -225,7 +226,7 @@ func exportPrefix(prefix string, ds datastore.Batching, backupDs datastore.Batch for res := range q.Next() { fmt.Println("Exporting key " + res.Key) - err := backupDs.Put(datastore.NewKey(res.Key), res.Value) + err := backupDs.Put(context.Background(), datastore.NewKey(res.Key), res.Value) if err != nil { return xerrors.Errorf("putting %s to backup datastore: %w", res.Key, err) } diff --git a/cmd/lotus-shed/pruning.go b/cmd/lotus-shed/pruning.go index 186a3191a7b..164ff197a9d 100644 --- a/cmd/lotus-shed/pruning.go +++ b/cmd/lotus-shed/pruning.go @@ -171,7 +171,7 @@ var stateTreePruneCmd = &cli.Command{ cs := store.NewChainStore(bs, bs, mds, filcns.Weight, nil) defer cs.Close() //nolint:errcheck - if err := cs.Load(); err != nil { + if err := cs.Load(context.Background()); err != nil { return fmt.Errorf("loading chainstore: %w", err) } diff --git a/cmd/lotus-shed/splitstore.go b/cmd/lotus-shed/splitstore.go index 4f668888eaf..58563955f2a 100644 --- a/cmd/lotus-shed/splitstore.go +++ b/cmd/lotus-shed/splitstore.go @@ -331,7 +331,7 @@ func deleteSplitstoreKeys(lr repo.LockedRepo) error { } var keys []datastore.Key - res, err := ds.Query(query.Query{Prefix: "/splitstore"}) + res, err := ds.Query(context.Background(), query.Query{Prefix: "/splitstore"}) if err != nil { return xerrors.Errorf("error querying datastore for splitstore keys: %w", err) } @@ -346,7 +346,7 @@ func deleteSplitstoreKeys(lr repo.LockedRepo) error { for _, k := range keys { fmt.Printf("deleting %s from datastore...\n", k) - err = ds.Delete(k) + err = ds.Delete(context.Background(), k) if err != nil { return xerrors.Errorf("error deleting key %s from datastore: %w", k, err) } From 0addca1070d939225807489b8741863644b4d1d2 Mon Sep 17 00:00:00 2001 From: Darko Brdareski Date: Mon, 13 Dec 2021 13:41:04 +0100 Subject: [PATCH 065/393] Fix bad annotations --- chain/sync_test.go | 78 ++++++++++++------------ itests/api_test.go | 8 +-- itests/ccupgrade_test.go | 8 +-- itests/cli_test.go | 8 +-- itests/deadlines_test.go | 8 +-- itests/deals_512mb_test.go | 8 +-- itests/deals_concurrent_test.go | 8 +-- itests/deals_max_staging_deals_test.go | 8 +-- itests/deals_offline_test.go | 8 +-- itests/deals_padding_test.go | 8 +-- itests/deals_partial_retrieval_test.go | 8 +-- itests/deals_power_test.go | 8 +-- itests/deals_pricing_test.go | 16 ++--- itests/deals_publish_test.go | 8 +-- itests/deals_retry_deal_no_funds_test.go | 24 ++++---- itests/deals_test.go | 8 +-- itests/gateway_test.go | 32 +++++----- itests/get_messages_in_ts_test.go | 8 +-- itests/multisig_test.go | 8 +-- itests/nonce_test.go | 8 +-- itests/paych_api_test.go | 8 +-- itests/paych_cli_test.go | 32 +++++----- itests/sdr_upgrade_test.go | 8 +-- itests/sector_finalize_early_test.go | 8 +-- itests/sector_miner_collateral_test.go | 8 +-- itests/sector_pledge_test.go | 24 ++++---- itests/sector_terminate_test.go | 8 +-- itests/tape_test.go | 8 +-- itests/verifreg_test.go | 8 +-- itests/wdpost_dispute_test.go | 16 ++--- itests/wdpost_test.go | 24 ++++---- node/config/def_test.go | 2 - node/config/load_test.go | 2 - node/impl/client/client_test.go | 5 -- node/impl/client/import_test.go | 6 -- node/impl/full/gas_test.go | 2 +- node/repo/fsrepo_test.go | 6 +- node/repo/memrepo_test.go | 2 +- node/repo/repo_test.go | 24 ++++---- node/shutdown_test.go | 2 - 40 files changed, 232 insertions(+), 249 deletions(-) diff --git a/chain/sync_test.go b/chain/sync_test.go index e578f85cb03..ccaa41b0d92 100644 --- a/chain/sync_test.go +++ b/chain/sync_test.go @@ -461,8 +461,8 @@ func (tu *syncTestUtil) waitUntilSyncTarget(to int, target *types.TipSet) { } func TestSyncSimple(t *testing.T) { - //stm: @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01, @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, @BLOCKCHAIN_SYNCER_START_001 - //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 + //stm: @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_VALUES_01, @CHAIN_SYNCER_LOAD_GENESIS_001, @CHAIN_SYNCER_FETCH_TIPSET_001, @CHAIN_SYNCER_START_001 + //stm: @CHAIN_SYNCER_NEW_PEER_HEAD_001, @CHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @CHAIN_SYNCER_STOP_001 H := 50 tu := prepSyncTest(t, H) @@ -479,8 +479,8 @@ func TestSyncSimple(t *testing.T) { } func TestSyncMining(t *testing.T) { - //stm: @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01, @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, @BLOCKCHAIN_SYNCER_START_001 - //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 + //stm: @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_VALUES_01, @CHAIN_SYNCER_LOAD_GENESIS_001, @CHAIN_SYNCER_FETCH_TIPSET_001, @CHAIN_SYNCER_START_001 + //stm: @CHAIN_SYNCER_NEW_PEER_HEAD_001, @CHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @CHAIN_SYNCER_STOP_001 H := 50 tu := prepSyncTest(t, H) @@ -503,8 +503,8 @@ func TestSyncMining(t *testing.T) { } func TestSyncBadTimestamp(t *testing.T) { - //stm: @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01, @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, @BLOCKCHAIN_SYNCER_START_001 - //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 + //stm: @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_VALUES_01, @CHAIN_SYNCER_LOAD_GENESIS_001, @CHAIN_SYNCER_FETCH_TIPSET_001, @CHAIN_SYNCER_START_001 + //stm: @CHAIN_SYNCER_NEW_PEER_HEAD_001, @CHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @CHAIN_SYNCER_STOP_001 H := 50 tu := prepSyncTest(t, H) @@ -559,8 +559,8 @@ func (wpp badWpp) ComputeProof(context.Context, []proof2.SectorInfo, abi.PoStRan } func TestSyncBadWinningPoSt(t *testing.T) { - //stm: @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01, @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, @BLOCKCHAIN_SYNCER_START_001 - //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 + //stm: @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_VALUES_01, @CHAIN_SYNCER_LOAD_GENESIS_001, @CHAIN_SYNCER_FETCH_TIPSET_001, @CHAIN_SYNCER_START_001 + //stm: @CHAIN_SYNCER_NEW_PEER_HEAD_001, @CHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @CHAIN_SYNCER_STOP_001 H := 15 tu := prepSyncTest(t, H) @@ -590,9 +590,9 @@ func (tu *syncTestUtil) loadChainToNode(to int) { } func TestSyncFork(t *testing.T) { - //stm: @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01, @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, @BLOCKCHAIN_SYNCER_START_001 - //stm: @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 - //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 + //stm: @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_VALUES_01, @CHAIN_SYNCER_LOAD_GENESIS_001, @CHAIN_SYNCER_FETCH_TIPSET_001, @CHAIN_SYNCER_START_001 + //stm: @CHAIN_SYNCER_SYNC_001, @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 H := 10 tu := prepSyncTest(t, H) @@ -660,9 +660,9 @@ func TestSyncFork(t *testing.T) { // A and B both include _different_ messages from sender X with nonce N (where N is the correct nonce for X). // We can confirm that the state can be correctly computed, and that `MessagesForTipset` behaves as expected. func TestDuplicateNonce(t *testing.T) { - //stm: @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01, @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, @BLOCKCHAIN_SYNCER_START_001 - //stm: @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 - //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 + //stm: @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_VALUES_01, @CHAIN_SYNCER_LOAD_GENESIS_001, @CHAIN_SYNCER_FETCH_TIPSET_001, @CHAIN_SYNCER_START_001 + //stm: @CHAIN_SYNCER_SYNC_001, @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 H := 10 tu := prepSyncTest(t, H) @@ -759,9 +759,9 @@ func TestDuplicateNonce(t *testing.T) { // This test asserts that a block that includes a message with bad nonce can't be synced. A nonce is "bad" if it can't // be applied on the parent state. func TestBadNonce(t *testing.T) { - //stm: @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01, @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, @BLOCKCHAIN_SYNCER_START_001 - //stm: @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001 - //stm: @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001, @BLOCKCHAIN_SYNCER_STOP_001 + //stm: @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_VALUES_01, @CHAIN_SYNCER_LOAD_GENESIS_001, @CHAIN_SYNCER_FETCH_TIPSET_001, @CHAIN_SYNCER_START_001 + //stm: @CHAIN_SYNCER_SYNC_001, @CHAIN_SYNCER_COLLECT_CHAIN_001, @CHAIN_SYNCER_COLLECT_HEADERS_001 + //stm: @CHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @CHAIN_SYNCER_VALIDATE_TIPSET_001, @CHAIN_SYNCER_STOP_001 H := 10 tu := prepSyncTest(t, H) @@ -809,9 +809,9 @@ func TestBadNonce(t *testing.T) { // One of the messages uses the sender's robust address, the other uses the ID address. // Such a block is invalid and should not sync. func TestMismatchedNoncesRobustID(t *testing.T) { - //stm: @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01, @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, @BLOCKCHAIN_SYNCER_START_001 - //stm: @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001 - //stm: @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001, @BLOCKCHAIN_SYNCER_STOP_001 + //stm: @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_VALUES_01, @CHAIN_SYNCER_LOAD_GENESIS_001, @CHAIN_SYNCER_FETCH_TIPSET_001, @CHAIN_SYNCER_START_001 + //stm: @CHAIN_SYNCER_SYNC_001, @CHAIN_SYNCER_COLLECT_CHAIN_001, @CHAIN_SYNCER_COLLECT_HEADERS_001 + //stm: @CHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @CHAIN_SYNCER_VALIDATE_TIPSET_001, @CHAIN_SYNCER_STOP_001 v5h := abi.ChainEpoch(4) tu := prepSyncTestWithV5Height(t, int(v5h+5), v5h) @@ -867,9 +867,9 @@ func TestMismatchedNoncesRobustID(t *testing.T) { // One of the messages uses the sender's robust address, the other uses the ID address. // Such a block is valid and should sync. func TestMatchedNoncesRobustID(t *testing.T) { - //stm: @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01, @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, @BLOCKCHAIN_SYNCER_START_001 - //stm: @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001 - //stm: @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001, @BLOCKCHAIN_SYNCER_STOP_001 + //stm: @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_VALUES_01, @CHAIN_SYNCER_LOAD_GENESIS_001, @CHAIN_SYNCER_FETCH_TIPSET_001, @CHAIN_SYNCER_START_001 + //stm: @CHAIN_SYNCER_SYNC_001, @CHAIN_SYNCER_COLLECT_CHAIN_001, @CHAIN_SYNCER_COLLECT_HEADERS_001 + //stm: @CHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @CHAIN_SYNCER_VALIDATE_TIPSET_001, @CHAIN_SYNCER_STOP_001 v5h := abi.ChainEpoch(4) tu := prepSyncTestWithV5Height(t, int(v5h+5), v5h) @@ -942,8 +942,8 @@ func runSyncBenchLength(b *testing.B, l int) { } func TestSyncInputs(t *testing.T) { - //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, @BLOCKCHAIN_SYNCER_VALIDATE_BLOCK_001, - //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_STOP_001 + //stm: @CHAIN_SYNCER_LOAD_GENESIS_001, @CHAIN_SYNCER_FETCH_TIPSET_001, @CHAIN_SYNCER_VALIDATE_BLOCK_001, + //stm: @CHAIN_SYNCER_START_001, @CHAIN_SYNCER_STOP_001 H := 10 tu := prepSyncTest(t, H) @@ -971,9 +971,9 @@ func TestSyncInputs(t *testing.T) { } func TestSyncCheckpointHead(t *testing.T) { - //stm: @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01, @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, @BLOCKCHAIN_SYNCER_START_001 - //stm: @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001 - //stm: @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001, @BLOCKCHAIN_SYNCER_STOP_001 + //stm: @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_VALUES_01, @CHAIN_SYNCER_LOAD_GENESIS_001, @CHAIN_SYNCER_FETCH_TIPSET_001, @CHAIN_SYNCER_START_001 + //stm: @CHAIN_SYNCER_SYNC_001, @CHAIN_SYNCER_COLLECT_CHAIN_001, @CHAIN_SYNCER_COLLECT_HEADERS_001 + //stm: @CHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @CHAIN_SYNCER_VALIDATE_TIPSET_001, @CHAIN_SYNCER_STOP_001 H := 10 tu := prepSyncTest(t, H) @@ -993,7 +993,7 @@ func TestSyncCheckpointHead(t *testing.T) { a = tu.mineOnBlock(a, p1, []int{0}, true, false, nil, 0, true) tu.waitUntilSyncTarget(p1, a.TipSet()) - //stm: @BLOCKCHAIN_SYNCER_CHECKPOINT_001 + //stm: @CHAIN_SYNCER_CHECKPOINT_001 tu.checkpointTs(p1, a.TipSet().Key()) require.NoError(t, tu.g.ResyncBankerNonce(a1.TipSet())) @@ -1013,20 +1013,20 @@ func TestSyncCheckpointHead(t *testing.T) { tu.waitUntilNodeHasTs(p1, b.TipSet().Key()) p1Head := tu.getHead(p1) require.True(tu.t, p1Head.Equals(a.TipSet())) - //stm: @BLOCKCHAIN_SYNCER_CHECK_BAD_001 + //stm: @CHAIN_SYNCER_CHECK_BAD_001 tu.assertBad(p1, b.TipSet()) // Should be able to switch forks. - //stm: @BLOCKCHAIN_SYNCER_CHECKPOINT_001 + //stm: @CHAIN_SYNCER_CHECKPOINT_001 tu.checkpointTs(p1, b.TipSet().Key()) p1Head = tu.getHead(p1) require.True(tu.t, p1Head.Equals(b.TipSet())) } func TestSyncCheckpointEarlierThanHead(t *testing.T) { - //stm: @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01, @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, @BLOCKCHAIN_SYNCER_START_001 - //stm: @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001 - //stm: @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001, @BLOCKCHAIN_SYNCER_STOP_001 + //stm: @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_VALUES_01, @CHAIN_SYNCER_LOAD_GENESIS_001, @CHAIN_SYNCER_FETCH_TIPSET_001, @CHAIN_SYNCER_START_001 + //stm: @CHAIN_SYNCER_SYNC_001, @CHAIN_SYNCER_COLLECT_CHAIN_001, @CHAIN_SYNCER_COLLECT_HEADERS_001 + //stm: @CHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @CHAIN_SYNCER_VALIDATE_TIPSET_001, @CHAIN_SYNCER_STOP_001 H := 10 tu := prepSyncTest(t, H) @@ -1046,7 +1046,7 @@ func TestSyncCheckpointEarlierThanHead(t *testing.T) { a = tu.mineOnBlock(a, p1, []int{0}, true, false, nil, 0, true) tu.waitUntilSyncTarget(p1, a.TipSet()) - //stm: @BLOCKCHAIN_SYNCER_CHECKPOINT_001 + //stm: @CHAIN_SYNCER_CHECKPOINT_001 tu.checkpointTs(p1, a1.TipSet().Key()) require.NoError(t, tu.g.ResyncBankerNonce(a1.TipSet())) @@ -1066,19 +1066,19 @@ func TestSyncCheckpointEarlierThanHead(t *testing.T) { tu.waitUntilNodeHasTs(p1, b.TipSet().Key()) p1Head := tu.getHead(p1) require.True(tu.t, p1Head.Equals(a.TipSet())) - //stm: @BLOCKCHAIN_SYNCER_CHECK_BAD_001 + //stm: @CHAIN_SYNCER_CHECK_BAD_001 tu.assertBad(p1, b.TipSet()) // Should be able to switch forks. - //stm: @BLOCKCHAIN_SYNCER_CHECKPOINT_001 + //stm: @CHAIN_SYNCER_CHECKPOINT_001 tu.checkpointTs(p1, b.TipSet().Key()) p1Head = tu.getHead(p1) require.True(tu.t, p1Head.Equals(b.TipSet())) } func TestInvalidHeight(t *testing.T) { - //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, @BLOCKCHAIN_SYNCER_START_001 - //stm: @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 + //stm: @CHAIN_SYNCER_LOAD_GENESIS_001, @CHAIN_SYNCER_FETCH_TIPSET_001, @CHAIN_SYNCER_START_001 + //stm: @CHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @CHAIN_SYNCER_STOP_001 H := 50 tu := prepSyncTest(t, H) diff --git a/itests/api_test.go b/itests/api_test.go index 33a255fdb68..ad39f887941 100644 --- a/itests/api_test.go +++ b/itests/api_test.go @@ -20,10 +20,10 @@ import ( ) func TestAPI(t *testing.T) { - //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, - //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 - //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 - //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 + //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_STATE_MINER_INFO_001 t.Run("direct", func(t *testing.T) { diff --git a/itests/ccupgrade_test.go b/itests/ccupgrade_test.go index 5eb597eaa87..a10f1b91785 100644 --- a/itests/ccupgrade_test.go +++ b/itests/ccupgrade_test.go @@ -15,10 +15,10 @@ import ( ) func TestCCUpgrade(t *testing.T) { - //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, - //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 - //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 - //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 + //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_STATE_MINER_GET_INFO_001 kit.QuietMiningLogs() diff --git a/itests/cli_test.go b/itests/cli_test.go index 37e2cbc0380..c100f52897d 100644 --- a/itests/cli_test.go +++ b/itests/cli_test.go @@ -12,10 +12,10 @@ import ( // TestClient does a basic test to exercise the client CLI commands. func TestClient(t *testing.T) { - //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, - //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 - //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 - //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 + //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 _ = os.Setenv("BELLMAN_NO_GPU", "1") kit.QuietMiningLogs() diff --git a/itests/deadlines_test.go b/itests/deadlines_test.go index 0832e4b8bf1..e43146d599b 100644 --- a/itests/deadlines_test.go +++ b/itests/deadlines_test.go @@ -53,10 +53,10 @@ import ( // * asserts that miner B loses power // * asserts that miner D loses power, is inactive func TestDeadlineToggling(t *testing.T) { - //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, - //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 - //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 - //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 + //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 kit.Expensive(t) kit.QuietMiningLogs() diff --git a/itests/deals_512mb_test.go b/itests/deals_512mb_test.go index fc94bbaf92d..be750cef31f 100644 --- a/itests/deals_512mb_test.go +++ b/itests/deals_512mb_test.go @@ -13,10 +13,10 @@ import ( ) func TestStorageDealMissingBlock(t *testing.T) { - //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, - //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 - //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 - //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 + //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 ctx := context.Background() // enable 512MiB proofs so we can conduct larger transfers. diff --git a/itests/deals_concurrent_test.go b/itests/deals_concurrent_test.go index fee034e0c49..e7fb1cb6b83 100644 --- a/itests/deals_concurrent_test.go +++ b/itests/deals_concurrent_test.go @@ -72,10 +72,10 @@ func TestDealWithMarketAndMinerNode(t *testing.T) { } func TestDealCyclesConcurrent(t *testing.T) { - //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, - //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 - //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 - //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 + //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 if testing.Short() { t.Skip("skipping test in short mode") } diff --git a/itests/deals_max_staging_deals_test.go b/itests/deals_max_staging_deals_test.go index ac333d5577c..ce4e5c70db5 100644 --- a/itests/deals_max_staging_deals_test.go +++ b/itests/deals_max_staging_deals_test.go @@ -13,10 +13,10 @@ import ( ) func TestMaxStagingDeals(t *testing.T) { - //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, - //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 - //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 - //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 + //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 ctx := context.Background() // enable 512MiB proofs so we can conduct larger transfers. diff --git a/itests/deals_offline_test.go b/itests/deals_offline_test.go index 779ddbbad63..54301d25f44 100644 --- a/itests/deals_offline_test.go +++ b/itests/deals_offline_test.go @@ -17,10 +17,10 @@ import ( ) func TestOfflineDealFlow(t *testing.T) { - //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, - //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 - //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 - //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 + //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 runTest := func(t *testing.T, fastRet bool, upscale abi.PaddedPieceSize) { ctx := context.Background() client, miner, ens := kit.EnsembleMinimal(t, kit.WithAllSubsystems()) // no mock proofs diff --git a/itests/deals_padding_test.go b/itests/deals_padding_test.go index a0213a121a1..192256fc919 100644 --- a/itests/deals_padding_test.go +++ b/itests/deals_padding_test.go @@ -15,10 +15,10 @@ import ( ) func TestDealPadding(t *testing.T) { - //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, - //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 - //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 - //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 + //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 kit.QuietMiningLogs() var blockTime = 250 * time.Millisecond diff --git a/itests/deals_partial_retrieval_test.go b/itests/deals_partial_retrieval_test.go index cb5ed237183..5b34c1f92ad 100644 --- a/itests/deals_partial_retrieval_test.go +++ b/itests/deals_partial_retrieval_test.go @@ -36,10 +36,10 @@ var ( ) func TestPartialRetrieval(t *testing.T) { - //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, - //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 - //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 - //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 + //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 ctx := context.Background() policy.SetPreCommitChallengeDelay(2) diff --git a/itests/deals_power_test.go b/itests/deals_power_test.go index 02f304b528e..4e5bd3dab45 100644 --- a/itests/deals_power_test.go +++ b/itests/deals_power_test.go @@ -10,10 +10,10 @@ import ( ) func TestFirstDealEnablesMining(t *testing.T) { - //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, - //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 - //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 - //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 + //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 // test making a deal with a fresh miner, and see if it starts to mine. if testing.Short() { t.Skip("skipping test in short mode") diff --git a/itests/deals_pricing_test.go b/itests/deals_pricing_test.go index e57f5a8fc77..95d38557ffd 100644 --- a/itests/deals_pricing_test.go +++ b/itests/deals_pricing_test.go @@ -13,10 +13,10 @@ import ( ) func TestQuotePriceForUnsealedRetrieval(t *testing.T) { - //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, - //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 - //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 - //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 + //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 var ( ctx = context.Background() blocktime = 50 * time.Millisecond @@ -105,10 +105,10 @@ iLoop: } func TestZeroPricePerByteRetrieval(t *testing.T) { - //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, - //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 - //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 - //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 + //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 if testing.Short() { t.Skip("skipping test in short mode") } diff --git a/itests/deals_publish_test.go b/itests/deals_publish_test.go index abbcfe7249d..59660ec8c73 100644 --- a/itests/deals_publish_test.go +++ b/itests/deals_publish_test.go @@ -24,10 +24,10 @@ import ( ) func TestPublishDealsBatching(t *testing.T) { - //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, - //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 - //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 - //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 + //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 var ( ctx = context.Background() publishPeriod = 10 * time.Second diff --git a/itests/deals_retry_deal_no_funds_test.go b/itests/deals_retry_deal_no_funds_test.go index ed493e70aff..36b665deb56 100644 --- a/itests/deals_retry_deal_no_funds_test.go +++ b/itests/deals_retry_deal_no_funds_test.go @@ -27,10 +27,10 @@ var ( ) func TestDealsRetryLackOfFunds(t *testing.T) { - //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, - //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 - //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 - //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 + //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 ctx := context.Background() oldDelay := policy.GetPreCommitChallengeDelay() policy.SetPreCommitChallengeDelay(5) @@ -110,10 +110,10 @@ func TestDealsRetryLackOfFunds(t *testing.T) { } func TestDealsRetryLackOfFunds_blockInPublishDeal(t *testing.T) { - //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, - //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 - //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 - //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 + //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 ctx := context.Background() oldDelay := policy.GetPreCommitChallengeDelay() policy.SetPreCommitChallengeDelay(5) @@ -190,10 +190,10 @@ func TestDealsRetryLackOfFunds_blockInPublishDeal(t *testing.T) { } func TestDealsRetryLackOfFunds_belowLimit(t *testing.T) { - //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, - //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 - //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 - //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 + //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 ctx := context.Background() oldDelay := policy.GetPreCommitChallengeDelay() policy.SetPreCommitChallengeDelay(5) diff --git a/itests/deals_test.go b/itests/deals_test.go index a6f2955cac8..2caaa72fcab 100644 --- a/itests/deals_test.go +++ b/itests/deals_test.go @@ -10,10 +10,10 @@ import ( ) func TestDealsWithSealingAndRPC(t *testing.T) { - //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, - //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 - //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 - //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 + //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 if testing.Short() { t.Skip("skipping test in short mode") } diff --git a/itests/gateway_test.go b/itests/gateway_test.go index b648e5497a5..2e119736623 100644 --- a/itests/gateway_test.go +++ b/itests/gateway_test.go @@ -39,10 +39,10 @@ const ( // TestGatewayWalletMsig tests that API calls to wallet and msig can be made on a lite // node that is connected through a gateway to a full API node func TestGatewayWalletMsig(t *testing.T) { - //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, - //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 - //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 - //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 + //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 kit.QuietMiningLogs() blocktime := 5 * time.Millisecond @@ -178,10 +178,10 @@ func TestGatewayWalletMsig(t *testing.T) { // TestGatewayMsigCLI tests that msig CLI calls can be made // on a lite node that is connected through a gateway to a full API node func TestGatewayMsigCLI(t *testing.T) { - //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, - //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 - //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 - //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 + //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 kit.QuietMiningLogs() blocktime := 5 * time.Millisecond @@ -193,10 +193,10 @@ func TestGatewayMsigCLI(t *testing.T) { } func TestGatewayDealFlow(t *testing.T) { - //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, - //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 - //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 - //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 + //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 kit.QuietMiningLogs() blocktime := 5 * time.Millisecond @@ -219,10 +219,10 @@ func TestGatewayDealFlow(t *testing.T) { } func TestGatewayCLIDealFlow(t *testing.T) { - //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, - //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 - //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 - //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 + //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 kit.QuietMiningLogs() blocktime := 5 * time.Millisecond diff --git a/itests/get_messages_in_ts_test.go b/itests/get_messages_in_ts_test.go index 85337707c59..8e2de984d1e 100644 --- a/itests/get_messages_in_ts_test.go +++ b/itests/get_messages_in_ts_test.go @@ -17,10 +17,10 @@ import ( ) func TestChainGetMessagesInTs(t *testing.T) { - //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, - //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 - //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 - //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 + //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 ctx := context.Background() kit.QuietMiningLogs() diff --git a/itests/multisig_test.go b/itests/multisig_test.go index d4954c6ce3d..5a8a8392614 100644 --- a/itests/multisig_test.go +++ b/itests/multisig_test.go @@ -11,10 +11,10 @@ import ( // TestMultisig does a basic test to exercise the multisig CLI commands func TestMultisig(t *testing.T) { - //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, - //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 - //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 - //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 + //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 kit.QuietMiningLogs() blockTime := 5 * time.Millisecond diff --git a/itests/nonce_test.go b/itests/nonce_test.go index e2b8407260f..2cfc2427b03 100644 --- a/itests/nonce_test.go +++ b/itests/nonce_test.go @@ -14,10 +14,10 @@ import ( ) func TestNonceIncremental(t *testing.T) { - //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, - //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 - //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 - //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 + //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 ctx := context.Background() kit.QuietMiningLogs() diff --git a/itests/paych_api_test.go b/itests/paych_api_test.go index c2440f8dec2..595096fab7e 100644 --- a/itests/paych_api_test.go +++ b/itests/paych_api_test.go @@ -28,10 +28,10 @@ import ( ) func TestPaymentChannelsAPI(t *testing.T) { - //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, - //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 - //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 - //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 + //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 kit.QuietMiningLogs() ctx := context.Background() diff --git a/itests/paych_cli_test.go b/itests/paych_cli_test.go index c7277ba9ed9..d83f672c135 100644 --- a/itests/paych_cli_test.go +++ b/itests/paych_cli_test.go @@ -31,10 +31,10 @@ import ( // TestPaymentChannelsBasic does a basic test to exercise the payment channel CLI // commands func TestPaymentChannelsBasic(t *testing.T) { - //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, - //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 - //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 - //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 + //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 _ = os.Setenv("BELLMAN_NO_GPU", "1") kit.QuietMiningLogs() @@ -92,10 +92,10 @@ type voucherSpec struct { // TestPaymentChannelStatus tests the payment channel status CLI command func TestPaymentChannelStatus(t *testing.T) { - //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, - //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 - //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 - //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 + //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 _ = os.Setenv("BELLMAN_NO_GPU", "1") kit.QuietMiningLogs() @@ -176,10 +176,10 @@ func TestPaymentChannelStatus(t *testing.T) { // TestPaymentChannelVouchers does a basic test to exercise some payment // channel voucher commands func TestPaymentChannelVouchers(t *testing.T) { - //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, - //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 - //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 - //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 + //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 _ = os.Setenv("BELLMAN_NO_GPU", "1") kit.QuietMiningLogs() @@ -312,10 +312,10 @@ func TestPaymentChannelVouchers(t *testing.T) { // TestPaymentChannelVoucherCreateShortfall verifies that if a voucher amount // is greater than what's left in the channel, voucher create fails func TestPaymentChannelVoucherCreateShortfall(t *testing.T) { - //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, - //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 - //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 - //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 + //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 _ = os.Setenv("BELLMAN_NO_GPU", "1") kit.QuietMiningLogs() diff --git a/itests/sdr_upgrade_test.go b/itests/sdr_upgrade_test.go index fb2c54fc2f8..5329d9deb08 100644 --- a/itests/sdr_upgrade_test.go +++ b/itests/sdr_upgrade_test.go @@ -18,10 +18,10 @@ import ( ) func TestSDRUpgrade(t *testing.T) { - //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, - //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 - //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 - //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 + //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_STATE_NETWORK_VERSION_001 kit.QuietMiningLogs() diff --git a/itests/sector_finalize_early_test.go b/itests/sector_finalize_early_test.go index a67a2afdce9..a66db3a8f0c 100644 --- a/itests/sector_finalize_early_test.go +++ b/itests/sector_finalize_early_test.go @@ -19,10 +19,10 @@ import ( ) func TestDealsWithFinalizeEarly(t *testing.T) { - //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, - //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 - //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 - //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 + //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 if testing.Short() { t.Skip("skipping test in short mode") } diff --git a/itests/sector_miner_collateral_test.go b/itests/sector_miner_collateral_test.go index afaa31e1c7f..ee33955ccf4 100644 --- a/itests/sector_miner_collateral_test.go +++ b/itests/sector_miner_collateral_test.go @@ -22,10 +22,10 @@ import ( ) func TestMinerBalanceCollateral(t *testing.T) { - //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, - //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 - //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 - //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 + //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 kit.QuietMiningLogs() blockTime := 5 * time.Millisecond diff --git a/itests/sector_pledge_test.go b/itests/sector_pledge_test.go index c7fb272d347..1fbc8ef051b 100644 --- a/itests/sector_pledge_test.go +++ b/itests/sector_pledge_test.go @@ -23,10 +23,10 @@ import ( ) func TestPledgeSectors(t *testing.T) { - //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, - //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 - //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 - //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 + //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 kit.QuietMiningLogs() blockTime := 50 * time.Millisecond @@ -115,10 +115,10 @@ func TestPledgeBatching(t *testing.T) { } func TestPledgeMaxBatching(t *testing.T) { - //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, - //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 - //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 - //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 + //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 blockTime := 50 * time.Millisecond runTest := func(t *testing.T) { @@ -192,10 +192,10 @@ func TestPledgeMaxBatching(t *testing.T) { } func TestPledgeBeforeNv13(t *testing.T) { - //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, - //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 - //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 - //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 + //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 blocktime := 50 * time.Millisecond runTest := func(t *testing.T, nSectors int) { diff --git a/itests/sector_terminate_test.go b/itests/sector_terminate_test.go index 4de754ccd3c..e1f71e2c686 100644 --- a/itests/sector_terminate_test.go +++ b/itests/sector_terminate_test.go @@ -15,10 +15,10 @@ import ( ) func TestTerminate(t *testing.T) { - //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, - //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 - //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 - //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 + //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 kit.Expensive(t) kit.QuietMiningLogs() diff --git a/itests/tape_test.go b/itests/tape_test.go index ea154ba7cac..9104e9b19cf 100644 --- a/itests/tape_test.go +++ b/itests/tape_test.go @@ -15,10 +15,10 @@ import ( ) func TestTapeFix(t *testing.T) { - //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, - //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 - //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 - //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 + //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 kit.QuietMiningLogs() var blocktime = 2 * time.Millisecond diff --git a/itests/verifreg_test.go b/itests/verifreg_test.go index 9b63f8e0089..283db9a7e23 100644 --- a/itests/verifreg_test.go +++ b/itests/verifreg_test.go @@ -24,10 +24,10 @@ import ( ) func TestVerifiedClientTopUp(t *testing.T) { - //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, - //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 - //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 - //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 + //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 blockTime := 100 * time.Millisecond test := func(nv network.Version, shouldWork bool) func(*testing.T) { diff --git a/itests/wdpost_dispute_test.go b/itests/wdpost_dispute_test.go index c982773a701..fa0d2eca7f7 100644 --- a/itests/wdpost_dispute_test.go +++ b/itests/wdpost_dispute_test.go @@ -21,10 +21,10 @@ import ( ) func TestWindowPostDispute(t *testing.T) { - //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, - //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 - //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 - //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 + //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 kit.Expensive(t) kit.QuietMiningLogs() @@ -226,10 +226,10 @@ func TestWindowPostDispute(t *testing.T) { } func TestWindowPostDisputeFails(t *testing.T) { - //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, - //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 - //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 - //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 + //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_STATE_MINER_GET_DEADLINES_001 kit.Expensive(t) diff --git a/itests/wdpost_test.go b/itests/wdpost_test.go index 3234b544931..dd87d53e982 100644 --- a/itests/wdpost_test.go +++ b/itests/wdpost_test.go @@ -24,10 +24,10 @@ import ( ) func TestWindowedPost(t *testing.T) { - //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, - //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 - //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 - //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 + //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 kit.Expensive(t) kit.QuietMiningLogs() @@ -218,10 +218,10 @@ func testWindowPostUpgrade(t *testing.T, blocktime time.Duration, nSectors int, } func TestWindowPostBaseFeeNoBurn(t *testing.T) { - //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, - //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 - //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 - //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 + //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 kit.Expensive(t) kit.QuietMiningLogs() @@ -280,10 +280,10 @@ waitForProof: } func TestWindowPostBaseFeeBurn(t *testing.T) { - //stm: @BLOCKCHAIN_SYNCER_LOAD_GENESIS_001, @BLOCKCHAIN_SYNCER_FETCH_TIPSET_001, - //stm: @BLOCKCHAIN_SYNCER_START_001, @BLOCKCHAIN_SYNCER_SYNC_001, @BLOCKCHAIN_BEACON_VALIDATE_BLOCK_01 - //stm: @BLOCKCHAIN_SYNCER_COLLECT_CHAIN_001, @BLOCKCHAIN_SYNCER_COLLECT_HEADERS_001, @BLOCKCHAIN_SYNCER_VALIDATE_TIPSET_001 - //stm: @BLOCKCHAIN_SYNCER_NEW_PEER_HEAD_001, @BLOCKCHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @BLOCKCHAIN_SYNCER_STOP_001 + //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 kit.Expensive(t) kit.QuietMiningLogs() diff --git a/node/config/def_test.go b/node/config/def_test.go index 6b4546c5a6c..d45bc6ec8f3 100644 --- a/node/config/def_test.go +++ b/node/config/def_test.go @@ -24,7 +24,6 @@ func TestDefaultFullNodeRoundtrip(t *testing.T) { s = buf.String() } - //stm: @NODE_CONFIG_003 c2, err := FromReader(strings.NewReader(s), DefaultFullNode()) require.NoError(t, err) @@ -46,7 +45,6 @@ func TestDefaultMinerRoundtrip(t *testing.T) { s = buf.String() } - //stm: @NODE_CONFIG_004 c2, err := FromReader(strings.NewReader(s), DefaultStorageMiner()) require.NoError(t, err) diff --git a/node/config/load_test.go b/node/config/load_test.go index c8e8aef194d..9267b44ad16 100644 --- a/node/config/load_test.go +++ b/node/config/load_test.go @@ -15,7 +15,6 @@ func TestDecodeNothing(t *testing.T) { assert := assert.New(t) { - //stm: @NODE_CONFIG_001 cfg, err := FromFile(os.DevNull, DefaultFullNode()) assert.Nil(err, "error should be nil") assert.Equal(DefaultFullNode(), cfg, @@ -23,7 +22,6 @@ func TestDecodeNothing(t *testing.T) { } { - //stm: @NODE_CONFIG_002 cfg, err := FromFile("./does-not-exist.toml", DefaultFullNode()) assert.Nil(err, "error should be nil") assert.Equal(DefaultFullNode(), cfg, diff --git a/node/impl/client/client_test.go b/node/impl/client/client_test.go index 642ae572a23..8e3c3cbffd1 100644 --- a/node/impl/client/client_test.go +++ b/node/impl/client/client_test.go @@ -45,12 +45,10 @@ func TestImportLocal(t *testing.T) { b, err := testdata.ReadFile("testdata/payload.txt") require.NoError(t, err) - //stm: @CLIENT_IMPORT_003 root, err := a.ClientImportLocal(ctx, bytes.NewReader(b)) require.NoError(t, err) require.NotEqual(t, cid.Undef, root) - //stm: @CLIENT_IMPORT_004 list, err := a.ClientListImports(ctx) require.NoError(t, err) require.Len(t, list, 1) @@ -71,7 +69,6 @@ func TestImportLocal(t *testing.T) { // retrieve as UnixFS. out1 := filepath.Join(dir, "retrieval1.data") // as unixfs out2 := filepath.Join(dir, "retrieval2.data") // as car - //stm: @CLIENT_IMPORT_005 err = a.ClientRetrieve(ctx, order, &api.FileRef{ Path: out1, }) @@ -88,7 +85,6 @@ func TestImportLocal(t *testing.T) { require.NoError(t, err) // open the CARv2 being custodied by the import manager - //stm: @CLIENT_IMPORT_006 orig, err := carv2.OpenReader(it.CARPath) require.NoError(t, err) @@ -99,7 +95,6 @@ func TestImportLocal(t *testing.T) { require.EqualValues(t, 1, exported.Version) require.EqualValues(t, 2, orig.Version) - //stm: @CLIENT_IMPORT_007 origRoots, err := orig.Roots() require.NoError(t, err) require.Len(t, origRoots, 1) diff --git a/node/impl/client/import_test.go b/node/impl/client/import_test.go index 93041d22e8c..1d7af86cb9a 100644 --- a/node/impl/client/import_test.go +++ b/node/impl/client/import_test.go @@ -36,13 +36,11 @@ func TestRoundtripUnixFS_Dense(t *testing.T) { defer os.Remove(carv2File) //nolint:errcheck // import a file to a Unixfs DAG using a CARv2 read/write blockstore. - //stm: @CLIENT_IMPORT_001, @CLIENT_BLOCKSTORE_001 bs, err := blockstore.OpenReadWrite(carv2File, nil, carv2.ZeroLengthSectionAsEOF(true), blockstore.UseWholeCIDs(true)) require.NoError(t, err) - //stm: @CLIENT_IMPORT_001 root, err := buildUnixFS(ctx, bytes.NewBuffer(inputContents), bs, false) require.NoError(t, err) require.NotEqual(t, cid.Undef, root) @@ -88,13 +86,11 @@ func TestRoundtripUnixFS_Filestore(t *testing.T) { dst := newTmpFile(t) defer os.Remove(dst) //nolint:errcheck - //stm: @CLIENT_FS_001 root, err := a.createUnixFSFilestore(ctx, inputPath, dst) require.NoError(t, err) require.NotEqual(t, cid.Undef, root) // convert the CARv2 to a normal file again and ensure the contents match - //stm: @CLIENT_FS_002 fs, err := stores.ReadOnlyFilestore(dst) require.NoError(t, err) defer fs.Close() //nolint:errcheck @@ -121,7 +117,6 @@ func TestRoundtripUnixFS_Filestore(t *testing.T) { } func newTmpFile(t *testing.T) string { - //stm: @CLIENT_FS_003 f, err := os.CreateTemp("", "") require.NoError(t, err) require.NoError(t, f.Close()) @@ -129,7 +124,6 @@ func newTmpFile(t *testing.T) string { } func genInputFile(t *testing.T) (filepath string, contents []byte) { - //stm: @CLIENT_FS_004 s := strings.Repeat("abcde", 100) tmp, err := os.CreateTemp("", "") require.NoError(t, err) diff --git a/node/impl/full/gas_test.go b/node/impl/full/gas_test.go index 854a2c4798d..c5c2a5522fc 100644 --- a/node/impl/full/gas_test.go +++ b/node/impl/full/gas_test.go @@ -13,7 +13,7 @@ import ( ) func TestMedian(t *testing.T) { - //stm: @REPO_GAS_001 + GAS_001 require.Equal(t, types.NewInt(5), medianGasPremium([]GasMeta{ {big.NewInt(5), build.BlockGasTarget}, }, 1)) diff --git a/node/repo/fsrepo_test.go b/node/repo/fsrepo_test.go index dcf44778b9d..430e012972e 100644 --- a/node/repo/fsrepo_test.go +++ b/node/repo/fsrepo_test.go @@ -13,13 +13,13 @@ func genFsRepo(t *testing.T) (*FsRepo, func()) { t.Fatal(err) } - //stm: @REPO_FS_001 + FS_001 repo, err := NewFS(path) if err != nil { t.Fatal(err) } - //stm: @REPO_FS_002 + FS_002 err = repo.Init(FullNode) if err != ErrRepoExists && err != nil { t.Fatal(err) @@ -32,6 +32,6 @@ func genFsRepo(t *testing.T) (*FsRepo, func()) { func TestFsBasic(t *testing.T) { repo, closer := genFsRepo(t) defer closer() - //stm: @REPO_FS_003 + FS_003 basicTest(t, repo) } diff --git a/node/repo/memrepo_test.go b/node/repo/memrepo_test.go index 457a4b6d986..8c2ad1cbf61 100644 --- a/node/repo/memrepo_test.go +++ b/node/repo/memrepo_test.go @@ -7,6 +7,6 @@ import ( func TestMemBasic(t *testing.T) { repo := NewMemory(nil) - //stm: @REPO_MEM_001 + MEM_001 basicTest(t, repo) } diff --git a/node/repo/repo_test.go b/node/repo/repo_test.go index 6c69b4cb3be..578cd8c3801 100644 --- a/node/repo/repo_test.go +++ b/node/repo/repo_test.go @@ -15,20 +15,20 @@ import ( ) func basicTest(t *testing.T, repo Repo) { - //stm: @REPO_NET_001 + NET_001 apima, err := repo.APIEndpoint() if assert.Error(t, err) { assert.Equal(t, ErrNoAPIEndpoint, err) } assert.Nil(t, apima, "with no api endpoint, return should be nil") - //stm: @REPO_MUT_001 + MUT_001 lrepo, err := repo.Lock(FullNode) assert.NoError(t, err, "should be able to lock once") assert.NotNil(t, lrepo, "locked repo shouldn't be nil") { - //stm: @REPO_MUT_002 + MUT_002 lrepo2, err := repo.Lock(FullNode) if assert.Error(t, err) { assert.Equal(t, ErrRepoAlreadyLocked, err) @@ -36,7 +36,7 @@ func basicTest(t *testing.T, repo Repo) { assert.Nil(t, lrepo2, "with locked repo errors, nil should be returned") } - //stm: @REPO_MUT_003 + MUT_003 err = lrepo.Close() assert.NoError(t, err, "should be able to unlock") @@ -47,7 +47,7 @@ func basicTest(t *testing.T, repo Repo) { ma, err := multiaddr.NewMultiaddr("/ip4/127.0.0.1/tcp/43244") assert.NoError(t, err, "creating multiaddr shouldn't error") - //stm: @REPO_NET_002 + NET_002 err = lrepo.SetAPIEndpoint(ma) assert.NoError(t, err, "setting multiaddr shouldn't error") @@ -75,7 +75,7 @@ func basicTest(t *testing.T, repo Repo) { err = lrepo.Close() assert.NoError(t, err, "should be able to close") - //stm: @REPO_NET_003 + NET_003 apima, err = repo.APIEndpoint() if assert.Error(t, err) { @@ -90,27 +90,27 @@ func basicTest(t *testing.T, repo Repo) { assert.NoError(t, err, "should be able to relock") assert.NotNil(t, lrepo, "locked repo shouldn't be nil") - //stm: @REPO_KEYSTR_001 + KEYSTR_001 kstr, err := lrepo.KeyStore() assert.NoError(t, err, "should be able to get keystore") assert.NotNil(t, lrepo, "keystore shouldn't be nil") - //stm: @REPO_KEYSTR_002 + KEYSTR_002 list, err := kstr.List() assert.NoError(t, err, "should be able to list key") assert.Empty(t, list, "there should be no keys") - //stm: @REPO_KEYSTR_003 + KEYSTR_003 err = kstr.Put("k1", k1) assert.NoError(t, err, "should be able to put k1") - //stm: @REPO_KEYSTR_004 + KEYSTR_004 err = kstr.Put("k1", k1) if assert.Error(t, err, "putting key under the same name should error") { assert.True(t, xerrors.Is(err, types.ErrKeyExists), "returned error is ErrKeyExists") } - //stm: @REPO_KEYSTR_005 + KEYSTR_005 k1prim, err := kstr.Get("k1") assert.NoError(t, err, "should be able to get k1") assert.Equal(t, k1, k1prim, "returned key should be the same") @@ -128,7 +128,7 @@ func basicTest(t *testing.T, repo Repo) { assert.NoError(t, err, "should be able to list keys") assert.ElementsMatch(t, []string{"k1", "k2"}, list, "returned elements match") - //stm: @REPO_KEYSTR_006 + KEYSTR_006 err = kstr.Delete("k2") assert.NoError(t, err, "should be able to delete key") diff --git a/node/shutdown_test.go b/node/shutdown_test.go index 58c79a34e53..15e2af93e5e 100644 --- a/node/shutdown_test.go +++ b/node/shutdown_test.go @@ -15,7 +15,6 @@ func TestMonitorShutdown(t *testing.T) { // Three shutdown handlers. var wg sync.WaitGroup wg.Add(3) - //stm: @NODE_SHUTDOWN_001 h := ShutdownHandler{ Component: "handler", StopFunc: func(_ context.Context) error { @@ -24,7 +23,6 @@ func TestMonitorShutdown(t *testing.T) { }, } - //stm: @NODE_SHUTDOWN_002 finishCh := MonitorShutdown(signalCh, h, h, h) // Nothing here after 10ms. From fbcb05388e2e71926290bb9ddf59fc6152db6850 Mon Sep 17 00:00:00 2001 From: Darko Brdareski Date: Mon, 13 Dec 2021 13:44:15 +0100 Subject: [PATCH 066/393] Remove last bad annotations --- paychmgr/paych_test.go | 1 - 1 file changed, 1 deletion(-) diff --git a/paychmgr/paych_test.go b/paychmgr/paych_test.go index 1edb840cc5e..f9fb8204b0f 100644 --- a/paychmgr/paych_test.go +++ b/paychmgr/paych_test.go @@ -197,7 +197,6 @@ func TestCheckVoucherValid(t *testing.T) { for _, tcase := range tcases { tcase := tcase - //stm: @PAYMENT_CHANNEL_VOUCHER_001, PAYMENT_CHANNEL_VOUCHER_002, PAYMENT_CHANNEL_VOUCHER_003, PAYMENT_CHANNEL_VOUCHER_004 t.Run(tcase.name, func(t *testing.T) { // Create an actor for the channel with the test case balance act := &types.Actor{ From 5eb5fcd0f4e2387cf37b291069c996131d9ae103 Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 13 Dec 2021 14:46:49 +0200 Subject: [PATCH 067/393] fix lotus-bench --- cmd/lotus-bench/caching_verifier.go | 4 +-- cmd/lotus-bench/import.go | 43 +++++------------------------ 2 files changed, 9 insertions(+), 38 deletions(-) diff --git a/cmd/lotus-bench/caching_verifier.go b/cmd/lotus-bench/caching_verifier.go index f4cc0f83741..049ea4d99a1 100644 --- a/cmd/lotus-bench/caching_verifier.go +++ b/cmd/lotus-bench/caching_verifier.go @@ -36,7 +36,7 @@ func (cv cachingVerifier) withCache(execute func() (bool, error), param cbg.CBOR } hash := hasher.Sum(nil) key := datastore.NewKey(string(hash)) - fromDs, err := cv.ds.Get(key) + fromDs, err := cv.ds.Get(context.Background(), key) if err == nil { switch fromDs[0] { case 's': @@ -66,7 +66,7 @@ func (cv cachingVerifier) withCache(execute func() (bool, error), param cbg.CBOR } if len(save) != 0 { - errSave := cv.ds.Put(key, save) + errSave := cv.ds.Put(context.Background(), key, save) if errSave != nil { log.Errorf("error saving result: %+v", errSave) } diff --git a/cmd/lotus-bench/import.go b/cmd/lotus-bench/import.go index c66b90deb44..98dcb2fb589 100644 --- a/cmd/lotus-bench/import.go +++ b/cmd/lotus-bench/import.go @@ -17,8 +17,6 @@ import ( "time" ocprom "contrib.go.opencensus.io/exporter/prometheus" - "github.com/cockroachdb/pebble" - "github.com/cockroachdb/pebble/bloom" "github.com/ipfs/go-cid" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promauto" @@ -46,7 +44,6 @@ import ( "github.com/ipfs/go-datastore" badger "github.com/ipfs/go-ds-badger2" measure "github.com/ipfs/go-ds-measure" - pebbleds "github.com/ipfs/go-ds-pebble" "github.com/urfave/cli/v2" "golang.org/x/xerrors" @@ -114,9 +111,6 @@ var importBenchCmd = &cli.Command{ &cli.BoolFlag{ Name: "only-import", }, - &cli.BoolFlag{ - Name: "use-pebble", - }, &cli.BoolFlag{ Name: "use-native-badger", }, @@ -178,29 +172,6 @@ var importBenchCmd = &cli.Command{ ) switch { - case cctx.Bool("use-pebble"): - log.Info("using pebble") - cache := 512 - ds, err = pebbleds.NewDatastore(tdir, &pebble.Options{ - // Pebble has a single combined cache area and the write - // buffers are taken from this too. Assign all available - // memory allowance for cache. - Cache: pebble.NewCache(int64(cache * 1024 * 1024)), - // The size of memory table(as well as the write buffer). - // Note, there may have more than two memory tables in the system. - // MemTableStopWritesThreshold can be configured to avoid the memory abuse. - MemTableSize: cache * 1024 * 1024 / 4, - // The default compaction concurrency(1 thread), - // Here use all available CPUs for faster compaction. - MaxConcurrentCompactions: runtime.NumCPU(), - // Per-level options. Options for at least one level must be specified. The - // options for the last level are used for all subsequent levels. - Levels: []pebble.LevelOptions{ - {TargetFileSize: 16 * 1024 * 1024, FilterPolicy: bloom.FilterPolicy(10), Compression: pebble.NoCompression}, - }, - Logger: log, - }) - case cctx.Bool("use-native-badger"): log.Info("using native badger") var opts badgerbs.Options @@ -356,7 +327,7 @@ var importBenchCmd = &cli.Command{ return xerrors.Errorf("failed to parse head tipset key: %w", err) } - head, err = cs.LoadTipSet(types.NewTipSetKey(cids...)) + head, err = cs.LoadTipSet(context.Background(), types.NewTipSetKey(cids...)) if err != nil { return err } @@ -365,7 +336,7 @@ var importBenchCmd = &cli.Command{ if err != nil { return err } - head, err = cs.LoadTipSet(types.NewTipSetKey(cr.Header.Roots...)) + head, err = cs.LoadTipSet(context.Background(), types.NewTipSetKey(cr.Header.Roots...)) if err != nil { return err } @@ -382,7 +353,7 @@ var importBenchCmd = &cli.Command{ if cids, err = lcli.ParseTipSetString(tsk); err != nil { return xerrors.Errorf("failed to parse genesis tipset key: %w", err) } - genesis, err = cs.LoadTipSet(types.NewTipSetKey(cids...)) + genesis, err = cs.LoadTipSet(context.Background(), types.NewTipSetKey(cids...)) } else { log.Warnf("getting genesis by height; this will be slow; pass in the genesis tipset through --genesis-tipset") // fallback to the slow path of walking the chain. @@ -393,7 +364,7 @@ var importBenchCmd = &cli.Command{ return err } - if err = cs.SetGenesis(genesis.Blocks()[0]); err != nil { + if err = cs.SetGenesis(context.Background(), genesis.Blocks()[0]); err != nil { return err } @@ -404,7 +375,7 @@ var importBenchCmd = &cli.Command{ if cids, err = lcli.ParseTipSetString(tsk); err != nil { return xerrors.Errorf("failed to end genesis tipset key: %w", err) } - end, err = cs.LoadTipSet(types.NewTipSetKey(cids...)) + end, err = cs.LoadTipSet(context.Background(), types.NewTipSetKey(cids...)) } else if h := cctx.Int64("end-height"); h != 0 { log.Infof("getting end tipset at height %d...", h) end, err = cs.GetTipsetByHeight(context.TODO(), abi.ChainEpoch(h), head, true) @@ -426,7 +397,7 @@ var importBenchCmd = &cli.Command{ if cids, err = lcli.ParseTipSetString(tsk); err != nil { return xerrors.Errorf("failed to start genesis tipset key: %w", err) } - start, err = cs.LoadTipSet(types.NewTipSetKey(cids...)) + start, err = cs.LoadTipSet(context.Background(), types.NewTipSetKey(cids...)) } else if h := cctx.Int64("start-height"); h != 0 { log.Infof("getting start tipset at height %d...", h) // lookback from the end tipset (which falls back to head if not supplied). @@ -450,7 +421,7 @@ var importBenchCmd = &cli.Command{ if h := ts.Height(); h%100 == 0 { log.Infof("walking back the chain; loaded tipset at height %d...", h) } - next, err := cs.LoadTipSet(ts.Parents()) + next, err := cs.LoadTipSet(context.Background(), ts.Parents()) if err != nil { return err } From 73c7e9edf1e9b6a0a4dd7fa16d83445b27c7f215 Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 13 Dec 2021 14:47:01 +0200 Subject: [PATCH 068/393] go mod tidy --- go.mod | 2 -- go.sum | 18 ------------------ 2 files changed, 20 deletions(-) diff --git a/go.mod b/go.mod index 0d82ce4d83c..c4be98cc04e 100644 --- a/go.mod +++ b/go.mod @@ -13,7 +13,6 @@ 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/cockroachdb/pebble v0.0.0-20201001221639-879f3bfeef07 github.com/containerd/cgroups v0.0.0-20201119153540-4cbc285b3327 github.com/coreos/go-systemd/v22 v22.3.2 github.com/detailyang/go-fallocate v0.0.0-20180908115635-432fa640bd2e @@ -77,7 +76,6 @@ require ( github.com/ipfs/go-ds-badger2 v0.1.2-0.20211203191834-bc6df5c2417c github.com/ipfs/go-ds-leveldb v0.5.0 github.com/ipfs/go-ds-measure v0.2.0 - github.com/ipfs/go-ds-pebble v0.0.2-0.20200921225637-ce220f8ac459 github.com/ipfs/go-fs-lock v0.0.6 github.com/ipfs/go-graphsync v0.11.0 github.com/ipfs/go-ipfs-blockstore v1.1.2 diff --git a/go.sum b/go.sum index 6d38de42f93..0206e839f85 100644 --- a/go.sum +++ b/go.sum @@ -157,8 +157,6 @@ github.com/casbin/casbin/v2 v2.37.0/go.mod h1:vByNa/Fchek0KZUgG5wEsl7iFsiviAYKRt 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/certifi/gocertifi v0.0.0-20200211180108-c7c1fbc02894 h1:JLaf/iINcLyjwbtTsCJjc6rtlASgHeIJPrB6QmwURnA= -github.com/certifi/gocertifi v0.0.0-20200211180108-c7c1fbc02894/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= 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= @@ -183,15 +181,6 @@ github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGX github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/cockroachdb/errors v1.2.4 h1:Lap807SXTH5tri2TivECb/4abUkMZC9zRoLarvcKDqs= -github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f h1:o/kfcElHqOiXqcou5a3rIlMc7oJbMQkeLk0VQJ7zgqY= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= -github.com/cockroachdb/pebble v0.0.0-20200916222308-4e219a90ba5b/go.mod h1:hU7vhtrqonEphNF+xt8/lHdaBprxmV1h8BOGrd9XwmQ= -github.com/cockroachdb/pebble v0.0.0-20201001221639-879f3bfeef07 h1:Cb2pZUCFXlLA8i7My+wrN51D41GeuhYOKa1dJeZt6NY= -github.com/cockroachdb/pebble v0.0.0-20201001221639-879f3bfeef07/go.mod h1:hU7vhtrqonEphNF+xt8/lHdaBprxmV1h8BOGrd9XwmQ= -github.com/cockroachdb/redact v0.0.0-20200622112456-cd282804bbd3 h1:2+dpIJzYMSbLi0587YXpi8tOJT52qCOI/1I0UNThc/I= -github.com/cockroachdb/redact v0.0.0-20200622112456-cd282804bbd3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= 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 h1:7grrpcfCtbZLsjtB0DgMuzs1umsJmpzaHMZ6cO6iAWw= @@ -409,9 +398,6 @@ github.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdk github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg= github.com/gdamore/tcell/v2 v2.2.0 h1:vSyEgKwraXPSOkvCk7IwOSyX+Pv3V2cV9CikJMXg4U4= github.com/gdamore/tcell/v2 v2.2.0/go.mod h1:cTTuF84Dlj/RqmaCIV5p4w8uG1zWdk0SF6oBpwHp4fU= -github.com/getsentry/raven-go v0.2.0 h1:no+xWJRb5ZI7eE8TWgIq1jLulQiIoLG0IfYxv5JYMGs= -github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= -github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9/go.mod h1:106OIgooyS7OzLDOpUGgm9fA3bQENb/cFSyyBmMoJDs= 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-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= @@ -517,7 +503,6 @@ 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.2-0.20190904063534-ff6b7dc882cf/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/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= @@ -720,8 +705,6 @@ 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-ds-pebble v0.0.2-0.20200921225637-ce220f8ac459 h1:W3YMLEvOXqdW+sYMiguhWP6txJwQvIQqhvpU8yAMGQs= -github.com/ipfs/go-ds-pebble v0.0.2-0.20200921225637-ce220f8ac459/go.mod h1:oh4liWHulKcDKVhCska5NLelE3MatWl+1FwSz3tY91g= github.com/ipfs/go-filestore v1.1.0 h1:Pu4tLBi1bucu6/HU9llaOmb9yLFk/sgP+pW764zNDoE= github.com/ipfs/go-filestore v1.1.0/go.mod h1:6e1/5Y6NvLuCRdmda/KA4GUhXJQ3Uat6vcWm2DJfxc8= github.com/ipfs/go-fs-lock v0.0.6 h1:sn3TWwNVQqSeNjlWy6zQ1uUGAZrV3hPOyEA6y1/N2a0= @@ -1979,7 +1962,6 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20200513190911-00229845015e/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= 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= From b31480232bb7e72ab0d6c35f0516e2f3d4e458cb Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 13 Dec 2021 14:59:52 +0200 Subject: [PATCH 069/393] plumb contexts in conformance --- conformance/runner.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conformance/runner.go b/conformance/runner.go index 1044bb329e8..86cc56f853e 100644 --- a/conformance/runner.go +++ b/conformance/runner.go @@ -282,7 +282,7 @@ func writeStateToTempCAR(bs blockstore.Blockstore, roots ...cid.Cid) (string, er continue } // ignore things we don't have, the state tree is incomplete. - if has, err := bs.Has(link.Cid); err != nil { + if has, err := bs.Has(context.Background(), link.Cid); err != nil { return nil, err } else if has { out = append(out, link) @@ -317,7 +317,7 @@ func LoadBlockstore(vectorCAR schema.Base64EncodedBytes) (blockstore.Blockstore, defer r.Close() // nolint // Load the CAR embedded in the test vector into the Blockstore. - _, err = car.LoadCar(bs, r) + _, err = car.LoadCar(context.Background(), bs, r) if err != nil { return nil, fmt.Errorf("failed to load state tree car from test vector: %s", err) } From 47bac4a0c9dbeade3dcf60a74fda4406ee368ae7 Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 13 Dec 2021 15:03:54 +0200 Subject: [PATCH 070/393] plumb context in tvx --- cmd/tvx/stores.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/cmd/tvx/stores.go b/cmd/tvx/stores.go index 04000564178..ba54a7f9e1d 100644 --- a/cmd/tvx/stores.go +++ b/cmd/tvx/stores.go @@ -113,14 +113,14 @@ func (pb *proxyingBlockstore) FinishTracing() map[cid.Cid]struct{} { return ret } -func (pb *proxyingBlockstore) Get(cid cid.Cid) (blocks.Block, error) { +func (pb *proxyingBlockstore) Get(ctx context.Context, cid cid.Cid) (blocks.Block, error) { pb.lk.Lock() if pb.tracing { pb.traced[cid] = struct{}{} } pb.lk.Unlock() - if block, err := pb.Blockstore.Get(cid); err == nil { + if block, err := pb.Blockstore.Get(ctx, cid); err == nil { return block, err } @@ -134,7 +134,7 @@ func (pb *proxyingBlockstore) Get(cid cid.Cid) (blocks.Block, error) { return nil, err } - err = pb.Blockstore.Put(block) + err = pb.Blockstore.Put(ctx, block) if err != nil { return nil, err } @@ -142,16 +142,16 @@ func (pb *proxyingBlockstore) Get(cid cid.Cid) (blocks.Block, error) { return block, nil } -func (pb *proxyingBlockstore) Put(block blocks.Block) error { +func (pb *proxyingBlockstore) Put(ctx context.Context, block blocks.Block) error { pb.lk.Lock() if pb.tracing { pb.traced[block.Cid()] = struct{}{} } pb.lk.Unlock() - return pb.Blockstore.Put(block) + return pb.Blockstore.Put(ctx, block) } -func (pb *proxyingBlockstore) PutMany(blocks []blocks.Block) error { +func (pb *proxyingBlockstore) PutMany(ctx context.Context, blocks []blocks.Block) error { pb.lk.Lock() if pb.tracing { for _, b := range blocks { @@ -159,5 +159,5 @@ func (pb *proxyingBlockstore) PutMany(blocks []blocks.Block) error { } } pb.lk.Unlock() - return pb.Blockstore.PutMany(blocks) + return pb.Blockstore.PutMany(ctx, blocks) } From e4233e45be9f1cbedf716db76b32b6c0d2d55398 Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 13 Dec 2021 15:15:38 +0200 Subject: [PATCH 071/393] plumb contexts in lotus-sim --- cmd/lotus-sim/create.go | 4 ++-- cmd/lotus-sim/info_capacity.go | 2 +- cmd/lotus-sim/info_state.go | 4 ++-- cmd/lotus-sim/simulation/block.go | 2 +- cmd/lotus-sim/simulation/node.go | 12 ++++++------ cmd/lotus-sim/simulation/simulation.go | 12 ++++++------ 6 files changed, 18 insertions(+), 18 deletions(-) diff --git a/cmd/lotus-sim/create.go b/cmd/lotus-sim/create.go index 4867a5da5ec..23ea454a3ca 100644 --- a/cmd/lotus-sim/create.go +++ b/cmd/lotus-sim/create.go @@ -26,7 +26,7 @@ var createSimCommand = &cli.Command{ var ts *types.TipSet switch cctx.NArg() { case 0: - if err := node.Chainstore.Load(); err != nil { + if err := node.Chainstore.Load(cctx.Context); err != nil { return err } ts = node.Chainstore.GetHeaviestTipSet() @@ -36,7 +36,7 @@ var createSimCommand = &cli.Command{ return err } tsk := types.NewTipSetKey(cids...) - ts, err = node.Chainstore.LoadTipSet(tsk) + ts, err = node.Chainstore.LoadTipSet(cctx.Context, tsk) if err != nil { return err } diff --git a/cmd/lotus-sim/info_capacity.go b/cmd/lotus-sim/info_capacity.go index 4372ee34afb..a92d2cde494 100644 --- a/cmd/lotus-sim/info_capacity.go +++ b/cmd/lotus-sim/info_capacity.go @@ -39,7 +39,7 @@ var infoCapacityGrowthSimCommand = &cli.Command{ lastHeight := ts.Height() for ts.Height() > firstEpoch && cctx.Err() == nil { - ts, err = sim.Node.Chainstore.LoadTipSet(ts.Parents()) + ts, err = sim.Node.Chainstore.LoadTipSet(cctx.Context, ts.Parents()) if err != nil { return err } diff --git a/cmd/lotus-sim/info_state.go b/cmd/lotus-sim/info_state.go index 5c9541513c6..125dae81d96 100644 --- a/cmd/lotus-sim/info_state.go +++ b/cmd/lotus-sim/info_state.go @@ -60,7 +60,7 @@ var infoStateGrowthSimCommand = &cli.Command{ var links []cid.Cid var totalSize uint64 - if err := store.View(c, func(data []byte) error { + if err := store.View(cctx.Context, c, func(data []byte) error { totalSize += uint64(len(data)) return cbg.ScanForLinks(bytes.NewReader(data), func(c cid.Cid) { if c.Prefix().Codec != cid.DagCBOR { @@ -131,7 +131,7 @@ var infoStateGrowthSimCommand = &cli.Command{ fmt.Fprintf(cctx.App.Writer, "%d: %s\n", ts.Height(), types.SizeStr(types.NewInt(parentStateSize))) } - ts, err = sim.Node.Chainstore.LoadTipSet(ts.Parents()) + ts, err = sim.Node.Chainstore.LoadTipSet(cctx.Context, ts.Parents()) if err != nil { return err } diff --git a/cmd/lotus-sim/simulation/block.go b/cmd/lotus-sim/simulation/block.go index 93e6a319177..106bc53f596 100644 --- a/cmd/lotus-sim/simulation/block.go +++ b/cmd/lotus-sim/simulation/block.go @@ -73,7 +73,7 @@ func (sim *Simulation) makeTipSet(ctx context.Context, messages []*types.Message Timestamp: uts, ElectionProof: &types.ElectionProof{WinCount: 1}, }} - err = sim.Node.Chainstore.PersistBlockHeaders(blks...) + err = sim.Node.Chainstore.PersistBlockHeaders(ctx, blks...) if err != nil { return nil, xerrors.Errorf("failed to persist block headers: %w", err) } diff --git a/cmd/lotus-sim/simulation/node.go b/cmd/lotus-sim/simulation/node.go index c18f27a331d..da027ff4f8b 100644 --- a/cmd/lotus-sim/simulation/node.go +++ b/cmd/lotus-sim/simulation/node.go @@ -135,7 +135,7 @@ func (nd *Node) CreateSim(ctx context.Context, name string, head *types.TipSet) StateManager: sm, stages: stages, } - if has, err := nd.MetadataDS.Has(sim.key("head")); err != nil { + if has, err := nd.MetadataDS.Has(ctx, sim.key("head")); err != nil { return nil, err } else if has { return nil, xerrors.Errorf("simulation named %s already exists", name) @@ -155,7 +155,7 @@ func (nd *Node) CreateSim(ctx context.Context, name string, head *types.TipSet) // ListSims lists all simulations. func (nd *Node) ListSims(ctx context.Context) ([]string, error) { prefix := simulationPrefix.ChildString("head").String() - items, err := nd.MetadataDS.Query(query.Query{ + items, err := nd.MetadataDS.Query(ctx, query.Query{ Prefix: prefix, KeysOnly: true, Orders: []query.Order{query.OrderByKey{}}, @@ -192,7 +192,7 @@ func (nd *Node) DeleteSim(ctx context.Context, name string) error { var err error for _, field := range simFields { key := simulationPrefix.ChildString(field).ChildString(name) - err = multierr.Append(err, nd.MetadataDS.Delete(key)) + err = multierr.Append(err, nd.MetadataDS.Delete(ctx, key)) } return err } @@ -209,7 +209,7 @@ func (nd *Node) CopySim(ctx context.Context, oldName, newName string) error { values := make(map[string][]byte) for _, field := range simFields { key := simulationPrefix.ChildString(field).ChildString(oldName) - value, err := nd.MetadataDS.Get(key) + value, err := nd.MetadataDS.Get(ctx, key) if err == datastore.ErrNotFound { continue } else if err != nil { @@ -226,9 +226,9 @@ func (nd *Node) CopySim(ctx context.Context, oldName, newName string) error { key := simulationPrefix.ChildString(field).ChildString(newName) var err error if value, ok := values[field]; ok { - err = nd.MetadataDS.Put(key, value) + err = nd.MetadataDS.Put(ctx, key, value) } else { - err = nd.MetadataDS.Delete(key) + err = nd.MetadataDS.Delete(ctx, key) } if err != nil { return err diff --git a/cmd/lotus-sim/simulation/simulation.go b/cmd/lotus-sim/simulation/simulation.go index 02792e332c0..51404220e3e 100644 --- a/cmd/lotus-sim/simulation/simulation.go +++ b/cmd/lotus-sim/simulation/simulation.go @@ -90,7 +90,7 @@ type Simulation struct { // loadConfig loads a simulation's config from the datastore. This must be called on startup and may // be called to restore the config from-disk. func (sim *Simulation) loadConfig() error { - configBytes, err := sim.Node.MetadataDS.Get(sim.key("config")) + configBytes, err := sim.Node.MetadataDS.Get(context.Background(), sim.key("config")) if err == nil { err = json.Unmarshal(configBytes, &sim.config) } @@ -111,7 +111,7 @@ func (sim *Simulation) saveConfig() error { if err != nil { return err } - return sim.Node.MetadataDS.Put(sim.key("config"), buf) + return sim.Node.MetadataDS.Put(context.Background(), sim.key("config"), buf) } var simulationPrefix = datastore.NewKey("/simulation") @@ -124,7 +124,7 @@ func (sim *Simulation) key(subkey string) datastore.Key { // loadNamedTipSet the tipset with the given name (for this simulation) func (sim *Simulation) loadNamedTipSet(name string) (*types.TipSet, error) { - tskBytes, err := sim.Node.MetadataDS.Get(sim.key(name)) + tskBytes, err := sim.Node.MetadataDS.Get(context.Background(), sim.key(name)) if err != nil { return nil, xerrors.Errorf("failed to load tipset %s/%s: %w", sim.name, name, err) } @@ -132,7 +132,7 @@ func (sim *Simulation) loadNamedTipSet(name string) (*types.TipSet, error) { if err != nil { return nil, xerrors.Errorf("failed to parse tipste %v (%s/%s): %w", tskBytes, sim.name, name, err) } - ts, err := sim.Node.Chainstore.LoadTipSet(tsk) + ts, err := sim.Node.Chainstore.LoadTipSet(context.Background(), tsk) if err != nil { return nil, xerrors.Errorf("failed to load tipset %s (%s/%s): %w", tsk, sim.name, name, err) } @@ -141,7 +141,7 @@ func (sim *Simulation) loadNamedTipSet(name string) (*types.TipSet, error) { // storeNamedTipSet stores the tipset at name (relative to the simulation). func (sim *Simulation) storeNamedTipSet(name string, ts *types.TipSet) error { - if err := sim.Node.MetadataDS.Put(sim.key(name), ts.Key().Bytes()); err != nil { + if err := sim.Node.MetadataDS.Put(context.Background(), sim.key(name), ts.Key().Bytes()); err != nil { return xerrors.Errorf("failed to store tipset (%s/%s): %w", sim.name, name, err) } return nil @@ -308,7 +308,7 @@ func (sim *Simulation) Walk( stCid = ts.MinTicketBlock().ParentStateRoot recCid = ts.MinTicketBlock().ParentMessageReceipts - ts, err = sim.Node.Chainstore.LoadTipSet(ts.Parents()) + ts, err = sim.Node.Chainstore.LoadTipSet(ctx, ts.Parents()) if err != nil { return xerrors.Errorf("loading parent: %w", err) } From 3e288f1066f290f59316696f506b2ae2b02a2cd3 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Mon, 13 Dec 2021 15:47:17 -0500 Subject: [PATCH 072/393] Update FFI --- extern/filecoin-ffi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extern/filecoin-ffi b/extern/filecoin-ffi index 428503c87d9..52d80081bfd 160000 --- a/extern/filecoin-ffi +++ b/extern/filecoin-ffi @@ -1 +1 @@ -Subproject commit 428503c87d917cc5e3e637983b43b4c260863bf0 +Subproject commit 52d80081bfdd8a30bc44bcfe44cb0f299615b9f3 From ac3cdf75fa8e50ae61c3a7caf6473e2e38038f4d Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Wed, 8 Sep 2021 15:22:41 -0400 Subject: [PATCH 073/393] Mempool: Selection logic should respect block message limits --- chain/messagepool/selection.go | 77 +++++++++++++++++++++------------- 1 file changed, 47 insertions(+), 30 deletions(-) diff --git a/chain/messagepool/selection.go b/chain/messagepool/selection.go index acff7c4cff9..88b1b63af28 100644 --- a/chain/messagepool/selection.go +++ b/chain/messagepool/selection.go @@ -92,7 +92,7 @@ func (mp *MessagePool) selectMessagesOptimal(ctx context.Context, curTs, ts *typ result, gasLimit := mp.selectPriorityMessages(ctx, pending, baseFee, ts) // have we filled the block? - if gasLimit < minGas { + if gasLimit < minGas || len(result) >= build.BlockMessageLimit { return result, nil } @@ -117,19 +117,21 @@ func (mp *MessagePool) selectMessagesOptimal(ctx context.Context, curTs, ts *typ return result, nil } - // 3. Parition chains into blocks (without trimming) + // 3. Partition chains into blocks (without trimming) // we use the full blockGasLimit (as opposed to the residual gas limit from the - // priority message selection) as we have to account for what other miners are doing + // priority message selection) as we have to account for what other block providers are doing nextChain := 0 partitions := make([][]*msgChain, MaxBlocks) for i := 0; i < MaxBlocks && nextChain < len(chains); i++ { gasLimit := int64(build.BlockGasLimit) + msgLimit := build.BlockMessageLimit for nextChain < len(chains) { chain := chains[nextChain] nextChain++ partitions[i] = append(partitions[i], chain) gasLimit -= chain.gasLimit - if gasLimit < minGas { + msgLimit -= len(chain.msgs) + if gasLimit < minGas || msgLimit <= 0 { break } } @@ -158,7 +160,7 @@ func (mp *MessagePool) selectMessagesOptimal(ctx context.Context, curTs, ts *typ }) // 6. Merge the head chains to produce the list of messages selected for inclusion - // subject to the residual gas limit + // subject to the residual block limits // When a chain is merged in, all its previous dependent chains *must* also be // merged in or we'll have a broken block startMerge := time.Now() @@ -176,14 +178,16 @@ func (mp *MessagePool) selectMessagesOptimal(ctx context.Context, curTs, ts *typ // compute the dependencies that must be merged and the gas limit including deps chainGasLimit := chain.gasLimit + chainMsgLimit := len(chain.msgs) var chainDeps []*msgChain for curChain := chain.prev; curChain != nil && !curChain.merged; curChain = curChain.prev { chainDeps = append(chainDeps, curChain) chainGasLimit += curChain.gasLimit + chainMsgLimit += len(curChain.msgs) } // does it all fit in the block? - if chainGasLimit <= gasLimit { + if chainGasLimit <= gasLimit && chainMsgLimit+len(result) <= build.BlockMessageLimit { // include it together with all dependencies for i := len(chainDeps) - 1; i >= 0; i-- { curChain := chainDeps[i] @@ -192,7 +196,7 @@ func (mp *MessagePool) selectMessagesOptimal(ctx context.Context, curTs, ts *typ } chain.merged = true - // adjust the effective pefromance for all subsequent chains + // adjust the effective performance for all subsequent chains if next := chain.next; next != nil && next.effPerf > 0 { next.effPerf += next.parentOffset for next = next.next; next != nil && next.effPerf > 0; next = next.next { @@ -222,7 +226,7 @@ func (mp *MessagePool) selectMessagesOptimal(ctx context.Context, curTs, ts *typ // 7. We have reached the edge of what can fit wholesale; if we still hae available // gasLimit to pack some more chains, then trim the last chain and push it down. - // Trimming invalidaates subsequent dependent chains so that they can't be selected + // Trimming invalidates subsequent dependent chains so that they can't be selected // as their dependency cannot be (fully) included. // We do this in a loop because the blocker might have been inordinately large and // we might have to do it multiple times to satisfy tail packing @@ -231,7 +235,7 @@ tailLoop: for gasLimit >= minGas && last < len(chains) { // trim if necessary if chains[last].gasLimit > gasLimit { - chains[last].Trim(gasLimit, mp, baseFee) + chains[last].Trim(gasLimit, build.BlockMessageLimit-len(result), mp, baseFee) } // push down if it hasn't been invalidated @@ -263,16 +267,20 @@ tailLoop: // compute the dependencies that must be merged and the gas limit including deps chainGasLimit := chain.gasLimit + chainMsgLimit := len(chain.msgs) depGasLimit := int64(0) + depMsgLimit := 0 var chainDeps []*msgChain for curChain := chain.prev; curChain != nil && !curChain.merged; curChain = curChain.prev { chainDeps = append(chainDeps, curChain) chainGasLimit += curChain.gasLimit + chainMsgLimit += len(curChain.msgs) depGasLimit += curChain.gasLimit + depMsgLimit += len(curChain.msgs) } // does it all fit in the bock - if chainGasLimit <= gasLimit { + if chainGasLimit <= gasLimit && len(result)+chainMsgLimit <= build.BlockMessageLimit { // include it together with all dependencies for i := len(chainDeps) - 1; i >= 0; i-- { curChain := chainDeps[i] @@ -288,17 +296,17 @@ tailLoop: // it doesn't all fit; now we have to take into account the dependent chains before // making a decision about trimming or invalidating. - // if the dependencies exceed the gas limit, then we must invalidate the chain + // if the dependencies exceed the block limits, then we must invalidate the chain // as it can never be included. // Otherwise we can just trim and continue - if depGasLimit > gasLimit { + if depGasLimit > gasLimit || len(result)+depMsgLimit >= build.BlockMessageLimit { chain.Invalidate() last += i + 1 continue tailLoop } // dependencies fit, just trim it - chain.Trim(gasLimit-depGasLimit, mp, baseFee) + chain.Trim(gasLimit-depGasLimit, build.BlockMessageLimit-len(result)-depMsgLimit, mp, baseFee) last += i continue tailLoop } @@ -311,9 +319,9 @@ tailLoop: log.Infow("pack tail chains done", "took", dt) } - // if we have gasLimit to spare, pick some random (non-negative) chains to fill the block - // we pick randomly so that we minimize the probability of duplication among all miners - if gasLimit >= minGas { + // if we have room to spare, pick some random (non-negative) chains to fill the block + // we pick randomly so that we minimize the probability of duplication among all block producers + if gasLimit >= minGas && len(result) <= build.BlockMessageLimit { randomCount := 0 startRandom := time.Now() @@ -321,7 +329,7 @@ tailLoop: for _, chain := range chains { // have we filled the block - if gasLimit < minGas { + if gasLimit < minGas || len(result) >= build.BlockMessageLimit { break } @@ -337,23 +345,27 @@ tailLoop: // compute the dependencies that must be merged and the gas limit including deps chainGasLimit := chain.gasLimit + chainMsgLimit := len(chain.msgs) depGasLimit := int64(0) + depMsgLimit := 0 var chainDeps []*msgChain for curChain := chain.prev; curChain != nil && !curChain.merged; curChain = curChain.prev { chainDeps = append(chainDeps, curChain) chainGasLimit += curChain.gasLimit + chainMsgLimit += len(curChain.msgs) depGasLimit += curChain.gasLimit + depMsgLimit += len(curChain.msgs) } // do the deps fit? if the deps won't fit, invalidate the chain - if depGasLimit > gasLimit { + if depGasLimit > gasLimit || len(result)+depMsgLimit > build.BlockMessageLimit { chain.Invalidate() continue } // do they fit as is? if it doesn't, trim to make it fit if possible - if chainGasLimit > gasLimit { - chain.Trim(gasLimit-depGasLimit, mp, baseFee) + if chainGasLimit > gasLimit || len(result)+chainMsgLimit > build.BlockMessageLimit { + chain.Trim(gasLimit-depGasLimit, build.BlockMessageLimit-len(result)-depMsgLimit, mp, baseFee) if !chain.valid { continue @@ -416,7 +428,7 @@ func (mp *MessagePool) selectMessagesGreedy(ctx context.Context, curTs, ts *type result, gasLimit := mp.selectPriorityMessages(ctx, pending, baseFee, ts) // have we filled the block? - if gasLimit < minGas { + if gasLimit < minGas || len(result) > build.BlockMessageLimit { return result, nil } @@ -442,7 +454,7 @@ func (mp *MessagePool) selectMessagesGreedy(ctx context.Context, curTs, ts *type } // 3. Merge the head chains to produce the list of messages selected for inclusion, subject to - // the block gas limit. + // the block gas and message limits. startMerge := time.Now() last := len(chains) for i, chain := range chains { @@ -452,13 +464,13 @@ func (mp *MessagePool) selectMessagesGreedy(ctx context.Context, curTs, ts *type } // does it fit in the block? - if chain.gasLimit <= gasLimit { + if chain.gasLimit <= gasLimit && len(result)+len(chain.msgs) <= build.BlockMessageLimit { gasLimit -= chain.gasLimit result = append(result, chain.msgs...) continue } - // we can't fit this chain because of block gasLimit -- we are at the edge + // we can't fit this chain because of block limits -- we are at the edge last = i break } @@ -476,7 +488,7 @@ func (mp *MessagePool) selectMessagesGreedy(ctx context.Context, curTs, ts *type tailLoop: for gasLimit >= minGas && last < len(chains) { // trim - chains[last].Trim(gasLimit, mp, baseFee) + chains[last].Trim(gasLimit, build.BlockMessageLimit-len(result), mp, baseFee) // push down if it hasn't been invalidated if chains[last].valid { @@ -501,7 +513,7 @@ tailLoop: } // does it fit in the bock? - if chain.gasLimit <= gasLimit { + if chain.gasLimit <= gasLimit && len(result)+len(chain.msgs) <= build.BlockMessageLimit { gasLimit -= chain.gasLimit result = append(result, chain.msgs...) continue @@ -778,11 +790,16 @@ func (mp *MessagePool) createMessageChains(actor address.Address, mset map[uint6 return nil } + // if we have more messages from this sender than can fit in a block, drop the extra ones + if len(msgs) > build.BlockMessageLimit { + msgs = msgs[:build.BlockMessageLimit] + } + // ok, now we can construct the chains using the messages we have // invariant: each chain has a bigger gasPerf than the next -- otherwise they can be merged // and increase the gasPerf of the first chain // We do this in two passes: - // - in the first pass we create chains that aggreagate messages with non-decreasing gasPerf + // - in the first pass we create chains that aggregate messages with non-decreasing gasPerf // - in the second pass we merge chains to maintain the invariant. var chains []*msgChain var curChain *msgChain @@ -808,7 +825,7 @@ func (mp *MessagePool) createMessageChains(actor address.Address, mset map[uint6 gasLimit := curChain.gasLimit + m.Message.GasLimit gasPerf := mp.getGasPerf(gasReward, gasLimit) - // try to add the message to the current chain -- if it decreases the gasPerf, then make a + // try to add the message to the current chain -- if it decreases the gasPerf, or then make a // new chain if gasPerf < curChain.gasPerf { chains = append(chains, curChain) @@ -868,9 +885,9 @@ func (mc *msgChain) Before(other *msgChain) bool { (mc.gasPerf == other.gasPerf && mc.gasReward.Cmp(other.gasReward) > 0) } -func (mc *msgChain) Trim(gasLimit int64, mp *MessagePool, baseFee types.BigInt) { +func (mc *msgChain) Trim(gasLimit int64, msgLimit int, mp *MessagePool, baseFee types.BigInt) { i := len(mc.msgs) - 1 - for i >= 0 && (mc.gasLimit > gasLimit || mc.gasPerf < 0) { + for i >= 0 && (mc.gasLimit > gasLimit || mc.gasPerf < 0 || i >= msgLimit) { gasReward := mp.getGasReward(mc.msgs[i], baseFee) mc.gasReward = new(big.Int).Sub(mc.gasReward, gasReward) mc.gasLimit -= mc.msgs[i].Message.GasLimit From dd20cb73019d6f4e462a0cef23c9aa3e67cc36ea Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Fri, 10 Sep 2021 17:47:12 -0400 Subject: [PATCH 074/393] Consensus: Safety check against unknown sig types --- chain/consensus/filcns/mine.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/chain/consensus/filcns/mine.go b/chain/consensus/filcns/mine.go index bbda35fcfd3..757363a76c2 100644 --- a/chain/consensus/filcns/mine.go +++ b/chain/consensus/filcns/mine.go @@ -65,7 +65,7 @@ func (filec *FilecoinEC) CreateBlock(ctx context.Context, w api.Wallet, bt *api. } blsMsgCids = append(blsMsgCids, c) - } else { + } else if msg.Signature.Type == crypto.SigTypeSecp256k1 { c, err := filec.sm.ChainStore().PutMessage(msg) if err != nil { return nil, err @@ -74,6 +74,8 @@ func (filec *FilecoinEC) CreateBlock(ctx context.Context, w api.Wallet, bt *api. secpkMsgCids = append(secpkMsgCids, c) secpkMessages = append(secpkMessages, msg) + } else { + return nil, xerrors.Errorf("unknown sig type: %d", msg.Signature.Type) } } From ec00e73c9d983140291bada2b866c1991518477e Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Fri, 10 Sep 2021 20:24:12 -0400 Subject: [PATCH 075/393] Mempool: Selection should respect CBOR limits --- chain/messagepool/repub.go | 6 +- chain/messagepool/selection.go | 340 ++++++++++++++++------------ chain/messagepool/selection_test.go | 8 +- 3 files changed, 203 insertions(+), 151 deletions(-) diff --git a/chain/messagepool/repub.go b/chain/messagepool/repub.go index 4323bdee197..d92b5bd5855 100644 --- a/chain/messagepool/repub.go +++ b/chain/messagepool/repub.go @@ -121,7 +121,7 @@ loop: // we can't fit the current chain but there is gas to spare // trim it and push it down - chain.Trim(gasLimit, mp, baseFee) + chain.Trim(gasLimit, repubMsgLimit, mp, baseFee) for j := i; j < len(chains)-1; j++ { if chains[j].Before(chains[j+1]) { break @@ -131,6 +131,10 @@ loop: } count := 0 + if len(msgs) > repubMsgLimit { + msgs = msgs[:repubMsgLimit] + } + log.Infof("republishing %d messages", len(msgs)) for _, m := range msgs { mb, err := m.Serialize() diff --git a/chain/messagepool/selection.go b/chain/messagepool/selection.go index 88b1b63af28..7446ee4e4b4 100644 --- a/chain/messagepool/selection.go +++ b/chain/messagepool/selection.go @@ -7,6 +7,10 @@ import ( "sort" "time" + cbg "github.com/whyrusleeping/cbor-gen" + + "github.com/filecoin-project/go-state-types/crypto" + "golang.org/x/xerrors" "github.com/filecoin-project/go-address" @@ -34,9 +38,10 @@ type msgChain struct { merged bool next *msgChain prev *msgChain + sigType crypto.SigType } -func (mp *MessagePool) SelectMessages(ctx context.Context, ts *types.TipSet, tq float64) (msgs []*types.SignedMessage, err error) { +func (mp *MessagePool) SelectMessages(ctx context.Context, ts *types.TipSet, tq float64) ([]*types.SignedMessage, error) { mp.curTsLk.Lock() defer mp.curTsLk.Unlock() @@ -46,24 +51,151 @@ func (mp *MessagePool) SelectMessages(ctx context.Context, ts *types.TipSet, tq // if the ticket quality is high enough that the first block has higher probability // than any other block, then we don't bother with optimal selection because the // first block will always have higher effective performance + var sm *selectedMessages + var err error if tq > 0.84 { - msgs, err = mp.selectMessagesGreedy(ctx, mp.curTs, ts) + sm, err = mp.selectMessagesGreedy(ctx, mp.curTs, ts) } else { - msgs, err = mp.selectMessagesOptimal(ctx, mp.curTs, ts, tq) + sm, err = mp.selectMessagesOptimal(ctx, mp.curTs, ts, tq) } if err != nil { return nil, err } - if len(msgs) > build.BlockMessageLimit { - msgs = msgs[:build.BlockMessageLimit] + // one last sanity check + if len(sm.msgs) > build.BlockMessageLimit { + sm.msgs = sm.msgs[:build.BlockMessageLimit] + } + + return sm.msgs, nil +} + +type selectedMessages struct { + msgs []*types.SignedMessage + gasLimit int64 + secpLimit int + blsLimit int +} + +// returns false if chain can't be added due to block constraints +func (sm *selectedMessages) tryToAdd(mc *msgChain) bool { + l := len(mc.msgs) + + if build.BlockMessageLimit < l+len(sm.msgs) || sm.gasLimit < mc.gasLimit { + return false + } + + if mc.sigType == crypto.SigTypeBLS { + if sm.blsLimit < l { + return false + } + + sm.msgs = append(sm.msgs, mc.msgs...) + sm.blsLimit -= l + sm.gasLimit -= mc.gasLimit + } else if mc.sigType == crypto.SigTypeSecp256k1 { + if sm.secpLimit < l { + return false + } + + sm.msgs = append(sm.msgs, mc.msgs...) + sm.secpLimit -= l + sm.gasLimit -= mc.gasLimit + } + + // don't add the weird sigType msg, but otherwise proceed + return true +} + +// returns false if messages can't be added due to block constraints +// will trim / invalidate chain as appropriate +func (sm *selectedMessages) tryToAddWithDeps(mc *msgChain, mp *MessagePool, baseFee types.BigInt) bool { + // compute the dependencies that must be merged and the gas limit including deps + chainGasLimit := mc.gasLimit + chainMsgLimit := len(mc.msgs) + depGasLimit := int64(0) + depMsgLimit := 0 + smMsgLimit := 0 + + if mc.sigType == crypto.SigTypeBLS { + smMsgLimit = sm.blsLimit + } else if mc.sigType == crypto.SigTypeSecp256k1 { + smMsgLimit = sm.secpLimit + } else { + return false + } + + if smMsgLimit > build.BlockMessageLimit-len(sm.msgs) { + smMsgLimit = build.BlockMessageLimit - len(sm.msgs) + } + + var chainDeps []*msgChain + for curChain := mc.prev; curChain != nil && !curChain.merged; curChain = curChain.prev { + chainDeps = append(chainDeps, curChain) + chainGasLimit += curChain.gasLimit + chainMsgLimit += len(curChain.msgs) + depGasLimit += curChain.gasLimit + depMsgLimit += len(curChain.msgs) + } + + // the chain doesn't fit as-is, so trim / invalidate it and return false + if chainGasLimit > sm.gasLimit || chainMsgLimit > smMsgLimit { + + // it doesn't all fit; now we have to take into account the dependent chains before + // making a decision about trimming or invalidating. + // if the dependencies exceed the block limits, then we must invalidate the chain + // as it can never be included. + // Otherwise we can just trim and continue + if depGasLimit > sm.gasLimit || depMsgLimit >= smMsgLimit { + mc.Invalidate() + } else { + // dependencies fit, just trim it + mc.Trim(sm.gasLimit-depGasLimit, smMsgLimit-depMsgLimit, mp, baseFee) + } + + return false + } + + // the chain fits! include it together with all dependencies + for i := len(chainDeps) - 1; i >= 0; i-- { + curChain := chainDeps[i] + curChain.merged = true + sm.msgs = append(sm.msgs, curChain.msgs...) + } + + mc.merged = true + + sm.msgs = append(sm.msgs, mc.msgs...) + sm.gasLimit -= chainGasLimit + + if mc.sigType == crypto.SigTypeBLS { + sm.blsLimit -= chainMsgLimit + } else if mc.sigType == crypto.SigTypeSecp256k1 { + sm.secpLimit -= chainMsgLimit } - return msgs, nil + return true } -func (mp *MessagePool) selectMessagesOptimal(ctx context.Context, curTs, ts *types.TipSet, tq float64) ([]*types.SignedMessage, error) { +func (sm *selectedMessages) trimChain(mc *msgChain, mp *MessagePool, baseFee types.BigInt) { + msgLimit := build.BlockMessageLimit - len(sm.msgs) + if mc.sigType == crypto.SigTypeBLS { + if msgLimit > sm.blsLimit { + msgLimit = sm.blsLimit + } + } else if mc.sigType == crypto.SigTypeSecp256k1 { + if msgLimit > sm.secpLimit { + msgLimit = sm.secpLimit + } + } + + if mc.gasLimit > sm.gasLimit || len(mc.msgs) > msgLimit { + mc.Trim(sm.gasLimit, msgLimit, mp, baseFee) + } +} + +func (mp *MessagePool) selectMessagesOptimal(ctx context.Context, curTs, ts *types.TipSet, tq float64) (*selectedMessages, error) { start := time.Now() baseFee, err := mp.api.ChainComputeBaseFee(context.TODO(), ts) @@ -89,10 +221,10 @@ func (mp *MessagePool) selectMessagesOptimal(ctx context.Context, curTs, ts *typ // 0b. Select all priority messages that fit in the block minGas := int64(gasguess.MinGas) - result, gasLimit := mp.selectPriorityMessages(ctx, pending, baseFee, ts) + result := mp.selectPriorityMessages(ctx, pending, baseFee, ts) // have we filled the block? - if gasLimit < minGas || len(result) >= build.BlockMessageLimit { + if result.gasLimit < minGas || len(result.msgs) >= build.BlockMessageLimit { return result, nil } @@ -176,26 +308,7 @@ func (mp *MessagePool) selectMessagesOptimal(ctx context.Context, curTs, ts *typ continue } - // compute the dependencies that must be merged and the gas limit including deps - chainGasLimit := chain.gasLimit - chainMsgLimit := len(chain.msgs) - var chainDeps []*msgChain - for curChain := chain.prev; curChain != nil && !curChain.merged; curChain = curChain.prev { - chainDeps = append(chainDeps, curChain) - chainGasLimit += curChain.gasLimit - chainMsgLimit += len(curChain.msgs) - } - - // does it all fit in the block? - if chainGasLimit <= gasLimit && chainMsgLimit+len(result) <= build.BlockMessageLimit { - // include it together with all dependencies - for i := len(chainDeps) - 1; i >= 0; i-- { - curChain := chainDeps[i] - curChain.merged = true - result = append(result, curChain.msgs...) - } - - chain.merged = true + if result.tryToAddWithDeps(chain, mp, baseFee) { // adjust the effective performance for all subsequent chains if next := chain.next; next != nil && next.effPerf > 0 { next.effPerf += next.parentOffset @@ -203,10 +316,8 @@ func (mp *MessagePool) selectMessagesOptimal(ctx context.Context, curTs, ts *typ next.setEffPerf() } } - result = append(result, chain.msgs...) - gasLimit -= chainGasLimit - // resort to account for already merged chains and effective performance adjustments + // re-sort to account for already merged chains and effective performance adjustments // the sort *must* be stable or we end up getting negative gasPerfs pushed up. sort.SliceStable(chains[i+1:], func(i, j int) bool { return chains[i].BeforeEffective(chains[j]) @@ -215,7 +326,7 @@ func (mp *MessagePool) selectMessagesOptimal(ctx context.Context, curTs, ts *typ continue } - // we can't fit this chain and its dependencies because of block gasLimit -- we are + // we can't fit this chain and its dependencies because of block limits -- we are // at the edge last = i break @@ -232,12 +343,16 @@ func (mp *MessagePool) selectMessagesOptimal(ctx context.Context, curTs, ts *typ // we might have to do it multiple times to satisfy tail packing startTail := time.Now() tailLoop: - for gasLimit >= minGas && last < len(chains) { - // trim if necessary - if chains[last].gasLimit > gasLimit { - chains[last].Trim(gasLimit, build.BlockMessageLimit-len(result), mp, baseFee) + for result.gasLimit >= minGas && last < len(chains) { + + if !chains[last].valid { + last++ + continue tailLoop } + // trim if necessary + result.trimChain(chains[last], mp, baseFee) + // push down if it hasn't been invalidated if chains[last].valid { for i := last; i < len(chains)-1; i++ { @@ -249,7 +364,7 @@ tailLoop: } // select the next (valid and fitting) chain and its dependencies for inclusion - for i, chain := range chains[last:] { + for _, chain := range chains[last:] { // has the chain been invalidated? if !chain.valid { continue @@ -265,49 +380,10 @@ tailLoop: break tailLoop } - // compute the dependencies that must be merged and the gas limit including deps - chainGasLimit := chain.gasLimit - chainMsgLimit := len(chain.msgs) - depGasLimit := int64(0) - depMsgLimit := 0 - var chainDeps []*msgChain - for curChain := chain.prev; curChain != nil && !curChain.merged; curChain = curChain.prev { - chainDeps = append(chainDeps, curChain) - chainGasLimit += curChain.gasLimit - chainMsgLimit += len(curChain.msgs) - depGasLimit += curChain.gasLimit - depMsgLimit += len(curChain.msgs) - } - - // does it all fit in the bock - if chainGasLimit <= gasLimit && len(result)+chainMsgLimit <= build.BlockMessageLimit { - // include it together with all dependencies - for i := len(chainDeps) - 1; i >= 0; i-- { - curChain := chainDeps[i] - curChain.merged = true - result = append(result, curChain.msgs...) - } - - chain.merged = true - result = append(result, chain.msgs...) - gasLimit -= chainGasLimit + if result.tryToAddWithDeps(chain, mp, baseFee) { continue } - // it doesn't all fit; now we have to take into account the dependent chains before - // making a decision about trimming or invalidating. - // if the dependencies exceed the block limits, then we must invalidate the chain - // as it can never be included. - // Otherwise we can just trim and continue - if depGasLimit > gasLimit || len(result)+depMsgLimit >= build.BlockMessageLimit { - chain.Invalidate() - last += i + 1 - continue tailLoop - } - - // dependencies fit, just trim it - chain.Trim(gasLimit-depGasLimit, build.BlockMessageLimit-len(result)-depMsgLimit, mp, baseFee) - last += i continue tailLoop } @@ -321,15 +397,15 @@ tailLoop: // if we have room to spare, pick some random (non-negative) chains to fill the block // we pick randomly so that we minimize the probability of duplication among all block producers - if gasLimit >= minGas && len(result) <= build.BlockMessageLimit { - randomCount := 0 + if result.gasLimit >= minGas && len(result.msgs) <= build.BlockMessageLimit { + preRandomLength := len(result.msgs) startRandom := time.Now() shuffleChains(chains) for _, chain := range chains { // have we filled the block - if gasLimit < minGas || len(result) >= build.BlockMessageLimit { + if result.gasLimit < minGas || len(result.msgs) >= build.BlockMessageLimit { break } @@ -343,63 +419,31 @@ tailLoop: continue } - // compute the dependencies that must be merged and the gas limit including deps - chainGasLimit := chain.gasLimit - chainMsgLimit := len(chain.msgs) - depGasLimit := int64(0) - depMsgLimit := 0 - var chainDeps []*msgChain - for curChain := chain.prev; curChain != nil && !curChain.merged; curChain = curChain.prev { - chainDeps = append(chainDeps, curChain) - chainGasLimit += curChain.gasLimit - chainMsgLimit += len(curChain.msgs) - depGasLimit += curChain.gasLimit - depMsgLimit += len(curChain.msgs) - } - - // do the deps fit? if the deps won't fit, invalidate the chain - if depGasLimit > gasLimit || len(result)+depMsgLimit > build.BlockMessageLimit { - chain.Invalidate() + if result.tryToAddWithDeps(chain, mp, baseFee) { continue } - // do they fit as is? if it doesn't, trim to make it fit if possible - if chainGasLimit > gasLimit || len(result)+chainMsgLimit > build.BlockMessageLimit { - chain.Trim(gasLimit-depGasLimit, build.BlockMessageLimit-len(result)-depMsgLimit, mp, baseFee) - - if !chain.valid { - continue - } - } - - // include it together with all dependencies - for i := len(chainDeps) - 1; i >= 0; i-- { - curChain := chainDeps[i] - curChain.merged = true - result = append(result, curChain.msgs...) - randomCount += len(curChain.msgs) + if chain.valid { + // chain got trimmed on the previous call to tryToAddWithDeps, can now be included + result.tryToAddWithDeps(chain, mp, baseFee) + continue } - - chain.merged = true - result = append(result, chain.msgs...) - randomCount += len(chain.msgs) - gasLimit -= chainGasLimit } if dt := time.Since(startRandom); dt > time.Millisecond { log.Infow("pack random tail chains done", "took", dt) } - if randomCount > 0 { + if len(result.msgs) != preRandomLength { log.Warnf("optimal selection failed to pack a block; picked %d messages with random selection", - randomCount) + len(result.msgs)-preRandomLength) } } return result, nil } -func (mp *MessagePool) selectMessagesGreedy(ctx context.Context, curTs, ts *types.TipSet) ([]*types.SignedMessage, error) { +func (mp *MessagePool) selectMessagesGreedy(ctx context.Context, curTs, ts *types.TipSet) (*selectedMessages, error) { start := time.Now() baseFee, err := mp.api.ChainComputeBaseFee(context.TODO(), ts) @@ -425,10 +469,10 @@ func (mp *MessagePool) selectMessagesGreedy(ctx context.Context, curTs, ts *type // 0b. Select all priority messages that fit in the block minGas := int64(gasguess.MinGas) - result, gasLimit := mp.selectPriorityMessages(ctx, pending, baseFee, ts) + result := mp.selectPriorityMessages(ctx, pending, baseFee, ts) // have we filled the block? - if gasLimit < minGas || len(result) > build.BlockMessageLimit { + if result.gasLimit < minGas || len(result.msgs) > build.BlockMessageLimit { return result, nil } @@ -464,9 +508,8 @@ func (mp *MessagePool) selectMessagesGreedy(ctx context.Context, curTs, ts *type } // does it fit in the block? - if chain.gasLimit <= gasLimit && len(result)+len(chain.msgs) <= build.BlockMessageLimit { - gasLimit -= chain.gasLimit - result = append(result, chain.msgs...) + if result.tryToAdd(chain) { + // there was room, we added the chain, keep going continue } @@ -486,9 +529,9 @@ func (mp *MessagePool) selectMessagesGreedy(ctx context.Context, curTs, ts *type // have to do it multiple times to satisfy tail packing. startTail := time.Now() tailLoop: - for gasLimit >= minGas && last < len(chains) { + for result.gasLimit >= minGas && last < len(chains) { // trim - chains[last].Trim(gasLimit, build.BlockMessageLimit-len(result), mp, baseFee) + result.trimChain(chains[last], mp, baseFee) // push down if it hasn't been invalidated if chains[last].valid { @@ -513,9 +556,8 @@ tailLoop: } // does it fit in the bock? - if chain.gasLimit <= gasLimit && len(result)+len(chain.msgs) <= build.BlockMessageLimit { - gasLimit -= chain.gasLimit - result = append(result, chain.msgs...) + if result.tryToAdd(chain) { + // there was room, we added the chain, keep going continue } @@ -535,7 +577,7 @@ tailLoop: return result, nil } -func (mp *MessagePool) selectPriorityMessages(ctx context.Context, pending map[address.Address]map[uint64]*types.SignedMessage, baseFee types.BigInt, ts *types.TipSet) ([]*types.SignedMessage, int64) { +func (mp *MessagePool) selectPriorityMessages(ctx context.Context, pending map[address.Address]map[uint64]*types.SignedMessage, baseFee types.BigInt, ts *types.TipSet) *selectedMessages { start := time.Now() defer func() { if dt := time.Since(start); dt > time.Millisecond { @@ -543,8 +585,12 @@ func (mp *MessagePool) selectPriorityMessages(ctx context.Context, pending map[a } }() mpCfg := mp.getConfig() - result := make([]*types.SignedMessage, 0, mpCfg.SizeLimitLow) - gasLimit := int64(build.BlockGasLimit) + result := &selectedMessages{ + msgs: make([]*types.SignedMessage, 0, mpCfg.SizeLimitLow), + gasLimit: int64(build.BlockGasLimit), + blsLimit: cbg.MaxLength, + secpLimit: cbg.MaxLength, + } minGas := int64(gasguess.MinGas) // 1. Get priority actor chains @@ -554,7 +600,7 @@ func (mp *MessagePool) selectPriorityMessages(ctx context.Context, pending map[a pk, err := mp.resolveToKey(ctx, actor) if err != nil { log.Debugf("mpooladdlocal failed to resolve sender: %s", err) - return nil, gasLimit + return result } mset, ok := pending[pk] @@ -566,9 +612,8 @@ func (mp *MessagePool) selectPriorityMessages(ctx context.Context, pending map[a chains = append(chains, next...) } } - if len(chains) == 0 { - return nil, gasLimit + return result } // 2. Sort the chains @@ -578,7 +623,7 @@ func (mp *MessagePool) selectPriorityMessages(ctx context.Context, pending map[a if len(chains) != 0 && chains[0].gasPerf < 0 { log.Warnw("all priority messages in mpool have negative gas performance", "bestGasPerf", chains[0].gasPerf) - return nil, gasLimit + return result } // 3. Merge chains until the block limit, as long as they have non-negative gas performance @@ -588,9 +633,8 @@ func (mp *MessagePool) selectPriorityMessages(ctx context.Context, pending map[a break } - if chain.gasLimit <= gasLimit { - gasLimit -= chain.gasLimit - result = append(result, chain.msgs...) + if result.tryToAdd(chain) { + // there was room, we added the chain, keep going continue } @@ -600,9 +644,10 @@ func (mp *MessagePool) selectPriorityMessages(ctx context.Context, pending map[a } tailLoop: - for gasLimit >= minGas && last < len(chains) { + for result.gasLimit >= minGas && last < len(chains) { // trim, discarding negative performing messages - chains[last].Trim(gasLimit, mp, baseFee) + + result.trimChain(chains[last], mp, baseFee) // push down if it hasn't been invalidated if chains[last].valid { @@ -627,9 +672,8 @@ tailLoop: } // does it fit in the bock? - if chain.gasLimit <= gasLimit { - gasLimit -= chain.gasLimit - result = append(result, chain.msgs...) + if result.tryToAdd(chain) { + // there was room, we added the chain, keep going continue } @@ -643,7 +687,7 @@ tailLoop: break } - return result, gasLimit + return result } func (mp *MessagePool) getPendingMessages(curTs, ts *types.TipSet) (map[address.Address]map[uint64]*types.SignedMessage, error) { @@ -811,6 +855,7 @@ func (mp *MessagePool) createMessageChains(actor address.Address, mset map[uint6 chain.gasLimit = m.Message.GasLimit chain.gasPerf = mp.getGasPerf(chain.gasReward, chain.gasLimit) chain.valid = true + chain.sigType = m.Signature.Type return chain } @@ -910,6 +955,7 @@ func (mc *msgChain) Trim(gasLimit int64, msgLimit int, mp *MessagePool, baseFee mc.msgs = mc.msgs[:i+1] } + // TODO: if the trim above is a no-op, this (may) needlessly invalidates the next chain if mc.next != nil { mc.next.Invalidate() mc.next = nil diff --git a/chain/messagepool/selection_test.go b/chain/messagepool/selection_test.go index 0f8fd8ee6f2..72739b6a14a 100644 --- a/chain/messagepool/selection_test.go +++ b/chain/messagepool/selection_test.go @@ -577,7 +577,7 @@ func TestMessageSelectionTrimming(t *testing.T) { expected := int(build.BlockGasLimit / gasLimit) if len(msgs) != expected { - t.Fatalf("expected %d messages, bug got %d", expected, len(msgs)) + t.Fatalf("expected %d messages, but got %d", expected, len(msgs)) } mGasLimit := int64(0) @@ -978,7 +978,7 @@ func TestOptimalMessageSelection2(t *testing.T) { func TestOptimalMessageSelection3(t *testing.T) { // this test uses 10 actors sending a block of messages to each other, with the the first // actors paying higher gas premium than the subsequent actors. - // We select with a low ticket quality; the chain depenent merging algorithm should pick + // We select with a low ticket quality; the chain dependent merging algorithm should pick // messages from the median actor from the start mp, tma := makeTestMpool() @@ -1109,11 +1109,13 @@ func testCompetitiveMessageSelection(t *testing.T, rng *rand.Rand, getPremium fu logging.SetLogLevel("messagepool", "error") // 1. greedy selection - greedyMsgs, err := mp.selectMessagesGreedy(context.Background(), ts, ts) + gm, err := mp.selectMessagesGreedy(context.Background(), ts, ts) if err != nil { t.Fatal(err) } + greedyMsgs := gm.msgs + totalGreedyCapacity := 0.0 totalGreedyReward := 0.0 totalOptimalCapacity := 0.0 From a45803d8a033bb267b61bfb2bab53f5fe5dc5c50 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Sat, 11 Sep 2021 21:23:49 -0400 Subject: [PATCH 076/393] Mempool: add selection tests --- chain/messagepool/selection.go | 4 + chain/messagepool/selection_test.go | 199 +++++++++++++++++++++++++++- 2 files changed, 202 insertions(+), 1 deletion(-) diff --git a/chain/messagepool/selection.go b/chain/messagepool/selection.go index 7446ee4e4b4..d7f7750fc6d 100644 --- a/chain/messagepool/selection.go +++ b/chain/messagepool/selection.go @@ -63,6 +63,10 @@ func (mp *MessagePool) SelectMessages(ctx context.Context, ts *types.TipSet, tq return nil, err } + if sm == nil { + return nil, nil + } + // one last sanity check if len(sm.msgs) > build.BlockMessageLimit { sm.msgs = sm.msgs[:build.BlockMessageLimit] diff --git a/chain/messagepool/selection_test.go b/chain/messagepool/selection_test.go index 72739b6a14a..f3389896f6d 100644 --- a/chain/messagepool/selection_test.go +++ b/chain/messagepool/selection_test.go @@ -13,6 +13,10 @@ import ( "sort" "testing" + "github.com/filecoin-project/go-state-types/crypto" + + cbg "github.com/whyrusleeping/cbor-gen" + "github.com/filecoin-project/go-address" "github.com/ipfs/go-cid" "github.com/ipfs/go-datastore" @@ -527,7 +531,7 @@ func TestBasicMessageSelection(t *testing.T) { } } -func TestMessageSelectionTrimming(t *testing.T) { +func TestMessageSelectionTrimmingGas(t *testing.T) { mp, tma := makeTestMpool() // the actors @@ -590,6 +594,199 @@ func TestMessageSelectionTrimming(t *testing.T) { } +func TestMessageSelectionTrimmingMsgsBasic(t *testing.T) { + mp, tma := makeTestMpool() + + // the actors + w1, err := wallet.NewWallet(wallet.NewMemKeyStore()) + if err != nil { + t.Fatal(err) + } + + a1, err := w1.WalletNew(context.Background(), types.KTSecp256k1) + if err != nil { + t.Fatal(err) + } + + block := tma.nextBlock() + ts := mock.TipSet(block) + tma.applyBlock(t, block) + + tma.setBalance(a1, 1) // in FIL + + // create a larger than selectable chain + for i := 0; i < build.BlockMessageLimit; i++ { + m := makeTestMessage(w1, a1, a1, uint64(i), 300000, 100) + mustAdd(t, mp, m) + } + + msgs, err := mp.SelectMessages(context.Background(), ts, 1.0) + if err != nil { + t.Fatal(err) + } + + expected := cbg.MaxLength + if len(msgs) != expected { + t.Fatalf("expected %d messages, but got %d", expected, len(msgs)) + } + + mGasLimit := int64(0) + for _, m := range msgs { + mGasLimit += m.Message.GasLimit + } + if mGasLimit > build.BlockGasLimit { + t.Fatal("selected messages gas limit exceeds block gas limit!") + } + +} + +func TestMessageSelectionTrimmingMsgsTwoSendersBasic(t *testing.T) { + mp, tma := makeTestMpool() + + // the actors + w1, err := wallet.NewWallet(wallet.NewMemKeyStore()) + if err != nil { + t.Fatal(err) + } + + a1, err := w1.WalletNew(context.Background(), types.KTSecp256k1) + if err != nil { + t.Fatal(err) + } + + w2, err := wallet.NewWallet(wallet.NewMemKeyStore()) + if err != nil { + t.Fatal(err) + } + + a2, err := w2.WalletNew(context.Background(), types.KTBLS) + if err != nil { + t.Fatal(err) + } + + block := tma.nextBlock() + ts := mock.TipSet(block) + tma.applyBlock(t, block) + + tma.setBalance(a1, 1) // in FIL + tma.setBalance(a2, 1) // in FIL + + // create 2 larger than selectable chains + for i := 0; i < build.BlockMessageLimit; i++ { + m := makeTestMessage(w1, a1, a2, uint64(i), 300000, 100) + mustAdd(t, mp, m) + // a2's messages are preferred + m = makeTestMessage(w2, a2, a1, uint64(i), 300000, 1000) + mustAdd(t, mp, m) + } + + msgs, err := mp.SelectMessages(context.Background(), ts, 1.0) + if err != nil { + t.Fatal(err) + } + + mGasLimit := int64(0) + counts := make(map[crypto.SigType]uint) + for _, m := range msgs { + mGasLimit += m.Message.GasLimit + counts[m.Signature.Type]++ + } + + if mGasLimit > build.BlockGasLimit { + t.Fatal("selected messages gas limit exceeds block gas limit!") + } + + expected := build.BlockMessageLimit + if len(msgs) != expected { + t.Fatalf("expected %d messages, but got %d", expected, len(msgs)) + } + + if counts[crypto.SigTypeBLS] != cbg.MaxLength { + t.Fatalf("expected %d bls messages, but got %d", cbg.MaxLength, len(msgs)) + } +} + +func TestMessageSelectionTrimmingMsgsTwoSendersAdvanced(t *testing.T) { + mp, tma := makeTestMpool() + + // the actors + w1, err := wallet.NewWallet(wallet.NewMemKeyStore()) + if err != nil { + t.Fatal(err) + } + + a1, err := w1.WalletNew(context.Background(), types.KTSecp256k1) + if err != nil { + t.Fatal(err) + } + + w2, err := wallet.NewWallet(wallet.NewMemKeyStore()) + if err != nil { + t.Fatal(err) + } + + a2, err := w2.WalletNew(context.Background(), types.KTBLS) + if err != nil { + t.Fatal(err) + } + + block := tma.nextBlock() + ts := mock.TipSet(block) + tma.applyBlock(t, block) + + tma.setBalance(a1, 1) // in FIL + tma.setBalance(a2, 1) // in FIL + + // create 2 almost max-length chains of equal value + i := 0 + for i = 0; i < cbg.MaxLength-1; i++ { + m := makeTestMessage(w1, a1, a2, uint64(i), 300000, 100) + mustAdd(t, mp, m) + // a2's messages are preferred + m = makeTestMessage(w2, a2, a1, uint64(i), 300000, 100) + mustAdd(t, mp, m) + } + + // a1's 8192th message is worth more than a2's + m := makeTestMessage(w1, a1, a2, uint64(i), 300000, 1000) + mustAdd(t, mp, m) + + m = makeTestMessage(w2, a2, a1, uint64(i), 300000, 100) + mustAdd(t, mp, m) + + i++ + + // a2's (unselectable) 8193rd message is worth SO MUCH + m = makeTestMessage(w2, a2, a1, uint64(i), 300000, 1000000) + mustAdd(t, mp, m) + + msgs, err := mp.SelectMessages(context.Background(), ts, 1.0) + if err != nil { + t.Fatal(err) + } + + mGasLimit := int64(0) + counts := make(map[crypto.SigType]uint) + for _, m := range msgs { + mGasLimit += m.Message.GasLimit + counts[m.Signature.Type]++ + } + + if mGasLimit > build.BlockGasLimit { + t.Fatal("selected messages gas limit exceeds block gas limit!") + } + + expected := build.BlockMessageLimit + if len(msgs) != expected { + t.Fatalf("expected %d messages, but got %d", expected, len(msgs)) + } + + // we should have taken the secp chain + if counts[crypto.SigTypeSecp256k1] != cbg.MaxLength { + t.Fatalf("expected %d bls messages, but got %d", cbg.MaxLength, len(msgs)) + } +} + func TestPriorityMessageSelection(t *testing.T) { mp, tma := makeTestMpool() From b08bf32040d246078547de935ea0f0e88f844509 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Mon, 13 Dec 2021 18:31:31 -0500 Subject: [PATCH 077/393] Add a log for when message selection fails --- chain/messagepool/selection.go | 1 + 1 file changed, 1 insertion(+) diff --git a/chain/messagepool/selection.go b/chain/messagepool/selection.go index d7f7750fc6d..3ccf2e40619 100644 --- a/chain/messagepool/selection.go +++ b/chain/messagepool/selection.go @@ -69,6 +69,7 @@ func (mp *MessagePool) SelectMessages(ctx context.Context, ts *types.TipSet, tq // one last sanity check if len(sm.msgs) > build.BlockMessageLimit { + log.Errorf("message selection chose too many messages %d > %d", len(sm.msgs), build.BlockMessageLimit) sm.msgs = sm.msgs[:build.BlockMessageLimit] } From a64f2421d2025a6edd260508562edeb26c660e7e Mon Sep 17 00:00:00 2001 From: Darko Brdareski Date: Tue, 14 Dec 2021 11:33:33 +0100 Subject: [PATCH 078/393] Annotate 'incoming' subsystem --- chain/sub/incoming_test.go | 2 ++ itests/ccupgrade_test.go | 1 + itests/cli_test.go | 1 + 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 ++ 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/multisig_test.go | 2 ++ itests/nonce_test.go | 2 ++ itests/paych_api_test.go | 2 ++ itests/paych_cli_test.go | 6 ++++++ 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 | 6 ++++++ itests/sector_terminate_test.go | 2 ++ itests/tape_test.go | 2 ++ itests/verifreg_test.go | 2 ++ itests/wdpost_dispute_test.go | 2 ++ itests/wdpost_test.go | 6 ++++++ 30 files changed, 70 insertions(+) diff --git a/chain/sub/incoming_test.go b/chain/sub/incoming_test.go index 21543920919..1a3ab2785ec 100644 --- a/chain/sub/incoming_test.go +++ b/chain/sub/incoming_test.go @@ -1,3 +1,4 @@ +//stm: #unit package sub import ( @@ -49,6 +50,7 @@ func TestFetchCidsWithDedup(t *testing.T) { } g := &getter{msgs} + //stm: @CHAIN_INCOMING_FETCH_MESSAGES_BY_CID_001 // the cids have a duplicate res, err := FetchMessagesByCids(context.TODO(), g, append(cids, cids[0])) diff --git a/itests/ccupgrade_test.go b/itests/ccupgrade_test.go index a10f1b91785..396ef1766f2 100644 --- a/itests/ccupgrade_test.go +++ b/itests/ccupgrade_test.go @@ -21,6 +21,7 @@ func TestCCUpgrade(t *testing.T) { //stm: @CHAIN_SYNCER_NEW_PEER_HEAD_001, @CHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @CHAIN_SYNCER_STOP_001 //stm: @CHAIN_STATE_MINER_GET_INFO_001 + //stm: @CHAIN_INCOMING_HANDLE_INCOMING_BLOCKS_001, @CHAIN_INCOMING_VALIDATE_BLOCK_PUBSUB_001, @CHAIN_INCOMING_VALIDATE_MESSAGE_PUBSUB_001 kit.QuietMiningLogs() for _, height := range []abi.ChainEpoch{ diff --git a/itests/cli_test.go b/itests/cli_test.go index c100f52897d..ac7e4d48804 100644 --- a/itests/cli_test.go +++ b/itests/cli_test.go @@ -16,6 +16,7 @@ func TestClient(t *testing.T) { //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 _ = os.Setenv("BELLMAN_NO_GPU", "1") kit.QuietMiningLogs() diff --git a/itests/deadlines_test.go b/itests/deadlines_test.go index e43146d599b..fec40eedc74 100644 --- a/itests/deadlines_test.go +++ b/itests/deadlines_test.go @@ -57,6 +57,8 @@ func TestDeadlineToggling(t *testing.T) { //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 kit.Expensive(t) kit.QuietMiningLogs() diff --git a/itests/deals_512mb_test.go b/itests/deals_512mb_test.go index be750cef31f..2c3d59dbe9e 100644 --- a/itests/deals_512mb_test.go +++ b/itests/deals_512mb_test.go @@ -17,6 +17,8 @@ func TestStorageDealMissingBlock(t *testing.T) { //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 ctx := context.Background() // enable 512MiB proofs so we can conduct larger transfers. diff --git a/itests/deals_concurrent_test.go b/itests/deals_concurrent_test.go index e7fb1cb6b83..13da758d522 100644 --- a/itests/deals_concurrent_test.go +++ b/itests/deals_concurrent_test.go @@ -76,6 +76,8 @@ func TestDealCyclesConcurrent(t *testing.T) { //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 if testing.Short() { t.Skip("skipping test in short mode") } diff --git a/itests/deals_max_staging_deals_test.go b/itests/deals_max_staging_deals_test.go index ce4e5c70db5..66285ace3bf 100644 --- a/itests/deals_max_staging_deals_test.go +++ b/itests/deals_max_staging_deals_test.go @@ -17,6 +17,8 @@ func TestMaxStagingDeals(t *testing.T) { //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 ctx := context.Background() // enable 512MiB proofs so we can conduct larger transfers. diff --git a/itests/deals_offline_test.go b/itests/deals_offline_test.go index 54301d25f44..92121b339b6 100644 --- a/itests/deals_offline_test.go +++ b/itests/deals_offline_test.go @@ -21,6 +21,8 @@ func TestOfflineDealFlow(t *testing.T) { //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 runTest := func(t *testing.T, fastRet bool, upscale abi.PaddedPieceSize) { ctx := context.Background() client, miner, ens := kit.EnsembleMinimal(t, kit.WithAllSubsystems()) // no mock proofs diff --git a/itests/deals_padding_test.go b/itests/deals_padding_test.go index 192256fc919..e7881e88820 100644 --- a/itests/deals_padding_test.go +++ b/itests/deals_padding_test.go @@ -19,6 +19,8 @@ func TestDealPadding(t *testing.T) { //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 kit.QuietMiningLogs() var blockTime = 250 * time.Millisecond diff --git a/itests/deals_partial_retrieval_test.go b/itests/deals_partial_retrieval_test.go index 5b34c1f92ad..9285d3c2b67 100644 --- a/itests/deals_partial_retrieval_test.go +++ b/itests/deals_partial_retrieval_test.go @@ -40,6 +40,8 @@ func TestPartialRetrieval(t *testing.T) { //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 ctx := context.Background() policy.SetPreCommitChallengeDelay(2) diff --git a/itests/deals_power_test.go b/itests/deals_power_test.go index 4e5bd3dab45..27b196109ec 100644 --- a/itests/deals_power_test.go +++ b/itests/deals_power_test.go @@ -14,6 +14,8 @@ func TestFirstDealEnablesMining(t *testing.T) { //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 // test making a deal with a fresh miner, and see if it starts to mine. if testing.Short() { t.Skip("skipping test in short mode") diff --git a/itests/deals_pricing_test.go b/itests/deals_pricing_test.go index 95d38557ffd..ec937b7a51a 100644 --- a/itests/deals_pricing_test.go +++ b/itests/deals_pricing_test.go @@ -17,6 +17,8 @@ func TestQuotePriceForUnsealedRetrieval(t *testing.T) { //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 var ( ctx = context.Background() blocktime = 50 * time.Millisecond diff --git a/itests/deals_publish_test.go b/itests/deals_publish_test.go index 59660ec8c73..8d707c23563 100644 --- a/itests/deals_publish_test.go +++ b/itests/deals_publish_test.go @@ -28,6 +28,8 @@ func TestPublishDealsBatching(t *testing.T) { //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 var ( ctx = context.Background() publishPeriod = 10 * time.Second diff --git a/itests/deals_retry_deal_no_funds_test.go b/itests/deals_retry_deal_no_funds_test.go index 36b665deb56..8cfece1750e 100644 --- a/itests/deals_retry_deal_no_funds_test.go +++ b/itests/deals_retry_deal_no_funds_test.go @@ -31,6 +31,8 @@ func TestDealsRetryLackOfFunds(t *testing.T) { //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 ctx := context.Background() oldDelay := policy.GetPreCommitChallengeDelay() policy.SetPreCommitChallengeDelay(5) diff --git a/itests/deals_test.go b/itests/deals_test.go index 2caaa72fcab..fb8e6e4f3fa 100644 --- a/itests/deals_test.go +++ b/itests/deals_test.go @@ -14,6 +14,8 @@ func TestDealsWithSealingAndRPC(t *testing.T) { //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 if testing.Short() { t.Skip("skipping test in short mode") } diff --git a/itests/gateway_test.go b/itests/gateway_test.go index 2e119736623..d5bc9c0eb8e 100644 --- a/itests/gateway_test.go +++ b/itests/gateway_test.go @@ -43,6 +43,8 @@ func TestGatewayWalletMsig(t *testing.T) { //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 kit.QuietMiningLogs() blocktime := 5 * time.Millisecond diff --git a/itests/get_messages_in_ts_test.go b/itests/get_messages_in_ts_test.go index 8e2de984d1e..b5ef0387e4a 100644 --- a/itests/get_messages_in_ts_test.go +++ b/itests/get_messages_in_ts_test.go @@ -21,6 +21,8 @@ func TestChainGetMessagesInTs(t *testing.T) { //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 ctx := context.Background() kit.QuietMiningLogs() diff --git a/itests/multisig_test.go b/itests/multisig_test.go index 5a8a8392614..09d9254a3ce 100644 --- a/itests/multisig_test.go +++ b/itests/multisig_test.go @@ -15,6 +15,8 @@ func TestMultisig(t *testing.T) { //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 kit.QuietMiningLogs() blockTime := 5 * time.Millisecond diff --git a/itests/nonce_test.go b/itests/nonce_test.go index 2cfc2427b03..e0c247ed6da 100644 --- a/itests/nonce_test.go +++ b/itests/nonce_test.go @@ -18,6 +18,8 @@ func TestNonceIncremental(t *testing.T) { //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 ctx := context.Background() kit.QuietMiningLogs() diff --git a/itests/paych_api_test.go b/itests/paych_api_test.go index 595096fab7e..a07c499f9cf 100644 --- a/itests/paych_api_test.go +++ b/itests/paych_api_test.go @@ -32,6 +32,8 @@ func TestPaymentChannelsAPI(t *testing.T) { //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 kit.QuietMiningLogs() ctx := context.Background() diff --git a/itests/paych_cli_test.go b/itests/paych_cli_test.go index d83f672c135..c3f9deeba8a 100644 --- a/itests/paych_cli_test.go +++ b/itests/paych_cli_test.go @@ -35,6 +35,8 @@ func TestPaymentChannelsBasic(t *testing.T) { //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 _ = os.Setenv("BELLMAN_NO_GPU", "1") kit.QuietMiningLogs() @@ -180,6 +182,8 @@ func TestPaymentChannelVouchers(t *testing.T) { //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 _ = os.Setenv("BELLMAN_NO_GPU", "1") kit.QuietMiningLogs() @@ -316,6 +320,8 @@ func TestPaymentChannelVoucherCreateShortfall(t *testing.T) { //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 _ = os.Setenv("BELLMAN_NO_GPU", "1") kit.QuietMiningLogs() diff --git a/itests/sdr_upgrade_test.go b/itests/sdr_upgrade_test.go index 5329d9deb08..2d447dee41e 100644 --- a/itests/sdr_upgrade_test.go +++ b/itests/sdr_upgrade_test.go @@ -22,6 +22,8 @@ func TestSDRUpgrade(t *testing.T) { //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 //stm: @CHAIN_STATE_NETWORK_VERSION_001 kit.QuietMiningLogs() diff --git a/itests/sector_finalize_early_test.go b/itests/sector_finalize_early_test.go index a66db3a8f0c..11f589cbc0e 100644 --- a/itests/sector_finalize_early_test.go +++ b/itests/sector_finalize_early_test.go @@ -23,6 +23,8 @@ func TestDealsWithFinalizeEarly(t *testing.T) { //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 if testing.Short() { t.Skip("skipping test in short mode") } diff --git a/itests/sector_miner_collateral_test.go b/itests/sector_miner_collateral_test.go index ee33955ccf4..26455ea9341 100644 --- a/itests/sector_miner_collateral_test.go +++ b/itests/sector_miner_collateral_test.go @@ -26,6 +26,8 @@ func TestMinerBalanceCollateral(t *testing.T) { //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 kit.QuietMiningLogs() blockTime := 5 * time.Millisecond diff --git a/itests/sector_pledge_test.go b/itests/sector_pledge_test.go index 1fbc8ef051b..5c43172d8cb 100644 --- a/itests/sector_pledge_test.go +++ b/itests/sector_pledge_test.go @@ -27,6 +27,8 @@ func TestPledgeSectors(t *testing.T) { //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 kit.QuietMiningLogs() blockTime := 50 * time.Millisecond @@ -119,6 +121,8 @@ func TestPledgeMaxBatching(t *testing.T) { //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 := 50 * time.Millisecond runTest := func(t *testing.T) { @@ -196,6 +200,8 @@ func TestPledgeBeforeNv13(t *testing.T) { //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 := 50 * time.Millisecond runTest := func(t *testing.T, nSectors int) { diff --git a/itests/sector_terminate_test.go b/itests/sector_terminate_test.go index e1f71e2c686..a139f6207b6 100644 --- a/itests/sector_terminate_test.go +++ b/itests/sector_terminate_test.go @@ -19,6 +19,8 @@ func TestTerminate(t *testing.T) { //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 kit.Expensive(t) kit.QuietMiningLogs() diff --git a/itests/tape_test.go b/itests/tape_test.go index 9104e9b19cf..79f8961e4a5 100644 --- a/itests/tape_test.go +++ b/itests/tape_test.go @@ -19,6 +19,8 @@ func TestTapeFix(t *testing.T) { //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 kit.QuietMiningLogs() var blocktime = 2 * time.Millisecond diff --git a/itests/verifreg_test.go b/itests/verifreg_test.go index 283db9a7e23..9efefc7b98b 100644 --- a/itests/verifreg_test.go +++ b/itests/verifreg_test.go @@ -28,6 +28,8 @@ func TestVerifiedClientTopUp(t *testing.T) { //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 test := func(nv network.Version, shouldWork bool) func(*testing.T) { diff --git a/itests/wdpost_dispute_test.go b/itests/wdpost_dispute_test.go index fa0d2eca7f7..e574e6a528f 100644 --- a/itests/wdpost_dispute_test.go +++ b/itests/wdpost_dispute_test.go @@ -25,6 +25,8 @@ func TestWindowPostDispute(t *testing.T) { //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 kit.Expensive(t) kit.QuietMiningLogs() diff --git a/itests/wdpost_test.go b/itests/wdpost_test.go index dd87d53e982..bbeedb8d80b 100644 --- a/itests/wdpost_test.go +++ b/itests/wdpost_test.go @@ -28,6 +28,8 @@ func TestWindowedPost(t *testing.T) { //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 kit.Expensive(t) kit.QuietMiningLogs() @@ -222,6 +224,8 @@ func TestWindowPostBaseFeeNoBurn(t *testing.T) { //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 kit.Expensive(t) kit.QuietMiningLogs() @@ -284,6 +288,8 @@ func TestWindowPostBaseFeeBurn(t *testing.T) { //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 kit.Expensive(t) kit.QuietMiningLogs() From 0001a6bad099240f9362f86c59b3451bbc757843 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 14 Dec 2021 15:26:15 +0200 Subject: [PATCH 079/393] update go-libp2p to v0.17 --- go.mod | 14 +++++++------- go.sum | 34 +++++++++++++++++++++++----------- 2 files changed, 30 insertions(+), 18 deletions(-) diff --git a/go.mod b/go.mod index c4be98cc04e..0877eb94bb4 100644 --- a/go.mod +++ b/go.mod @@ -90,7 +90,7 @@ require ( github.com/ipfs/go-ipfs-util v0.0.2 github.com/ipfs/go-ipld-cbor v0.0.6-0.20211211231443-5d9b9e1f6fa8 github.com/ipfs/go-ipld-format v0.2.0 - github.com/ipfs/go-log/v2 v2.3.0 + github.com/ipfs/go-log/v2 v2.4.0 github.com/ipfs/go-merkledag v0.5.1 github.com/ipfs/go-metrics-interface v0.0.1 github.com/ipfs/go-metrics-prometheus v0.0.2 @@ -106,20 +106,20 @@ require ( github.com/kelseyhightower/envconfig v1.4.0 github.com/libp2p/go-buffer-pool v0.0.2 github.com/libp2p/go-eventbus v0.2.1 - github.com/libp2p/go-libp2p v0.16.0 + github.com/libp2p/go-libp2p v0.17.0 github.com/libp2p/go-libp2p-connmgr v0.2.4 - github.com/libp2p/go-libp2p-core v0.11.0 + github.com/libp2p/go-libp2p-core v0.13.0 github.com/libp2p/go-libp2p-discovery v0.6.0 github.com/libp2p/go-libp2p-kad-dht v0.15.0 github.com/libp2p/go-libp2p-noise v0.3.0 - github.com/libp2p/go-libp2p-peerstore v0.4.0 + github.com/libp2p/go-libp2p-peerstore v0.6.0 github.com/libp2p/go-libp2p-pubsub v0.6.0 - github.com/libp2p/go-libp2p-quic-transport v0.15.0 + github.com/libp2p/go-libp2p-quic-transport v0.15.2 github.com/libp2p/go-libp2p-record v0.1.3 github.com/libp2p/go-libp2p-routing-helpers v0.2.3 - github.com/libp2p/go-libp2p-swarm v0.8.0 + github.com/libp2p/go-libp2p-swarm v0.9.0 github.com/libp2p/go-libp2p-tls v0.3.1 - github.com/libp2p/go-libp2p-yamux v0.6.0 + github.com/libp2p/go-libp2p-yamux v0.7.0 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 diff --git a/go.sum b/go.sum index 0206e839f85..7e823b6a379 100644 --- a/go.sum +++ b/go.sum @@ -792,8 +792,9 @@ github.com/ipfs/go-log/v2 v2.1.1/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHn github.com/ipfs/go-log/v2 v2.1.2-0.20200626104915-0016c0b4b3e4/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHntrv9KM= github.com/ipfs/go-log/v2 v2.1.2/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHntrv9KM= github.com/ipfs/go-log/v2 v2.1.3/go.mod h1:/8d0SH3Su5Ooc31QlL1WysJhvyOTDCjcCZ9Axpmri6g= -github.com/ipfs/go-log/v2 v2.3.0 h1:31Re/cPqFHpsRHgyVwjWADPoF0otB1WrjTy8ZFYwEZU= github.com/ipfs/go-log/v2 v2.3.0/go.mod h1:QqGoj30OTpnKaG/LKTGTxoP2mmQtjVMEnK72gynbe/g= +github.com/ipfs/go-log/v2 v2.4.0 h1:iR/2o9PGWanVJrBgIH5Ff8mPGOwpqLaPIAFqSnsdlzk= +github.com/ipfs/go-log/v2 v2.4.0/go.mod h1:nPZnh7Cj7lwS3LpRU5Mwr2ol1c2gXIEXuF6aywqrtmo= github.com/ipfs/go-merkledag v0.0.6/go.mod h1:QYPdnlvkOg7GnQRofu9XZimC5ZW5Wi3bKys/4GQQfto= github.com/ipfs/go-merkledag v0.2.3/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= github.com/ipfs/go-merkledag v0.2.4/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= @@ -972,8 +973,9 @@ github.com/libp2p/go-libp2p v0.7.4/go.mod h1:oXsBlTLF1q7pxr+9w6lqzS1ILpyHsaBPniV github.com/libp2p/go-libp2p v0.8.1/go.mod h1:QRNH9pwdbEBpx5DTJYg+qxcVaDMAz3Ee/qDKwXujH5o= github.com/libp2p/go-libp2p v0.14.3/go.mod h1:d12V4PdKbpL0T1/gsUNN8DfgMuRPDX8bS2QxCZlwRH0= github.com/libp2p/go-libp2p v0.14.4/go.mod h1:EIRU0Of4J5S8rkockZM7eJp2S0UrCyi55m2kJVru3rM= -github.com/libp2p/go-libp2p v0.16.0 h1:aTxzQPllnW+nyC9mY8xaS20BbcrSYMt1HCkjZRHvdGY= github.com/libp2p/go-libp2p v0.16.0/go.mod h1:ump42BsirwAWxKzsCiFnTtN1Yc+DuPu76fyMX364/O4= +github.com/libp2p/go-libp2p v0.17.0 h1:8l4GV401OSd4dFRyHDtIT/mEzdh/aQGoFC8xshYgm5M= +github.com/libp2p/go-libp2p v0.17.0/go.mod h1:Fkin50rsGdv5mm5BshBUtPRZknt9esfmYXBOYcwOTgw= 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 h1:rABPCO77SjdbJ/eJ/ynIo8vWICy1VEnL5JAxJbQLo1E= github.com/libp2p/go-libp2p-asn-util v0.1.0/go.mod h1:wu+AnM9Ii2KgO5jMmS1rz9dvzTdj8BXqsPR9HR0XB7I= @@ -984,15 +986,17 @@ github.com/libp2p/go-libp2p-autonat v0.2.0/go.mod h1:DX+9teU4pEEoZUqR1PiMlqliONQ 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.2/go.mod h1:YxaJlpr81FhdOv3W3BTconZPfhaYivRdf53g+S2wobk= -github.com/libp2p/go-libp2p-autonat v0.6.0 h1:+vbQ1pMzMGjE/RJopiQKK2FRjdCKHPNPrkPm8u+luQU= github.com/libp2p/go-libp2p-autonat v0.6.0/go.mod h1:bFC6kY8jwzNNWoqc8iGE57vsfwyJ/lP4O4DOV1e0B2o= +github.com/libp2p/go-libp2p-autonat v0.7.0 h1:rCP5s+A2dlhM1Xd66wurE0k7S7pPmM0D+FlqqSBXxks= +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 h1:3EsGAi0CBGcZ33GwRuXEYJLLPoVWyXJ1bcJzAJjINkk= 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= @@ -1035,8 +1039,10 @@ github.com/libp2p/go-libp2p-core v0.8.5/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJB github.com/libp2p/go-libp2p-core v0.8.6/go.mod h1:dgHr0l0hIKfWpGpqAMbpo19pen9wJfdCGv51mTmdpmM= github.com/libp2p/go-libp2p-core v0.9.0/go.mod h1:ESsbz31oC3C1AvMJoGx26RTuCkNhmkSRCqZ0kQtJ2/8= github.com/libp2p/go-libp2p-core v0.10.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= -github.com/libp2p/go-libp2p-core v0.11.0 h1:75jAgdA+IChNa+/mZXogfmrGkgwxkVvxmIC7pV+F6sI= 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 h1:IFG/s8dN6JN2OTrXX9eq2wNU/Zlz2KLdwZUp5FplgXI= +github.com/libp2p/go-libp2p-core v0.13.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= 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= @@ -1100,8 +1106,9 @@ github.com/libp2p/go-libp2p-peerstore v0.2.2/go.mod h1:NQxhNjWxf1d4w6PihR8btWIRj github.com/libp2p/go-libp2p-peerstore v0.2.6/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= github.com/libp2p/go-libp2p-peerstore v0.2.7/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= github.com/libp2p/go-libp2p-peerstore v0.2.8/go.mod h1:gGiPlXdz7mIHd2vfAsHzBNAMqSDkt2UBFwgcITgw1lA= -github.com/libp2p/go-libp2p-peerstore v0.4.0 h1:DOhRJLnM9Dc9lIXi3rPDZBf789LXy1BrzwIs7Tj0cKA= github.com/libp2p/go-libp2p-peerstore v0.4.0/go.mod h1:rDJUFyzEWPpXpEwywkcTYYzDHlwza8riYMaUzaN6hX0= +github.com/libp2p/go-libp2p-peerstore v0.6.0 h1:HJminhQSGISBIRb93N6WK3t6Fa8OOTnHd/VBjL4mY5A= +github.com/libp2p/go-libp2p-peerstore v0.6.0/go.mod h1:DGEmKdXrcYpK9Jha3sS7MhqYdInxJy84bIPtSu65bKc= github.com/libp2p/go-libp2p-pnet v0.2.0 h1:J6htxttBipJujEjz1y0a5+eYoiPcFHhSYHH6na5f0/k= 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= @@ -1113,8 +1120,9 @@ github.com/libp2p/go-libp2p-quic-transport v0.1.1/go.mod h1:wqG/jzhF3Pu2NrhJEvE+ 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= -github.com/libp2p/go-libp2p-quic-transport v0.15.0 h1:DR0mP6kcieowikBprWkcNtbquRKOPWb5dLZ4ahDZujk= 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 h1:wHBEceRy+1/8Ec8dAIyr+/P7L2YefIGprPVy5LrMM+k= +github.com/libp2p/go-libp2p-quic-transport v0.15.2/go.mod h1:wv4uGwjcqe8Mhjj7N/Ic0aKjA+/10UnMlSzLO0yRpYQ= 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= @@ -1139,8 +1147,9 @@ github.com/libp2p/go-libp2p-swarm v0.2.8/go.mod h1:JQKMGSth4SMqonruY0a8yjlPVIkb0 github.com/libp2p/go-libp2p-swarm v0.3.0/go.mod h1:hdv95GWCTmzkgeJpP+GK/9D9puJegb7H57B5hWQR5Kk= 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 h1:nRHNRhi86L7jhka02N4MoV+PSFFPoJFkHNQwCTFxNhw= github.com/libp2p/go-libp2p-swarm v0.8.0/go.mod h1:sOMp6dPuqco0r0GHTzfVheVBh6UEL0L1lXUZ5ot2Fvc= +github.com/libp2p/go-libp2p-swarm v0.9.0 h1:LdWjHDVjPMYt3NCG2EHcQiIP8XzA8BHhHz8ZLAYol2Y= +github.com/libp2p/go-libp2p-swarm v0.9.0/go.mod h1:2f8d8uxTJmpeqHF/1ujjdXZp+98nNIbujVOMEZxCbZ8= 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= @@ -1151,8 +1160,9 @@ github.com/libp2p/go-libp2p-testing v0.1.2-0.20200422005655-8775583591d8/go.mod github.com/libp2p/go-libp2p-testing v0.3.0/go.mod h1:efZkql4UZ7OVsEfaxNHZPzIehtsBXMrXnCfJIgDti5g= github.com/libp2p/go-libp2p-testing v0.4.0/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotlKsNSbKQ/lImlOWF0= github.com/libp2p/go-libp2p-testing v0.4.2/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotlKsNSbKQ/lImlOWF0= -github.com/libp2p/go-libp2p-testing v0.5.0 h1:bTjC29TTQ/ODq0ld3+0KLq3irdA5cAH3OMbRi0/QsvE= 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 h1:tV/wz6mS1VoAYA/5DGTiyzw9TJ+eXMCMvzU5VPLJSgg= +github.com/libp2p/go-libp2p-testing v0.6.0/go.mod h1:QBk8fqIL1XNcno/l3/hhaIEn4aLRijpYOR+zVjjlh+A= 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 h1:lsE2zYte+rZCEOHF72J1Fg3XK3dGQyKvI6i5ehJfEp0= @@ -1166,8 +1176,9 @@ github.com/libp2p/go-libp2p-transport-upgrader v0.3.0/go.mod h1:i+SKzbRnvXdVbU3D 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= -github.com/libp2p/go-libp2p-transport-upgrader v0.5.0 h1:7SDl3O2+AYOgfE40Mis83ClpfGNkNA6m4FwhbOHs+iI= 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 h1:GfMCU+2aGGEm1zW3UcOz6wYSn8tXQalFfVfcww99i5A= +github.com/libp2p/go-libp2p-transport-upgrader v0.6.0/go.mod h1:1e07y1ZSZdHo9HPbuU8IztM1Cj+DR5twgycb4pnRzRo= github.com/libp2p/go-libp2p-xor v0.0.0-20210714161855-5c005aca55db/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= @@ -1180,8 +1191,9 @@ github.com/libp2p/go-libp2p-yamux v0.2.8/go.mod h1:/t6tDqeuZf0INZMTgd0WxIRbtK2Ez 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.4/go.mod h1:tfrXbyaTqqSU654GTvK3ocnSZL3BuHoeTSqhcel1wsE= -github.com/libp2p/go-libp2p-yamux v0.6.0 h1:TKayW983n92JhCGdCo7ej7eEb+DQ0VYfKNOxlN/1kNQ= github.com/libp2p/go-libp2p-yamux v0.6.0/go.mod h1:MRhd6mAYnFRnSISp4M8i0ClV/j+mWHo2mYLifWGw33k= +github.com/libp2p/go-libp2p-yamux v0.7.0 h1:bVXHbTj/XH4uBBsPrg26BlDABk5WYRlssY73P0SjhPc= +github.com/libp2p/go-libp2p-yamux v0.7.0/go.mod h1:fMyA0CsPfHkIuBU0wjRGrCjTBFiXTXxG0k5M4ETv+08= 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= From 773f896bcd892108daa6474cda8cebe0b6a8c96a Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 14 Dec 2021 15:27:34 +0200 Subject: [PATCH 080/393] update go-libp2p-connmgr to v0.3 --- go.mod | 4 ++-- go.sum | 7 ++++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 0877eb94bb4..3c1496231ba 100644 --- a/go.mod +++ b/go.mod @@ -107,7 +107,7 @@ require ( github.com/libp2p/go-buffer-pool v0.0.2 github.com/libp2p/go-eventbus v0.2.1 github.com/libp2p/go-libp2p v0.17.0 - github.com/libp2p/go-libp2p-connmgr v0.2.4 + github.com/libp2p/go-libp2p-connmgr v0.3.0 github.com/libp2p/go-libp2p-core v0.13.0 github.com/libp2p/go-libp2p-discovery v0.6.0 github.com/libp2p/go-libp2p-kad-dht v0.15.0 @@ -135,7 +135,7 @@ require ( github.com/polydawn/refmt v0.0.0-20201211092308-30ac6d18308e github.com/prometheus/client_golang v1.11.0 github.com/raulk/clock v1.1.0 - github.com/raulk/go-watchdog v1.0.1 + github.com/raulk/go-watchdog v1.2.0 github.com/streadway/quantile v0.0.0-20150917103942-b0c588724d25 github.com/stretchr/testify v1.7.0 github.com/syndtr/goleveldb v1.0.0 diff --git a/go.sum b/go.sum index 7e823b6a379..912b9b01ec9 100644 --- a/go.sum +++ b/go.sum @@ -1006,8 +1006,9 @@ github.com/libp2p/go-libp2p-circuit v0.2.1/go.mod h1:BXPwYDN5A8z4OEY9sOfr2DUQMLQ github.com/libp2p/go-libp2p-circuit v0.4.0 h1:eqQ3sEYkGTtybWgr6JLqJY6QLtPWRErvFjFDfAOO1wc= github.com/libp2p/go-libp2p-circuit v0.4.0/go.mod h1:t/ktoFIUzM6uLQ+o1G6NuBl2ANhBKN9Bc8jRIk31MoA= github.com/libp2p/go-libp2p-connmgr v0.1.1/go.mod h1:wZxh8veAmU5qdrfJ0ZBLcU8oJe9L82ciVP/fl1VHjXk= -github.com/libp2p/go-libp2p-connmgr v0.2.4 h1:TMS0vc0TCBomtQJyWr7fYxcVYYhx+q/2gF++G5Jkl/w= github.com/libp2p/go-libp2p-connmgr v0.2.4/go.mod h1:YV0b/RIm8NGPnnNWM7hG9Q38OeQiQfKhHCCs1++ufn0= +github.com/libp2p/go-libp2p-connmgr v0.3.0 h1:yerFXrYa0oxpuVsLlndwm/bLulouHYDcvFrY/4H4fx8= +github.com/libp2p/go-libp2p-connmgr v0.3.0/go.mod h1:RVoyPjJm0J9Vd1m6qUN2Tn7kJm4rL1Ml20pFsFgPGik= github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= 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= @@ -1612,8 +1613,8 @@ 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.0.1 h1:qgm3DIJAeb+2byneLrQJ7kvmDLGxN2vy3apXyGaDKN4= -github.com/raulk/go-watchdog v1.0.1/go.mod h1:lzSbAl5sh4rtI8tYHU01BWIDzgzqaQLj6RcA1i4mlqI= +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 h1:OdAsTTz6OkFY5QxjkYwrChwuRruF69c169dPK26NUlk= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= From f157ac9b6829a5f8fc564f4343d783ed94735454 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 14 Dec 2021 15:30:29 +0200 Subject: [PATCH 081/393] update for new ConnManager constructor --- node/modules/lp2p/libp2p.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/node/modules/lp2p/libp2p.go b/node/modules/lp2p/libp2p.go index 4dee15ae9ec..5d8ece732d2 100644 --- a/node/modules/lp2p/libp2p.go +++ b/node/modules/lp2p/libp2p.go @@ -69,7 +69,11 @@ func genLibp2pKey() (crypto.PrivKey, error) { func ConnectionManager(low, high uint, grace time.Duration, protected []string) func() (opts Libp2pOpts, err error) { return func() (Libp2pOpts, error) { - cm := connmgr.NewConnManager(int(low), int(high), grace) + cm, err := connmgr.NewConnManager(int(low), int(high), connmgr.WithGracePeriod(grace)) + if err != nil { + return Libp2pOpts{}, err + } + for _, p := range protected { pid, err := peer.IDFromString(p) if err != nil { From 73ca65a6ff1000fe76946c508c3cd80172dcbf3b Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 14 Dec 2021 15:55:00 +0200 Subject: [PATCH 082/393] update drand --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 3c1496231ba..e02b70215aa 100644 --- a/go.mod +++ b/go.mod @@ -19,7 +19,7 @@ require ( github.com/dgraph-io/badger/v2 v2.2007.3 github.com/dgraph-io/ristretto v0.1.0 // indirect github.com/docker/go-units v0.4.0 - github.com/drand/drand v1.2.8-0.20211213085422-837d12611c5d + github.com/drand/drand v1.2.8-0.20211214135232-3ce1e81cdbcc github.com/drand/kyber v1.1.7 github.com/dustin/go-humanize v1.0.0 github.com/elastic/go-sysinfo v1.7.0 diff --git a/go.sum b/go.sum index 912b9b01ec9..b81ed62235b 100644 --- a/go.sum +++ b/go.sum @@ -243,8 +243,8 @@ github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUn github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/drand/bls12-381 v0.3.2/go.mod h1:dtcLgPtYT38L3NO6mPDYH0nbpc5tjPassDqiniuAt4Y= -github.com/drand/drand v1.2.8-0.20211213085422-837d12611c5d h1:XNzXUX04vE4cpEr+y5xsz8ghW3KQYW1yGueO0dy1Qwc= -github.com/drand/drand v1.2.8-0.20211213085422-837d12611c5d/go.mod h1:uQa+6p9wTBXErGU61JTyE0hWyT8Qfwq0AkQH9Tq3Lbk= +github.com/drand/drand v1.2.8-0.20211214135232-3ce1e81cdbcc h1:n6pVZeD0CEFqF4TUE0XI45pCe8cpmAJnv04f3BWXNdo= +github.com/drand/drand v1.2.8-0.20211214135232-3ce1e81cdbcc/go.mod h1:pizbfJhoUg8zI+od47iyqMM58XOJYsQ04h/TYermiWA= github.com/drand/kyber v1.0.1-0.20200110225416-8de27ed8c0e2/go.mod h1:UpXoA0Upd1N9l4TvRPHr1qAUBBERj6JQ/mnKI3BPEmw= github.com/drand/kyber v1.0.2/go.mod h1:x6KOpK7avKj0GJ4emhXFP5n7M7W7ChAPmnQh/OL6vRw= github.com/drand/kyber v1.1.4/go.mod h1:9+IgTq7kadePhZg7eRwSD7+bA+bmvqRK+8DtmoV5a3U= From fc7d4a13b0d3a1fde24636602ea03bad08364e0f Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 14 Dec 2021 16:06:59 +0200 Subject: [PATCH 083/393] fix itests --- itests/kit/deals.go | 2 +- itests/kit/ensemble.go | 2 +- itests/kit/files.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/itests/kit/deals.go b/itests/kit/deals.go index 651c15901ee..29da37c15bd 100644 --- a/itests/kit/deals.go +++ b/itests/kit/deals.go @@ -373,7 +373,7 @@ consumeEvents: func (dh *DealHarness) ExtractFileFromCAR(ctx context.Context, file *os.File) (out *os.File) { bserv := dstest.Bserv() - ch, err := car.LoadCar(bserv.Blockstore(), file) + ch, err := car.LoadCar(ctx, bserv.Blockstore(), file) require.NoError(dh.t, err) b, err := bserv.GetBlock(ctx, ch.Roots[0]) diff --git a/itests/kit/ensemble.go b/itests/kit/ensemble.go index 90a6146455d..2a6d16a951c 100644 --- a/itests/kit/ensemble.go +++ b/itests/kit/ensemble.go @@ -487,7 +487,7 @@ func (n *Ensemble) Start() *Ensemble { ds, err := lr.Datastore(context.TODO(), "/metadata") require.NoError(n.t, err) - err = ds.Put(datastore.NewKey("miner-address"), m.ActorAddr.Bytes()) + err = ds.Put(ctx, datastore.NewKey("miner-address"), m.ActorAddr.Bytes()) require.NoError(n.t, err) nic := storedcounter.New(ds, datastore.NewKey(modules.StorageCounterDSPrefix)) diff --git a/itests/kit/files.go b/itests/kit/files.go index 9babac94144..c78352afe69 100644 --- a/itests/kit/files.go +++ b/itests/kit/files.go @@ -83,7 +83,7 @@ func CreateRandomCARv1(t *testing.T, rseed, size int) (carV1FilePath string, ori require.NoError(t, car.WriteCar(ctx, dagSvc, []cid.Cid{root}, tmp)) _, err = tmp.Seek(0, io.SeekStart) require.NoError(t, err) - hd, _, err := car.ReadHeader(bufio.NewReader(tmp)) + hd, err := car.ReadHeader(bufio.NewReader(tmp)) require.NoError(t, err) require.EqualValues(t, 1, hd.Version) require.Len(t, hd.Roots, 1) From eb48dc9b68355675b1f84cfe6a365c8ddec27ac6 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 14 Dec 2021 16:21:55 +0200 Subject: [PATCH 084/393] fix issues with new peerstore constructor signature in DI --- node/builder.go | 3 +-- node/modules/lp2p/host.go | 5 +++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/node/builder.go b/node/builder.go index 0520d62ddab..6425b21d9fa 100644 --- a/node/builder.go +++ b/node/builder.go @@ -19,7 +19,6 @@ import ( "github.com/libp2p/go-libp2p-core/peerstore" "github.com/libp2p/go-libp2p-core/routing" dht "github.com/libp2p/go-libp2p-kad-dht" - "github.com/libp2p/go-libp2p-peerstore/pstoremem" pubsub "github.com/libp2p/go-libp2p-pubsub" record "github.com/libp2p/go-libp2p-record" "github.com/libp2p/go-libp2p/p2p/net/conngater" @@ -170,7 +169,7 @@ var LibP2P = Options( Override(new(dtypes.Bootstrapper), dtypes.Bootstrapper(false)), // Host dependencies - Override(new(peerstore.Peerstore), pstoremem.NewPeerstore), + Override(new(peerstore.Peerstore), lp2p.Peerstore), Override(PstoreAddSelfKeysKey, lp2p.PstoreAddSelfKeys), Override(StartListeningKey, lp2p.StartListening(config.DefaultFullNode().Libp2p.ListenAddresses)), diff --git a/node/modules/lp2p/host.go b/node/modules/lp2p/host.go index 66c45297a0c..982d9f4cda0 100644 --- a/node/modules/lp2p/host.go +++ b/node/modules/lp2p/host.go @@ -10,6 +10,7 @@ import ( "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" routedhost "github.com/libp2p/go-libp2p/p2p/host/routed" mocknet "github.com/libp2p/go-libp2p/p2p/net/mock" @@ -33,6 +34,10 @@ type P2PHostIn struct { type RawHost host.Host +func Peerstore() (peerstore.Peerstore, error) { + return pstoremem.NewPeerstore() +} + func Host(mctx helpers.MetricsCtx, lc fx.Lifecycle, params P2PHostIn) (RawHost, error) { pkey := params.Peerstore.PrivKey(params.ID) if pkey == nil { From 716b4a3b09ef9e14664bfad832367d9f909c62a2 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 14 Dec 2021 16:57:09 +0200 Subject: [PATCH 085/393] hook a great context in the sky to satisfy DI; sigh... --- node/builder.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/node/builder.go b/node/builder.go index 6425b21d9fa..96d217ec348 100644 --- a/node/builder.go +++ b/node/builder.go @@ -161,6 +161,12 @@ func defaults() []Option { }), Override(new(dtypes.ShutdownChan), make(chan struct{})), + + // the great context in the sky, otherwise we can't DI build genesis; there has to be a better + // solution than this hack. + Override(new(context.Context), func(lc fx.Lifecycle, mctx helpers.MetricsCtx) context.Context { + return helpers.LifecycleCtx(mctx, lc) + }), } } From 22ce395130fc598673fb4e664af1ad306955f47c Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 14 Dec 2021 17:05:10 +0200 Subject: [PATCH 086/393] fix some unit tests --- chain/events/state/mock/api.go | 4 ++-- node/impl/client/client_test.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/chain/events/state/mock/api.go b/chain/events/state/mock/api.go index 2ed48dc39c3..7a73355a523 100644 --- a/chain/events/state/mock/api.go +++ b/chain/events/state/mock/api.go @@ -27,11 +27,11 @@ func NewMockAPI(bs blockstore.Blockstore) *MockAPI { } func (m *MockAPI) ChainHasObj(ctx context.Context, c cid.Cid) (bool, error) { - return m.bs.Has(c) + return m.bs.Has(ctx, c) } func (m *MockAPI) ChainReadObj(ctx context.Context, c cid.Cid) ([]byte, error) { - blk, err := m.bs.Get(c) + blk, err := m.bs.Get(ctx, c) if err != nil { return nil, xerrors.Errorf("blockstore get: %w", err) } diff --git a/node/impl/client/client_test.go b/node/impl/client/client_test.go index bf7ff7735b6..1be225278cd 100644 --- a/node/impl/client/client_test.go +++ b/node/impl/client/client_test.go @@ -107,7 +107,7 @@ func TestImportLocal(t *testing.T) { // recreate the unixfs dag, and see if it matches the original file byte by byte // import the car into a memory blockstore, then export the unixfs file. bs := blockstore.NewBlockstore(datastore.NewMapDatastore()) - _, err = car.LoadCar(bs, exported.DataReader()) + _, err = car.LoadCar(ctx, bs, exported.DataReader()) require.NoError(t, err) dag := merkledag.NewDAGService(blockservice.New(bs, offline.Exchange(bs))) From 40c61a310f210b4c1bc8cb14699f5a335f89439a Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 14 Dec 2021 17:17:30 +0200 Subject: [PATCH 087/393] fix splitstore test --- blockstore/splitstore/splitstore_test.go | 48 ++++++++++++------------ 1 file changed, 25 insertions(+), 23 deletions(-) diff --git a/blockstore/splitstore/splitstore_test.go b/blockstore/splitstore/splitstore_test.go index f9111a979d2..7d84e0a4ca6 100644 --- a/blockstore/splitstore/splitstore_test.go +++ b/blockstore/splitstore/splitstore_test.go @@ -30,6 +30,7 @@ func init() { } func testSplitStore(t *testing.T, cfg *Config) { + ctx := context.Background() chain := &mockChain{t: t} // the myriads of stores @@ -39,7 +40,7 @@ func testSplitStore(t *testing.T, cfg *Config) { // this is necessary to avoid the garbage mock puts in the blocks garbage := blocks.NewBlock([]byte{1, 2, 3}) - err := cold.Put(garbage) + err := cold.Put(ctx, garbage) if err != nil { t.Fatal(err) } @@ -60,21 +61,21 @@ func testSplitStore(t *testing.T, cfg *Config) { t.Fatal(err) } - err = cold.Put(blk) + err = cold.Put(ctx, blk) if err != nil { t.Fatal(err) } // create a garbage block that is protected with a rgistered protector protected := blocks.NewBlock([]byte("protected!")) - err = hot.Put(protected) + err = hot.Put(ctx, protected) if err != nil { t.Fatal(err) } // and another one that is not protected unprotected := blocks.NewBlock([]byte("unprotected!")) - err = hot.Put(unprotected) + err = hot.Put(ctx, unprotected) if err != nil { t.Fatal(err) } @@ -109,11 +110,11 @@ func testSplitStore(t *testing.T, cfg *Config) { if err != nil { t.Fatal(err) } - err = ss.Put(stateRoot) + err = ss.Put(ctx, stateRoot) if err != nil { t.Fatal(err) } - err = ss.Put(sblk) + err = ss.Put(ctx, sblk) if err != nil { t.Fatal(err) } @@ -176,7 +177,7 @@ func testSplitStore(t *testing.T, cfg *Config) { } // ensure our protected block is still there - has, err := hot.Has(protected.Cid()) + has, err := hot.Has(ctx, protected.Cid()) if err != nil { t.Fatal(err) } @@ -186,7 +187,7 @@ func testSplitStore(t *testing.T, cfg *Config) { } // ensure our unprotected block is in the coldstore now - has, err = hot.Has(unprotected.Cid()) + has, err = hot.Has(ctx, unprotected.Cid()) if err != nil { t.Fatal(err) } @@ -195,7 +196,7 @@ func testSplitStore(t *testing.T, cfg *Config) { t.Fatal("unprotected block is still in hotstore") } - has, err = cold.Has(unprotected.Cid()) + has, err = cold.Has(ctx, unprotected.Cid()) if err != nil { t.Fatal(err) } @@ -222,6 +223,7 @@ func TestSplitStoreCompactionWithBadger(t *testing.T) { } func TestSplitStoreSuppressCompactionNearUpgrade(t *testing.T) { + ctx := context.Background() chain := &mockChain{t: t} // the myriads of stores @@ -231,7 +233,7 @@ func TestSplitStoreSuppressCompactionNearUpgrade(t *testing.T) { // this is necessary to avoid the garbage mock puts in the blocks garbage := blocks.NewBlock([]byte{1, 2, 3}) - err := cold.Put(garbage) + err := cold.Put(ctx, garbage) if err != nil { t.Fatal(err) } @@ -252,7 +254,7 @@ func TestSplitStoreSuppressCompactionNearUpgrade(t *testing.T) { t.Fatal(err) } - err = cold.Put(blk) + err = cold.Put(ctx, blk) if err != nil { t.Fatal(err) } @@ -288,11 +290,11 @@ func TestSplitStoreSuppressCompactionNearUpgrade(t *testing.T) { if err != nil { t.Fatal(err) } - err = ss.Put(stateRoot) + err = ss.Put(ctx, stateRoot) if err != nil { t.Fatal(err) } - err = ss.Put(sblk) + err = ss.Put(ctx, sblk) if err != nil { t.Fatal(err) } @@ -431,7 +433,7 @@ func newMockStore() *mockStore { return &mockStore{set: make(map[cid.Cid]blocks.Block)} } -func (b *mockStore) Has(cid cid.Cid) (bool, error) { +func (b *mockStore) Has(_ context.Context, cid cid.Cid) (bool, error) { b.mx.Lock() defer b.mx.Unlock() _, ok := b.set[cid] @@ -440,7 +442,7 @@ func (b *mockStore) Has(cid cid.Cid) (bool, error) { func (b *mockStore) HashOnRead(hor bool) {} -func (b *mockStore) Get(cid cid.Cid) (blocks.Block, error) { +func (b *mockStore) Get(_ context.Context, cid cid.Cid) (blocks.Block, error) { b.mx.Lock() defer b.mx.Unlock() @@ -451,8 +453,8 @@ func (b *mockStore) Get(cid cid.Cid) (blocks.Block, error) { return blk, nil } -func (b *mockStore) GetSize(cid cid.Cid) (int, error) { - blk, err := b.Get(cid) +func (b *mockStore) GetSize(ctx context.Context, cid cid.Cid) (int, error) { + blk, err := b.Get(ctx, cid) if err != nil { return 0, err } @@ -460,15 +462,15 @@ func (b *mockStore) GetSize(cid cid.Cid) (int, error) { return len(blk.RawData()), nil } -func (b *mockStore) View(cid cid.Cid, f func([]byte) error) error { - blk, err := b.Get(cid) +func (b *mockStore) View(ctx context.Context, cid cid.Cid, f func([]byte) error) error { + blk, err := b.Get(ctx, cid) if err != nil { return err } return f(blk.RawData()) } -func (b *mockStore) Put(blk blocks.Block) error { +func (b *mockStore) Put(_ context.Context, blk blocks.Block) error { b.mx.Lock() defer b.mx.Unlock() @@ -476,7 +478,7 @@ func (b *mockStore) Put(blk blocks.Block) error { return nil } -func (b *mockStore) PutMany(blks []blocks.Block) error { +func (b *mockStore) PutMany(_ context.Context, blks []blocks.Block) error { b.mx.Lock() defer b.mx.Unlock() @@ -486,7 +488,7 @@ func (b *mockStore) PutMany(blks []blocks.Block) error { return nil } -func (b *mockStore) DeleteBlock(cid cid.Cid) error { +func (b *mockStore) DeleteBlock(_ context.Context, cid cid.Cid) error { b.mx.Lock() defer b.mx.Unlock() @@ -494,7 +496,7 @@ func (b *mockStore) DeleteBlock(cid cid.Cid) error { return nil } -func (b *mockStore) DeleteMany(cids []cid.Cid) error { +func (b *mockStore) DeleteMany(_ context.Context, cids []cid.Cid) error { b.mx.Lock() defer b.mx.Unlock() From 5e692f9071b483faeab7d9c740872841f5838c38 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 14 Dec 2021 17:45:38 +0200 Subject: [PATCH 088/393] fix more tests --- chain/events/events_test.go | 2 +- chain/messagepool/messagepool_test.go | 20 ++++++++++---------- chain/stmgr/searchwait_test.go | 4 ++-- chain/store/checkpoint_test.go | 10 ++++++---- chain/store/index_test.go | 2 +- chain/store/store_test.go | 2 +- chain/sync_test.go | 2 +- 7 files changed, 22 insertions(+), 20 deletions(-) diff --git a/chain/events/events_test.go b/chain/events/events_test.go index 61dd25fbb30..304463c04a6 100644 --- a/chain/events/events_test.go +++ b/chain/events/events_test.go @@ -87,7 +87,7 @@ func (fcs *fakeCS) ChainGetPath(ctx context.Context, from, to types.TipSetKey) ( } // copied from the chainstore - revert, apply, err := store.ReorgOps(func(tsk types.TipSetKey) (*types.TipSet, error) { + revert, apply, err := store.ReorgOps(ctx, func(tsk types.TipSetKey) (*types.TipSet, error) { return fcs.ChainGetTipSet(ctx, tsk) }, fromTs, toTs) if err != nil { diff --git a/chain/messagepool/messagepool_test.go b/chain/messagepool/messagepool_test.go index 4a2bbfe948a..e768e18f1f0 100644 --- a/chain/messagepool/messagepool_test.go +++ b/chain/messagepool/messagepool_test.go @@ -233,7 +233,7 @@ func TestMessagePool(t *testing.T) { ds := datastore.NewMapDatastore() - mp, err := New(tma, ds, filcns.DefaultUpgradeSchedule(), "mptest", nil) + mp, err := New(context.Background(), tma, ds, filcns.DefaultUpgradeSchedule(), "mptest", nil) if err != nil { t.Fatal(err) } @@ -277,7 +277,7 @@ func TestCheckMessageBig(t *testing.T) { ds := datastore.NewMapDatastore() - mp, err := New(tma, ds, filcns.DefaultUpgradeSchedule(), "mptest", nil) + mp, err := New(context.Background(), tma, ds, filcns.DefaultUpgradeSchedule(), "mptest", nil) assert.NoError(t, err) to := mock.Address(1001) @@ -340,7 +340,7 @@ func TestMessagePoolMessagesInEachBlock(t *testing.T) { ds := datastore.NewMapDatastore() - mp, err := New(tma, ds, filcns.DefaultUpgradeSchedule(), "mptest", nil) + mp, err := New(context.Background(), tma, ds, filcns.DefaultUpgradeSchedule(), "mptest", nil) if err != nil { t.Fatal(err) } @@ -389,7 +389,7 @@ func TestRevertMessages(t *testing.T) { ds := datastore.NewMapDatastore() - mp, err := New(tma, ds, filcns.DefaultUpgradeSchedule(), "mptest", nil) + mp, err := New(context.Background(), tma, ds, filcns.DefaultUpgradeSchedule(), "mptest", nil) if err != nil { t.Fatal(err) } @@ -452,7 +452,7 @@ func TestPruningSimple(t *testing.T) { ds := datastore.NewMapDatastore() - mp, err := New(tma, ds, filcns.DefaultUpgradeSchedule(), "mptest", nil) + mp, err := New(context.Background(), tma, ds, filcns.DefaultUpgradeSchedule(), "mptest", nil) if err != nil { t.Fatal(err) } @@ -496,7 +496,7 @@ func TestLoadLocal(t *testing.T) { tma := newTestMpoolAPI() ds := datastore.NewMapDatastore() - mp, err := New(tma, ds, filcns.DefaultUpgradeSchedule(), "mptest", nil) + mp, err := New(context.Background(), tma, ds, filcns.DefaultUpgradeSchedule(), "mptest", nil) if err != nil { t.Fatal(err) } @@ -539,7 +539,7 @@ func TestLoadLocal(t *testing.T) { t.Fatal(err) } - mp, err = New(tma, ds, filcns.DefaultUpgradeSchedule(), "mptest", nil) + mp, err = New(context.Background(), tma, ds, filcns.DefaultUpgradeSchedule(), "mptest", nil) if err != nil { t.Fatal(err) } @@ -568,7 +568,7 @@ func TestClearAll(t *testing.T) { tma := newTestMpoolAPI() ds := datastore.NewMapDatastore() - mp, err := New(tma, ds, filcns.DefaultUpgradeSchedule(), "mptest", nil) + mp, err := New(context.Background(), tma, ds, filcns.DefaultUpgradeSchedule(), "mptest", nil) if err != nil { t.Fatal(err) } @@ -622,7 +622,7 @@ func TestClearNonLocal(t *testing.T) { tma := newTestMpoolAPI() ds := datastore.NewMapDatastore() - mp, err := New(tma, ds, filcns.DefaultUpgradeSchedule(), "mptest", nil) + mp, err := New(context.Background(), tma, ds, filcns.DefaultUpgradeSchedule(), "mptest", nil) if err != nil { t.Fatal(err) } @@ -683,7 +683,7 @@ func TestUpdates(t *testing.T) { tma := newTestMpoolAPI() ds := datastore.NewMapDatastore() - mp, err := New(tma, ds, filcns.DefaultUpgradeSchedule(), "mptest", nil) + mp, err := New(context.Background(), tma, ds, filcns.DefaultUpgradeSchedule(), "mptest", nil) if err != nil { t.Fatal(err) } diff --git a/chain/stmgr/searchwait_test.go b/chain/stmgr/searchwait_test.go index 1e4776ff7cd..b8cd7ddcf77 100644 --- a/chain/stmgr/searchwait_test.go +++ b/chain/stmgr/searchwait_test.go @@ -75,7 +75,7 @@ func TestSearchForMessageReplacements(t *testing.T) { t.Fatal(err) } - err = cg.Blockstore().Put(rmb) + err = cg.Blockstore().Put(ctx, rmb) if err != nil { t.Fatal(err) } @@ -117,7 +117,7 @@ func TestSearchForMessageReplacements(t *testing.T) { t.Fatal(err) } - err = cg.Blockstore().Put(nrmb) + err = cg.Blockstore().Put(ctx, nrmb) if err != nil { t.Fatal(err) } diff --git a/chain/store/checkpoint_test.go b/chain/store/checkpoint_test.go index 81bbab6ea43..cc5337f5835 100644 --- a/chain/store/checkpoint_test.go +++ b/chain/store/checkpoint_test.go @@ -10,6 +10,8 @@ import ( ) func TestChainCheckpoint(t *testing.T) { + ctx := context.Background() + cg, err := gen.NewGenerator() if err != nil { t.Fatal(err) @@ -27,11 +29,11 @@ func TestChainCheckpoint(t *testing.T) { cs := cg.ChainStore() checkpoint := last - checkpointParents, err := cs.GetTipSetFromKey(checkpoint.Parents()) + checkpointParents, err := cs.GetTipSetFromKey(ctx, checkpoint.Parents()) require.NoError(t, err) // Set the head to the block before the checkpoint. - err = cs.SetHead(checkpointParents) + err = cs.SetHead(ctx, checkpointParents) require.NoError(t, err) // Verify it worked. @@ -39,7 +41,7 @@ func TestChainCheckpoint(t *testing.T) { require.True(t, head.Equals(checkpointParents)) // Try to set the checkpoint in the future, it should fail. - err = cs.SetCheckpoint(checkpoint) + err = cs.SetCheckpoint(ctx, checkpoint) require.Error(t, err) // Then move the head back. @@ -70,7 +72,7 @@ func TestChainCheckpoint(t *testing.T) { require.True(t, head.Equals(checkpoint)) // Remove the checkpoint. - err = cs.RemoveCheckpoint() + err = cs.RemoveCheckpoint(ctx) require.NoError(t, err) // Now switch to the other fork. diff --git a/chain/store/index_test.go b/chain/store/index_test.go index 9bc31e5a8c5..13054e95d42 100644 --- a/chain/store/index_test.go +++ b/chain/store/index_test.go @@ -44,7 +44,7 @@ func TestIndexSeeks(t *testing.T) { if err := cs.PutTipSet(ctx, mock.TipSet(gen)); err != nil { t.Fatal(err) } - assert.NoError(t, cs.SetGenesis(gen)) + assert.NoError(t, cs.SetGenesis(ctx, gen)) // Put 113 blocks from genesis for i := 0; i < 113; i++ { diff --git a/chain/store/store_test.go b/chain/store/store_test.go index 2004b266cf9..f7cf32e8abb 100644 --- a/chain/store/store_test.go +++ b/chain/store/store_test.go @@ -149,7 +149,7 @@ func TestChainExportImportFull(t *testing.T) { t.Fatal(err) } - err = cs.SetHead(last) + err = cs.SetHead(context.Background(), last) if err != nil { t.Fatal(err) } diff --git a/chain/sync_test.go b/chain/sync_test.go index 4175ff5fa6b..2a1798a56ba 100644 --- a/chain/sync_test.go +++ b/chain/sync_test.go @@ -298,7 +298,7 @@ func (tu *syncTestUtil) addSourceNode(gen int) { lastTs := blocks[len(blocks)-1].Blocks for _, lastB := range lastTs { cs := out.(*impl.FullNodeAPI).ChainAPI.Chain - require.NoError(tu.t, cs.AddToTipSetTracker(lastB.Header)) + require.NoError(tu.t, cs.AddToTipSetTracker(context.Background(), lastB.Header)) err = cs.AddBlock(tu.ctx, lastB.Header) require.NoError(tu.t, err) } From 780dfa0c7c5c94dd8c3737d0b0e71e6f45771b06 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 14 Dec 2021 17:49:34 +0200 Subject: [PATCH 089/393] fix ReorgOps incantation in events test --- chain/events/events_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chain/events/events_test.go b/chain/events/events_test.go index 304463c04a6..5f52cbd92c4 100644 --- a/chain/events/events_test.go +++ b/chain/events/events_test.go @@ -87,7 +87,7 @@ func (fcs *fakeCS) ChainGetPath(ctx context.Context, from, to types.TipSetKey) ( } // copied from the chainstore - revert, apply, err := store.ReorgOps(ctx, func(tsk types.TipSetKey) (*types.TipSet, error) { + revert, apply, err := store.ReorgOps(ctx, func(ctx context.Context, tsk types.TipSetKey) (*types.TipSet, error) { return fcs.ChainGetTipSet(ctx, tsk) }, fromTs, toTs) if err != nil { From e6a8c278f5e676ef590afe2058e5a8ef25eb3226 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 14 Dec 2021 17:53:31 +0200 Subject: [PATCH 090/393] fix messagepool test mock provider --- chain/messagepool/messagepool_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chain/messagepool/messagepool_test.go b/chain/messagepool/messagepool_test.go index e768e18f1f0..da1a2eab6c2 100644 --- a/chain/messagepool/messagepool_test.go +++ b/chain/messagepool/messagepool_test.go @@ -190,7 +190,7 @@ func (tma *testMpoolAPI) MessagesForTipset(ts *types.TipSet) ([]types.ChainMsg, return out, nil } -func (tma *testMpoolAPI) LoadTipSet(tsk types.TipSetKey) (*types.TipSet, error) { +func (tma *testMpoolAPI) LoadTipSet(ctx context.Context, tsk types.TipSetKey) (*types.TipSet, error) { for _, ts := range tma.tipsets { if types.CidArrsEqual(tsk.Cids(), ts.Cids()) { return ts, nil From 0f83a0a63439269fdd98709890ac9178d631a0e1 Mon Sep 17 00:00:00 2001 From: Darko Brdareski Date: Tue, 14 Dec 2021 16:56:16 +0100 Subject: [PATCH 091/393] Annotate paych tests --- paychmgr/paych_test.go | 12 ++++++++++++ paychmgr/paychget_test.go | 13 +++++++++++++ paychmgr/paychvoucherfunds_test.go | 1 + paychmgr/settle_test.go | 1 + 4 files changed, 27 insertions(+) diff --git a/paychmgr/paych_test.go b/paychmgr/paych_test.go index f9fb8204b0f..d6c0b3a65cf 100644 --- a/paychmgr/paych_test.go +++ b/paychmgr/paych_test.go @@ -44,6 +44,9 @@ func TestCheckVoucherValid(t *testing.T) { mock.setAccountAddress(fromAcct, from) mock.setAccountAddress(toAcct, to) + //stm: @TOKEN_PAYCH_VOUCHER_VALID_001, @TOKEN_PAYCH_VOUCHER_VALID_002, @TOKEN_PAYCH_VOUCHER_VALID_003 + //stm: @TOKEN_PAYCH_VOUCHER_VALID_004, @TOKEN_PAYCH_VOUCHER_VALID_005, @TOKEN_PAYCH_VOUCHER_VALID_006, @TOKEN_PAYCH_VOUCHER_VALID_007 + //stm: @TOKEN_PAYCH_VOUCHER_VALID_009, @TOKEN_PAYCH_VOUCHER_VALID_010 tcases := []struct { name string expectError bool @@ -243,6 +246,7 @@ func TestCreateVoucher(t *testing.T) { Lane: 1, Amount: voucherLane1Amt, } + //stm: @TOKEN_PAYCH_VOUCHER_CREATE_001 res, err := s.mgr.CreateVoucher(ctx, s.ch, voucher) require.NoError(t, err) require.NotNil(t, res.Voucher) @@ -287,6 +291,7 @@ func TestCreateVoucher(t *testing.T) { Lane: 2, Amount: voucherLane2Amt, } + //stm: @TOKEN_PAYCH_VOUCHER_CREATE_004 res, err = s.mgr.CreateVoucher(ctx, s.ch, voucher) require.NoError(t, err) @@ -297,6 +302,7 @@ func TestCreateVoucher(t *testing.T) { } func TestAddVoucherDelta(t *testing.T) { + //stm: @TOKEN_PAYCH_LIST_VOUCHERS_001 ctx := context.Background() // Set up a manager with a single payment channel @@ -358,6 +364,7 @@ func TestAddVoucherNextLane(t *testing.T) { require.NoError(t, err) require.EqualValues(t, ci.NextLane, 3) + //stm: @TOKEN_PAYCH_ALLOCATE_LANE_001 // Allocate a lane (should be lane 3) lane, err := s.mgr.AllocateLane(s.ch) require.NoError(t, err) @@ -392,6 +399,7 @@ func TestAllocateLane(t *testing.T) { // Set up a manager with a single payment channel s := testSetupMgrWithChannel(t) + //stm: @TOKEN_PAYCH_ALLOCATE_LANE_001 // First lane should be 0 lane, err := s.mgr.AllocateLane(s.ch) require.NoError(t, err) @@ -446,6 +454,7 @@ func TestAllocateLaneWithExistingLaneState(t *testing.T) { _, err = mgr.AddVoucherInbound(ctx, ch, sv, nil, minDelta) require.NoError(t, err) + //stm: @TOKEN_PAYCH_ALLOCATE_LANE_001 // Allocate lane should return the next lane (lane 3) lane, err := mgr.AllocateLane(ch) require.NoError(t, err) @@ -508,6 +517,7 @@ func TestAddVoucherInboundWalletKey(t *testing.T) { } func TestBestSpendable(t *testing.T) { + //stm: @TOKEN_PAYCH_LIST_VOUCHERS_001 ctx := context.Background() // Set up a manager with a single payment channel @@ -550,6 +560,7 @@ func TestBestSpendable(t *testing.T) { }, }) + //stm: @TOKEN_PAYCH_BEST_SPENDABLE_001 // Verify best spendable vouchers on each lane vouchers, err := BestSpendableByLane(ctx, bsapi, s.ch) require.NoError(t, err) @@ -690,6 +701,7 @@ func TestSubmitVoucher(t *testing.T) { err = p3.UnmarshalCBOR(bytes.NewReader(msg.Message.Params)) require.NoError(t, err) + //stm: @TOKEN_PAYCH_LIST_VOUCHERS_001 // Verify that vouchers are marked as submitted vis, err := s.mgr.ListVouchers(ctx, s.ch) require.NoError(t, err) diff --git a/paychmgr/paychget_test.go b/paychmgr/paychget_test.go index e6b94db57ca..c06d47bd2f2 100644 --- a/paychmgr/paychget_test.go +++ b/paychmgr/paychget_test.go @@ -68,6 +68,7 @@ func TestPaychGetCreateChannelMsg(t *testing.T) { // TestPaychGetCreateChannelThenAddFunds tests creating a channel and then // adding funds to it func TestPaychGetCreateChannelThenAddFunds(t *testing.T) { + //stm: @TOKEN_PAYCH_LIST_CHANNELS_001, @TOKEN_PAYCH_WAIT_READY_001 ctx := context.Background() store := NewStore(ds_sync.MutexWrap(ds.NewMapDatastore())) @@ -158,6 +159,7 @@ func TestPaychGetCreateChannelThenAddFunds(t *testing.T) { // operation is queued up behind a create channel operation, and the create // channel fails, then the waiting operation can succeed. func TestPaychGetCreateChannelWithErrorThenCreateAgain(t *testing.T) { + //stm: @TOKEN_PAYCH_LIST_CHANNELS_001, @TOKEN_PAYCH_WAIT_READY_001 ctx := context.Background() store := NewStore(ds_sync.MutexWrap(ds.NewMapDatastore())) @@ -222,6 +224,7 @@ func TestPaychGetCreateChannelWithErrorThenCreateAgain(t *testing.T) { // TestPaychGetRecoverAfterError tests that after a create channel fails, the // next attempt to create channel can succeed. func TestPaychGetRecoverAfterError(t *testing.T) { + //stm: @TOKEN_PAYCH_LIST_CHANNELS_001, @TOKEN_PAYCH_WAIT_READY_001 ctx := context.Background() store := NewStore(ds_sync.MutexWrap(ds.NewMapDatastore())) @@ -274,6 +277,7 @@ func TestPaychGetRecoverAfterError(t *testing.T) { // TestPaychGetRecoverAfterAddFundsError tests that after an add funds fails, the // next attempt to add funds can succeed. func TestPaychGetRecoverAfterAddFundsError(t *testing.T) { + //stm: @TOKEN_PAYCH_LIST_CHANNELS_001, @TOKEN_PAYCH_WAIT_READY_001 ctx := context.Background() store := NewStore(ds_sync.MutexWrap(ds.NewMapDatastore())) @@ -356,6 +360,7 @@ func TestPaychGetRecoverAfterAddFundsError(t *testing.T) { // right after the create channel message is sent, the channel will be // created when the system restarts. func TestPaychGetRestartAfterCreateChannelMsg(t *testing.T) { + //stm: @TOKEN_PAYCH_LIST_CHANNELS_001, @TOKEN_PAYCH_WAIT_READY_001 ctx := context.Background() store := NewStore(ds_sync.MutexWrap(ds.NewMapDatastore())) @@ -435,6 +440,7 @@ func TestPaychGetRestartAfterCreateChannelMsg(t *testing.T) { // right after the add funds message is sent, the add funds will be // processed when the system restarts. func TestPaychGetRestartAfterAddFundsMsg(t *testing.T) { + //stm: @TOKEN_PAYCH_LIST_CHANNELS_001, @TOKEN_PAYCH_WAIT_READY_001 ctx := context.Background() store := NewStore(ds_sync.MutexWrap(ds.NewMapDatastore())) @@ -498,6 +504,7 @@ func TestPaychGetRestartAfterAddFundsMsg(t *testing.T) { // TestPaychGetWait tests that GetPaychWaitReady correctly waits for the // channel to be created or funds to be added func TestPaychGetWait(t *testing.T) { + //stm: @TOKEN_PAYCH_WAIT_READY_001 ctx := context.Background() store := NewStore(ds_sync.MutexWrap(ds.NewMapDatastore())) @@ -555,6 +562,7 @@ func TestPaychGetWait(t *testing.T) { // TestPaychGetWaitErr tests that GetPaychWaitReady correctly handles errors func TestPaychGetWaitErr(t *testing.T) { + //stm: @TOKEN_PAYCH_WAIT_READY_001 ctx := context.Background() store := NewStore(ds_sync.MutexWrap(ds.NewMapDatastore())) @@ -602,6 +610,7 @@ func TestPaychGetWaitErr(t *testing.T) { // TestPaychGetWaitCtx tests that GetPaychWaitReady returns early if the context // is cancelled func TestPaychGetWaitCtx(t *testing.T) { + //stm: @TOKEN_PAYCH_WAIT_READY_001 ctx, cancel := context.WithCancel(context.Background()) store := NewStore(ds_sync.MutexWrap(ds.NewMapDatastore())) @@ -631,6 +640,7 @@ func TestPaychGetWaitCtx(t *testing.T) { // progress and two add funds are queued up behind it, the two add funds // will be merged func TestPaychGetMergeAddFunds(t *testing.T) { + //stm: @TOKEN_PAYCH_WAIT_READY_001 ctx := context.Background() store := NewStore(ds_sync.MutexWrap(ds.NewMapDatastore())) @@ -729,6 +739,7 @@ func TestPaychGetMergeAddFunds(t *testing.T) { // TestPaychGetMergeAddFundsCtxCancelOne tests that when a queued add funds // request is cancelled, its amount is removed from the total merged add funds func TestPaychGetMergeAddFundsCtxCancelOne(t *testing.T) { + //stm: @TOKEN_PAYCH_WAIT_READY_001 ctx := context.Background() store := NewStore(ds_sync.MutexWrap(ds.NewMapDatastore())) @@ -826,6 +837,7 @@ func TestPaychGetMergeAddFundsCtxCancelOne(t *testing.T) { // TestPaychGetMergeAddFundsCtxCancelAll tests that when all queued add funds // requests are cancelled, no add funds message is sent func TestPaychGetMergeAddFundsCtxCancelAll(t *testing.T) { + //stm: @TOKEN_PAYCH_WAIT_READY_001 ctx := context.Background() store := NewStore(ds_sync.MutexWrap(ds.NewMapDatastore())) @@ -900,6 +912,7 @@ func TestPaychGetMergeAddFundsCtxCancelAll(t *testing.T) { // TestPaychAvailableFunds tests that PaychAvailableFunds returns the correct // channel state func TestPaychAvailableFunds(t *testing.T) { + //stm: @TOKEN_PAYCH_WAIT_READY_001, @TOKEN_PAYCH_AVAILABLE_FUNDS_001, @TOKEN_PAYCH_AVAILABLE_FUNDS_002, @TOKEN_PAYCH_AVAILABLE_FUNDS_003 ctx := context.Background() store := NewStore(ds_sync.MutexWrap(ds.NewMapDatastore())) diff --git a/paychmgr/paychvoucherfunds_test.go b/paychmgr/paychvoucherfunds_test.go index f83a7cd623e..f081ee606ff 100644 --- a/paychmgr/paychvoucherfunds_test.go +++ b/paychmgr/paychvoucherfunds_test.go @@ -23,6 +23,7 @@ import ( // insufficient funds, then adding funds to the channel, then adding the // voucher again func TestPaychAddVoucherAfterAddFunds(t *testing.T) { + //stm: @TOKEN_PAYCH_WAIT_READY_001 ctx := context.Background() store := NewStore(ds_sync.MutexWrap(ds.NewMapDatastore())) diff --git a/paychmgr/settle_test.go b/paychmgr/settle_test.go index f17f961e20f..d324c10c89e 100644 --- a/paychmgr/settle_test.go +++ b/paychmgr/settle_test.go @@ -14,6 +14,7 @@ import ( ) func TestPaychSettle(t *testing.T) { + //stm: @TOKEN_PAYCH_WAIT_READY_001, @TOKEN_PAYCH_SETTLE_001, @TOKEN_PAYCH_LIST_CHANNELS_001 ctx := context.Background() store := NewStore(ds_sync.MutexWrap(ds.NewMapDatastore())) From 6ecbcebd44d8fe2878d7306977c6314de23267b5 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 14 Dec 2021 17:57:37 +0200 Subject: [PATCH 092/393] fix messagepool repub test --- chain/messagepool/repub_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chain/messagepool/repub_test.go b/chain/messagepool/repub_test.go index fa27d68ed9c..de32eaa6bd4 100644 --- a/chain/messagepool/repub_test.go +++ b/chain/messagepool/repub_test.go @@ -25,7 +25,7 @@ func TestRepubMessages(t *testing.T) { tma := newTestMpoolAPI() ds := datastore.NewMapDatastore() - mp, err := New(tma, ds, filcns.DefaultUpgradeSchedule(), "mptest", nil) + mp, err := New(context.Background(), tma, ds, filcns.DefaultUpgradeSchedule(), "mptest", nil) if err != nil { t.Fatal(err) } From a0353c8627afd5b98268b6ca4919966f2737f79a Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 14 Dec 2021 18:01:34 +0200 Subject: [PATCH 093/393] fix messagepool selection test --- chain/messagepool/selection_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chain/messagepool/selection_test.go b/chain/messagepool/selection_test.go index 0f8fd8ee6f2..bd8aa0f4908 100644 --- a/chain/messagepool/selection_test.go +++ b/chain/messagepool/selection_test.go @@ -61,7 +61,7 @@ func makeTestMessage(w *wallet.LocalWallet, from, to address.Address, nonce uint func makeTestMpool() (*MessagePool, *testMpoolAPI) { tma := newTestMpoolAPI() ds := datastore.NewMapDatastore() - mp, err := New(tma, ds, filcns.DefaultUpgradeSchedule(), "test", nil) + mp, err := New(context.Background(), tma, ds, filcns.DefaultUpgradeSchedule(), "test", nil) if err != nil { panic(err) } From 63487e1d69ff8d6c6932ce19895e49a679cccb66 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 14 Dec 2021 18:05:23 +0200 Subject: [PATCH 094/393] fix checkpoint test --- chain/store/checkpoint_test.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/chain/store/checkpoint_test.go b/chain/store/checkpoint_test.go index cc5337f5835..73b45f3ad42 100644 --- a/chain/store/checkpoint_test.go +++ b/chain/store/checkpoint_test.go @@ -45,7 +45,7 @@ func TestChainCheckpoint(t *testing.T) { require.Error(t, err) // Then move the head back. - err = cs.SetHead(checkpoint) + err = cs.SetHead(ctx, checkpoint) require.NoError(t, err) // Verify it worked. @@ -53,7 +53,7 @@ func TestChainCheckpoint(t *testing.T) { require.True(t, head.Equals(checkpoint)) // And checkpoint it. - err = cs.SetCheckpoint(checkpoint) + err = cs.SetCheckpoint(ctx, checkpoint) require.NoError(t, err) // Let the second miner miner mine a fork @@ -82,10 +82,10 @@ func TestChainCheckpoint(t *testing.T) { require.True(t, head.Equals(last)) // Setting a checkpoint on the other fork should fail. - err = cs.SetCheckpoint(checkpoint) + err = cs.SetCheckpoint(ctx, checkpoint) require.Error(t, err) // Setting a checkpoint on this fork should succeed. - err = cs.SetCheckpoint(checkpointParents) + err = cs.SetCheckpoint(ctx, checkpointParents) require.NoError(t, err) } From ec8baf23d864e91517521b7463033fd583153426 Mon Sep 17 00:00:00 2001 From: Darko Brdareski Date: Tue, 14 Dec 2021 17:21:01 +0100 Subject: [PATCH 095/393] Annotate message signer subsystem --- chain/messagesigner/messagesigner_test.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/chain/messagesigner/messagesigner_test.go b/chain/messagesigner/messagesigner_test.go index 20d9af38bb1..00a09fc9558 100644 --- a/chain/messagesigner/messagesigner_test.go +++ b/chain/messagesigner/messagesigner_test.go @@ -1,3 +1,4 @@ +//stm: #unit package messagesigner import ( @@ -60,6 +61,7 @@ func TestMessageSignerSignMessage(t *testing.T) { to2, err := w.WalletNew(ctx, types.KTSecp256k1) require.NoError(t, err) + //stm: @CHAIN_MESSAGE_SIGNER_NEW_SIGNER_001, @CHAIN_MESSAGE_SIGNER_SIGN_MESSAGE_001, @CHAIN_MESSAGE_SIGNER_SIGN_MESSAGE_005 type msgSpec struct { msg *types.Message mpoolNonce [1]uint64 From e8df325796d8bfc4d271fe4559f72caf4991fd4b Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 14 Dec 2021 18:23:33 +0200 Subject: [PATCH 096/393] update lotus-soup deps --- testplans/lotus-soup/go.mod | 22 +-- testplans/lotus-soup/go.sum | 378 +++++++++++++++++------------------- 2 files changed, 194 insertions(+), 206 deletions(-) diff --git a/testplans/lotus-soup/go.mod b/testplans/lotus-soup/go.mod index 9c0dc81365e..6f32db2cb45 100644 --- a/testplans/lotus-soup/go.mod +++ b/testplans/lotus-soup/go.mod @@ -6,13 +6,13 @@ require ( contrib.go.opencensus.io/exporter/prometheus v0.4.0 github.com/codeskyblue/go-sh v0.0.0-20200712050446-30169cf553fe github.com/davecgh/go-spew v1.1.1 - github.com/drand/drand v1.2.1 + github.com/drand/drand v1.2.8-0.20211214135232-3ce1e81cdbcc github.com/filecoin-project/go-address v0.0.6 - github.com/filecoin-project/go-data-transfer v1.11.4 - github.com/filecoin-project/go-fil-markets v1.13.3 + github.com/filecoin-project/go-data-transfer v1.12.0 + github.com/filecoin-project/go-fil-markets v1.13.3-0.20211211202606-e111ec29d24d github.com/filecoin-project/go-jsonrpc v0.1.5 - github.com/filecoin-project/go-state-types v0.1.1-0.20210915140513-d354ccf10379 - github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b + github.com/filecoin-project/go-state-types v0.1.1 + github.com/filecoin-project/go-storedcounter v0.0.0-20211210031312-d066d7aa2f77 github.com/filecoin-project/lotus v0.0.0-00010101000000-000000000000 github.com/filecoin-project/specs-actors v0.9.14 github.com/google/uuid v1.3.0 @@ -20,16 +20,16 @@ require ( github.com/hashicorp/go-multierror v1.1.1 github.com/influxdata/influxdb v1.9.4 // indirect github.com/ipfs/go-cid v0.1.0 - github.com/ipfs/go-datastore v0.4.6 + github.com/ipfs/go-datastore v0.5.1 github.com/ipfs/go-ipfs-files v0.0.9 github.com/ipfs/go-ipld-format v0.2.0 - github.com/ipfs/go-log/v2 v2.3.0 - github.com/ipfs/go-merkledag v0.4.1 + github.com/ipfs/go-log/v2 v2.4.0 + github.com/ipfs/go-merkledag v0.5.1 github.com/ipfs/go-unixfs v0.2.6 - github.com/ipld/go-car v0.3.2-0.20211001225732-32d0d9933823 + github.com/ipld/go-car v0.3.3-0.20211210032800-e6f244225a16 github.com/kpacha/opencensus-influxdb v0.0.0-20181102202715-663e2683a27c - github.com/libp2p/go-libp2p v0.15.0 - github.com/libp2p/go-libp2p-core v0.9.0 + github.com/libp2p/go-libp2p v0.17.0 + github.com/libp2p/go-libp2p-core v0.13.0 github.com/libp2p/go-libp2p-pubsub-tracer v0.0.0-20200626141350-e730b32bf1e6 github.com/multiformats/go-multiaddr v0.4.1 github.com/testground/sdk-go v0.2.6 diff --git a/testplans/lotus-soup/go.sum b/testplans/lotus-soup/go.sum index 70da04be20f..10b522a18fc 100644 --- a/testplans/lotus-soup/go.sum +++ b/testplans/lotus-soup/go.sum @@ -37,7 +37,6 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= collectd.org v0.3.0/go.mod h1:A/8DzQBkF6abtvrT2j/AU/4tiBgJWYyh0y/oB/4MlWE= -contrib.go.opencensus.io/exporter/jaeger v0.2.1/go.mod h1:Y8IsLgdxqh1QxYxPC5IgXVmBaeLUeQFfBeBi9PbeZd0= contrib.go.opencensus.io/exporter/prometheus v0.4.0 h1:0QfIkj9z/iVZgK31D9H9ohjjIDApI2GOPScCKwxedbs= contrib.go.opencensus.io/exporter/prometheus v0.4.0/go.mod h1:o7cosnyfuPVK0tB8q0QmaQNhGnptITnPQB+z1+qeFB0= dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU= @@ -181,11 +180,11 @@ github.com/aws/aws-sdk-go-v2/service/sts v1.2.2/go.mod h1:ssRzzJ2RZOVuKj2Vx1YE7y github.com/aws/smithy-go v1.3.1/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= 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.1/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= github.com/benbjohnson/clock v1.0.2/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= -github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/benbjohnson/clock v1.2.0 h1:9Re3G2TWxkE06LdMWMpcY6KV81GLXMGiYpPYUPkFAws= +github.com/benbjohnson/clock v1.2.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/benbjohnson/immutable v0.2.1/go.mod h1:uc6OHo6PN2++n98KHLxW8ef4W42ylHiQSENghE1ezxI= github.com/benbjohnson/tmpl v1.0.0/go.mod h1:igT620JFIi44B6awvU9IsDhR77IXWtFigTLil/RPdps= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= @@ -231,7 +230,6 @@ github.com/cenkalti/backoff v0.0.0-20181003080854-62661b46c409/go.mod h1:90ReRw6 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/certifi/gocertifi v0.0.0-20200211180108-c7c1fbc02894/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= 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.0/go.mod h1:dgIUBU3pDso/gPgZ1osOZ0iQf77oPR28Tjxl5dIMyVM= @@ -246,6 +244,7 @@ github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e h1:fY5BOSpyZCqRo5O github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1 h1:q763qf9huN11kDQavWsoZXJNW3xEE4JJyHa5Q25/sd8= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/cilium/ebpf v0.2.0 h1:Fv93L3KKckEcEHR3oApXVzyBTDA8WAm6VXhPE00N3f8= github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= 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= @@ -256,11 +255,6 @@ github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGX github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= -github.com/cockroachdb/pebble v0.0.0-20200916222308-4e219a90ba5b/go.mod h1:hU7vhtrqonEphNF+xt8/lHdaBprxmV1h8BOGrd9XwmQ= -github.com/cockroachdb/pebble v0.0.0-20201001221639-879f3bfeef07/go.mod h1:hU7vhtrqonEphNF+xt8/lHdaBprxmV1h8BOGrd9XwmQ= -github.com/cockroachdb/redact v0.0.0-20200622112456-cd282804bbd3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= 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/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0 h1:sDMmm+q/3+BukdIpxwO365v/Rbspp2Nt5XntgQRXq8Q= @@ -319,13 +313,12 @@ github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6ps github.com/dgraph-io/badger v1.6.1/go.mod h1:FRmFw3uxvcpa8zG3Rxs0th+hCLIuaQg8HlNV5bjgnuU= github.com/dgraph-io/badger v1.6.2 h1:mNw0qs90GVgGGWylh0umH5iag1j6n/PeJtNvL6KY/x8= github.com/dgraph-io/badger v1.6.2/go.mod h1:JW2yswe3V058sS0kZ2h/AXeDSqFjxnZcRrVH//y2UQE= -github.com/dgraph-io/badger/v2 v2.0.3/go.mod h1:3KY8+bsP8wI0OEnQJAKpd4wIJW/Mm32yw2j/9FUVnIM= -github.com/dgraph-io/badger/v2 v2.2007.2 h1:EjjK0KqwaFMlPin1ajhP943VPENHJdEz1KLIegjaI3k= -github.com/dgraph-io/badger/v2 v2.2007.2/go.mod h1:26P/7fbL4kUZVEVKLAKXkBXKOydDmM2p1e+NhhnBCAE= -github.com/dgraph-io/ristretto v0.0.2-0.20200115201040-8f368f2f2ab3/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= +github.com/dgraph-io/badger/v2 v2.2007.3 h1:Sl9tQWz92WCbVSe8pj04Tkqlm2boW+KAxd+XSs58SQI= +github.com/dgraph-io/badger/v2 v2.2007.3/go.mod h1:26P/7fbL4kUZVEVKLAKXkBXKOydDmM2p1e+NhhnBCAE= github.com/dgraph-io/ristretto v0.0.2/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= -github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de h1:t0UHb5vdojIDUqktM6+xJAfScFBsVpXZmqC9dsgJmeA= github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= +github.com/dgraph-io/ristretto v0.1.0 h1:Jv3CGQHp9OjuMBSne1485aDpUkTKEcUqF+jm/LuerPI= +github.com/dgraph-io/ristretto v0.1.0/go.mod h1:fux0lOrBhrVCJd3lcTHsIJhq1T2rokOu6v9Vcb3Q9ug= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-bitstream v0.0.0-20180413035011-3522498ce2c8/go.mod h1:VMaSuZ+SZcx/wljOQKvp5srsbCiKDEb6K2wC4+PiBmQ= github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= @@ -339,12 +332,13 @@ github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDD github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/drand/bls12-381 v0.3.2/go.mod h1:dtcLgPtYT38L3NO6mPDYH0nbpc5tjPassDqiniuAt4Y= -github.com/drand/drand v1.2.1 h1:KB7z+69YbnQ5z22AH/LMi0ObDR8DzYmrkS6vZXTR9jI= -github.com/drand/drand v1.2.1/go.mod h1:j0P7RGmVaY7E/OuO2yQOcQj7OgeZCuhgu2gdv0JAm+g= +github.com/drand/drand v1.2.8-0.20211214135232-3ce1e81cdbcc h1:n6pVZeD0CEFqF4TUE0XI45pCe8cpmAJnv04f3BWXNdo= +github.com/drand/drand v1.2.8-0.20211214135232-3ce1e81cdbcc/go.mod h1:pizbfJhoUg8zI+od47iyqMM58XOJYsQ04h/TYermiWA= github.com/drand/kyber v1.0.1-0.20200110225416-8de27ed8c0e2/go.mod h1:UpXoA0Upd1N9l4TvRPHr1qAUBBERj6JQ/mnKI3BPEmw= github.com/drand/kyber v1.0.2/go.mod h1:x6KOpK7avKj0GJ4emhXFP5n7M7W7ChAPmnQh/OL6vRw= -github.com/drand/kyber v1.1.4 h1:YvKM03QWGvLrdTnYmxxP5iURAX+Gdb6qRDUOgg8i60Q= github.com/drand/kyber v1.1.4/go.mod h1:9+IgTq7kadePhZg7eRwSD7+bA+bmvqRK+8DtmoV5a3U= +github.com/drand/kyber v1.1.7 h1:YnOshFoGYSOdhf4K8BiDw4XL/l6caL92vsodAsVQbJI= +github.com/drand/kyber v1.1.7/go.mod h1:UkHLsI4W6+jT5PvNxmc0cvQAgppjTUpX+XCsN9TXmRo= github.com/drand/kyber-bls12381 v0.2.0/go.mod h1:zQip/bHdeEB6HFZSU3v+d3cQE0GaBVQw9aR2E7AdoeI= github.com/drand/kyber-bls12381 v0.2.1 h1:/d5/YAdaCmHpYjF1NZevOEcKGaq6LBbyvkCTIdGqDjs= github.com/drand/kyber-bls12381 v0.2.1/go.mod h1:JwWn4nHO9Mp4F5qCie5sVIPQZ0X6cw8XAeMRvc/GXBE= @@ -385,9 +379,8 @@ github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL 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/filecoin-project/dagstore v0.4.2/go.mod h1:WY5OoLfnwISCk6eASSF927KKPqLPIlTwmG1qHpA08KY= -github.com/filecoin-project/dagstore v0.4.3 h1:yeFl6+2BRY1gOVp/hrZuFa24s7LY0Qqkqx/Gh8lidZs= -github.com/filecoin-project/dagstore v0.4.3/go.mod h1:dm/91AO5UaDd3bABFjg/5fmRH99vvpS7g1mykqvz6KQ= +github.com/filecoin-project/dagstore v0.4.3-0.20211211192320-72b849e131d2 h1:dWh+o7gzavw1JUlsTqBj2/87r1Z6fbPZuZS43UiIW60= +github.com/filecoin-project/dagstore v0.4.3-0.20211211192320-72b849e131d2/go.mod h1:tlV8C11UljvFq3WWlMh2oMViEaVaPb6uT8eL/YQgDfk= github.com/filecoin-project/go-address v0.0.3/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= github.com/filecoin-project/go-address v0.0.5/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= github.com/filecoin-project/go-address v0.0.6 h1:DWQtj38ax+ogHwyH3VULRIoT8E6loyXqsk/p81xoY7M= @@ -404,26 +397,23 @@ github.com/filecoin-project/go-bitfield v0.2.4/go.mod h1:CNl9WG8hgR5mttCnUErjcQj github.com/filecoin-project/go-cbor-util v0.0.0-20191219014500-08c40a1e63a2/go.mod h1:pqTiPHobNkOVM5thSRsHYjyQfq7O5QSCMhvuu9JoDlg= github.com/filecoin-project/go-cbor-util v0.0.1 h1:E1LYZYTtjfAQwCReho0VXvbu8t3CYAVPiMx8EiV/VAs= github.com/filecoin-project/go-cbor-util v0.0.1/go.mod h1:pqTiPHobNkOVM5thSRsHYjyQfq7O5QSCMhvuu9JoDlg= -github.com/filecoin-project/go-commp-utils v0.1.1-0.20210427191551-70bf140d31c7/go.mod h1:6s95K91mCyHY51RPWECZieD3SGWTqIFLf1mPOes9l5U= -github.com/filecoin-project/go-commp-utils v0.1.2 h1:SKLRuGdx/6WlolaWKaUzzUYWGGePuARyO4guxOPxvt4= -github.com/filecoin-project/go-commp-utils v0.1.2/go.mod h1:6s95K91mCyHY51RPWECZieD3SGWTqIFLf1mPOes9l5U= +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-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-data-transfer v1.0.1/go.mod h1:UxvfUAY9v3ub0a21BSK9u3pB2aq30Y0KMsG+w9/ysyo= -github.com/filecoin-project/go-data-transfer v1.11.4 h1:jKvlx0/C8HSyLRn/G1P9TjtfBtFU9jbCvCVFmWbyYVQ= -github.com/filecoin-project/go-data-transfer v1.11.4/go.mod h1:2MitLI0ebCkLlPKM7NRggP/t9d+gCcREUKkCKqWRCwU= -github.com/filecoin-project/go-ds-versioning v0.1.0 h1:y/X6UksYTsK8TLCI7rttCKEvl8btmWxyFMEeeWGUxIQ= -github.com/filecoin-project/go-ds-versioning v0.1.0/go.mod h1:mp16rb4i2QPmxBnmanUx8i/XANp+PFCCJWiAb+VW4/s= +github.com/filecoin-project/go-data-transfer v1.12.0 h1:y44x35JvB93kezahMURKizIa/aizGTPSHqi5cbAfTEo= +github.com/filecoin-project/go-data-transfer v1.12.0/go.mod h1:tDrD2jLU2TpVhd+5B8iqBp0fQRV4lP80WZccKXugjYc= +github.com/filecoin-project/go-ds-versioning v0.0.0-20211206185234-508abd7c2aff h1:2bG2ggVZ/rInd/YqUfRj4A5siGuYOPxxuD4I8nYLJF0= +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-fil-commcid v0.0.0-20200716160307-8f644712406f/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commcid v0.1.0 h1:3R4ds1A9r6cr8mvZBfMYxTS88OqLYEo6roi+GiIeOh8= 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.0.5-0.20201113164554-c5eba40d5335/go.mod h1:AJySOJC00JRWEZzRG2KsfUnqEf5ITXxeX09BE9N4f9c= -github.com/filecoin-project/go-fil-markets v1.13.3 h1:iMCpG7I4fb+YLcgDnMaqZiZiyFZWNvrwHqiFPHB0/tQ= -github.com/filecoin-project/go-fil-markets v1.13.3/go.mod h1:38zuj8AgDvOfdakFLpC/syYIYgXTzkq7xqBJ6T1AuG4= +github.com/filecoin-project/go-fil-markets v1.13.3-0.20211211202606-e111ec29d24d h1:TkBhjnKRNKrOxnESYqMQRjMbzK/NayYg1oxejxF1cGg= +github.com/filecoin-project/go-fil-markets v1.13.3-0.20211211202606-e111ec29d24d/go.mod h1:vXOHH3q2+zLk929W+lIq3etuDFTyJJ8nG2DwGHG2R1E= 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= @@ -433,7 +423,6 @@ 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-multistore v0.0.3/go.mod h1:kaNqCC4IhU4B1uyr7YWFHd23TL4KM32aChS0jNkyUvQ= github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20/go.mod h1:mPn+LRRd5gEKNAtc+r3ScpW2JRU/pj4NBKdADYWHiak= github.com/filecoin-project/go-padreader v0.0.0-20210723183308-812a16dc01b1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= github.com/filecoin-project/go-padreader v0.0.1 h1:8h2tVy5HpoNbr2gBRr+WD6zV6VD6XHig+ynSGJg8ZOs= @@ -447,22 +436,20 @@ 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.1-0.20210506134452-99b279731c48/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.1-0.20210915140513-d354ccf10379 h1:UmKkt13NrtulubqfNXhG7SQ7Pjza8BeKdNBxngqAo64= -github.com/filecoin-project/go-state-types v0.1.1-0.20210915140513-d354ccf10379/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= +github.com/filecoin-project/go-state-types v0.1.1 h1:LR260vya4p++atgf256W6yV3Lxl5mKrBFcEZePWQrdg= +github.com/filecoin-project/go-state-types v0.1.1/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig= github.com/filecoin-project/go-statemachine v1.0.1 h1:LQ60+JDVjMdLxXmVFM2jjontzOYnfVE7u02CXV3WKSw= github.com/filecoin-project/go-statemachine v1.0.1/go.mod h1:jZdXXiHa61n4NmgWFG4w8tnqgvZVHYbJ3yW7+y8bF54= github.com/filecoin-project/go-statestore v0.1.0/go.mod h1:LFc9hD+fRxPqiHiaqUEZOinUJB4WARkRfNl10O7kTnI= -github.com/filecoin-project/go-statestore v0.1.1 h1:ufMFq00VqnT2CAuDpcGnwLnCX1I/c3OROw/kXVNSTZk= -github.com/filecoin-project/go-statestore v0.1.1/go.mod h1:LFc9hD+fRxPqiHiaqUEZOinUJB4WARkRfNl10O7kTnI= -github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b h1:fkRZSPrYpk42PV3/lIXiL0LHetxde7vyYYvSsttQtfg= -github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b/go.mod h1:Q0GQOBtKf1oE10eSXSlhN45kDBdGvEcVOqMiffqX+N8= +github.com/filecoin-project/go-statestore v0.2.0 h1:cRRO0aPLrxKQCZ2UOQbzFGn4WDNdofHZoGPjfNaAo5Q= +github.com/filecoin-project/go-statestore v0.2.0/go.mod h1:8sjBYbS35HwPzct7iT4lIXjLlYyPor80aU7t7a/Kspo= +github.com/filecoin-project/go-storedcounter v0.0.0-20211210031312-d066d7aa2f77 h1:3n7WS0WkJStS1rMbt/o+OvriHIlAuU8JKVG6wB2LqJQ= +github.com/filecoin-project/go-storedcounter v0.0.0-20211210031312-d066d7aa2f77/go.mod h1:4ceukaXi4vFURIoxYMfKzaRF5Xv/Pinh2oTnoxpv+z8= github.com/filecoin-project/specs-actors v0.9.4/go.mod h1:BStZQzx5x7TmCkLv0Bpa07U6cPKol6fd3w9KjMPZ6Z4= -github.com/filecoin-project/specs-actors v0.9.12/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors v0.9.14 h1:68PVstg2UB3ZsMLF+DKFTAs/YKsqhKWynkr0IqmVRQY= github.com/filecoin-project/specs-actors v0.9.14/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= -github.com/filecoin-project/specs-actors/v2 v2.0.1/go.mod h1:v2NZVYinNIKA9acEMBm5wWXxqv5+frFEbekBFemYghY= 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.5 h1:PbT4tPlSXZ8sRgajhb4D8AOEmiaaZ+jg6tc6BBv8VQc= github.com/filecoin-project/specs-actors/v2 v2.3.5/go.mod h1:LljnY2Mn2homxZsmokJZCpRuhOPxfXhvcek5gWkmqAc= @@ -475,13 +462,12 @@ github.com/filecoin-project/specs-actors/v4 v4.0.1/go.mod h1:TkHXf/l7Wyw4ZejyXIP github.com/filecoin-project/specs-actors/v5 v5.0.0-20210512015452-4fe3889fff57/go.mod h1:283yBMMUSDB2abcjP/hhrwTkhb9h3sfM6KGrep/ZlBI= github.com/filecoin-project/specs-actors/v5 v5.0.4 h1:OY7BdxJWlUfUFXWV/kpNBYGXNPasDIedf42T3sGx08s= github.com/filecoin-project/specs-actors/v5 v5.0.4/go.mod h1:5BAKRAMsOOlD8+qCw4UvT/lTLInCJ3JwOWZbX8Ipwq4= -github.com/filecoin-project/specs-actors/v6 v6.0.0 h1:i+16MFE8GScWWUF0kG7x2RZ5Hqpz0CeyBHTpnijCJ6I= -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 h1:laxvHNsvrq83Y9n+W7znVCePi3oLyRf0Rkl4jFO8Wew= +github.com/filecoin-project/specs-actors/v6 v6.0.1/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506 h1:Ur/l2+6qN+lQiqjozWWc5p9UDaAMDZKTlDS98oRnlIw= github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506/go.mod h1:nJRRM7Aa9XVvygr3W9k6xGF46RWzr2zxF/iGoAIfA/g= 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= @@ -492,8 +478,9 @@ github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiD 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 h1:8sXhOn0uLys67V8EsXLc6eszDs8VXWxL3iRvebPhedY= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= +github.com/frankban/quicktest v1.14.0 h1:+cqqvzZV87b4adx/5ayVOaYZ2CrvM4ejQvUdBzPPUss= +github.com/frankban/quicktest v1.14.0/go.mod h1:NeW+ay9A/U67EYXNFA1nPE8e/tnQv/09mUdL/ijj8og= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= @@ -504,8 +491,6 @@ github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo github.com/gdamore/tcell/v2 v2.2.0 h1:vSyEgKwraXPSOkvCk7IwOSyX+Pv3V2cV9CikJMXg4U4= github.com/gdamore/tcell/v2 v2.2.0/go.mod h1:cTTuF84Dlj/RqmaCIV5p4w8uG1zWdk0SF6oBpwHp4fU= github.com/getkin/kin-openapi v0.53.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= -github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= -github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9/go.mod h1:106OIgooyS7OzLDOpUGgm9fA3bQENb/cFSyyBmMoJDs= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= @@ -661,6 +646,8 @@ github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2V github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= 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= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191027212112-611e8accdfc9/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -699,7 +686,6 @@ 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.2-0.20190904063534-ff6b7dc882cf/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/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= @@ -777,7 +763,6 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgf github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.14.4/go.mod h1:6CwZWGDSPRJidgKAtJVvND6soZe6fT7iteq8wDPdhb0= -github.com/grpc-ecosystem/grpc-gateway v1.14.6/go.mod h1:zdiPV4Yse/1gnckTHtghG4GkDEdKCRJduHpTxT3/jcw= 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= @@ -885,20 +870,16 @@ github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyq 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 h1:AhJhRrG8xkxh6x87b4wWs+4U4y3DVB3doI8yFNqgQME= -github.com/ipfs/go-bitswap v0.3.4/go.mod h1:4T7fvNv/LmOys+21tnLzGKncMeeXUYUd1nUiJ2teMvI= +github.com/ipfs/go-bitswap v0.5.1 h1:721YAEDBnLIrvcIMkCHCdqp34hA8jwL9yKMkyJpSpco= +github.com/ipfs/go-bitswap v0.5.1/go.mod h1:P+ckC87ri1xFLvk74NlXdP0Kj9RmWAh4+H78sC6Qopo= 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= 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.3/go.mod h1:OTZhFpkgY48kNzbgyvcexW9cHrpjBYIjSR0KoDOFOLU= -github.com/ipfs/go-blockservice v0.1.4-0.20200624145336-a978cec6e834/go.mod h1:OTZhFpkgY48kNzbgyvcexW9cHrpjBYIjSR0KoDOFOLU= -github.com/ipfs/go-blockservice v0.1.5/go.mod h1:yLk8lBJCBRWRqerqCSVi3cE/Dncdt3vGC/PJMVKhLTY= -github.com/ipfs/go-blockservice v0.1.7 h1:yVe9te0M7ow8i+PPkx03YFSpxqzXx594d6h+34D6qMg= -github.com/ipfs/go-blockservice v0.1.7/go.mod h1:GmS+BAt4hrwBKkzE11AFDQUrnvqjwFatGS2MY7wOjEM= +github.com/ipfs/go-blockservice v0.2.1 h1:NJ4j/cwEfIg60rzAWcCIxRtOwbf6ZPK49MewNxObCPQ= +github.com/ipfs/go-blockservice v0.2.1/go.mod h1:k6SiwmgyYgs4M/qt+ww6amPeUH9EISLRBnvUurKJhi8= 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= @@ -908,7 +889,6 @@ github.com/ipfs/go-cid v0.0.5/go.mod h1:plgt+Y5MnOey4vO4UlUazGqdbEXuFYitED67Fexh github.com/ipfs/go-cid v0.0.6-0.20200501230655-7c82f3b81c00/go.mod h1:plgt+Y5MnOey4vO4UlUazGqdbEXuFYitED67FexhXog= github.com/ipfs/go-cid v0.0.6/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= github.com/ipfs/go-cid v0.0.7/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= -github.com/ipfs/go-cid v0.0.8-0.20210716091050-de6c03deae1c/go.mod h1:rH5/Xv83Rfy8Rw6xG+id3DYAMUVmem1MowoKwdXmN2o= github.com/ipfs/go-cid v0.1.0 h1:YN33LQulcRHjfom/i25yoOZR4Telp1Hr/2RU3d0PnC0= github.com/ipfs/go-cid v0.1.0/go.mod h1:rH5/Xv83Rfy8Rw6xG+id3DYAMUVmem1MowoKwdXmN2o= github.com/ipfs/go-cidutil v0.0.2 h1:CNOboQf1t7Qp0nuNh8QMmhJs0+Q//bRL1axtCnIB1Yo= @@ -917,15 +897,15 @@ github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAK github.com/ipfs/go-datastore v0.0.5/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= github.com/ipfs/go-datastore v0.1.0/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= github.com/ipfs/go-datastore v0.1.1/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRVNdgPHtbHw= -github.com/ipfs/go-datastore v0.3.0/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRVNdgPHtbHw= 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.4.6 h1:zU2cmweykxJ+ziXnA2cPtsLe8rdR/vrthOipLPuf6kc= -github.com/ipfs/go-datastore v0.4.6/go.mod h1:XSipLSc64rFKSFRFGo1ecQl+WhYce3K7frtpHkyPFUc= +github.com/ipfs/go-datastore v0.4.7-0.20211013204805-28a3721c2e66/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= +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-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= @@ -933,40 +913,33 @@ github.com/ipfs/go-ds-badger v0.0.5/go.mod h1:g5AuuCGmr7efyzQhLL8MzwqcauPojGPUaH github.com/ipfs/go-ds-badger v0.0.7/go.mod h1:qt0/fWzZDoPW6jpQeqUjR5kBfhDNB65jd9YlmAvpQBk= github.com/ipfs/go-ds-badger v0.2.1/go.mod h1:Tx7l3aTph3FMFrRS838dcSJh+jjA7cX9DrGVwx/NOwE= github.com/ipfs/go-ds-badger v0.2.3/go.mod h1:pEYw0rgg3FIrywKKnL+Snr+w/LjJZVMTBRn4FS6UHUk= -github.com/ipfs/go-ds-badger v0.2.6/go.mod h1:02rnztVKA4aZwDuaRPTf8mpqcKmXP7mLl6JPxd14JHA= -github.com/ipfs/go-ds-badger v0.2.7 h1:ju5REfIm+v+wgVnQ19xGLYPHYHbYLR6qJfmMbCDSK1I= github.com/ipfs/go-ds-badger v0.2.7/go.mod h1:02rnztVKA4aZwDuaRPTf8mpqcKmXP7mLl6JPxd14JHA= -github.com/ipfs/go-ds-badger2 v0.1.0/go.mod h1:pbR1p817OZbdId9EvLOhKBgUVTM3BMCSTan78lDDVaw= -github.com/ipfs/go-ds-badger2 v0.1.1-0.20200708190120-187fc06f714e h1:Xi1nil8K2lBOorBS6Ys7+hmUCzH8fr3U9ipdL/IrcEI= -github.com/ipfs/go-ds-badger2 v0.1.1-0.20200708190120-187fc06f714e/go.mod h1:lJnws7amT9Ehqzta0gwMrRsURU04caT0iRPr1W8AsOU= +github.com/ipfs/go-ds-badger v0.3.0 h1:xREL3V0EH9S219kFFueOYJJTcjgNSZ2HY1iSvN7U1Ro= +github.com/ipfs/go-ds-badger v0.3.0/go.mod h1:1ke6mXNqeV8K3y5Ak2bAA0osoTfmxUdupVCGm4QUIek= +github.com/ipfs/go-ds-badger2 v0.1.2-0.20211203191834-bc6df5c2417c h1:hQ/+EqbntANC9WOnloM/JCAjnMn4iEOYiJ6/H+iq84o= +github.com/ipfs/go-ds-badger2 v0.1.2-0.20211203191834-bc6df5c2417c/go.mod h1:wD65qQCjB35uNOHaaha+tudGVWegJ7dFuFKY+3iJKjk= 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= -github.com/ipfs/go-ds-leveldb v0.4.2 h1:QmQoAJ9WkPMUfBLnu1sBVy0xWWlJPg0m4kRAiJL9iaw= github.com/ipfs/go-ds-leveldb v0.4.2/go.mod h1:jpbku/YqBSsBc1qgME8BkWS4AxzF2cEu1Ii2r79Hh9s= -github.com/ipfs/go-ds-measure v0.1.0 h1:vE4TyY4aeLeVgnnPBC5QzKIjKrqzha0NCujTfgvVbVQ= -github.com/ipfs/go-ds-measure v0.1.0/go.mod h1:1nDiFrhLlwArTME1Ees2XaBOl49OoCgd2A3f8EchMSY= -github.com/ipfs/go-ds-pebble v0.0.2-0.20200921225637-ce220f8ac459/go.mod h1:oh4liWHulKcDKVhCska5NLelE3MatWl+1FwSz3tY91g= -github.com/ipfs/go-filestore v1.0.0 h1:QR7ekKH+q2AGiWDc7W2Q0qHuYSRZGUJqUn0GsegEPb0= -github.com/ipfs/go-filestore v1.0.0/go.mod h1:/XOCuNtIe2f1YPbiXdYvD0BKLA0JR1MgPiFOdcuu9SM= +github.com/ipfs/go-ds-leveldb v0.5.0 h1:s++MEBbD3ZKc9/8/njrn4flZLnCuY9I79v94gBUNumo= +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-filestore v1.1.0 h1:Pu4tLBi1bucu6/HU9llaOmb9yLFk/sgP+pW764zNDoE= +github.com/ipfs/go-filestore v1.1.0/go.mod h1:6e1/5Y6NvLuCRdmda/KA4GUhXJQ3Uat6vcWm2DJfxc8= github.com/ipfs/go-fs-lock v0.0.6 h1:sn3TWwNVQqSeNjlWy6zQ1uUGAZrV3hPOyEA6y1/N2a0= github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28L7zESmM= -github.com/ipfs/go-graphsync v0.1.0/go.mod h1:jMXfqIEDFukLPZHqDPp8tJMbHO9Rmeb9CEGevngQbmE= -github.com/ipfs/go-graphsync v0.4.2/go.mod h1:/VmbZTUdUMTbNkgzAiCEucIIAU3BkLE2cZrDCVUhyi0= -github.com/ipfs/go-graphsync v0.4.3/go.mod h1:mPOwDYv128gf8gxPFgXnz4fNrSYPsWyqisJ7ych+XDY= -github.com/ipfs/go-graphsync v0.10.0/go.mod h1:cKIshzTaa5rCZjryH5xmSKZVGX9uk1wvwGvz2WEha5Y= -github.com/ipfs/go-graphsync v0.10.4 h1:1WZhyOPxgxLvHTIC2GoLltaBrjZ+JuXC2oKAEiX8f3Y= -github.com/ipfs/go-graphsync v0.10.4/go.mod h1:oei4tnWAKnZ6LPnapZGPYVVbyiKV1UP3f8BeLU7Z4JQ= +github.com/ipfs/go-graphsync v0.11.0 h1:PiiD5CnoC3xEHMW8d6uBGqGcoTwiMB5d9CORIEyF6iA= +github.com/ipfs/go-graphsync v0.11.0/go.mod h1:wC+c8vGVjAHthsVIl8LKr37cUra2GOaMYcQNNmMxDqE= github.com/ipfs/go-hamt-ipld v0.1.1/go.mod h1:1EZCr2v0jlCnhpa+aZ0JZYp8Tt2w16+JJOAVz17YcDk= 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 v1.0.0/go.mod h1:knLVdhVU9L7CC4T+T4nvGdeUIPAXlnd9zmXfp+9MIjU= -github.com/ipfs/go-ipfs-blockstore v1.0.1/go.mod h1:MGNZlHNEnR4KGgPHM3/k8lBySIOK2Ve+0KjZubKlaOE= -github.com/ipfs/go-ipfs-blockstore v1.0.3/go.mod h1:MGNZlHNEnR4KGgPHM3/k8lBySIOK2Ve+0KjZubKlaOE= -github.com/ipfs/go-ipfs-blockstore v1.0.4 h1:DZdeya9Vu4ttvlGheQPGrj6kWehXnYZRFCp9EsZQ1hI= -github.com/ipfs/go-ipfs-blockstore v1.0.4/go.mod h1:uL7/gTJ8QIZ3MtA3dWf+s1a0U3fJy2fcEZAsovpRp+w= +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.1.0/go.mod h1:5QDUApRqpgPcfGstCxYeMnjt/DYQtXXdJVCvxHHuWVk= +github.com/ipfs/go-ipfs-blockstore v1.1.1/go.mod h1:w51tNR9y5+QXB0wkNcHt4O2aSZjTdqaEWaQdSxEyUOY= +github.com/ipfs/go-ipfs-blockstore v1.1.2 h1:WCXoZcMYnvOTmlpX+RSSnhVN0uCmbWTeepTGX5lgiXw= +github.com/ipfs/go-ipfs-blockstore v1.1.2/go.mod h1:w51tNR9y5+QXB0wkNcHt4O2aSZjTdqaEWaQdSxEyUOY= github.com/ipfs/go-ipfs-blocksutil v0.0.1 h1:Eh/H4pc1hsvhzsQoMEP3Bke/aW5P5rVM1IWFJMcGIPQ= github.com/ipfs/go-ipfs-blocksutil v0.0.1/go.mod h1:Yq4M86uIOmxmGPUHv/uI7uKqZNtLb449gwKqXjIsnRk= github.com/ipfs/go-ipfs-chunker v0.0.1/go.mod h1:tWewYK0we3+rMbOh7pPFGDyypCtvGcBFymgY4rSDLAw= @@ -981,12 +954,15 @@ 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 h1:bEQ8hMGs80h0sR8O4tfDgV6B01aaF9qeTrujrTLYV3g= github.com/ipfs/go-ipfs-ds-help v1.0.0/go.mod h1:ujAbkeIgkKAWtxxNkoZHWLCyk5JpPoKnGyCcsoF6ueE= -github.com/ipfs/go-ipfs-exchange-interface v0.0.1 h1:LJXIo9W7CAmugqI+uofioIpRb6rY30GUu7G6LUfpMvM= +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-offline v0.0.1 h1:P56jYKZF7lDDOLx5SotVh5KFxoY6C81I1NSHW1FxGew= +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-offline v0.0.1/go.mod h1:WhHSFCVYX36H/anEKQboAzpUws3x7UeEGkzQc3iNkM0= +github.com/ipfs/go-ipfs-exchange-offline v0.1.1 h1:mEiXWdbMN6C7vtDG21Fphx8TGCbZPpQnz/496w/PL4g= +github.com/ipfs/go-ipfs-exchange-offline v0.1.1/go.mod h1:vTiBRIbzSwDD0OWm+i3xeT0mO7jG2cbJYatp3HPk5XY= 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= @@ -1000,17 +976,18 @@ github.com/ipfs/go-ipfs-pq v0.0.1/go.mod h1:LWIqQpqfRG3fNc5XsnIhz/wQ2XXGyugQwls7 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-routing v0.0.1/go.mod h1:k76lf20iKFxQTjcJokbPM9iBXVXVZhcOwc360N4nuKs= -github.com/ipfs/go-ipfs-routing v0.1.0 h1:gAJTT1cEeeLj6/DlLX6t+NxD9fQe2ymTO6qWRDI/HQQ= 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= +github.com/ipfs/go-ipfs-routing v0.2.1/go.mod h1:xiNNiwgjmLqPS1cimvAw6EyB9rkVDbiocA4yY+wRNLM= github.com/ipfs/go-ipfs-util v0.0.1/go.mod h1:spsl5z8KUnrve+73pOhSVZND1SIxPW5RyBCNzQxlJBc= github.com/ipfs/go-ipfs-util v0.0.2 h1:59Sswnk1MFaiq+VcaknX7aYEyGyGDAA73ilhEK2POp8= github.com/ipfs/go-ipfs-util v0.0.2/go.mod h1:CbPtkWJzjLdEcezDns2XYaehFVNXG9zrdrtMecczcsQ= github.com/ipfs/go-ipld-cbor v0.0.2/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= github.com/ipfs/go-ipld-cbor v0.0.3/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= github.com/ipfs/go-ipld-cbor v0.0.4/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= -github.com/ipfs/go-ipld-cbor v0.0.5-0.20200204214505-252690b78669/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= -github.com/ipfs/go-ipld-cbor v0.0.5 h1:ovz4CHKogtG2KB/h1zUp5U0c/IzZrL435rCh5+K/5G8= github.com/ipfs/go-ipld-cbor v0.0.5/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= +github.com/ipfs/go-ipld-cbor v0.0.6-0.20211211231443-5d9b9e1f6fa8 h1:Fq+aGXgpnWNULTbgGi+c08MJYnceRXlwP75+3m8mWXU= +github.com/ipfs/go-ipld-cbor v0.0.6-0.20211211231443-5d9b9e1f6fa8/go.mod h1:ssdxxaLJPXH7OjF5V4NSjBbcfh+evoR4ukuru0oPXMA= github.com/ipfs/go-ipld-format v0.0.1/go.mod h1:kyJtbkDALmFHv3QR6et67i35QzO3S0dCDnkOJhcZkms= github.com/ipfs/go-ipld-format v0.0.2/go.mod h1:4B6+FM2u9OJ9zCV+kSbgFAZlOrv1Hqbf0INGQgiKf9k= github.com/ipfs/go-ipld-format v0.2.0 h1:xGlJKkArkmBvowr+GMCX0FEZtkro71K1AwiKnL37mwA= @@ -1036,15 +1013,15 @@ github.com/ipfs/go-log/v2 v2.1.1/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHn github.com/ipfs/go-log/v2 v2.1.2-0.20200626104915-0016c0b4b3e4/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHntrv9KM= github.com/ipfs/go-log/v2 v2.1.2/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHntrv9KM= github.com/ipfs/go-log/v2 v2.1.3/go.mod h1:/8d0SH3Su5Ooc31QlL1WysJhvyOTDCjcCZ9Axpmri6g= -github.com/ipfs/go-log/v2 v2.3.0 h1:31Re/cPqFHpsRHgyVwjWADPoF0otB1WrjTy8ZFYwEZU= github.com/ipfs/go-log/v2 v2.3.0/go.mod h1:QqGoj30OTpnKaG/LKTGTxoP2mmQtjVMEnK72gynbe/g= +github.com/ipfs/go-log/v2 v2.4.0 h1:iR/2o9PGWanVJrBgIH5Ff8mPGOwpqLaPIAFqSnsdlzk= +github.com/ipfs/go-log/v2 v2.4.0/go.mod h1:nPZnh7Cj7lwS3LpRU5Mwr2ol1c2gXIEXuF6aywqrtmo= github.com/ipfs/go-merkledag v0.0.6/go.mod h1:QYPdnlvkOg7GnQRofu9XZimC5ZW5Wi3bKys/4GQQfto= 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.1/go.mod h1:fvkZNNZixVW6cKSZ/JfLlON5OlgTXNdRLz0p6QG/I2M= github.com/ipfs/go-merkledag v0.3.2/go.mod h1:fvkZNNZixVW6cKSZ/JfLlON5OlgTXNdRLz0p6QG/I2M= -github.com/ipfs/go-merkledag v0.4.1 h1:CEEQZnwRkszN06oezuasHwDD823Xcr4p4zluUN9vXqs= -github.com/ipfs/go-merkledag v0.4.1/go.mod h1:56biPaS6e+IS0eXkEt6A8tG+BUQaEIFqDqJuFfQDBoE= +github.com/ipfs/go-merkledag v0.5.1 h1:tr17GPP5XtPhvPPiWtu20tSGZiZDuTaJRXBLcr79Umk= +github.com/ipfs/go-merkledag v0.5.1/go.mod h1:cLMZXx8J08idkp5+id62iVftUQV+HlYJ3PIhDfZsjA4= github.com/ipfs/go-metrics-interface v0.0.1 h1:j+cpbjYvu4R8zbleSs36gvB7jR+wsL2fGD6n0jO4kdg= github.com/ipfs/go-metrics-interface v0.0.1/go.mod h1:6s6euYU4zowdslK0GKHmqaIZ3j/b/tL7HTWtJ4VPgWY= github.com/ipfs/go-metrics-prometheus v0.0.2/go.mod h1:ELLU99AQQNi+zX6GCGm2lAgnzdSH3u5UVlCdqSXnEks= @@ -1052,10 +1029,8 @@ github.com/ipfs/go-path v0.0.7 h1:H06hKMquQ0aYtHiHryOMLpQC1qC3QwXwkahcEVD51Ho= github.com/ipfs/go-path v0.0.7/go.mod h1:6KTKmeRnBXgqrTvzFrPV3CamxcgvXX/4z79tfAd2Sno= 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.6.0 h1:BT1/PuNViVomiz1PnnP5+WmKsTNHrxIDvkZrkj4JhOg= -github.com/ipfs/go-peertaskqueue v0.6.0/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68ow0Rrb04donIU= +github.com/ipfs/go-peertaskqueue v0.7.0 h1:VyO6G4sbzX80K58N60cCaHsSsypbUNs1GjO5seGNsQ0= +github.com/ipfs/go-peertaskqueue v0.7.0/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68ow0Rrb04donIU= 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= @@ -1070,34 +1045,27 @@ github.com/ipfs/iptb v1.4.0/go.mod h1:1rzHpCYtNp87/+hTxG5TfCVn/yMY3dKnLn8tBiMfdm 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/ipld/go-car v0.1.0/go.mod h1:RCWzaUh2i4mOEkB3W45Vc+9jnS/M6Qay5ooytiBHl3g= -github.com/ipld/go-car v0.1.1-0.20200923150018-8cdef32e2da4/go.mod h1:xrMEcuSq+D1vEwl+YAXsg/JfA98XGpXDwnkIL4Aimqw= -github.com/ipld/go-car v0.1.1-0.20201119040415-11b6074b6d4d/go.mod h1:2Gys8L8MJ6zkh1gktTSXreY63t4UbyvNp5JaudTyxHQ= -github.com/ipld/go-car v0.3.2-0.20211001225732-32d0d9933823 h1:8JMSJ0k71fU9lIUrpVwEdoX4KoxiTEX8cZG97v/hTDw= -github.com/ipld/go-car v0.3.2-0.20211001225732-32d0d9933823/go.mod h1:jSlTph+i/q1jLFoiKKeN69KGG0fXpwrcD0izu5C1Tpo= -github.com/ipld/go-car/v2 v2.0.0-beta1.0.20210721090610-5a9d1b217d25/go.mod h1:I2ACeeg6XNBe5pdh5TaR7Ambhfa7If9KXxmXgZsYENU= -github.com/ipld/go-car/v2 v2.0.2/go.mod h1:I2ACeeg6XNBe5pdh5TaR7Ambhfa7If9KXxmXgZsYENU= -github.com/ipld/go-car/v2 v2.0.3-0.20210811121346-c514a30114d7 h1:6Z0beJSZNsRY+7udoqUl4gQ/tqtrPuRvDySrlsvbqZA= -github.com/ipld/go-car/v2 v2.0.3-0.20210811121346-c514a30114d7/go.mod h1:I2ACeeg6XNBe5pdh5TaR7Ambhfa7If9KXxmXgZsYENU= +github.com/ipld/go-car v0.3.3-0.20211210032800-e6f244225a16 h1:y6CW3GCY5Nm86/9vwphaghTTmOvEtfJjBOAzAIy3/Mk= +github.com/ipld/go-car v0.3.3-0.20211210032800-e6f244225a16/go.mod h1:/wkKF4908ULT4dFIFIUZYcfjAnj+KFnJvlh8Hsz1FbQ= +github.com/ipld/go-car/v2 v2.1.1-0.20211211000942-be2525f6bf2d h1:yrjb9jdAj3Lkxgp8af5G3g4Yv4PwWac3+sikmJVF0fA= +github.com/ipld/go-car/v2 v2.1.1-0.20211211000942-be2525f6bf2d/go.mod h1:+2Yvf0Z3wzkv7NeI69i8tuZ+ft7jyjPYIWZzeVNeFcI= github.com/ipld/go-codec-dagpb v1.2.0/go.mod h1:6nBN7X7h8EOsEejZGqC7tej5drsdBAXbMHyBT+Fne5s= github.com/ipld/go-codec-dagpb v1.3.0 h1:czTcaoAuNNyIYWs6Qe01DJ+sEX7B+1Z0LcXjSatMGe8= github.com/ipld/go-codec-dagpb v1.3.0/go.mod h1:ga4JTU3abYApDC3pZ00BC2RSvC3qfBb9MSJkMLSwnhA= github.com/ipld/go-ipld-prime v0.0.2-0.20191108012745-28a82f04c785/go.mod h1:bDDSvVz7vaK12FNvMeRYnpRFkSUPNQOiCYQezMD/P3w= -github.com/ipld/go-ipld-prime v0.0.2-0.20200428162820-8b59dc292b8e/go.mod h1:uVIwe/u0H4VdKv3kaN1ck7uCb6yD9cFLS9/ELyXbsw8= -github.com/ipld/go-ipld-prime v0.5.1-0.20200828233916-988837377a7f/go.mod h1:0xEgdD6MKbZ1vF0GC+YcR/C4SQCAlRuOjIJ2i0HxqzM= -github.com/ipld/go-ipld-prime v0.5.1-0.20201021195245-109253e8a018/go.mod h1:0xEgdD6MKbZ1vF0GC+YcR/C4SQCAlRuOjIJ2i0HxqzM= github.com/ipld/go-ipld-prime v0.9.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= 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-0.20210930132912-0b3aef3ca569/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= -github.com/ipld/go-ipld-prime v0.12.3 h1:furVobw7UBLQZwlEwfE26tYORy3PAK8VYSgZOSr3JMQ= 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.3-0.20211207234443-319145880958 h1:olscE5Sv+ts+N9YLQsIL9k6eS6y6CXMGRl5RCr2Cn/E= +github.com/ipld/go-ipld-prime v0.14.3-0.20211207234443-319145880958/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= github.com/ipld/go-ipld-prime-proto v0.0.0-20191113031812-e32bd156a1e5/go.mod h1:gcvzoEDBjwycpXt3LBE061wT9f46szXGHAmj9uoP6fU= -github.com/ipld/go-ipld-prime-proto v0.0.0-20200428191222-c1ffdadc01e1/go.mod h1:OAV6xBmuTLsPZ+epzKkPB1e25FHk/vCtyatkdHcArLs= -github.com/ipld/go-ipld-prime-proto v0.0.0-20200922192210-9a2bfd4440a6/go.mod h1:3pHYooM9Ea65jewRwrb2u5uHZCNkNTe9ABsVB+SrkH0= -github.com/ipld/go-ipld-prime-proto v0.1.0/go.mod h1:11zp8f3sHVgIqtb/c9Kr5ZGqpnCLF1IVTNOez9TopzE= -github.com/ipld/go-ipld-selector-text-lite v0.0.0 h1:MLU1YUAgd3Z+RfVCXUbvxH1RQjEe+larJ9jmlW1aMgA= -github.com/ipld/go-ipld-selector-text-lite v0.0.0/go.mod h1:U2CQmFb+uWzfIEF3I1arrDa5rwtj00PrpiwwCO+k1RM= +github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20211210234204-ce2a1c70cd73 h1:TsyATB2ZRRQGTwafJdgEUQkmjOExRV0DNokcihZxbnQ= +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/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= @@ -1105,7 +1073,6 @@ github.com/jackpal/go-nat-pmp v1.0.1/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+ github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jbenet/go-cienv v0.0.0-20150120210510-1bb1476777ec/go.mod h1:rGaEvXB4uRSZMmzKNLoXvTu1sfx+1kv/DojUlPrSZGs= -github.com/jbenet/go-cienv v0.1.0 h1:Vc/s0QbQtoxX8MwwSLWWh+xNNZvM3Lw7NsTcHrvvhMc= github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= github.com/jbenet/go-random v0.0.0-20190219211222-123a90aedc0c h1:uUx61FiAa1GI6ZmVd2wf2vULeQZIKG66eybjNXKYCz4= github.com/jbenet/go-random v0.0.0-20190219211222-123a90aedc0c/go.mod h1:sdx1xVM9UuLw1tXnhJWN3piypTUO3vCIHYmG15KE/dU= @@ -1128,8 +1095,9 @@ github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901 h1:rp+c0RAYOWj8 github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901/go.mod h1:Z86h9688Y0wesXCyonoVr47MasHilkuLMqGhRZ4Hpak= github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jonboulle/clockwork v0.1.1-0.20190114141812-62fb9bc030d1 h1:qBCV/RLV02TSfQa7tFmxTihnG+u+7JXByOkhlkR5rmQ= github.com/jonboulle/clockwork v0.1.1-0.20190114141812-62fb9bc030d1/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jonboulle/clockwork v0.2.2 h1:UOGuzwb1PwsrDAObMuhUnj0p5ULPj8V/xJ7Kx9qUBdQ= +github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= @@ -1181,7 +1149,6 @@ github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5 h1:2U0HzY8BJ8hVwDK github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= 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.8/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6/go.mod h1:+ZoRqAPRLkC4NPOvfYeR5KNOrY6TD+/sAC3HXPZgDYg= @@ -1198,8 +1165,9 @@ github.com/kpacha/opencensus-influxdb v0.0.0-20181102202715-663e2683a27c/go.mod 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= -github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= @@ -1223,8 +1191,9 @@ github.com/libp2p/go-conn-security v0.0.1/go.mod h1:bGmu51N0KU9IEjX7kl2PQjgZa40J github.com/libp2p/go-conn-security-multistream v0.0.2/go.mod h1:nc9vud7inQ+d6SO0I/6dSWrdMnHnzZNHeyUQqrAJulE= github.com/libp2p/go-conn-security-multistream v0.1.0/go.mod h1:aw6eD7LOsHEX7+2hJkDxw1MteijaVcI+/eP2/x3J1xc= 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 h1:ft6/POSK7F+vl/2qzegnHDaXFU0iWB4yVTYrioC6Zy0= github.com/libp2p/go-conn-security-multistream v0.2.1/go.mod h1:cR1d8gA0Hr59Fj6NhaTpFhJZrjSYuNmhpT2r25zYR70= +github.com/libp2p/go-conn-security-multistream v0.3.0 h1:9UCIKlBL1hC9u7nkMXpD1nkc/T53PKMAn3/k9ivBAVc= +github.com/libp2p/go-conn-security-multistream v0.3.0/go.mod h1:EEP47t4fw/bTelVmEzIDqSe69hO/ip52xBEhZMLWAHM= 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= @@ -1238,21 +1207,20 @@ github.com/libp2p/go-libp2p v0.1.0/go.mod h1:6D/2OBauqLUoqcADOJpn9WbKqvaM07tDw68 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.0/go.mod h1:mfKWI7Soz3ABX+XEBR61lGbg+ewyMtJHVt043oWeqwg= 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.8.3/go.mod h1:EsH1A+8yoWK+L4iKcbPYu6MPluZ+CHWI9El8cTaefiM= -github.com/libp2p/go-libp2p v0.9.2/go.mod h1:cunHNLDVus66Ct9iXXcjKRLdmHdFdHVe1TAnbubJQqQ= github.com/libp2p/go-libp2p v0.10.0/go.mod h1:yBJNpb+mGJdgrwbKAKrhPU0u3ogyNFTfjJ6bdM+Q/G8= -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.15.0 h1:jbMbdmtizfpvl1+oQuGJzfGhttAtuxUCavF3enwFncg= -github.com/libp2p/go-libp2p v0.15.0/go.mod h1:8Ljmwon0cZZYKrOCjFeLwQEK8bqR42dOheUZ1kSKhP0= -github.com/libp2p/go-libp2p-asn-util v0.0.0-20200825225859-85005c6cf052 h1:BM7aaOF7RpmNn9+9g6uTjGJ0cTzWr5j9i9IKeun2M8U= +github.com/libp2p/go-libp2p v0.16.0/go.mod h1:ump42BsirwAWxKzsCiFnTtN1Yc+DuPu76fyMX364/O4= +github.com/libp2p/go-libp2p v0.17.0 h1:8l4GV401OSd4dFRyHDtIT/mEzdh/aQGoFC8xshYgm5M= +github.com/libp2p/go-libp2p v0.17.0/go.mod h1:Fkin50rsGdv5mm5BshBUtPRZknt9esfmYXBOYcwOTgw= 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 h1:rABPCO77SjdbJ/eJ/ynIo8vWICy1VEnL5JAxJbQLo1E= +github.com/libp2p/go-libp2p-asn-util v0.1.0/go.mod h1:wu+AnM9Ii2KgO5jMmS1rz9dvzTdj8BXqsPR9HR0XB7I= github.com/libp2p/go-libp2p-autonat v0.0.6/go.mod h1:uZneLdOkZHro35xIhpbtTzLlgYturpu4J5+0cZK3MqE= github.com/libp2p/go-libp2p-autonat v0.1.0/go.mod h1:1tLf2yXxiE/oKGtDwPYWTSYG3PtvYlJmg7NeVtPRqH8= github.com/libp2p/go-libp2p-autonat v0.1.1/go.mod h1:OXqkeGOY2xJVWKAGV2inNF5aKN/djNA3fdpCWloIudE= @@ -1260,17 +1228,19 @@ github.com/libp2p/go-libp2p-autonat v0.2.0/go.mod h1:DX+9teU4pEEoZUqR1PiMlqliONQ 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.2.3/go.mod h1:2U6bNWCNsAG9LEbwccBDQbjzQ8Krdjge1jLTE9rdoMM= -github.com/libp2p/go-libp2p-autonat v0.4.0/go.mod h1:YxaJlpr81FhdOv3W3BTconZPfhaYivRdf53g+S2wobk= -github.com/libp2p/go-libp2p-autonat v0.4.2 h1:YMp7StMi2dof+baaxkbxaizXjY1RPvU71CXfxExzcUU= 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 h1:rCP5s+A2dlhM1Xd66wurE0k7S7pPmM0D+FlqqSBXxks= +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.1.6/go.mod h1:jONCAJqEP+Z8T6EQviGL4JsQcLx1LgTGtVqFNY8EMfQ= -github.com/libp2p/go-libp2p-blankhost v0.2.0 h1:3EsGAi0CBGcZ33GwRuXEYJLLPoVWyXJ1bcJzAJjINkk= 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= @@ -1282,9 +1252,9 @@ github.com/libp2p/go-libp2p-circuit v0.2.3/go.mod h1:nkG3iE01tR3FoQ2nMm06IUrCpCy github.com/libp2p/go-libp2p-circuit v0.4.0 h1:eqQ3sEYkGTtybWgr6JLqJY6QLtPWRErvFjFDfAOO1wc= github.com/libp2p/go-libp2p-circuit v0.4.0/go.mod h1:t/ktoFIUzM6uLQ+o1G6NuBl2ANhBKN9Bc8jRIk31MoA= github.com/libp2p/go-libp2p-connmgr v0.1.1/go.mod h1:wZxh8veAmU5qdrfJ0ZBLcU8oJe9L82ciVP/fl1VHjXk= -github.com/libp2p/go-libp2p-connmgr v0.2.3/go.mod h1:Gqjg29zI8CwXX21zRxy6gOg8VYu3zVerJRt2KyktzH4= -github.com/libp2p/go-libp2p-connmgr v0.2.4 h1:TMS0vc0TCBomtQJyWr7fYxcVYYhx+q/2gF++G5Jkl/w= github.com/libp2p/go-libp2p-connmgr v0.2.4/go.mod h1:YV0b/RIm8NGPnnNWM7hG9Q38OeQiQfKhHCCs1++ufn0= +github.com/libp2p/go-libp2p-connmgr v0.3.0 h1:yerFXrYa0oxpuVsLlndwm/bLulouHYDcvFrY/4H4fx8= +github.com/libp2p/go-libp2p-connmgr v0.3.0/go.mod h1:RVoyPjJm0J9Vd1m6qUN2Tn7kJm4rL1Ml20pFsFgPGik= github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= 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= @@ -1314,8 +1284,12 @@ github.com/libp2p/go-libp2p-core v0.8.1/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJB github.com/libp2p/go-libp2p-core v0.8.2/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= github.com/libp2p/go-libp2p-core v0.8.5/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= github.com/libp2p/go-libp2p-core v0.8.6/go.mod h1:dgHr0l0hIKfWpGpqAMbpo19pen9wJfdCGv51mTmdpmM= -github.com/libp2p/go-libp2p-core v0.9.0 h1:t97Mv0LIBZlP2FXVRNKKVzHJCIjbIWGxYptGId4+htU= github.com/libp2p/go-libp2p-core v0.9.0/go.mod h1:ESsbz31oC3C1AvMJoGx26RTuCkNhmkSRCqZ0kQtJ2/8= +github.com/libp2p/go-libp2p-core v0.10.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= +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 h1:IFG/s8dN6JN2OTrXX9eq2wNU/Zlz2KLdwZUp5FplgXI= +github.com/libp2p/go-libp2p-core v0.13.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= 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= @@ -1326,8 +1300,8 @@ 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.4.0/go.mod h1:bZ0aJSrFc/eX2llP0ryhb1kpgkPyTo23SJ5b7UQCMh4= github.com/libp2p/go-libp2p-discovery v0.5.0/go.mod h1:+srtPIU9gDaBNu//UHvcdliKBIcr4SfDcm0/PfPJLug= -github.com/libp2p/go-libp2p-discovery v0.5.1 h1:CJylx+h2+4+s68GvrM4pGNyfNhOYviWBPtVv5PA7sfo= -github.com/libp2p/go-libp2p-discovery v0.5.1/go.mod h1:+srtPIU9gDaBNu//UHvcdliKBIcr4SfDcm0/PfPJLug= +github.com/libp2p/go-libp2p-discovery v0.6.0 h1:1XdPmhMJr8Tmj/yUfkJMIi8mgwWrLUsCB3bMxdT+DSo= +github.com/libp2p/go-libp2p-discovery v0.6.0/go.mod h1:/u1voHt0tKIe5oIA1RHBKQLVCWPna2dXmPNHc2zR9S8= 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-interface-connmgr v0.0.1/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= @@ -1335,8 +1309,8 @@ 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.13.0 h1:qBNYzee8BVS6RkD8ukIAGRG6LmVz8+kkeponyI7W+yA= -github.com/libp2p/go-libp2p-kad-dht v0.13.0/go.mod h1:NkGf28RNhPrcsGYWJHm6EH8ULkiJ2qxsWmpE7VTL3LI= +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= @@ -1355,17 +1329,17 @@ github.com/libp2p/go-libp2p-mplex v0.4.1 h1:/pyhkP1nLwjG3OM+VuaNJkQT/Pqq73WzB3aD github.com/libp2p/go-libp2p-mplex v0.4.1/go.mod h1:cmy+3GfqfM1PceHTLL7zQzAAYaryDu6iPSC+CIb094g= 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 h1:wMWis3kYynCbHoyKLPBEMu4YRLltbm8Mk08HGSfvTkU= github.com/libp2p/go-libp2p-nat v0.0.6/go.mod h1:iV59LVhB3IkFvS6S6sauVTSOrNEANnINbI/fkaLimiw= +github.com/libp2p/go-libp2p-nat v0.1.0 h1:vigUi2MEN+fwghe5ijpScxtbbDz+L/6y8XwlzYOJgSY= +github.com/libp2p/go-libp2p-nat v0.1.0/go.mod h1:DQzAG+QbDYjN1/C3B6vXucLtz3u9rEonLVPtZVzQqks= 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-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.2.2 h1:MRt5XGfYziDXIUy2udtMWfPmzZqUDYoC1FZoKnqPzwk= -github.com/libp2p/go-libp2p-noise v0.2.2/go.mod h1:IEbYhBBzGyvdLBoxxULL/SGbJARhUeqlO8lVSREYu2Q= +github.com/libp2p/go-libp2p-noise v0.3.0 h1:NCVH7evhVt9njbTQshzT7N1S3Q6fjj9M11FCgfH5+cA= +github.com/libp2p/go-libp2p-noise v0.3.0/go.mod h1:JNjHbociDJKHD64KTkzGnzqJ0FEV5gHJa6AB00kbCNQ= github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo= github.com/libp2p/go-libp2p-peer v0.1.1/go.mod h1:jkF12jGB4Gk/IOo+yomm+7oLWxF278F7UnrYUQ1Q8es= github.com/libp2p/go-libp2p-peer v0.2.0/go.mod h1:RCffaCvUyW2CJmG2gAWVqwePwW7JMgxjsHm7+J5kjWY= @@ -1382,24 +1356,27 @@ github.com/libp2p/go-libp2p-peerstore v0.2.4/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuD github.com/libp2p/go-libp2p-peerstore v0.2.6/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= github.com/libp2p/go-libp2p-peerstore v0.2.7/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= github.com/libp2p/go-libp2p-peerstore v0.2.8/go.mod h1:gGiPlXdz7mIHd2vfAsHzBNAMqSDkt2UBFwgcITgw1lA= -github.com/libp2p/go-libp2p-peerstore v0.3.0 h1:wp/G0+37+GLr7tu+wE+4GWNrA3uxKg6IPRigIMSS5oQ= -github.com/libp2p/go-libp2p-peerstore v0.3.0/go.mod h1:fNX9WlOENMvdx/YD7YO/5Hkrn8+lQIk5A39BHa1HIrM= +github.com/libp2p/go-libp2p-peerstore v0.4.0/go.mod h1:rDJUFyzEWPpXpEwywkcTYYzDHlwza8riYMaUzaN6hX0= +github.com/libp2p/go-libp2p-peerstore v0.6.0 h1:HJminhQSGISBIRb93N6WK3t6Fa8OOTnHd/VBjL4mY5A= +github.com/libp2p/go-libp2p-peerstore v0.6.0/go.mod h1:DGEmKdXrcYpK9Jha3sS7MhqYdInxJy84bIPtSu65bKc= github.com/libp2p/go-libp2p-pnet v0.2.0 h1:J6htxttBipJujEjz1y0a5+eYoiPcFHhSYHH6na5f0/k= 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.3.2-0.20200527132641-c0712c6e92cf/go.mod h1:TxPOBuo1FPdsTjFnv+FGZbNbWYsp74Culx+4ViQpato= github.com/libp2p/go-libp2p-pubsub v0.3.2/go.mod h1:Uss7/Cfz872KggNb+doCVPHeCDmXB7z500m/R8DaAUk= -github.com/libp2p/go-libp2p-pubsub v0.5.4 h1:rHl9/Xok4zX3zgi0pg0XnUj9Xj2OeXO8oTu85q2+YA8= -github.com/libp2p/go-libp2p-pubsub v0.5.4/go.mod h1:gVOzwebXVdSMDQBTfH8ACO5EJ4SQrvsHqCmYsCZpD0E= +github.com/libp2p/go-libp2p-pubsub v0.6.0 h1:98+RXuEWW17U6cAijK1yaTf6mw/B+n5yPA421z+dlo0= +github.com/libp2p/go-libp2p-pubsub v0.6.0/go.mod h1:nJv87QM2cU0w45KPR1rZicq+FmFIOD16zmT+ep1nOmg= github.com/libp2p/go-libp2p-pubsub-tracer v0.0.0-20200626141350-e730b32bf1e6 h1:2lH7rMlvDPSvXeOR+g7FE6aqiEwxtpxWKQL8uigk5fQ= github.com/libp2p/go-libp2p-pubsub-tracer v0.0.0-20200626141350-e730b32bf1e6/go.mod h1:8ZodgKS4qRLayfw9FDKDd9DX4C16/GMofDxSldG8QPI= github.com/libp2p/go-libp2p-quic-transport v0.1.1/go.mod h1:wqG/jzhF3Pu2NrhJEvE+IE0NTHNXslOPn9JQzyCAxzU= github.com/libp2p/go-libp2p-quic-transport v0.5.0/go.mod h1:IEcuC5MLxvZ5KuHKjRu+dr3LjCT1Be3rcD/4d8JrX8M= github.com/libp2p/go-libp2p-quic-transport v0.10.0/go.mod h1:RfJbZ8IqXIhxBRm5hqUEJqjiiY8xmEuq3HUDS993MkA= -github.com/libp2p/go-libp2p-quic-transport v0.11.2 h1:p1YQDZRHH4Cv2LPtHubqlQ9ggz4CKng/REZuXZbZMhM= 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= +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 h1:wHBEceRy+1/8Ec8dAIyr+/P7L2YefIGprPVy5LrMM+k= +github.com/libp2p/go-libp2p-quic-transport v0.15.2/go.mod h1:wv4uGwjcqe8Mhjj7N/Ic0aKjA+/10UnMlSzLO0yRpYQ= 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= @@ -1424,10 +1401,11 @@ github.com/libp2p/go-libp2p-swarm v0.2.4/go.mod h1:/xIpHFPPh3wmSthtxdGbkHZ0OET1h github.com/libp2p/go-libp2p-swarm v0.2.7/go.mod h1:ZSJ0Q+oq/B1JgfPHJAT2HTall+xYRNYp1xs4S2FBWKA= 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.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 h1:hsYaD/y6+kZff1o1Mc56NcuwSg80lIphTS/zDk3mO4M= 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= +github.com/libp2p/go-libp2p-swarm v0.9.0 h1:LdWjHDVjPMYt3NCG2EHcQiIP8XzA8BHhHz8ZLAYol2Y= +github.com/libp2p/go-libp2p-swarm v0.9.0/go.mod h1:2f8d8uxTJmpeqHF/1ujjdXZp+98nNIbujVOMEZxCbZ8= 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= @@ -1437,22 +1415,26 @@ github.com/libp2p/go-libp2p-testing v0.1.1/go.mod h1:xaZWMJrPUM5GlDBxCeGUi7kI4eq github.com/libp2p/go-libp2p-testing v0.1.2-0.20200422005655-8775583591d8/go.mod h1:Qy8sAncLKpwXtS2dSnDOP8ktexIAHKu+J+pnZOFZLTc= github.com/libp2p/go-libp2p-testing v0.3.0/go.mod h1:efZkql4UZ7OVsEfaxNHZPzIehtsBXMrXnCfJIgDti5g= github.com/libp2p/go-libp2p-testing v0.4.0/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotlKsNSbKQ/lImlOWF0= -github.com/libp2p/go-libp2p-testing v0.4.2 h1:IOiA5mMigi+eEjf4J+B7fepDhsjtsoWA9QbsCqbNp5U= 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 h1:tV/wz6mS1VoAYA/5DGTiyzw9TJ+eXMCMvzU5VPLJSgg= +github.com/libp2p/go-libp2p-testing v0.6.0/go.mod h1:QBk8fqIL1XNcno/l3/hhaIEn4aLRijpYOR+zVjjlh+A= github.com/libp2p/go-libp2p-tls v0.1.3/go.mod h1:wZfuewxOndz5RTnCAxFliGjvYSDA40sKitV4c50uI1M= -github.com/libp2p/go-libp2p-tls v0.2.0 h1:N8i5wPiHudA+02sfW85R2nUbybPm7agjAywZc6pd3xA= -github.com/libp2p/go-libp2p-tls v0.2.0/go.mod h1:twrp2Ci4lE2GYspA1AnlYm+boYjqVruxDKJJj7s6xrc= +github.com/libp2p/go-libp2p-tls v0.3.0/go.mod h1:fwF5X6PWGxm6IDRwF3V8AVCCj/hOd5oFlg+wo2FxJDY= +github.com/libp2p/go-libp2p-tls v0.3.1 h1:lsE2zYte+rZCEOHF72J1Fg3XK3dGQyKvI6i5ehJfEp0= +github.com/libp2p/go-libp2p-tls v0.3.1/go.mod h1:fwF5X6PWGxm6IDRwF3V8AVCCj/hOd5oFlg+wo2FxJDY= github.com/libp2p/go-libp2p-transport v0.0.1/go.mod h1:UzbUs9X+PHOSw7S3ZmeOxfnwaQY5vGDzZmKPod3N3tk= github.com/libp2p/go-libp2p-transport v0.0.5/go.mod h1:StoY3sx6IqsP6XKoabsPnHCwqKXWUMWU7Rfcsubee/A= github.com/libp2p/go-libp2p-transport-upgrader v0.0.4/go.mod h1:RGq+tupk+oj7PzL2kn/m1w6YXxcIAYJYeI90h6BGgUc= 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 h1:SHt3g0FslnqIkEWF25YOB8UCOCTpGAVvHRWQYJ+veiI= github.com/libp2p/go-libp2p-transport-upgrader v0.4.6/go.mod h1:JE0WQuQdy+uLZ5zOaI3Nw9dWGYJIA7mywEtP2lMvnyk= +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 h1:GfMCU+2aGGEm1zW3UcOz6wYSn8tXQalFfVfcww99i5A= +github.com/libp2p/go-libp2p-transport-upgrader v0.6.0/go.mod h1:1e07y1ZSZdHo9HPbuU8IztM1Cj+DR5twgycb4pnRzRo= github.com/libp2p/go-libp2p-xor v0.0.0-20210714161855-5c005aca55db/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= @@ -1464,10 +1446,10 @@ 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 h1:/UOPtT/6DHPtr3TtKXBHa6g0Le0szYuI33Xc/Xpd7fQ= 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 h1:bVXHbTj/XH4uBBsPrg26BlDABk5WYRlssY73P0SjhPc= +github.com/libp2p/go-libp2p-yamux v0.7.0/go.mod h1:fMyA0CsPfHkIuBU0wjRGrCjTBFiXTXxG0k5M4ETv+08= 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= @@ -1484,12 +1466,14 @@ github.com/libp2p/go-mplex v0.3.0/go.mod h1:0Oy/A9PQlwBytDRp4wSkFnzHYDKcpLot35JQ 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= -github.com/libp2p/go-msgio v0.0.6 h1:lQ7Uc0kS1wb1EfRxO2Eir/RJoHkHn7t6o+EiwsYIKJA= github.com/libp2p/go-msgio v0.0.6/go.mod h1:4ecVB6d9f4BDSL5fqvPiC4A3KivjWn+Venn/1ALLMWA= +github.com/libp2p/go-msgio v0.1.0 h1:8Q7g/528ivAlfXTFWvWhVjTE8XG8sDTkRUKPYh9+5Q8= +github.com/libp2p/go-msgio v0.1.0/go.mod h1:eNlv2vy9V2X/kNldcZ+SShFE++o2Yjxwx6RAYsmgJnE= github.com/libp2p/go-nat v0.0.3/go.mod h1:88nUEt0k0JD45Bk93NIwDqjlhiOwOoV36GchpcVc1yI= github.com/libp2p/go-nat v0.0.4/go.mod h1:Nmw50VAvKuk38jUBcmNh6p9lUJLoODbJRvYAa/+KSDo= -github.com/libp2p/go-nat v0.0.5 h1:qxnwkco8RLKqVh1NmjQ+tJ8p8khNLFxuElYG/TwqW4Q= github.com/libp2p/go-nat v0.0.5/go.mod h1:B7NxsVNPZmRLvMOwiEO1scOSyjA56zxYAGv1yQgRkEU= +github.com/libp2p/go-nat v0.1.0 h1:MfVsH6DLcpa04Xr+p8hmVRG4juse0s3J8HyNWYHffXg= +github.com/libp2p/go-nat v0.1.0/go.mod h1:X7teVkwRHNInVNWQiO/tAiAVRwSr5zoRz4YSTC3uRBM= github.com/libp2p/go-netroute v0.1.2/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk= github.com/libp2p/go-netroute v0.1.3/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk= github.com/libp2p/go-netroute v0.1.5/go.mod h1:V1SR3AaECRkEQCoFFzYwVYWvYIEtlxx89+O3qcpCl4A= @@ -1502,13 +1486,15 @@ github.com/libp2p/go-openssl v0.0.5/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO 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-reuseport v0.0.1/go.mod h1:jn6RmB1ufnQwl0Q1f+YxAj8isJgDCQzaaxIFYDhcYEA= -github.com/libp2p/go-reuseport v0.0.2 h1:XSG94b1FJfGA01BUrT82imejHQyTxO4jEWqheyCXYvU= github.com/libp2p/go-reuseport v0.0.2/go.mod h1:SPD+5RwGC7rcnzngoYC86GjPzjSywuQyMVAheVBD9nQ= +github.com/libp2p/go-reuseport v0.1.0 h1:0ooKOx2iwyIkf339WCZ2HN3ujTDbkK0PjC7JVoP1AiM= +github.com/libp2p/go-reuseport v0.1.0/go.mod h1:bQVn9hmfcTaoo0c9v5pBhOarsU1eNOBZdaAd2hzXRKU= github.com/libp2p/go-reuseport-transport v0.0.2/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs= github.com/libp2p/go-reuseport-transport v0.0.3/go.mod h1:Spv+MPft1exxARzP2Sruj2Wb5JSyHNncjf1Oi2dEbzM= github.com/libp2p/go-reuseport-transport v0.0.4/go.mod h1:trPa7r/7TJK/d+0hdBLOCGvpQQVOU74OXbNCIMkufGw= -github.com/libp2p/go-reuseport-transport v0.0.5 h1:lJzi+vSYbyJj2faPKLxNGWEIBcaV/uJmyvsUxXy2mLw= github.com/libp2p/go-reuseport-transport v0.0.5/go.mod h1:TC62hhPc8qs5c/RoXDZG6YmjK+/YWUPC0yYmeUecbjc= +github.com/libp2p/go-reuseport-transport v0.1.0 h1:C3PHeHjmnz8m6f0uydObj02tMEoi7CyD1zuN7xQT8gc= +github.com/libp2p/go-reuseport-transport v0.1.0/go.mod h1:vev0C0uMkzriDY59yFHD9v+ujJvYmDQVLowvAjEOmfw= 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 h1:yD80l2ZOdGksnOyHrhxDdTDFrf7Oy+v3FMVArIRgZxQ= @@ -1523,11 +1509,11 @@ 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= -github.com/libp2p/go-tcp-transport v0.2.8 h1:aLjX+Nkz+kIz3uA56WtlGKRSAnKDvnqKmv1qF4EyyE4= -github.com/libp2p/go-tcp-transport v0.2.8/go.mod h1:64rSfVidkYPLqbzpcN2IwHY4pmgirp67h++hZ/rcndQ= +github.com/libp2p/go-tcp-transport v0.4.0 h1:VDyg4j6en3OuXf90gfDQh5Sy9KowO9udnd0OU8PP6zg= +github.com/libp2p/go-tcp-transport v0.4.0/go.mod h1:0y52Rwrn4076xdJYu/51/qJIdxz+EWDAOG2S45sV3VI= 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= @@ -1545,23 +1531,23 @@ github.com/libp2p/go-yamux v1.2.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZ github.com/libp2p/go-yamux v1.3.0/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/libp2p/go-yamux v1.3.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/libp2p/go-yamux v1.3.5/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= -github.com/libp2p/go-yamux v1.3.6/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 h1:RwtpYZ2/wVviZ5+3pjC8qdQ4TKnrak0/E01N1UWoAFU= github.com/libp2p/go-yamux/v2 v2.2.0/go.mod h1:3So6P6TV6r75R9jiBpiIKgU/66lOarCZjqROGxzPpPQ= -github.com/libp2p/zeroconf/v2 v2.0.0/go.mod h1:J85R/d9joD8u8F9aHM8pBXygtG9W02enEwS+wWeL6yo= +github.com/libp2p/go-yamux/v2 v2.3.0 h1:luRV68GS1vqqr6EFUjtu1kr51d+IbW0gSowu8emYWAI= +github.com/libp2p/go-yamux/v2 v2.3.0/go.mod h1:iTU+lOIn/2h0AgKcL49clNTwfEw+WSfDYrXe05EyKIs= +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.16.0/go.mod h1:I0+fcNTdb9eS1ZcjQZbDVPGchJ86chcIxPALn9lEJqE= github.com/lucas-clemente/quic-go v0.19.3/go.mod h1:ADXpNbTQjq1hIzCpB+y/k5iz4n4z4IwqoLb94Kh5Hu8= -github.com/lucas-clemente/quic-go v0.21.2 h1:8LqqL7nBQFDUINadW0fHV/xSaCQJgmJC0Gv+qUnjd78= 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= +github.com/lucas-clemente/quic-go v0.24.0 h1:ToR7SIIEdrgOhgVTHvPgdVRJfgVy+N0wQAagH7L4d5g= +github.com/lucas-clemente/quic-go v0.24.0/go.mod h1:paZuzjXCE5mj6sikVLMvqXk8lJV2AsqtJ6bDhjEfxx0= 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= @@ -1587,12 +1573,12 @@ github.com/marten-seemann/qtls v0.9.1/go.mod h1:T1MmAdDPyISzxlK6kjRr0pcZFBVd1OZb 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= -github.com/marten-seemann/qtls-go1-15 v0.1.5 h1:Ci4EIUN6Rlb+D6GmLdej/bCQ4nPYNtVXQB+xjiXE1nk= github.com/marten-seemann/qtls-go1-15 v0.1.5/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= github.com/marten-seemann/qtls-go1-16 v0.1.4 h1:xbHbOGGhrenVtII6Co8akhLEdrawwB2iHl5yhJRpnco= github.com/marten-seemann/qtls-go1-16 v0.1.4/go.mod h1:gNpI2Ol+lRS3WwSOtIUUtRwZEQMXjYK+dQSBFbethAk= -github.com/marten-seemann/qtls-go1-17 v0.1.0-rc.1 h1:/rpmWuGvceLwwWuaKPdjpR4JJEUH0tq64/I3hvzaNLM= 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 h1:P9ggrs5xtwiqXv/FHNwntmuLMNq3KaSIG93AtAZ48xk= +github.com/marten-seemann/qtls-go1-17 v0.1.0/go.mod h1:fz4HIxByo+LlWcreM4CZOYNuz3taBQ8rN2X6FqvaWo8= 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= @@ -1641,7 +1627,6 @@ github.com/miekg/dns v1.1.22/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKju 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.29/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 h1:JKfpVSCB84vrAmHzyrsxB5NAr5kLoMXZArPSw7Qlgyg= github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= @@ -1731,10 +1716,9 @@ github.com/multiformats/go-multibase v0.0.2/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/g 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-multicodec v0.2.0/go.mod h1:/y4YVwkfMyry5kFbMTbLJKErhycTIftytRV+llXdyS4= -github.com/multiformats/go-multicodec v0.2.1-0.20210713081508-b421db6850ae/go.mod h1:qGGaQmioCDh+TeFOnxrbU0DaIPw8yFgAZgFG0V7p1qQ= -github.com/multiformats/go-multicodec v0.2.1-0.20210714093213-b2b5bd6fe68b/go.mod h1:qGGaQmioCDh+TeFOnxrbU0DaIPw8yFgAZgFG0V7p1qQ= -github.com/multiformats/go-multicodec v0.3.0 h1:tstDwfIjiHbnIjeM5Lp+pMrSeN+LCMsEwOrkPmWm03A= github.com/multiformats/go-multicodec v0.3.0/go.mod h1:qGGaQmioCDh+TeFOnxrbU0DaIPw8yFgAZgFG0V7p1qQ= +github.com/multiformats/go-multicodec v0.3.1-0.20210902112759-1539a079fd61 h1:ZrUuMKNgJ52qHPoQ+bx0h0uBfcWmN7Px+4uKSZeesiI= +github.com/multiformats/go-multicodec v0.3.1-0.20210902112759-1539a079fd61/go.mod h1:1Hj/eHRaVWSXiSNNfcEPcwZleTmdNP81xlxDLnWU9GQ= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po= github.com/multiformats/go-multihash v0.0.8/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= @@ -1743,13 +1727,12 @@ 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 h1:D2qsyy1WVculJbGv69pWmQ36ehxFoA5NiIUr1OEs6qI= -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 h1:TCYu1BHTDr1F/Qm75qwYISQdzGcRdC21nFgQW7l7GBo= github.com/multiformats/go-multistream v0.2.2/go.mod h1:UIcnm7Zuo8HKG+HkWgfQsGL+/MIEhyTqbODbIUwSXKs= @@ -1882,7 +1865,6 @@ github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeD 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.5.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= -github.com/prometheus/client_golang v1.6.0/go.mod h1:ZLOG9ck3JLRdB5MgO8f+lLTe83AXG6ro35rLTxvnIl4= 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= github.com/prometheus/client_golang v1.10.0/go.mod h1:WJM3cc3yu7XKBKa/I8WeZm+V3eltZnBwfENSU7mdogU= @@ -1920,7 +1902,6 @@ github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDa github.com/prometheus/procfs v0.0.5/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.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= 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= @@ -1931,8 +1912,8 @@ 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.0.1 h1:qgm3DIJAeb+2byneLrQJ7kvmDLGxN2vy3apXyGaDKN4= -github.com/raulk/go-watchdog v1.0.1/go.mod h1:lzSbAl5sh4rtI8tYHU01BWIDzgzqaQLj6RcA1i4mlqI= +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/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= @@ -1946,6 +1927,8 @@ github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6L github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rs/cors v1.6.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= @@ -2120,7 +2103,6 @@ github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11 h1:5HZfQkwe0mIf github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11/go.mod h1:Wlo/SzPmxVp6vXpGt/zaXhHH0fn4IxgqZc82aKg6bpQ= github.com/whyrusleeping/cbor-gen v0.0.0-20191216205031-b047b6acb3c0/go.mod h1:xdlJQaiqipF0HW+Mzpg7XRM3fWbGvfgFlcppuvlkIvY= github.com/whyrusleeping/cbor-gen v0.0.0-20200123233031-1cdf64d27158/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= -github.com/whyrusleeping/cbor-gen v0.0.0-20200402171437-3d27c146c105/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= github.com/whyrusleeping/cbor-gen v0.0.0-20200414195334-429a0b5e922e/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= github.com/whyrusleeping/cbor-gen v0.0.0-20200504204219-64967432584d/go.mod h1:W5MvapuoHRP8rz4vxjwCK1pDqF1aQcWsV5PZ+AHbqdg= github.com/whyrusleeping/cbor-gen v0.0.0-20200710004633-5379fc63235d/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= @@ -2209,13 +2191,23 @@ go.opencensus.io v0.22.1/go.mod h1:Ap50jQcDJrx6rB6VgeeFPtuPIf3wMRvRfrfYDO6+BmA= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.6-0.20201102222123-380f4078db9f/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= 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/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= go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= +go.opentelemetry.io/otel/metric v0.25.0/go.mod h1:E884FSpQfnJOMMUaq+05IWlJ4rjZpk2s/F1Ju+TEEm8= go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= +go.opentelemetry.io/otel/sdk v1.2.0/go.mod h1:jNN8QtpvbsKhgaC6V5lHiejMoKD+V8uadoSafgHPx1U= +go.opentelemetry.io/otel/sdk/export/metric v0.25.0/go.mod h1:Ej7NOa+WpN49EIcr1HMUYRvxXXCCnQCg2+ovdt2z8Pk= +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/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= @@ -2287,7 +2279,6 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20191202143827-86a70503ff7e/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= 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-20200117160349-530e935923ad/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200128174031-69ecbb4d6d5d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -2327,7 +2318,6 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20200513190911-00229845015e/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= 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= @@ -2358,7 +2348,6 @@ golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.1.1-0.20191209134235-331c550502dd/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 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.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -2412,10 +2401,8 @@ golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200519113804-d87ec0cfa476/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200602114024-627f9648deb9/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-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= @@ -2562,6 +2549,7 @@ golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7w 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= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210511113859-b0526f3d8744/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -2571,8 +2559,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-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210917161153-d61c044b1678 h1:J27LZFQBFoihqXoegpscI10HpjZ7B5WQLLKL2FZXQKw= golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac h1:oN6lz7iLW/YC7un8pq+9bOLyXrprv2+DKfkJY+2LJJw= +golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/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 h1:MZ2shdL+ZM/XzY3ZGOnh4Nlpnxz5GSOhOmtHo3iPU6M= @@ -2669,12 +2658,10 @@ golang.org/x/tools v0.0.0-20200721032237-77f530d86f9a/go.mod h1:njjCfa9FT2d7l9Bc 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= -golang.org/x/tools v0.0.0-20200827010519-17fd2f27a9e3/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20201112185108-eeaa07dd7696/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= 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-0.20210225150353-54dc8c5edb56/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= 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 h1:ouewzE6p+/VEB31YYnTbEJdi8pFqKp4P4n85vwo3DHA= @@ -2755,7 +2742,6 @@ google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200608115520-7c474a2e3482/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= 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= @@ -2867,6 +2853,8 @@ k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= k8s.io/kube-openapi v0.0.0-20200316234421-82d701f24f9d/go.mod h1:F+5wygcW0wmRTnM3cOgIqGivxkwSWIWT5YdsDbeAOaU= k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= k8s.io/utils v0.0.0-20200414100711-2df71ebbae66/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +lukechampine.com/blake3 v1.1.6 h1:H3cROdztr7RCfoaTpGZFQsrqvweFLrqS73j7L7cmR5c= +lukechampine.com/blake3 v1.1.6/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= modernc.org/cc v1.0.0 h1:nPibNuDEx6tvYrUAtvDTTw98rx5juGsa5zuDnKwEEQQ= modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= modernc.org/fileutil v1.0.0/go.mod h1:JHsWpkrk/CnVV1H/eGlFf85BEpfkrp56ro8nojIq9Q8= From 0eec00055f8a929600ade1be9063f6fa24d4dbdb Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 14 Dec 2021 18:23:43 +0200 Subject: [PATCH 097/393] fix lotus-soup build --- testplans/lotus-soup/testkit/retrieval.go | 2 +- testplans/lotus-soup/testkit/role_miner.go | 2 +- testplans/lotus-soup/testkit/role_pubsub_tracer.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/testplans/lotus-soup/testkit/retrieval.go b/testplans/lotus-soup/testkit/retrieval.go index 3d6683d00dc..67e8d16540b 100644 --- a/testplans/lotus-soup/testkit/retrieval.go +++ b/testplans/lotus-soup/testkit/retrieval.go @@ -78,7 +78,7 @@ func RetrieveData(t *TestEnvironment, ctx context.Context, client api.FullNode, func ExtractCarData(ctx context.Context, rdata []byte, rpath string) []byte { bserv := dstest.Bserv() - ch, err := car.LoadCar(bserv.Blockstore(), bytes.NewReader(rdata)) + ch, err := car.LoadCar(ctx, bserv.Blockstore(), bytes.NewReader(rdata)) if err != nil { panic(err) } diff --git a/testplans/lotus-soup/testkit/role_miner.go b/testplans/lotus-soup/testkit/role_miner.go index fc821cd4dbe..7204c71fee6 100644 --- a/testplans/lotus-soup/testkit/role_miner.go +++ b/testplans/lotus-soup/testkit/role_miner.go @@ -182,7 +182,7 @@ func PrepareMiner(t *TestEnvironment) (*LotusMiner, error) { return nil, err } - err = ds.Put(datastore.NewKey("miner-address"), minerAddr.Bytes()) + err = ds.Put(context.Background(), datastore.NewKey("miner-address"), minerAddr.Bytes()) if err != nil { return nil, err } diff --git a/testplans/lotus-soup/testkit/role_pubsub_tracer.go b/testplans/lotus-soup/testkit/role_pubsub_tracer.go index 5b13e6b81ab..401a9824dbd 100644 --- a/testplans/lotus-soup/testkit/role_pubsub_tracer.go +++ b/testplans/lotus-soup/testkit/role_pubsub_tracer.go @@ -30,7 +30,7 @@ func PreparePubsubTracer(t *TestEnvironment) (*PubsubTracer, error) { tracedIP := t.NetClient.MustGetDataNetworkIP().String() tracedAddr := fmt.Sprintf("/ip4/%s/tcp/4001", tracedIP) - host, err := libp2p.New(ctx, + host, err := libp2p.New( libp2p.Identity(privk), libp2p.ListenAddrStrings(tracedAddr), ) From a3ea3ad911c09e3386f17baada79d073606d563e Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 14 Dec 2021 11:39:06 -0500 Subject: [PATCH 098/393] Deps: Update actors v2 --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index e02b70215aa..eda9bffd849 100644 --- a/go.mod +++ b/go.mod @@ -45,7 +45,7 @@ require ( github.com/filecoin-project/go-statestore v0.2.0 github.com/filecoin-project/go-storedcounter v0.0.0-20211210031312-d066d7aa2f77 github.com/filecoin-project/specs-actors v0.9.14 - github.com/filecoin-project/specs-actors/v2 v2.3.5 + github.com/filecoin-project/specs-actors/v2 v2.3.6-0.20211214163252-3d83739fdba5 github.com/filecoin-project/specs-actors/v3 v3.1.1 github.com/filecoin-project/specs-actors/v4 v4.0.1 github.com/filecoin-project/specs-actors/v5 v5.0.4 diff --git a/go.sum b/go.sum index b81ed62235b..d3ce7212104 100644 --- a/go.sum +++ b/go.sum @@ -360,8 +360,8 @@ github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK github.com/filecoin-project/specs-actors v0.9.14 h1:68PVstg2UB3ZsMLF+DKFTAs/YKsqhKWynkr0IqmVRQY= github.com/filecoin-project/specs-actors v0.9.14/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= 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.5 h1:PbT4tPlSXZ8sRgajhb4D8AOEmiaaZ+jg6tc6BBv8VQc= -github.com/filecoin-project/specs-actors/v2 v2.3.5/go.mod h1:LljnY2Mn2homxZsmokJZCpRuhOPxfXhvcek5gWkmqAc= +github.com/filecoin-project/specs-actors/v2 v2.3.6-0.20211214163252-3d83739fdba5 h1:c6x5kA+6r4lp+44ZSciQJTR+cJ6Ggx9I3m4lIUHCKfU= +github.com/filecoin-project/specs-actors/v2 v2.3.6-0.20211214163252-3d83739fdba5/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.1 h1:BE8fsns1GnEOxt1DTE5LxBK2FThXtWmCChgcJoHTg0E= github.com/filecoin-project/specs-actors/v3 v3.1.1/go.mod h1:mpynccOLlIRy0QnR008BwYBwT9fen+sPR13MA1VmMww= From e1634128c17d0ef4cfd9ff18e4bbbde2c96a9bb9 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 14 Dec 2021 18:48:17 +0200 Subject: [PATCH 099/393] fix paychmgr test --- paychmgr/paych_test.go | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/paychmgr/paych_test.go b/paychmgr/paych_test.go index ab04ad7e0ea..12499972154 100644 --- a/paychmgr/paych_test.go +++ b/paychmgr/paych_test.go @@ -353,16 +353,16 @@ func TestAddVoucherNextLane(t *testing.T) { _, err := s.mgr.AddVoucherOutbound(ctx, s.ch, sv, nil, minDelta) require.NoError(t, err) - ci, err := s.mgr.GetChannelInfo(s.ch) + ci, err := s.mgr.GetChannelInfo(ctx, s.ch) require.NoError(t, err) require.EqualValues(t, ci.NextLane, 3) // Allocate a lane (should be lane 3) - lane, err := s.mgr.AllocateLane(s.ch) + lane, err := s.mgr.AllocateLane(ctx, s.ch) require.NoError(t, err) require.EqualValues(t, lane, 3) - ci, err = s.mgr.GetChannelInfo(s.ch) + ci, err = s.mgr.GetChannelInfo(ctx, s.ch) require.NoError(t, err) require.EqualValues(t, ci.NextLane, 4) @@ -372,7 +372,7 @@ func TestAddVoucherNextLane(t *testing.T) { _, err = s.mgr.AddVoucherOutbound(ctx, s.ch, sv, nil, minDelta) require.NoError(t, err) - ci, err = s.mgr.GetChannelInfo(s.ch) + ci, err = s.mgr.GetChannelInfo(ctx, s.ch) require.NoError(t, err) require.EqualValues(t, ci.NextLane, 4) @@ -382,22 +382,24 @@ func TestAddVoucherNextLane(t *testing.T) { _, err = s.mgr.AddVoucherOutbound(ctx, s.ch, sv, nil, minDelta) require.NoError(t, err) - ci, err = s.mgr.GetChannelInfo(s.ch) + ci, err = s.mgr.GetChannelInfo(ctx, s.ch) require.NoError(t, err) require.EqualValues(t, ci.NextLane, 8) } func TestAllocateLane(t *testing.T) { + ctx := context.Background() + // Set up a manager with a single payment channel s := testSetupMgrWithChannel(t) // First lane should be 0 - lane, err := s.mgr.AllocateLane(s.ch) + lane, err := s.mgr.AllocateLane(ctx, s.ch) require.NoError(t, err) require.EqualValues(t, lane, 0) // Next lane should be 1 - lane, err = s.mgr.AllocateLane(s.ch) + lane, err = s.mgr.AllocateLane(ctx, s.ch) require.NoError(t, err) require.EqualValues(t, lane, 1) } @@ -446,7 +448,7 @@ func TestAllocateLaneWithExistingLaneState(t *testing.T) { require.NoError(t, err) // Allocate lane should return the next lane (lane 3) - lane, err := mgr.AllocateLane(ch) + lane, err := mgr.AllocateLane(ctx, ch) require.NoError(t, err) require.EqualValues(t, 3, lane) } From f00698aafd23394bb7436c31f90ddfd97028791c Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 14 Dec 2021 19:01:45 +0200 Subject: [PATCH 100/393] fix more paychmgr tests --- paychmgr/paych_test.go | 2 +- paychmgr/paychget_test.go | 48 +++++++++++++++++++-------------------- paychmgr/settle_test.go | 2 +- paychmgr/store_test.go | 23 +++++++++++-------- 4 files changed, 39 insertions(+), 36 deletions(-) diff --git a/paychmgr/paych_test.go b/paychmgr/paych_test.go index 12499972154..165c945b8cb 100644 --- a/paychmgr/paych_test.go +++ b/paychmgr/paych_test.go @@ -748,7 +748,7 @@ func testSetupMgrWithChannel(t *testing.T) *testScaffold { Target: toAcct, Direction: DirOutbound, } - err = mgr.store.putChannelInfo(ci) + err = mgr.store.putChannelInfo(context.Background(), ci) require.NoError(t, err) // Add the from signing key to the wallet diff --git a/paychmgr/paychget_test.go b/paychmgr/paychget_test.go index e6b94db57ca..2aacaf6c287 100644 --- a/paychmgr/paychget_test.go +++ b/paychmgr/paychget_test.go @@ -87,7 +87,7 @@ func TestPaychGetCreateChannelThenAddFunds(t *testing.T) { require.NoError(t, err) // Should have no channels yet (message sent but channel not created) - cis, err := mgr.ListChannels() + cis, err := mgr.ListChannels(ctx) require.NoError(t, err) require.Len(t, cis, 0) @@ -112,7 +112,7 @@ func TestPaychGetCreateChannelThenAddFunds(t *testing.T) { require.NotEqual(t, createMsgCid, addFundsMsgCid) // Should have one channel, whose address is the channel that was created - cis, err := mgr.ListChannels() + cis, err := mgr.ListChannels(ctx) require.NoError(t, err) require.Len(t, cis, 1) require.Equal(t, ch, cis[0]) @@ -121,7 +121,7 @@ func TestPaychGetCreateChannelThenAddFunds(t *testing.T) { // channel). // PendingAmount should be amount sent in second GetPaych // (second GetPaych triggered add funds, which has not yet been confirmed) - ci, err := mgr.GetChannelInfo(ch) + ci, err := mgr.GetChannelInfo(ctx, ch) require.NoError(t, err) require.EqualValues(t, 10, ci.Amount.Int64()) require.EqualValues(t, 5, ci.PendingAmount.Int64()) @@ -135,13 +135,13 @@ func TestPaychGetCreateChannelThenAddFunds(t *testing.T) { require.NoError(t, err) // Should still have one channel - cis, err = mgr.ListChannels() + cis, err = mgr.ListChannels(ctx) require.NoError(t, err) require.Len(t, cis, 1) require.Equal(t, ch, cis[0]) // Channel amount should include last amount sent to GetPaych - ci, err = mgr.GetChannelInfo(ch) + ci, err = mgr.GetChannelInfo(ctx, ch) require.NoError(t, err) require.EqualValues(t, 15, ci.Amount.Int64()) require.EqualValues(t, 0, ci.PendingAmount.Int64()) @@ -203,12 +203,12 @@ func TestPaychGetCreateChannelWithErrorThenCreateAgain(t *testing.T) { require.NoError(t, err) // Should have one channel, whose address is the channel that was created - cis, err := mgr.ListChannels() + cis, err := mgr.ListChannels(ctx) require.NoError(t, err) require.Len(t, cis, 1) require.Equal(t, ch, cis[0]) - ci, err := mgr.GetChannelInfo(ch) + ci, err := mgr.GetChannelInfo(ctx, ch) require.NoError(t, err) require.Equal(t, amt2, ci.Amount) }() @@ -259,12 +259,12 @@ func TestPaychGetRecoverAfterError(t *testing.T) { require.NoError(t, err) // Should have one channel, whose address is the channel that was created - cis, err := mgr.ListChannels() + cis, err := mgr.ListChannels(ctx) require.NoError(t, err) require.Len(t, cis, 1) require.Equal(t, ch, cis[0]) - ci, err := mgr.GetChannelInfo(ch) + ci, err := mgr.GetChannelInfo(ctx, ch) require.NoError(t, err) require.Equal(t, amt2, ci.Amount) require.EqualValues(t, 0, ci.PendingAmount.Int64()) @@ -311,12 +311,12 @@ func TestPaychGetRecoverAfterAddFundsError(t *testing.T) { require.Error(t, err) // Should have one channel, whose address is the channel that was created - cis, err := mgr.ListChannels() + cis, err := mgr.ListChannels(ctx) require.NoError(t, err) require.Len(t, cis, 1) require.Equal(t, ch, cis[0]) - ci, err := mgr.GetChannelInfo(ch) + ci, err := mgr.GetChannelInfo(ctx, ch) require.NoError(t, err) require.Equal(t, amt, ci.Amount) require.EqualValues(t, 0, ci.PendingAmount.Int64()) @@ -338,13 +338,13 @@ func TestPaychGetRecoverAfterAddFundsError(t *testing.T) { require.NoError(t, err) // Should have one channel, whose address is the channel that was created - cis, err = mgr.ListChannels() + cis, err = mgr.ListChannels(ctx) require.NoError(t, err) require.Len(t, cis, 1) require.Equal(t, ch, cis[0]) // Amount should include amount for successful add funds msg - ci, err = mgr.GetChannelInfo(ch) + ci, err = mgr.GetChannelInfo(ctx, ch) require.NoError(t, err) require.Equal(t, amt.Int64()+amt3.Int64(), ci.Amount.Int64()) require.EqualValues(t, 0, ci.PendingAmount.Int64()) @@ -384,7 +384,7 @@ func TestPaychGetRestartAfterCreateChannelMsg(t *testing.T) { require.NoError(t, err) // Should have no channels yet (message sent but channel not created) - cis, err := mgr2.ListChannels() + cis, err := mgr2.ListChannels(ctx) require.NoError(t, err) require.Len(t, cis, 0) @@ -409,7 +409,7 @@ func TestPaychGetRestartAfterCreateChannelMsg(t *testing.T) { require.NotEqual(t, createMsgCid, addFundsMsgCid) // Should have one channel, whose address is the channel that was created - cis, err := mgr2.ListChannels() + cis, err := mgr2.ListChannels(ctx) require.NoError(t, err) require.Len(t, cis, 1) require.Equal(t, ch, cis[0]) @@ -418,7 +418,7 @@ func TestPaychGetRestartAfterCreateChannelMsg(t *testing.T) { // channel). // PendingAmount should be amount sent in second GetPaych // (second GetPaych triggered add funds, which has not yet been confirmed) - ci, err := mgr2.GetChannelInfo(ch) + ci, err := mgr2.GetChannelInfo(ctx, ch) require.NoError(t, err) require.EqualValues(t, 10, ci.Amount.Int64()) require.EqualValues(t, 5, ci.PendingAmount.Int64()) @@ -481,13 +481,13 @@ func TestPaychGetRestartAfterAddFundsMsg(t *testing.T) { require.NoError(t, err) // Should have one channel, whose address is the channel that was created - cis, err := mgr2.ListChannels() + cis, err := mgr2.ListChannels(ctx) require.NoError(t, err) require.Len(t, cis, 1) require.Equal(t, ch, cis[0]) // Amount should include amount for successful add funds msg - ci, err := mgr2.GetChannelInfo(ch) + ci, err := mgr2.GetChannelInfo(ctx, ch) require.NoError(t, err) require.Equal(t, amt.Int64()+amt2.Int64(), ci.Amount.Int64()) require.EqualValues(t, 0, ci.PendingAmount.Int64()) @@ -917,7 +917,7 @@ func TestPaychAvailableFunds(t *testing.T) { require.NoError(t, err) // No channel created yet so available funds should be all zeroes - av, err := mgr.AvailableFundsByFromTo(from, to) + av, err := mgr.AvailableFundsByFromTo(ctx, from, to) require.NoError(t, err) require.Nil(t, av.Channel) require.Nil(t, av.PendingWaitSentinel) @@ -932,7 +932,7 @@ func TestPaychAvailableFunds(t *testing.T) { require.NoError(t, err) // Available funds should reflect create channel message sent - av, err = mgr.AvailableFundsByFromTo(from, to) + av, err = mgr.AvailableFundsByFromTo(ctx, from, to) require.NoError(t, err) require.Nil(t, av.Channel) require.EqualValues(t, 0, av.ConfirmedAmt.Int64()) @@ -961,7 +961,7 @@ func TestPaychAvailableFunds(t *testing.T) { waitForQueueSize(t, mgr, from, to, 1) // Available funds should now include queued funds - av, err = mgr.AvailableFundsByFromTo(from, to) + av, err = mgr.AvailableFundsByFromTo(ctx, from, to) require.NoError(t, err) require.Nil(t, av.Channel) require.NotNil(t, av.PendingWaitSentinel) @@ -996,7 +996,7 @@ func TestPaychAvailableFunds(t *testing.T) { // Available funds should now include the channel and also a wait sentinel // for the add funds message - av, err = mgr.AvailableFunds(ch) + av, err = mgr.AvailableFunds(ctx, ch) require.NoError(t, err) require.NotNil(t, av.Channel) require.NotNil(t, av.PendingWaitSentinel) @@ -1018,7 +1018,7 @@ func TestPaychAvailableFunds(t *testing.T) { require.NoError(t, err) // Available funds should no longer have a wait sentinel - av, err = mgr.AvailableFunds(ch) + av, err = mgr.AvailableFunds(ctx, ch) require.NoError(t, err) require.NotNil(t, av.Channel) require.Nil(t, av.PendingWaitSentinel) @@ -1039,7 +1039,7 @@ func TestPaychAvailableFunds(t *testing.T) { _, err = mgr.AddVoucherOutbound(ctx, ch, voucher, nil, types.NewInt(0)) require.NoError(t, err) - av, err = mgr.AvailableFunds(ch) + av, err = mgr.AvailableFunds(ctx, ch) require.NoError(t, err) require.NotNil(t, av.Channel) require.Nil(t, av.PendingWaitSentinel) diff --git a/paychmgr/settle_test.go b/paychmgr/settle_test.go index f17f961e20f..43a0062000b 100644 --- a/paychmgr/settle_test.go +++ b/paychmgr/settle_test.go @@ -63,7 +63,7 @@ func TestPaychSettle(t *testing.T) { require.NotEqual(t, ch, ch2) // There should now be two channels - cis, err := mgr.ListChannels() + cis, err := mgr.ListChannels(ctx) require.NoError(t, err) require.Len(t, cis, 2) } diff --git a/paychmgr/store_test.go b/paychmgr/store_test.go index 1ec8895fa07..563b82978fc 100644 --- a/paychmgr/store_test.go +++ b/paychmgr/store_test.go @@ -1,6 +1,7 @@ package paychmgr import ( + "context" "testing" "github.com/filecoin-project/go-address" @@ -12,8 +13,10 @@ import ( ) func TestStore(t *testing.T) { + ctx := context.Background() + store := NewStore(ds_sync.MutexWrap(ds.NewMapDatastore())) - addrs, err := store.ListChannels() + addrs, err := store.ListChannels(ctx) require.NoError(t, err) require.Len(t, addrs, 0) @@ -38,19 +41,19 @@ func TestStore(t *testing.T) { } // Track the channel - _, err = store.TrackChannel(ci) + _, err = store.TrackChannel(ctx, ci) require.NoError(t, err) // Tracking same channel again should error - _, err = store.TrackChannel(ci) + _, err = store.TrackChannel(ctx, ci) require.Error(t, err) // Track another channel - _, err = store.TrackChannel(ci2) + _, err = store.TrackChannel(ctx, ci2) require.NoError(t, err) // List channels should include all channels - addrs, err = store.ListChannels() + addrs, err = store.ListChannels(ctx) require.NoError(t, err) require.Len(t, addrs, 2) t0100, err := address.NewIDAddress(100) @@ -61,25 +64,25 @@ func TestStore(t *testing.T) { require.Contains(t, addrs, t0200) // Request vouchers for channel - vouchers, err := store.VouchersForPaych(*ci.Channel) + vouchers, err := store.VouchersForPaych(ctx, *ci.Channel) require.NoError(t, err) require.Len(t, vouchers, 1) // Requesting voucher for non-existent channel should error - _, err = store.VouchersForPaych(tutils.NewIDAddr(t, 300)) + _, err = store.VouchersForPaych(ctx, tutils.NewIDAddr(t, 300)) require.Equal(t, err, ErrChannelNotTracked) // Allocate lane for channel - lane, err := store.AllocateLane(*ci.Channel) + lane, err := store.AllocateLane(ctx, *ci.Channel) require.NoError(t, err) require.Equal(t, lane, uint64(0)) // Allocate next lane for channel - lane, err = store.AllocateLane(*ci.Channel) + lane, err = store.AllocateLane(ctx, *ci.Channel) require.NoError(t, err) require.Equal(t, lane, uint64(1)) // Allocate next lane for non-existent channel should error - _, err = store.AllocateLane(tutils.NewIDAddr(t, 300)) + _, err = store.AllocateLane(ctx, tutils.NewIDAddr(t, 300)) require.Equal(t, err, ErrChannelNotTracked) } From aac6d88f7294b09ba108eb98b1873e75aec3955f Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 14 Dec 2021 12:49:18 -0500 Subject: [PATCH 101/393] Deps: Update actors v2 to v2.3.6 --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index eda9bffd849..427542cd1c7 100644 --- a/go.mod +++ b/go.mod @@ -45,7 +45,7 @@ require ( github.com/filecoin-project/go-statestore v0.2.0 github.com/filecoin-project/go-storedcounter v0.0.0-20211210031312-d066d7aa2f77 github.com/filecoin-project/specs-actors v0.9.14 - github.com/filecoin-project/specs-actors/v2 v2.3.6-0.20211214163252-3d83739fdba5 + github.com/filecoin-project/specs-actors/v2 v2.3.6 github.com/filecoin-project/specs-actors/v3 v3.1.1 github.com/filecoin-project/specs-actors/v4 v4.0.1 github.com/filecoin-project/specs-actors/v5 v5.0.4 diff --git a/go.sum b/go.sum index d3ce7212104..ea6449fddf7 100644 --- a/go.sum +++ b/go.sum @@ -360,8 +360,8 @@ github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK github.com/filecoin-project/specs-actors v0.9.14 h1:68PVstg2UB3ZsMLF+DKFTAs/YKsqhKWynkr0IqmVRQY= github.com/filecoin-project/specs-actors v0.9.14/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= 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-0.20211214163252-3d83739fdba5 h1:c6x5kA+6r4lp+44ZSciQJTR+cJ6Ggx9I3m4lIUHCKfU= -github.com/filecoin-project/specs-actors/v2 v2.3.6-0.20211214163252-3d83739fdba5/go.mod h1:DJMpxVRXvev9t8P0XWA26RmTzN+MHiL9IlItVLT0zUc= +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.1 h1:BE8fsns1GnEOxt1DTE5LxBK2FThXtWmCChgcJoHTg0E= github.com/filecoin-project/specs-actors/v3 v3.1.1/go.mod h1:mpynccOLlIRy0QnR008BwYBwT9fen+sPR13MA1VmMww= From 5bc4ee257f1e8fa4787094c944664fd8da4848a0 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 14 Dec 2021 16:33:38 -0500 Subject: [PATCH 102/393] Deps: Update go-ds-badger2 to v0.1.2 --- go.mod | 2 +- go.sum | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 427542cd1c7..1e2a29c43fe 100644 --- a/go.mod +++ b/go.mod @@ -73,7 +73,7 @@ require ( github.com/ipfs/go-cid v0.1.0 github.com/ipfs/go-cidutil v0.0.2 github.com/ipfs/go-datastore v0.5.1 - github.com/ipfs/go-ds-badger2 v0.1.2-0.20211203191834-bc6df5c2417c + github.com/ipfs/go-ds-badger2 v0.1.2 github.com/ipfs/go-ds-leveldb v0.5.0 github.com/ipfs/go-ds-measure v0.2.0 github.com/ipfs/go-fs-lock v0.0.6 diff --git a/go.sum b/go.sum index ea6449fddf7..705c9ea939b 100644 --- a/go.sum +++ b/go.sum @@ -695,8 +695,9 @@ github.com/ipfs/go-ds-badger v0.2.3/go.mod h1:pEYw0rgg3FIrywKKnL+Snr+w/LjJZVMTBR github.com/ipfs/go-ds-badger v0.2.7/go.mod h1:02rnztVKA4aZwDuaRPTf8mpqcKmXP7mLl6JPxd14JHA= github.com/ipfs/go-ds-badger v0.3.0 h1:xREL3V0EH9S219kFFueOYJJTcjgNSZ2HY1iSvN7U1Ro= github.com/ipfs/go-ds-badger v0.3.0/go.mod h1:1ke6mXNqeV8K3y5Ak2bAA0osoTfmxUdupVCGm4QUIek= -github.com/ipfs/go-ds-badger2 v0.1.2-0.20211203191834-bc6df5c2417c h1:hQ/+EqbntANC9WOnloM/JCAjnMn4iEOYiJ6/H+iq84o= github.com/ipfs/go-ds-badger2 v0.1.2-0.20211203191834-bc6df5c2417c/go.mod h1:wD65qQCjB35uNOHaaha+tudGVWegJ7dFuFKY+3iJKjk= +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-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= From 46d8ae47dcf9ee7105a4c3146f93e764c5075ec2 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 14 Dec 2021 16:41:34 -0500 Subject: [PATCH 103/393] Deps: Update go-ipld-prime to v0.14.3 --- go.mod | 2 +- go.sum | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 1e2a29c43fe..7edadf16af4 100644 --- a/go.mod +++ b/go.mod @@ -100,7 +100,7 @@ require ( github.com/ipld/go-car v0.3.3-0.20211210032800-e6f244225a16 github.com/ipld/go-car/v2 v2.1.1-0.20211211000942-be2525f6bf2d github.com/ipld/go-codec-dagpb v1.3.0 - github.com/ipld/go-ipld-prime v0.14.3-0.20211207234443-319145880958 + github.com/ipld/go-ipld-prime v0.14.3 github.com/ipld/go-ipld-selector-text-lite v0.0.1 github.com/jonboulle/clockwork v0.2.2 // indirect github.com/kelseyhightower/envconfig v1.4.0 diff --git a/go.sum b/go.sum index 705c9ea939b..6be764f4bbd 100644 --- a/go.sum +++ b/go.sum @@ -840,8 +840,9 @@ github.com/ipld/go-ipld-prime v0.10.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/ 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.3-0.20211207234443-319145880958 h1:olscE5Sv+ts+N9YLQsIL9k6eS6y6CXMGRl5RCr2Cn/E= github.com/ipld/go-ipld-prime v0.14.3-0.20211207234443-319145880958/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= +github.com/ipld/go-ipld-prime v0.14.3 h1:cGUmxSws2IHurn00/iLMDapeXsnf9+FyAtYVy8G/JsQ= +github.com/ipld/go-ipld-prime v0.14.3/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= github.com/ipld/go-ipld-prime-proto v0.0.0-20191113031812-e32bd156a1e5/go.mod h1:gcvzoEDBjwycpXt3LBE061wT9f46szXGHAmj9uoP6fU= github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20211210234204-ce2a1c70cd73 h1:TsyATB2ZRRQGTwafJdgEUQkmjOExRV0DNokcihZxbnQ= github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20211210234204-ce2a1c70cd73/go.mod h1:2PJ0JgxyB08t0b2WKrcuqI3di0V+5n6RS/LTUJhkoxY= From 3f703ff8a421facfcc4910ed0fad59de1b4e642c Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 14 Dec 2021 16:54:22 -0500 Subject: [PATCH 104/393] Deps: Update go-car/v2 to v2.1.1 --- go.mod | 2 +- go.sum | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 7edadf16af4..242dab41d46 100644 --- a/go.mod +++ b/go.mod @@ -98,7 +98,7 @@ require ( github.com/ipfs/go-unixfs v0.2.6 github.com/ipfs/interface-go-ipfs-core v0.4.0 github.com/ipld/go-car v0.3.3-0.20211210032800-e6f244225a16 - github.com/ipld/go-car/v2 v2.1.1-0.20211211000942-be2525f6bf2d + github.com/ipld/go-car/v2 v2.1.1 github.com/ipld/go-codec-dagpb v1.3.0 github.com/ipld/go-ipld-prime v0.14.3 github.com/ipld/go-ipld-selector-text-lite v0.0.1 diff --git a/go.sum b/go.sum index 6be764f4bbd..ffaeca2f4f4 100644 --- a/go.sum +++ b/go.sum @@ -828,8 +828,9 @@ github.com/ipfs/iptb-plugins v0.3.0/go.mod h1:5QtOvckeIw4bY86gSH4fgh3p3gCSMn3FmI github.com/ipld/go-car v0.1.0/go.mod h1:RCWzaUh2i4mOEkB3W45Vc+9jnS/M6Qay5ooytiBHl3g= github.com/ipld/go-car v0.3.3-0.20211210032800-e6f244225a16 h1:y6CW3GCY5Nm86/9vwphaghTTmOvEtfJjBOAzAIy3/Mk= github.com/ipld/go-car v0.3.3-0.20211210032800-e6f244225a16/go.mod h1:/wkKF4908ULT4dFIFIUZYcfjAnj+KFnJvlh8Hsz1FbQ= -github.com/ipld/go-car/v2 v2.1.1-0.20211211000942-be2525f6bf2d h1:yrjb9jdAj3Lkxgp8af5G3g4Yv4PwWac3+sikmJVF0fA= github.com/ipld/go-car/v2 v2.1.1-0.20211211000942-be2525f6bf2d/go.mod h1:+2Yvf0Z3wzkv7NeI69i8tuZ+ft7jyjPYIWZzeVNeFcI= +github.com/ipld/go-car/v2 v2.1.1 h1:saaKz4nC0AdfCGHLYKeXLGn8ivoPC54fyS55uyOLKwA= +github.com/ipld/go-car/v2 v2.1.1/go.mod h1:+2Yvf0Z3wzkv7NeI69i8tuZ+ft7jyjPYIWZzeVNeFcI= github.com/ipld/go-codec-dagpb v1.2.0/go.mod h1:6nBN7X7h8EOsEejZGqC7tej5drsdBAXbMHyBT+Fne5s= github.com/ipld/go-codec-dagpb v1.3.0 h1:czTcaoAuNNyIYWs6Qe01DJ+sEX7B+1Z0LcXjSatMGe8= github.com/ipld/go-codec-dagpb v1.3.0/go.mod h1:ga4JTU3abYApDC3pZ00BC2RSvC3qfBb9MSJkMLSwnhA= From 69495f5b59d284fea021d99aabaec0db198e6463 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 14 Dec 2021 17:50:18 -0500 Subject: [PATCH 105/393] Deps: Update dagstore to v0.4.4 --- go.mod | 2 +- go.sum | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 242dab41d46..90423049e4c 100644 --- a/go.mod +++ b/go.mod @@ -26,7 +26,7 @@ require ( github.com/elastic/gosigar v0.14.1 github.com/etclabscore/go-openrpc-reflect v0.0.36 github.com/fatih/color v1.13.0 - github.com/filecoin-project/dagstore v0.4.3-0.20211211192320-72b849e131d2 + github.com/filecoin-project/dagstore v0.4.4 github.com/filecoin-project/filecoin-ffi v0.30.4-0.20200910194244-f640612a1a1f github.com/filecoin-project/go-address v0.0.6 github.com/filecoin-project/go-bitfield v0.2.4 diff --git a/go.sum b/go.sum index ffaeca2f4f4..509a966eeda 100644 --- a/go.sum +++ b/go.sum @@ -288,8 +288,9 @@ github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL 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/filecoin-project/dagstore v0.4.3-0.20211211192320-72b849e131d2 h1:dWh+o7gzavw1JUlsTqBj2/87r1Z6fbPZuZS43UiIW60= github.com/filecoin-project/dagstore v0.4.3-0.20211211192320-72b849e131d2/go.mod h1:tlV8C11UljvFq3WWlMh2oMViEaVaPb6uT8eL/YQgDfk= +github.com/filecoin-project/dagstore v0.4.4 h1:luolWahhzp3ulRsapGKE7raoLE3n2cFkQUJjPyqUmF4= +github.com/filecoin-project/dagstore v0.4.4/go.mod h1:7BlOvaTJrFJ1Qemt5jHlLJ4VhDIuSIzGS0IwO/0AXPA= github.com/filecoin-project/go-address v0.0.3/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= github.com/filecoin-project/go-address v0.0.5/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= github.com/filecoin-project/go-address v0.0.6 h1:DWQtj38ax+ogHwyH3VULRIoT8E6loyXqsk/p81xoY7M= From bcd2c71031c0b1975c768603fd128cb2bfd12324 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 14 Dec 2021 17:51:49 -0500 Subject: [PATCH 106/393] Deps: Update go-storedcounter to v0.1.0 --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 90423049e4c..9c864a0d32c 100644 --- a/go.mod +++ b/go.mod @@ -43,7 +43,7 @@ require ( github.com/filecoin-project/go-state-types v0.1.1 github.com/filecoin-project/go-statemachine v1.0.1 github.com/filecoin-project/go-statestore v0.2.0 - github.com/filecoin-project/go-storedcounter v0.0.0-20211210031312-d066d7aa2f77 + github.com/filecoin-project/go-storedcounter v0.1.0 github.com/filecoin-project/specs-actors v0.9.14 github.com/filecoin-project/specs-actors/v2 v2.3.6 github.com/filecoin-project/specs-actors/v3 v3.1.1 diff --git a/go.sum b/go.sum index 509a966eeda..0d994b5c5e5 100644 --- a/go.sum +++ b/go.sum @@ -354,8 +354,8 @@ github.com/filecoin-project/go-statemachine v1.0.1/go.mod h1:jZdXXiHa61n4NmgWFG4 github.com/filecoin-project/go-statestore v0.1.0/go.mod h1:LFc9hD+fRxPqiHiaqUEZOinUJB4WARkRfNl10O7kTnI= github.com/filecoin-project/go-statestore v0.2.0 h1:cRRO0aPLrxKQCZ2UOQbzFGn4WDNdofHZoGPjfNaAo5Q= github.com/filecoin-project/go-statestore v0.2.0/go.mod h1:8sjBYbS35HwPzct7iT4lIXjLlYyPor80aU7t7a/Kspo= -github.com/filecoin-project/go-storedcounter v0.0.0-20211210031312-d066d7aa2f77 h1:3n7WS0WkJStS1rMbt/o+OvriHIlAuU8JKVG6wB2LqJQ= -github.com/filecoin-project/go-storedcounter v0.0.0-20211210031312-d066d7aa2f77/go.mod h1:4ceukaXi4vFURIoxYMfKzaRF5Xv/Pinh2oTnoxpv+z8= +github.com/filecoin-project/go-storedcounter v0.1.0 h1:Mui6wSUBC+cQGHbDUBcO7rfh5zQkWJM/CpAZa/uOuus= +github.com/filecoin-project/go-storedcounter v0.1.0/go.mod h1:4ceukaXi4vFURIoxYMfKzaRF5Xv/Pinh2oTnoxpv+z8= github.com/filecoin-project/specs-actors v0.9.4/go.mod h1:BStZQzx5x7TmCkLv0Bpa07U6cPKol6fd3w9KjMPZ6Z4= github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors v0.9.14 h1:68PVstg2UB3ZsMLF+DKFTAs/YKsqhKWynkr0IqmVRQY= From 8935c4386c7e79994cd3ced383f377c8c9e7a87b Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 14 Dec 2021 17:53:11 -0500 Subject: [PATCH 107/393] Deps: Update go-ipld-cbor to v0.0.6 --- go.mod | 2 +- go.sum | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 9c864a0d32c..f99b75ebf12 100644 --- a/go.mod +++ b/go.mod @@ -88,7 +88,7 @@ require ( github.com/ipfs/go-ipfs-http-client v0.0.6 github.com/ipfs/go-ipfs-routing v0.2.1 github.com/ipfs/go-ipfs-util v0.0.2 - github.com/ipfs/go-ipld-cbor v0.0.6-0.20211211231443-5d9b9e1f6fa8 + github.com/ipfs/go-ipld-cbor v0.0.6 github.com/ipfs/go-ipld-format v0.2.0 github.com/ipfs/go-log/v2 v2.4.0 github.com/ipfs/go-merkledag v0.5.1 diff --git a/go.sum b/go.sum index 0d994b5c5e5..31b302f24b7 100644 --- a/go.sum +++ b/go.sum @@ -767,8 +767,9 @@ github.com/ipfs/go-ipld-cbor v0.0.2/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA github.com/ipfs/go-ipld-cbor v0.0.3/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= github.com/ipfs/go-ipld-cbor v0.0.4/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= github.com/ipfs/go-ipld-cbor v0.0.5/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= -github.com/ipfs/go-ipld-cbor v0.0.6-0.20211211231443-5d9b9e1f6fa8 h1:Fq+aGXgpnWNULTbgGi+c08MJYnceRXlwP75+3m8mWXU= github.com/ipfs/go-ipld-cbor v0.0.6-0.20211211231443-5d9b9e1f6fa8/go.mod h1:ssdxxaLJPXH7OjF5V4NSjBbcfh+evoR4ukuru0oPXMA= +github.com/ipfs/go-ipld-cbor v0.0.6 h1:pYuWHyvSpIsOOLw4Jy7NbBkCyzLDcl64Bf/LZW7eBQ0= +github.com/ipfs/go-ipld-cbor v0.0.6/go.mod h1:ssdxxaLJPXH7OjF5V4NSjBbcfh+evoR4ukuru0oPXMA= github.com/ipfs/go-ipld-format v0.0.1/go.mod h1:kyJtbkDALmFHv3QR6et67i35QzO3S0dCDnkOJhcZkms= github.com/ipfs/go-ipld-format v0.0.2/go.mod h1:4B6+FM2u9OJ9zCV+kSbgFAZlOrv1Hqbf0INGQgiKf9k= github.com/ipfs/go-ipld-format v0.2.0 h1:xGlJKkArkmBvowr+GMCX0FEZtkro71K1AwiKnL37mwA= From 02b00c025ad3e6c99166b308b70f34917ac78a84 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 14 Dec 2021 17:55:55 -0500 Subject: [PATCH 108/393] Deps: Update go-fil-markets to v1.13.5 --- go.mod | 2 +- go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index f99b75ebf12..214cc9805d8 100644 --- a/go.mod +++ b/go.mod @@ -36,7 +36,7 @@ require ( github.com/filecoin-project/go-data-transfer v1.12.0 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.13.3-0.20211211202606-e111ec29d24d + github.com/filecoin-project/go-fil-markets v1.13.5 github.com/filecoin-project/go-jsonrpc v0.1.5 github.com/filecoin-project/go-padreader v0.0.1 github.com/filecoin-project/go-paramfetch v0.0.2 diff --git a/go.sum b/go.sum index 31b302f24b7..f3b6c84059b 100644 --- a/go.sum +++ b/go.sum @@ -324,6 +324,8 @@ github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 h1:imrrpZWEHRnNqqv0tN7L github.com/filecoin-project/go-fil-commp-hashhash v0.1.0/go.mod h1:73S8WSEWh9vr0fDJVnKADhfIv/d6dCbAGaAGWbdJEI8= github.com/filecoin-project/go-fil-markets v1.13.3-0.20211211202606-e111ec29d24d h1:TkBhjnKRNKrOxnESYqMQRjMbzK/NayYg1oxejxF1cGg= github.com/filecoin-project/go-fil-markets v1.13.3-0.20211211202606-e111ec29d24d/go.mod h1:vXOHH3q2+zLk929W+lIq3etuDFTyJJ8nG2DwGHG2R1E= +github.com/filecoin-project/go-fil-markets v1.13.5 h1:NLeF8rI5ZPOJNYEgA6NHrvnuh5QE/2dwuU/7wPW7zP0= +github.com/filecoin-project/go-fil-markets v1.13.5/go.mod h1:vXOHH3q2+zLk929W+lIq3etuDFTyJJ8nG2DwGHG2R1E= 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= From 7fb590208c1f623d081cd8352daf552c7c7d9972 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 14 Dec 2021 18:05:52 -0500 Subject: [PATCH 109/393] Deps: Update lotus-soup to point to tagged releases --- testplans/lotus-soup/go.mod | 6 +++--- testplans/lotus-soup/go.sum | 30 ++++++++++++++++++------------ 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/testplans/lotus-soup/go.mod b/testplans/lotus-soup/go.mod index 6f32db2cb45..472a38357ec 100644 --- a/testplans/lotus-soup/go.mod +++ b/testplans/lotus-soup/go.mod @@ -9,10 +9,10 @@ require ( github.com/drand/drand v1.2.8-0.20211214135232-3ce1e81cdbcc github.com/filecoin-project/go-address v0.0.6 github.com/filecoin-project/go-data-transfer v1.12.0 - github.com/filecoin-project/go-fil-markets v1.13.3-0.20211211202606-e111ec29d24d + github.com/filecoin-project/go-fil-markets v1.13.5 github.com/filecoin-project/go-jsonrpc v0.1.5 github.com/filecoin-project/go-state-types v0.1.1 - github.com/filecoin-project/go-storedcounter v0.0.0-20211210031312-d066d7aa2f77 + 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.14 github.com/google/uuid v1.3.0 @@ -26,7 +26,7 @@ require ( github.com/ipfs/go-log/v2 v2.4.0 github.com/ipfs/go-merkledag v0.5.1 github.com/ipfs/go-unixfs v0.2.6 - github.com/ipld/go-car v0.3.3-0.20211210032800-e6f244225a16 + github.com/ipld/go-car v0.3.3 github.com/kpacha/opencensus-influxdb v0.0.0-20181102202715-663e2683a27c github.com/libp2p/go-libp2p v0.17.0 github.com/libp2p/go-libp2p-core v0.13.0 diff --git a/testplans/lotus-soup/go.sum b/testplans/lotus-soup/go.sum index 10b522a18fc..905c9d924e2 100644 --- a/testplans/lotus-soup/go.sum +++ b/testplans/lotus-soup/go.sum @@ -379,8 +379,9 @@ github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL 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/filecoin-project/dagstore v0.4.3-0.20211211192320-72b849e131d2 h1:dWh+o7gzavw1JUlsTqBj2/87r1Z6fbPZuZS43UiIW60= github.com/filecoin-project/dagstore v0.4.3-0.20211211192320-72b849e131d2/go.mod h1:tlV8C11UljvFq3WWlMh2oMViEaVaPb6uT8eL/YQgDfk= +github.com/filecoin-project/dagstore v0.4.4 h1:luolWahhzp3ulRsapGKE7raoLE3n2cFkQUJjPyqUmF4= +github.com/filecoin-project/dagstore v0.4.4/go.mod h1:7BlOvaTJrFJ1Qemt5jHlLJ4VhDIuSIzGS0IwO/0AXPA= github.com/filecoin-project/go-address v0.0.3/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= github.com/filecoin-project/go-address v0.0.5/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= github.com/filecoin-project/go-address v0.0.6 h1:DWQtj38ax+ogHwyH3VULRIoT8E6loyXqsk/p81xoY7M= @@ -412,8 +413,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.13.3-0.20211211202606-e111ec29d24d h1:TkBhjnKRNKrOxnESYqMQRjMbzK/NayYg1oxejxF1cGg= -github.com/filecoin-project/go-fil-markets v1.13.3-0.20211211202606-e111ec29d24d/go.mod h1:vXOHH3q2+zLk929W+lIq3etuDFTyJJ8nG2DwGHG2R1E= +github.com/filecoin-project/go-fil-markets v1.13.5 h1:NLeF8rI5ZPOJNYEgA6NHrvnuh5QE/2dwuU/7wPW7zP0= +github.com/filecoin-project/go-fil-markets v1.13.5/go.mod h1:vXOHH3q2+zLk929W+lIq3etuDFTyJJ8nG2DwGHG2R1E= 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= @@ -444,15 +445,15 @@ github.com/filecoin-project/go-statemachine v1.0.1/go.mod h1:jZdXXiHa61n4NmgWFG4 github.com/filecoin-project/go-statestore v0.1.0/go.mod h1:LFc9hD+fRxPqiHiaqUEZOinUJB4WARkRfNl10O7kTnI= github.com/filecoin-project/go-statestore v0.2.0 h1:cRRO0aPLrxKQCZ2UOQbzFGn4WDNdofHZoGPjfNaAo5Q= github.com/filecoin-project/go-statestore v0.2.0/go.mod h1:8sjBYbS35HwPzct7iT4lIXjLlYyPor80aU7t7a/Kspo= -github.com/filecoin-project/go-storedcounter v0.0.0-20211210031312-d066d7aa2f77 h1:3n7WS0WkJStS1rMbt/o+OvriHIlAuU8JKVG6wB2LqJQ= -github.com/filecoin-project/go-storedcounter v0.0.0-20211210031312-d066d7aa2f77/go.mod h1:4ceukaXi4vFURIoxYMfKzaRF5Xv/Pinh2oTnoxpv+z8= +github.com/filecoin-project/go-storedcounter v0.1.0 h1:Mui6wSUBC+cQGHbDUBcO7rfh5zQkWJM/CpAZa/uOuus= +github.com/filecoin-project/go-storedcounter v0.1.0/go.mod h1:4ceukaXi4vFURIoxYMfKzaRF5Xv/Pinh2oTnoxpv+z8= github.com/filecoin-project/specs-actors v0.9.4/go.mod h1:BStZQzx5x7TmCkLv0Bpa07U6cPKol6fd3w9KjMPZ6Z4= github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors v0.9.14 h1:68PVstg2UB3ZsMLF+DKFTAs/YKsqhKWynkr0IqmVRQY= github.com/filecoin-project/specs-actors v0.9.14/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= 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.5 h1:PbT4tPlSXZ8sRgajhb4D8AOEmiaaZ+jg6tc6BBv8VQc= -github.com/filecoin-project/specs-actors/v2 v2.3.5/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.1 h1:BE8fsns1GnEOxt1DTE5LxBK2FThXtWmCChgcJoHTg0E= github.com/filecoin-project/specs-actors/v3 v3.1.1/go.mod h1:mpynccOLlIRy0QnR008BwYBwT9fen+sPR13MA1VmMww= @@ -916,8 +917,9 @@ github.com/ipfs/go-ds-badger v0.2.3/go.mod h1:pEYw0rgg3FIrywKKnL+Snr+w/LjJZVMTBR github.com/ipfs/go-ds-badger v0.2.7/go.mod h1:02rnztVKA4aZwDuaRPTf8mpqcKmXP7mLl6JPxd14JHA= github.com/ipfs/go-ds-badger v0.3.0 h1:xREL3V0EH9S219kFFueOYJJTcjgNSZ2HY1iSvN7U1Ro= github.com/ipfs/go-ds-badger v0.3.0/go.mod h1:1ke6mXNqeV8K3y5Ak2bAA0osoTfmxUdupVCGm4QUIek= -github.com/ipfs/go-ds-badger2 v0.1.2-0.20211203191834-bc6df5c2417c h1:hQ/+EqbntANC9WOnloM/JCAjnMn4iEOYiJ6/H+iq84o= github.com/ipfs/go-ds-badger2 v0.1.2-0.20211203191834-bc6df5c2417c/go.mod h1:wD65qQCjB35uNOHaaha+tudGVWegJ7dFuFKY+3iJKjk= +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-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= @@ -986,8 +988,9 @@ github.com/ipfs/go-ipld-cbor v0.0.2/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA github.com/ipfs/go-ipld-cbor v0.0.3/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= github.com/ipfs/go-ipld-cbor v0.0.4/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= github.com/ipfs/go-ipld-cbor v0.0.5/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= -github.com/ipfs/go-ipld-cbor v0.0.6-0.20211211231443-5d9b9e1f6fa8 h1:Fq+aGXgpnWNULTbgGi+c08MJYnceRXlwP75+3m8mWXU= github.com/ipfs/go-ipld-cbor v0.0.6-0.20211211231443-5d9b9e1f6fa8/go.mod h1:ssdxxaLJPXH7OjF5V4NSjBbcfh+evoR4ukuru0oPXMA= +github.com/ipfs/go-ipld-cbor v0.0.6 h1:pYuWHyvSpIsOOLw4Jy7NbBkCyzLDcl64Bf/LZW7eBQ0= +github.com/ipfs/go-ipld-cbor v0.0.6/go.mod h1:ssdxxaLJPXH7OjF5V4NSjBbcfh+evoR4ukuru0oPXMA= github.com/ipfs/go-ipld-format v0.0.1/go.mod h1:kyJtbkDALmFHv3QR6et67i35QzO3S0dCDnkOJhcZkms= github.com/ipfs/go-ipld-format v0.0.2/go.mod h1:4B6+FM2u9OJ9zCV+kSbgFAZlOrv1Hqbf0INGQgiKf9k= github.com/ipfs/go-ipld-format v0.2.0 h1:xGlJKkArkmBvowr+GMCX0FEZtkro71K1AwiKnL37mwA= @@ -1045,10 +1048,12 @@ github.com/ipfs/iptb v1.4.0/go.mod h1:1rzHpCYtNp87/+hTxG5TfCVn/yMY3dKnLn8tBiMfdm 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/ipld/go-car v0.1.0/go.mod h1:RCWzaUh2i4mOEkB3W45Vc+9jnS/M6Qay5ooytiBHl3g= -github.com/ipld/go-car v0.3.3-0.20211210032800-e6f244225a16 h1:y6CW3GCY5Nm86/9vwphaghTTmOvEtfJjBOAzAIy3/Mk= github.com/ipld/go-car v0.3.3-0.20211210032800-e6f244225a16/go.mod h1:/wkKF4908ULT4dFIFIUZYcfjAnj+KFnJvlh8Hsz1FbQ= -github.com/ipld/go-car/v2 v2.1.1-0.20211211000942-be2525f6bf2d h1:yrjb9jdAj3Lkxgp8af5G3g4Yv4PwWac3+sikmJVF0fA= +github.com/ipld/go-car v0.3.3 h1:D6y+jvg9h2ZSv7GLUMWUwg5VTLy1E7Ak+uQw5orOg3I= +github.com/ipld/go-car v0.3.3/go.mod h1:/wkKF4908ULT4dFIFIUZYcfjAnj+KFnJvlh8Hsz1FbQ= github.com/ipld/go-car/v2 v2.1.1-0.20211211000942-be2525f6bf2d/go.mod h1:+2Yvf0Z3wzkv7NeI69i8tuZ+ft7jyjPYIWZzeVNeFcI= +github.com/ipld/go-car/v2 v2.1.1 h1:saaKz4nC0AdfCGHLYKeXLGn8ivoPC54fyS55uyOLKwA= +github.com/ipld/go-car/v2 v2.1.1/go.mod h1:+2Yvf0Z3wzkv7NeI69i8tuZ+ft7jyjPYIWZzeVNeFcI= github.com/ipld/go-codec-dagpb v1.2.0/go.mod h1:6nBN7X7h8EOsEejZGqC7tej5drsdBAXbMHyBT+Fne5s= github.com/ipld/go-codec-dagpb v1.3.0 h1:czTcaoAuNNyIYWs6Qe01DJ+sEX7B+1Z0LcXjSatMGe8= github.com/ipld/go-codec-dagpb v1.3.0/go.mod h1:ga4JTU3abYApDC3pZ00BC2RSvC3qfBb9MSJkMLSwnhA= @@ -1059,8 +1064,9 @@ github.com/ipld/go-ipld-prime v0.10.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/ 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.3-0.20211207234443-319145880958 h1:olscE5Sv+ts+N9YLQsIL9k6eS6y6CXMGRl5RCr2Cn/E= github.com/ipld/go-ipld-prime v0.14.3-0.20211207234443-319145880958/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= +github.com/ipld/go-ipld-prime v0.14.3 h1:cGUmxSws2IHurn00/iLMDapeXsnf9+FyAtYVy8G/JsQ= +github.com/ipld/go-ipld-prime v0.14.3/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= github.com/ipld/go-ipld-prime-proto v0.0.0-20191113031812-e32bd156a1e5/go.mod h1:gcvzoEDBjwycpXt3LBE061wT9f46szXGHAmj9uoP6fU= github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20211210234204-ce2a1c70cd73 h1:TsyATB2ZRRQGTwafJdgEUQkmjOExRV0DNokcihZxbnQ= github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20211210234204-ce2a1c70cd73/go.mod h1:2PJ0JgxyB08t0b2WKrcuqI3di0V+5n6RS/LTUJhkoxY= From bdd56d2516e1be630ab5168dbfc041de6b078a0e Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 14 Dec 2021 18:06:28 -0500 Subject: [PATCH 110/393] Deps: Update go-car to v0.3.3 --- go.mod | 2 +- go.sum | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 214cc9805d8..d0685be5195 100644 --- a/go.mod +++ b/go.mod @@ -97,7 +97,7 @@ require ( github.com/ipfs/go-path v0.0.7 github.com/ipfs/go-unixfs v0.2.6 github.com/ipfs/interface-go-ipfs-core v0.4.0 - github.com/ipld/go-car v0.3.3-0.20211210032800-e6f244225a16 + github.com/ipld/go-car v0.3.3 github.com/ipld/go-car/v2 v2.1.1 github.com/ipld/go-codec-dagpb v1.3.0 github.com/ipld/go-ipld-prime v0.14.3 diff --git a/go.sum b/go.sum index f3b6c84059b..5ecad593643 100644 --- a/go.sum +++ b/go.sum @@ -322,8 +322,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.13.3-0.20211211202606-e111ec29d24d h1:TkBhjnKRNKrOxnESYqMQRjMbzK/NayYg1oxejxF1cGg= -github.com/filecoin-project/go-fil-markets v1.13.3-0.20211211202606-e111ec29d24d/go.mod h1:vXOHH3q2+zLk929W+lIq3etuDFTyJJ8nG2DwGHG2R1E= github.com/filecoin-project/go-fil-markets v1.13.5 h1:NLeF8rI5ZPOJNYEgA6NHrvnuh5QE/2dwuU/7wPW7zP0= github.com/filecoin-project/go-fil-markets v1.13.5/go.mod h1:vXOHH3q2+zLk929W+lIq3etuDFTyJJ8nG2DwGHG2R1E= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= @@ -830,8 +828,9 @@ github.com/ipfs/iptb v1.4.0/go.mod h1:1rzHpCYtNp87/+hTxG5TfCVn/yMY3dKnLn8tBiMfdm 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/ipld/go-car v0.1.0/go.mod h1:RCWzaUh2i4mOEkB3W45Vc+9jnS/M6Qay5ooytiBHl3g= -github.com/ipld/go-car v0.3.3-0.20211210032800-e6f244225a16 h1:y6CW3GCY5Nm86/9vwphaghTTmOvEtfJjBOAzAIy3/Mk= github.com/ipld/go-car v0.3.3-0.20211210032800-e6f244225a16/go.mod h1:/wkKF4908ULT4dFIFIUZYcfjAnj+KFnJvlh8Hsz1FbQ= +github.com/ipld/go-car v0.3.3 h1:D6y+jvg9h2ZSv7GLUMWUwg5VTLy1E7Ak+uQw5orOg3I= +github.com/ipld/go-car v0.3.3/go.mod h1:/wkKF4908ULT4dFIFIUZYcfjAnj+KFnJvlh8Hsz1FbQ= github.com/ipld/go-car/v2 v2.1.1-0.20211211000942-be2525f6bf2d/go.mod h1:+2Yvf0Z3wzkv7NeI69i8tuZ+ft7jyjPYIWZzeVNeFcI= github.com/ipld/go-car/v2 v2.1.1 h1:saaKz4nC0AdfCGHLYKeXLGn8ivoPC54fyS55uyOLKwA= github.com/ipld/go-car/v2 v2.1.1/go.mod h1:+2Yvf0Z3wzkv7NeI69i8tuZ+ft7jyjPYIWZzeVNeFcI= From 65819140dd504c4b95ca5430bad20f8f0071d1dd Mon Sep 17 00:00:00 2001 From: TheMenko Date: Wed, 15 Dec 2021 00:56:05 +0100 Subject: [PATCH 111/393] annotated tests for messagepool --- chain/messagepool/messagepool_test.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/chain/messagepool/messagepool_test.go b/chain/messagepool/messagepool_test.go index 4a2bbfe948a..fe8ed231ad6 100644 --- a/chain/messagepool/messagepool_test.go +++ b/chain/messagepool/messagepool_test.go @@ -1,3 +1,4 @@ +//stm: #unit package messagepool import ( @@ -206,6 +207,7 @@ func (tma *testMpoolAPI) ChainComputeBaseFee(ctx context.Context, ts *types.TipS func assertNonce(t *testing.T, mp *MessagePool, addr address.Address, val uint64) { t.Helper() + //stm: @CHAIN_MEMPOOL_GET_NONCE_001 n, err := mp.GetNonce(context.TODO(), addr, types.EmptyTSK) if err != nil { t.Fatal(err) @@ -366,8 +368,10 @@ func TestMessagePoolMessagesInEachBlock(t *testing.T) { tma.applyBlock(t, a) tsa := mock.TipSet(a) + //stm: @CHAIN_MEMPOOL_PENDING_001 _, _ = mp.Pending(context.TODO()) + //stm: @CHAIN_MEMPOOL_SELECT_001 selm, _ := mp.SelectMessages(context.Background(), tsa, 1) if len(selm) == 0 { t.Fatal("should have returned the rest of the messages") @@ -428,6 +432,7 @@ func TestRevertMessages(t *testing.T) { assertNonce(t, mp, sender, 4) + //stm: @CHAIN_MEMPOOL_PENDING_001 p, _ := mp.Pending(context.TODO()) fmt.Printf("%+v\n", p) if len(p) != 3 { @@ -486,6 +491,7 @@ func TestPruningSimple(t *testing.T) { mp.Prune() + //stm: @CHAIN_MEMPOOL_PENDING_001 msgs, _ := mp.Pending(context.TODO()) if len(msgs) != 5 { t.Fatal("expected only 5 messages in pool, got: ", len(msgs)) @@ -528,6 +534,7 @@ func TestLoadLocal(t *testing.T) { msgs := make(map[cid.Cid]struct{}) for i := 0; i < 10; i++ { m := makeTestMessage(w1, a1, a2, uint64(i), gasLimit, uint64(i+1)) + //stm: @CHAIN_MEMPOOL_PUSH_001 cid, err := mp.Push(context.TODO(), m) if err != nil { t.Fatal(err) @@ -544,6 +551,7 @@ func TestLoadLocal(t *testing.T) { t.Fatal(err) } + //stm: @CHAIN_MEMPOOL_PENDING_001 pmsgs, _ := mp.Pending(context.TODO()) if len(msgs) != len(pmsgs) { t.Fatalf("expected %d messages, but got %d", len(msgs), len(pmsgs)) @@ -599,6 +607,7 @@ func TestClearAll(t *testing.T) { gasLimit := gasguess.Costs[gasguess.CostKey{Code: builtin2.StorageMarketActorCodeID, M: 2}] for i := 0; i < 10; i++ { m := makeTestMessage(w1, a1, a2, uint64(i), gasLimit, uint64(i+1)) + //stm: @CHAIN_MEMPOOL_PUSH_001 _, err := mp.Push(context.TODO(), m) if err != nil { t.Fatal(err) @@ -610,8 +619,10 @@ func TestClearAll(t *testing.T) { mustAdd(t, mp, m) } + //stm: @CHAIN_MEMPOOL_CLEAR_001 mp.Clear(context.Background(), true) + //stm: @CHAIN_MEMPOOL_PENDING_001 pending, _ := mp.Pending(context.TODO()) if len(pending) > 0 { t.Fatalf("cleared the mpool, but got %d pending messages", len(pending)) @@ -654,6 +665,7 @@ func TestClearNonLocal(t *testing.T) { gasLimit := gasguess.Costs[gasguess.CostKey{Code: builtin2.StorageMarketActorCodeID, M: 2}] for i := 0; i < 10; i++ { m := makeTestMessage(w1, a1, a2, uint64(i), gasLimit, uint64(i+1)) + //stm: @CHAIN_MEMPOOL_PUSH_001 _, err := mp.Push(context.TODO(), m) if err != nil { t.Fatal(err) @@ -665,8 +677,10 @@ func TestClearNonLocal(t *testing.T) { mustAdd(t, mp, m) } + //stm: @CHAIN_MEMPOOL_CLEAR_001 mp.Clear(context.Background(), false) + //stm: @CHAIN_MEMPOOL_PENDING_001 pending, _ := mp.Pending(context.TODO()) if len(pending) != 10 { t.Fatalf("expected 10 pending messages, but got %d instead", len(pending)) @@ -724,6 +738,7 @@ func TestUpdates(t *testing.T) { for i := 0; i < 10; i++ { m := makeTestMessage(w1, a1, a2, uint64(i), gasLimit, uint64(i+1)) + //stm: @CHAIN_MEMPOOL_PUSH_001 _, err := mp.Push(context.TODO(), m) if err != nil { t.Fatal(err) From 5ccb4586b5abf73086d7ffcd430a1d95107f27e6 Mon Sep 17 00:00:00 2001 From: TheMenko Date: Wed, 15 Dec 2021 12:27:19 +0100 Subject: [PATCH 112/393] add header annotations --- chain/wallet/multi_test.go | 1 + chain/wallet/wallet_test.go | 1 + 2 files changed, 2 insertions(+) diff --git a/chain/wallet/multi_test.go b/chain/wallet/multi_test.go index b74f435e178..54ff240c5c4 100644 --- a/chain/wallet/multi_test.go +++ b/chain/wallet/multi_test.go @@ -1,3 +1,4 @@ +//stm: #unit package wallet import ( diff --git a/chain/wallet/wallet_test.go b/chain/wallet/wallet_test.go index 4aba287070e..f07a6278c8c 100644 --- a/chain/wallet/wallet_test.go +++ b/chain/wallet/wallet_test.go @@ -1,3 +1,4 @@ +//stm: #unit package wallet import ( From 2f1f35cc718055ae5887635324b8c69606f7e7b8 Mon Sep 17 00:00:00 2001 From: Darko Brdareski Date: Wed, 15 Dec 2021 15:30:42 +0100 Subject: [PATCH 113/393] Annotate storage miner features --- extern/sector-storage/manager_test.go | 4 ++++ extern/sector-storage/sched_test.go | 2 ++ extern/sector-storage/stores/remote_test.go | 2 ++ itests/ccupgrade_test.go | 3 +++ itests/deadlines_test.go | 1 + itests/deals_pricing_test.go | 2 ++ itests/sdr_upgrade_test.go | 2 ++ itests/sector_finalize_early_test.go | 3 +++ itests/sector_miner_collateral_test.go | 1 + itests/sector_pledge_test.go | 1 + itests/sector_terminate_test.go | 2 ++ itests/wdpost_dispute_test.go | 1 + 12 files changed, 24 insertions(+) diff --git a/extern/sector-storage/manager_test.go b/extern/sector-storage/manager_test.go index d4044bbaebb..aedd284e396 100644 --- a/extern/sector-storage/manager_test.go +++ b/extern/sector-storage/manager_test.go @@ -1,3 +1,4 @@ +//stm: #unit package sectorstorage import ( @@ -211,6 +212,7 @@ func TestRedoPC1(t *testing.T) { // Manager restarts in the middle of a task, restarts it, it completes func TestRestartManager(t *testing.T) { + //stm: @WORKER_JOBS_001 test := func(returnBeforeCall bool) func(*testing.T) { return func(t *testing.T) { logging.SetAllLoggers(logging.LevelDebug) @@ -355,6 +357,7 @@ func TestRestartWorker(t *testing.T) { <-arch require.NoError(t, w.Close()) + //stm: @WORKER_STATS_001 for { if len(m.WorkerStats()) == 0 { break @@ -417,6 +420,7 @@ func TestReenableWorker(t *testing.T) { // disable atomic.StoreInt64(&w.testDisable, 1) + //stm: @WORKER_STATS_001 for i := 0; i < 100; i++ { if !m.WorkerStats()[w.session].Enabled { break diff --git a/extern/sector-storage/sched_test.go b/extern/sector-storage/sched_test.go index fbc4d83ee07..902253cbd8b 100644 --- a/extern/sector-storage/sched_test.go +++ b/extern/sector-storage/sched_test.go @@ -1,3 +1,4 @@ +//stm: #unit package sectorstorage import ( @@ -188,6 +189,7 @@ func TestSchedStartStop(t *testing.T) { } func TestSched(t *testing.T) { + //stm: @WORKER_JOBS_001 ctx, done := context.WithTimeout(context.Background(), 30*time.Second) defer done() diff --git a/extern/sector-storage/stores/remote_test.go b/extern/sector-storage/stores/remote_test.go index ea9179655cc..754f6d1cedf 100644 --- a/extern/sector-storage/stores/remote_test.go +++ b/extern/sector-storage/stores/remote_test.go @@ -1,3 +1,4 @@ +//stm: #unit package stores_test import ( @@ -153,6 +154,7 @@ func TestMoveShared(t *testing.T) { } func TestReader(t *testing.T) { + //stm: @STORAGE_INFO_001 logging.SetAllLoggers(logging.LevelDebug) bz := []byte("Hello World") diff --git a/itests/ccupgrade_test.go b/itests/ccupgrade_test.go index 396ef1766f2..8967b0f936f 100644 --- a/itests/ccupgrade_test.go +++ b/itests/ccupgrade_test.go @@ -22,6 +22,8 @@ func TestCCUpgrade(t *testing.T) { //stm: @CHAIN_STATE_MINER_GET_INFO_001 //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.QuietMiningLogs() for _, height := range []abi.ChainEpoch{ @@ -64,6 +66,7 @@ func runTestCCUpgrade(t *testing.T, upgradeHeight abi.ChainEpoch) { require.Less(t, 50000, int(si.Expiration)) } + //stm: @SECTOR_CC_UPGRADE_001 err = miner.SectorMarkForUpgrade(ctx, sl[0]) require.NoError(t, err) diff --git a/itests/deadlines_test.go b/itests/deadlines_test.go index fec40eedc74..f0abdb556ca 100644 --- a/itests/deadlines_test.go +++ b/itests/deadlines_test.go @@ -59,6 +59,7 @@ func TestDeadlineToggling(t *testing.T) { //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 + //stm: @MINER_SECTOR_LIST_001 kit.Expensive(t) kit.QuietMiningLogs() diff --git a/itests/deals_pricing_test.go b/itests/deals_pricing_test.go index ec937b7a51a..a3e5f55bcf6 100644 --- a/itests/deals_pricing_test.go +++ b/itests/deals_pricing_test.go @@ -63,11 +63,13 @@ func TestQuotePriceForUnsealedRetrieval(t *testing.T) { require.Equal(t, dealInfo.Size*uint64(ppb), offers[0].MinPrice.Uint64()) // remove ONLY one unsealed file + //stm: @STORAGE_LIST_001, @MINER_SECTOR_LIST_001 ss, err := miner.StorageList(context.Background()) require.NoError(t, err) _, err = miner.SectorsList(ctx) require.NoError(t, err) + //stm: @STORAGE_DROP_SECTOR_001, @STORAGE_LIST_001 iLoop: for storeID, sd := range ss { for _, sector := range sd { diff --git a/itests/sdr_upgrade_test.go b/itests/sdr_upgrade_test.go index 2d447dee41e..c1198dd0ca1 100644 --- a/itests/sdr_upgrade_test.go +++ b/itests/sdr_upgrade_test.go @@ -25,6 +25,8 @@ func TestSDRUpgrade(t *testing.T) { //stm: @CHAIN_INCOMING_HANDLE_INCOMING_BLOCKS_001, @CHAIN_INCOMING_VALIDATE_BLOCK_PUBSUB_001, @CHAIN_INCOMING_VALIDATE_MESSAGE_PUBSUB_001 //stm: @CHAIN_STATE_NETWORK_VERSION_001 + + //stm: @MINER_SECTOR_LIST_001 kit.QuietMiningLogs() // oldDelay := policy.GetPreCommitChallengeDelay() diff --git a/itests/sector_finalize_early_test.go b/itests/sector_finalize_early_test.go index 11f589cbc0e..233bc8fcba7 100644 --- a/itests/sector_finalize_early_test.go +++ b/itests/sector_finalize_early_test.go @@ -25,6 +25,7 @@ func TestDealsWithFinalizeEarly(t *testing.T) { //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 + //stm: @STORAGE_INFO_001 if testing.Short() { t.Skip("skipping test in short mode") } @@ -49,6 +50,7 @@ func TestDealsWithFinalizeEarly(t *testing.T) { miner.AddStorage(ctx, t, 1000000000, true, false) miner.AddStorage(ctx, t, 1000000000, false, true) + //stm: @STORAGE_LIST_001 sl, err := miner.StorageList(ctx) require.NoError(t, err) for si, d := range sl { @@ -62,6 +64,7 @@ func TestDealsWithFinalizeEarly(t *testing.T) { dh.RunConcurrentDeals(kit.RunConcurrentDealsOpts{N: 1}) }) + //stm: @STORAGE_LIST_001 sl, err = miner.StorageList(ctx) require.NoError(t, err) for si, d := range sl { diff --git a/itests/sector_miner_collateral_test.go b/itests/sector_miner_collateral_test.go index 26455ea9341..af67b132b4a 100644 --- a/itests/sector_miner_collateral_test.go +++ b/itests/sector_miner_collateral_test.go @@ -28,6 +28,7 @@ func TestMinerBalanceCollateral(t *testing.T) { //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 + //stm: @MINER_SECTOR_LIST_001 kit.QuietMiningLogs() blockTime := 5 * time.Millisecond diff --git a/itests/sector_pledge_test.go b/itests/sector_pledge_test.go index 5c43172d8cb..a6aa1a7c876 100644 --- a/itests/sector_pledge_test.go +++ b/itests/sector_pledge_test.go @@ -61,6 +61,7 @@ func TestPledgeSectors(t *testing.T) { } func TestPledgeBatching(t *testing.T) { + //stm: @SECTOR_PRE_COMMIT_FLUSH_001, @SECTOR_COMMIT_FLUSH_001 blockTime := 50 * time.Millisecond runTest := func(t *testing.T, nSectors int) { diff --git a/itests/sector_terminate_test.go b/itests/sector_terminate_test.go index a139f6207b6..536e5153805 100644 --- a/itests/sector_terminate_test.go +++ b/itests/sector_terminate_test.go @@ -77,6 +77,7 @@ func TestTerminate(t *testing.T) { toTerminate := abi.SectorNumber(3) + //stm: @SECTOR_TERMINATE_001 err = miner.SectorTerminate(ctx, toTerminate) require.NoError(t, err) @@ -89,6 +90,7 @@ loop: t.Log("state: ", si.State, msgTriggerred) switch sealing.SectorState(si.State) { + //stm: @SECTOR_TERMINATE_PENDING_001 case sealing.Terminating: if !msgTriggerred { { diff --git a/itests/wdpost_dispute_test.go b/itests/wdpost_dispute_test.go index e574e6a528f..fe723a814ad 100644 --- a/itests/wdpost_dispute_test.go +++ b/itests/wdpost_dispute_test.go @@ -90,6 +90,7 @@ func TestWindowPostDispute(t *testing.T) { // make sure it has gained power. require.Equal(t, p.MinerPower.RawBytePower, types.NewInt(uint64(ssz))) + //stm: @MINER_SECTOR_LIST_001 evilSectors, err := evilMiner.SectorsList(ctx) require.NoError(t, err) evilSectorNo := evilSectors[0] // only one. From bd1bec5c930491e859a9d2e2906cb3d29bd4c003 Mon Sep 17 00:00:00 2001 From: Cory Schwartz Date: Wed, 15 Dec 2021 14:48:19 -0800 Subject: [PATCH 114/393] remove devel grade --- snap/snapcraft.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index 472621c2a48..25b84058d0a 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -17,7 +17,6 @@ description: | https://github.com/filecoin-project/lotus -grade: devel confinement: strict parts: From 145c862ee0752c42404edc9570ea3f199ea49201 Mon Sep 17 00:00:00 2001 From: Cory Schwartz Date: Wed, 15 Dec 2021 14:49:56 -0800 Subject: [PATCH 115/393] tmp: publish to snapcraft edge --- .circleci/config.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index a4a88a09089..37caa731a75 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1042,6 +1042,9 @@ workflows: tags: only: - /^v\d+\.\d+\.\d+(-rc\d+)?$/ + - publish-snapcraft: + name: temporary-snapcraft-publish-edge + channel: edge nightly: triggers: From 2f30322a4e5ffc9546859e7d2bbd0f71fa312986 Mon Sep 17 00:00:00 2001 From: Cory Schwartz Date: Wed, 15 Dec 2021 15:01:42 -0800 Subject: [PATCH 116/393] try stable --- .circleci/config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 37caa731a75..252e1fff8b1 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1043,8 +1043,8 @@ workflows: only: - /^v\d+\.\d+\.\d+(-rc\d+)?$/ - publish-snapcraft: - name: temporary-snapcraft-publish-edge - channel: edge + name: temporary-snapcraft-publish-stable + channel: stable nightly: triggers: From 62de84d5b69f50c8ad39107ada65823cd489cfef Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Wed, 15 Dec 2021 18:34:21 -0500 Subject: [PATCH 117/393] Deps: Update drand to 1.3.0 --- go.mod | 2 +- go.sum | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 45cefb7a29c..ba82c7b1d2a 100644 --- a/go.mod +++ b/go.mod @@ -19,7 +19,7 @@ require ( github.com/dgraph-io/badger/v2 v2.2007.3 github.com/dgraph-io/ristretto v0.1.0 // indirect github.com/docker/go-units v0.4.0 - github.com/drand/drand v1.2.8-0.20211214135232-3ce1e81cdbcc + github.com/drand/drand v1.3.0 github.com/drand/kyber v1.1.7 github.com/dustin/go-humanize v1.0.0 github.com/elastic/go-sysinfo v1.7.0 diff --git a/go.sum b/go.sum index e18478aab5c..6fe45152a7b 100644 --- a/go.sum +++ b/go.sum @@ -243,8 +243,8 @@ github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUn github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/drand/bls12-381 v0.3.2/go.mod h1:dtcLgPtYT38L3NO6mPDYH0nbpc5tjPassDqiniuAt4Y= -github.com/drand/drand v1.2.8-0.20211214135232-3ce1e81cdbcc h1:n6pVZeD0CEFqF4TUE0XI45pCe8cpmAJnv04f3BWXNdo= -github.com/drand/drand v1.2.8-0.20211214135232-3ce1e81cdbcc/go.mod h1:pizbfJhoUg8zI+od47iyqMM58XOJYsQ04h/TYermiWA= +github.com/drand/drand v1.3.0 h1:k/w/PtHzmlU6OmfoAqgirWyrJ4FZH8ESlJrsKF20UkM= +github.com/drand/drand v1.3.0/go.mod h1:D6kAVlxufq1gi71YCGfzN455JrXF4Q272ZJEG975fzo= github.com/drand/kyber v1.0.1-0.20200110225416-8de27ed8c0e2/go.mod h1:UpXoA0Upd1N9l4TvRPHr1qAUBBERj6JQ/mnKI3BPEmw= github.com/drand/kyber v1.0.2/go.mod h1:x6KOpK7avKj0GJ4emhXFP5n7M7W7ChAPmnQh/OL6vRw= github.com/drand/kyber v1.1.4/go.mod h1:9+IgTq7kadePhZg7eRwSD7+bA+bmvqRK+8DtmoV5a3U= @@ -696,7 +696,6 @@ github.com/ipfs/go-ds-badger v0.2.3/go.mod h1:pEYw0rgg3FIrywKKnL+Snr+w/LjJZVMTBR github.com/ipfs/go-ds-badger v0.2.7/go.mod h1:02rnztVKA4aZwDuaRPTf8mpqcKmXP7mLl6JPxd14JHA= github.com/ipfs/go-ds-badger v0.3.0 h1:xREL3V0EH9S219kFFueOYJJTcjgNSZ2HY1iSvN7U1Ro= github.com/ipfs/go-ds-badger v0.3.0/go.mod h1:1ke6mXNqeV8K3y5Ak2bAA0osoTfmxUdupVCGm4QUIek= -github.com/ipfs/go-ds-badger2 v0.1.2-0.20211203191834-bc6df5c2417c/go.mod h1:wD65qQCjB35uNOHaaha+tudGVWegJ7dFuFKY+3iJKjk= 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-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIykR4L04tMOYc= From 65ecca290488dbfd50f2abc55c7ad343bc6ebca0 Mon Sep 17 00:00:00 2001 From: Cory Schwartz Date: Wed, 15 Dec 2021 15:54:40 -0800 Subject: [PATCH 118/393] restore .circleci --- .circleci/config.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 252e1fff8b1..a4a88a09089 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1042,9 +1042,6 @@ workflows: tags: only: - /^v\d+\.\d+\.\d+(-rc\d+)?$/ - - publish-snapcraft: - name: temporary-snapcraft-publish-stable - channel: stable nightly: triggers: From 3e32aa896c80a63525d8d9573906b83460db27d3 Mon Sep 17 00:00:00 2001 From: Darko Brdareski Date: Thu, 16 Dec 2021 14:36:02 +0100 Subject: [PATCH 119/393] Annotate client storage deals feature --- itests/deals_512mb_test.go | 1 + itests/deals_max_staging_deals_test.go | 1 + itests/deals_offline_test.go | 2 ++ itests/deals_padding_test.go | 2 ++ itests/deals_partial_retrieval_test.go | 5 +++++ itests/deals_pricing_test.go | 4 ++++ itests/deals_retry_deal_no_funds_test.go | 3 +++ node/impl/client/client_test.go | 4 ++++ 8 files changed, 22 insertions(+) diff --git a/itests/deals_512mb_test.go b/itests/deals_512mb_test.go index 2c3d59dbe9e..967e33da4f6 100644 --- a/itests/deals_512mb_test.go +++ b/itests/deals_512mb_test.go @@ -19,6 +19,7 @@ func TestStorageDealMissingBlock(t *testing.T) { //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 + //stm: @CLIENT_STORAGE_DEALS_LIST_IMPORTS_001 ctx := context.Background() // enable 512MiB proofs so we can conduct larger transfers. diff --git a/itests/deals_max_staging_deals_test.go b/itests/deals_max_staging_deals_test.go index 66285ace3bf..6a4234e0259 100644 --- a/itests/deals_max_staging_deals_test.go +++ b/itests/deals_max_staging_deals_test.go @@ -19,6 +19,7 @@ func TestMaxStagingDeals(t *testing.T) { //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 + //stm: @CLIENT_STORAGE_DEALS_LIST_IMPORTS_001 ctx := context.Background() // enable 512MiB proofs so we can conduct larger transfers. diff --git a/itests/deals_offline_test.go b/itests/deals_offline_test.go index 92121b339b6..bb2549026e3 100644 --- a/itests/deals_offline_test.go +++ b/itests/deals_offline_test.go @@ -23,6 +23,7 @@ func TestOfflineDealFlow(t *testing.T) { //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 + //stm: @CLIENT_DATA_CALCULATE_COMMP_001, @CLIENT_DATA_GENERATE_CAR_001, @CLIENT_DATA_GET_DEAL_PIECE_CID_001, @CLIENT_DATA_GET_DEAL_PIECE_CID_001 runTest := func(t *testing.T, fastRet bool, upscale abi.PaddedPieceSize) { ctx := context.Background() client, miner, ens := kit.EnsembleMinimal(t, kit.WithAllSubsystems()) // no mock proofs @@ -66,6 +67,7 @@ func TestOfflineDealFlow(t *testing.T) { proposalCid := dh.StartDeal(ctx, dp) + //stm: @CLIENT_STORAGE_DEALS_GET_001 // Wait for the deal to reach StorageDealCheckForAcceptance on the client cd, err := client.ClientGetDealInfo(ctx, *proposalCid) require.NoError(t, err) diff --git a/itests/deals_padding_test.go b/itests/deals_padding_test.go index e7881e88820..c79b6a7db31 100644 --- a/itests/deals_padding_test.go +++ b/itests/deals_padding_test.go @@ -21,6 +21,7 @@ func TestDealPadding(t *testing.T) { //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 + //stm: @CLIENT_DATA_GET_DEAL_PIECE_CID_001 kit.QuietMiningLogs() var blockTime = 250 * time.Millisecond @@ -64,6 +65,7 @@ func TestDealPadding(t *testing.T) { // TODO: this sleep is only necessary because deals don't immediately get logged in the dealstore, we should fix this time.Sleep(time.Second) + //stm: @CLIENT_STORAGE_DEALS_GET_001 di, err := client.ClientGetDealInfo(ctx, *proposalCid) require.NoError(t, err) require.True(t, di.PieceCID.Equals(pcid)) diff --git a/itests/deals_partial_retrieval_test.go b/itests/deals_partial_retrieval_test.go index 9285d3c2b67..4a92db03410 100644 --- a/itests/deals_partial_retrieval_test.go +++ b/itests/deals_partial_retrieval_test.go @@ -1,3 +1,4 @@ +//stm: #integration package itests import ( @@ -42,6 +43,7 @@ func TestPartialRetrieval(t *testing.T) { //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 + //stm: @CLIENT_RETRIEVAL_RETRIEVE_001 ctx := context.Background() policy.SetPreCommitChallengeDelay(2) @@ -79,6 +81,7 @@ func TestPartialRetrieval(t *testing.T) { } proposalCid := dh.StartDeal(ctx, dp) + //stm: @CLIENT_STORAGE_DEALS_GET_001 // Wait for the deal to reach StorageDealCheckForAcceptance on the client cd, err := client.ClientGetDealInfo(ctx, *proposalCid) require.NoError(t, err) @@ -87,12 +90,14 @@ func TestPartialRetrieval(t *testing.T) { return cd.State == storagemarket.StorageDealCheckForAcceptance }, 30*time.Second, 1*time.Second, "actual deal status is %s", storagemarket.DealStates[cd.State]) + //stm: @MINER_IMPORT_DEAL_DATA_001 err = miner.DealsImportData(ctx, *proposalCid, sourceCar) require.NoError(t, err) // Wait for the deal to be published, we should be able to start retrieval right away dh.WaitDealPublished(ctx, proposalCid) + //stm: @CLIENT_RETRIEVAL_FIND_001 offers, err := client.ClientFindData(ctx, carRoot, nil) require.NoError(t, err) require.NotEmpty(t, offers, "no offers") diff --git a/itests/deals_pricing_test.go b/itests/deals_pricing_test.go index a3e5f55bcf6..b1f1d7e5d99 100644 --- a/itests/deals_pricing_test.go +++ b/itests/deals_pricing_test.go @@ -50,10 +50,12 @@ func TestQuotePriceForUnsealedRetrieval(t *testing.T) { _, res2, _ := dh.MakeOnlineDeal(ctx, kit.MakeFullDealParams{Rseed: 6}) require.Equal(t, res1.Root, res2.Root) + //stm: @CLIENT_STORAGE_DEALS_GET_001 // Retrieval dealInfo, err := client.ClientGetDealInfo(ctx, *deal1) require.NoError(t, err) + //stm: @CLIENT_RETRIEVAL_FIND_001 // fetch quote -> zero for unsealed price since unsealed file already exists. offers, err := client.ClientFindData(ctx, res1.Root, &dealInfo.PieceCID) require.NoError(t, err) @@ -79,6 +81,7 @@ iLoop: } } + //stm: @CLIENT_RETRIEVAL_FIND_001 // get retrieval quote -> zero for unsealed price as unsealed file exists. offers, err = client.ClientFindData(ctx, res1.Root, &dealInfo.PieceCID) require.NoError(t, err) @@ -98,6 +101,7 @@ iLoop: } } + //stm: @CLIENT_RETRIEVAL_FIND_001 // fetch quote -> non-zero for unseal price as we no more unsealed files. offers, err = client.ClientFindData(ctx, res1.Root, &dealInfo.PieceCID) require.NoError(t, err) diff --git a/itests/deals_retry_deal_no_funds_test.go b/itests/deals_retry_deal_no_funds_test.go index 8cfece1750e..a14a0d08536 100644 --- a/itests/deals_retry_deal_no_funds_test.go +++ b/itests/deals_retry_deal_no_funds_test.go @@ -33,6 +33,7 @@ func TestDealsRetryLackOfFunds(t *testing.T) { //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 + //stm: @CLIENT_STORAGE_DEALS_LIST_IMPORTS_001 ctx := context.Background() oldDelay := policy.GetPreCommitChallengeDelay() policy.SetPreCommitChallengeDelay(5) @@ -116,6 +117,7 @@ func TestDealsRetryLackOfFunds_blockInPublishDeal(t *testing.T) { //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: @CLIENT_STORAGE_DEALS_LIST_IMPORTS_001 ctx := context.Background() oldDelay := policy.GetPreCommitChallengeDelay() policy.SetPreCommitChallengeDelay(5) @@ -196,6 +198,7 @@ func TestDealsRetryLackOfFunds_belowLimit(t *testing.T) { //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: @CLIENT_STORAGE_DEALS_LIST_IMPORTS_001 ctx := context.Background() oldDelay := policy.GetPreCommitChallengeDelay() policy.SetPreCommitChallengeDelay(5) diff --git a/node/impl/client/client_test.go b/node/impl/client/client_test.go index 8e3c3cbffd1..2be87a659bc 100644 --- a/node/impl/client/client_test.go +++ b/node/impl/client/client_test.go @@ -32,6 +32,7 @@ import ( var testdata embed.FS func TestImportLocal(t *testing.T) { + //stm: @CLIENT_STORAGE_DEALS_IMPORT_LOCAL_001, @CLIENT_RETRIEVAL_FIND_001 ds := dssync.MutexWrap(datastore.NewMapDatastore()) dir := t.TempDir() im := imports.NewManager(ds, dir) @@ -45,6 +46,7 @@ func TestImportLocal(t *testing.T) { b, err := testdata.ReadFile("testdata/payload.txt") require.NoError(t, err) + //stm @CLIENT_STORAGE_DEALS_LIST_IMPORTS_001 root, err := a.ClientImportLocal(ctx, bytes.NewReader(b)) require.NoError(t, err) require.NotEqual(t, cid.Undef, root) @@ -57,6 +59,7 @@ func TestImportLocal(t *testing.T) { require.Equal(t, root, *it.Root) require.True(t, strings.HasPrefix(it.CARPath, dir)) + //stm @CLIENT_DATA_HAS_LOCAL_001 local, err := a.ClientHasLocal(ctx, root) require.NoError(t, err) require.True(t, local) @@ -69,6 +72,7 @@ func TestImportLocal(t *testing.T) { // retrieve as UnixFS. out1 := filepath.Join(dir, "retrieval1.data") // as unixfs out2 := filepath.Join(dir, "retrieval2.data") // as car + //stm: @CLIENT_RETRIEVAL_RETRIEVE_001 err = a.ClientRetrieve(ctx, order, &api.FileRef{ Path: out1, }) From fac769ff17f03731520476bd8a0db49a9a3a4081 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Mon, 13 Dec 2021 04:18:31 -0500 Subject: [PATCH 120/393] i forced pushed and brought a bug that was fixed back so im fixing it back --- cmd/lotus-shed/terminations.go | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/cmd/lotus-shed/terminations.go b/cmd/lotus-shed/terminations.go index c28d595b4e1..a209e459f1f 100644 --- a/cmd/lotus-shed/terminations.go +++ b/cmd/lotus-shed/terminations.go @@ -5,12 +5,15 @@ import ( "context" "fmt" "io" + "strconv" + "github.com/filecoin-project/lotus/chain/actors/builtin" + + "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/chain/actors/builtin/market" - "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/builtin/miner" "github.com/filecoin-project/lotus/chain/consensus/filcns" @@ -26,6 +29,7 @@ import ( var terminationsCmd = &cli.Command{ Name: "terminations", Description: "Lists terminated deals from the past 2 days", + ArgsUsage: "[block to look back from] [lookback period (epochs)]", Flags: []cli.Flag{ &cli.StringFlag{ Name: "repo", @@ -35,8 +39,8 @@ var terminationsCmd = &cli.Command{ Action: func(cctx *cli.Context) error { ctx := context.TODO() - if !cctx.Args().Present() { - return fmt.Errorf("must pass block cid") + if cctx.NArg() != 2 { + return fmt.Errorf("must pass block cid && lookback period") } blkCid, err := cid.Decode(cctx.Args().First()) @@ -85,12 +89,14 @@ var terminationsCmd = &cli.Command{ return err } - minerCode, err := miner.GetActorCodeID(actors.Version6) + lbp, err := strconv.Atoi(cctx.Args().Get(1)) if err != nil { - return err + return fmt.Errorf("failed to parse input: %w", err) } - for i := 0; i < 2880*2; i++ { + cutoff := blk.Height - abi.ChainEpoch(lbp) + + for blk.Height > cutoff { pts, err := cs.LoadTipSet(types.NewTipSetKey(blk.Parents...)) if err != nil { return err @@ -119,7 +125,7 @@ var terminationsCmd = &cli.Command{ return err } - if minerAct.Code != minerCode { + if !builtin.IsStorageMinerActor(minerAct.Code) { continue } @@ -158,10 +164,12 @@ var terminationsCmd = &cli.Command{ for _, sector := range sectors { for _, deal := range sector.DealIDs { prop, find, err := proposals.Get(deal) - if err != nil || !find { + if err != nil { return err } - fmt.Printf("%s, %d, %d, %s, %s, %s\n", msg.To, sector.SectorNumber, deal, prop.Client, prop.PieceCID, prop.Label) + if find { + fmt.Printf("%s, %d, %d, %s, %s, %s\n", msg.To, sector.SectorNumber, deal, prop.Client, prop.PieceCID, prop.Label) + } } } } From 0f0a70e2516ea983ca7c1e095e5c1977867fed75 Mon Sep 17 00:00:00 2001 From: Jiaying Wang <42981373+jennijuju@users.noreply.github.com> Date: Thu, 16 Dec 2021 23:00:58 -0500 Subject: [PATCH 121/393] Update .github/pull_request_template.md --- .github/pull_request_template.md | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 6984f6ffd3d..d4989af72fa 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -11,6 +11,7 @@ ## Checklist Before you mark the PR ready for review, please make sure that: +- [ ] All commits have a clear commit message. - [ ] The PR title is in the form of of `: <#issue number> : ` - example: ` fix: #1234 mempool: Introduce a cache for valid signatures` - `PR type`: _fix_, _feat_, _BREAKING CHANGE_, _build_, _chore_, _ci_, _docs_, _perf_, _refactor_, _revert_, _style_, _test_ From 52fbee6749787741d8f61a45b18061a6aed209f4 Mon Sep 17 00:00:00 2001 From: Jiaying Wang <42981373+jennijuju@users.noreply.github.com> Date: Thu, 16 Dec 2021 23:01:03 -0500 Subject: [PATCH 122/393] Update .github/pull_request_template.md --- .github/pull_request_template.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index d4989af72fa..76d38d2927c 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -14,7 +14,7 @@ Before you mark the PR ready for review, please make sure that: - [ ] All commits have a clear commit message. - [ ] The PR title is in the form of of `: <#issue number> : ` - example: ` fix: #1234 mempool: Introduce a cache for valid signatures` - - `PR type`: _fix_, _feat_, _BREAKING CHANGE_, _build_, _chore_, _ci_, _docs_, _perf_, _refactor_, _revert_, _style_, _test_ + - `PR type`: _fix_, _feat_, _INTERFACE BREAKING CHANGE_, _CONSENSUS BREAKING_, _build_, _chore_, _ci_, _docs_, _misc_,_perf_, _refactor_, _revert_, _style_, _test_ - `area`: _api_, _chain_, _state_, _vm_, _data transfer_, _market_, _mempool_, _message_, _block production_, _multisig_, _networking_, _paychan_, _proving_, _sealing_, _wallet_ - [ ] This PR has tests for new functionality or change in behaviour - [ ] If new user-facing features are introduced, clear usage guidelines and / or documentation updates should be included in https://lotus.filecoin.io or [Discussion Tutorials.](https://github.com/filecoin-project/lotus/discussions/categories/tutorials) From 9e7d9affbe0451d01a58bb6a36ec06d4b7b0466b Mon Sep 17 00:00:00 2001 From: Rod Vagg Date: Thu, 28 Oct 2021 22:39:57 +1100 Subject: [PATCH 123/393] feat(graphsync): allow setting of per-peer incoming requests for miners --- documentation/en/default-lotus-miner-config.toml | 11 +++++++++++ itests/deals_concurrent_test.go | 2 +- node/builder_miner.go | 2 +- node/config/def.go | 5 +++-- node/config/doc_gen.go | 11 +++++++++++ node/config/types.go | 7 +++++++ node/modules/storageminer.go | 8 ++++---- tools/packer/repo/config.toml | 1 + 8 files changed, 39 insertions(+), 8 deletions(-) diff --git a/documentation/en/default-lotus-miner-config.toml b/documentation/en/default-lotus-miner-config.toml index d402f65edca..b034698a2d8 100644 --- a/documentation/en/default-lotus-miner-config.toml +++ b/documentation/en/default-lotus-miner-config.toml @@ -207,6 +207,17 @@ # env var: LOTUS_DEALMAKING_SIMULTANEOUSTRANSFERSFORSTORAGE #SimultaneousTransfersForStorage = 20 + # The maximum number of simultaneous data transfers from any single client + # for storage deals. + # Unset by default (0), and values higher than SimultaneousTransfersForStorage + # will have no effect; i.e. the total number of simultaneous data transfers + # across all storage clients is bound by SimultaneousTransfersForStorage + # regardless of this number. + # + # type: uint64 + # env var: LOTUS_DEALMAKING_SIMULTANEOUSTRANSFERSFORSTORAGEPERCLIENT + #SimultaneousTransfersForStoragePerClient = 0 + # The maximum number of parallel online data transfers for retrieval deals # # type: uint64 diff --git a/itests/deals_concurrent_test.go b/itests/deals_concurrent_test.go index c0458e8d1dd..49a8bb00899 100644 --- a/itests/deals_concurrent_test.go +++ b/itests/deals_concurrent_test.go @@ -139,7 +139,7 @@ func TestSimultanenousTransferLimit(t *testing.T) { ) runTest := func(t *testing.T) { client, miner, ens := kit.EnsembleMinimal(t, kit.MockProofs(), kit.ConstructorOpts( - node.ApplyIf(node.IsType(repo.StorageMiner), node.Override(new(dtypes.StagingGraphsync), modules.StagingGraphsync(graphsyncThrottle, graphsyncThrottle))), + node.ApplyIf(node.IsType(repo.StorageMiner), node.Override(new(dtypes.StagingGraphsync), modules.StagingGraphsync(graphsyncThrottle, 0, graphsyncThrottle))), node.Override(new(dtypes.Graphsync), modules.Graphsync(graphsyncThrottle, graphsyncThrottle)), )) ens.InterconnectAll().BeginMining(250 * time.Millisecond) diff --git a/node/builder_miner.go b/node/builder_miner.go index 74b0c555870..c8a04255fb7 100644 --- a/node/builder_miner.go +++ b/node/builder_miner.go @@ -136,7 +136,7 @@ func ConfigStorageMiner(c interface{}) Option { If(cfg.Subsystems.EnableMarkets, // Markets Override(new(dtypes.StagingBlockstore), modules.StagingBlockstore), - Override(new(dtypes.StagingGraphsync), modules.StagingGraphsync(cfg.Dealmaking.SimultaneousTransfersForStorage, cfg.Dealmaking.SimultaneousTransfersForRetrieval)), + Override(new(dtypes.StagingGraphsync), modules.StagingGraphsync(cfg.Dealmaking.SimultaneousTransfersForStorage, cfg.Dealmaking.SimultaneousTransfersForStoragePerClient, cfg.Dealmaking.SimultaneousTransfersForRetrieval)), Override(new(dtypes.ProviderPieceStore), modules.NewProviderPieceStore), Override(new(*sectorblocks.SectorBlocks), sectorblocks.NewSectorBlocks), diff --git a/node/config/def.go b/node/config/def.go index 735107e2940..4a525e697c9 100644 --- a/node/config/def.go +++ b/node/config/def.go @@ -160,8 +160,9 @@ func DefaultStorageMiner() *StorageMiner { MaxDealsPerPublishMsg: 8, MaxProviderCollateralMultiplier: 2, - SimultaneousTransfersForStorage: DefaultSimultaneousTransfers, - SimultaneousTransfersForRetrieval: DefaultSimultaneousTransfers, + SimultaneousTransfersForStorage: DefaultSimultaneousTransfers, + SimultaneousTransfersForStoragePerClient: 0, + SimultaneousTransfersForRetrieval: DefaultSimultaneousTransfers, StartEpochSealingBuffer: 480, // 480 epochs buffer == 4 hours from adding deal to sector to sector being sealed diff --git a/node/config/doc_gen.go b/node/config/doc_gen.go index 296501edcfb..eded0b1fed0 100644 --- a/node/config/doc_gen.go +++ b/node/config/doc_gen.go @@ -272,6 +272,17 @@ passed to the sealing node by the markets service. 0 is unlimited.`, Comment: `The maximum number of parallel online data transfers for storage deals`, }, + { + Name: "SimultaneousTransfersForStoragePerClient", + Type: "uint64", + + Comment: `The maximum number of simultaneous data transfers from any single client +for storage deals. +Unset by default (0), and values higher than SimultaneousTransfersForStorage +will have no effect; i.e. the total number of simultaneous data transfers +across all storage clients is bound by SimultaneousTransfersForStorage +regardless of this number.`, + }, { Name: "SimultaneousTransfersForRetrieval", Type: "uint64", diff --git a/node/config/types.go b/node/config/types.go index 1be40029e17..2ae2d8eee32 100644 --- a/node/config/types.go +++ b/node/config/types.go @@ -131,6 +131,13 @@ type DealmakingConfig struct { MaxStagingDealsBytes int64 // The maximum number of parallel online data transfers for storage deals SimultaneousTransfersForStorage uint64 + // The maximum number of simultaneous data transfers from any single client + // for storage deals. + // Unset by default (0), and values higher than SimultaneousTransfersForStorage + // will have no effect; i.e. the total number of simultaneous data transfers + // across all storage clients is bound by SimultaneousTransfersForStorage + // regardless of this number. + SimultaneousTransfersForStoragePerClient uint64 // The maximum number of parallel online data transfers for retrieval deals SimultaneousTransfersForRetrieval uint64 // Minimum start epoch buffer to give time for sealing of sector with deal. diff --git a/node/modules/storageminer.go b/node/modules/storageminer.go index f4d00606f58..a505635be12 100644 --- a/node/modules/storageminer.go +++ b/node/modules/storageminer.go @@ -39,7 +39,6 @@ import ( "github.com/ipfs/go-datastore" "github.com/ipfs/go-datastore/namespace" graphsync "github.com/ipfs/go-graphsync/impl" - 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" @@ -396,7 +395,7 @@ func StagingBlockstore(lc fx.Lifecycle, mctx helpers.MetricsCtx, r repo.LockedRe // StagingGraphsync creates a graphsync instance which reads and writes blocks // to the StagingBlockstore -func StagingGraphsync(parallelTransfersForStorage uint64, parallelTransfersForRetrieval uint64) func(mctx helpers.MetricsCtx, lc fx.Lifecycle, ibs dtypes.StagingBlockstore, h host.Host) dtypes.StagingGraphsync { +func StagingGraphsync(parallelTransfersForStorage uint64, parallelTransfersForStoragePerPeer uint64, parallelTransfersForRetrieval uint64) func(mctx helpers.MetricsCtx, lc fx.Lifecycle, ibs dtypes.StagingBlockstore, h host.Host) dtypes.StagingGraphsync { return func(mctx helpers.MetricsCtx, lc fx.Lifecycle, ibs dtypes.StagingBlockstore, h host.Host) dtypes.StagingGraphsync { graphsyncNetwork := gsnet.NewFromLibp2pHost(h) lsys := storeutil.LinkSystemForBlockstore(ibs) @@ -405,9 +404,10 @@ func StagingGraphsync(parallelTransfersForStorage uint64, parallelTransfersForRe lsys, graphsync.RejectAllRequestsByDefault(), graphsync.MaxInProgressIncomingRequests(parallelTransfersForRetrieval), + graphsync.MaxInProgressIncomingRequestsPerPeer(parallelTransfersForStoragePerPeer), graphsync.MaxInProgressOutgoingRequests(parallelTransfersForStorage), - graphsyncimpl.MaxLinksPerIncomingRequests(config.MaxTraversalLinks), - graphsyncimpl.MaxLinksPerOutgoingRequests(config.MaxTraversalLinks)) + graphsync.MaxLinksPerIncomingRequests(config.MaxTraversalLinks), + graphsync.MaxLinksPerOutgoingRequests(config.MaxTraversalLinks)) graphsyncStats(mctx, lc, gs) diff --git a/tools/packer/repo/config.toml b/tools/packer/repo/config.toml index 900dad218fa..380d5a28f9f 100644 --- a/tools/packer/repo/config.toml +++ b/tools/packer/repo/config.toml @@ -21,6 +21,7 @@ ListenAddresses = ["/ip4/0.0.0.0/tcp/5678", "/ip6/::/tcp/5678"] # IpfsMAddr = "" # IpfsUseForRetrieval = false # SimultaneousTransfersForStorage = 20 +# SimultaneousTransfersForStoragePerClient = 0 # SimultaneousTransfersForRetrieval = 20 # [Metrics] From 1f04cc1f23b1a86d79ee1a9afa59180ac1699ab5 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Thu, 16 Dec 2021 23:59:26 -0500 Subject: [PATCH 124/393] VM: Circ supply should be constant per epoch --- chain/gen/genesis/genesis.go | 6 +++++- chain/vm/vm.go | 19 ++++++++++++++----- conformance/driver.go | 8 ++++++++ 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/chain/gen/genesis/genesis.go b/chain/gen/genesis/genesis.go index 29f03e2af92..45387df50bc 100644 --- a/chain/gen/genesis/genesis.go +++ b/chain/gen/genesis/genesis.go @@ -479,6 +479,10 @@ func VerifyPreSealedData(ctx context.Context, cs *store.ChainStore, sys vm.Sysca verifNeeds := make(map[address.Address]abi.PaddedPieceSize) var sum abi.PaddedPieceSize + csc := func(context.Context, abi.ChainEpoch, *state.StateTree) (abi.TokenAmount, error) { + return big.Zero(), nil + } + vmopt := vm.VMOpts{ StateBase: stateroot, Epoch: 0, @@ -486,7 +490,7 @@ func VerifyPreSealedData(ctx context.Context, cs *store.ChainStore, sys vm.Sysca Bstore: cs.StateBlockstore(), Actors: filcns.NewActorRegistry(), Syscalls: mkFakedSigSyscalls(sys), - CircSupplyCalc: nil, + CircSupplyCalc: csc, NtwkVersion: func(_ context.Context, _ abi.ChainEpoch) network.Version { return nv }, diff --git a/chain/vm/vm.go b/chain/vm/vm.go index 16ad5e2a463..d569dbbbf96 100644 --- a/chain/vm/vm.go +++ b/chain/vm/vm.go @@ -202,9 +202,7 @@ type ( ) type VM struct { - cstate *state.StateTree - // TODO: Is base actually used? Can we delete it? - base cid.Cid + cstate *state.StateTree cst *cbor.BasicIpldStore buf *blockstore.BufferedBlockstore blockHeight abi.ChainEpoch @@ -214,6 +212,7 @@ type VM struct { ntwkVersion NtwkVersionGetter baseFee abi.TokenAmount lbStateGet LookbackStateGetter + baseCircSupply abi.TokenAmount Syscalls SyscallBuilder } @@ -239,9 +238,13 @@ func NewVM(ctx context.Context, opts *VMOpts) (*VM, error) { return nil, err } + baseCirc, err := opts.CircSupplyCalc(ctx, opts.Epoch, state) + if err != nil { + return nil, err + } + return &VM{ cstate: state, - base: opts.StateBase, cst: cst, buf: buf, blockHeight: opts.Epoch, @@ -251,6 +254,7 @@ func NewVM(ctx context.Context, opts *VMOpts) (*VM, error) { ntwkVersion: opts.NtwkVersion, Syscalls: opts.Syscalls, baseFee: opts.BaseFee, + baseCircSupply: baseCirc, lbStateGet: opts.LookbackState, }, nil } @@ -859,7 +863,12 @@ func (vm *VM) GetNtwkVersion(ctx context.Context, ce abi.ChainEpoch) network.Ver } func (vm *VM) GetCircSupply(ctx context.Context) (abi.TokenAmount, error) { - return vm.circSupplyCalc(ctx, vm.blockHeight, vm.cstate) + // Before v15, this was recalculated on each invocation as the state tree was mutated + if vm.GetNtwkVersion(ctx, vm.blockHeight) <= network.Version14 { + return vm.circSupplyCalc(ctx, vm.blockHeight, vm.cstate) + } + + return vm.baseCircSupply, nil } func (vm *VM) incrementNonce(addr address.Address) error { diff --git a/conformance/driver.go b/conformance/driver.go index 8669089da08..c6a20e3599c 100644 --- a/conformance/driver.go +++ b/conformance/driver.go @@ -153,6 +153,14 @@ func (d *Driver) ExecuteTipset(bs blockstore.Blockstore, ds ds.Batching, params results: []*vm.ApplyRet{}, } + sm.SetVMConstructor(func(ctx context.Context, vmopt *vm.VMOpts) (*vm.VM, error) { + vmopt.CircSupplyCalc = func(context.Context, abi.ChainEpoch, *state.StateTree) (abi.TokenAmount, error) { + return big.Zero(), nil + } + + return vm.NewVM(ctx, vmopt) + }) + postcid, receiptsroot, err := tse.ApplyBlocks(context.Background(), sm, params.ParentEpoch, From dd327f0b22aea1b6265ad2ad8c24f64719a54193 Mon Sep 17 00:00:00 2001 From: vyzo Date: Fri, 17 Dec 2021 11:42:09 +0200 Subject: [PATCH 125/393] plumb more contexts --- blockstore/badger/blockstore_test.go | 2 +- blockstore/badger/blockstore_test_suite.go | 2 +- chain/consensus/filcns/compute_state.go | 2 +- chain/consensus/filcns/filecoin.go | 6 +-- chain/consensus/filcns/mine.go | 4 +- chain/exchange/server.go | 10 ++-- chain/messagepool/messagepool.go | 16 +++---- chain/messagepool/provider.go | 18 ++++---- chain/stmgr/searchwait.go | 8 ++-- chain/store/basefee.go | 2 +- chain/store/messages.go | 53 +++++++++++----------- chain/store/snapshot.go | 3 +- chain/store/store.go | 4 +- chain/sync.go | 14 +++--- cmd/lotus-bench/import.go | 20 ++++---- cmd/lotus-miner/init.go | 10 ++-- cmd/lotus-miner/init_restore.go | 4 +- cmd/lotus-sim/simulation/messages.go | 2 +- cmd/lotus-sim/simulation/simulation.go | 12 ++--- cmd/lotus/backup.go | 7 ++- cmd/lotus/daemon.go | 8 ++-- conformance/runner.go | 4 +- node/impl/full/chain.go | 12 ++--- node/impl/full/gas.go | 6 +-- node/impl/full/mpool.go | 4 +- node/impl/full/state.go | 4 +- node/impl/full/sync.go | 6 +-- node/modules/chain.go | 9 ++-- node/modules/client.go | 7 +-- node/modules/genesis.go | 20 ++++---- node/modules/services.go | 4 +- node/modules/storageminer.go | 6 +-- 32 files changed, 146 insertions(+), 143 deletions(-) diff --git a/blockstore/badger/blockstore_test.go b/blockstore/badger/blockstore_test.go index db87262d48e..4619d4ec3bb 100644 --- a/blockstore/badger/blockstore_test.go +++ b/blockstore/badger/blockstore_test.go @@ -99,7 +99,7 @@ func openBlockstore(optsSupplier func(path string) Options) func(tb testing.TB, } func testMove(t *testing.T, optsF func(string) Options) { - ctx := context.TODO() + ctx := context.Background() basePath, err := ioutil.TempDir("", "") if err != nil { t.Fatal(err) diff --git a/blockstore/badger/blockstore_test_suite.go b/blockstore/badger/blockstore_test_suite.go index b155f479a87..de8485a0e7e 100644 --- a/blockstore/badger/blockstore_test_suite.go +++ b/blockstore/badger/blockstore_test_suite.go @@ -44,7 +44,7 @@ func (s *Suite) RunTests(t *testing.T, prefix string) { } func (s *Suite) TestGetWhenKeyNotPresent(t *testing.T) { - ctx := context.TODO() + ctx := context.Background() bs, _ := s.NewBlockstore(t) if c, ok := bs.(io.Closer); ok { defer func() { require.NoError(t, c.Close()) }() diff --git a/chain/consensus/filcns/compute_state.go b/chain/consensus/filcns/compute_state.go index 1bc5763b2b6..bf2bd99552d 100644 --- a/chain/consensus/filcns/compute_state.go +++ b/chain/consensus/filcns/compute_state.go @@ -299,7 +299,7 @@ func (t *TipSetExecutor) ExecuteTipSet(ctx context.Context, sm *stmgr.StateManag r := rand.NewStateRand(sm.ChainStore(), ts.Cids(), sm.Beacon()) - blkmsgs, err := sm.ChainStore().BlockMsgsForTipset(ts) + blkmsgs, err := sm.ChainStore().BlockMsgsForTipset(ctx, ts) if err != nil { return cid.Undef, cid.Undef, xerrors.Errorf("getting block messages for tipset: %w", err) } diff --git a/chain/consensus/filcns/filecoin.go b/chain/consensus/filcns/filecoin.go index 7f2eaa27347..328fc8ec19f 100644 --- a/chain/consensus/filcns/filecoin.go +++ b/chain/consensus/filcns/filecoin.go @@ -171,7 +171,7 @@ func (filec *FilecoinEC) ValidateBlock(ctx context.Context, b *types.FullBlock) } if stateroot != h.ParentStateRoot { - msgs, err := filec.store.MessagesForTipset(baseTs) + msgs, err := filec.store.MessagesForTipset(ctx, baseTs) if err != nil { log.Error("failed to load messages for tipset during tipset state mismatch error: ", err) } else { @@ -519,7 +519,7 @@ func (filec *FilecoinEC) checkBlockMessages(ctx context.Context, b *types.FullBl return xerrors.Errorf("block had invalid bls message at index %d: %w", i, err) } - c, err := store.PutMessage(tmpbs, m) + c, err := store.PutMessage(ctx, tmpbs, m) if err != nil { return xerrors.Errorf("failed to store message %s: %w", m.Cid(), err) } @@ -553,7 +553,7 @@ func (filec *FilecoinEC) checkBlockMessages(ctx context.Context, b *types.FullBl return xerrors.Errorf("secpk message %s has invalid signature: %w", m.Cid(), err) } - c, err := store.PutMessage(tmpbs, m) + c, err := store.PutMessage(ctx, tmpbs, m) if err != nil { return xerrors.Errorf("failed to store message %s: %w", m.Cid(), err) } diff --git a/chain/consensus/filcns/mine.go b/chain/consensus/filcns/mine.go index bb49312977e..133f810a836 100644 --- a/chain/consensus/filcns/mine.go +++ b/chain/consensus/filcns/mine.go @@ -59,14 +59,14 @@ func (filec *FilecoinEC) CreateBlock(ctx context.Context, w api.Wallet, bt *api. blsSigs = append(blsSigs, msg.Signature) blsMessages = append(blsMessages, &msg.Message) - c, err := filec.sm.ChainStore().PutMessage(&msg.Message) + c, err := filec.sm.ChainStore().PutMessage(ctx, &msg.Message) if err != nil { return nil, err } blsMsgCids = append(blsMsgCids, c) } else { - c, err := filec.sm.ChainStore().PutMessage(msg) + c, err := filec.sm.ChainStore().PutMessage(ctx, msg) if err != nil { return nil, err } diff --git a/chain/exchange/server.go b/chain/exchange/server.go index b4519ba7009..37d49d7bcb4 100644 --- a/chain/exchange/server.go +++ b/chain/exchange/server.go @@ -172,7 +172,7 @@ func collectChainSegment(ctx context.Context, cs *store.ChainStore, req *validat } if req.options.IncludeMessages { - bmsgs, bmincl, smsgs, smincl, err := gatherMessages(cs, ts) + bmsgs, bmincl, smsgs, smincl, err := gatherMessages(ctx, cs, ts) if err != nil { return nil, xerrors.Errorf("gather messages failed: %w", err) } @@ -197,14 +197,14 @@ func collectChainSegment(ctx context.Context, cs *store.ChainStore, req *validat } } -func gatherMessages(cs *store.ChainStore, ts *types.TipSet) ([]*types.Message, [][]uint64, []*types.SignedMessage, [][]uint64, error) { +func gatherMessages(ctx context.Context, cs *store.ChainStore, ts *types.TipSet) ([]*types.Message, [][]uint64, []*types.SignedMessage, [][]uint64, error) { blsmsgmap := make(map[cid.Cid]uint64) secpkmsgmap := make(map[cid.Cid]uint64) var secpkincl, blsincl [][]uint64 var blscids, secpkcids []cid.Cid for _, block := range ts.Blocks() { - bc, sc, err := cs.ReadMsgMetaCids(block.Messages) + bc, sc, err := cs.ReadMsgMetaCids(ctx, block.Messages) if err != nil { return nil, nil, nil, nil, err } @@ -237,12 +237,12 @@ func gatherMessages(cs *store.ChainStore, ts *types.TipSet) ([]*types.Message, [ secpkincl = append(secpkincl, smi) } - blsmsgs, err := cs.LoadMessagesFromCids(blscids) + blsmsgs, err := cs.LoadMessagesFromCids(ctx, blscids) if err != nil { return nil, nil, nil, nil, err } - secpkmsgs, err := cs.LoadSignedMessagesFromCids(secpkcids) + secpkmsgs, err := cs.LoadSignedMessagesFromCids(ctx, secpkcids) if err != nil { return nil, nil, nil, nil, err } diff --git a/chain/messagepool/messagepool.go b/chain/messagepool/messagepool.go index c8b4931f079..43d014502a6 100644 --- a/chain/messagepool/messagepool.go +++ b/chain/messagepool/messagepool.go @@ -909,12 +909,12 @@ func (mp *MessagePool) addLocked(ctx context.Context, m *types.SignedMessage, st mp.blsSigCache.Add(m.Cid(), m.Signature) } - if _, err := mp.api.PutMessage(m); err != nil { + if _, err := mp.api.PutMessage(ctx, m); err != nil { log.Warnf("mpooladd cs.PutMessage failed: %s", err) return err } - if _, err := mp.api.PutMessage(&m.Message); err != nil { + if _, err := mp.api.PutMessage(ctx, &m.Message); err != nil { log.Warnf("mpooladd cs.PutMessage failed: %s", err) return err } @@ -1216,7 +1216,7 @@ func (mp *MessagePool) HeadChange(ctx context.Context, revert []*types.TipSet, a mp.curTs = pts - msgs, err := mp.MessagesForBlocks(ts.Blocks()) + msgs, err := mp.MessagesForBlocks(ctx, ts.Blocks()) if err != nil { log.Errorf("error retrieving messages for reverted block: %s", err) merr = multierror.Append(merr, err) @@ -1232,7 +1232,7 @@ func (mp *MessagePool) HeadChange(ctx context.Context, revert []*types.TipSet, a mp.curTs = ts for _, b := range ts.Blocks() { - bmsgs, smsgs, err := mp.api.MessagesForBlock(b) + bmsgs, smsgs, err := mp.api.MessagesForBlock(ctx, b) if err != nil { xerr := xerrors.Errorf("failed to get messages for apply block %s(height %d) (msgroot = %s): %w", b.Cid(), b.Height, b.Messages, err) log.Errorf("error retrieving messages for block: %s", xerr) @@ -1368,7 +1368,7 @@ func (mp *MessagePool) runHeadChange(ctx context.Context, from *types.TipSet, to var merr error for _, ts := range revert { - msgs, err := mp.MessagesForBlocks(ts.Blocks()) + msgs, err := mp.MessagesForBlocks(ctx, ts.Blocks()) if err != nil { log.Errorf("error retrieving messages for reverted block: %s", err) merr = multierror.Append(merr, err) @@ -1382,7 +1382,7 @@ func (mp *MessagePool) runHeadChange(ctx context.Context, from *types.TipSet, to for _, ts := range apply { for _, b := range ts.Blocks() { - bmsgs, smsgs, err := mp.api.MessagesForBlock(b) + bmsgs, smsgs, err := mp.api.MessagesForBlock(ctx, b) if err != nil { xerr := xerrors.Errorf("failed to get messages for apply block %s(height %d) (msgroot = %s): %w", b.Cid(), b.Height, b.Messages, err) log.Errorf("error retrieving messages for block: %s", xerr) @@ -1407,11 +1407,11 @@ type statBucket struct { msgs map[uint64]*types.SignedMessage } -func (mp *MessagePool) MessagesForBlocks(blks []*types.BlockHeader) ([]*types.SignedMessage, error) { +func (mp *MessagePool) MessagesForBlocks(ctx context.Context, blks []*types.BlockHeader) ([]*types.SignedMessage, error) { out := make([]*types.SignedMessage, 0) for _, b := range blks { - bmsgs, smsgs, err := mp.api.MessagesForBlock(b) + bmsgs, smsgs, err := mp.api.MessagesForBlock(ctx, b) if err != nil { return nil, xerrors.Errorf("failed to get messages for apply block %s(height %d) (msgroot = %s): %w", b.Cid(), b.Height, b.Messages, err) } diff --git a/chain/messagepool/provider.go b/chain/messagepool/provider.go index 5a3a2ac2266..9dcff2b3341 100644 --- a/chain/messagepool/provider.go +++ b/chain/messagepool/provider.go @@ -23,12 +23,12 @@ var ( type Provider interface { SubscribeHeadChanges(func(rev, app []*types.TipSet) error) *types.TipSet - PutMessage(m types.ChainMsg) (cid.Cid, error) + PutMessage(ctx context.Context, m types.ChainMsg) (cid.Cid, error) PubSubPublish(string, []byte) error GetActorAfter(address.Address, *types.TipSet) (*types.Actor, error) StateAccountKeyAtFinality(context.Context, address.Address, *types.TipSet) (address.Address, error) - MessagesForBlock(*types.BlockHeader) ([]*types.Message, []*types.SignedMessage, error) - MessagesForTipset(*types.TipSet) ([]types.ChainMsg, error) + MessagesForBlock(context.Context, *types.BlockHeader) ([]*types.Message, []*types.SignedMessage, error) + MessagesForTipset(context.Context, *types.TipSet) ([]types.ChainMsg, error) LoadTipSet(ctx context.Context, tsk types.TipSetKey) (*types.TipSet, error) ChainComputeBaseFee(ctx context.Context, ts *types.TipSet) (types.BigInt, error) IsLite() bool @@ -66,8 +66,8 @@ func (mpp *mpoolProvider) SubscribeHeadChanges(cb func(rev, app []*types.TipSet) return mpp.sm.ChainStore().GetHeaviestTipSet() } -func (mpp *mpoolProvider) PutMessage(m types.ChainMsg) (cid.Cid, error) { - return mpp.sm.ChainStore().PutMessage(m) +func (mpp *mpoolProvider) PutMessage(ctx context.Context, m types.ChainMsg) (cid.Cid, error) { + return mpp.sm.ChainStore().PutMessage(ctx, m) } func (mpp *mpoolProvider) PubSubPublish(k string, v []byte) error { @@ -103,12 +103,12 @@ func (mpp *mpoolProvider) StateAccountKeyAtFinality(ctx context.Context, addr ad return mpp.sm.ResolveToKeyAddressAtFinality(ctx, addr, ts) } -func (mpp *mpoolProvider) MessagesForBlock(h *types.BlockHeader) ([]*types.Message, []*types.SignedMessage, error) { - return mpp.sm.ChainStore().MessagesForBlock(h) +func (mpp *mpoolProvider) MessagesForBlock(ctx context.Context, h *types.BlockHeader) ([]*types.Message, []*types.SignedMessage, error) { + return mpp.sm.ChainStore().MessagesForBlock(ctx, h) } -func (mpp *mpoolProvider) MessagesForTipset(ts *types.TipSet) ([]types.ChainMsg, error) { - return mpp.sm.ChainStore().MessagesForTipset(ts) +func (mpp *mpoolProvider) MessagesForTipset(ctx context.Context, ts *types.TipSet) ([]types.ChainMsg, error) { + return mpp.sm.ChainStore().MessagesForTipset(ctx, ts) } func (mpp *mpoolProvider) LoadTipSet(ctx context.Context, tsk types.TipSetKey) (*types.TipSet, error) { diff --git a/chain/stmgr/searchwait.go b/chain/stmgr/searchwait.go index 7d743dd0f54..7e6de91d451 100644 --- a/chain/stmgr/searchwait.go +++ b/chain/stmgr/searchwait.go @@ -20,7 +20,7 @@ func (sm *StateManager) WaitForMessage(ctx context.Context, mcid cid.Cid, confid ctx, cancel := context.WithCancel(ctx) defer cancel() - msg, err := sm.cs.GetCMessage(mcid) + msg, err := sm.cs.GetCMessage(ctx, mcid) if err != nil { return nil, nil, cid.Undef, fmt.Errorf("failed to load message: %w", err) } @@ -130,7 +130,7 @@ func (sm *StateManager) WaitForMessage(ctx context.Context, mcid cid.Cid, confid } func (sm *StateManager) SearchForMessage(ctx context.Context, head *types.TipSet, mcid cid.Cid, lookbackLimit abi.ChainEpoch, allowReplaced bool) (*types.TipSet, *types.MessageReceipt, cid.Cid, error) { - msg, err := sm.cs.GetCMessage(mcid) + msg, err := sm.cs.GetCMessage(ctx, mcid) if err != nil { return nil, nil, cid.Undef, fmt.Errorf("failed to load message: %w", err) } @@ -240,7 +240,7 @@ func (sm *StateManager) tipsetExecutedMessage(ctx context.Context, ts *types.Tip return nil, cid.Undef, err } - cm, err := sm.cs.MessagesForTipset(pts) + cm, err := sm.cs.MessagesForTipset(ctx, pts) if err != nil { return nil, cid.Undef, err } @@ -267,7 +267,7 @@ func (sm *StateManager) tipsetExecutedMessage(ctx context.Context, ts *types.Tip } } - pr, err := sm.cs.GetParentReceipt(ts.Blocks()[0], i) + pr, err := sm.cs.GetParentReceipt(ctx, ts.Blocks()[0], i) if err != nil { return nil, cid.Undef, err } diff --git a/chain/store/basefee.go b/chain/store/basefee.go index 33367abccbf..1d6b0760e9f 100644 --- a/chain/store/basefee.go +++ b/chain/store/basefee.go @@ -58,7 +58,7 @@ func (cs *ChainStore) ComputeBaseFee(ctx context.Context, ts *types.TipSet) (abi seen := make(map[cid.Cid]struct{}) for _, b := range ts.Blocks() { - msg1, msg2, err := cs.MessagesForBlock(b) + msg1, msg2, err := cs.MessagesForBlock(ctx, b) if err != nil { return zero, xerrors.Errorf("error getting messages for: %s: %w", b.Cid(), err) } diff --git a/chain/store/messages.go b/chain/store/messages.go index 6fc4d76b966..4dd3bfc1d9f 100644 --- a/chain/store/messages.go +++ b/chain/store/messages.go @@ -23,25 +23,25 @@ type storable interface { ToStorageBlock() (block.Block, error) } -func PutMessage(bs bstore.Blockstore, m storable) (cid.Cid, error) { +func PutMessage(ctx context.Context, bs bstore.Blockstore, m storable) (cid.Cid, error) { b, err := m.ToStorageBlock() if err != nil { return cid.Undef, err } - if err := bs.Put(context.TODO(), b); err != nil { + if err := bs.Put(ctx, b); err != nil { return cid.Undef, err } return b.Cid(), nil } -func (cs *ChainStore) PutMessage(m storable) (cid.Cid, error) { - return PutMessage(cs.chainBlockstore, m) +func (cs *ChainStore) PutMessage(ctx context.Context, m storable) (cid.Cid, error) { + return PutMessage(ctx, cs.chainBlockstore, m) } -func (cs *ChainStore) GetCMessage(c cid.Cid) (types.ChainMsg, error) { - m, err := cs.GetMessage(c) +func (cs *ChainStore) GetCMessage(ctx context.Context, c cid.Cid) (types.ChainMsg, error) { + m, err := cs.GetMessage(ctx, c) if err == nil { return m, nil } @@ -49,21 +49,21 @@ func (cs *ChainStore) GetCMessage(c cid.Cid) (types.ChainMsg, error) { log.Warnf("GetCMessage: unexpected error getting unsigned message: %s", err) } - return cs.GetSignedMessage(c) + return cs.GetSignedMessage(ctx, c) } -func (cs *ChainStore) GetMessage(c cid.Cid) (*types.Message, error) { +func (cs *ChainStore) GetMessage(ctx context.Context, c cid.Cid) (*types.Message, error) { var msg *types.Message - err := cs.chainLocalBlockstore.View(context.TODO(), c, func(b []byte) (err error) { + err := cs.chainLocalBlockstore.View(ctx, c, func(b []byte) (err error) { msg, err = types.DecodeMessage(b) return err }) return msg, err } -func (cs *ChainStore) GetSignedMessage(c cid.Cid) (*types.SignedMessage, error) { +func (cs *ChainStore) GetSignedMessage(ctx context.Context, c cid.Cid) (*types.SignedMessage, error) { var msg *types.SignedMessage - err := cs.chainLocalBlockstore.View(context.TODO(), c, func(b []byte) (err error) { + err := cs.chainLocalBlockstore.View(ctx, c, func(b []byte) (err error) { msg, err = types.DecodeSignedMessage(b) return err }) @@ -103,7 +103,7 @@ type BlockMessages struct { SecpkMessages []types.ChainMsg } -func (cs *ChainStore) BlockMsgsForTipset(ts *types.TipSet) ([]BlockMessages, error) { +func (cs *ChainStore) BlockMsgsForTipset(ctx context.Context, ts *types.TipSet) ([]BlockMessages, error) { // returned BlockMessages match block order in tipset applied := make(map[address.Address]uint64) @@ -142,7 +142,7 @@ func (cs *ChainStore) BlockMsgsForTipset(ts *types.TipSet) ([]BlockMessages, err var out []BlockMessages for _, b := range ts.Blocks() { - bms, sms, err := cs.MessagesForBlock(b) + bms, sms, err := cs.MessagesForBlock(ctx, b) if err != nil { return nil, xerrors.Errorf("failed to get messages for block: %w", err) } @@ -181,8 +181,8 @@ func (cs *ChainStore) BlockMsgsForTipset(ts *types.TipSet) ([]BlockMessages, err return out, nil } -func (cs *ChainStore) MessagesForTipset(ts *types.TipSet) ([]types.ChainMsg, error) { - bmsgs, err := cs.BlockMsgsForTipset(ts) +func (cs *ChainStore) MessagesForTipset(ctx context.Context, ts *types.TipSet) ([]types.ChainMsg, error) { + bmsgs, err := cs.BlockMsgsForTipset(ctx, ts) if err != nil { return nil, err } @@ -206,7 +206,7 @@ type mmCids struct { secpk []cid.Cid } -func (cs *ChainStore) ReadMsgMetaCids(mmc cid.Cid) ([]cid.Cid, []cid.Cid, error) { +func (cs *ChainStore) ReadMsgMetaCids(ctx context.Context, mmc cid.Cid) ([]cid.Cid, []cid.Cid, error) { o, ok := cs.mmCache.Get(mmc) if ok { mmcids := o.(*mmCids) @@ -215,7 +215,7 @@ func (cs *ChainStore) ReadMsgMetaCids(mmc cid.Cid) ([]cid.Cid, []cid.Cid, error) cst := cbor.NewCborStore(cs.chainLocalBlockstore) var msgmeta types.MsgMeta - if err := cst.Get(context.TODO(), mmc, &msgmeta); err != nil { + if err := cst.Get(ctx, mmc, &msgmeta); err != nil { return nil, nil, xerrors.Errorf("failed to load msgmeta (%s): %w", mmc, err) } @@ -237,18 +237,18 @@ func (cs *ChainStore) ReadMsgMetaCids(mmc cid.Cid) ([]cid.Cid, []cid.Cid, error) return blscids, secpkcids, nil } -func (cs *ChainStore) MessagesForBlock(b *types.BlockHeader) ([]*types.Message, []*types.SignedMessage, error) { - blscids, secpkcids, err := cs.ReadMsgMetaCids(b.Messages) +func (cs *ChainStore) MessagesForBlock(ctx context.Context, b *types.BlockHeader) ([]*types.Message, []*types.SignedMessage, error) { + blscids, secpkcids, err := cs.ReadMsgMetaCids(ctx, b.Messages) if err != nil { return nil, nil, err } - blsmsgs, err := cs.LoadMessagesFromCids(blscids) + blsmsgs, err := cs.LoadMessagesFromCids(ctx, blscids) if err != nil { return nil, nil, xerrors.Errorf("loading bls messages for block: %w", err) } - secpkmsgs, err := cs.LoadSignedMessagesFromCids(secpkcids) + secpkmsgs, err := cs.LoadSignedMessagesFromCids(ctx, secpkcids) if err != nil { return nil, nil, xerrors.Errorf("loading secpk messages for block: %w", err) } @@ -256,8 +256,7 @@ func (cs *ChainStore) MessagesForBlock(b *types.BlockHeader) ([]*types.Message, return blsmsgs, secpkmsgs, nil } -func (cs *ChainStore) GetParentReceipt(b *types.BlockHeader, i int) (*types.MessageReceipt, error) { - ctx := context.TODO() +func (cs *ChainStore) GetParentReceipt(ctx context.Context, b *types.BlockHeader, i int) (*types.MessageReceipt, error) { // block headers use adt0, for now. a, err := blockadt.AsArray(cs.ActorStore(ctx), b.ParentMessageReceipts) if err != nil { @@ -274,10 +273,10 @@ func (cs *ChainStore) GetParentReceipt(b *types.BlockHeader, i int) (*types.Mess return &r, nil } -func (cs *ChainStore) LoadMessagesFromCids(cids []cid.Cid) ([]*types.Message, error) { +func (cs *ChainStore) LoadMessagesFromCids(ctx context.Context, cids []cid.Cid) ([]*types.Message, error) { msgs := make([]*types.Message, 0, len(cids)) for i, c := range cids { - m, err := cs.GetMessage(c) + m, err := cs.GetMessage(ctx, c) if err != nil { return nil, xerrors.Errorf("failed to get message: (%s):%d: %w", c, i, err) } @@ -288,10 +287,10 @@ func (cs *ChainStore) LoadMessagesFromCids(cids []cid.Cid) ([]*types.Message, er return msgs, nil } -func (cs *ChainStore) LoadSignedMessagesFromCids(cids []cid.Cid) ([]*types.SignedMessage, error) { +func (cs *ChainStore) LoadSignedMessagesFromCids(ctx context.Context, cids []cid.Cid) ([]*types.SignedMessage, error) { msgs := make([]*types.SignedMessage, 0, len(cids)) for i, c := range cids { - m, err := cs.GetSignedMessage(c) + m, err := cs.GetSignedMessage(ctx, c) if err != nil { return nil, xerrors.Errorf("failed to get message: (%s):%d: %w", c, i, err) } diff --git a/chain/store/snapshot.go b/chain/store/snapshot.go index a3841389ebc..61fa8bdc876 100644 --- a/chain/store/snapshot.go +++ b/chain/store/snapshot.go @@ -43,8 +43,7 @@ func (cs *ChainStore) Export(ctx context.Context, ts *types.TipSet, inclRecentRo }) } -func (cs *ChainStore) Import(r io.Reader) (*types.TipSet, error) { - ctx := context.TODO() +func (cs *ChainStore) Import(ctx context.Context, r io.Reader) (*types.TipSet, error) { // TODO: writing only to the state blockstore is incorrect. // At this time, both the state and chain blockstores are backed by the // universal store. When we physically segregate the stores, we will need diff --git a/chain/store/store.go b/chain/store/store.go index a247379448f..d86a66f1285 100644 --- a/chain/store/store.go +++ b/chain/store/store.go @@ -1108,11 +1108,11 @@ func (cs *ChainStore) ActorStore(ctx context.Context) adt.Store { return ActorStore(ctx, cs.stateBlockstore) } -func (cs *ChainStore) TryFillTipSet(ts *types.TipSet) (*FullTipSet, error) { +func (cs *ChainStore) TryFillTipSet(ctx context.Context, ts *types.TipSet) (*FullTipSet, error) { var out []*types.FullBlock for _, b := range ts.Blocks() { - bmsgs, smsgs, err := cs.MessagesForBlock(b) + bmsgs, smsgs, err := cs.MessagesForBlock(ctx, b) if err != nil { // TODO: check for 'not found' errors, and only return nil if this // is actually a 'not found' error diff --git a/chain/sync.go b/chain/sync.go index f6824c389f9..0293ae25ecb 100644 --- a/chain/sync.go +++ b/chain/sync.go @@ -298,11 +298,11 @@ func (syncer *Syncer) ValidateMsgMeta(fblk *types.FullBlock) error { // into the blockstore. blockstore := bstore.NewMemory() cst := cbor.NewCborStore(blockstore) - + ctx := context.Background() var bcids, scids []cid.Cid for _, m := range fblk.BlsMessages { - c, err := store.PutMessage(blockstore, m) + c, err := store.PutMessage(ctx, blockstore, m) if err != nil { return xerrors.Errorf("putting bls message to blockstore after msgmeta computation: %w", err) } @@ -310,7 +310,7 @@ func (syncer *Syncer) ValidateMsgMeta(fblk *types.FullBlock) error { } for _, m := range fblk.SecpkMessages { - c, err := store.PutMessage(blockstore, m) + c, err := store.PutMessage(ctx, blockstore, m) if err != nil { return xerrors.Errorf("putting bls message to blockstore after msgmeta computation: %w", err) } @@ -482,7 +482,7 @@ func (syncer *Syncer) tryLoadFullTipSet(ctx context.Context, tsk types.TipSetKey fts := &store.FullTipSet{} for _, b := range ts.Blocks() { - bmsgs, smsgs, err := syncer.store.MessagesForBlock(b) + bmsgs, smsgs, err := syncer.store.MessagesForBlock(ctx, b) if err != nil { return nil, err } @@ -965,7 +965,7 @@ func (syncer *Syncer) iterFullTipsets(ctx context.Context, headers []*types.TipS span.AddAttributes(trace.Int64Attribute("num_headers", int64(len(headers)))) for i := len(headers) - 1; i >= 0; { - fts, err := syncer.store.TryFillTipSet(headers[i]) + fts, err := syncer.store.TryFillTipSet(ctx, headers[i]) if err != nil { return err } @@ -1138,7 +1138,7 @@ func persistMessages(ctx context.Context, bs bstore.Blockstore, bst *exchange.Co for _, m := range bst.Bls { //log.Infof("putting BLS message: %s", m.Cid()) - if _, err := store.PutMessage(bs, m); err != nil { + if _, err := store.PutMessage(ctx, bs, m); err != nil { log.Errorf("failed to persist messages: %+v", err) return xerrors.Errorf("BLS message processing failed: %w", err) } @@ -1148,7 +1148,7 @@ func persistMessages(ctx context.Context, bs bstore.Blockstore, bst *exchange.Co return xerrors.Errorf("unknown signature type on message %s: %q", m.Cid(), m.Signature.Type) } //log.Infof("putting secp256k1 message: %s", m.Cid()) - if _, err := store.PutMessage(bs, m); err != nil { + if _, err := store.PutMessage(ctx, bs, m); err != nil { log.Errorf("failed to persist messages: %+v", err) return xerrors.Errorf("secp256k1 message processing failed: %w", err) } diff --git a/cmd/lotus-bench/import.go b/cmd/lotus-bench/import.go index 98dcb2fb589..18ce6c7ef6a 100644 --- a/cmd/lotus-bench/import.go +++ b/cmd/lotus-bench/import.go @@ -304,7 +304,7 @@ var importBenchCmd = &cli.Command{ return fmt.Errorf("no CAR file provided for import") } - head, err = cs.Import(carFile) + head, err = cs.Import(cctx.Context, carFile) if err != nil { return err } @@ -327,7 +327,7 @@ var importBenchCmd = &cli.Command{ return xerrors.Errorf("failed to parse head tipset key: %w", err) } - head, err = cs.LoadTipSet(context.Background(), types.NewTipSetKey(cids...)) + head, err = cs.LoadTipSet(cctx.Context, types.NewTipSetKey(cids...)) if err != nil { return err } @@ -336,7 +336,7 @@ var importBenchCmd = &cli.Command{ if err != nil { return err } - head, err = cs.LoadTipSet(context.Background(), types.NewTipSetKey(cr.Header.Roots...)) + head, err = cs.LoadTipSet(cctx.Context, types.NewTipSetKey(cr.Header.Roots...)) if err != nil { return err } @@ -353,7 +353,7 @@ var importBenchCmd = &cli.Command{ if cids, err = lcli.ParseTipSetString(tsk); err != nil { return xerrors.Errorf("failed to parse genesis tipset key: %w", err) } - genesis, err = cs.LoadTipSet(context.Background(), types.NewTipSetKey(cids...)) + genesis, err = cs.LoadTipSet(cctx.Context, types.NewTipSetKey(cids...)) } else { log.Warnf("getting genesis by height; this will be slow; pass in the genesis tipset through --genesis-tipset") // fallback to the slow path of walking the chain. @@ -364,7 +364,7 @@ var importBenchCmd = &cli.Command{ return err } - if err = cs.SetGenesis(context.Background(), genesis.Blocks()[0]); err != nil { + if err = cs.SetGenesis(cctx.Context, genesis.Blocks()[0]); err != nil { return err } @@ -375,10 +375,10 @@ var importBenchCmd = &cli.Command{ if cids, err = lcli.ParseTipSetString(tsk); err != nil { return xerrors.Errorf("failed to end genesis tipset key: %w", err) } - end, err = cs.LoadTipSet(context.Background(), types.NewTipSetKey(cids...)) + end, err = cs.LoadTipSet(cctx.Context, types.NewTipSetKey(cids...)) } else if h := cctx.Int64("end-height"); h != 0 { log.Infof("getting end tipset at height %d...", h) - end, err = cs.GetTipsetByHeight(context.TODO(), abi.ChainEpoch(h), head, true) + end, err = cs.GetTipsetByHeight(cctx.Context, abi.ChainEpoch(h), head, true) } if err != nil { @@ -397,7 +397,7 @@ var importBenchCmd = &cli.Command{ if cids, err = lcli.ParseTipSetString(tsk); err != nil { return xerrors.Errorf("failed to start genesis tipset key: %w", err) } - start, err = cs.LoadTipSet(context.Background(), types.NewTipSetKey(cids...)) + start, err = cs.LoadTipSet(cctx.Context, types.NewTipSetKey(cids...)) } else if h := cctx.Int64("start-height"); h != 0 { log.Infof("getting start tipset at height %d...", h) // lookback from the end tipset (which falls back to head if not supplied). @@ -410,7 +410,7 @@ var importBenchCmd = &cli.Command{ if start != nil { startEpoch = start.Height() - if err := cs.ForceHeadSilent(context.Background(), start); err != nil { + if err := cs.ForceHeadSilent(cctx.Context, start); err != nil { // if err := cs.SetHead(start); err != nil { return err } @@ -421,7 +421,7 @@ var importBenchCmd = &cli.Command{ if h := ts.Height(); h%100 == 0 { log.Infof("walking back the chain; loaded tipset at height %d...", h) } - next, err := cs.LoadTipSet(context.Background(), ts.Parents()) + next, err := cs.LoadTipSet(cctx.Context, ts.Parents()) if err != nil { return err } diff --git a/cmd/lotus-miner/init.go b/cmd/lotus-miner/init.go index adc59f0f90a..ae742c66301 100644 --- a/cmd/lotus-miner/init.go +++ b/cmd/lotus-miner/init.go @@ -347,7 +347,7 @@ func migratePreSealMeta(ctx context.Context, api v1api.FullNode, metadata string return err } - if err := mds.Put(context.Background(), sectorKey, b); err != nil { + if err := mds.Put(ctx, sectorKey, b); err != nil { return err } @@ -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(context.Background(), datastore.NewKey(modules.StorageCounterDSPrefix), buf[:size]) + return mds.Put(ctx, datastore.NewKey(modules.StorageCounterDSPrefix), buf[:size]) } func findMarketDealID(ctx context.Context, api v1api.FullNode, deal market2.DealProposal) (abi.DealID, error) { @@ -428,7 +428,7 @@ func storageMinerInit(ctx context.Context, cctx *cli.Context, api v1api.FullNode return xerrors.Errorf("peer ID from private key: %w", err) } - mds, err := lr.Datastore(context.TODO(), "/metadata") + mds, err := lr.Datastore(ctx, "/metadata") if err != nil { return err } @@ -441,7 +441,7 @@ func storageMinerInit(ctx context.Context, cctx *cli.Context, api v1api.FullNode } if cctx.Bool("genesis-miner") { - if err := mds.Put(context.Background(), datastore.NewKey("miner-address"), a.Bytes()); err != nil { + if err := mds.Put(ctx, datastore.NewKey("miner-address"), a.Bytes()); err != nil { return err } @@ -548,7 +548,7 @@ func storageMinerInit(ctx context.Context, cctx *cli.Context, api v1api.FullNode } log.Infof("Created new miner: %s", addr) - if err := mds.Put(context.Background(), datastore.NewKey("miner-address"), addr.Bytes()); err != nil { + if err := mds.Put(ctx, datastore.NewKey("miner-address"), addr.Bytes()); err != nil { return err } diff --git a/cmd/lotus-miner/init_restore.go b/cmd/lotus-miner/init_restore.go index 84a2f38385d..1aaa7909a93 100644 --- a/cmd/lotus-miner/init_restore.go +++ b/cmd/lotus-miner/init_restore.go @@ -233,7 +233,7 @@ func restore(ctx context.Context, cctx *cli.Context, targetPath string, strConfi log.Info("Restoring metadata backup") - mds, err := lr.Datastore(context.TODO(), "/metadata") + mds, err := lr.Datastore(ctx, "/metadata") if err != nil { return err } @@ -255,7 +255,7 @@ func restore(ctx context.Context, cctx *cli.Context, targetPath string, strConfi log.Info("Checking actor metadata") - abytes, err := mds.Get(context.Background(), datastore.NewKey("miner-address")) + abytes, err := mds.Get(ctx, datastore.NewKey("miner-address")) if err != nil { return xerrors.Errorf("getting actor address from metadata datastore: %w", err) } diff --git a/cmd/lotus-sim/simulation/messages.go b/cmd/lotus-sim/simulation/messages.go index 5bed2743670..d6dd98d4382 100644 --- a/cmd/lotus-sim/simulation/messages.go +++ b/cmd/lotus-sim/simulation/messages.go @@ -31,7 +31,7 @@ func (sim *Simulation) storeMessages(ctx context.Context, messages []*types.Mess // fail a pre-commit... var msgCids []cid.Cid for _, msg := range messages { - c, err := sim.Node.Chainstore.PutMessage(msg) + c, err := sim.Node.Chainstore.PutMessage(ctx, msg) if err != nil { return cid.Undef, err } diff --git a/cmd/lotus-sim/simulation/simulation.go b/cmd/lotus-sim/simulation/simulation.go index 51404220e3e..5747afe4d17 100644 --- a/cmd/lotus-sim/simulation/simulation.go +++ b/cmd/lotus-sim/simulation/simulation.go @@ -90,7 +90,7 @@ type Simulation struct { // loadConfig loads a simulation's config from the datastore. This must be called on startup and may // be called to restore the config from-disk. func (sim *Simulation) loadConfig() error { - configBytes, err := sim.Node.MetadataDS.Get(context.Background(), sim.key("config")) + configBytes, err := sim.Node.MetadataDS.Get(context.TODO(), sim.key("config")) if err == nil { err = json.Unmarshal(configBytes, &sim.config) } @@ -111,7 +111,7 @@ func (sim *Simulation) saveConfig() error { if err != nil { return err } - return sim.Node.MetadataDS.Put(context.Background(), sim.key("config"), buf) + return sim.Node.MetadataDS.Put(context.TODO(), sim.key("config"), buf) } var simulationPrefix = datastore.NewKey("/simulation") @@ -124,7 +124,7 @@ func (sim *Simulation) key(subkey string) datastore.Key { // loadNamedTipSet the tipset with the given name (for this simulation) func (sim *Simulation) loadNamedTipSet(name string) (*types.TipSet, error) { - tskBytes, err := sim.Node.MetadataDS.Get(context.Background(), sim.key(name)) + tskBytes, err := sim.Node.MetadataDS.Get(context.TODO(), sim.key(name)) if err != nil { return nil, xerrors.Errorf("failed to load tipset %s/%s: %w", sim.name, name, err) } @@ -132,7 +132,7 @@ func (sim *Simulation) loadNamedTipSet(name string) (*types.TipSet, error) { if err != nil { return nil, xerrors.Errorf("failed to parse tipste %v (%s/%s): %w", tskBytes, sim.name, name, err) } - ts, err := sim.Node.Chainstore.LoadTipSet(context.Background(), tsk) + ts, err := sim.Node.Chainstore.LoadTipSet(context.TODO(), tsk) if err != nil { return nil, xerrors.Errorf("failed to load tipset %s (%s/%s): %w", tsk, sim.name, name, err) } @@ -141,7 +141,7 @@ func (sim *Simulation) loadNamedTipSet(name string) (*types.TipSet, error) { // storeNamedTipSet stores the tipset at name (relative to the simulation). func (sim *Simulation) storeNamedTipSet(name string, ts *types.TipSet) error { - if err := sim.Node.MetadataDS.Put(context.Background(), sim.key(name), ts.Key().Bytes()); err != nil { + if err := sim.Node.MetadataDS.Put(context.TODO(), sim.key(name), ts.Key().Bytes()); err != nil { return xerrors.Errorf("failed to store tipset (%s/%s): %w", sim.name, name, err) } return nil @@ -342,7 +342,7 @@ func (sim *Simulation) Walk( break } - msgs, err := sim.Node.Chainstore.MessagesForTipset(job.ts) + msgs, err := sim.Node.Chainstore.MessagesForTipset(ctx, job.ts) if err != nil { return err } diff --git a/cmd/lotus/backup.go b/cmd/lotus/backup.go index 245a3d397b1..4bdd213228d 100644 --- a/cmd/lotus/backup.go +++ b/cmd/lotus/backup.go @@ -1,7 +1,6 @@ package main import ( - "context" "os" dstore "github.com/ipfs/go-datastore" @@ -88,7 +87,7 @@ func restore(cctx *cli.Context, r repo.Repo) error { log.Info("Restoring metadata backup") - mds, err := lr.Datastore(context.TODO(), "/metadata") + mds, err := lr.Datastore(cctx.Context, "/metadata") if err != nil { return err } @@ -111,10 +110,10 @@ func restore(cctx *cli.Context, r repo.Repo) error { log.Info("Resetting chainstore metadata") chainHead := dstore.NewKey("head") - if err := mds.Delete(context.Background(), chainHead); err != nil { + if err := mds.Delete(cctx.Context, chainHead); err != nil { return xerrors.Errorf("clearing chain head: %w", err) } - if err := store.FlushValidationCache(context.Background(), mds); err != nil { + if err := store.FlushValidationCache(cctx.Context, mds); err != nil { return xerrors.Errorf("clearing chain validation cache: %w", err) } diff --git a/cmd/lotus/daemon.go b/cmd/lotus/daemon.go index bcf3b119e17..813a0a9bd9f 100644 --- a/cmd/lotus/daemon.go +++ b/cmd/lotus/daemon.go @@ -474,7 +474,7 @@ func ImportChain(ctx context.Context, r repo.Repo, fname string, snapshot bool) return xerrors.Errorf("failed to open blockstore: %w", err) } - mds, err := lr.Datastore(context.TODO(), "/metadata") + mds, err := lr.Datastore(ctx, "/metadata") if err != nil { return err } @@ -499,14 +499,14 @@ func ImportChain(ctx context.Context, r repo.Repo, fname string, snapshot bool) bar.Units = pb.U_BYTES bar.Start() - ts, err := cst.Import(br) + ts, err := cst.Import(ctx, br) bar.Finish() if err != nil { return xerrors.Errorf("importing chain failed: %w", err) } - if err := cst.FlushValidationCache(context.Background()); err != nil { + if err := cst.FlushValidationCache(ctx); err != nil { return xerrors.Errorf("flushing validation cache failed: %w", err) } @@ -515,7 +515,7 @@ func ImportChain(ctx context.Context, r repo.Repo, fname string, snapshot bool) return err } - err = cst.SetGenesis(context.Background(), gb.Blocks()[0]) + err = cst.SetGenesis(ctx, gb.Blocks()[0]) if err != nil { return err } diff --git a/conformance/runner.go b/conformance/runner.go index 86cc56f853e..e597f0bbefd 100644 --- a/conformance/runner.go +++ b/conformance/runner.go @@ -282,7 +282,7 @@ func writeStateToTempCAR(bs blockstore.Blockstore, roots ...cid.Cid) (string, er continue } // ignore things we don't have, the state tree is incomplete. - if has, err := bs.Has(context.Background(), link.Cid); err != nil { + if has, err := bs.Has(context.TODO(), link.Cid); err != nil { return nil, err } else if has { out = append(out, link) @@ -317,7 +317,7 @@ func LoadBlockstore(vectorCAR schema.Base64EncodedBytes) (blockstore.Blockstore, defer r.Close() // nolint // Load the CAR embedded in the test vector into the Blockstore. - _, err = car.LoadCar(context.Background(), bs, r) + _, err = car.LoadCar(context.TODO(), bs, r) if err != nil { return nil, fmt.Errorf("failed to load state tree car from test vector: %s", err) } diff --git a/node/impl/full/chain.go b/node/impl/full/chain.go index e3730442986..ce492f94ae0 100644 --- a/node/impl/full/chain.go +++ b/node/impl/full/chain.go @@ -116,7 +116,7 @@ func (m *ChainModule) ChainGetBlockMessages(ctx context.Context, msg cid.Cid) (* return nil, err } - bmsgs, smsgs, err := m.Chain.MessagesForBlock(b) + bmsgs, smsgs, err := m.Chain.MessagesForBlock(ctx, b) if err != nil { return nil, err } @@ -159,7 +159,7 @@ func (a *ChainAPI) ChainGetParentMessages(ctx context.Context, bcid cid.Cid) ([] return nil, err } - cm, err := a.Chain.MessagesForTipset(pts) + cm, err := a.Chain.MessagesForTipset(ctx, pts) if err != nil { return nil, err } @@ -191,14 +191,14 @@ func (a *ChainAPI) ChainGetParentReceipts(ctx context.Context, bcid cid.Cid) ([] return nil, err } - cm, err := a.Chain.MessagesForTipset(pts) + cm, err := a.Chain.MessagesForTipset(ctx, pts) if err != nil { return nil, err } var out []*types.MessageReceipt for i := 0; i < len(cm); i++ { - r, err := a.Chain.GetParentReceipt(b, i) + r, err := a.Chain.GetParentReceipt(ctx, b, i) if err != nil { return nil, err } @@ -220,7 +220,7 @@ func (a *ChainAPI) ChainGetMessagesInTipset(ctx context.Context, tsk types.TipSe return nil, nil } - cm, err := a.Chain.MessagesForTipset(ts) + cm, err := a.Chain.MessagesForTipset(ctx, ts) if err != nil { return nil, err } @@ -577,7 +577,7 @@ func (a *ChainAPI) ChainGetNode(ctx context.Context, p string) (*api.IpldObject, } func (m *ChainModule) ChainGetMessage(ctx context.Context, mc cid.Cid) (*types.Message, error) { - cm, err := m.Chain.GetCMessage(mc) + cm, err := m.Chain.GetCMessage(ctx, mc) if err != nil { return nil, err } diff --git a/node/impl/full/gas.go b/node/impl/full/gas.go index c4c1bd58029..dd1e8d5ea58 100644 --- a/node/impl/full/gas.go +++ b/node/impl/full/gas.go @@ -82,14 +82,14 @@ type GasMeta struct { Limit int64 } -func (g *GasPriceCache) GetTSGasStats(cstore *store.ChainStore, ts *types.TipSet) ([]GasMeta, error) { +func (g *GasPriceCache) GetTSGasStats(ctx context.Context, cstore *store.ChainStore, ts *types.TipSet) ([]GasMeta, error) { i, has := g.c.Get(ts.Key()) if has { return i.([]GasMeta), nil } var prices []GasMeta - msgs, err := cstore.MessagesForTipset(ts) + msgs, err := cstore.MessagesForTipset(ctx, ts) if err != nil { return nil, xerrors.Errorf("loading messages: %w", err) } @@ -204,7 +204,7 @@ func gasEstimateGasPremium(ctx context.Context, cstore *store.ChainStore, cache } blocks += len(pts.Blocks()) - meta, err := cache.GetTSGasStats(cstore, pts) + meta, err := cache.GetTSGasStats(ctx, cstore, pts) if err != nil { return types.BigInt{}, err } diff --git a/node/impl/full/mpool.go b/node/impl/full/mpool.go index 6e1873d5b77..afff871ca8e 100644 --- a/node/impl/full/mpool.go +++ b/node/impl/full/mpool.go @@ -87,7 +87,7 @@ func (a *MpoolAPI) MpoolPending(ctx context.Context, tsk types.TipSetKey) ([]*ty // different blocks in tipsets of the same height // we exclude messages that have been included in blocks in the mpool tipset - have, err := a.Mpool.MessagesForBlocks(mpts.Blocks()) + have, err := a.Mpool.MessagesForBlocks(ctx, mpts.Blocks()) if err != nil { return nil, xerrors.Errorf("getting messages for base ts: %w", err) } @@ -97,7 +97,7 @@ func (a *MpoolAPI) MpoolPending(ctx context.Context, tsk types.TipSetKey) ([]*ty } } - msgs, err := a.Mpool.MessagesForBlocks(ts.Blocks()) + msgs, err := a.Mpool.MessagesForBlocks(ctx, ts.Blocks()) if err != nil { return nil, xerrors.Errorf(": %w", err) } diff --git a/node/impl/full/state.go b/node/impl/full/state.go index 7a96af15075..24cc08c8cb2 100644 --- a/node/impl/full/state.go +++ b/node/impl/full/state.go @@ -556,7 +556,7 @@ func (m *StateModule) StateWaitMsg(ctx context.Context, msg cid.Cid, confidence var returndec interface{} if recpt.ExitCode == 0 && len(recpt.Return) > 0 { - cmsg, err := m.Chain.GetCMessage(msg) + cmsg, err := m.Chain.GetCMessage(ctx, msg) if err != nil { return nil, xerrors.Errorf("failed to load message after successful receipt search: %w", err) } @@ -874,7 +874,7 @@ func (a *StateAPI) StateListMessages(ctx context.Context, match *api.MessageMatc var out []cid.Cid for ts.Height() >= toheight { - msgs, err := a.Chain.MessagesForTipset(ts) + msgs, err := a.Chain.MessagesForTipset(ctx, ts) if err != nil { return nil, xerrors.Errorf("failed to get messages for tipset (%s): %w", ts.Key(), err) } diff --git a/node/impl/full/sync.go b/node/impl/full/sync.go index 25f7c784a37..bd7de65b150 100644 --- a/node/impl/full/sync.go +++ b/node/impl/full/sync.go @@ -64,12 +64,12 @@ func (a *SyncAPI) SyncSubmitBlock(ctx context.Context, blk *types.BlockMsg) erro } // TODO: should we have some sort of fast path to adding a local block? - bmsgs, err := a.Syncer.ChainStore().LoadMessagesFromCids(blk.BlsMessages) + bmsgs, err := a.Syncer.ChainStore().LoadMessagesFromCids(ctx, blk.BlsMessages) if err != nil { return xerrors.Errorf("failed to load bls messages: %w", err) } - smsgs, err := a.Syncer.ChainStore().LoadSignedMessagesFromCids(blk.SecpkMessages) + smsgs, err := a.Syncer.ChainStore().LoadSignedMessagesFromCids(ctx, blk.SecpkMessages) if err != nil { return xerrors.Errorf("failed to load secpk message: %w", err) } @@ -142,7 +142,7 @@ func (a *SyncAPI) SyncValidateTipset(ctx context.Context, tsk types.TipSetKey) ( return false, err } - fts, err := a.Syncer.ChainStore().TryFillTipSet(ts) + fts, err := a.Syncer.ChainStore().TryFillTipSet(ctx, ts) if err != nil { return false, err } diff --git a/node/modules/chain.go b/node/modules/chain.go index d79cd103800..ff957c9ad55 100644 --- a/node/modules/chain.go +++ b/node/modules/chain.go @@ -30,7 +30,7 @@ import ( ) // ChainBitswap uses a blockstore that bypasses all caches. -func ChainBitswap(mctx helpers.MetricsCtx, lc fx.Lifecycle, host host.Host, rt routing.Routing, bs dtypes.ExposedBlockstore) dtypes.ChainBitswap { +func ChainBitswap(lc fx.Lifecycle, mctx helpers.MetricsCtx, host host.Host, rt routing.Routing, bs dtypes.ExposedBlockstore) dtypes.ChainBitswap { // prefix protocol for chain bitswap // (so bitswap uses /chain/ipfs/bitswap/1.0.0 internally for chain sync stuff) bitswapNetwork := network.NewFromIpfsHost(host, rt, network.Prefix("/chain")) @@ -58,8 +58,8 @@ func ChainBlockService(bs dtypes.ExposedBlockstore, rem dtypes.ChainBitswap) dty return blockservice.New(bs, rem) } -func MessagePool(lc fx.Lifecycle, us stmgr.UpgradeSchedule, mpp messagepool.Provider, ds dtypes.MetadataDS, nn dtypes.NetworkName, j journal.Journal, protector dtypes.GCReferenceProtector) (*messagepool.MessagePool, error) { - mp, err := messagepool.New(context.Background(), mpp, ds, us, nn, j) +func MessagePool(lc fx.Lifecycle, mctx helpers.MetricsCtx, us stmgr.UpgradeSchedule, mpp messagepool.Provider, ds dtypes.MetadataDS, nn dtypes.NetworkName, j journal.Journal, protector dtypes.GCReferenceProtector) (*messagepool.MessagePool, error) { + mp, err := messagepool.New(helpers.LifecycleCtx(mctx, lc), mpp, ds, us, nn, j) if err != nil { return nil, xerrors.Errorf("constructing mpool: %w", err) } @@ -73,6 +73,7 @@ func MessagePool(lc fx.Lifecycle, us stmgr.UpgradeSchedule, mpp messagepool.Prov } func ChainStore(lc fx.Lifecycle, + mctx helpers.MetricsCtx, cbs dtypes.ChainBlockstore, sbs dtypes.StateBlockstore, ds dtypes.MetadataDS, @@ -83,7 +84,7 @@ func ChainStore(lc fx.Lifecycle, chain := store.NewChainStore(cbs, sbs, ds, weight, j) - if err := chain.Load(context.Background()); err != nil { + if err := chain.Load(helpers.LifecycleCtx(mctx, lc)); err != nil { log.Warnf("loading chain state from disk: %s", err) } diff --git a/node/modules/client.go b/node/modules/client.go index 1de4f63e8a6..86063b8d988 100644 --- a/node/modules/client.go +++ b/node/modules/client.go @@ -40,11 +40,12 @@ import ( "github.com/filecoin-project/lotus/node/impl/full" payapi "github.com/filecoin-project/lotus/node/impl/paych" "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/node/repo/imports" ) -func HandleMigrateClientFunds(lc fx.Lifecycle, ds dtypes.MetadataDS, wallet full.WalletAPI, fundMgr *market.FundManager) { +func HandleMigrateClientFunds(lc fx.Lifecycle, mctx helpers.MetricsCtx, ds dtypes.MetadataDS, wallet full.WalletAPI, fundMgr *market.FundManager) { lc.Append(fx.Hook{ OnStart: func(ctx context.Context) error { addr, err := wallet.WalletDefaultAddress(ctx) @@ -52,7 +53,7 @@ func HandleMigrateClientFunds(lc fx.Lifecycle, ds dtypes.MetadataDS, wallet full if err != nil { return nil } - b, err := ds.Get(context.Background(), datastore.NewKey("/marketfunds/client")) + b, err := ds.Get(helpers.LifecycleCtx(mctx, lc), datastore.NewKey("/marketfunds/client")) if err != nil { if xerrors.Is(err, datastore.ErrNotFound) { return nil @@ -73,7 +74,7 @@ func HandleMigrateClientFunds(lc fx.Lifecycle, ds dtypes.MetadataDS, wallet full return nil } - return ds.Delete(context.Background(), datastore.NewKey("/marketfunds/client")) + return ds.Delete(helpers.LifecycleCtx(mctx, lc), datastore.NewKey("/marketfunds/client")) }, }) } diff --git a/node/modules/genesis.go b/node/modules/genesis.go index 77cf8e353b8..03b4e2907ef 100644 --- a/node/modules/genesis.go +++ b/node/modules/genesis.go @@ -2,9 +2,10 @@ package modules import ( "bytes" - "context" "os" + "go.uber.org/fx" + "github.com/ipfs/go-datastore" "github.com/ipld/go-car" "golang.org/x/xerrors" @@ -12,6 +13,7 @@ import ( "github.com/filecoin-project/lotus/chain/store" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/node/modules/dtypes" + "github.com/filecoin-project/lotus/node/modules/helpers" ) func ErrorGenesis() Genesis { @@ -20,17 +22,18 @@ func ErrorGenesis() Genesis { } } -func LoadGenesis(genBytes []byte) func(dtypes.ChainBlockstore) Genesis { - return func(bs dtypes.ChainBlockstore) Genesis { +func LoadGenesis(genBytes []byte) func(fx.Lifecycle, helpers.MetricsCtx, dtypes.ChainBlockstore) Genesis { + return func(lc fx.Lifecycle, mctx helpers.MetricsCtx, bs dtypes.ChainBlockstore) Genesis { return func() (header *types.BlockHeader, e error) { - c, err := car.LoadCar(context.Background(), bs, bytes.NewReader(genBytes)) + ctx := helpers.LifecycleCtx(mctx, lc) + c, err := car.LoadCar(ctx, bs, bytes.NewReader(genBytes)) if err != nil { return nil, xerrors.Errorf("loading genesis car file failed: %w", err) } if len(c.Roots) != 1 { return nil, xerrors.New("expected genesis file to have one root") } - root, err := bs.Get(context.Background(), c.Roots[0]) + root, err := bs.Get(ctx, c.Roots[0]) if err != nil { return nil, err } @@ -46,8 +49,9 @@ func LoadGenesis(genBytes []byte) func(dtypes.ChainBlockstore) Genesis { func DoSetGenesis(_ dtypes.AfterGenesisSet) {} -func SetGenesis(cs *store.ChainStore, g Genesis) (dtypes.AfterGenesisSet, error) { - genFromRepo, err := cs.GetGenesis(context.Background()) +func SetGenesis(lc fx.Lifecycle, mctx helpers.MetricsCtx, cs *store.ChainStore, g Genesis) (dtypes.AfterGenesisSet, error) { + ctx := helpers.LifecycleCtx(mctx, lc) + genFromRepo, err := cs.GetGenesis(ctx) if err == nil { if os.Getenv("LOTUS_SKIP_GENESIS_CHECK") != "_yes_" { expectedGenesis, err := g() @@ -70,5 +74,5 @@ func SetGenesis(cs *store.ChainStore, g Genesis) (dtypes.AfterGenesisSet, error) return dtypes.AfterGenesisSet{}, xerrors.Errorf("genesis func failed: %w", err) } - return dtypes.AfterGenesisSet{}, cs.SetGenesis(context.Background(), genesis) + return dtypes.AfterGenesisSet{}, cs.SetGenesis(ctx, genesis) } diff --git a/node/modules/services.go b/node/modules/services.go index c832b16fc33..299c01fb083 100644 --- a/node/modules/services.go +++ b/node/modules/services.go @@ -228,8 +228,8 @@ func BuiltinDrandConfig() dtypes.DrandSchedule { return build.DrandConfigSchedule() } -func RandomSchedule(p RandomBeaconParams, _ dtypes.AfterGenesisSet) (beacon.Schedule, error) { - gen, err := p.Cs.GetGenesis(context.Background()) +func RandomSchedule(lc fx.Lifecycle, mctx helpers.MetricsCtx, p RandomBeaconParams, _ dtypes.AfterGenesisSet) (beacon.Schedule, error) { + gen, err := p.Cs.GetGenesis(helpers.LifecycleCtx(mctx, lc)) if err != nil { return nil, err } diff --git a/node/modules/storageminer.go b/node/modules/storageminer.go index d271f974a8f..3eb6f3c3c11 100644 --- a/node/modules/storageminer.go +++ b/node/modules/storageminer.go @@ -78,7 +78,7 @@ var ( ) func minerAddrFromDS(ds dtypes.MetadataDS) (address.Address, error) { - maddrb, err := ds.Get(context.Background(), datastore.NewKey("miner-address")) + maddrb, err := ds.Get(context.TODO(), datastore.NewKey("miner-address")) if err != nil { return address.Undef, err } @@ -300,7 +300,7 @@ func HandleDeals(mctx helpers.MetricsCtx, lc fx.Lifecycle, host host.Host, h sto func HandleMigrateProviderFunds(lc fx.Lifecycle, ds dtypes.MetadataDS, node api.FullNode, minerAddress dtypes.MinerAddress) { lc.Append(fx.Hook{ OnStart: func(ctx context.Context) error { - b, err := ds.Get(context.Background(), datastore.NewKey("/marketfunds/provider")) + b, err := ds.Get(ctx, datastore.NewKey("/marketfunds/provider")) if err != nil { if xerrors.Is(err, datastore.ErrNotFound) { return nil @@ -331,7 +331,7 @@ func HandleMigrateProviderFunds(lc fx.Lifecycle, ds dtypes.MetadataDS, node api. return nil } - return ds.Delete(context.Background(), datastore.NewKey("/marketfunds/provider")) + return ds.Delete(ctx, datastore.NewKey("/marketfunds/provider")) }, }) } From 6ba2533e2b8433a8c941358085ee7571d7b6085f Mon Sep 17 00:00:00 2001 From: vyzo Date: Fri, 17 Dec 2021 11:47:28 +0200 Subject: [PATCH 126/393] fix lotus-shed --- cmd/lotus-shed/genesis-verify.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/lotus-shed/genesis-verify.go b/cmd/lotus-shed/genesis-verify.go index 4a692d4c9eb..cc042064d79 100644 --- a/cmd/lotus-shed/genesis-verify.go +++ b/cmd/lotus-shed/genesis-verify.go @@ -64,7 +64,7 @@ var genesisVerifyCmd = &cli.Command{ return xerrors.Errorf("opening the car file: %w", err) } - ts, err := cs.Import(f) + ts, err := cs.Import(cctx.Context, f) if err != nil { return err } From cd266a05d24f8fc3bcdf72a9345a1cc1a5b204dd Mon Sep 17 00:00:00 2001 From: vyzo Date: Fri, 17 Dec 2021 12:04:04 +0200 Subject: [PATCH 127/393] fix tests --- chain/messagepool/messagepool_test.go | 8 ++++---- chain/store/index_test.go | 2 +- chain/store/store_test.go | 4 ++-- chain/sync_test.go | 7 ++++--- 4 files changed, 11 insertions(+), 10 deletions(-) diff --git a/chain/messagepool/messagepool_test.go b/chain/messagepool/messagepool_test.go index da1a2eab6c2..47cf56eb377 100644 --- a/chain/messagepool/messagepool_test.go +++ b/chain/messagepool/messagepool_test.go @@ -103,7 +103,7 @@ func (tma *testMpoolAPI) SubscribeHeadChanges(cb func(rev, app []*types.TipSet) return tma.tipsets[0] } -func (tma *testMpoolAPI) PutMessage(m types.ChainMsg) (cid.Cid, error) { +func (tma *testMpoolAPI) PutMessage(ctx context.Context, m types.ChainMsg) (cid.Cid, error) { return cid.Undef, nil } @@ -164,16 +164,16 @@ func (tma *testMpoolAPI) StateAccountKeyAtFinality(ctx context.Context, addr add return addr, nil } -func (tma *testMpoolAPI) MessagesForBlock(h *types.BlockHeader) ([]*types.Message, []*types.SignedMessage, error) { +func (tma *testMpoolAPI) MessagesForBlock(ctx context.Context, h *types.BlockHeader) ([]*types.Message, []*types.SignedMessage, error) { return nil, tma.bmsgs[h.Cid()], nil } -func (tma *testMpoolAPI) MessagesForTipset(ts *types.TipSet) ([]types.ChainMsg, error) { +func (tma *testMpoolAPI) MessagesForTipset(ctx context.Context, ts *types.TipSet) ([]types.ChainMsg, error) { if len(ts.Blocks()) != 1 { panic("cant deal with multiblock tipsets in this test") } - bm, sm, err := tma.MessagesForBlock(ts.Blocks()[0]) + bm, sm, err := tma.MessagesForBlock(ctx, ts.Blocks()[0]) if err != nil { return nil, err } diff --git a/chain/store/index_test.go b/chain/store/index_test.go index 13054e95d42..b7f1d570f76 100644 --- a/chain/store/index_test.go +++ b/chain/store/index_test.go @@ -35,7 +35,7 @@ func TestIndexSeeks(t *testing.T) { cs := store.NewChainStore(nbs, nbs, syncds.MutexWrap(datastore.NewMapDatastore()), filcns.Weight, nil) defer cs.Close() //nolint:errcheck - _, err = cs.Import(bytes.NewReader(gencar)) + _, err = cs.Import(ctx, bytes.NewReader(gencar)) if err != nil { t.Fatal(err) } diff --git a/chain/store/store_test.go b/chain/store/store_test.go index f7cf32e8abb..a759a48a8bc 100644 --- a/chain/store/store_test.go +++ b/chain/store/store_test.go @@ -109,7 +109,7 @@ func TestChainExportImport(t *testing.T) { cs := store.NewChainStore(nbs, nbs, datastore.NewMapDatastore(), filcns.Weight, nil) defer cs.Close() //nolint:errcheck - root, err := cs.Import(buf) + root, err := cs.Import(context.TODO(), buf) if err != nil { t.Fatal(err) } @@ -144,7 +144,7 @@ func TestChainExportImportFull(t *testing.T) { cs := store.NewChainStore(nbs, nbs, datastore.NewMapDatastore(), filcns.Weight, nil) defer cs.Close() //nolint:errcheck - root, err := cs.Import(buf) + root, err := cs.Import(context.TODO(), buf) if err != nil { t.Fatal(err) } diff --git a/chain/sync_test.go b/chain/sync_test.go index 2a1798a56ba..3293856c7a1 100644 --- a/chain/sync_test.go +++ b/chain/sync_test.go @@ -205,20 +205,21 @@ func (tu *syncTestUtil) pushFtsAndWait(to int, fts *store.FullTipSet, wait bool) } func (tu *syncTestUtil) pushTsExpectErr(to int, fts *store.FullTipSet, experr bool) { + ctx := context.TODO() for _, fb := range fts.Blocks { var b types.BlockMsg // -1 to match block.Height b.Header = fb.Header for _, msg := range fb.SecpkMessages { - c, err := tu.nds[to].(*impl.FullNodeAPI).ChainAPI.Chain.PutMessage(msg) + c, err := tu.nds[to].(*impl.FullNodeAPI).ChainAPI.Chain.PutMessage(ctx, msg) require.NoError(tu.t, err) b.SecpkMessages = append(b.SecpkMessages, c) } for _, msg := range fb.BlsMessages { - c, err := tu.nds[to].(*impl.FullNodeAPI).ChainAPI.Chain.PutMessage(msg) + c, err := tu.nds[to].(*impl.FullNodeAPI).ChainAPI.Chain.PutMessage(ctx, msg) require.NoError(tu.t, err) b.BlsMessages = append(b.BlsMessages, c) @@ -734,7 +735,7 @@ func TestDuplicateNonce(t *testing.T) { t.Fatal("included message should be in exec trace") } - mft, err := tu.g.ChainStore().MessagesForTipset(ts1.TipSet()) + mft, err := tu.g.ChainStore().MessagesForTipset(context.TODO(), ts1.TipSet()) require.NoError(t, err) require.True(t, len(mft) == 1, "only expecting one message for this tipset") require.Equal(t, includedMsg, mft[0].VMMessage().Cid(), "messages for tipset didn't contain expected message") From 122b3195200632c7a52bdf0a85d2a0b43c1f845a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 17 Dec 2021 11:45:40 +0100 Subject: [PATCH 128/393] don't update ffi --- extern/filecoin-ffi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extern/filecoin-ffi b/extern/filecoin-ffi index a7b3c2e6953..7912389334e 160000 --- a/extern/filecoin-ffi +++ b/extern/filecoin-ffi @@ -1 +1 @@ -Subproject commit a7b3c2e695393fd716e9265ff8cba932a3e38dd4 +Subproject commit 7912389334e347bbb2eac0520c836830875c39de From 976a3a5e7b528fb22a60283d54a4d1a6cc72d3fd Mon Sep 17 00:00:00 2001 From: vyzo Date: Fri, 17 Dec 2021 13:44:05 +0200 Subject: [PATCH 129/393] fix blockstore test contexts --- blockstore/badger/blockstore_test_suite.go | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/blockstore/badger/blockstore_test_suite.go b/blockstore/badger/blockstore_test_suite.go index de8485a0e7e..167d1b2ab58 100644 --- a/blockstore/badger/blockstore_test_suite.go +++ b/blockstore/badger/blockstore_test_suite.go @@ -57,7 +57,7 @@ func (s *Suite) TestGetWhenKeyNotPresent(t *testing.T) { } func (s *Suite) TestGetWhenKeyIsNil(t *testing.T) { - ctx := context.TODO() + ctx := context.Background() bs, _ := s.NewBlockstore(t) if c, ok := bs.(io.Closer); ok { defer func() { require.NoError(t, c.Close()) }() @@ -68,7 +68,7 @@ func (s *Suite) TestGetWhenKeyIsNil(t *testing.T) { } func (s *Suite) TestPutThenGetBlock(t *testing.T) { - ctx := context.TODO() + ctx := context.Background() bs, _ := s.NewBlockstore(t) if c, ok := bs.(io.Closer); ok { defer func() { require.NoError(t, c.Close()) }() @@ -85,7 +85,7 @@ func (s *Suite) TestPutThenGetBlock(t *testing.T) { } func (s *Suite) TestHas(t *testing.T) { - ctx := context.TODO() + ctx := context.Background() bs, _ := s.NewBlockstore(t) if c, ok := bs.(io.Closer); ok { defer func() { require.NoError(t, c.Close()) }() @@ -106,7 +106,7 @@ func (s *Suite) TestHas(t *testing.T) { } func (s *Suite) TestCidv0v1(t *testing.T) { - ctx := context.TODO() + ctx := context.Background() bs, _ := s.NewBlockstore(t) if c, ok := bs.(io.Closer); ok { defer func() { require.NoError(t, c.Close()) }() @@ -123,7 +123,7 @@ func (s *Suite) TestCidv0v1(t *testing.T) { } func (s *Suite) TestPutThenGetSizeBlock(t *testing.T) { - ctx := context.TODO() + ctx := context.Background() bs, _ := s.NewBlockstore(t) if c, ok := bs.(io.Closer); ok { @@ -210,7 +210,7 @@ func (s *Suite) TestDoubleClose(t *testing.T) { } func (s *Suite) TestReopenPutGet(t *testing.T) { - ctx := context.TODO() + ctx := context.Background() bs, path := s.NewBlockstore(t) c, ok := bs.(io.Closer) if !ok { @@ -236,7 +236,7 @@ func (s *Suite) TestReopenPutGet(t *testing.T) { } func (s *Suite) TestPutMany(t *testing.T) { - ctx := context.TODO() + ctx := context.Background() bs, _ := s.NewBlockstore(t) if c, ok := bs.(io.Closer); ok { defer func() { require.NoError(t, c.Close()) }() @@ -268,7 +268,7 @@ func (s *Suite) TestPutMany(t *testing.T) { } func (s *Suite) TestDelete(t *testing.T) { - ctx := context.TODO() + ctx := context.Background() bs, _ := s.NewBlockstore(t) if c, ok := bs.(io.Closer); ok { defer func() { require.NoError(t, c.Close()) }() @@ -301,7 +301,7 @@ func (s *Suite) TestDelete(t *testing.T) { } func insertBlocks(t *testing.T, bs blockstore.BasicBlockstore, count int) []cid.Cid { - ctx := context.TODO() + ctx := context.Background() keys := make([]cid.Cid, count) for i := 0; i < count; i++ { block := blocks.NewBlock([]byte(fmt.Sprintf("some data %d", i))) From 66f8f8aff22a6ef75c5206501e8548c91b82b045 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 17 Dec 2021 13:05:44 +0100 Subject: [PATCH 130/393] fix shed --- cmd/lotus-shed/terminations.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cmd/lotus-shed/terminations.go b/cmd/lotus-shed/terminations.go index a209e459f1f..0691f35dac8 100644 --- a/cmd/lotus-shed/terminations.go +++ b/cmd/lotus-shed/terminations.go @@ -84,7 +84,7 @@ var terminationsCmd = &cli.Command{ cst := cbor.NewCborStore(bs) store := adt.WrapStore(ctx, cst) - blk, err := cs.GetBlock(blkCid) + blk, err := cs.GetBlock(ctx, blkCid) if err != nil { return err } @@ -97,14 +97,14 @@ var terminationsCmd = &cli.Command{ cutoff := blk.Height - abi.ChainEpoch(lbp) for blk.Height > cutoff { - pts, err := cs.LoadTipSet(types.NewTipSetKey(blk.Parents...)) + pts, err := cs.LoadTipSet(ctx, types.NewTipSetKey(blk.Parents...)) if err != nil { return err } blk = pts.Blocks()[0] - msgs, err := cs.MessagesForTipset(pts) + msgs, err := cs.MessagesForTipset(ctx, pts) if err != nil { return err } From 839fc8df7d4f61ef2f4e2fa996f5e7e7331e24f4 Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Fri, 17 Dec 2021 14:44:51 +0100 Subject: [PATCH 131/393] fix: when retrying Add Piece, first seek to start of reader --- go.mod | 2 +- go.sum | 4 ++-- markets/storageadapter/provider.go | 18 ++++++++++++++++-- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index c86511c3845..a4d85d6cf1f 100644 --- a/go.mod +++ b/go.mod @@ -36,7 +36,7 @@ require ( github.com/filecoin-project/go-data-transfer v1.12.0 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.13.5 + github.com/filecoin-project/go-fil-markets v1.13.6-0.20211217102747-e95a23480585 github.com/filecoin-project/go-jsonrpc v0.1.5 github.com/filecoin-project/go-padreader v0.0.1 github.com/filecoin-project/go-paramfetch v0.0.2 diff --git a/go.sum b/go.sum index 3b1f0658776..f6f557211c2 100644 --- a/go.sum +++ b/go.sum @@ -322,8 +322,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.13.5 h1:NLeF8rI5ZPOJNYEgA6NHrvnuh5QE/2dwuU/7wPW7zP0= -github.com/filecoin-project/go-fil-markets v1.13.5/go.mod h1:vXOHH3q2+zLk929W+lIq3etuDFTyJJ8nG2DwGHG2R1E= +github.com/filecoin-project/go-fil-markets v1.13.6-0.20211217102747-e95a23480585 h1:kDzqA/WyUOVVt2en/r81nvS21s0sMThv4qlKoveooDU= +github.com/filecoin-project/go-fil-markets v1.13.6-0.20211217102747-e95a23480585/go.mod h1:vXOHH3q2+zLk929W+lIq3etuDFTyJJ8nG2DwGHG2R1E= 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= diff --git a/markets/storageadapter/provider.go b/markets/storageadapter/provider.go index bb9863bc4a6..0828db2715a 100644 --- a/markets/storageadapter/provider.go +++ b/markets/storageadapter/provider.go @@ -4,7 +4,6 @@ package storageadapter import ( "context" - "io" "time" "github.com/ipfs/go-cid" @@ -88,7 +87,7 @@ func (n *ProviderNodeAdapter) PublishDeals(ctx context.Context, deal storagemark return n.dealPublisher.Publish(ctx, deal.ClientDealProposal) } -func (n *ProviderNodeAdapter) OnDealComplete(ctx context.Context, deal storagemarket.MinerDeal, pieceSize abi.UnpaddedPieceSize, pieceData io.Reader) (*storagemarket.PackingResult, error) { +func (n *ProviderNodeAdapter) OnDealComplete(ctx context.Context, deal storagemarket.MinerDeal, pieceSize abi.UnpaddedPieceSize, pieceData shared.ReadSeekStarter) (*storagemarket.PackingResult, error) { if deal.PublishCid == nil { return nil, xerrors.Errorf("deal.PublishCid can't be nil") } @@ -104,17 +103,32 @@ func (n *ProviderNodeAdapter) OnDealComplete(ctx context.Context, deal storagema KeepUnsealed: deal.FastRetrieval, } + // Attempt to add the piece to the sector p, offset, err := n.secb.AddPiece(ctx, pieceSize, pieceData, sdInfo) curTime := build.Clock.Now() for build.Clock.Since(curTime) < addPieceRetryTimeout { + // Check if there was an error because of too many sectors being sealed if !xerrors.Is(err, sealing.ErrTooManySectorsSealing) { if err != nil { log.Errorf("failed to addPiece for deal %d, err: %v", deal.DealID, err) } + + // There was either a fatal error or no error. In either case + // don't retry AddPiece break } + + // The piece could not be added to the sector because there are too + // many sectors being sealed, back-off for a while before trying again select { case <-build.Clock.After(addPieceRetryWait): + // Reset the reader to the start + err = pieceData.SeekStart() + if err != nil { + return nil, xerrors.Errorf("failed to reset piece reader to start before retrying AddPiece for deal %d: %w", deal.DealID, err) + } + + // Attempt to add the piece again p, offset, err = n.secb.AddPiece(ctx, pieceSize, pieceData, sdInfo) case <-ctx.Done(): return nil, xerrors.New("context expired while waiting to retry AddPiece") From b1734f84b3be46879ae52e30c3d0c9e1e331f8e8 Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Fri, 17 Dec 2021 15:50:51 +0100 Subject: [PATCH 132/393] feat: retrieval ask CLI command --- api/api_full.go | 1 + build/openrpc/full.json.gz | Bin 25704 -> 25722 bytes cli/client.go | 58 ++++++++++++++++++++ documentation/en/api-v0-methods.md | 1 + documentation/en/api-v1-unstable-methods.md | 1 + documentation/en/cli-lotus.md | 30 ++++++++-- itests/kit/client.go | 7 ++- node/impl/client/client.go | 1 + 8 files changed, 92 insertions(+), 7 deletions(-) diff --git a/api/api_full.go b/api/api_full.go index 06aaff99cb6..9ca0f883aa5 100644 --- a/api/api_full.go +++ b/api/api_full.go @@ -900,6 +900,7 @@ type QueryOffer struct { Size uint64 MinPrice types.BigInt UnsealPrice types.BigInt + PricePerByte abi.TokenAmount PaymentInterval uint64 PaymentIntervalIncrease uint64 Miner address.Address diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 4bb7835d28cd9bdf071b868fed07f443d72ff101..33a869e4a274fa86cf427e358072b8addad32fda 100644 GIT binary patch delta 21017 zcmZ^qLtrIL*KT9$#I|kQwr$%!v2Ap0cigdU+jht9{`>vL_m1`+)TjnkyVkSnd>r&+ z9Q0>0Do`(LbGV{ccwpg2``clS2inDJAQb|vtScQJ@Rhub^c8&XAeAY2I_jhINj zN(#xFTlEjYYq_GhQ*+}{ZI&o5@KCVvCB?BT6+rba0^VlJDg*a~q;e7h6Onvs=b-4I zLe|RmUUmihCdh&I_dSkACs$jw<3J}uMA^q9hn2FT6g27r*jy^ zE+^oa{BmWdG_84Co8)#W?OFzyQ)L~H29JFu9b10n>fkCaKD3$hpSf@6{B+}Gba?dI zbAXilIpMOCT8NGTSMDC;^J}Br!TB_`51jxkay)exofP!WK0uF`?rBZcVQJhE-+Gq!)QdWu zMeDb$9RmNL4V~DB9H;LO)11Cti_<$^C|=C8rj~I$Io1}fN$xQ+r)y~}w4X5Y<}w~+ z)X_3=+XW)!_b5X$0raLd)fbSIl1xdlSkQOa@@f0*eP;3DO0)QEUP!QVqn3t+wg~yX zQkKXJDM!q5o@ydr)wFu1#6m_EX57?pwG7fH+<{9iN#C1x?q^x|Ej{gZl&aPh{OSE` zP8XuO9tP7RaCK|E7@6)1gI&Mu#XY_h)0EETh%)WM!xKQBy16Yu6Q>rFyHnfUJwq0g zGv72bGIi@x%LK6BHlS4PKK(_Z!SSxHI$k?pbW6=QVSMGHSycK|{c-r5M-*13Xm&(89n`lqZ1$_ZzTR!mm}_II=z3jk|8%IxeU44c(v&n(7v1 zd-MM3)uR}Q;1!w^>+A8~wp}lRHQN0y;@cK4o{Q2eF9~v4x%?@Tc3i&YCmEjtVtA^j92|mx&c37EQ4r^{Y=(8ntTg-uc*NH4T0yXIB>ai0u%;)PB4=LpK+!W|kkxZbFAekh zfRQc3s0Hso1gqgQW3-mSZ8!iS(zmskA8%JP*R)bwXDJ;F)TDMdONBY(4BAbuZGSlr zp?LD5?0|=*Mw!Zxs}Q6pd$AUZNpen6>74~NHfv8TqEf+Ku9i0;Op*5#*LMk?#~K=_+sU!9EY6X?x!wX+Rj6Y4(S5# zOC$v~13)$qSTglcsJ05m&Nr5q>eMzsD2Y?GUs#E@ovH~0guRYf`Cz-mS46pRKTAaC z-4I;#1w(RtoMC)?qNM`|8gYw3cH)vP=)|g2;-|e4{~aqR41m~t4zeqa2gtbTq>YBZ zEf#BqFBuOMIg5NP%dLa%Xd0~Ydy8AF<0v_f^|{P#JYZM`^wTIP<3u06MYs}Hrc~K! zD`junZ9IaR>wJE#K3+_aN^suLuw!z%zDaRM6yKh$CzDX-wzxnBGI-a7azU#gHI&L% zPS6eoVMnwiAs8}$jofQ(zO6MAdyYy4HreYnNuC(;QxE2~>V6!P1M4t?Y%3;mN4<9Q z&9<>LvbKM?;)^XrPqv0JgO}yiKQJ! z6NTCf!*qyg;?u<`iZT^vxCj_-^;)Z4gQvxZcip`E#ZAV{brUCB@N9hy z)^@{T3P#}ZBC4(5^=gN-N#d1fWn%@6Vaq_up8y|NE#8QZ!*+I-!FuGv$5e|LK9Wr2 zH35@(EKtCuhnSmg zJy_fAfI$az1Kqs09v-DIRP=8Yv#H?t(s&KfgwjYy5vd4Q@crasvoP={RMgj#C@8aG zBTC~i5MErLtjbDTusb_>QcyTV9^-?gqCT+>X7KZEQ`R=`kwc7FEqcSoe@%Kttk#QH zHL$o~92;6{z60_5RG31e1FndEcE7;Z+-Ar$qY!sL`F1&32%C6W!niVjA*B>gqqv&v@B^Z#=&)*{eyij7``OiA!=JnJ-*4@E zO#ju(oxcY7hCq<0?SmjxA75u^aD+%8AsB*7um^S?Y4%!CLnw_%pqRK5>zbJ8ze^Fu zx$rESknLz#UbRqwJ|d~AGY^zJH}w@!E8eNyH?FHYA#8wI;Jiserka}l@S4BdNXJ>`UAw#y2Q`nKB) z)tB#V12q@04%hyrXS=0D-;Fc+KFeNTySb!TQxu%T5Kxa^!$tM`%ZFsFEq$4A+o`HT z*6`=Gt48p{GYA}^tAP|Ax5G6vE^lq%Sm(t|E(siXjp+%8%unzL{X{>3u*l=P`!CPl zC@CNvf4d2HQhV-=8lb?vgkPb)oSLrgO#l7~MBU~|~!wlPgA=N}lkPBTm7U{0={4m2DCxHyzzul33vbZ@tLHIBgVu!myC0*VF5 zhV9N$AkM@dLjD;Fk~=@|Hh@Ai%~A{+#6=#0_9FzgTg*6Q3~m1asCRq-TgF&O78HFH z9imABn0|U#b&Z2lGr*U{`Z$?{xWU))#L|iPVDt29DfarP+X~>20))= z#J<(^iIB7JPHj^b+~O_#k4t!z-w9d8U{FDW4f!Q%2(JrAHLfk$RzOU7?I!(P*)n8k z67#TGt2XW{%L8vWu*U4!qy||pz&r2xfM1V&yM*ZAn?`l3?!Yv`R!|v*$xm`VSxO^6 zRZr3hr^n*yYUF%Pon^fNhVw~fmsh}jhwNPBej@i0;vFidw3NCz$f8zdKYPF-lpm6# zyq@|-0!^XNJSa9j2uxw#BfB#UnOkGbq6sDlsbXhDQO`;bIBV9I;uT8wvuroe@FNh(SfW=-ALNGQR0GxI5>=q{sL1=}4 zP`59J9iAElc1-HwjwojI)TqdM_H?Pi0)jsPBJJKaNN4xm<5U&71cnp+d1i>56+I0u zz0H5yNW~RgI@(SlWYC1p#Evdtj&u(g|Ls-UKgC zUU#v8@(DK5X>0=_x>7K_Y2zivm=eW{v&i>%_QaLylU+SKz2|Ypti6R=`mbb<;_Q!D zi#^br`PHP4i@FF^@3_(JIZyhwkHm+=hB)AqrX2Tm9C_#CEzY$!y4D(UYe| zCXy?~Z#H8otccjx^eRu*vnpFVt=_QixRQ+U2sPb=YIh3C%g_)8t&(!AXt~9h$UGrY zu`l~41P7ps^OIQeuEyl8bc;fL#QgcrH>&RIf+O~TF zm;7~Ey_OCa-d7I1@e3P;*P!<}*0yf!c6B}sTv1e{7VvX5g~|r%j?eSA#c9QIvf9YT zm9OgQhG zdcq3pH&cyp-JXOH5FZ?+7Iuum;nT|mZ)y3n}M?)WPFt^CG>kyunzKHD{}* z&WIZ4Cre(i2*pdSFK&rR`T9q!=GM^Ai7zzesiED5LCM|r=P%S9aZa@3aFj`aW$pQ= zI&P;|4fG*V%YzQwGX((}oL#YU_4;Rfcm+KM^V#g!4zC|QN>Ovx&bfi^6lg#yN&?*N zVqyRKv}l=hl?fgwzfdhFBjjC#mpvGnxLee4M@E?W%@xC*oucI*PqRa2{7>^Vh|A7; zCp;U>kj>_*w5}n;1)VftbM-O6({~X#yL}aTcVCs@G*!ET`V7@ z{D5!E!=S8-l2K3=$GU8I(?A%G*SV%Ngb|~D|3Rfl^-cOHgck!@c{SF{yI z8e#J@G5OW=;xogojuu7B_3#YT;ojNGteNMXqIJehBgi*p{;Us>TpDt)GZWuQ{H4c0 z>TIX7_Vith`|Qo8Z7O_VZiD`{R*+BZJHy&KO1%loUtF`9?-=4$o#jWq1Cep>Tw;ln z8~(6#>RbDf)8eN>`5Q@ChjJ)#k4%oZD;8WRq)XeP)41;%eWY@O?lPIw-)2kVuma8 z{T;xF@~ZRTj~*p49V9ij9!%&wYzIXRsyqaOOXYCQ*sn7YrdQ+`{&9qQ2^2=|nixLT zm)2wyoBAa+Az4GcYTD4c=^>iI_3{e^Y}vlC2R>x^n2N!_|57syxnn;a3n!<|P`v@; z8L|4e^5qrqk3%%Dq1Qz8OF@JGKzm=Gn6xbrx`}@+#mE1^V%VpCDKh19q%jBPmA_Gg z)ewsOiGRQ5p)pNMR{+AyKXQBtLDIgX=A_b&&A;*Fr+&6nM_GiUs4mJOFL1H5OzEKJ)_`bR_@V;1nG?67E;nxcY93-uYBH zpLa`TjALylgYca#Ru-MD?GJ3z!Pi%L?`->DKhhoAP0RsB@aDeT&GH74^8(P~e-fHf zScrJQraFU24vUSiBK%Q}lq}ihB(Ol#xHC;)B4C6SE7mu_`q)Y-8E@(nV2@xrcYNRl z;Ff^Jx-gKNM`Jb7vOn9mc*zHHZf|?4VaQywY2-H@-L57z{Bp5GBU-wxi$8sWJ}D-m zFqwm+N?~Tn*9}3lV2-@ntvV2GO$Z+A2o^R0bxX$|Q`=e|1Gt-GHkI%T$_Ktqm)?EE ztYUUje$7b;O|Ox0L-RTJR_k8fPOqLAebPWuEE>n()l1jA8& z4Z$ev6UD*p7?Fez0fKG{s^-Yv*io+mkUO5VBAkNhjklHWo1VX~QP;DQvqGOsT{{zL zyAK=lJ$>P?e)6{~2wp6(H`^Akhz$_B6SfpJ>9w2+ISQ#SKfSH`7|%x*?->z94YGic zoz_+X+UN(xGaWKV*qAo7X^kkpyZFMC{VD90urE8A>(S3AqzU(FP^w(yp{3;yf4bL2 z(!AYJVs5z6R0I&Ja6DjKs@IIU;@q*>8Oplek3)AjgRf zV+Zx_XMslG2LnX8#F@phlu-*Hc+h}R(QoT9SDt6u8-t+dGQvHU+Ec}pu{jw$@Xd|l zlL^&Vh#8u8t-3WQeHnjs>pb$(i`G0;ba-LLP0?e^z}#5jFG-8bWYrva0h?(NEcb6sFJ4ExfW9s@-s_o8;DQ`x}5=DFa)^-gPJb>>YySDf1 z2-jmdmE%T;V90Dp=at8raEKt330N`lAk4{vb&E3|=PGBbye)O>MRlvJ;2jck`@c?JTW`FYVMa}P(L z_bIn`3Aq=A2Yz!S$x!AO_XgH5Qb^u~!BKB6mIl$_S;dYmi%Y&VqZ#Z+n9D+(>;Tx+ zEI)`p{W(SaLzd%ZS|1^47Dkseu#M4heHpPyi&CLrSdXhcIbT`L16)rz%GWg={Ck)_O?73Xy0*Nn%j}6v-&ue^ zjvCV>;S7l+F3KurED&$iFERJusM>}LYZPgTQu-0cb}HTFBgubj!6UTNT7rLLmg*%r zihRI{bcXj}zUZ#onKXp=IGEfSY9#SOjxwT;+Qj;KJX-`i-2*pvS*^9yRw%X=pmN5# zTD7@~#l>VOC256gJO_|Sg^FO>>QPQ?QB|4OinU`+*K#&VeOtZf4@F|383;3c$5Dd}GC0Kx(QE(3RI2c7??)#JEAhbupP2qjfUx58V%}X zfCrmYBUUX41|A&ZlwBS4;t9kNrZW=h^|Yy-ou`<*z}S`UZwTn-C8i6e;#6>SpIs3C z_0e+P(e)MIz`?NdiL_*66>F0T=hN)U(j?74h#{f5{)OWDG&Oj^u*ZkjXq}1(cj;*=J>&72?HjQw{Z4(O|c0Xd`}T zoOW3->`B1fA0tFLWU1XM-r3X*stYm0z^~cYhO8iiJaf;{hKx`|^@LoKg=6av zDPe(t^Beryy-uAU>X({2BV3mm60=JQFb-l7O+FLRSqQx_2Dv0oaH&Wh)I(HIf~xReEX)I&eySuX$4|CtDn}42 zhHGW_tsjb43OFe^-@JrM#g7Pepw%{?OOQO}O?6*m!*c8Qw0W3hEh{PAVUkLD%d$!JWCo@78TKAY3LLPsmP~KIc|W&|!z8Gm z`Y9z>(b1@d9h&XhCrEi;g;jC@F}OF;7=%)K*SU#*^|ZEM64}iw<4kDQ&FS-`>Bi0l0Is!_~TYi@eMj>f8B(+N4N`Okc-L&8k^RIef(K zhNC1cTLbAVD@K|co}ZsbN3pM%K1d!wN(|(o-bX>(F9A_&&!y{#8wvtHR^{= z)3!*@CrKv3sAQzuwo~QRFM)5GNVBA+ncXa#d6E>%ZEkCVb;|NNdu)Cy|IQ*_?(AXd zNg#s6FNny0mIxGcVY2$-ui#%XkYrjFp;n?r{~*WsXo5bfBYx4wUF7rnqmg+Fih z`lwPE6eL#L1OYHb;iv)2$U28=F$LaO>otRoKS4EC5*NGq>ld&|eG^$9FS z;9v>DO49KE;5(viWF#U!k%{Z$bVI84TGu7aw4y|z*0^{<6(l4F`M7eG)ZE$~bs788w8i8+h% zb0>9<7jWQ`;3M3GVLM6YONs&0RN1%Bar_#&tGsHT>rPTzKO`~bbm?sxOGi>18jr7X z=D)Pq&Y4ozs5O8iz>A$J#$itsc@~bKSz;?s)f~O}CH8cvZKb&K;>wUpy6Jcw9I8MU zxVMkW7gW29($(pT?UtXeH_Imq@EY@{UjLsg(5~=)OfWqd zdy?OjqWkR}2iK7Ox}%7^8bAz2Gy;;n`hbGw63*8==_S-I#h*A&0l~&z9Gd3I$j+$y z#ui!a=hOBqH&CXV9_23pW1Uze2HuwQ`Qjl&@kqWcjK+S9#ZZ3p_+S&&RyZ_Ut@To4 zf*3j36@5=dARI^M)ejPlBu%8z;!Ax`s9lrnF#Z--`JV6mGW&N9;GgeqgY1-RJ{e=Yg6LYS=x!Ee;`Ub(1 z8&d-R<#x4}(1!qyEw7DOPq**@#|zHkS<-#pjf09e&~Bc|&o2h{iMgPLR0ubwNdFGe zRuk~iGahPJ#hAuq=D6YGC~WaQjR%{MlDLt;W|gU$O0z0A6Q+N3wITt>rNDWu9+un_ z#x~JN5{c9KvVgBbLj!+?%Sc{lR42f%*neW>jUJ zR!M6KcH+LXE21P7miysfKOIDY8C~0Rn3V!RDjyg4;p*Tp&te3R+$%iYfO4SyA|X0= z_4>RG%VBnLY8=zcnJnl_n49AYc*Q3vwEkQ4`vA`Q#t? zuAm8eTVPiB#y+0R8p-6u^UzuWAOkEO$>8}jlrbi zM~5ZU9KrTY=^VN4Xe=!b*3}*s6rUJC5z>=c-$dP}rG>Gj*JnP8{n+S#->Z@Sa=bU6#EcwDHEqSMeiC@ZqWyJ?U{)w*4JZE(mN}P*V6vs zRm{8zzz@yMBf5~!Y3BL}v-(#c#BF~wScB2@)X}QlycuD3o5|yaN-e&uF8d1*Z9yAH zjA63eBh$cc(s5T^JTrOg8oxOsOLdvvgozc$Sgo9NvswZC7dzj=GUJTsBwGW6ZcQR> z;-4JGqjrq7ij%YNFiR|F#-xC*ksr%Ono1uZ3V7r7{>Ly9GVOMy)D-6K6-*WpZQ2e^ zzVkUMdds1#a`uov$TJ62EQ9TU32%Elk06}x34HF{h&f&!U_ACWh>o`eg}}|3 z)mTL|gZ2?iU))d4&KTVCWW>?RXDar)v9~{R8_rLm+)|Fy8G`@FB=#=w$;KJ{42}o% z5DRorE#RPPg{yne3=Cu3n!QGj;fLLO;SRqL_TT#Vw$(IDI>@dq46I3thn0|ybkV{~ zPvC9!rol*~oqVH!M{7mBo$Z;P7H5;1%cHVGt)~{Ung<^DuL@g+Qwk0)z?L=~f+LY2 z1=2(D?bVqfE)8GW?;u;CdOkHj6}NDLZL1B^oP2EjfY;((>eNU_m!4Oie2qh-qlz!K z!$)Z#n%N<|(eh3T3zWf5SQ|Cc8U6$@I}a5?zRX5PkRG}EN@1crbUco<<-TR3HD`L! zat_{aAq8u${GIaX4&Q}eWcDUKF$zA?A>OD=!6V+{=<8lgRzU43hoTC9y!vhhwF`69-lR6X z5pz@*+wOl2a8wXK?wbZZT||@Ms?<&o-B-p zk6tQMu7A=Rn=>mkJOxu$m)fSNG(05{RW@Vv0X;cX%xZj9$UKh%ne)xmI5$=cp0)uYo5$T@*Lw<}KrDS2gv226{-l>PRV z^%MalWni&_mIC|*ey+Db<-Yi7q2c}pJau!D463Hd|Ks|uPV~kh=5`h%V)t>TWQg6q{401?ABQRWi z#d09f?Yo|O*~!KIdDg|JT0IuwH!N5n_tQ@xxZ?tU4x+Hs!_2=i6Kqzo_>AjVrub#s zm$|sDWM`MD^!ydteh|Eg>sNpPVHmmatx$v1tGUzHTFpQ|!F&(s-`wkuuJyjY0tm0! zW2EOme?Mlo@_4~*L?e8AtuO}-zKusg(~uA~Y~OC5sPq(0+V>+Ar+=atYlSPM-`5B5 zCfweF#c29T2Y5(4)nXj;Zj#MBO0NTO3(JRwpjrR*FqMh%SLWuT?15Qwa?Dkb=X)%in%VN6F^HaY5IYf|ByAP9)sE? zfsz`^wQwZ7Rv+F>tv$oe_yxqhcTxd1$Jq5L=U$VUA|$9lt_8YC-c~lR=d#?^p;3*p z-$2#syx@i5R?{Z%Y7C`ZY7W;l9&edar_d}ZmoYqqYmWVzU#9#w!fkbuaFN^KeDp>p z+w$9HsJ*M*-xy*4HX&B$r=)cVzWO(ssi;hwr;xA2z*GB7RQ*+L1{y?x%A*5kBSaAc zq9+hl9GpBT(VOVd%E9{X+Y`o{{JP-|F57qo&h*?^PpWmx>H=8FNF3dCx5lCHpu7ml4>NUd?_e95uH$t*u`oXo40oIBJk z@gIj3&s>4fYT9Imy{C9nC0Wu#_vhgU^m(B|Dc{_G-@FO622nD*@#7;AocpLKhFBtU zhC#^SQ64IzJ@imt#L%5mp(N)|dO|l8kcTqbYyxp|0g<;ge(I#f#2o^cEfiXnx@E`t z5#+E3IY6I;8O2P6gt+X3Zs#S}2<`jXr_k+eRc|ZF;su`0%Oz5`*l9h|$EUB6#mZ<6 zI!yhD0xcP))WKwIdyabxaQR__K?wNV>RMAcUyiICggDzqhvID8PIy!Mb#ewN!by%> zPM~Cff?bBmRJnsVakEViI-!G&{md=VR2&1_Z5)oBLe~M~u03V1$?G0e7lw^cnt=iC zrolze=7Tlw(r}3S_JcE-%#=X*AFXGSUYgWgd-MBy$_pQ z(AGHw#C9mXhYhgynB`tO&U>GHNufP0?Y<6e| zA)z>`?oBfiG1^SU-Vuugr=kJRq7|1S{$K@p2yxq9MeM+=6zft86GaeaEl^MnGQEoq za=lbWHfA)JHga{D2BFy1mxe)M07~9lXmh6<{o+H0_Y2(Whvx2LmNUR^zH^w2;Wyf< zk=7~lB+2_QiGB0Fm_)=6>GA)K7dv)6?_mrwtP{wYA14@2!2k=0waBDiwimDET%M$$WbI+XNU{) zE+RUI#sJFvROvPqw0=L10Y-~ce|gERTA3GwTBZ?O6oZMWC5T}P!~0K*OVO8sRXJ6L z8*XtbbkxkW6m*67?REsmhW)E^1f+_{t%H#i^+`>}{+T)~PM!&x2Pk$pRS@4qVAVSf zkw_)29#*Q|#U!+??+>-WBqB|pG_7U2z_lVrmJ?*3c<*iwUz3NPN(RYsNDYGELfNL= zt!(NW1&=S?k3xe!Kx6DpJ1;$H$5s^%>wIq=cANxr$cDQe!dGV6RCk%(LDJOM1gpwq z-D}yxG!iqTIFASm3mm(28xh0c(?<|ZrZtdDjgIzA`r+RQQ+&}yA`>abF-9U5d`wxO zx}_3CJI(Uc#J7`74^o}IkY85-8?5r_kg=3VhG#0NWe77oi8 zSDQXXDy*tdBFneid<{lSG$G{3^n_XiQfG`Cr{ZslzMw5NnzC zzR7Cz5Ub?@el|czwr6S(>v86QHSdw^ z7n~eg|67RGFm&?P(087)bAqeycWGTh8!lC7Q*VwRE`1jEP)X+|N$EFAd6sm|4f-xP z6(bC>@ee3xd?HIouHj$^<55xayczE9l{0_F5JI5w8xe-ZArj33w94s@ZBC z3wJxFrZs@DWfn=p4kfSHcWEqWUL3&^=D!ku!Vmp@z727fRak(@de3ZeiPEV z7L7A|rG-~#Be>8X0Z>}E&7PS{Gpe37cFhM)qr-r@Q~|&v&DvErS4!nqvu%@uEq8~f z^csr+yI_)>Sf%)3V^@gaTrIu~2AX!;$qD>bC4aD}jd~(!S;=7$B`ZfF9-}IaU=Uk8 zjwPpq|4(*R^Lw{LtH*Yz6`r}-^30cZkkrJMm6J+)K>3MFQ48*^trq>zMp~4447>v{ z^)XqID->@|ogjNJ95cEuTX@mR+oC{W#UK4yqHK+Nx8XW6%5qIii*u~Jofgm_7zP%f zLJ^vJU}+n%_qBasGu3di0Ugf6muKcJUfQmj*1G=*K&Y9Du%_4Sg-c`*1QU>3u*FTI zv>ZQ-Z{0dQL@Q8I>B!gXpFTs6v@a&MA9Rf)&`wfs6~wi18sQn6DK&DgBv+P}`i-?D zI4vg}P$&G;OiK+D!b;=pJg6XQ`hfeB#_zUBVT2nP&~}wu^yA4V^kp?{j~~ewaaXiB zUY8G87}z%)o{lP8@{$^L0;n66RRPimS@QF&i!7ww`ux>bqnf&hm&Ih94zd@_hcDID@)n=@O)%sA0aO`r$P_ zc8WcXU^SPqluKzOZv^^CjKfHj>JU4B;N1L)itkjAJVuV9A+!J!Y#z&yKNxXVOmqss zkh(DVKklqe#H<)#)IAM^P>VH#_DI)Y{GLHTeDIKQA|xl!d(@-l+*<>O3)a;*WH}c- zQKfgWo{(z@uV%c}%=2QB3F3V3^>8m-JHU!aSwA=j0p{Ufs1P4I6=9|7+i z79pP=TKz(U`;Fn?AsnA1adGH?n(Mnhbg`HXCPPFFJjVk4_2*dbTH*HPf~?Z7yeVIX1Sd zF~0tbUOBIZYdbcYM$Zr;4P~Brw*C4&iWWOEmw2pB8|gZ2jisV`n1u0m!Nqyy^ouPl zI19qzSzyl6V)YshIOJxn^qZ_bnm)xT4ceKMv}%*|a?8NmKgK}f{McY+D1mn_NhDeY z*1c6P!DyiC&t`%3bU=|g1g1=Fe!3Yl+2GO{qKbRgQ?nblxFHMQ7e*wgmggzB4a)87 zE`aM(xZxregzp>-@}n#bWQ3djBb=1>^-apifssW-Yy5zn`r;2h>z}T>n1&x@L!tI5 zflnnvVOqe8yY)g{_SbkP3iR>{8~6z=R@kDlzCaoOm8W6{&n=Qx?)bs_k=UjS^ zCC)|onXt_Vjy=*KJ=?C)W}=ZdnnY%tnttpYa6V;nSP5`s%4f`q%IoSQaUpQ5}Iq`|&GKa!reHg&s#Xm>b4 zGO|u=a!l!}XOr5?ituVfPH0N(CTV9}aoeZyC%W`R?nzO40Rl+N)Rmr&m?NoCPSjM$ z)K~-Nn$~?B)h+A~ zqsir&o7||NpvY~PSZtNM+kkEIs=aJkyzRCwy7d0w1bG0+Q_>dPcUAfaUJjFrUL87{ z>XLHxPSZJS!9|W~@=j+Gu`JTA$n`)`WQN-Wot-U@cyT`d!9C7F1UC5^5D`I!YZr*= zjV@&uC-4wft^^MOn}sSY1wz|>4Od=J!l{L7LTLjfepPY)7jSio1aPKiP4%t+7@Xi^F_W@W|0_rM*&Ju0ESEm!?Y| zMs9C6A+$1;#rX)847b!jhvKtEe*x$^5}u>eGAhg7xLmVhYe<##PJ;DInDoUA7jy|F!GqSg8508Z=4*Feylk%E0OtOyN+yHX@tnKR?ov= zs2%>M&3x}3TfwKjoZfPqxR{(bJN=%M5++W3z{lQWN?)PTe!Iy9jnh#3WCSQ5O+kTh z`ltc4l4#^vO*81NhOZ*#@~qle{Gk(bIn^j@K@^Y2W|mfLo`+}BHj^Q*nmCgtA)6zM zMBH>smjSIyXnow2WiTkAG&1OiHkUrfmhz19E*iRZovLK5=}+C}A>1=WZ7F>x402rg zaSxHgGRfqQpK-}``v`vcDc9?F?4~gX*iMZi&p9?>l-w7`h9tG zHIO^-Cs!U4+xdN_xLG$__b>}J0tP-Cg6od|eCp|Na;7vpQ$|9KGOG{B-C6~nWf=+a zo|^H5UykdLJ}9{7X`9VXp~f^gx=ZRSk^a_Mni(|lW34VO;yJaO{@a3(g(;JsqmOP?})xg-Xi|<46;0Jl>SYJ%=0vMgjX$v zK(4S{252vRnxY($4s13s5kK8Rkk?w};|y&?C!KB8;TNBcZbx^>5=qbOiwv zI5!PEi?vjEe8FIaWU=>?VwxRAaql#7(+ZDmT(VsJ?$Me|Dsp&1o&u<;^E5=NGxl63a zKdfS?KKwWH=d^7WpCnzLJ*Ruw8h@42{>y<31~(RdkbUbJ)_vch_-4%^@ARcquv$Pz z8piq(5r0NS2a-qZ%#SBm8Cgn=BUOq_L5AQ>WlxjS;~kL#g+>y+$niXJfA$&RvB)s? zjX(K>knahWO~uZ|P_A9^7sgDk5W*}^E38q0nF>tS2i1HuQGvdY_vb^br-JyQ8plh# zkndNRHRo+g+rrV0;|Zm&apVX$$;-)Ya+>4mohDRv>~^)eqK{hI-;FPv2+zR^Wcw-h zmyWL^6GO)V6#>E_h_dLAM_by0aLgV~(!6_?oextWK8u#990@cR%u3%!qPiI!oImr( zyK1fZCc4=MD#uJvhzB2UD@<=DQKavi*$#{S!tVq>se=>72ra1JIsUz0$GLq->rTf= zDoRwou4CQ*q~?)pNmwiywdfVDi&hJ_sc!eWlGb_yeH1TlPgn@Dy>iTvX;l?>s`WAqM6|bNwk7wR9Z#j7;nllbCS`lM=~7^xpYNGIpFD5 zyDdE>gm~_jzIVb8`is%(%NXOS;=j`HqGVo?o#9#7G}X*gi=FQshKU8;TewgeOdGjS zfr5BI0{S@fQhSQXd?}3k8y}ncGD-vtqI|)K2SN*Lh%mZXgsa9=4KvJKxtv=c^VlH&qKc z&i1r3Tc>Q|(e6$(>Fc#MnX9gswvNCyJsPY5%fb~}w@}|L$E@K3mX6C1U1KC*%<+Qt zOr<4y+m`}R6z#G| zac>L@{^HlvEx*!I3G+{RDs*!*PYEpBBJ61<1ZI`fDqK{0Ci{JY9Qwb-B9xD_!@Kxp zVv9JoRk6I?HKlC6oHH_bOUv9{wUm8Dl3E4c>H)ckeGDIMj7=fkp6pIjj}iuA>ohpM zp*wYE*Km@+e~{UYhARlP0t-msF>%UqAjxm|LNE^0PLV)kff}nsCN?`jPi5)HpC*pI z8NI}J{pa7cVLM9?%+%qzip@%bT<+~-&Oj30Yd9LWGtJQ#U2Xva&J87s0Ep4>)S$Bv zri*4FU4{tAgCN&K?5DGh|B$4wsufB@8LBs>>^>Bsz7pEQKRb%5cq+L zDHAAuS*K)pQKRH|DS(U%modV|6v#WMXK^{T56y*A4D4d0^c*?{%0fbNF`l_~BtAdabYbVK%q`GNdsS?7zQ_|H)K&KM?+rIzP9a zl|2$uR$fV4;&VbCAc<6c&I`}m+viHFE50g2+I%>UFfei+EpNmJILym4db^7F9`Y_u zU~F8jhpQ?$u|Q0j0p%SB`(zqY?#w6%8v+`19r1JC1;wmn{_&Kh=wAGFz&<1|x|X~b z`}c1KFqB{H|MVV;M}W&oCqKQBC-ZaJo4ERL2>=d)N>Gpw2q*|dI)~|wlrPh_a^=`g zD#ac$1A~0K2sIh^V9ST5E+`ZZpc+=`Uxr5C5i(;(z<;WV#U2ySVff?a-5>S}Qmfg;srIDGgnSw$ zA1Lzn1F(>j#R6KI3BR?X(|YOKY@xEm)cw+wBm|k>JrYec+>N5J0Ibi!e{RPlo{SgV zeEV%qL*k9U2^vOTym)o6bJijimDM*w&mo8&InXUO5J}JSC+1desCNMU5(jf~##{#6cT#HGA&Ht6wwkNJHQxV*Ly#$=#C(7mPyTFnbV9$IkYmHO(OVp+5@ zpb45>3Fg@+4zmI#!uf$l3a>yl_~n^+9X#W(e)-6KJAbW_<@*`~T1~Cczst}Qs4Fhm zR!m>q%rZs|_uctXEQK@$35~Rz*KBlViM&8fPJxPgh#*+vg#$26>yaZ^-d+MdYxRZ5 z+@l*~h!Sa2br$Bml;qJ@DE(&)F@jOU(H(^)J@JOC`y+ zSposYUj`qhf$AL3ez%i4NLR!9ipPj`8^;&LH$~y~^NoN*D0;#P4G54t3qgsdVi=+# zC1~7B=XUihy9RLIcfP`j3(^g_9!=#7TR)2AD$OTCG(mjw6=MDklnB)$GA5X>RMW z!)3tKgR%U-i@qG8hxU_U?XApN3>%fcSu3kctGk?@UsoZd@&@@^oar>Ya+F53$=@d0 zmFlL&TW+Q!1%skk9q|pxYd<%wFbM5mDq-cNJXCMO;*U0k=Z($tz(zK9kECi2j9v$< zQ&&SPwjZl2I|)SlBR`q=q0O zk$}8yaCCGA5=Wi3M?veK@0zOuz}s^k`x2Cd<#Lj{Vd_c_+G2} zv-=gAy&nE3i0GG*{byG6rWX&^9$B+ID2#;Ce+O5Y6G$a^rgK%f;btbcq@5>}>)5a+ zB9M+M85*y{ntMuXbX6zub9ip24Hs3X$@N16h5p(fD2b4|mu{`oe=FTTr^dy~zQU2C z{WU7^r^siXm`iOt2j81?Fn)-^iv+Z))9X4=#*hcmcAwXH@lvp6^zzifWY_XJ0#ybb zHHKP$;<5R(TqV(zLboERZaAXwMHK}EgF3|~N=oOvrs}r(d zk{rS|$W!OifkX(MkY;EXyFeKTUf2(HADz_8p4?ed0F?B&XLi1s>7S}>*WTD3aam3( z@>3I{)+&AImj|#GcbF%5Z$4{vhBe%tnbnJTjE7jbp=F$QScIml)R)~8nqBU49kHIC z6loe%?tO=reTU(X3$m;MI_M#d25^;>hmm<3+Jyb9n`-R$~HP)#So+ zl?$=JcGV>1alDHDH{lv6u5+|2YRJw`Mhi8ChnZ+Q3z!LCfn2cAL(XEmXrgHj-CdAH zq~$P|x9uA;$b(9kd{6Czl6Q&`rL$yPF@mbN+zL5bE&J$LS=JB%*TYyI5k;N9X$*A~ zDfFkyH9;Q@jQZC1y=t*vYk_NF#;_JHGzrWl`61N~EORfWjbML5YMwJgEuRB$x?~yW z|B1ChvC%+OaHtikU2oPOD)l-|oF&W4UgZr+4^frp2_e&w+I+^h7X9KVIFDqk05Z?1L%l>UN_t7+qxV7o5%AnV@F3wER zImb6$hjxe9nhyJt5i^$l<%Dt89|@`gX-%JD00L-#|I7<6JY9P$L{G%D^S+t7ZpfdGw}4S73+ZVRIb zKPQw+*veGc_nMpayXV+G(Z8l`3lq~w?FaG_4ndJyOq5e>r2YDxgx*9LTly(r&r18s z4Y|Y#YD%cRXD<#Y%~r{me>oiZ+xmHOv7C=mU!hd~ls{8n!Vkr2z^l4p+w)8AA&oIaG9E`Icp^cbW9iRjMF zAc7t3UZ&T-O)Y0w8~D4qi98B5tLhwttxHTa=@thPyv!?<6KqOb*G|2p3=!SJ@(vlB zIQhPITLfC>qvbLn6AU7h_@4S3QsjdZP!W!sRi=CEk~5UX9ljO(sp)vDkG?b5%D(_~ zP=8OzuC+O10u&y9vWbCN3s65Ed+V@C*b1DpWm*L4+9-yD0)MIC#gathiFuReyd~u1 zbh#H&=s1I0tAr)?%HQnAQujNnGNCgfVmA|>`ti*E5{>uv6s3S~-W#_5B1UCUPhI}m zuEB5BKMJ9i`FqO;Q5o91b6NZ^CoiCLgkXnJFC*#l4Y(0J&d<@9u`j3jof0mh zal<>e#NQFYyGwD&T-MD=z(S3PkI#nJ|BAX4>?0Sy-c~zn|**$f$JsRkX#Fivqk}swpoLR);&G-}9C*)l7%mbd- zKL%?f2o)e9ZOzZ?s(+ony`0FaNJ9Iful38sS{2Vbo3%K0i9jOoruNYG0H)E3b3P*MW9io1du?#Io0tve`9feSV+Wu^|~> zXgrTidcy&GNc?*O*)W`bsR0mKW6ht=^}+(V2wk|W7N#s8|s59 zXJIqdB9)>T0Slg1KUB@NmIiE2$TB3a#cKM4HK(E+wCVVHOh=13-_hYfpIaN)#L<_& z{HJ%g+L^{D!|%TW(R1)eLDPrRiYUTpj&=EAnpO>Q6BSoA5iU;ln}E^q?}9^>TTKaT zb4@9Kj-J31p6PcOM2vO5&Xwyf0a(ma6{7vz)S~ypH7Zn^6qS0Kz0dF^DG*M!PZRSF zhV3%>pguHl)Lq%jaSd0T;Xkf>S)52M_WcJ$NSkWDmFbc=JP(f4s&^XnIDa~K3%Y0v zB1w`iEaO$7On+6)8SkUv*SZme6k02BX!&w0A|$~nk+GYjV|4@(`s=PRTQKCfYO-Q& zkcVOY+^nE!A|gW-q^*QgtdFvQl~H5!3SFYPDdhY8!nQ?R3Fk(2e}lq#)`g zYN?D|0`XQBg{7G>n3RV;)%&>&H1*ABoFzRJS76*+ZRd&$qz)B#sh!H)u40Wq4qZh+ zxrWxlnxGvSS7)Vq791X93H`OJjr(Q)T)l_>b~K zqy?;`QKGzFd|zvb`%9zkR`k z(RS_5#3HubbgA8ojZ7cq6KMX#&QB`76x?2+Kg2%jAL|8F(?TnRz#NBogjI*>(l3e~3!L zdlxu%oc;uU+7+Lo@HeT?$AZYrNkZ>M!2{jt)t`HOf26=eK-v4h_sw5A-V}Y7MR^39V$x*v@wmqYN?G{-VFpx`#eV|y4)e;$*Dy;x{9 zZ(KCxZ*u+CCh@V=^>T+yiu~k;pxL(@*2DL;@S*aDyb`7N+t0Fzo3@_q%1`VzbvGM8 z)$l8*nlD`u(28Oqm9gOG81qj?c(a(-zGkWWwxz_x1HHoHJUgF~L~Z#}#KoS<7}PiV zuZS_p%|2gUpdL@fbj`LfUvNI1A!S!sX=ysG_15aHxFCS-3g+>1=$m?a7H7iuNTs>$ z3#8{fP@Wzq+TZ`|y2{iSMSfjQz6;{$@e>ygF3#0YQx|t}J<2ueZf!MsYk&V-TB2&K zTj`&`$35|miYk{O1A(45<3&vg$f}E(E46@uuFJp}&_A1Zgg7{Ncl*koC4FRsIR64P Ca+$FJ delta 20883 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 diff --git a/cli/client.go b/cli/client.go index f5b38788b00..e576c0b6c39 100644 --- a/cli/client.go +++ b/cli/client.go @@ -92,6 +92,7 @@ var clientCmd = &cli.Command{ WithCategory("data", clientLocalCmd), WithCategory("data", clientStat), WithCategory("retrieval", clientFindCmd), + WithCategory("retrieval", clientQueryRetrievalAskCmd), WithCategory("retrieval", clientRetrieveCmd), WithCategory("retrieval", clientRetrieveCatCmd), WithCategory("retrieval", clientRetrieveLsCmd), @@ -1030,6 +1031,63 @@ var clientFindCmd = &cli.Command{ }, } +var clientQueryRetrievalAskCmd = &cli.Command{ + Name: "query-retrieval-ask", + Usage: "Get a miner's retrieval ask", + ArgsUsage: "[minerAddress] [data CID]", + Flags: []cli.Flag{ + &cli.Int64Flag{ + Name: "size", + Usage: "data size in bytes", + }, + }, + Action: func(cctx *cli.Context) error { + afmt := NewAppFmt(cctx.App) + if cctx.NArg() != 2 { + afmt.Println("Usage: query-retrieval-ask [minerAddress] [data CID]") + return nil + } + + maddr, err := address.NewFromString(cctx.Args().First()) + if err != nil { + return err + } + + dataCid, err := cid.Parse(cctx.Args().Get(1)) + if err != nil { + return fmt.Errorf("parsing data cid: %w", err) + } + + api, closer, err := GetFullNodeAPI(cctx) + if err != nil { + return err + } + defer closer() + ctx := ReqContext(cctx) + + ask, err := api.ClientMinerQueryOffer(ctx, maddr, dataCid, nil) + if err != nil { + return err + } + + afmt.Printf("Ask: %s\n", maddr) + afmt.Printf("Unseal price: %s\n", types.FIL(ask.UnsealPrice)) + afmt.Printf("Price per byte: %s\n", types.FIL(ask.PricePerByte)) + afmt.Printf("Payment interval: %s\n", types.SizeStr(types.NewInt(ask.PaymentInterval))) + afmt.Printf("Payment interval increase: %s\n", types.SizeStr(types.NewInt(ask.PaymentIntervalIncrease))) + + size := cctx.Int64("size") + if size == 0 { + return nil + } + transferPrice := types.BigMul(ask.PricePerByte, types.NewInt(uint64(size))) + totalPrice := types.BigAdd(ask.UnsealPrice, transferPrice) + afmt.Printf("Total price for %d bytes: %s\n", size, types.FIL(totalPrice)) + + return nil + }, +} + var clientListRetrievalsCmd = &cli.Command{ Name: "list-retrievals", Usage: "List retrieval market deals", diff --git a/documentation/en/api-v0-methods.md b/documentation/en/api-v0-methods.md index 257da9d1396..0544a9acc97 100644 --- a/documentation/en/api-v0-methods.md +++ b/documentation/en/api-v0-methods.md @@ -1386,6 +1386,7 @@ Response: "Size": 42, "MinPrice": "0", "UnsealPrice": "0", + "PricePerByte": "0", "PaymentInterval": 42, "PaymentIntervalIncrease": 42, "Miner": "f01234", diff --git a/documentation/en/api-v1-unstable-methods.md b/documentation/en/api-v1-unstable-methods.md index 9624f0e2699..c1d6c76e0f4 100644 --- a/documentation/en/api-v1-unstable-methods.md +++ b/documentation/en/api-v1-unstable-methods.md @@ -1425,6 +1425,7 @@ Response: "Size": 42, "MinPrice": "0", "UnsealPrice": "0", + "PricePerByte": "0", "PaymentInterval": 42, "PaymentIntervalIncrease": 42, "Miner": "f01234", diff --git a/documentation/en/cli-lotus.md b/documentation/en/cli-lotus.md index eaefe25cea9..64b378df3f7 100644 --- a/documentation/en/cli-lotus.md +++ b/documentation/en/cli-lotus.md @@ -424,12 +424,13 @@ COMMANDS: local List locally imported data stat Print information about a locally stored file (piece size, etc) RETRIEVAL: - find Find data in the network - retrieve Retrieve data from network - cat Show data from network - ls List object links - cancel-retrieval Cancel a retrieval deal by deal ID; this also cancels the associated transfer - list-retrievals List retrieval market deals + find Find data in the network + query-retrieval-ask Get a miner's retrieval ask + retrieve Retrieve data from network + cat Show data from network + ls List object links + cancel-retrieval Cancel a retrieval deal by deal ID; this also cancels the associated transfer + list-retrievals List retrieval market deals STORAGE: deal Initialize storage deal with a miner query-ask Find a miners ask @@ -535,6 +536,23 @@ OPTIONS: ``` +### lotus client query-retrieval-ask +``` +NAME: + lotus client query-retrieval-ask - Get a miner's retrieval ask + +USAGE: + lotus client query-retrieval-ask [command options] [minerAddress] [data CID] + +CATEGORY: + RETRIEVAL + +OPTIONS: + --size value data size in bytes (default: 0) + --help, -h show help (default: false) + +``` + ### lotus client retrieve ``` NAME: diff --git a/itests/kit/client.go b/itests/kit/client.go index c9f8946ec8c..5ca0ae4fe29 100644 --- a/itests/kit/client.go +++ b/itests/kit/client.go @@ -101,9 +101,14 @@ func RunClientTest(t *testing.T, cmds []*lcli.Command, clientNode *TestFullNode) time.Sleep(time.Second) } + // client query-retrieval-ask --size=1 + out = clientCLI.RunCmd("client", "query-retrieval-ask", "--size=1", minerAddr.String(), dataCid.String()) + require.Regexp(t, regexp.MustCompile("Ask:"), out) + fmt.Println("retrieval ask:\n", out) + // Retrieve the first file from the Miner // client retrieve - tmpdir, err := ioutil.TempDir(os.TempDir(), "test-cli-Client") + tmpdir, err := ioutil.TempDir(os.TempDir(), "test-cli-client") require.NoError(t, err) path := filepath.Join(tmpdir, "outfile.dat") out = clientCLI.RunCmd("client", "retrieve", dataCid.String(), path) diff --git a/node/impl/client/client.go b/node/impl/client/client.go index e3c365fee30..7848c84f92d 100644 --- a/node/impl/client/client.go +++ b/node/impl/client/client.go @@ -490,6 +490,7 @@ func (a *API) makeRetrievalQuery(ctx context.Context, rp rm.RetrievalPeer, paylo Size: queryResponse.Size, MinPrice: queryResponse.PieceRetrievalPrice(), UnsealPrice: queryResponse.UnsealPrice, + PricePerByte: queryResponse.MinPricePerByte, PaymentInterval: queryResponse.MaxPaymentInterval, PaymentIntervalIncrease: queryResponse.MaxPaymentIntervalIncrease, Miner: queryResponse.PaymentAddress, // TODO: check From 0f22d51309cd87b8139da03222492368697deb0c Mon Sep 17 00:00:00 2001 From: dirkmc Date: Fri, 17 Dec 2021 17:54:32 +0100 Subject: [PATCH 133/393] Update cli/client.go MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Łukasz Magiera --- cli/client.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/client.go b/cli/client.go index e576c0b6c39..c91d61e21bd 100644 --- a/cli/client.go +++ b/cli/client.go @@ -1032,7 +1032,7 @@ var clientFindCmd = &cli.Command{ } var clientQueryRetrievalAskCmd = &cli.Command{ - Name: "query-retrieval-ask", + Name: "retrieval-ask", Usage: "Get a miner's retrieval ask", ArgsUsage: "[minerAddress] [data CID]", Flags: []cli.Flag{ From bb56e97177bc8b89229d435b0e1834770b6a6b2f Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Fri, 17 Dec 2021 18:01:12 +0100 Subject: [PATCH 134/393] fix: rename query-retrieval-ask to retrieval-ask --- cli/client.go | 2 +- documentation/en/cli-lotus.md | 20 ++++++++++---------- itests/kit/client.go | 4 ++-- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/cli/client.go b/cli/client.go index c91d61e21bd..4025b9b563b 100644 --- a/cli/client.go +++ b/cli/client.go @@ -1044,7 +1044,7 @@ var clientQueryRetrievalAskCmd = &cli.Command{ Action: func(cctx *cli.Context) error { afmt := NewAppFmt(cctx.App) if cctx.NArg() != 2 { - afmt.Println("Usage: query-retrieval-ask [minerAddress] [data CID]") + afmt.Println("Usage: retrieval-ask [minerAddress] [data CID]") return nil } diff --git a/documentation/en/cli-lotus.md b/documentation/en/cli-lotus.md index 64b378df3f7..606921f872f 100644 --- a/documentation/en/cli-lotus.md +++ b/documentation/en/cli-lotus.md @@ -424,13 +424,13 @@ COMMANDS: local List locally imported data stat Print information about a locally stored file (piece size, etc) RETRIEVAL: - find Find data in the network - query-retrieval-ask Get a miner's retrieval ask - retrieve Retrieve data from network - cat Show data from network - ls List object links - cancel-retrieval Cancel a retrieval deal by deal ID; this also cancels the associated transfer - list-retrievals List retrieval market deals + find Find data in the network + retrieval-ask Get a miner's retrieval ask + retrieve Retrieve data from network + cat Show data from network + ls List object links + cancel-retrieval Cancel a retrieval deal by deal ID; this also cancels the associated transfer + list-retrievals List retrieval market deals STORAGE: deal Initialize storage deal with a miner query-ask Find a miners ask @@ -536,13 +536,13 @@ OPTIONS: ``` -### lotus client query-retrieval-ask +### lotus client retrieval-ask ``` NAME: - lotus client query-retrieval-ask - Get a miner's retrieval ask + lotus client retrieval-ask - Get a miner's retrieval ask USAGE: - lotus client query-retrieval-ask [command options] [minerAddress] [data CID] + lotus client retrieval-ask [command options] [minerAddress] [data CID] CATEGORY: RETRIEVAL diff --git a/itests/kit/client.go b/itests/kit/client.go index 5ca0ae4fe29..4c20e37c192 100644 --- a/itests/kit/client.go +++ b/itests/kit/client.go @@ -101,8 +101,8 @@ func RunClientTest(t *testing.T, cmds []*lcli.Command, clientNode *TestFullNode) time.Sleep(time.Second) } - // client query-retrieval-ask --size=1 - out = clientCLI.RunCmd("client", "query-retrieval-ask", "--size=1", minerAddr.String(), dataCid.String()) + // client retrieval-ask --size=1 + out = clientCLI.RunCmd("client", "retrieval-ask", "--size=1", minerAddr.String(), dataCid.String()) require.Regexp(t, regexp.MustCompile("Ask:"), out) fmt.Println("retrieval ask:\n", out) From aa1b77097488d854a9dfc726c9ad036e4af2e0b5 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Fri, 17 Dec 2021 00:58:20 -0500 Subject: [PATCH 135/393] Rand: Refactor so that versioning lives in StateRand --- chain/gen/genesis/miners.go | 22 +- chain/rand/rand.go | 40 ++- chain/stmgr/stmgr.go | 14 +- chain/vm/runtime.go | 21 +- chain/vm/vm.go | 7 +- conformance/rand_fixed.go | 18 +- conformance/rand_record.go | 28 +- conformance/rand_replay.go | 38 +-- testplans/lotus-soup/go.mod | 2 +- testplans/lotus-soup/go.sum | 624 ++++++++++++------------------------ 10 files changed, 254 insertions(+), 560 deletions(-) diff --git a/chain/gen/genesis/miners.go b/chain/gen/genesis/miners.go index 66691205802..a688a032420 100644 --- a/chain/gen/genesis/miners.go +++ b/chain/gen/genesis/miners.go @@ -510,31 +510,13 @@ func SetupStorageMiners(ctx context.Context, cs *store.ChainStore, sys vm.Syscal // TODO: copied from actors test harness, deduplicate or remove from here type fakeRand struct{} -func (fr *fakeRand) GetChainRandomnessV2(ctx context.Context, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) ([]byte, error) { +func (fr *fakeRand) GetChainRandomness(ctx context.Context, rnv network.Version, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) ([]byte, error) { out := make([]byte, 32) _, _ = rand.New(rand.NewSource(int64(randEpoch * 1000))).Read(out) //nolint return out, nil } -func (fr *fakeRand) GetChainRandomnessV1(ctx context.Context, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) ([]byte, error) { - out := make([]byte, 32) - _, _ = rand.New(rand.NewSource(int64(randEpoch * 1000))).Read(out) //nolint - return out, nil -} - -func (fr *fakeRand) GetBeaconRandomnessV3(ctx context.Context, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) ([]byte, error) { - out := make([]byte, 32) - _, _ = rand.New(rand.NewSource(int64(randEpoch))).Read(out) //nolint - return out, nil -} - -func (fr *fakeRand) GetBeaconRandomnessV2(ctx context.Context, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) ([]byte, error) { - out := make([]byte, 32) - _, _ = rand.New(rand.NewSource(int64(randEpoch))).Read(out) //nolint - return out, nil -} - -func (fr *fakeRand) GetBeaconRandomnessV1(ctx context.Context, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) ([]byte, error) { +func (fr *fakeRand) GetBeaconRandomness(ctx context.Context, rnv network.Version, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) ([]byte, error) { out := make([]byte, 32) _, _ = rand.New(rand.NewSource(int64(randEpoch))).Read(out) //nolint return out, nil diff --git a/chain/rand/rand.go b/chain/rand/rand.go index 10eb0436d6c..6a54a2427bf 100644 --- a/chain/rand/rand.go +++ b/chain/rand/rand.go @@ -4,6 +4,8 @@ import ( "context" "encoding/binary" + "github.com/filecoin-project/go-state-types/network" + logging "github.com/ipfs/go-log/v2" "github.com/filecoin-project/lotus/chain/beacon" @@ -70,7 +72,7 @@ func (sr *stateRand) GetBeaconRandomnessTipset(ctx context.Context, round abi.Ch return randTs, nil } -func (sr *stateRand) GetChainRandomness(ctx context.Context, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte, lookback bool) ([]byte, error) { +func (sr *stateRand) getChainRandomness(ctx context.Context, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte, lookback bool) ([]byte, error) { _, span := trace.StartSpan(ctx, "store.GetChainRandomness") defer span.End() span.AddAttributes(trace.Int64Attribute("round", int64(round))) @@ -116,17 +118,7 @@ func NewStateRand(cs *store.ChainStore, blks []cid.Cid, b beacon.Schedule) vm.Ra } // network v0-12 -func (sr *stateRand) GetChainRandomnessV1(ctx context.Context, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) { - return sr.GetChainRandomness(ctx, pers, round, entropy, true) -} - -// network v13 and on -func (sr *stateRand) GetChainRandomnessV2(ctx context.Context, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) { - return sr.GetChainRandomness(ctx, pers, round, entropy, false) -} - -// network v0-12 -func (sr *stateRand) GetBeaconRandomnessV1(ctx context.Context, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) { +func (sr *stateRand) getBeaconRandomnessV1(ctx context.Context, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) { randTs, err := sr.GetBeaconRandomnessTipset(ctx, round, true) if err != nil { return nil, err @@ -143,7 +135,7 @@ func (sr *stateRand) GetBeaconRandomnessV1(ctx context.Context, pers crypto.Doma } // network v13 -func (sr *stateRand) GetBeaconRandomnessV2(ctx context.Context, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) { +func (sr *stateRand) getBeaconRandomnessV2(ctx context.Context, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) { randTs, err := sr.GetBeaconRandomnessTipset(ctx, round, false) if err != nil { return nil, err @@ -160,9 +152,9 @@ func (sr *stateRand) GetBeaconRandomnessV2(ctx context.Context, pers crypto.Doma } // network v14 and on -func (sr *stateRand) GetBeaconRandomnessV3(ctx context.Context, pers crypto.DomainSeparationTag, filecoinEpoch abi.ChainEpoch, entropy []byte) ([]byte, error) { +func (sr *stateRand) getBeaconRandomnessV3(ctx context.Context, pers crypto.DomainSeparationTag, filecoinEpoch abi.ChainEpoch, entropy []byte) ([]byte, error) { if filecoinEpoch < 0 { - return sr.GetBeaconRandomnessV2(ctx, pers, filecoinEpoch, entropy) + return sr.getBeaconRandomnessV2(ctx, pers, filecoinEpoch, entropy) } be, err := sr.extractBeaconEntryForEpoch(ctx, filecoinEpoch) @@ -174,6 +166,24 @@ func (sr *stateRand) GetBeaconRandomnessV3(ctx context.Context, pers crypto.Doma return DrawRandomness(be.Data, pers, filecoinEpoch, entropy) } +func (sr *stateRand) GetChainRandomness(ctx context.Context, nv network.Version, pers crypto.DomainSeparationTag, filecoinEpoch abi.ChainEpoch, entropy []byte) ([]byte, error) { + if nv >= network.Version13 { + return sr.getChainRandomness(ctx, pers, filecoinEpoch, entropy, false) + } + + return sr.getChainRandomness(ctx, pers, filecoinEpoch, entropy, true) +} + +func (sr *stateRand) GetBeaconRandomness(ctx context.Context, nv network.Version, pers crypto.DomainSeparationTag, filecoinEpoch abi.ChainEpoch, entropy []byte) ([]byte, error) { + if nv >= network.Version14 { + return sr.getBeaconRandomnessV3(ctx, pers, filecoinEpoch, entropy) + } else if nv == network.Version13 { + return sr.getBeaconRandomnessV2(ctx, pers, filecoinEpoch, entropy) + } else { + return sr.getBeaconRandomnessV1(ctx, pers, filecoinEpoch, entropy) + } +} + func (sr *stateRand) extractBeaconEntryForEpoch(ctx context.Context, filecoinEpoch abi.ChainEpoch) (*types.BeaconEntry, error) { randTs, err := sr.GetBeaconRandomnessTipset(ctx, filecoinEpoch, false) if err != nil { diff --git a/chain/stmgr/stmgr.go b/chain/stmgr/stmgr.go index cfd9192f484..06b363733ff 100644 --- a/chain/stmgr/stmgr.go +++ b/chain/stmgr/stmgr.go @@ -380,13 +380,7 @@ func (sm *StateManager) GetRandomnessFromBeacon(ctx context.Context, personaliza r := rand.NewStateRand(sm.ChainStore(), pts.Cids(), sm.beacon) rnv := sm.GetNtwkVersion(ctx, randEpoch) - if rnv >= network.Version14 { - return r.GetBeaconRandomnessV3(ctx, personalization, randEpoch, entropy) - } else if rnv == network.Version13 { - return r.GetBeaconRandomnessV2(ctx, personalization, randEpoch, entropy) - } - - return r.GetBeaconRandomnessV1(ctx, personalization, randEpoch, entropy) + return r.GetBeaconRandomness(ctx, rnv, personalization, randEpoch, entropy) } @@ -399,9 +393,5 @@ func (sm *StateManager) GetRandomnessFromTickets(ctx context.Context, personaliz r := rand.NewStateRand(sm.ChainStore(), pts.Cids(), sm.beacon) rnv := sm.GetNtwkVersion(ctx, randEpoch) - if rnv >= network.Version13 { - return r.GetChainRandomnessV2(ctx, personalization, randEpoch, entropy) - } - - return r.GetChainRandomnessV1(ctx, personalization, randEpoch, entropy) + return r.GetChainRandomness(ctx, rnv, personalization, randEpoch, entropy) } diff --git a/chain/vm/runtime.go b/chain/vm/runtime.go index 3eaa5d69e66..9bbed403093 100644 --- a/chain/vm/runtime.go +++ b/chain/vm/runtime.go @@ -224,16 +224,8 @@ func (rt *Runtime) GetActorCodeCID(addr address.Address) (ret cid.Cid, ok bool) } func (rt *Runtime) GetRandomnessFromTickets(personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) abi.Randomness { - var err error - var res []byte - rnv := rt.vm.ntwkVersion(rt.ctx, randEpoch) - - if rnv >= network.Version13 { - res, err = rt.vm.rand.GetChainRandomnessV2(rt.ctx, personalization, randEpoch, entropy) - } else { - res, err = rt.vm.rand.GetChainRandomnessV1(rt.ctx, personalization, randEpoch, entropy) - } + res, err := rt.vm.rand.GetChainRandomness(rt.ctx, rnv, personalization, randEpoch, entropy) if err != nil { panic(aerrors.Fatalf("could not get ticket randomness: %s", err)) @@ -242,17 +234,8 @@ func (rt *Runtime) GetRandomnessFromTickets(personalization crypto.DomainSeparat } func (rt *Runtime) GetRandomnessFromBeacon(personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) abi.Randomness { - var err error - var res []byte - rnv := rt.vm.ntwkVersion(rt.ctx, randEpoch) - if rnv >= network.Version14 { - res, err = rt.vm.rand.GetBeaconRandomnessV3(rt.ctx, personalization, randEpoch, entropy) - } else if rnv == network.Version13 { - res, err = rt.vm.rand.GetBeaconRandomnessV2(rt.ctx, personalization, randEpoch, entropy) - } else { - res, err = rt.vm.rand.GetBeaconRandomnessV1(rt.ctx, personalization, randEpoch, entropy) - } + res, err := rt.vm.rand.GetBeaconRandomness(rt.ctx, rnv, personalization, randEpoch, entropy) if err != nil { panic(aerrors.Fatalf("could not get beacon randomness: %s", err)) diff --git a/chain/vm/vm.go b/chain/vm/vm.go index 0f8c2db1107..4536460309f 100644 --- a/chain/vm/vm.go +++ b/chain/vm/vm.go @@ -260,11 +260,8 @@ func NewVM(ctx context.Context, opts *VMOpts) (*VM, error) { } type Rand interface { - GetChainRandomnessV1(ctx context.Context, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) - GetChainRandomnessV2(ctx context.Context, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) - GetBeaconRandomnessV1(ctx context.Context, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) - GetBeaconRandomnessV2(ctx context.Context, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) - GetBeaconRandomnessV3(ctx context.Context, pers crypto.DomainSeparationTag, filecoinEpoch abi.ChainEpoch, entropy []byte) ([]byte, error) + GetChainRandomness(ctx context.Context, nv network.Version, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) + GetBeaconRandomness(ctx context.Context, nv network.Version, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) } type ApplyRet struct { diff --git a/conformance/rand_fixed.go b/conformance/rand_fixed.go index c34980efe1d..4284f98ff00 100644 --- a/conformance/rand_fixed.go +++ b/conformance/rand_fixed.go @@ -3,6 +3,8 @@ package conformance import ( "context" + "github.com/filecoin-project/go-state-types/network" + "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/crypto" @@ -19,22 +21,10 @@ func NewFixedRand() vm.Rand { return &fixedRand{} } -func (r *fixedRand) GetChainRandomnessV1(_ context.Context, _ crypto.DomainSeparationTag, _ abi.ChainEpoch, _ []byte) ([]byte, error) { - return []byte("i_am_random_____i_am_random_____"), nil // 32 bytes. -} - -func (r *fixedRand) GetChainRandomnessV2(_ context.Context, _ crypto.DomainSeparationTag, _ abi.ChainEpoch, _ []byte) ([]byte, error) { - return []byte("i_am_random_____i_am_random_____"), nil // 32 bytes. -} - -func (r *fixedRand) GetBeaconRandomnessV3(_ context.Context, _ crypto.DomainSeparationTag, _ abi.ChainEpoch, _ []byte) ([]byte, error) { - return []byte("i_am_random_____i_am_random_____"), nil // 32 bytes. -} - -func (r *fixedRand) GetBeaconRandomnessV1(_ context.Context, _ crypto.DomainSeparationTag, _ abi.ChainEpoch, _ []byte) ([]byte, error) { +func (r *fixedRand) GetChainRandomness(_ context.Context, _ network.Version, _ crypto.DomainSeparationTag, _ abi.ChainEpoch, _ []byte) ([]byte, error) { return []byte("i_am_random_____i_am_random_____"), nil // 32 bytes. } -func (r *fixedRand) GetBeaconRandomnessV2(_ context.Context, _ crypto.DomainSeparationTag, _ abi.ChainEpoch, _ []byte) ([]byte, error) { +func (r *fixedRand) GetBeaconRandomness(_ context.Context, _ network.Version, _ crypto.DomainSeparationTag, _ abi.ChainEpoch, _ []byte) ([]byte, error) { return []byte("i_am_random_____i_am_random_____"), nil // 32 bytes. } diff --git a/conformance/rand_record.go b/conformance/rand_record.go index 97bd93eb454..f6eeaa6c98d 100644 --- a/conformance/rand_record.go +++ b/conformance/rand_record.go @@ -5,6 +5,8 @@ import ( "fmt" "sync" + "github.com/filecoin-project/go-state-types/network" + "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/crypto" @@ -45,17 +47,9 @@ func (r *RecordingRand) loadHead() { r.head = head.Key() } -func (r *RecordingRand) GetChainRandomnessV2(ctx context.Context, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) { - return r.getChainRandomness(ctx, pers, round, entropy) -} - -func (r *RecordingRand) GetChainRandomnessV1(ctx context.Context, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) { - return r.getChainRandomness(ctx, pers, round, entropy) -} - -func (r *RecordingRand) getChainRandomness(ctx context.Context, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) { +func (r *RecordingRand) GetChainRandomness(ctx context.Context, nv network.Version, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) { r.once.Do(r.loadHead) - // FullNode's ChainGetRandomnessFromTickets handles whether we should be looking forward or back + // FullNode's v0 ChainGetRandomnessFromTickets handles whether we should be looking forward or back ret, err := r.api.ChainGetRandomnessFromTickets(ctx, r.head, pers, round, entropy) if err != nil { return ret, err @@ -79,19 +73,7 @@ func (r *RecordingRand) getChainRandomness(ctx context.Context, pers crypto.Doma return ret, err } -func (r *RecordingRand) GetBeaconRandomnessV3(ctx context.Context, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) { - return r.getBeaconRandomness(ctx, pers, round, entropy) -} - -func (r *RecordingRand) GetBeaconRandomnessV1(ctx context.Context, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) { - return r.getBeaconRandomness(ctx, pers, round, entropy) -} - -func (r *RecordingRand) GetBeaconRandomnessV2(ctx context.Context, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) { - return r.getBeaconRandomness(ctx, pers, round, entropy) -} - -func (r *RecordingRand) getBeaconRandomness(ctx context.Context, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) { +func (r *RecordingRand) GetBeaconRandomness(ctx context.Context, nv network.Version, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) { r.once.Do(r.loadHead) ret, err := r.api.StateGetRandomnessFromBeacon(ctx, pers, round, entropy, r.head) if err != nil { diff --git a/conformance/rand_replay.go b/conformance/rand_replay.go index 5d850f7ebbe..1907ddf24d0 100644 --- a/conformance/rand_replay.go +++ b/conformance/rand_replay.go @@ -4,6 +4,8 @@ import ( "bytes" "context" + "github.com/filecoin-project/go-state-types/network" + "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/crypto" @@ -43,15 +45,7 @@ func (r *ReplayingRand) match(requested schema.RandomnessRule) ([]byte, bool) { return nil, false } -func (r *ReplayingRand) GetChainRandomnessV1(ctx context.Context, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) { - return r.getChainRandomness(ctx, pers, round, entropy, false) -} - -func (r *ReplayingRand) GetChainRandomnessV2(ctx context.Context, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) { - return r.getChainRandomness(ctx, pers, round, entropy, true) -} - -func (r *ReplayingRand) getChainRandomness(ctx context.Context, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte, lookback bool) ([]byte, error) { +func (r *ReplayingRand) GetChainRandomness(ctx context.Context, nv network.Version, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) { rule := schema.RandomnessRule{ Kind: schema.RandomnessChain, DomainSeparationTag: int64(pers), @@ -66,26 +60,10 @@ func (r *ReplayingRand) getChainRandomness(ctx context.Context, pers crypto.Doma r.reporter.Logf("returning fallback chain randomness: dst=%d, epoch=%d, entropy=%x", pers, round, entropy) - if lookback { - return r.fallback.GetChainRandomnessV1(ctx, pers, round, entropy) - } - - return r.fallback.GetChainRandomnessV2(ctx, pers, round, entropy) + return r.fallback.GetChainRandomness(ctx, nv, pers, round, entropy) } -func (r *ReplayingRand) GetBeaconRandomnessV3(ctx context.Context, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) { - return r.getBeaconRandomness(ctx, pers, round, entropy, false) -} - -func (r *ReplayingRand) GetBeaconRandomnessV1(ctx context.Context, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) { - return r.getBeaconRandomness(ctx, pers, round, entropy, true) -} - -func (r *ReplayingRand) GetBeaconRandomnessV2(ctx context.Context, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) { - return r.getBeaconRandomness(ctx, pers, round, entropy, true) -} - -func (r *ReplayingRand) getBeaconRandomness(ctx context.Context, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte, lookback bool) ([]byte, error) { +func (r *ReplayingRand) GetBeaconRandomness(ctx context.Context, nv network.Version, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) { rule := schema.RandomnessRule{ Kind: schema.RandomnessBeacon, DomainSeparationTag: int64(pers), @@ -100,9 +78,5 @@ func (r *ReplayingRand) getBeaconRandomness(ctx context.Context, pers crypto.Dom r.reporter.Logf("returning fallback beacon randomness: dst=%d, epoch=%d, entropy=%x", pers, round, entropy) - if lookback { - return r.fallback.GetBeaconRandomnessV1(ctx, pers, round, entropy) - } - - return r.fallback.GetBeaconRandomnessV3(ctx, pers, round, entropy) + return r.fallback.GetBeaconRandomness(ctx, nv, pers, round, entropy) } diff --git a/testplans/lotus-soup/go.mod b/testplans/lotus-soup/go.mod index 472a38357ec..e7d03c23b48 100644 --- a/testplans/lotus-soup/go.mod +++ b/testplans/lotus-soup/go.mod @@ -6,7 +6,7 @@ require ( contrib.go.opencensus.io/exporter/prometheus v0.4.0 github.com/codeskyblue/go-sh v0.0.0-20200712050446-30169cf553fe github.com/davecgh/go-spew v1.1.1 - github.com/drand/drand v1.2.8-0.20211214135232-3ce1e81cdbcc + github.com/drand/drand v1.3.0 github.com/filecoin-project/go-address v0.0.6 github.com/filecoin-project/go-data-transfer v1.12.0 github.com/filecoin-project/go-fil-markets v1.13.5 diff --git a/testplans/lotus-soup/go.sum b/testplans/lotus-soup/go.sum index 325c08fdb70..c16a429cc0a 100644 --- a/testplans/lotus-soup/go.sum +++ b/testplans/lotus-soup/go.sum @@ -37,15 +37,7 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= collectd.org v0.3.0/go.mod h1:A/8DzQBkF6abtvrT2j/AU/4tiBgJWYyh0y/oB/4MlWE= -<<<<<<< HEAD -contrib.go.opencensus.io/exporter/jaeger v0.1.0/go.mod h1:VYianECmuFPwU37O699Vc1GOcy+y8kOsfaxHRImmjbA= -contrib.go.opencensus.io/exporter/jaeger v0.2.1/go.mod h1:Y8IsLgdxqh1QxYxPC5IgXVmBaeLUeQFfBeBi9PbeZd0= -contrib.go.opencensus.io/exporter/prometheus v0.1.0 h1:SByaIoWwNgMdPSgl5sMqM2KDE5H/ukPWBRo314xiDvg= -contrib.go.opencensus.io/exporter/prometheus v0.1.0/go.mod h1:cGFniUXGZlKRjzOyuZJ6mgB+PgBcCIa79kEKR8YCW+A= -======= -contrib.go.opencensus.io/exporter/jaeger v0.2.1/go.mod h1:Y8IsLgdxqh1QxYxPC5IgXVmBaeLUeQFfBeBi9PbeZd0= contrib.go.opencensus.io/exporter/prometheus v0.4.0 h1:0QfIkj9z/iVZgK31D9H9ohjjIDApI2GOPScCKwxedbs= ->>>>>>> master contrib.go.opencensus.io/exporter/prometheus v0.4.0/go.mod h1:o7cosnyfuPVK0tB8q0QmaQNhGnptITnPQB+z1+qeFB0= dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= @@ -86,10 +78,7 @@ github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZ github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -<<<<<<< HEAD -======= github.com/BurntSushi/toml v0.4.1 h1:GaI7EiDXDRfa8VshkTj7Fym7ha+y8/XxIgD2okUIjLw= ->>>>>>> master github.com/BurntSushi/toml v0.4.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= @@ -99,20 +88,12 @@ 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= github.com/GeertJohan/go.incremental v1.0.0/go.mod h1:6fAjUhbVuX1KcMD3c8TEgVUqmo4seqhv0i0kdATSkM0= -<<<<<<< HEAD -github.com/GeertJohan/go.rice v1.0.0 h1:KkI6O9uMaQU3VEKaj01ulavtF7o1fWT7+pk/4voiMLQ= -github.com/GeertJohan/go.rice v1.0.0/go.mod h1:eH6gbSOAUv07dQuZVnBmoDP8mgsM1rtixis4Tib9if0= -======= github.com/GeertJohan/go.rice v1.0.2 h1:PtRw+Tg3oa3HYwiDBZyvOJ8LdIyf6lAovJJtr7YOAYk= ->>>>>>> master 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= -<<<<<<< HEAD -======= github.com/HdrHistogram/hdrhistogram-go v1.1.2 h1:5IcZpTvzydCQeHzK4Ef/D5rrSqwxob0t8PQPMybUNFM= ->>>>>>> master 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= @@ -133,12 +114,7 @@ github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdko github.com/SAP/go-hdb v0.14.1/go.mod h1:7fdQLVC2lER3urZLjZCm0AuMQfApof92n3aylBPEkMo= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= -<<<<<<< HEAD -github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d h1:G0m3OIz70MZUWq3EgK3CesDbo8upS2Vm9/P3FtgI+Jk= -github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= -======= github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= ->>>>>>> master github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= github.com/Stebalien/go-bitfield v0.0.1 h1:X3kbSSPUaJK60wV2hjOPZwmpljr6VGCqdq4cBLhbQBo= github.com/Stebalien/go-bitfield v0.0.1/go.mod h1:GNjFpasyUVkHMsfEOk8EFLJ9syQ6SI+XWrX9Wf2XH0s= @@ -204,11 +180,11 @@ github.com/aws/aws-sdk-go-v2/service/sts v1.2.2/go.mod h1:ssRzzJ2RZOVuKj2Vx1YE7y github.com/aws/smithy-go v1.3.1/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= 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.1/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= github.com/benbjohnson/clock v1.0.2/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= -github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/benbjohnson/clock v1.2.0 h1:9Re3G2TWxkE06LdMWMpcY6KV81GLXMGiYpPYUPkFAws= +github.com/benbjohnson/clock v1.2.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/benbjohnson/immutable v0.2.1/go.mod h1:uc6OHo6PN2++n98KHLxW8ef4W42ylHiQSENghE1ezxI= github.com/benbjohnson/tmpl v1.0.0/go.mod h1:igT620JFIi44B6awvU9IsDhR77IXWtFigTLil/RPdps= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= @@ -243,12 +219,7 @@ github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= -<<<<<<< HEAD -github.com/buger/goterm v0.0.0-20200322175922-2f3e71b85129 h1:gfAMKE626QEuKG3si0pdTRcr/YEbBoxY+3GOH3gWvl4= -github.com/buger/goterm v0.0.0-20200322175922-2f3e71b85129/go.mod h1:u9UyCz2eTrSGy6fbupqJ54eY5c4IC8gREQ1053dK12U= -======= github.com/buger/goterm v1.0.3 h1:7V/HeAQHrzPk/U4BvyH2g9u+xbUW9nr4yRPyG59W4fM= ->>>>>>> master 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/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34= @@ -259,15 +230,11 @@ github.com/cenkalti/backoff v0.0.0-20181003080854-62661b46c409/go.mod h1:90ReRw6 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/certifi/gocertifi v0.0.0-20200211180108-c7c1fbc02894/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= 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.0/go.mod h1:dgIUBU3pDso/gPgZ1osOZ0iQf77oPR28Tjxl5dIMyVM= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -<<<<<<< HEAD -======= github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= ->>>>>>> master 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= @@ -277,6 +244,7 @@ github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e h1:fY5BOSpyZCqRo5O github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1 h1:q763qf9huN11kDQavWsoZXJNW3xEE4JJyHa5Q25/sd8= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/cilium/ebpf v0.2.0 h1:Fv93L3KKckEcEHR3oApXVzyBTDA8WAm6VXhPE00N3f8= github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= 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= @@ -287,11 +255,6 @@ github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGX github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= -github.com/cockroachdb/pebble v0.0.0-20200916222308-4e219a90ba5b/go.mod h1:hU7vhtrqonEphNF+xt8/lHdaBprxmV1h8BOGrd9XwmQ= -github.com/cockroachdb/pebble v0.0.0-20201001221639-879f3bfeef07/go.mod h1:hU7vhtrqonEphNF+xt8/lHdaBprxmV1h8BOGrd9XwmQ= -github.com/cockroachdb/redact v0.0.0-20200622112456-cd282804bbd3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= 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/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0 h1:sDMmm+q/3+BukdIpxwO365v/Rbspp2Nt5XntgQRXq8Q= @@ -312,10 +275,7 @@ github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7 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.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= -<<<<<<< HEAD -======= github.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI= ->>>>>>> master 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= @@ -353,13 +313,12 @@ github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6ps github.com/dgraph-io/badger v1.6.1/go.mod h1:FRmFw3uxvcpa8zG3Rxs0th+hCLIuaQg8HlNV5bjgnuU= github.com/dgraph-io/badger v1.6.2 h1:mNw0qs90GVgGGWylh0umH5iag1j6n/PeJtNvL6KY/x8= github.com/dgraph-io/badger v1.6.2/go.mod h1:JW2yswe3V058sS0kZ2h/AXeDSqFjxnZcRrVH//y2UQE= -github.com/dgraph-io/badger/v2 v2.0.3/go.mod h1:3KY8+bsP8wI0OEnQJAKpd4wIJW/Mm32yw2j/9FUVnIM= -github.com/dgraph-io/badger/v2 v2.2007.2 h1:EjjK0KqwaFMlPin1ajhP943VPENHJdEz1KLIegjaI3k= -github.com/dgraph-io/badger/v2 v2.2007.2/go.mod h1:26P/7fbL4kUZVEVKLAKXkBXKOydDmM2p1e+NhhnBCAE= -github.com/dgraph-io/ristretto v0.0.2-0.20200115201040-8f368f2f2ab3/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= +github.com/dgraph-io/badger/v2 v2.2007.3 h1:Sl9tQWz92WCbVSe8pj04Tkqlm2boW+KAxd+XSs58SQI= +github.com/dgraph-io/badger/v2 v2.2007.3/go.mod h1:26P/7fbL4kUZVEVKLAKXkBXKOydDmM2p1e+NhhnBCAE= github.com/dgraph-io/ristretto v0.0.2/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= -github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de h1:t0UHb5vdojIDUqktM6+xJAfScFBsVpXZmqC9dsgJmeA= github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= +github.com/dgraph-io/ristretto v0.1.0 h1:Jv3CGQHp9OjuMBSne1485aDpUkTKEcUqF+jm/LuerPI= +github.com/dgraph-io/ristretto v0.1.0/go.mod h1:fux0lOrBhrVCJd3lcTHsIJhq1T2rokOu6v9Vcb3Q9ug= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-bitstream v0.0.0-20180413035011-3522498ce2c8/go.mod h1:VMaSuZ+SZcx/wljOQKvp5srsbCiKDEb6K2wC4+PiBmQ= github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= @@ -373,12 +332,13 @@ github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDD github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/drand/bls12-381 v0.3.2/go.mod h1:dtcLgPtYT38L3NO6mPDYH0nbpc5tjPassDqiniuAt4Y= -github.com/drand/drand v1.2.1 h1:KB7z+69YbnQ5z22AH/LMi0ObDR8DzYmrkS6vZXTR9jI= -github.com/drand/drand v1.2.1/go.mod h1:j0P7RGmVaY7E/OuO2yQOcQj7OgeZCuhgu2gdv0JAm+g= +github.com/drand/drand v1.3.0 h1:k/w/PtHzmlU6OmfoAqgirWyrJ4FZH8ESlJrsKF20UkM= +github.com/drand/drand v1.3.0/go.mod h1:D6kAVlxufq1gi71YCGfzN455JrXF4Q272ZJEG975fzo= github.com/drand/kyber v1.0.1-0.20200110225416-8de27ed8c0e2/go.mod h1:UpXoA0Upd1N9l4TvRPHr1qAUBBERj6JQ/mnKI3BPEmw= github.com/drand/kyber v1.0.2/go.mod h1:x6KOpK7avKj0GJ4emhXFP5n7M7W7ChAPmnQh/OL6vRw= -github.com/drand/kyber v1.1.4 h1:YvKM03QWGvLrdTnYmxxP5iURAX+Gdb6qRDUOgg8i60Q= github.com/drand/kyber v1.1.4/go.mod h1:9+IgTq7kadePhZg7eRwSD7+bA+bmvqRK+8DtmoV5a3U= +github.com/drand/kyber v1.1.7 h1:YnOshFoGYSOdhf4K8BiDw4XL/l6caL92vsodAsVQbJI= +github.com/drand/kyber v1.1.7/go.mod h1:UkHLsI4W6+jT5PvNxmc0cvQAgppjTUpX+XCsN9TXmRo= github.com/drand/kyber-bls12381 v0.2.0/go.mod h1:zQip/bHdeEB6HFZSU3v+d3cQE0GaBVQw9aR2E7AdoeI= github.com/drand/kyber-bls12381 v0.2.1 h1:/d5/YAdaCmHpYjF1NZevOEcKGaq6LBbyvkCTIdGqDjs= github.com/drand/kyber-bls12381 v0.2.1/go.mod h1:JwWn4nHO9Mp4F5qCie5sVIPQZ0X6cw8XAeMRvc/GXBE= @@ -390,20 +350,12 @@ github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1 github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= github.com/eclipse/paho.mqtt.golang v1.2.0/go.mod h1:H9keYFcgq3Qr5OUJm/JZI/i6U7joQ8SYLhZwfeOo6Ts= github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= -<<<<<<< HEAD -github.com/elastic/go-sysinfo v1.3.0 h1:eb2XFGTMlSwG/yyU9Y8jVAYLIzU2sFzWXwo2gmetyrE= -github.com/elastic/go-sysinfo v1.3.0/go.mod h1:i1ZYdU10oLNfRzq4vq62BEwD2fH8KaWh6eh0ikPT9F0= -======= github.com/elastic/go-sysinfo v1.7.0 h1:4vVvcfi255+8+TyQ7TYUTEK3A+G8v5FLE+ZKYL1z1Dg= ->>>>>>> master github.com/elastic/go-sysinfo v1.7.0/go.mod h1:i1ZYdU10oLNfRzq4vq62BEwD2fH8KaWh6eh0ikPT9F0= github.com/elastic/go-windows v1.0.0 h1:qLURgZFkkrYyTTkvYpsZIgf83AUsdIHfvlJaqaZ7aSY= github.com/elastic/go-windows v1.0.0/go.mod h1:TsU0Nrp7/y3+VwE82FoZF8gC/XFg/Elz6CcloAxnPgU= github.com/elastic/gosigar v0.12.0/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= -<<<<<<< HEAD -======= github.com/elastic/gosigar v0.14.1 h1:T0aQ7n/n2ZA9W7DmAnj60v+qzqKERdBgJBO1CG2W6rc= ->>>>>>> master github.com/elastic/gosigar v0.14.1/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/ema/qdisc v0.0.0-20190904071900-b82c76788043/go.mod h1:ix4kG2zvdUd8kEKSW0ZTr1XLks0epFpI4j745DXxlNE= @@ -425,20 +377,14 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv 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= -<<<<<<< HEAD -======= github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= ->>>>>>> master github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/filecoin-project/dagstore v0.4.2/go.mod h1:WY5OoLfnwISCk6eASSF927KKPqLPIlTwmG1qHpA08KY= -github.com/filecoin-project/dagstore v0.4.3 h1:yeFl6+2BRY1gOVp/hrZuFa24s7LY0Qqkqx/Gh8lidZs= -github.com/filecoin-project/dagstore v0.4.3/go.mod h1:dm/91AO5UaDd3bABFjg/5fmRH99vvpS7g1mykqvz6KQ= +github.com/filecoin-project/dagstore v0.4.3-0.20211211192320-72b849e131d2/go.mod h1:tlV8C11UljvFq3WWlMh2oMViEaVaPb6uT8eL/YQgDfk= +github.com/filecoin-project/dagstore v0.4.4 h1:luolWahhzp3ulRsapGKE7raoLE3n2cFkQUJjPyqUmF4= +github.com/filecoin-project/dagstore v0.4.4/go.mod h1:7BlOvaTJrFJ1Qemt5jHlLJ4VhDIuSIzGS0IwO/0AXPA= github.com/filecoin-project/go-address v0.0.3/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= github.com/filecoin-project/go-address v0.0.5/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= -<<<<<<< HEAD -======= github.com/filecoin-project/go-address v0.0.6 h1:DWQtj38ax+ogHwyH3VULRIoT8E6loyXqsk/p81xoY7M= ->>>>>>> master github.com/filecoin-project/go-address v0.0.6/go.mod h1:7B0/5DA13n6nHkB8bbGx1gWzG/dbTsZ0fgOJVGsM3TE= github.com/filecoin-project/go-amt-ipld/v2 v2.1.0 h1:t6qDiuGYYngDqaLc2ZUvdtAg4UNxPeOYaXhBWSNsVaM= github.com/filecoin-project/go-amt-ipld/v2 v2.1.0/go.mod h1:nfFPoGyX0CU9SkXX8EoCcSuHN1XcbN0c6KBh7yvP5fs= @@ -450,47 +396,25 @@ github.com/filecoin-project/go-bitfield v0.2.3/go.mod h1:CNl9WG8hgR5mttCnUErjcQj github.com/filecoin-project/go-bitfield v0.2.4 h1:uZ7MeE+XfM5lqrHJZ93OnhQKc/rveW8p9au0C68JPgk= github.com/filecoin-project/go-bitfield v0.2.4/go.mod h1:CNl9WG8hgR5mttCnUErjcQjGvuiZjRqK9rHVBsQF4oM= github.com/filecoin-project/go-cbor-util v0.0.0-20191219014500-08c40a1e63a2/go.mod h1:pqTiPHobNkOVM5thSRsHYjyQfq7O5QSCMhvuu9JoDlg= -<<<<<<< HEAD -github.com/filecoin-project/go-cbor-util v0.0.1/go.mod h1:pqTiPHobNkOVM5thSRsHYjyQfq7O5QSCMhvuu9JoDlg= -github.com/filecoin-project/go-commp-utils v0.1.1-0.20210427191551-70bf140d31c7 h1:U9Z+76pHCKBmtdxFV7JFZJj7OVm12I6dEKwtMVbq5p0= -github.com/filecoin-project/go-commp-utils v0.1.1-0.20210427191551-70bf140d31c7/go.mod h1:6s95K91mCyHY51RPWECZieD3SGWTqIFLf1mPOes9l5U= -github.com/filecoin-project/go-commp-utils v0.1.2/go.mod h1:6s95K91mCyHY51RPWECZieD3SGWTqIFLf1mPOes9l5U= -github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03 h1:2pMXdBnCiXjfCYx/hLqFxccPoqsSveQFxVLvNxy9bus= -github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= -github.com/filecoin-project/go-crypto v0.0.1/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= -github.com/filecoin-project/go-data-transfer v1.0.1/go.mod h1:UxvfUAY9v3ub0a21BSK9u3pB2aq30Y0KMsG+w9/ysyo= -github.com/filecoin-project/go-data-transfer v1.10.0/go.mod h1:uQtqy6vUAY5v70ZHdkF5mJ8CjVtjj/JA3aOoaqzWTVw= -github.com/filecoin-project/go-data-transfer v1.10.1 h1:YQNLwhizxkdfFxegAyrnn3l7WjgMjqDlqFzr18iWiYI= -github.com/filecoin-project/go-data-transfer v1.10.1/go.mod h1:CSDMCrPK2lVGodNB1wPEogjFvM9nVGyiL1GNbBRTSdw= -======= github.com/filecoin-project/go-cbor-util v0.0.1 h1:E1LYZYTtjfAQwCReho0VXvbu8t3CYAVPiMx8EiV/VAs= github.com/filecoin-project/go-cbor-util v0.0.1/go.mod h1:pqTiPHobNkOVM5thSRsHYjyQfq7O5QSCMhvuu9JoDlg= -github.com/filecoin-project/go-commp-utils v0.1.1-0.20210427191551-70bf140d31c7/go.mod h1:6s95K91mCyHY51RPWECZieD3SGWTqIFLf1mPOes9l5U= -github.com/filecoin-project/go-commp-utils v0.1.2 h1:SKLRuGdx/6WlolaWKaUzzUYWGGePuARyO4guxOPxvt4= -github.com/filecoin-project/go-commp-utils v0.1.2/go.mod h1:6s95K91mCyHY51RPWECZieD3SGWTqIFLf1mPOes9l5U= +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-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-data-transfer v1.0.1/go.mod h1:UxvfUAY9v3ub0a21BSK9u3pB2aq30Y0KMsG+w9/ysyo= -github.com/filecoin-project/go-data-transfer v1.11.4 h1:jKvlx0/C8HSyLRn/G1P9TjtfBtFU9jbCvCVFmWbyYVQ= ->>>>>>> master -github.com/filecoin-project/go-data-transfer v1.11.4/go.mod h1:2MitLI0ebCkLlPKM7NRggP/t9d+gCcREUKkCKqWRCwU= -github.com/filecoin-project/go-ds-versioning v0.1.0 h1:y/X6UksYTsK8TLCI7rttCKEvl8btmWxyFMEeeWGUxIQ= -github.com/filecoin-project/go-ds-versioning v0.1.0/go.mod h1:mp16rb4i2QPmxBnmanUx8i/XANp+PFCCJWiAb+VW4/s= +github.com/filecoin-project/go-data-transfer v1.12.0 h1:y44x35JvB93kezahMURKizIa/aizGTPSHqi5cbAfTEo= +github.com/filecoin-project/go-data-transfer v1.12.0/go.mod h1:tDrD2jLU2TpVhd+5B8iqBp0fQRV4lP80WZccKXugjYc= +github.com/filecoin-project/go-ds-versioning v0.0.0-20211206185234-508abd7c2aff h1:2bG2ggVZ/rInd/YqUfRj4A5siGuYOPxxuD4I8nYLJF0= +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-fil-commcid v0.0.0-20200716160307-8f644712406f/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commcid v0.1.0 h1:3R4ds1A9r6cr8mvZBfMYxTS88OqLYEo6roi+GiIeOh8= 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.0.5-0.20201113164554-c5eba40d5335/go.mod h1:AJySOJC00JRWEZzRG2KsfUnqEf5ITXxeX09BE9N4f9c= -<<<<<<< HEAD -github.com/filecoin-project/go-fil-markets v1.12.0 h1:RpU5bLaMADVrU4CgLxKMGHC2ZUocNV35uINxogQCf00= -github.com/filecoin-project/go-fil-markets v1.12.0/go.mod h1:XuuZFaFujI47nrgfQJiq7jWB+6rRya6nm7Sj6uXQ80U= -======= -github.com/filecoin-project/go-fil-markets v1.13.3 h1:iMCpG7I4fb+YLcgDnMaqZiZiyFZWNvrwHqiFPHB0/tQ= ->>>>>>> master -github.com/filecoin-project/go-fil-markets v1.13.3/go.mod h1:38zuj8AgDvOfdakFLpC/syYIYgXTzkq7xqBJ6T1AuG4= +github.com/filecoin-project/go-fil-markets v1.13.5 h1:NLeF8rI5ZPOJNYEgA6NHrvnuh5QE/2dwuU/7wPW7zP0= +github.com/filecoin-project/go-fil-markets v1.13.5/go.mod h1:vXOHH3q2+zLk929W+lIq3etuDFTyJJ8nG2DwGHG2R1E= 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= @@ -498,20 +422,11 @@ 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= -<<<<<<< HEAD -github.com/filecoin-project/go-jsonrpc v0.1.4-0.20210217175800-45ea43ac2bec h1:rGI5I7fdU4viManxmDdbk5deZO7afe6L1Wc04dAmlOM= -github.com/filecoin-project/go-jsonrpc v0.1.4-0.20210217175800-45ea43ac2bec/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= -======= github.com/filecoin-project/go-jsonrpc v0.1.5 h1:ckxqZ09ivBAVf5CSmxxrqqNHC7PJm3GYGtYKiNQ+vGk= ->>>>>>> master github.com/filecoin-project/go-jsonrpc v0.1.5/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= -github.com/filecoin-project/go-multistore v0.0.3/go.mod h1:kaNqCC4IhU4B1uyr7YWFHd23TL4KM32aChS0jNkyUvQ= github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20/go.mod h1:mPn+LRRd5gEKNAtc+r3ScpW2JRU/pj4NBKdADYWHiak= github.com/filecoin-project/go-padreader v0.0.0-20210723183308-812a16dc01b1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= -<<<<<<< HEAD -======= github.com/filecoin-project/go-padreader v0.0.1 h1:8h2tVy5HpoNbr2gBRr+WD6zV6VD6XHig+ynSGJg8ZOs= ->>>>>>> master github.com/filecoin-project/go-padreader v0.0.1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= github.com/filecoin-project/go-paramfetch v0.0.2 h1:a6W3Ij6CKhwHYYlx+5mqvBIyw4CabZH2ojdEaoAZ6/g= github.com/filecoin-project/go-paramfetch v0.0.2/go.mod h1:1FH85P8U+DUEmWk1Jkw3Bw7FrwTVUNHk/95PSPG+dts= @@ -522,52 +437,41 @@ 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.1-0.20210506134452-99b279731c48/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= -<<<<<<< HEAD -github.com/filecoin-project/go-state-types v0.1.1-0.20210915140513-d354ccf10379/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= +github.com/filecoin-project/go-state-types v0.1.1 h1:LR260vya4p++atgf256W6yV3Lxl5mKrBFcEZePWQrdg= github.com/filecoin-project/go-state-types v0.1.1/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= -======= -github.com/filecoin-project/go-state-types v0.1.1-0.20210915140513-d354ccf10379 h1:UmKkt13NrtulubqfNXhG7SQ7Pjza8BeKdNBxngqAo64= -github.com/filecoin-project/go-state-types v0.1.1-0.20210915140513-d354ccf10379/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= ->>>>>>> master github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig= github.com/filecoin-project/go-statemachine v1.0.1 h1:LQ60+JDVjMdLxXmVFM2jjontzOYnfVE7u02CXV3WKSw= github.com/filecoin-project/go-statemachine v1.0.1/go.mod h1:jZdXXiHa61n4NmgWFG4w8tnqgvZVHYbJ3yW7+y8bF54= github.com/filecoin-project/go-statestore v0.1.0/go.mod h1:LFc9hD+fRxPqiHiaqUEZOinUJB4WARkRfNl10O7kTnI= -github.com/filecoin-project/go-statestore v0.1.1 h1:ufMFq00VqnT2CAuDpcGnwLnCX1I/c3OROw/kXVNSTZk= -github.com/filecoin-project/go-statestore v0.1.1/go.mod h1:LFc9hD+fRxPqiHiaqUEZOinUJB4WARkRfNl10O7kTnI= -github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b h1:fkRZSPrYpk42PV3/lIXiL0LHetxde7vyYYvSsttQtfg= -github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b/go.mod h1:Q0GQOBtKf1oE10eSXSlhN45kDBdGvEcVOqMiffqX+N8= +github.com/filecoin-project/go-statestore v0.2.0 h1:cRRO0aPLrxKQCZ2UOQbzFGn4WDNdofHZoGPjfNaAo5Q= +github.com/filecoin-project/go-statestore v0.2.0/go.mod h1:8sjBYbS35HwPzct7iT4lIXjLlYyPor80aU7t7a/Kspo= +github.com/filecoin-project/go-storedcounter v0.1.0 h1:Mui6wSUBC+cQGHbDUBcO7rfh5zQkWJM/CpAZa/uOuus= +github.com/filecoin-project/go-storedcounter v0.1.0/go.mod h1:4ceukaXi4vFURIoxYMfKzaRF5Xv/Pinh2oTnoxpv+z8= github.com/filecoin-project/specs-actors v0.9.4/go.mod h1:BStZQzx5x7TmCkLv0Bpa07U6cPKol6fd3w9KjMPZ6Z4= -github.com/filecoin-project/specs-actors v0.9.12/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors v0.9.14 h1:68PVstg2UB3ZsMLF+DKFTAs/YKsqhKWynkr0IqmVRQY= github.com/filecoin-project/specs-actors v0.9.14/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= -github.com/filecoin-project/specs-actors/v2 v2.0.1/go.mod h1:v2NZVYinNIKA9acEMBm5wWXxqv5+frFEbekBFemYghY= 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.5 h1:PbT4tPlSXZ8sRgajhb4D8AOEmiaaZ+jg6tc6BBv8VQc= -github.com/filecoin-project/specs-actors/v2 v2.3.5/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.1 h1:BE8fsns1GnEOxt1DTE5LxBK2FThXtWmCChgcJoHTg0E= github.com/filecoin-project/specs-actors/v3 v3.1.1/go.mod h1:mpynccOLlIRy0QnR008BwYBwT9fen+sPR13MA1VmMww= github.com/filecoin-project/specs-actors/v4 v4.0.0/go.mod h1:TkHXf/l7Wyw4ZejyXIPS2rK8bBO0rdwhTZyQQgaglng= github.com/filecoin-project/specs-actors/v4 v4.0.1 h1:AiWrtvJZ63MHGe6rn7tPu4nSUY8bA1KDNszqJaD5+Fg= github.com/filecoin-project/specs-actors/v4 v4.0.1/go.mod h1:TkHXf/l7Wyw4ZejyXIPS2rK8bBO0rdwhTZyQQgaglng= -github.com/filecoin-project/specs-actors/v5 v5.0.0-20210512015452-4fe3889fff57/go.mod h1:283yBMMUSDB2abcjP/hhrwTkhb9h3sfM6KGrep/ZlBI= github.com/filecoin-project/specs-actors/v5 v5.0.4 h1:OY7BdxJWlUfUFXWV/kpNBYGXNPasDIedf42T3sGx08s= github.com/filecoin-project/specs-actors/v5 v5.0.4/go.mod h1:5BAKRAMsOOlD8+qCw4UvT/lTLInCJ3JwOWZbX8Ipwq4= -<<<<<<< HEAD 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 h1:laxvHNsvrq83Y9n+W7znVCePi3oLyRf0Rkl4jFO8Wew= github.com/filecoin-project/specs-actors/v6 v6.0.1/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= -github.com/filecoin-project/specs-actors/v7 v7.0.0-20211104150953-8bd473fc487a/go.mod h1:F3/N4dIRgwEcSk7xp3RizaVyBE/Jlzhv9Le1/ZH50ZA= -======= -github.com/filecoin-project/specs-actors/v6 v6.0.0 h1:i+16MFE8GScWWUF0kG7x2RZ5Hqpz0CeyBHTpnijCJ6I= -github.com/filecoin-project/specs-actors/v6 v6.0.0/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= ->>>>>>> master -github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506 h1:Ur/l2+6qN+lQiqjozWWc5p9UDaAMDZKTlDS98oRnlIw= -github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506/go.mod h1:nJRRM7Aa9XVvygr3W9k6xGF46RWzr2zxF/iGoAIfA/g= +github.com/filecoin-project/specs-actors/v7 v7.0.0-20211117170924-fd07a4c7dff9/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= +github.com/filecoin-project/specs-actors/v7 v7.0.0-20211118013026-3dce48197cec h1:KV9vE+Sl2Y3qKsrpba4HcE7wHwK7v6O5U/S0xHbje6A= +github.com/filecoin-project/specs-actors/v7 v7.0.0-20211118013026-3dce48197cec/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= +github.com/filecoin-project/specs-storage v0.1.1-0.20211213202648-f14267c929ff h1:JO62nquOGhjoDf9+JkAcV+wsD5yhoyIKOMj70ZNdD3Q= +github.com/filecoin-project/specs-storage v0.1.1-0.20211213202648-f14267c929ff/go.mod h1:nJRRM7Aa9XVvygr3W9k6xGF46RWzr2zxF/iGoAIfA/g= 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= @@ -578,25 +482,19 @@ github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiD 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 h1:8sXhOn0uLys67V8EsXLc6eszDs8VXWxL3iRvebPhedY= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= +github.com/frankban/quicktest v1.14.0 h1:+cqqvzZV87b4adx/5ayVOaYZ2CrvM4ejQvUdBzPPUss= +github.com/frankban/quicktest v1.14.0/go.mod h1:NeW+ay9A/U67EYXNFA1nPE8e/tnQv/09mUdL/ijj8og= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -<<<<<<< HEAD -github.com/gbrlsnchs/jwt/v3 v3.0.0-beta.1 h1:EzDjxMg43q1tA2c0MV3tNbaontnHLplHyFF6M5KiVP0= -github.com/gbrlsnchs/jwt/v3 v3.0.0-beta.1/go.mod h1:0eHX/BVySxPc6SE2mZRoppGq7qcEagxdmQnA3dzork8= -======= github.com/gbrlsnchs/jwt/v3 v3.0.1 h1:lbUmgAKpxnClrKloyIwpxm4OuWeDl5wLk52G91ODPw4= ->>>>>>> master github.com/gbrlsnchs/jwt/v3 v3.0.1/go.mod h1:AncDcjXz18xetI3A6STfXq2w+LuTx8pQ8bGEwRN8zVM= github.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdko= github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg= github.com/gdamore/tcell/v2 v2.2.0 h1:vSyEgKwraXPSOkvCk7IwOSyX+Pv3V2cV9CikJMXg4U4= github.com/gdamore/tcell/v2 v2.2.0/go.mod h1:cTTuF84Dlj/RqmaCIV5p4w8uG1zWdk0SF6oBpwHp4fU= github.com/getkin/kin-openapi v0.53.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= -github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= -github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9/go.mod h1:106OIgooyS7OzLDOpUGgm9fA3bQENb/cFSyyBmMoJDs= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= @@ -614,32 +512,19 @@ github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2 github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= -<<<<<<< HEAD -github.com/go-kit/kit v0.12.0/go.mod h1:lHd+EkCZPIwYItmGDDRdhinkzX2A1sj+M9biaEaizzs= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -======= github.com/go-kit/kit v0.12.0 h1:e4o3o3IsBfAKQh5Qbbiqyfu97Ku7jrO/JbohvztANh4= github.com/go-kit/kit v0.12.0/go.mod h1:lHd+EkCZPIwYItmGDDRdhinkzX2A1sj+M9biaEaizzs= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-kit/log v0.2.0 h1:7i2K3eKTos3Vc0enKCfnVcgHh2olr/MyfboYq7cAcFw= ->>>>>>> master github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -<<<<<<< HEAD -github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= -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-ole/go-ole v1.2.4 h1:nNBDSCOigTSiarFpYE9J/KtEA1IOW4CNeqT9TQDqCxI= -github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM= -======= github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA= github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= 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-ole/go-ole v1.2.5 h1:t4MGB5xEDZvXI+0rMjjsfBsD7yAgp/s9ZDkL1JndXwY= ->>>>>>> master 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= github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= @@ -740,10 +625,7 @@ github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY9 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= -<<<<<<< HEAD -======= github.com/godbus/dbus/v5 v5.0.4 h1:9349emZab16e7zQvpmsbtjc18ykshndd8y2PG3sgJbA= ->>>>>>> master github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= @@ -768,15 +650,14 @@ github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2V github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= 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= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191027212112-611e8accdfc9/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -<<<<<<< HEAD -======= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= ->>>>>>> master github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= @@ -809,11 +690,7 @@ 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.2-0.20190904063534-ff6b7dc882cf/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -<<<<<<< HEAD -======= github.com/golang/snappy v0.0.3 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA= ->>>>>>> master github.com/golang/snappy v0.0.3/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= @@ -831,10 +708,7 @@ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -<<<<<<< HEAD -======= github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= ->>>>>>> master github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= @@ -893,7 +767,6 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgf github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.14.4/go.mod h1:6CwZWGDSPRJidgKAtJVvND6soZe6fT7iteq8wDPdhb0= -github.com/grpc-ecosystem/grpc-gateway v1.14.6/go.mod h1:zdiPV4Yse/1gnckTHtghG4GkDEdKCRJduHpTxT3/jcw= 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= @@ -967,13 +840,9 @@ github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0/go.mod h1:N0 github.com/iancoleman/orderedmap v0.1.0/go.mod h1:N0Wam8K1arqPXNWjMo21EXnBPOPp36vB07FNRdD2geA= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/icrowley/fake v0.0.0-20180203215853-4178557ae428/go.mod h1:uhpZMVGznybq1itEKXj6RYw9I71qK4kH+OGMjRC4KEo= -<<<<<<< HEAD -github.com/icza/backscanner v0.0.0-20210726202459-ac2ffc679f94/go.mod h1:GYeBD1CF7AqnKZK+UCytLcY3G+UKo0ByXX/3xfdNyqQ= -======= github.com/icza/backscanner v0.0.0-20210726202459-ac2ffc679f94 h1:9tcYMdi+7Rb1y0E9Del1DRHui7Ne3za5lLw6CjMJv/M= github.com/icza/backscanner v0.0.0-20210726202459-ac2ffc679f94/go.mod h1:GYeBD1CF7AqnKZK+UCytLcY3G+UKo0ByXX/3xfdNyqQ= github.com/icza/mighty v0.0.0-20180919140131-cfd07d671de6 h1:8UsGZ2rr2ksmEru6lToqnXgA8Mz1DP11X4zSJ159C3k= ->>>>>>> master github.com/icza/mighty v0.0.0-20180919140131-cfd07d671de6/go.mod h1:xQig96I1VNBDIWGCdTt54nHt6EeI639SmHycLYL7FkA= github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= @@ -987,10 +856,7 @@ github.com/influxdata/influxdb v1.9.4/go.mod h1:dR0WCHqaHPpJLaqWnRSl/QHsbXJR+Qpo github.com/influxdata/influxdb-client-go/v2 v2.3.1-0.20210518120617-5d1fff431040/go.mod h1:vLNHdxTJkIf2mSLvGrpj8TCcISApPoXkaxP8g9uRlW8= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/influxdata/influxdb1-client v0.0.0-20200515024757-02f0bf5dbca3/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= -<<<<<<< HEAD -======= github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab h1:HqW4xhhynfjrtEiiSGcQUd6vrK23iMam1FO8rI7mwig= ->>>>>>> master github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/influxdata/influxql v1.1.0/go.mod h1:KpVI7okXjK6PRi3Z5B+mtKZli+R1DnZgb3N+tzevNgo= github.com/influxdata/influxql v1.1.1-0.20210223160523-b6ab99450c93/go.mod h1:gHp9y86a/pxhjJ+zMjNXiQAA197Xk9wLxaz+fGG+kWk= @@ -1008,23 +874,16 @@ github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyq 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 h1:AhJhRrG8xkxh6x87b4wWs+4U4y3DVB3doI8yFNqgQME= -github.com/ipfs/go-bitswap v0.3.4/go.mod h1:4T7fvNv/LmOys+21tnLzGKncMeeXUYUd1nUiJ2teMvI= +github.com/ipfs/go-bitswap v0.5.1 h1:721YAEDBnLIrvcIMkCHCdqp34hA8jwL9yKMkyJpSpco= +github.com/ipfs/go-bitswap v0.5.1/go.mod h1:P+ckC87ri1xFLvk74NlXdP0Kj9RmWAh4+H78sC6Qopo= 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= 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.3/go.mod h1:OTZhFpkgY48kNzbgyvcexW9cHrpjBYIjSR0KoDOFOLU= -github.com/ipfs/go-blockservice v0.1.4-0.20200624145336-a978cec6e834/go.mod h1:OTZhFpkgY48kNzbgyvcexW9cHrpjBYIjSR0KoDOFOLU= -github.com/ipfs/go-blockservice v0.1.5/go.mod h1:yLk8lBJCBRWRqerqCSVi3cE/Dncdt3vGC/PJMVKhLTY= -<<<<<<< HEAD -======= -github.com/ipfs/go-blockservice v0.1.7 h1:yVe9te0M7ow8i+PPkx03YFSpxqzXx594d6h+34D6qMg= ->>>>>>> master -github.com/ipfs/go-blockservice v0.1.7/go.mod h1:GmS+BAt4hrwBKkzE11AFDQUrnvqjwFatGS2MY7wOjEM= +github.com/ipfs/go-blockservice v0.2.1 h1:NJ4j/cwEfIg60rzAWcCIxRtOwbf6ZPK49MewNxObCPQ= +github.com/ipfs/go-blockservice v0.2.1/go.mod h1:k6SiwmgyYgs4M/qt+ww6amPeUH9EISLRBnvUurKJhi8= 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= @@ -1034,7 +893,6 @@ github.com/ipfs/go-cid v0.0.5/go.mod h1:plgt+Y5MnOey4vO4UlUazGqdbEXuFYitED67Fexh github.com/ipfs/go-cid v0.0.6-0.20200501230655-7c82f3b81c00/go.mod h1:plgt+Y5MnOey4vO4UlUazGqdbEXuFYitED67FexhXog= github.com/ipfs/go-cid v0.0.6/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= github.com/ipfs/go-cid v0.0.7/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= -github.com/ipfs/go-cid v0.0.8-0.20210716091050-de6c03deae1c/go.mod h1:rH5/Xv83Rfy8Rw6xG+id3DYAMUVmem1MowoKwdXmN2o= github.com/ipfs/go-cid v0.1.0 h1:YN33LQulcRHjfom/i25yoOZR4Telp1Hr/2RU3d0PnC0= github.com/ipfs/go-cid v0.1.0/go.mod h1:rH5/Xv83Rfy8Rw6xG+id3DYAMUVmem1MowoKwdXmN2o= github.com/ipfs/go-cidutil v0.0.2 h1:CNOboQf1t7Qp0nuNh8QMmhJs0+Q//bRL1axtCnIB1Yo= @@ -1043,15 +901,15 @@ github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAK github.com/ipfs/go-datastore v0.0.5/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= github.com/ipfs/go-datastore v0.1.0/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= github.com/ipfs/go-datastore v0.1.1/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRVNdgPHtbHw= -github.com/ipfs/go-datastore v0.3.0/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRVNdgPHtbHw= 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.4.6 h1:zU2cmweykxJ+ziXnA2cPtsLe8rdR/vrthOipLPuf6kc= -github.com/ipfs/go-datastore v0.4.6/go.mod h1:XSipLSc64rFKSFRFGo1ecQl+WhYce3K7frtpHkyPFUc= +github.com/ipfs/go-datastore v0.4.7-0.20211013204805-28a3721c2e66/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= +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-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= @@ -1059,47 +917,33 @@ github.com/ipfs/go-ds-badger v0.0.5/go.mod h1:g5AuuCGmr7efyzQhLL8MzwqcauPojGPUaH github.com/ipfs/go-ds-badger v0.0.7/go.mod h1:qt0/fWzZDoPW6jpQeqUjR5kBfhDNB65jd9YlmAvpQBk= github.com/ipfs/go-ds-badger v0.2.1/go.mod h1:Tx7l3aTph3FMFrRS838dcSJh+jjA7cX9DrGVwx/NOwE= github.com/ipfs/go-ds-badger v0.2.3/go.mod h1:pEYw0rgg3FIrywKKnL+Snr+w/LjJZVMTBRn4FS6UHUk= -github.com/ipfs/go-ds-badger v0.2.6/go.mod h1:02rnztVKA4aZwDuaRPTf8mpqcKmXP7mLl6JPxd14JHA= -github.com/ipfs/go-ds-badger v0.2.7 h1:ju5REfIm+v+wgVnQ19xGLYPHYHbYLR6qJfmMbCDSK1I= github.com/ipfs/go-ds-badger v0.2.7/go.mod h1:02rnztVKA4aZwDuaRPTf8mpqcKmXP7mLl6JPxd14JHA= -github.com/ipfs/go-ds-badger2 v0.1.0/go.mod h1:pbR1p817OZbdId9EvLOhKBgUVTM3BMCSTan78lDDVaw= -github.com/ipfs/go-ds-badger2 v0.1.1-0.20200708190120-187fc06f714e h1:Xi1nil8K2lBOorBS6Ys7+hmUCzH8fr3U9ipdL/IrcEI= -github.com/ipfs/go-ds-badger2 v0.1.1-0.20200708190120-187fc06f714e/go.mod h1:lJnws7amT9Ehqzta0gwMrRsURU04caT0iRPr1W8AsOU= +github.com/ipfs/go-ds-badger v0.3.0 h1:xREL3V0EH9S219kFFueOYJJTcjgNSZ2HY1iSvN7U1Ro= +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-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= -github.com/ipfs/go-ds-leveldb v0.4.2 h1:QmQoAJ9WkPMUfBLnu1sBVy0xWWlJPg0m4kRAiJL9iaw= github.com/ipfs/go-ds-leveldb v0.4.2/go.mod h1:jpbku/YqBSsBc1qgME8BkWS4AxzF2cEu1Ii2r79Hh9s= -github.com/ipfs/go-ds-measure v0.1.0 h1:vE4TyY4aeLeVgnnPBC5QzKIjKrqzha0NCujTfgvVbVQ= -github.com/ipfs/go-ds-measure v0.1.0/go.mod h1:1nDiFrhLlwArTME1Ees2XaBOl49OoCgd2A3f8EchMSY= -github.com/ipfs/go-ds-pebble v0.0.2-0.20200921225637-ce220f8ac459/go.mod h1:oh4liWHulKcDKVhCska5NLelE3MatWl+1FwSz3tY91g= -github.com/ipfs/go-filestore v1.0.0 h1:QR7ekKH+q2AGiWDc7W2Q0qHuYSRZGUJqUn0GsegEPb0= -github.com/ipfs/go-filestore v1.0.0/go.mod h1:/XOCuNtIe2f1YPbiXdYvD0BKLA0JR1MgPiFOdcuu9SM= +github.com/ipfs/go-ds-leveldb v0.5.0 h1:s++MEBbD3ZKc9/8/njrn4flZLnCuY9I79v94gBUNumo= +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-filestore v1.1.0 h1:Pu4tLBi1bucu6/HU9llaOmb9yLFk/sgP+pW764zNDoE= +github.com/ipfs/go-filestore v1.1.0/go.mod h1:6e1/5Y6NvLuCRdmda/KA4GUhXJQ3Uat6vcWm2DJfxc8= github.com/ipfs/go-fs-lock v0.0.6 h1:sn3TWwNVQqSeNjlWy6zQ1uUGAZrV3hPOyEA6y1/N2a0= github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28L7zESmM= -github.com/ipfs/go-graphsync v0.1.0/go.mod h1:jMXfqIEDFukLPZHqDPp8tJMbHO9Rmeb9CEGevngQbmE= -github.com/ipfs/go-graphsync v0.4.2/go.mod h1:/VmbZTUdUMTbNkgzAiCEucIIAU3BkLE2cZrDCVUhyi0= -github.com/ipfs/go-graphsync v0.4.3/go.mod h1:mPOwDYv128gf8gxPFgXnz4fNrSYPsWyqisJ7ych+XDY= -<<<<<<< HEAD -github.com/ipfs/go-graphsync v0.9.0/go.mod h1:J62ahWT9JbPsFL2UWsUM5rOu0lZJ0LOIH1chHdxGGcw= -github.com/ipfs/go-graphsync v0.9.1 h1:jo7ZaAZ3lal89RhKxKoRkPzIO8lmOY6KUWA1mDRZ2+U= -github.com/ipfs/go-graphsync v0.9.1/go.mod h1:J62ahWT9JbPsFL2UWsUM5rOu0lZJ0LOIH1chHdxGGcw= -github.com/ipfs/go-graphsync v0.10.0/go.mod h1:cKIshzTaa5rCZjryH5xmSKZVGX9uk1wvwGvz2WEha5Y= -======= -github.com/ipfs/go-graphsync v0.10.0/go.mod h1:cKIshzTaa5rCZjryH5xmSKZVGX9uk1wvwGvz2WEha5Y= -github.com/ipfs/go-graphsync v0.10.4 h1:1WZhyOPxgxLvHTIC2GoLltaBrjZ+JuXC2oKAEiX8f3Y= ->>>>>>> master -github.com/ipfs/go-graphsync v0.10.4/go.mod h1:oei4tnWAKnZ6LPnapZGPYVVbyiKV1UP3f8BeLU7Z4JQ= +github.com/ipfs/go-graphsync v0.11.0 h1:PiiD5CnoC3xEHMW8d6uBGqGcoTwiMB5d9CORIEyF6iA= +github.com/ipfs/go-graphsync v0.11.0/go.mod h1:wC+c8vGVjAHthsVIl8LKr37cUra2GOaMYcQNNmMxDqE= github.com/ipfs/go-hamt-ipld v0.1.1/go.mod h1:1EZCr2v0jlCnhpa+aZ0JZYp8Tt2w16+JJOAVz17YcDk= 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 v1.0.0/go.mod h1:knLVdhVU9L7CC4T+T4nvGdeUIPAXlnd9zmXfp+9MIjU= -github.com/ipfs/go-ipfs-blockstore v1.0.1/go.mod h1:MGNZlHNEnR4KGgPHM3/k8lBySIOK2Ve+0KjZubKlaOE= -github.com/ipfs/go-ipfs-blockstore v1.0.3/go.mod h1:MGNZlHNEnR4KGgPHM3/k8lBySIOK2Ve+0KjZubKlaOE= -github.com/ipfs/go-ipfs-blockstore v1.0.4 h1:DZdeya9Vu4ttvlGheQPGrj6kWehXnYZRFCp9EsZQ1hI= -github.com/ipfs/go-ipfs-blockstore v1.0.4/go.mod h1:uL7/gTJ8QIZ3MtA3dWf+s1a0U3fJy2fcEZAsovpRp+w= +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.1.0/go.mod h1:5QDUApRqpgPcfGstCxYeMnjt/DYQtXXdJVCvxHHuWVk= +github.com/ipfs/go-ipfs-blockstore v1.1.1/go.mod h1:w51tNR9y5+QXB0wkNcHt4O2aSZjTdqaEWaQdSxEyUOY= +github.com/ipfs/go-ipfs-blockstore v1.1.2 h1:WCXoZcMYnvOTmlpX+RSSnhVN0uCmbWTeepTGX5lgiXw= +github.com/ipfs/go-ipfs-blockstore v1.1.2/go.mod h1:w51tNR9y5+QXB0wkNcHt4O2aSZjTdqaEWaQdSxEyUOY= github.com/ipfs/go-ipfs-blocksutil v0.0.1 h1:Eh/H4pc1hsvhzsQoMEP3Bke/aW5P5rVM1IWFJMcGIPQ= github.com/ipfs/go-ipfs-blocksutil v0.0.1/go.mod h1:Yq4M86uIOmxmGPUHv/uI7uKqZNtLb449gwKqXjIsnRk= github.com/ipfs/go-ipfs-chunker v0.0.1/go.mod h1:tWewYK0we3+rMbOh7pPFGDyypCtvGcBFymgY4rSDLAw= @@ -1114,19 +958,19 @@ 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 h1:bEQ8hMGs80h0sR8O4tfDgV6B01aaF9qeTrujrTLYV3g= github.com/ipfs/go-ipfs-ds-help v1.0.0/go.mod h1:ujAbkeIgkKAWtxxNkoZHWLCyk5JpPoKnGyCcsoF6ueE= -github.com/ipfs/go-ipfs-exchange-interface v0.0.1 h1:LJXIo9W7CAmugqI+uofioIpRb6rY30GUu7G6LUfpMvM= +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-offline v0.0.1 h1:P56jYKZF7lDDOLx5SotVh5KFxoY6C81I1NSHW1FxGew= +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-offline v0.0.1/go.mod h1:WhHSFCVYX36H/anEKQboAzpUws3x7UeEGkzQc3iNkM0= +github.com/ipfs/go-ipfs-exchange-offline v0.1.1 h1:mEiXWdbMN6C7vtDG21Fphx8TGCbZPpQnz/496w/PL4g= +github.com/ipfs/go-ipfs-exchange-offline v0.1.1/go.mod h1:vTiBRIbzSwDD0OWm+i3xeT0mO7jG2cbJYatp3HPk5XY= 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= -<<<<<<< HEAD -======= github.com/ipfs/go-ipfs-files v0.0.9 h1:OFyOfmuVDu9c5YtjSDORmwXzE6fmZikzZpzsnNkgFEg= ->>>>>>> master github.com/ipfs/go-ipfs-files v0.0.9/go.mod h1:aFv2uQ/qxWpL/6lidWvnSQmaVqCrf0TBGoUr+C1Fo84= github.com/ipfs/go-ipfs-http-client v0.0.6 h1:k2QllZyP7Fz5hMgsX5hvHfn1WPG9Ngdy5WknQ7JNhBM= github.com/ipfs/go-ipfs-http-client v0.0.6/go.mod h1:8e2dQbntMZKxLfny+tyXJ7bJHZFERp/2vyzZdvkeLMc= @@ -1136,26 +980,26 @@ github.com/ipfs/go-ipfs-pq v0.0.1/go.mod h1:LWIqQpqfRG3fNc5XsnIhz/wQ2XXGyugQwls7 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-routing v0.0.1/go.mod h1:k76lf20iKFxQTjcJokbPM9iBXVXVZhcOwc360N4nuKs= -github.com/ipfs/go-ipfs-routing v0.1.0 h1:gAJTT1cEeeLj6/DlLX6t+NxD9fQe2ymTO6qWRDI/HQQ= 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= +github.com/ipfs/go-ipfs-routing v0.2.1/go.mod h1:xiNNiwgjmLqPS1cimvAw6EyB9rkVDbiocA4yY+wRNLM= github.com/ipfs/go-ipfs-util v0.0.1/go.mod h1:spsl5z8KUnrve+73pOhSVZND1SIxPW5RyBCNzQxlJBc= github.com/ipfs/go-ipfs-util v0.0.2 h1:59Sswnk1MFaiq+VcaknX7aYEyGyGDAA73ilhEK2POp8= github.com/ipfs/go-ipfs-util v0.0.2/go.mod h1:CbPtkWJzjLdEcezDns2XYaehFVNXG9zrdrtMecczcsQ= github.com/ipfs/go-ipld-cbor v0.0.2/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= github.com/ipfs/go-ipld-cbor v0.0.3/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= github.com/ipfs/go-ipld-cbor v0.0.4/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= -github.com/ipfs/go-ipld-cbor v0.0.5-0.20200204214505-252690b78669/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= -github.com/ipfs/go-ipld-cbor v0.0.5 h1:ovz4CHKogtG2KB/h1zUp5U0c/IzZrL435rCh5+K/5G8= github.com/ipfs/go-ipld-cbor v0.0.5/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= +github.com/ipfs/go-ipld-cbor v0.0.6-0.20211211231443-5d9b9e1f6fa8/go.mod h1:ssdxxaLJPXH7OjF5V4NSjBbcfh+evoR4ukuru0oPXMA= +github.com/ipfs/go-ipld-cbor v0.0.6 h1:pYuWHyvSpIsOOLw4Jy7NbBkCyzLDcl64Bf/LZW7eBQ0= +github.com/ipfs/go-ipld-cbor v0.0.6/go.mod h1:ssdxxaLJPXH7OjF5V4NSjBbcfh+evoR4ukuru0oPXMA= github.com/ipfs/go-ipld-format v0.0.1/go.mod h1:kyJtbkDALmFHv3QR6et67i35QzO3S0dCDnkOJhcZkms= github.com/ipfs/go-ipld-format v0.0.2/go.mod h1:4B6+FM2u9OJ9zCV+kSbgFAZlOrv1Hqbf0INGQgiKf9k= github.com/ipfs/go-ipld-format v0.2.0 h1:xGlJKkArkmBvowr+GMCX0FEZtkro71K1AwiKnL37mwA= github.com/ipfs/go-ipld-format v0.2.0/go.mod h1:3l3C1uKoadTPbeNfrDi+xMInYKlx2Cvg1BuydPSdzQs= -<<<<<<< HEAD -======= -github.com/ipfs/go-ipld-legacy v0.1.0 h1:wxkkc4k8cnvIGIjPO0waJCe7SHEyFgl+yQdafdjGrpA= ->>>>>>> master 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-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= @@ -1175,18 +1019,15 @@ github.com/ipfs/go-log/v2 v2.1.1/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHn github.com/ipfs/go-log/v2 v2.1.2-0.20200626104915-0016c0b4b3e4/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHntrv9KM= github.com/ipfs/go-log/v2 v2.1.2/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHntrv9KM= github.com/ipfs/go-log/v2 v2.1.3/go.mod h1:/8d0SH3Su5Ooc31QlL1WysJhvyOTDCjcCZ9Axpmri6g= -github.com/ipfs/go-log/v2 v2.3.0 h1:31Re/cPqFHpsRHgyVwjWADPoF0otB1WrjTy8ZFYwEZU= github.com/ipfs/go-log/v2 v2.3.0/go.mod h1:QqGoj30OTpnKaG/LKTGTxoP2mmQtjVMEnK72gynbe/g= +github.com/ipfs/go-log/v2 v2.4.0 h1:iR/2o9PGWanVJrBgIH5Ff8mPGOwpqLaPIAFqSnsdlzk= +github.com/ipfs/go-log/v2 v2.4.0/go.mod h1:nPZnh7Cj7lwS3LpRU5Mwr2ol1c2gXIEXuF6aywqrtmo= github.com/ipfs/go-merkledag v0.0.6/go.mod h1:QYPdnlvkOg7GnQRofu9XZimC5ZW5Wi3bKys/4GQQfto= 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.1/go.mod h1:fvkZNNZixVW6cKSZ/JfLlON5OlgTXNdRLz0p6QG/I2M= github.com/ipfs/go-merkledag v0.3.2/go.mod h1:fvkZNNZixVW6cKSZ/JfLlON5OlgTXNdRLz0p6QG/I2M= -<<<<<<< HEAD -======= -github.com/ipfs/go-merkledag v0.4.1 h1:CEEQZnwRkszN06oezuasHwDD823Xcr4p4zluUN9vXqs= ->>>>>>> master -github.com/ipfs/go-merkledag v0.4.1/go.mod h1:56biPaS6e+IS0eXkEt6A8tG+BUQaEIFqDqJuFfQDBoE= +github.com/ipfs/go-merkledag v0.5.1 h1:tr17GPP5XtPhvPPiWtu20tSGZiZDuTaJRXBLcr79Umk= +github.com/ipfs/go-merkledag v0.5.1/go.mod h1:cLMZXx8J08idkp5+id62iVftUQV+HlYJ3PIhDfZsjA4= github.com/ipfs/go-metrics-interface v0.0.1 h1:j+cpbjYvu4R8zbleSs36gvB7jR+wsL2fGD6n0jO4kdg= github.com/ipfs/go-metrics-interface v0.0.1/go.mod h1:6s6euYU4zowdslK0GKHmqaIZ3j/b/tL7HTWtJ4VPgWY= github.com/ipfs/go-metrics-prometheus v0.0.2/go.mod h1:ELLU99AQQNi+zX6GCGm2lAgnzdSH3u5UVlCdqSXnEks= @@ -1194,13 +1035,8 @@ github.com/ipfs/go-path v0.0.7 h1:H06hKMquQ0aYtHiHryOMLpQC1qC3QwXwkahcEVD51Ho= github.com/ipfs/go-path v0.0.7/go.mod h1:6KTKmeRnBXgqrTvzFrPV3CamxcgvXX/4z79tfAd2Sno= 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= -<<<<<<< HEAD -======= -github.com/ipfs/go-peertaskqueue v0.6.0 h1:BT1/PuNViVomiz1PnnP5+WmKsTNHrxIDvkZrkj4JhOg= ->>>>>>> master -github.com/ipfs/go-peertaskqueue v0.6.0/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68ow0Rrb04donIU= +github.com/ipfs/go-peertaskqueue v0.7.0 h1:VyO6G4sbzX80K58N60cCaHsSsypbUNs1GjO5seGNsQ0= +github.com/ipfs/go-peertaskqueue v0.7.0/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68ow0Rrb04donIU= 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= @@ -1215,49 +1051,30 @@ github.com/ipfs/iptb v1.4.0/go.mod h1:1rzHpCYtNp87/+hTxG5TfCVn/yMY3dKnLn8tBiMfdm 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/ipld/go-car v0.1.0/go.mod h1:RCWzaUh2i4mOEkB3W45Vc+9jnS/M6Qay5ooytiBHl3g= -github.com/ipld/go-car v0.1.1-0.20200923150018-8cdef32e2da4/go.mod h1:xrMEcuSq+D1vEwl+YAXsg/JfA98XGpXDwnkIL4Aimqw= -github.com/ipld/go-car v0.1.1-0.20201119040415-11b6074b6d4d/go.mod h1:2Gys8L8MJ6zkh1gktTSXreY63t4UbyvNp5JaudTyxHQ= -<<<<<<< HEAD -github.com/ipld/go-car v0.3.1-0.20210601190600-f512dac51e8e/go.mod h1:wUxBdwOLA9/0HZBi3fnTBzla0MuwlqgJLyrhOg1XaKI= -github.com/ipld/go-car v0.3.1-null-padded-files h1:FMD0Ce4tAM9P5aq7yklw2jnVK3ZuoJ4xK6vkL9VLmxs= -github.com/ipld/go-car v0.3.1-null-padded-files/go.mod h1:wUxBdwOLA9/0HZBi3fnTBzla0MuwlqgJLyrhOg1XaKI= -======= -github.com/ipld/go-car v0.3.2-0.20211001225732-32d0d9933823 h1:8JMSJ0k71fU9lIUrpVwEdoX4KoxiTEX8cZG97v/hTDw= ->>>>>>> master -github.com/ipld/go-car v0.3.2-0.20211001225732-32d0d9933823/go.mod h1:jSlTph+i/q1jLFoiKKeN69KGG0fXpwrcD0izu5C1Tpo= -github.com/ipld/go-car/v2 v2.0.0-beta1.0.20210721090610-5a9d1b217d25/go.mod h1:I2ACeeg6XNBe5pdh5TaR7Ambhfa7If9KXxmXgZsYENU= -github.com/ipld/go-car/v2 v2.0.2/go.mod h1:I2ACeeg6XNBe5pdh5TaR7Ambhfa7If9KXxmXgZsYENU= -github.com/ipld/go-car/v2 v2.0.3-0.20210811121346-c514a30114d7 h1:6Z0beJSZNsRY+7udoqUl4gQ/tqtrPuRvDySrlsvbqZA= -github.com/ipld/go-car/v2 v2.0.3-0.20210811121346-c514a30114d7/go.mod h1:I2ACeeg6XNBe5pdh5TaR7Ambhfa7If9KXxmXgZsYENU= +github.com/ipld/go-car v0.3.3-0.20211210032800-e6f244225a16/go.mod h1:/wkKF4908ULT4dFIFIUZYcfjAnj+KFnJvlh8Hsz1FbQ= +github.com/ipld/go-car v0.3.3 h1:D6y+jvg9h2ZSv7GLUMWUwg5VTLy1E7Ak+uQw5orOg3I= +github.com/ipld/go-car v0.3.3/go.mod h1:/wkKF4908ULT4dFIFIUZYcfjAnj+KFnJvlh8Hsz1FbQ= +github.com/ipld/go-car/v2 v2.1.1-0.20211211000942-be2525f6bf2d/go.mod h1:+2Yvf0Z3wzkv7NeI69i8tuZ+ft7jyjPYIWZzeVNeFcI= +github.com/ipld/go-car/v2 v2.1.1 h1:saaKz4nC0AdfCGHLYKeXLGn8ivoPC54fyS55uyOLKwA= +github.com/ipld/go-car/v2 v2.1.1/go.mod h1:+2Yvf0Z3wzkv7NeI69i8tuZ+ft7jyjPYIWZzeVNeFcI= github.com/ipld/go-codec-dagpb v1.2.0/go.mod h1:6nBN7X7h8EOsEejZGqC7tej5drsdBAXbMHyBT+Fne5s= github.com/ipld/go-codec-dagpb v1.3.0 h1:czTcaoAuNNyIYWs6Qe01DJ+sEX7B+1Z0LcXjSatMGe8= github.com/ipld/go-codec-dagpb v1.3.0/go.mod h1:ga4JTU3abYApDC3pZ00BC2RSvC3qfBb9MSJkMLSwnhA= github.com/ipld/go-ipld-prime v0.0.2-0.20191108012745-28a82f04c785/go.mod h1:bDDSvVz7vaK12FNvMeRYnpRFkSUPNQOiCYQezMD/P3w= -github.com/ipld/go-ipld-prime v0.0.2-0.20200428162820-8b59dc292b8e/go.mod h1:uVIwe/u0H4VdKv3kaN1ck7uCb6yD9cFLS9/ELyXbsw8= -github.com/ipld/go-ipld-prime v0.5.1-0.20200828233916-988837377a7f/go.mod h1:0xEgdD6MKbZ1vF0GC+YcR/C4SQCAlRuOjIJ2i0HxqzM= -github.com/ipld/go-ipld-prime v0.5.1-0.20201021195245-109253e8a018/go.mod h1:0xEgdD6MKbZ1vF0GC+YcR/C4SQCAlRuOjIJ2i0HxqzM= github.com/ipld/go-ipld-prime v0.9.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= 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= -<<<<<<< HEAD -github.com/ipld/go-ipld-prime v0.12.0 h1:JapyKWTsJgmhrPI7hfx4V798c/RClr85sXfBZnH1VIw= -github.com/ipld/go-ipld-prime v0.12.0/go.mod h1:hy8b93WleDMRKumOJnTIrr0MbbFbx9GD6Kzxa53Xppc= -github.com/ipld/go-ipld-prime v0.12.3-0.20210930132912-0b3aef3ca569/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= -======= -github.com/ipld/go-ipld-prime v0.12.3-0.20210930132912-0b3aef3ca569/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= -github.com/ipld/go-ipld-prime v0.12.3 h1:furVobw7UBLQZwlEwfE26tYORy3PAK8VYSgZOSr3JMQ= ->>>>>>> master 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.3-0.20211207234443-319145880958/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= +github.com/ipld/go-ipld-prime v0.14.3 h1:cGUmxSws2IHurn00/iLMDapeXsnf9+FyAtYVy8G/JsQ= +github.com/ipld/go-ipld-prime v0.14.3/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= github.com/ipld/go-ipld-prime-proto v0.0.0-20191113031812-e32bd156a1e5/go.mod h1:gcvzoEDBjwycpXt3LBE061wT9f46szXGHAmj9uoP6fU= -github.com/ipld/go-ipld-prime-proto v0.0.0-20200428191222-c1ffdadc01e1/go.mod h1:OAV6xBmuTLsPZ+epzKkPB1e25FHk/vCtyatkdHcArLs= -github.com/ipld/go-ipld-prime-proto v0.0.0-20200922192210-9a2bfd4440a6/go.mod h1:3pHYooM9Ea65jewRwrb2u5uHZCNkNTe9ABsVB+SrkH0= -github.com/ipld/go-ipld-prime-proto v0.1.0/go.mod h1:11zp8f3sHVgIqtb/c9Kr5ZGqpnCLF1IVTNOez9TopzE= -<<<<<<< HEAD -======= -github.com/ipld/go-ipld-selector-text-lite v0.0.0 h1:MLU1YUAgd3Z+RfVCXUbvxH1RQjEe+larJ9jmlW1aMgA= ->>>>>>> master -github.com/ipld/go-ipld-selector-text-lite v0.0.0/go.mod h1:U2CQmFb+uWzfIEF3I1arrDa5rwtj00PrpiwwCO+k1RM= +github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20211210234204-ce2a1c70cd73 h1:TsyATB2ZRRQGTwafJdgEUQkmjOExRV0DNokcihZxbnQ= +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/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= @@ -1265,7 +1082,6 @@ github.com/jackpal/go-nat-pmp v1.0.1/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+ github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jbenet/go-cienv v0.0.0-20150120210510-1bb1476777ec/go.mod h1:rGaEvXB4uRSZMmzKNLoXvTu1sfx+1kv/DojUlPrSZGs= -github.com/jbenet/go-cienv v0.1.0 h1:Vc/s0QbQtoxX8MwwSLWWh+xNNZvM3Lw7NsTcHrvvhMc= github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= github.com/jbenet/go-random v0.0.0-20190219211222-123a90aedc0c h1:uUx61FiAa1GI6ZmVd2wf2vULeQZIKG66eybjNXKYCz4= github.com/jbenet/go-random v0.0.0-20190219211222-123a90aedc0c/go.mod h1:sdx1xVM9UuLw1tXnhJWN3piypTUO3vCIHYmG15KE/dU= @@ -1288,8 +1104,9 @@ github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901 h1:rp+c0RAYOWj8 github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901/go.mod h1:Z86h9688Y0wesXCyonoVr47MasHilkuLMqGhRZ4Hpak= github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jonboulle/clockwork v0.1.1-0.20190114141812-62fb9bc030d1 h1:qBCV/RLV02TSfQa7tFmxTihnG+u+7JXByOkhlkR5rmQ= github.com/jonboulle/clockwork v0.1.1-0.20190114141812-62fb9bc030d1/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jonboulle/clockwork v0.2.2 h1:UOGuzwb1PwsrDAObMuhUnj0p5ULPj8V/xJ7Kx9qUBdQ= +github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= @@ -1335,16 +1152,12 @@ github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0 github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= 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= -<<<<<<< HEAD -======= github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc= ->>>>>>> master github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5 h1:2U0HzY8BJ8hVwDKIzp7y4voR9CX/nvcfymLmg2UiOio= github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= 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.8/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6/go.mod h1:+ZoRqAPRLkC4NPOvfYeR5KNOrY6TD+/sAC3HXPZgDYg= @@ -1361,8 +1174,9 @@ github.com/kpacha/opencensus-influxdb v0.0.0-20181102202715-663e2683a27c/go.mod 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= -github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= @@ -1386,8 +1200,9 @@ github.com/libp2p/go-conn-security v0.0.1/go.mod h1:bGmu51N0KU9IEjX7kl2PQjgZa40J github.com/libp2p/go-conn-security-multistream v0.0.2/go.mod h1:nc9vud7inQ+d6SO0I/6dSWrdMnHnzZNHeyUQqrAJulE= github.com/libp2p/go-conn-security-multistream v0.1.0/go.mod h1:aw6eD7LOsHEX7+2hJkDxw1MteijaVcI+/eP2/x3J1xc= 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 h1:ft6/POSK7F+vl/2qzegnHDaXFU0iWB4yVTYrioC6Zy0= github.com/libp2p/go-conn-security-multistream v0.2.1/go.mod h1:cR1d8gA0Hr59Fj6NhaTpFhJZrjSYuNmhpT2r25zYR70= +github.com/libp2p/go-conn-security-multistream v0.3.0 h1:9UCIKlBL1hC9u7nkMXpD1nkc/T53PKMAn3/k9ivBAVc= +github.com/libp2p/go-conn-security-multistream v0.3.0/go.mod h1:EEP47t4fw/bTelVmEzIDqSe69hO/ip52xBEhZMLWAHM= 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= @@ -1401,21 +1216,20 @@ github.com/libp2p/go-libp2p v0.1.0/go.mod h1:6D/2OBauqLUoqcADOJpn9WbKqvaM07tDw68 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.0/go.mod h1:mfKWI7Soz3ABX+XEBR61lGbg+ewyMtJHVt043oWeqwg= 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.8.3/go.mod h1:EsH1A+8yoWK+L4iKcbPYu6MPluZ+CHWI9El8cTaefiM= -github.com/libp2p/go-libp2p v0.9.2/go.mod h1:cunHNLDVus66Ct9iXXcjKRLdmHdFdHVe1TAnbubJQqQ= github.com/libp2p/go-libp2p v0.10.0/go.mod h1:yBJNpb+mGJdgrwbKAKrhPU0u3ogyNFTfjJ6bdM+Q/G8= -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.15.0 h1:jbMbdmtizfpvl1+oQuGJzfGhttAtuxUCavF3enwFncg= -github.com/libp2p/go-libp2p v0.15.0/go.mod h1:8Ljmwon0cZZYKrOCjFeLwQEK8bqR42dOheUZ1kSKhP0= -github.com/libp2p/go-libp2p-asn-util v0.0.0-20200825225859-85005c6cf052 h1:BM7aaOF7RpmNn9+9g6uTjGJ0cTzWr5j9i9IKeun2M8U= +github.com/libp2p/go-libp2p v0.16.0/go.mod h1:ump42BsirwAWxKzsCiFnTtN1Yc+DuPu76fyMX364/O4= +github.com/libp2p/go-libp2p v0.17.0 h1:8l4GV401OSd4dFRyHDtIT/mEzdh/aQGoFC8xshYgm5M= +github.com/libp2p/go-libp2p v0.17.0/go.mod h1:Fkin50rsGdv5mm5BshBUtPRZknt9esfmYXBOYcwOTgw= 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 h1:rABPCO77SjdbJ/eJ/ynIo8vWICy1VEnL5JAxJbQLo1E= +github.com/libp2p/go-libp2p-asn-util v0.1.0/go.mod h1:wu+AnM9Ii2KgO5jMmS1rz9dvzTdj8BXqsPR9HR0XB7I= github.com/libp2p/go-libp2p-autonat v0.0.6/go.mod h1:uZneLdOkZHro35xIhpbtTzLlgYturpu4J5+0cZK3MqE= github.com/libp2p/go-libp2p-autonat v0.1.0/go.mod h1:1tLf2yXxiE/oKGtDwPYWTSYG3PtvYlJmg7NeVtPRqH8= github.com/libp2p/go-libp2p-autonat v0.1.1/go.mod h1:OXqkeGOY2xJVWKAGV2inNF5aKN/djNA3fdpCWloIudE= @@ -1423,17 +1237,19 @@ github.com/libp2p/go-libp2p-autonat v0.2.0/go.mod h1:DX+9teU4pEEoZUqR1PiMlqliONQ 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.2.3/go.mod h1:2U6bNWCNsAG9LEbwccBDQbjzQ8Krdjge1jLTE9rdoMM= -github.com/libp2p/go-libp2p-autonat v0.4.0/go.mod h1:YxaJlpr81FhdOv3W3BTconZPfhaYivRdf53g+S2wobk= -github.com/libp2p/go-libp2p-autonat v0.4.2 h1:YMp7StMi2dof+baaxkbxaizXjY1RPvU71CXfxExzcUU= 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 h1:rCP5s+A2dlhM1Xd66wurE0k7S7pPmM0D+FlqqSBXxks= +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.1.6/go.mod h1:jONCAJqEP+Z8T6EQviGL4JsQcLx1LgTGtVqFNY8EMfQ= -github.com/libp2p/go-libp2p-blankhost v0.2.0 h1:3EsGAi0CBGcZ33GwRuXEYJLLPoVWyXJ1bcJzAJjINkk= 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= @@ -1445,9 +1261,9 @@ github.com/libp2p/go-libp2p-circuit v0.2.3/go.mod h1:nkG3iE01tR3FoQ2nMm06IUrCpCy github.com/libp2p/go-libp2p-circuit v0.4.0 h1:eqQ3sEYkGTtybWgr6JLqJY6QLtPWRErvFjFDfAOO1wc= github.com/libp2p/go-libp2p-circuit v0.4.0/go.mod h1:t/ktoFIUzM6uLQ+o1G6NuBl2ANhBKN9Bc8jRIk31MoA= github.com/libp2p/go-libp2p-connmgr v0.1.1/go.mod h1:wZxh8veAmU5qdrfJ0ZBLcU8oJe9L82ciVP/fl1VHjXk= -github.com/libp2p/go-libp2p-connmgr v0.2.3/go.mod h1:Gqjg29zI8CwXX21zRxy6gOg8VYu3zVerJRt2KyktzH4= -github.com/libp2p/go-libp2p-connmgr v0.2.4 h1:TMS0vc0TCBomtQJyWr7fYxcVYYhx+q/2gF++G5Jkl/w= github.com/libp2p/go-libp2p-connmgr v0.2.4/go.mod h1:YV0b/RIm8NGPnnNWM7hG9Q38OeQiQfKhHCCs1++ufn0= +github.com/libp2p/go-libp2p-connmgr v0.3.0 h1:yerFXrYa0oxpuVsLlndwm/bLulouHYDcvFrY/4H4fx8= +github.com/libp2p/go-libp2p-connmgr v0.3.0/go.mod h1:RVoyPjJm0J9Vd1m6qUN2Tn7kJm4rL1Ml20pFsFgPGik= github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= 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= @@ -1477,8 +1293,12 @@ github.com/libp2p/go-libp2p-core v0.8.1/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJB github.com/libp2p/go-libp2p-core v0.8.2/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= github.com/libp2p/go-libp2p-core v0.8.5/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= github.com/libp2p/go-libp2p-core v0.8.6/go.mod h1:dgHr0l0hIKfWpGpqAMbpo19pen9wJfdCGv51mTmdpmM= -github.com/libp2p/go-libp2p-core v0.9.0 h1:t97Mv0LIBZlP2FXVRNKKVzHJCIjbIWGxYptGId4+htU= github.com/libp2p/go-libp2p-core v0.9.0/go.mod h1:ESsbz31oC3C1AvMJoGx26RTuCkNhmkSRCqZ0kQtJ2/8= +github.com/libp2p/go-libp2p-core v0.10.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= +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 h1:IFG/s8dN6JN2OTrXX9eq2wNU/Zlz2KLdwZUp5FplgXI= +github.com/libp2p/go-libp2p-core v0.13.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= 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= @@ -1489,8 +1309,8 @@ 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.4.0/go.mod h1:bZ0aJSrFc/eX2llP0ryhb1kpgkPyTo23SJ5b7UQCMh4= github.com/libp2p/go-libp2p-discovery v0.5.0/go.mod h1:+srtPIU9gDaBNu//UHvcdliKBIcr4SfDcm0/PfPJLug= -github.com/libp2p/go-libp2p-discovery v0.5.1 h1:CJylx+h2+4+s68GvrM4pGNyfNhOYviWBPtVv5PA7sfo= -github.com/libp2p/go-libp2p-discovery v0.5.1/go.mod h1:+srtPIU9gDaBNu//UHvcdliKBIcr4SfDcm0/PfPJLug= +github.com/libp2p/go-libp2p-discovery v0.6.0 h1:1XdPmhMJr8Tmj/yUfkJMIi8mgwWrLUsCB3bMxdT+DSo= +github.com/libp2p/go-libp2p-discovery v0.6.0/go.mod h1:/u1voHt0tKIe5oIA1RHBKQLVCWPna2dXmPNHc2zR9S8= 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-interface-connmgr v0.0.1/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= @@ -1498,8 +1318,8 @@ 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.13.0 h1:qBNYzee8BVS6RkD8ukIAGRG6LmVz8+kkeponyI7W+yA= -github.com/libp2p/go-libp2p-kad-dht v0.13.0/go.mod h1:NkGf28RNhPrcsGYWJHm6EH8ULkiJ2qxsWmpE7VTL3LI= +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= @@ -1518,17 +1338,17 @@ github.com/libp2p/go-libp2p-mplex v0.4.1 h1:/pyhkP1nLwjG3OM+VuaNJkQT/Pqq73WzB3aD github.com/libp2p/go-libp2p-mplex v0.4.1/go.mod h1:cmy+3GfqfM1PceHTLL7zQzAAYaryDu6iPSC+CIb094g= 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 h1:wMWis3kYynCbHoyKLPBEMu4YRLltbm8Mk08HGSfvTkU= github.com/libp2p/go-libp2p-nat v0.0.6/go.mod h1:iV59LVhB3IkFvS6S6sauVTSOrNEANnINbI/fkaLimiw= +github.com/libp2p/go-libp2p-nat v0.1.0 h1:vigUi2MEN+fwghe5ijpScxtbbDz+L/6y8XwlzYOJgSY= +github.com/libp2p/go-libp2p-nat v0.1.0/go.mod h1:DQzAG+QbDYjN1/C3B6vXucLtz3u9rEonLVPtZVzQqks= 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-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.2.2 h1:MRt5XGfYziDXIUy2udtMWfPmzZqUDYoC1FZoKnqPzwk= -github.com/libp2p/go-libp2p-noise v0.2.2/go.mod h1:IEbYhBBzGyvdLBoxxULL/SGbJARhUeqlO8lVSREYu2Q= +github.com/libp2p/go-libp2p-noise v0.3.0 h1:NCVH7evhVt9njbTQshzT7N1S3Q6fjj9M11FCgfH5+cA= +github.com/libp2p/go-libp2p-noise v0.3.0/go.mod h1:JNjHbociDJKHD64KTkzGnzqJ0FEV5gHJa6AB00kbCNQ= github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo= github.com/libp2p/go-libp2p-peer v0.1.1/go.mod h1:jkF12jGB4Gk/IOo+yomm+7oLWxF278F7UnrYUQ1Q8es= github.com/libp2p/go-libp2p-peer v0.2.0/go.mod h1:RCffaCvUyW2CJmG2gAWVqwePwW7JMgxjsHm7+J5kjWY= @@ -1545,30 +1365,27 @@ github.com/libp2p/go-libp2p-peerstore v0.2.4/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuD github.com/libp2p/go-libp2p-peerstore v0.2.6/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= github.com/libp2p/go-libp2p-peerstore v0.2.7/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= github.com/libp2p/go-libp2p-peerstore v0.2.8/go.mod h1:gGiPlXdz7mIHd2vfAsHzBNAMqSDkt2UBFwgcITgw1lA= -<<<<<<< HEAD -github.com/libp2p/go-libp2p-peerstore v0.2.9 h1:tVa7siDymmzOl3b3+SxPYpQUCnicmK13y6Re1PqWK+g= -github.com/libp2p/go-libp2p-peerstore v0.2.9/go.mod h1:zhBaLzxiWpNGQ3+uI17G/OIjmOD8GxKyFuHbrZbgs0w= -======= -github.com/libp2p/go-libp2p-peerstore v0.3.0 h1:wp/G0+37+GLr7tu+wE+4GWNrA3uxKg6IPRigIMSS5oQ= ->>>>>>> master -github.com/libp2p/go-libp2p-peerstore v0.3.0/go.mod h1:fNX9WlOENMvdx/YD7YO/5Hkrn8+lQIk5A39BHa1HIrM= +github.com/libp2p/go-libp2p-peerstore v0.4.0/go.mod h1:rDJUFyzEWPpXpEwywkcTYYzDHlwza8riYMaUzaN6hX0= +github.com/libp2p/go-libp2p-peerstore v0.6.0 h1:HJminhQSGISBIRb93N6WK3t6Fa8OOTnHd/VBjL4mY5A= +github.com/libp2p/go-libp2p-peerstore v0.6.0/go.mod h1:DGEmKdXrcYpK9Jha3sS7MhqYdInxJy84bIPtSu65bKc= github.com/libp2p/go-libp2p-pnet v0.2.0 h1:J6htxttBipJujEjz1y0a5+eYoiPcFHhSYHH6na5f0/k= 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.3.2-0.20200527132641-c0712c6e92cf/go.mod h1:TxPOBuo1FPdsTjFnv+FGZbNbWYsp74Culx+4ViQpato= github.com/libp2p/go-libp2p-pubsub v0.3.2/go.mod h1:Uss7/Cfz872KggNb+doCVPHeCDmXB7z500m/R8DaAUk= -github.com/libp2p/go-libp2p-pubsub v0.5.4 h1:rHl9/Xok4zX3zgi0pg0XnUj9Xj2OeXO8oTu85q2+YA8= -github.com/libp2p/go-libp2p-pubsub v0.5.4/go.mod h1:gVOzwebXVdSMDQBTfH8ACO5EJ4SQrvsHqCmYsCZpD0E= -github.com/libp2p/go-libp2p-pubsub v0.5.6/go.mod h1:gVOzwebXVdSMDQBTfH8ACO5EJ4SQrvsHqCmYsCZpD0E= +github.com/libp2p/go-libp2p-pubsub v0.6.0 h1:98+RXuEWW17U6cAijK1yaTf6mw/B+n5yPA421z+dlo0= +github.com/libp2p/go-libp2p-pubsub v0.6.0/go.mod h1:nJv87QM2cU0w45KPR1rZicq+FmFIOD16zmT+ep1nOmg= github.com/libp2p/go-libp2p-pubsub-tracer v0.0.0-20200626141350-e730b32bf1e6 h1:2lH7rMlvDPSvXeOR+g7FE6aqiEwxtpxWKQL8uigk5fQ= github.com/libp2p/go-libp2p-pubsub-tracer v0.0.0-20200626141350-e730b32bf1e6/go.mod h1:8ZodgKS4qRLayfw9FDKDd9DX4C16/GMofDxSldG8QPI= github.com/libp2p/go-libp2p-quic-transport v0.1.1/go.mod h1:wqG/jzhF3Pu2NrhJEvE+IE0NTHNXslOPn9JQzyCAxzU= github.com/libp2p/go-libp2p-quic-transport v0.5.0/go.mod h1:IEcuC5MLxvZ5KuHKjRu+dr3LjCT1Be3rcD/4d8JrX8M= github.com/libp2p/go-libp2p-quic-transport v0.10.0/go.mod h1:RfJbZ8IqXIhxBRm5hqUEJqjiiY8xmEuq3HUDS993MkA= -github.com/libp2p/go-libp2p-quic-transport v0.11.2 h1:p1YQDZRHH4Cv2LPtHubqlQ9ggz4CKng/REZuXZbZMhM= 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= +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 h1:wHBEceRy+1/8Ec8dAIyr+/P7L2YefIGprPVy5LrMM+k= +github.com/libp2p/go-libp2p-quic-transport v0.15.2/go.mod h1:wv4uGwjcqe8Mhjj7N/Ic0aKjA+/10UnMlSzLO0yRpYQ= 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= @@ -1593,10 +1410,11 @@ github.com/libp2p/go-libp2p-swarm v0.2.4/go.mod h1:/xIpHFPPh3wmSthtxdGbkHZ0OET1h github.com/libp2p/go-libp2p-swarm v0.2.7/go.mod h1:ZSJ0Q+oq/B1JgfPHJAT2HTall+xYRNYp1xs4S2FBWKA= 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.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 h1:hsYaD/y6+kZff1o1Mc56NcuwSg80lIphTS/zDk3mO4M= 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= +github.com/libp2p/go-libp2p-swarm v0.9.0 h1:LdWjHDVjPMYt3NCG2EHcQiIP8XzA8BHhHz8ZLAYol2Y= +github.com/libp2p/go-libp2p-swarm v0.9.0/go.mod h1:2f8d8uxTJmpeqHF/1ujjdXZp+98nNIbujVOMEZxCbZ8= 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= @@ -1606,22 +1424,26 @@ github.com/libp2p/go-libp2p-testing v0.1.1/go.mod h1:xaZWMJrPUM5GlDBxCeGUi7kI4eq github.com/libp2p/go-libp2p-testing v0.1.2-0.20200422005655-8775583591d8/go.mod h1:Qy8sAncLKpwXtS2dSnDOP8ktexIAHKu+J+pnZOFZLTc= github.com/libp2p/go-libp2p-testing v0.3.0/go.mod h1:efZkql4UZ7OVsEfaxNHZPzIehtsBXMrXnCfJIgDti5g= github.com/libp2p/go-libp2p-testing v0.4.0/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotlKsNSbKQ/lImlOWF0= -github.com/libp2p/go-libp2p-testing v0.4.2 h1:IOiA5mMigi+eEjf4J+B7fepDhsjtsoWA9QbsCqbNp5U= 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 h1:tV/wz6mS1VoAYA/5DGTiyzw9TJ+eXMCMvzU5VPLJSgg= +github.com/libp2p/go-libp2p-testing v0.6.0/go.mod h1:QBk8fqIL1XNcno/l3/hhaIEn4aLRijpYOR+zVjjlh+A= github.com/libp2p/go-libp2p-tls v0.1.3/go.mod h1:wZfuewxOndz5RTnCAxFliGjvYSDA40sKitV4c50uI1M= -github.com/libp2p/go-libp2p-tls v0.2.0 h1:N8i5wPiHudA+02sfW85R2nUbybPm7agjAywZc6pd3xA= -github.com/libp2p/go-libp2p-tls v0.2.0/go.mod h1:twrp2Ci4lE2GYspA1AnlYm+boYjqVruxDKJJj7s6xrc= +github.com/libp2p/go-libp2p-tls v0.3.0/go.mod h1:fwF5X6PWGxm6IDRwF3V8AVCCj/hOd5oFlg+wo2FxJDY= +github.com/libp2p/go-libp2p-tls v0.3.1 h1:lsE2zYte+rZCEOHF72J1Fg3XK3dGQyKvI6i5ehJfEp0= +github.com/libp2p/go-libp2p-tls v0.3.1/go.mod h1:fwF5X6PWGxm6IDRwF3V8AVCCj/hOd5oFlg+wo2FxJDY= github.com/libp2p/go-libp2p-transport v0.0.1/go.mod h1:UzbUs9X+PHOSw7S3ZmeOxfnwaQY5vGDzZmKPod3N3tk= github.com/libp2p/go-libp2p-transport v0.0.5/go.mod h1:StoY3sx6IqsP6XKoabsPnHCwqKXWUMWU7Rfcsubee/A= github.com/libp2p/go-libp2p-transport-upgrader v0.0.4/go.mod h1:RGq+tupk+oj7PzL2kn/m1w6YXxcIAYJYeI90h6BGgUc= 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 h1:SHt3g0FslnqIkEWF25YOB8UCOCTpGAVvHRWQYJ+veiI= github.com/libp2p/go-libp2p-transport-upgrader v0.4.6/go.mod h1:JE0WQuQdy+uLZ5zOaI3Nw9dWGYJIA7mywEtP2lMvnyk= +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 h1:GfMCU+2aGGEm1zW3UcOz6wYSn8tXQalFfVfcww99i5A= +github.com/libp2p/go-libp2p-transport-upgrader v0.6.0/go.mod h1:1e07y1ZSZdHo9HPbuU8IztM1Cj+DR5twgycb4pnRzRo= github.com/libp2p/go-libp2p-xor v0.0.0-20210714161855-5c005aca55db/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= @@ -1633,10 +1455,10 @@ 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 h1:/UOPtT/6DHPtr3TtKXBHa6g0Le0szYuI33Xc/Xpd7fQ= 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 h1:bVXHbTj/XH4uBBsPrg26BlDABk5WYRlssY73P0SjhPc= +github.com/libp2p/go-libp2p-yamux v0.7.0/go.mod h1:fMyA0CsPfHkIuBU0wjRGrCjTBFiXTXxG0k5M4ETv+08= 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= @@ -1653,12 +1475,14 @@ github.com/libp2p/go-mplex v0.3.0/go.mod h1:0Oy/A9PQlwBytDRp4wSkFnzHYDKcpLot35JQ 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= -github.com/libp2p/go-msgio v0.0.6 h1:lQ7Uc0kS1wb1EfRxO2Eir/RJoHkHn7t6o+EiwsYIKJA= github.com/libp2p/go-msgio v0.0.6/go.mod h1:4ecVB6d9f4BDSL5fqvPiC4A3KivjWn+Venn/1ALLMWA= +github.com/libp2p/go-msgio v0.1.0 h1:8Q7g/528ivAlfXTFWvWhVjTE8XG8sDTkRUKPYh9+5Q8= +github.com/libp2p/go-msgio v0.1.0/go.mod h1:eNlv2vy9V2X/kNldcZ+SShFE++o2Yjxwx6RAYsmgJnE= github.com/libp2p/go-nat v0.0.3/go.mod h1:88nUEt0k0JD45Bk93NIwDqjlhiOwOoV36GchpcVc1yI= github.com/libp2p/go-nat v0.0.4/go.mod h1:Nmw50VAvKuk38jUBcmNh6p9lUJLoODbJRvYAa/+KSDo= -github.com/libp2p/go-nat v0.0.5 h1:qxnwkco8RLKqVh1NmjQ+tJ8p8khNLFxuElYG/TwqW4Q= github.com/libp2p/go-nat v0.0.5/go.mod h1:B7NxsVNPZmRLvMOwiEO1scOSyjA56zxYAGv1yQgRkEU= +github.com/libp2p/go-nat v0.1.0 h1:MfVsH6DLcpa04Xr+p8hmVRG4juse0s3J8HyNWYHffXg= +github.com/libp2p/go-nat v0.1.0/go.mod h1:X7teVkwRHNInVNWQiO/tAiAVRwSr5zoRz4YSTC3uRBM= github.com/libp2p/go-netroute v0.1.2/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk= github.com/libp2p/go-netroute v0.1.3/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk= github.com/libp2p/go-netroute v0.1.5/go.mod h1:V1SR3AaECRkEQCoFFzYwVYWvYIEtlxx89+O3qcpCl4A= @@ -1671,13 +1495,15 @@ github.com/libp2p/go-openssl v0.0.5/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO 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-reuseport v0.0.1/go.mod h1:jn6RmB1ufnQwl0Q1f+YxAj8isJgDCQzaaxIFYDhcYEA= -github.com/libp2p/go-reuseport v0.0.2 h1:XSG94b1FJfGA01BUrT82imejHQyTxO4jEWqheyCXYvU= github.com/libp2p/go-reuseport v0.0.2/go.mod h1:SPD+5RwGC7rcnzngoYC86GjPzjSywuQyMVAheVBD9nQ= +github.com/libp2p/go-reuseport v0.1.0 h1:0ooKOx2iwyIkf339WCZ2HN3ujTDbkK0PjC7JVoP1AiM= +github.com/libp2p/go-reuseport v0.1.0/go.mod h1:bQVn9hmfcTaoo0c9v5pBhOarsU1eNOBZdaAd2hzXRKU= github.com/libp2p/go-reuseport-transport v0.0.2/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs= github.com/libp2p/go-reuseport-transport v0.0.3/go.mod h1:Spv+MPft1exxARzP2Sruj2Wb5JSyHNncjf1Oi2dEbzM= github.com/libp2p/go-reuseport-transport v0.0.4/go.mod h1:trPa7r/7TJK/d+0hdBLOCGvpQQVOU74OXbNCIMkufGw= -github.com/libp2p/go-reuseport-transport v0.0.5 h1:lJzi+vSYbyJj2faPKLxNGWEIBcaV/uJmyvsUxXy2mLw= github.com/libp2p/go-reuseport-transport v0.0.5/go.mod h1:TC62hhPc8qs5c/RoXDZG6YmjK+/YWUPC0yYmeUecbjc= +github.com/libp2p/go-reuseport-transport v0.1.0 h1:C3PHeHjmnz8m6f0uydObj02tMEoi7CyD1zuN7xQT8gc= +github.com/libp2p/go-reuseport-transport v0.1.0/go.mod h1:vev0C0uMkzriDY59yFHD9v+ujJvYmDQVLowvAjEOmfw= 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 h1:yD80l2ZOdGksnOyHrhxDdTDFrf7Oy+v3FMVArIRgZxQ= @@ -1692,11 +1518,11 @@ 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= -github.com/libp2p/go-tcp-transport v0.2.8 h1:aLjX+Nkz+kIz3uA56WtlGKRSAnKDvnqKmv1qF4EyyE4= -github.com/libp2p/go-tcp-transport v0.2.8/go.mod h1:64rSfVidkYPLqbzpcN2IwHY4pmgirp67h++hZ/rcndQ= +github.com/libp2p/go-tcp-transport v0.4.0 h1:VDyg4j6en3OuXf90gfDQh5Sy9KowO9udnd0OU8PP6zg= +github.com/libp2p/go-tcp-transport v0.4.0/go.mod h1:0y52Rwrn4076xdJYu/51/qJIdxz+EWDAOG2S45sV3VI= 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= @@ -1714,32 +1540,29 @@ github.com/libp2p/go-yamux v1.2.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZ github.com/libp2p/go-yamux v1.3.0/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/libp2p/go-yamux v1.3.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/libp2p/go-yamux v1.3.5/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= -github.com/libp2p/go-yamux v1.3.6/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 h1:RwtpYZ2/wVviZ5+3pjC8qdQ4TKnrak0/E01N1UWoAFU= github.com/libp2p/go-yamux/v2 v2.2.0/go.mod h1:3So6P6TV6r75R9jiBpiIKgU/66lOarCZjqROGxzPpPQ= -github.com/libp2p/zeroconf/v2 v2.0.0/go.mod h1:J85R/d9joD8u8F9aHM8pBXygtG9W02enEwS+wWeL6yo= +github.com/libp2p/go-yamux/v2 v2.3.0 h1:luRV68GS1vqqr6EFUjtu1kr51d+IbW0gSowu8emYWAI= +github.com/libp2p/go-yamux/v2 v2.3.0/go.mod h1:iTU+lOIn/2h0AgKcL49clNTwfEw+WSfDYrXe05EyKIs= +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.16.0/go.mod h1:I0+fcNTdb9eS1ZcjQZbDVPGchJ86chcIxPALn9lEJqE= github.com/lucas-clemente/quic-go v0.19.3/go.mod h1:ADXpNbTQjq1hIzCpB+y/k5iz4n4z4IwqoLb94Kh5Hu8= -github.com/lucas-clemente/quic-go v0.21.2 h1:8LqqL7nBQFDUINadW0fHV/xSaCQJgmJC0Gv+qUnjd78= 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= +github.com/lucas-clemente/quic-go v0.24.0 h1:ToR7SIIEdrgOhgVTHvPgdVRJfgVy+N0wQAagH7L4d5g= +github.com/lucas-clemente/quic-go v0.24.0/go.mod h1:paZuzjXCE5mj6sikVLMvqXk8lJV2AsqtJ6bDhjEfxx0= 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= github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= -<<<<<<< HEAD -======= github.com/magefile/mage v1.9.0 h1:t3AU2wNwehMCW97vuqQLtw6puppWXHO+O2MHo5a50XE= ->>>>>>> master github.com/magefile/mage v1.9.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= @@ -1759,12 +1582,12 @@ github.com/marten-seemann/qtls v0.9.1/go.mod h1:T1MmAdDPyISzxlK6kjRr0pcZFBVd1OZb 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= -github.com/marten-seemann/qtls-go1-15 v0.1.5 h1:Ci4EIUN6Rlb+D6GmLdej/bCQ4nPYNtVXQB+xjiXE1nk= github.com/marten-seemann/qtls-go1-15 v0.1.5/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= github.com/marten-seemann/qtls-go1-16 v0.1.4 h1:xbHbOGGhrenVtII6Co8akhLEdrawwB2iHl5yhJRpnco= github.com/marten-seemann/qtls-go1-16 v0.1.4/go.mod h1:gNpI2Ol+lRS3WwSOtIUUtRwZEQMXjYK+dQSBFbethAk= -github.com/marten-seemann/qtls-go1-17 v0.1.0-rc.1 h1:/rpmWuGvceLwwWuaKPdjpR4JJEUH0tq64/I3hvzaNLM= 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 h1:P9ggrs5xtwiqXv/FHNwntmuLMNq3KaSIG93AtAZ48xk= +github.com/marten-seemann/qtls-go1-17 v0.1.0/go.mod h1:fz4HIxByo+LlWcreM4CZOYNuz3taBQ8rN2X6FqvaWo8= 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= @@ -1775,10 +1598,7 @@ github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVc github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -<<<<<<< HEAD -======= github.com/mattn/go-colorable v0.1.9 h1:sqDoxXbdeALODt0DAeJCVp38ps9ZogZEAXjus69YV3U= ->>>>>>> master github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= @@ -1790,10 +1610,7 @@ 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= -<<<<<<< HEAD -======= github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= ->>>>>>> master 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.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= @@ -1819,7 +1636,6 @@ github.com/miekg/dns v1.1.22/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKju 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.29/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 h1:JKfpVSCB84vrAmHzyrsxB5NAr5kLoMXZArPSw7Qlgyg= github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= @@ -1868,10 +1684,7 @@ github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg= github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= -<<<<<<< HEAD -======= github.com/multiformats/go-base32 v0.0.4 h1:+qMh4a2f37b4xTNs6mqitDinryCI+tfO2dRVMN9mjSE= ->>>>>>> master github.com/multiformats/go-base32 v0.0.4/go.mod h1:jNLFzjPZtp3aIARHbJRZIaPuspdH0J6q39uUM5pnABM= github.com/multiformats/go-base36 v0.1.0 h1:JR6TyF7JjGd3m6FbLU2cOxhC0Li8z8dLNGQ89tUg4F4= github.com/multiformats/go-base36 v0.1.0/go.mod h1:kFGE83c6s80PklsHO9sRn2NCoffoRdUUOENyW/Vv6sM= @@ -1887,10 +1700,7 @@ 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= -<<<<<<< HEAD -======= github.com/multiformats/go-multiaddr v0.4.1 h1:Pq37uLx3hsyNlTDir7FZyU8+cFCTqd5y1KiM2IzOutI= ->>>>>>> master github.com/multiformats/go-multiaddr v0.4.1/go.mod h1:3afI9HfVW8csiF8UZqtpYRiDyew8pRX7qLIGHu9FLuM= 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= @@ -1915,10 +1725,9 @@ github.com/multiformats/go-multibase v0.0.2/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/g 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-multicodec v0.2.0/go.mod h1:/y4YVwkfMyry5kFbMTbLJKErhycTIftytRV+llXdyS4= -github.com/multiformats/go-multicodec v0.2.1-0.20210713081508-b421db6850ae/go.mod h1:qGGaQmioCDh+TeFOnxrbU0DaIPw8yFgAZgFG0V7p1qQ= -github.com/multiformats/go-multicodec v0.2.1-0.20210714093213-b2b5bd6fe68b/go.mod h1:qGGaQmioCDh+TeFOnxrbU0DaIPw8yFgAZgFG0V7p1qQ= -github.com/multiformats/go-multicodec v0.3.0 h1:tstDwfIjiHbnIjeM5Lp+pMrSeN+LCMsEwOrkPmWm03A= github.com/multiformats/go-multicodec v0.3.0/go.mod h1:qGGaQmioCDh+TeFOnxrbU0DaIPw8yFgAZgFG0V7p1qQ= +github.com/multiformats/go-multicodec v0.3.1-0.20210902112759-1539a079fd61 h1:ZrUuMKNgJ52qHPoQ+bx0h0uBfcWmN7Px+4uKSZeesiI= +github.com/multiformats/go-multicodec v0.3.1-0.20210902112759-1539a079fd61/go.mod h1:1Hj/eHRaVWSXiSNNfcEPcwZleTmdNP81xlxDLnWU9GQ= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po= github.com/multiformats/go-multihash v0.0.8/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= @@ -1927,16 +1736,12 @@ 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= -<<<<<<< HEAD -======= -github.com/multiformats/go-multihash v0.0.16 h1:D2qsyy1WVculJbGv69pWmQ36ehxFoA5NiIUr1OEs6qI= ->>>>>>> master -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 h1:TCYu1BHTDr1F/Qm75qwYISQdzGcRdC21nFgQW7l7GBo= github.com/multiformats/go-multistream v0.2.2/go.mod h1:UIcnm7Zuo8HKG+HkWgfQsGL+/MIEhyTqbODbIUwSXKs= @@ -1968,12 +1773,7 @@ github.com/ngdinhtoan/glide-cleanup v0.2.0/go.mod h1:UQzsmiDOb8YV3nOsCxK/c9zPpCZ 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= -<<<<<<< HEAD -github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229 h1:E2B8qYyeSgv5MXpmzZXRNp8IAQ4vjxIjhpAf5hv/tAg= -github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229/go.mod h1:0aYXnNPJ8l7uZxf45rWW1a/uME32OF0rhiYGNQ2oF2E= -======= github.com/nkovacs/streamquote v1.0.0 h1:PmVIV08Zlx2lZK5fFZlMZ04eHcDTIFJCv/5/0twVUow= ->>>>>>> master github.com/nkovacs/streamquote v1.0.0/go.mod h1:BN+NaZ2CmdKqUuTUXUEm9j95B2TRbpOWpxbJYzzgUsc= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= @@ -2074,7 +1874,6 @@ github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeD 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.5.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= -github.com/prometheus/client_golang v1.6.0/go.mod h1:ZLOG9ck3JLRdB5MgO8f+lLTe83AXG6ro35rLTxvnIl4= 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= github.com/prometheus/client_golang v1.10.0/go.mod h1:WJM3cc3yu7XKBKa/I8WeZm+V3eltZnBwfENSU7mdogU= @@ -2112,22 +1911,18 @@ github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDa github.com/prometheus/procfs v0.0.5/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.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= 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/prometheus v0.0.0-20200609090129-a6600f564e3c/go.mod h1:S5n0C6tSgdnwWshBUceRx5G1OsjLv/EeZ9t3wIfEtsY= -<<<<<<< HEAD -======= github.com/prometheus/statsd_exporter v0.21.0 h1:hA05Q5RFeIjgwKIYEdFd59xu5Wwaznf33yKI+pyX6T8= ->>>>>>> master 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.0.1 h1:qgm3DIJAeb+2byneLrQJ7kvmDLGxN2vy3apXyGaDKN4= -github.com/raulk/go-watchdog v1.0.1/go.mod h1:lzSbAl5sh4rtI8tYHU01BWIDzgzqaQLj6RcA1i4mlqI= +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/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= @@ -2141,6 +1936,8 @@ github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6L github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rs/cors v1.6.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= @@ -2315,7 +2112,6 @@ github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11 h1:5HZfQkwe0mIf github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11/go.mod h1:Wlo/SzPmxVp6vXpGt/zaXhHH0fn4IxgqZc82aKg6bpQ= github.com/whyrusleeping/cbor-gen v0.0.0-20191216205031-b047b6acb3c0/go.mod h1:xdlJQaiqipF0HW+Mzpg7XRM3fWbGvfgFlcppuvlkIvY= github.com/whyrusleeping/cbor-gen v0.0.0-20200123233031-1cdf64d27158/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= -github.com/whyrusleeping/cbor-gen v0.0.0-20200402171437-3d27c146c105/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= github.com/whyrusleeping/cbor-gen v0.0.0-20200414195334-429a0b5e922e/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= github.com/whyrusleeping/cbor-gen v0.0.0-20200504204219-64967432584d/go.mod h1:W5MvapuoHRP8rz4vxjwCK1pDqF1aQcWsV5PZ+AHbqdg= github.com/whyrusleeping/cbor-gen v0.0.0-20200710004633-5379fc63235d/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= @@ -2369,6 +2165,7 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de 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.0/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= @@ -2404,13 +2201,23 @@ go.opencensus.io v0.22.1/go.mod h1:Ap50jQcDJrx6rB6VgeeFPtuPIf3wMRvRfrfYDO6+BmA= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.6-0.20201102222123-380f4078db9f/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= 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/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= go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= +go.opentelemetry.io/otel/metric v0.25.0/go.mod h1:E884FSpQfnJOMMUaq+05IWlJ4rjZpk2s/F1Ju+TEEm8= go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= +go.opentelemetry.io/otel/sdk v1.2.0/go.mod h1:jNN8QtpvbsKhgaC6V5lHiejMoKD+V8uadoSafgHPx1U= +go.opentelemetry.io/otel/sdk/export/metric v0.25.0/go.mod h1:Ej7NOa+WpN49EIcr1HMUYRvxXXCCnQCg2+ovdt2z8Pk= +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/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= @@ -2426,10 +2233,7 @@ go.uber.org/fx v1.9.0 h1:7OAz8ucp35AU8eydejpYG7QrbE8rLKzGhHbZlJi5LYY= go.uber.org/fx v1.9.0/go.mod h1:mFdUyAUuJ3w4jAckiKSKbldsxy1ojpAMJ+dVZg5Y0Aw= go.uber.org/goleak v1.0.0/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -<<<<<<< HEAD -======= go.uber.org/goleak v1.1.11-0.20210813005559-691160354723 h1:sHOAIxRGBp443oHZIPB+HsUGaksVCXVQENPxwTfQdH4= ->>>>>>> master go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= @@ -2449,10 +2253,7 @@ 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= -<<<<<<< HEAD -======= go.uber.org/zap v1.19.1 h1:ue41HOKd1vGURxrmeKIgELGb3jPW9DMUDGtsinblHwI= ->>>>>>> master go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= go4.org v0.0.0-20200411211856-f5505b9728dd h1:BNJlw5kRTzdmyfh5U8F93HA2OwkP7ZGwA51eJ/0wKOU= @@ -2488,7 +2289,6 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20191202143827-86a70503ff7e/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= 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-20200117160349-530e935923ad/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200128174031-69ecbb4d6d5d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -2511,11 +2311,9 @@ golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5 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= -<<<<<<< HEAD -======= -golang.org/x/crypto v0.0.0-20210915214749-c084706c2272 h1:3erb+vDS8lU1sxfDHF4/hhWyaXnhIaO+7RgL4fDZORA= ->>>>>>> master golang.org/x/crypto v0.0.0-20210915214749-c084706c2272/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20211209193657-4570a0811e8b h1:QAqMVf3pSa6eeTsuklijukjXBlj7Es2QQplab+/RbQ4= +golang.org/x/crypto v0.0.0-20211209193657-4570a0811e8b/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= @@ -2531,7 +2329,6 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20200513190911-00229845015e/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= 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= @@ -2550,10 +2347,7 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -<<<<<<< HEAD -======= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= ->>>>>>> master golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= @@ -2565,7 +2359,6 @@ golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.1.1-0.20191209134235-331c550502dd/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 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.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -2619,10 +2412,8 @@ golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200519113804-d87ec0cfa476/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200602114024-627f9648deb9/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-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= @@ -2638,14 +2429,11 @@ golang.org/x/net v0.0.0-20210423184538-5f58ad60dda6/go.mod h1:OJAsFXCWl8Ukc7SiCT golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= 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= -<<<<<<< HEAD -golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d h1:LO7XpTYMwTqxjLcGWPijK3vRXg1aWdlNOVOHRq45d7c= -golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -======= +golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/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 h1:R150MpwJIv1MpS0N/pc+NhTM8ajzvlmxlY5OYsrevXQ= ->>>>>>> master golang.org/x/net v0.0.0-20210917221730-978cfadd31cf/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 h1:CIJ76btIcR3eFI5EgSo6k1qKw9KJexJuRLI9G7Hp5wE= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= 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= @@ -2774,6 +2562,7 @@ golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7w 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= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210511113859-b0526f3d8744/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -2781,13 +2570,12 @@ golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/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-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -<<<<<<< HEAD -======= -golang.org/x/sys v0.0.0-20210917161153-d61c044b1678 h1:J27LZFQBFoihqXoegpscI10HpjZ7B5WQLLKL2FZXQKw= ->>>>>>> master golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211209171907-798191bca915 h1:P+8mCzuEpyszAT6T42q0sxU+eveBAF/cJ2Kp0x6/8+0= +golang.org/x/sys v0.0.0-20211209171907-798191bca915/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 h1:MZ2shdL+ZM/XzY3ZGOnh4Nlpnxz5GSOhOmtHo3iPU6M= @@ -2884,16 +2672,15 @@ golang.org/x/tools v0.0.0-20200721032237-77f530d86f9a/go.mod h1:njjCfa9FT2d7l9Bc 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= -golang.org/x/tools v0.0.0-20200827010519-17fd2f27a9e3/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20201112185108-eeaa07dd7696/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= 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-0.20210225150353-54dc8c5edb56/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= 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 h1:ouewzE6p+/VEB31YYnTbEJdi8pFqKp4P4n85vwo3DHA= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.7 h1:6j8CgantCy3yc8JGBqkDLMKWqZ0RDU2g1HVgacojGWQ= +golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= 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= @@ -2970,16 +2757,12 @@ google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200608115520-7c474a2e3482/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= 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= -<<<<<<< HEAD -======= google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4 h1:ysnBoUyeL/H6RCvNRhWHjKoDEmguI+mPU+qHgK8qv/w= ->>>>>>> master google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= @@ -3085,6 +2868,9 @@ k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= k8s.io/kube-openapi v0.0.0-20200316234421-82d701f24f9d/go.mod h1:F+5wygcW0wmRTnM3cOgIqGivxkwSWIWT5YdsDbeAOaU= k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= k8s.io/utils v0.0.0-20200414100711-2df71ebbae66/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +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 h1:nPibNuDEx6tvYrUAtvDTTw98rx5juGsa5zuDnKwEEQQ= modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= modernc.org/fileutil v1.0.0/go.mod h1:JHsWpkrk/CnVV1H/eGlFf85BEpfkrp56ro8nojIq9Q8= From 27e48d73dd3f2f34d1c552d04dace588941a103f Mon Sep 17 00:00:00 2001 From: gstuart Date: Fri, 10 Dec 2021 21:04:32 -0500 Subject: [PATCH 136/393] Check if sector exists before changing its state --- cmd/lotus-miner/sectors.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cmd/lotus-miner/sectors.go b/cmd/lotus-miner/sectors.go index 43a71fd9ef0..b2059a73714 100644 --- a/cmd/lotus-miner/sectors.go +++ b/cmd/lotus-miner/sectors.go @@ -1648,6 +1648,11 @@ var sectorsUpdateCmd = &cli.Command{ return xerrors.Errorf("could not parse sector number: %w", err) } + _, err = nodeApi.SectorsStatus(ctx, abi.SectorNumber(id), false) + if err != nil { + return xerrors.Errorf("sector %d not found, could not change state", id) + } + newState := cctx.Args().Get(1) if _, ok := sealing.ExistSectorStateList[sealing.SectorState(newState)]; !ok { fmt.Printf(" \"%s\" is not a valid state. Possible states for sectors are: \n", newState) From 3f4eaa99d5c4c13c38308f677f39bbbd4290af98 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Fri, 17 Dec 2021 18:43:39 -0500 Subject: [PATCH 137/393] Refactor: State: Rename stmgr::GetNtwkVersion to GetNetworkVersion --- chain/consensus/filcns/compute_state.go | 2 +- chain/consensus/filcns/filecoin.go | 8 ++++---- chain/stmgr/actors.go | 4 ++-- chain/stmgr/call.go | 4 ++-- chain/stmgr/stmgr.go | 6 +++--- chain/stmgr/utils.go | 4 ++-- cmd/lotus-sim/simulation/blockbuilder/blockbuilder.go | 4 ++-- cmd/lotus-sim/simulation/simulation.go | 2 +- cmd/lotus-sim/simulation/step.go | 4 ++-- conformance/driver.go | 2 +- node/impl/full/state.go | 4 ++-- 11 files changed, 22 insertions(+), 22 deletions(-) diff --git a/chain/consensus/filcns/compute_state.go b/chain/consensus/filcns/compute_state.go index 7000af30343..6a25e6df287 100644 --- a/chain/consensus/filcns/compute_state.go +++ b/chain/consensus/filcns/compute_state.go @@ -101,7 +101,7 @@ func (t *TipSetExecutor) ApplyBlocks(ctx context.Context, sm *stmgr.StateManager Actors: NewActorRegistry(), Syscalls: sm.Syscalls, CircSupplyCalc: sm.GetVMCirculatingSupply, - NtwkVersion: sm.GetNtwkVersion, + NtwkVersion: sm.GetNetworkVersion, BaseFee: baseFee, LookbackState: stmgr.LookbackStateGetterForTipset(sm, ts), } diff --git a/chain/consensus/filcns/filecoin.go b/chain/consensus/filcns/filecoin.go index 328fc8ec19f..6d4c8da6473 100644 --- a/chain/consensus/filcns/filecoin.go +++ b/chain/consensus/filcns/filecoin.go @@ -95,7 +95,7 @@ func (filec *FilecoinEC) ValidateBlock(ctx context.Context, b *types.FullBlock) return xerrors.Errorf("load parent tipset failed (%s): %w", h.Parents, err) } - winPoStNv := filec.sm.GetNtwkVersion(ctx, baseTs.Height()) + winPoStNv := filec.sm.GetNetworkVersion(ctx, baseTs.Height()) lbts, lbst, err := stmgr.GetLookbackTipSetForRound(ctx, filec.sm, baseTs, h.Height) if err != nil { @@ -457,7 +457,7 @@ func (filec *FilecoinEC) checkBlockMessages(ctx context.Context, b *types.FullBl return xerrors.Errorf("failed to load base state tree: %w", err) } - nv := filec.sm.GetNtwkVersion(ctx, b.Header.Height) + nv := filec.sm.GetNetworkVersion(ctx, b.Header.Height) pl := vm.PricelistByEpoch(baseTs.Height()) var sumGasLimit int64 checkMsg := func(msg types.ChainMsg) error { @@ -479,7 +479,7 @@ func (filec *FilecoinEC) checkBlockMessages(ctx context.Context, b *types.FullBl // Phase 2: (Partial) semantic validation: // the sender exists and is an account actor, and the nonces make sense var sender address.Address - if filec.sm.GetNtwkVersion(ctx, b.Header.Height) >= network.Version13 { + if filec.sm.GetNetworkVersion(ctx, b.Header.Height) >= network.Version13 { sender, err = st.LookupID(m.From) if err != nil { return err @@ -532,7 +532,7 @@ func (filec *FilecoinEC) checkBlockMessages(ctx context.Context, b *types.FullBl smArr := blockadt.MakeEmptyArray(tmpstore) for i, m := range b.SecpkMessages { - if filec.sm.GetNtwkVersion(ctx, b.Header.Height) >= network.Version14 { + if filec.sm.GetNetworkVersion(ctx, b.Header.Height) >= network.Version14 { if m.Signature.Type != crypto.SigTypeSecp256k1 { return xerrors.Errorf("block had invalid secpk message at index %d: %w", i, err) } diff --git a/chain/stmgr/actors.go b/chain/stmgr/actors.go index 6804b81263d..a8958ee4ce2 100644 --- a/chain/stmgr/actors.go +++ b/chain/stmgr/actors.go @@ -358,7 +358,7 @@ func MinerGetBaseInfo(ctx context.Context, sm *StateManager, bcs beacon.Schedule return nil, xerrors.Errorf("failed to get randomness for winning post: %w", err) } - nv := sm.GetNtwkVersion(ctx, ts.Height()) + nv := sm.GetNetworkVersion(ctx, ts.Height()) sectors, err := GetSectorsForWinningPoSt(ctx, nv, pv, sm, lbst, maddr, prand) if err != nil { @@ -420,7 +420,7 @@ func MinerEligibleToMine(ctx context.Context, sm *StateManager, addr address.Add hmp, err := minerHasMinPower(ctx, sm, addr, lookbackTs) // TODO: We're blurring the lines between a "runtime network version" and a "Lotus upgrade epoch", is that unavoidable? - if sm.GetNtwkVersion(ctx, baseTs.Height()) <= network.Version3 { + if sm.GetNetworkVersion(ctx, baseTs.Height()) <= network.Version3 { return hmp, err } diff --git a/chain/stmgr/call.go b/chain/stmgr/call.go index ef29e165945..2d5d64ae786 100644 --- a/chain/stmgr/call.go +++ b/chain/stmgr/call.go @@ -80,7 +80,7 @@ func (sm *StateManager) Call(ctx context.Context, msg *types.Message, ts *types. Actors: sm.tsExec.NewActorRegistry(), Syscalls: sm.Syscalls, CircSupplyCalc: sm.GetVMCirculatingSupply, - NtwkVersion: sm.GetNtwkVersion, + NtwkVersion: sm.GetNetworkVersion, BaseFee: types.NewInt(0), LookbackState: LookbackStateGetterForTipset(sm, ts), } @@ -204,7 +204,7 @@ func (sm *StateManager) CallWithGas(ctx context.Context, msg *types.Message, pri Actors: sm.tsExec.NewActorRegistry(), Syscalls: sm.Syscalls, CircSupplyCalc: sm.GetVMCirculatingSupply, - NtwkVersion: sm.GetNtwkVersion, + NtwkVersion: sm.GetNetworkVersion, BaseFee: ts.Blocks()[0].ParentBaseFee, LookbackState: LookbackStateGetterForTipset(sm, ts), } diff --git a/chain/stmgr/stmgr.go b/chain/stmgr/stmgr.go index 06b363733ff..b19dd62c46b 100644 --- a/chain/stmgr/stmgr.go +++ b/chain/stmgr/stmgr.go @@ -356,7 +356,7 @@ func (sm *StateManager) VMConstructor() func(context.Context, *vm.VMOpts) (*vm.V } } -func (sm *StateManager) GetNtwkVersion(ctx context.Context, height abi.ChainEpoch) network.Version { +func (sm *StateManager) GetNetworkVersion(ctx context.Context, height abi.ChainEpoch) network.Version { // The epochs here are the _last_ epoch for every version, or -1 if the // version is disabled. for _, spec := range sm.networkVersions { @@ -378,7 +378,7 @@ func (sm *StateManager) GetRandomnessFromBeacon(ctx context.Context, personaliza } r := rand.NewStateRand(sm.ChainStore(), pts.Cids(), sm.beacon) - rnv := sm.GetNtwkVersion(ctx, randEpoch) + rnv := sm.GetNetworkVersion(ctx, randEpoch) return r.GetBeaconRandomness(ctx, rnv, personalization, randEpoch, entropy) @@ -391,7 +391,7 @@ func (sm *StateManager) GetRandomnessFromTickets(ctx context.Context, personaliz } r := rand.NewStateRand(sm.ChainStore(), pts.Cids(), sm.beacon) - rnv := sm.GetNtwkVersion(ctx, randEpoch) + rnv := sm.GetNetworkVersion(ctx, randEpoch) return r.GetChainRandomness(ctx, rnv, personalization, randEpoch, entropy) } diff --git a/chain/stmgr/utils.go b/chain/stmgr/utils.go index 8b0f8daeb73..5f23ce630ba 100644 --- a/chain/stmgr/utils.go +++ b/chain/stmgr/utils.go @@ -88,7 +88,7 @@ func ComputeState(ctx context.Context, sm *StateManager, height abi.ChainEpoch, Actors: sm.tsExec.NewActorRegistry(), Syscalls: sm.Syscalls, CircSupplyCalc: sm.GetVMCirculatingSupply, - NtwkVersion: sm.GetNtwkVersion, + NtwkVersion: sm.GetNetworkVersion, BaseFee: ts.Blocks()[0].ParentBaseFee, LookbackState: LookbackStateGetterForTipset(sm, ts), } @@ -128,7 +128,7 @@ func LookbackStateGetterForTipset(sm *StateManager, ts *types.TipSet) vm.Lookbac func GetLookbackTipSetForRound(ctx context.Context, sm *StateManager, ts *types.TipSet, round abi.ChainEpoch) (*types.TipSet, cid.Cid, error) { var lbr abi.ChainEpoch - lb := policy.GetWinningPoStSectorSetLookback(sm.GetNtwkVersion(ctx, round)) + lb := policy.GetWinningPoStSectorSetLookback(sm.GetNetworkVersion(ctx, round)) if round > lb { lbr = round - lb } diff --git a/cmd/lotus-sim/simulation/blockbuilder/blockbuilder.go b/cmd/lotus-sim/simulation/blockbuilder/blockbuilder.go index a6353e4f43c..c656a820837 100644 --- a/cmd/lotus-sim/simulation/blockbuilder/blockbuilder.go +++ b/cmd/lotus-sim/simulation/blockbuilder/blockbuilder.go @@ -88,7 +88,7 @@ func NewBlockBuilder(ctx context.Context, logger *zap.SugaredLogger, sm *stmgr.S Actors: filcns.NewActorRegistry(), Syscalls: sm.VMSys(), CircSupplyCalc: sm.GetVMCirculatingSupply, - NtwkVersion: sm.GetNtwkVersion, + NtwkVersion: sm.GetNetworkVersion, BaseFee: abi.NewTokenAmount(0), LookbackState: stmgr.LookbackStateGetterForTipset(sm, parentTs), } @@ -265,7 +265,7 @@ func (bb *BlockBuilder) Height() abi.ChainEpoch { // NetworkVersion returns the network version for the target block. func (bb *BlockBuilder) NetworkVersion() network.Version { - return bb.sm.GetNtwkVersion(bb.ctx, bb.Height()) + return bb.sm.GetNetworkVersion(bb.ctx, bb.Height()) } // StateManager returns the stmgr.StateManager. diff --git a/cmd/lotus-sim/simulation/simulation.go b/cmd/lotus-sim/simulation/simulation.go index 5747afe4d17..21e8bff710b 100644 --- a/cmd/lotus-sim/simulation/simulation.go +++ b/cmd/lotus-sim/simulation/simulation.go @@ -159,7 +159,7 @@ func (sim *Simulation) GetStart() *types.TipSet { // GetNetworkVersion returns the current network version for the simulation. func (sim *Simulation) GetNetworkVersion() network.Version { - return sim.StateManager.GetNtwkVersion(context.TODO(), sim.head.Height()) + return sim.StateManager.GetNetworkVersion(context.TODO(), sim.head.Height()) } // SetHead updates the current head of the simulation and stores it in the metadata store. This is diff --git a/cmd/lotus-sim/simulation/step.go b/cmd/lotus-sim/simulation/step.go index 902f2ad6ca6..f9d58529ea1 100644 --- a/cmd/lotus-sim/simulation/step.go +++ b/cmd/lotus-sim/simulation/step.go @@ -41,8 +41,8 @@ func (sim *Simulation) popNextMessages(ctx context.Context) ([]*types.Message, e // This isn't what the network does, but it makes things easier. Otherwise, we'd need to run // migrations before this epoch and I'd rather not deal with that. nextHeight := parentTs.Height() + 1 - prevVer := sim.StateManager.GetNtwkVersion(ctx, nextHeight-1) - nextVer := sim.StateManager.GetNtwkVersion(ctx, nextHeight) + prevVer := sim.StateManager.GetNetworkVersion(ctx, nextHeight-1) + nextVer := sim.StateManager.GetNetworkVersion(ctx, nextHeight) if nextVer != prevVer { log.Warnw("packing no messages for version upgrade block", "old", prevVer, diff --git a/conformance/driver.go b/conformance/driver.go index c6a20e3599c..9bca9c1fbfc 100644 --- a/conformance/driver.go +++ b/conformance/driver.go @@ -227,7 +227,7 @@ func (d *Driver) ExecuteMessage(bs blockstore.Blockstore, params ExecuteMessageP }, Rand: params.Rand, BaseFee: params.BaseFee, - NtwkVersion: sm.GetNtwkVersion, + NtwkVersion: sm.GetNetworkVersion, } lvm, err := vm.NewVM(context.TODO(), vmOpts) diff --git a/node/impl/full/state.go b/node/impl/full/state.go index 24cc08c8cb2..dfd1c69d95c 100644 --- a/node/impl/full/state.go +++ b/node/impl/full/state.go @@ -1365,7 +1365,7 @@ func (m *StateModule) StateDealProviderCollateralBounds(ctx context.Context, siz powClaim.QualityAdjPower, rewPow, circ.FilCirculating, - m.StateManager.GetNtwkVersion(ctx, ts.Height())) + m.StateManager.GetNetworkVersion(ctx, ts.Height())) if err != nil { return api.DealCollateralBounds{}, xerrors.Errorf("getting deal provider coll bounds: %w", err) } @@ -1418,7 +1418,7 @@ func (m *StateModule) StateNetworkVersion(ctx context.Context, tsk types.TipSetK // TODO: Height-1 to be consistent with the rest of the APIs? // But that's likely going to break a bunch of stuff. - return m.StateManager.GetNtwkVersion(ctx, ts.Height()), nil + return m.StateManager.GetNetworkVersion(ctx, ts.Height()), nil } func (a *StateAPI) StateGetRandomnessFromTickets(ctx context.Context, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte, tsk types.TipSetKey) (abi.Randomness, error) { From 6f6f5d79fbccab1d6e34bf563c0bc9b8ae4b2830 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Fri, 17 Dec 2021 18:54:17 -0500 Subject: [PATCH 138/393] Refactor: State: Let Rand get network versions --- chain/consensus/filcns/compute_state.go | 2 +- chain/gen/genesis/miners.go | 4 +-- chain/rand/rand.go | 26 ++++++++++++------- chain/stmgr/call.go | 4 +-- chain/stmgr/stmgr.go | 10 +++---- chain/stmgr/utils.go | 2 +- chain/vm/runtime.go | 6 ++--- chain/vm/vm.go | 4 +-- .../simulation/blockbuilder/blockbuilder.go | 2 +- conformance/rand_fixed.go | 6 ++--- conformance/rand_record.go | 6 ++--- conformance/rand_replay.go | 10 +++---- 12 files changed, 40 insertions(+), 42 deletions(-) diff --git a/chain/consensus/filcns/compute_state.go b/chain/consensus/filcns/compute_state.go index 6a25e6df287..ba4cc0335dd 100644 --- a/chain/consensus/filcns/compute_state.go +++ b/chain/consensus/filcns/compute_state.go @@ -299,7 +299,7 @@ func (t *TipSetExecutor) ExecuteTipSet(ctx context.Context, sm *stmgr.StateManag parentEpoch = parent.Height } - r := rand.NewStateRand(sm.ChainStore(), ts.Cids(), sm.Beacon()) + r := rand.NewStateRand(sm.ChainStore(), ts.Cids(), sm.Beacon(), sm.GetNetworkVersion) blkmsgs, err := sm.ChainStore().BlockMsgsForTipset(ctx, ts) if err != nil { diff --git a/chain/gen/genesis/miners.go b/chain/gen/genesis/miners.go index a688a032420..101f1d3b509 100644 --- a/chain/gen/genesis/miners.go +++ b/chain/gen/genesis/miners.go @@ -510,13 +510,13 @@ func SetupStorageMiners(ctx context.Context, cs *store.ChainStore, sys vm.Syscal // TODO: copied from actors test harness, deduplicate or remove from here type fakeRand struct{} -func (fr *fakeRand) GetChainRandomness(ctx context.Context, rnv network.Version, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) ([]byte, error) { +func (fr *fakeRand) GetChainRandomness(ctx context.Context, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) ([]byte, error) { out := make([]byte, 32) _, _ = rand.New(rand.NewSource(int64(randEpoch * 1000))).Read(out) //nolint return out, nil } -func (fr *fakeRand) GetBeaconRandomness(ctx context.Context, rnv network.Version, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) ([]byte, error) { +func (fr *fakeRand) GetBeaconRandomness(ctx context.Context, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) ([]byte, error) { out := make([]byte, 32) _, _ = rand.New(rand.NewSource(int64(randEpoch))).Read(out) //nolint return out, nil diff --git a/chain/rand/rand.go b/chain/rand/rand.go index 6a54a2427bf..427648f2a85 100644 --- a/chain/rand/rand.go +++ b/chain/rand/rand.go @@ -103,17 +103,21 @@ func (sr *stateRand) getChainRandomness(ctx context.Context, pers crypto.DomainS return DrawRandomness(mtb.Ticket.VRFProof, pers, round, entropy) } +type NetworkVersionGetter func(context.Context, abi.ChainEpoch) network.Version + type stateRand struct { - cs *store.ChainStore - blks []cid.Cid - beacon beacon.Schedule + cs *store.ChainStore + blks []cid.Cid + beacon beacon.Schedule + networkVersionGetter NetworkVersionGetter } -func NewStateRand(cs *store.ChainStore, blks []cid.Cid, b beacon.Schedule) vm.Rand { +func NewStateRand(cs *store.ChainStore, blks []cid.Cid, b beacon.Schedule, networkVersionGetter NetworkVersionGetter) vm.Rand { return &stateRand{ - cs: cs, - blks: blks, - beacon: b, + cs: cs, + blks: blks, + beacon: b, + networkVersionGetter: networkVersionGetter, } } @@ -166,7 +170,9 @@ func (sr *stateRand) getBeaconRandomnessV3(ctx context.Context, pers crypto.Doma return DrawRandomness(be.Data, pers, filecoinEpoch, entropy) } -func (sr *stateRand) GetChainRandomness(ctx context.Context, nv network.Version, pers crypto.DomainSeparationTag, filecoinEpoch abi.ChainEpoch, entropy []byte) ([]byte, error) { +func (sr *stateRand) GetChainRandomness(ctx context.Context, pers crypto.DomainSeparationTag, filecoinEpoch abi.ChainEpoch, entropy []byte) ([]byte, error) { + nv := sr.networkVersionGetter(ctx, filecoinEpoch) + if nv >= network.Version13 { return sr.getChainRandomness(ctx, pers, filecoinEpoch, entropy, false) } @@ -174,7 +180,9 @@ func (sr *stateRand) GetChainRandomness(ctx context.Context, nv network.Version, return sr.getChainRandomness(ctx, pers, filecoinEpoch, entropy, true) } -func (sr *stateRand) GetBeaconRandomness(ctx context.Context, nv network.Version, pers crypto.DomainSeparationTag, filecoinEpoch abi.ChainEpoch, entropy []byte) ([]byte, error) { +func (sr *stateRand) GetBeaconRandomness(ctx context.Context, pers crypto.DomainSeparationTag, filecoinEpoch abi.ChainEpoch, entropy []byte) ([]byte, error) { + nv := sr.networkVersionGetter(ctx, filecoinEpoch) + if nv >= network.Version14 { return sr.getBeaconRandomnessV3(ctx, pers, filecoinEpoch, entropy) } else if nv == network.Version13 { diff --git a/chain/stmgr/call.go b/chain/stmgr/call.go index 2d5d64ae786..7f76628e826 100644 --- a/chain/stmgr/call.go +++ b/chain/stmgr/call.go @@ -75,7 +75,7 @@ func (sm *StateManager) Call(ctx context.Context, msg *types.Message, ts *types. vmopt := &vm.VMOpts{ StateBase: bstate, Epoch: pheight + 1, - Rand: rand.NewStateRand(sm.cs, ts.Cids(), sm.beacon), + Rand: rand.NewStateRand(sm.cs, ts.Cids(), sm.beacon, sm.GetNetworkVersion), Bstore: sm.cs.StateBlockstore(), Actors: sm.tsExec.NewActorRegistry(), Syscalls: sm.Syscalls, @@ -186,7 +186,7 @@ func (sm *StateManager) CallWithGas(ctx context.Context, msg *types.Message, pri return nil, fmt.Errorf("failed to handle fork: %w", err) } - r := rand.NewStateRand(sm.cs, ts.Cids(), sm.beacon) + r := rand.NewStateRand(sm.cs, ts.Cids(), sm.beacon, sm.GetNetworkVersion) if span.IsRecordingEvents() { span.AddAttributes( diff --git a/chain/stmgr/stmgr.go b/chain/stmgr/stmgr.go index b19dd62c46b..fd3558a1cf4 100644 --- a/chain/stmgr/stmgr.go +++ b/chain/stmgr/stmgr.go @@ -377,10 +377,9 @@ func (sm *StateManager) GetRandomnessFromBeacon(ctx context.Context, personaliza return nil, xerrors.Errorf("loading tipset %s: %w", tsk, err) } - r := rand.NewStateRand(sm.ChainStore(), pts.Cids(), sm.beacon) - rnv := sm.GetNetworkVersion(ctx, randEpoch) + r := rand.NewStateRand(sm.ChainStore(), pts.Cids(), sm.beacon, sm.GetNetworkVersion) - return r.GetBeaconRandomness(ctx, rnv, personalization, randEpoch, entropy) + return r.GetBeaconRandomness(ctx, personalization, randEpoch, entropy) } @@ -390,8 +389,7 @@ func (sm *StateManager) GetRandomnessFromTickets(ctx context.Context, personaliz return nil, xerrors.Errorf("loading tipset key: %w", err) } - r := rand.NewStateRand(sm.ChainStore(), pts.Cids(), sm.beacon) - rnv := sm.GetNetworkVersion(ctx, randEpoch) + r := rand.NewStateRand(sm.ChainStore(), pts.Cids(), sm.beacon, sm.GetNetworkVersion) - return r.GetChainRandomness(ctx, rnv, personalization, randEpoch, entropy) + return r.GetChainRandomness(ctx, personalization, randEpoch, entropy) } diff --git a/chain/stmgr/utils.go b/chain/stmgr/utils.go index 5f23ce630ba..698ffc13f66 100644 --- a/chain/stmgr/utils.go +++ b/chain/stmgr/utils.go @@ -79,7 +79,7 @@ func ComputeState(ctx context.Context, sm *StateManager, height abi.ChainEpoch, // future. It's not guaranteed to be accurate... but that's fine. } - r := rand.NewStateRand(sm.cs, ts.Cids(), sm.beacon) + r := rand.NewStateRand(sm.cs, ts.Cids(), sm.beacon, sm.GetNetworkVersion) vmopt := &vm.VMOpts{ StateBase: base, Epoch: height, diff --git a/chain/vm/runtime.go b/chain/vm/runtime.go index 9bbed403093..844f5d2539e 100644 --- a/chain/vm/runtime.go +++ b/chain/vm/runtime.go @@ -224,8 +224,7 @@ func (rt *Runtime) GetActorCodeCID(addr address.Address) (ret cid.Cid, ok bool) } func (rt *Runtime) GetRandomnessFromTickets(personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) abi.Randomness { - rnv := rt.vm.ntwkVersion(rt.ctx, randEpoch) - res, err := rt.vm.rand.GetChainRandomness(rt.ctx, rnv, personalization, randEpoch, entropy) + res, err := rt.vm.rand.GetChainRandomness(rt.ctx, personalization, randEpoch, entropy) if err != nil { panic(aerrors.Fatalf("could not get ticket randomness: %s", err)) @@ -234,8 +233,7 @@ func (rt *Runtime) GetRandomnessFromTickets(personalization crypto.DomainSeparat } func (rt *Runtime) GetRandomnessFromBeacon(personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) abi.Randomness { - rnv := rt.vm.ntwkVersion(rt.ctx, randEpoch) - res, err := rt.vm.rand.GetBeaconRandomness(rt.ctx, rnv, personalization, randEpoch, entropy) + res, err := rt.vm.rand.GetBeaconRandomness(rt.ctx, personalization, randEpoch, entropy) if err != nil { panic(aerrors.Fatalf("could not get beacon randomness: %s", err)) diff --git a/chain/vm/vm.go b/chain/vm/vm.go index 4536460309f..c0b730774de 100644 --- a/chain/vm/vm.go +++ b/chain/vm/vm.go @@ -260,8 +260,8 @@ func NewVM(ctx context.Context, opts *VMOpts) (*VM, error) { } type Rand interface { - GetChainRandomness(ctx context.Context, nv network.Version, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) - GetBeaconRandomness(ctx context.Context, nv network.Version, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) + GetChainRandomness(ctx context.Context, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) + GetBeaconRandomness(ctx context.Context, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) } type ApplyRet struct { diff --git a/cmd/lotus-sim/simulation/blockbuilder/blockbuilder.go b/cmd/lotus-sim/simulation/blockbuilder/blockbuilder.go index c656a820837..360368b8222 100644 --- a/cmd/lotus-sim/simulation/blockbuilder/blockbuilder.go +++ b/cmd/lotus-sim/simulation/blockbuilder/blockbuilder.go @@ -79,7 +79,7 @@ func NewBlockBuilder(ctx context.Context, logger *zap.SugaredLogger, sm *stmgr.S // 1. We don't charge a fee. // 2. The runtime has "fake" proof logic. // 3. We don't actually save any of the results. - r := lrand.NewStateRand(sm.ChainStore(), parentTs.Cids(), sm.Beacon()) + r := lrand.NewStateRand(sm.ChainStore(), parentTs.Cids(), sm.Beacon(), sm.GetNetworkVersion) vmopt := &vm.VMOpts{ StateBase: parentState, Epoch: parentTs.Height() + 1, diff --git a/conformance/rand_fixed.go b/conformance/rand_fixed.go index 4284f98ff00..d356b53d049 100644 --- a/conformance/rand_fixed.go +++ b/conformance/rand_fixed.go @@ -3,8 +3,6 @@ package conformance import ( "context" - "github.com/filecoin-project/go-state-types/network" - "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/crypto" @@ -21,10 +19,10 @@ func NewFixedRand() vm.Rand { return &fixedRand{} } -func (r *fixedRand) GetChainRandomness(_ context.Context, _ network.Version, _ crypto.DomainSeparationTag, _ abi.ChainEpoch, _ []byte) ([]byte, error) { +func (r *fixedRand) GetChainRandomness(_ context.Context, _ crypto.DomainSeparationTag, _ abi.ChainEpoch, _ []byte) ([]byte, error) { return []byte("i_am_random_____i_am_random_____"), nil // 32 bytes. } -func (r *fixedRand) GetBeaconRandomness(_ context.Context, _ network.Version, _ crypto.DomainSeparationTag, _ abi.ChainEpoch, _ []byte) ([]byte, error) { +func (r *fixedRand) GetBeaconRandomness(_ context.Context, _ crypto.DomainSeparationTag, _ abi.ChainEpoch, _ []byte) ([]byte, error) { return []byte("i_am_random_____i_am_random_____"), nil // 32 bytes. } diff --git a/conformance/rand_record.go b/conformance/rand_record.go index f6eeaa6c98d..8422ad31d64 100644 --- a/conformance/rand_record.go +++ b/conformance/rand_record.go @@ -5,8 +5,6 @@ import ( "fmt" "sync" - "github.com/filecoin-project/go-state-types/network" - "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/crypto" @@ -47,7 +45,7 @@ func (r *RecordingRand) loadHead() { r.head = head.Key() } -func (r *RecordingRand) GetChainRandomness(ctx context.Context, nv network.Version, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) { +func (r *RecordingRand) GetChainRandomness(ctx context.Context, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) { r.once.Do(r.loadHead) // FullNode's v0 ChainGetRandomnessFromTickets handles whether we should be looking forward or back ret, err := r.api.ChainGetRandomnessFromTickets(ctx, r.head, pers, round, entropy) @@ -73,7 +71,7 @@ func (r *RecordingRand) GetChainRandomness(ctx context.Context, nv network.Versi return ret, err } -func (r *RecordingRand) GetBeaconRandomness(ctx context.Context, nv network.Version, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) { +func (r *RecordingRand) GetBeaconRandomness(ctx context.Context, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) { r.once.Do(r.loadHead) ret, err := r.api.StateGetRandomnessFromBeacon(ctx, pers, round, entropy, r.head) if err != nil { diff --git a/conformance/rand_replay.go b/conformance/rand_replay.go index 1907ddf24d0..6c228275232 100644 --- a/conformance/rand_replay.go +++ b/conformance/rand_replay.go @@ -4,8 +4,6 @@ import ( "bytes" "context" - "github.com/filecoin-project/go-state-types/network" - "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/crypto" @@ -45,7 +43,7 @@ func (r *ReplayingRand) match(requested schema.RandomnessRule) ([]byte, bool) { return nil, false } -func (r *ReplayingRand) GetChainRandomness(ctx context.Context, nv network.Version, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) { +func (r *ReplayingRand) GetChainRandomness(ctx context.Context, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) { rule := schema.RandomnessRule{ Kind: schema.RandomnessChain, DomainSeparationTag: int64(pers), @@ -60,10 +58,10 @@ func (r *ReplayingRand) GetChainRandomness(ctx context.Context, nv network.Versi r.reporter.Logf("returning fallback chain randomness: dst=%d, epoch=%d, entropy=%x", pers, round, entropy) - return r.fallback.GetChainRandomness(ctx, nv, pers, round, entropy) + return r.fallback.GetChainRandomness(ctx, pers, round, entropy) } -func (r *ReplayingRand) GetBeaconRandomness(ctx context.Context, nv network.Version, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) { +func (r *ReplayingRand) GetBeaconRandomness(ctx context.Context, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) { rule := schema.RandomnessRule{ Kind: schema.RandomnessBeacon, DomainSeparationTag: int64(pers), @@ -78,5 +76,5 @@ func (r *ReplayingRand) GetBeaconRandomness(ctx context.Context, nv network.Vers r.reporter.Logf("returning fallback beacon randomness: dst=%d, epoch=%d, entropy=%x", pers, round, entropy) - return r.fallback.GetBeaconRandomness(ctx, nv, pers, round, entropy) + return r.fallback.GetBeaconRandomness(ctx, pers, round, entropy) } From 670bd993f3c94286b33d7d4e0073f8e1404d818d Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Fri, 17 Dec 2021 19:05:59 -0500 Subject: [PATCH 139/393] Refactor: VM: Remove the NetworkVersionGetter --- chain/consensus/filcns/compute_state.go | 2 +- chain/gen/genesis/genesis.go | 6 ++---- chain/gen/genesis/miners.go | 6 ++---- chain/stmgr/call.go | 4 ++-- chain/stmgr/utils.go | 2 +- chain/vm/invoker_test.go | 9 ++------- chain/vm/runtime.go | 2 +- chain/vm/vm.go | 20 ++++++++----------- .../simulation/blockbuilder/blockbuilder.go | 2 +- conformance/driver.go | 6 +++--- 10 files changed, 23 insertions(+), 36 deletions(-) diff --git a/chain/consensus/filcns/compute_state.go b/chain/consensus/filcns/compute_state.go index ba4cc0335dd..3c70f61db15 100644 --- a/chain/consensus/filcns/compute_state.go +++ b/chain/consensus/filcns/compute_state.go @@ -101,7 +101,7 @@ func (t *TipSetExecutor) ApplyBlocks(ctx context.Context, sm *stmgr.StateManager Actors: NewActorRegistry(), Syscalls: sm.Syscalls, CircSupplyCalc: sm.GetVMCirculatingSupply, - NtwkVersion: sm.GetNetworkVersion, + NetworkVersion: sm.GetNetworkVersion(ctx, epoch), BaseFee: baseFee, LookbackState: stmgr.LookbackStateGetterForTipset(sm, ts), } diff --git a/chain/gen/genesis/genesis.go b/chain/gen/genesis/genesis.go index 64fd76d2b3f..6ab101e7893 100644 --- a/chain/gen/genesis/genesis.go +++ b/chain/gen/genesis/genesis.go @@ -491,10 +491,8 @@ func VerifyPreSealedData(ctx context.Context, cs *store.ChainStore, sys vm.Sysca Actors: filcns.NewActorRegistry(), Syscalls: mkFakedSigSyscalls(sys), CircSupplyCalc: csc, - NtwkVersion: func(_ context.Context, _ abi.ChainEpoch) network.Version { - return nv - }, - BaseFee: types.NewInt(0), + NetworkVersion: nv, + BaseFee: types.NewInt(0), } vm, err := vm.NewVM(ctx, &vmopt) if err != nil { diff --git a/chain/gen/genesis/miners.go b/chain/gen/genesis/miners.go index 101f1d3b509..2749181470c 100644 --- a/chain/gen/genesis/miners.go +++ b/chain/gen/genesis/miners.go @@ -94,10 +94,8 @@ func SetupStorageMiners(ctx context.Context, cs *store.ChainStore, sys vm.Syscal Actors: filcns.NewActorRegistry(), Syscalls: mkFakedSigSyscalls(sys), CircSupplyCalc: csc, - NtwkVersion: func(_ context.Context, _ abi.ChainEpoch) network.Version { - return nv - }, - BaseFee: types.NewInt(0), + NetworkVersion: nv, + BaseFee: types.NewInt(0), } vm, err := vm.NewVM(ctx, vmopt) diff --git a/chain/stmgr/call.go b/chain/stmgr/call.go index 7f76628e826..31639701dad 100644 --- a/chain/stmgr/call.go +++ b/chain/stmgr/call.go @@ -80,7 +80,7 @@ func (sm *StateManager) Call(ctx context.Context, msg *types.Message, ts *types. Actors: sm.tsExec.NewActorRegistry(), Syscalls: sm.Syscalls, CircSupplyCalc: sm.GetVMCirculatingSupply, - NtwkVersion: sm.GetNetworkVersion, + NetworkVersion: sm.GetNetworkVersion(ctx, pheight+1), BaseFee: types.NewInt(0), LookbackState: LookbackStateGetterForTipset(sm, ts), } @@ -204,7 +204,7 @@ func (sm *StateManager) CallWithGas(ctx context.Context, msg *types.Message, pri Actors: sm.tsExec.NewActorRegistry(), Syscalls: sm.Syscalls, CircSupplyCalc: sm.GetVMCirculatingSupply, - NtwkVersion: sm.GetNetworkVersion, + NetworkVersion: sm.GetNetworkVersion(ctx, ts.Height()+1), BaseFee: ts.Blocks()[0].ParentBaseFee, LookbackState: LookbackStateGetterForTipset(sm, ts), } diff --git a/chain/stmgr/utils.go b/chain/stmgr/utils.go index 698ffc13f66..2a84c777b3a 100644 --- a/chain/stmgr/utils.go +++ b/chain/stmgr/utils.go @@ -88,7 +88,7 @@ func ComputeState(ctx context.Context, sm *StateManager, height abi.ChainEpoch, Actors: sm.tsExec.NewActorRegistry(), Syscalls: sm.Syscalls, CircSupplyCalc: sm.GetVMCirculatingSupply, - NtwkVersion: sm.GetNetworkVersion, + NetworkVersion: sm.GetNetworkVersion(ctx, height), BaseFee: ts.Blocks()[0].ParentBaseFee, LookbackState: LookbackStateGetterForTipset(sm, ts), } diff --git a/chain/vm/invoker_test.go b/chain/vm/invoker_test.go index 8499f001a59..fb9910ecdd0 100644 --- a/chain/vm/invoker_test.go +++ b/chain/vm/invoker_test.go @@ -1,7 +1,6 @@ package vm import ( - "context" "fmt" "io" "testing" @@ -136,9 +135,7 @@ func TestInvokerBasic(t *testing.T) { { _, aerr := code[1](&Runtime{ - vm: &VM{ntwkVersion: func(ctx context.Context, epoch abi.ChainEpoch) network.Version { - return network.Version0 - }}, + vm: &VM{networkVersion: network.Version0}, Message: &basicRtMessage{}, }, []byte{99}) if aerrors.IsFatal(aerr) { @@ -149,9 +146,7 @@ func TestInvokerBasic(t *testing.T) { { _, aerr := code[1](&Runtime{ - vm: &VM{ntwkVersion: func(ctx context.Context, epoch abi.ChainEpoch) network.Version { - return network.Version7 - }}, + vm: &VM{networkVersion: network.Version7}, Message: &basicRtMessage{}, }, []byte{99}) if aerrors.IsFatal(aerr) { diff --git a/chain/vm/runtime.go b/chain/vm/runtime.go index 844f5d2539e..0e2adc87983 100644 --- a/chain/vm/runtime.go +++ b/chain/vm/runtime.go @@ -92,7 +92,7 @@ func (rt *Runtime) BaseFee() abi.TokenAmount { } func (rt *Runtime) NetworkVersion() network.Version { - return rt.vm.GetNtwkVersion(rt.ctx, rt.CurrEpoch()) + return rt.vm.networkVersion } func (rt *Runtime) TotalFilCircSupply() abi.TokenAmount { diff --git a/chain/vm/vm.go b/chain/vm/vm.go index c0b730774de..7e9e972ae40 100644 --- a/chain/vm/vm.go +++ b/chain/vm/vm.go @@ -169,7 +169,7 @@ func (vm *VM) makeRuntime(ctx context.Context, msg *types.Message, parent *Runti } vmm.From = resF - if vm.ntwkVersion(ctx, vm.blockHeight) <= network.Version3 { + if vm.networkVersion <= network.Version3 { rt.Message = &vmm } else { resT, _ := rt.ResolveAddress(msg.To) @@ -209,7 +209,7 @@ type VM struct { areg *ActorRegistry rand Rand circSupplyCalc CircSupplyCalculator - ntwkVersion NtwkVersionGetter + networkVersion network.Version baseFee abi.TokenAmount lbStateGet LookbackStateGetter baseCircSupply abi.TokenAmount @@ -225,7 +225,7 @@ type VMOpts struct { Actors *ActorRegistry Syscalls SyscallBuilder CircSupplyCalc CircSupplyCalculator - NtwkVersion NtwkVersionGetter // TODO: stebalien: In what cases do we actually need this? It seems like even when creating new networks we want to use the 'global'/build-default version getter + NetworkVersion network.Version BaseFee abi.TokenAmount LookbackState LookbackStateGetter } @@ -251,7 +251,7 @@ func NewVM(ctx context.Context, opts *VMOpts) (*VM, error) { areg: opts.Actors, rand: opts.Rand, // TODO: Probably should be a syscall circSupplyCalc: opts.CircSupplyCalc, - ntwkVersion: opts.NtwkVersion, + networkVersion: opts.NetworkVersion, Syscalls: opts.Syscalls, baseFee: opts.BaseFee, baseCircSupply: baseCirc, @@ -313,7 +313,7 @@ func (vm *VM) send(ctx context.Context, msg *types.Message, parent *Runtime, return nil, aerrors.Wrapf(err, "could not create account") } toActor = a - if vm.ntwkVersion(ctx, vm.blockHeight) <= network.Version3 { + if vm.networkVersion <= network.Version3 { // Leave the rt.Message as is } else { nmsg := Message{ @@ -340,7 +340,7 @@ func (vm *VM) send(ctx context.Context, msg *types.Message, parent *Runtime, defer rt.chargeGasSafe(newGasCharge("OnMethodInvocationDone", 0, 0)) if types.BigCmp(msg.Value, types.NewInt(0)) != 0 { - if err := vm.transfer(msg.From, msg.To, msg.Value, vm.ntwkVersion(ctx, vm.blockHeight)); err != nil { + if err := vm.transfer(msg.From, msg.To, msg.Value, vm.networkVersion); err != nil { return nil, aerrors.Wrap(err, "failed to transfer funds") } } @@ -617,7 +617,7 @@ func (vm *VM) ApplyMessage(ctx context.Context, cmsg types.ChainMsg) (*ApplyRet, } func (vm *VM) ShouldBurn(ctx context.Context, st *state.StateTree, msg *types.Message, errcode exitcode.ExitCode) (bool, error) { - if vm.ntwkVersion(ctx, vm.blockHeight) <= network.Version12 { + if vm.networkVersion <= network.Version12 { // Check to see if we should burn funds. We avoid burning on successful // window post. This won't catch _indirect_ window post calls, but this // is the best we can get for now. @@ -855,13 +855,9 @@ func (vm *VM) SetInvoker(i *ActorRegistry) { vm.areg = i } -func (vm *VM) GetNtwkVersion(ctx context.Context, ce abi.ChainEpoch) network.Version { - return vm.ntwkVersion(ctx, ce) -} - func (vm *VM) GetCircSupply(ctx context.Context) (abi.TokenAmount, error) { // Before v15, this was recalculated on each invocation as the state tree was mutated - if vm.GetNtwkVersion(ctx, vm.blockHeight) <= network.Version14 { + if vm.networkVersion <= network.Version14 { return vm.circSupplyCalc(ctx, vm.blockHeight, vm.cstate) } diff --git a/cmd/lotus-sim/simulation/blockbuilder/blockbuilder.go b/cmd/lotus-sim/simulation/blockbuilder/blockbuilder.go index 360368b8222..fb822eb6e77 100644 --- a/cmd/lotus-sim/simulation/blockbuilder/blockbuilder.go +++ b/cmd/lotus-sim/simulation/blockbuilder/blockbuilder.go @@ -88,7 +88,7 @@ func NewBlockBuilder(ctx context.Context, logger *zap.SugaredLogger, sm *stmgr.S Actors: filcns.NewActorRegistry(), Syscalls: sm.VMSys(), CircSupplyCalc: sm.GetVMCirculatingSupply, - NtwkVersion: sm.GetNetworkVersion, + NetworkVersion: sm.GetNetworkVersion(ctx, parentTs.Height()+1), BaseFee: abi.NewTokenAmount(0), LookbackState: stmgr.LookbackStateGetterForTipset(sm, parentTs), } diff --git a/conformance/driver.go b/conformance/driver.go index 9bca9c1fbfc..6df7b911549 100644 --- a/conformance/driver.go +++ b/conformance/driver.go @@ -225,9 +225,9 @@ func (d *Driver) ExecuteMessage(bs blockstore.Blockstore, params ExecuteMessageP CircSupplyCalc: func(_ context.Context, _ abi.ChainEpoch, _ *state.StateTree) (abi.TokenAmount, error) { return params.CircSupply, nil }, - Rand: params.Rand, - BaseFee: params.BaseFee, - NtwkVersion: sm.GetNetworkVersion, + Rand: params.Rand, + BaseFee: params.BaseFee, + NetworkVersion: sm.GetNetworkVersion(context.Background(), params.Epoch), } lvm, err := vm.NewVM(context.TODO(), vmOpts) From d10d0a20b1837ce542950dc1718d56968fa4515c Mon Sep 17 00:00:00 2001 From: shotcollin Date: Sun, 19 Dec 2021 17:07:11 -0700 Subject: [PATCH 140/393] fix typo in log warning very minor but this warning comes up a lot so it'd be nicer if it wasn't a grammatical error too --- extern/sector-storage/partialfile/partialfile.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extern/sector-storage/partialfile/partialfile.go b/extern/sector-storage/partialfile/partialfile.go index 529e889eaf2..ffc3935ac3d 100644 --- a/extern/sector-storage/partialfile/partialfile.go +++ b/extern/sector-storage/partialfile/partialfile.go @@ -71,7 +71,7 @@ func CreatePartialFile(maxPieceSize abi.PaddedPieceSize, path string) (*PartialF err := fallocate.Fallocate(f, 0, int64(maxPieceSize)) if errno, ok := err.(syscall.Errno); ok { if errno == syscall.EOPNOTSUPP || errno == syscall.ENOSYS { - log.Warnf("could not allocated space, ignoring: %v", errno) + log.Warnf("could not allocate space, ignoring: %v", errno) err = nil // log and ignore } } From 0e53275d40101b3e0edfa19b098a251d213f251e Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Mon, 20 Dec 2021 16:03:03 +0100 Subject: [PATCH 141/393] feat: retrieval-ask - if size param is zero use QueryOffer.Size --- cli/client.go | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/cli/client.go b/cli/client.go index 4025b9b563b..634bd18e5b4 100644 --- a/cli/client.go +++ b/cli/client.go @@ -1076,11 +1076,15 @@ var clientQueryRetrievalAskCmd = &cli.Command{ afmt.Printf("Payment interval: %s\n", types.SizeStr(types.NewInt(ask.PaymentInterval))) afmt.Printf("Payment interval increase: %s\n", types.SizeStr(types.NewInt(ask.PaymentIntervalIncrease))) - size := cctx.Int64("size") + size := cctx.Uint64("size") if size == 0 { - return nil + if ask.Size == 0 { + return nil + } + size = ask.Size + afmt.Printf("Size: %s\n", types.SizeStr(types.NewInt(ask.Size))) } - transferPrice := types.BigMul(ask.PricePerByte, types.NewInt(uint64(size))) + transferPrice := types.BigMul(ask.PricePerByte, types.NewInt(size)) totalPrice := types.BigAdd(ask.UnsealPrice, transferPrice) afmt.Printf("Total price for %d bytes: %s\n", size, types.FIL(totalPrice)) From 86cf17c1f4252117e0711ecc42b33f792fb902ff Mon Sep 17 00:00:00 2001 From: Darko Brdareski Date: Mon, 20 Dec 2021 16:51:09 +0100 Subject: [PATCH 142/393] Remove bad annotation from gas_test.go --- node/impl/full/gas_test.go | 1 - 1 file changed, 1 deletion(-) diff --git a/node/impl/full/gas_test.go b/node/impl/full/gas_test.go index c5c2a5522fc..ac2835790b0 100644 --- a/node/impl/full/gas_test.go +++ b/node/impl/full/gas_test.go @@ -13,7 +13,6 @@ import ( ) func TestMedian(t *testing.T) { - GAS_001 require.Equal(t, types.NewInt(5), medianGasPremium([]GasMeta{ {big.NewInt(5), build.BlockGasTarget}, }, 1)) From a54ac2ef79847965fe869ac6f3547f17df573246 Mon Sep 17 00:00:00 2001 From: Darko Brdareski Date: Mon, 20 Dec 2021 17:00:01 +0100 Subject: [PATCH 143/393] Remove FS, MEM, GAS leftover test anotations. --- node/repo/fsrepo_test.go | 3 --- node/repo/memrepo_test.go | 1 - node/repo/repo_test.go | 12 ------------ 3 files changed, 16 deletions(-) diff --git a/node/repo/fsrepo_test.go b/node/repo/fsrepo_test.go index 430e012972e..381ebdcbe80 100644 --- a/node/repo/fsrepo_test.go +++ b/node/repo/fsrepo_test.go @@ -13,13 +13,11 @@ func genFsRepo(t *testing.T) (*FsRepo, func()) { t.Fatal(err) } - FS_001 repo, err := NewFS(path) if err != nil { t.Fatal(err) } - FS_002 err = repo.Init(FullNode) if err != ErrRepoExists && err != nil { t.Fatal(err) @@ -32,6 +30,5 @@ func genFsRepo(t *testing.T) (*FsRepo, func()) { func TestFsBasic(t *testing.T) { repo, closer := genFsRepo(t) defer closer() - FS_003 basicTest(t, repo) } diff --git a/node/repo/memrepo_test.go b/node/repo/memrepo_test.go index 8c2ad1cbf61..fdf609bacec 100644 --- a/node/repo/memrepo_test.go +++ b/node/repo/memrepo_test.go @@ -7,6 +7,5 @@ import ( func TestMemBasic(t *testing.T) { repo := NewMemory(nil) - MEM_001 basicTest(t, repo) } diff --git a/node/repo/repo_test.go b/node/repo/repo_test.go index 578cd8c3801..cd19f86f6ea 100644 --- a/node/repo/repo_test.go +++ b/node/repo/repo_test.go @@ -15,20 +15,17 @@ import ( ) func basicTest(t *testing.T, repo Repo) { - NET_001 apima, err := repo.APIEndpoint() if assert.Error(t, err) { assert.Equal(t, ErrNoAPIEndpoint, err) } assert.Nil(t, apima, "with no api endpoint, return should be nil") - MUT_001 lrepo, err := repo.Lock(FullNode) assert.NoError(t, err, "should be able to lock once") assert.NotNil(t, lrepo, "locked repo shouldn't be nil") { - MUT_002 lrepo2, err := repo.Lock(FullNode) if assert.Error(t, err) { assert.Equal(t, ErrRepoAlreadyLocked, err) @@ -36,7 +33,6 @@ func basicTest(t *testing.T, repo Repo) { assert.Nil(t, lrepo2, "with locked repo errors, nil should be returned") } - MUT_003 err = lrepo.Close() assert.NoError(t, err, "should be able to unlock") @@ -47,7 +43,6 @@ func basicTest(t *testing.T, repo Repo) { ma, err := multiaddr.NewMultiaddr("/ip4/127.0.0.1/tcp/43244") assert.NoError(t, err, "creating multiaddr shouldn't error") - NET_002 err = lrepo.SetAPIEndpoint(ma) assert.NoError(t, err, "setting multiaddr shouldn't error") @@ -75,7 +70,6 @@ func basicTest(t *testing.T, repo Repo) { err = lrepo.Close() assert.NoError(t, err, "should be able to close") - NET_003 apima, err = repo.APIEndpoint() if assert.Error(t, err) { @@ -90,27 +84,22 @@ func basicTest(t *testing.T, repo Repo) { assert.NoError(t, err, "should be able to relock") assert.NotNil(t, lrepo, "locked repo shouldn't be nil") - KEYSTR_001 kstr, err := lrepo.KeyStore() assert.NoError(t, err, "should be able to get keystore") assert.NotNil(t, lrepo, "keystore shouldn't be nil") - KEYSTR_002 list, err := kstr.List() assert.NoError(t, err, "should be able to list key") assert.Empty(t, list, "there should be no keys") - KEYSTR_003 err = kstr.Put("k1", k1) assert.NoError(t, err, "should be able to put k1") - KEYSTR_004 err = kstr.Put("k1", k1) if assert.Error(t, err, "putting key under the same name should error") { assert.True(t, xerrors.Is(err, types.ErrKeyExists), "returned error is ErrKeyExists") } - KEYSTR_005 k1prim, err := kstr.Get("k1") assert.NoError(t, err, "should be able to get k1") assert.Equal(t, k1, k1prim, "returned key should be the same") @@ -128,7 +117,6 @@ func basicTest(t *testing.T, repo Repo) { assert.NoError(t, err, "should be able to list keys") assert.ElementsMatch(t, []string{"k1", "k2"}, list, "returned elements match") - KEYSTR_006 err = kstr.Delete("k2") assert.NoError(t, err, "should be able to delete key") From 6311e53a76c1af233bbf0a8e62281eec862af62d Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Tue, 21 Dec 2021 11:23:38 +0100 Subject: [PATCH 144/393] feat: update to go-fil-markets v1.14.0 --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index a4d85d6cf1f..e16d468b0d6 100644 --- a/go.mod +++ b/go.mod @@ -36,7 +36,7 @@ require ( github.com/filecoin-project/go-data-transfer v1.12.0 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.13.6-0.20211217102747-e95a23480585 + github.com/filecoin-project/go-fil-markets v1.14.0 github.com/filecoin-project/go-jsonrpc v0.1.5 github.com/filecoin-project/go-padreader v0.0.1 github.com/filecoin-project/go-paramfetch v0.0.2 diff --git a/go.sum b/go.sum index f6f557211c2..afaced0d775 100644 --- a/go.sum +++ b/go.sum @@ -322,8 +322,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.13.6-0.20211217102747-e95a23480585 h1:kDzqA/WyUOVVt2en/r81nvS21s0sMThv4qlKoveooDU= -github.com/filecoin-project/go-fil-markets v1.13.6-0.20211217102747-e95a23480585/go.mod h1:vXOHH3q2+zLk929W+lIq3etuDFTyJJ8nG2DwGHG2R1E= +github.com/filecoin-project/go-fil-markets v1.14.0 h1:AWedMHUsIp/oE535zzHGgPZhxboGVLwUibnekcHj+eo= +github.com/filecoin-project/go-fil-markets v1.14.0/go.mod h1:vXOHH3q2+zLk929W+lIq3etuDFTyJJ8nG2DwGHG2R1E= 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= From 6db8a862bb909f895810f0233b12504263ada6c2 Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Tue, 21 Dec 2021 16:36:47 +0100 Subject: [PATCH 145/393] feat: update to go-fil-markets v1.14.1 --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index e16d468b0d6..c6ee3e5628b 100644 --- a/go.mod +++ b/go.mod @@ -36,7 +36,7 @@ require ( github.com/filecoin-project/go-data-transfer v1.12.0 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.14.0 + github.com/filecoin-project/go-fil-markets v1.14.1 github.com/filecoin-project/go-jsonrpc v0.1.5 github.com/filecoin-project/go-padreader v0.0.1 github.com/filecoin-project/go-paramfetch v0.0.2 diff --git a/go.sum b/go.sum index afaced0d775..54b1c414dd7 100644 --- a/go.sum +++ b/go.sum @@ -322,8 +322,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.14.0 h1:AWedMHUsIp/oE535zzHGgPZhxboGVLwUibnekcHj+eo= -github.com/filecoin-project/go-fil-markets v1.14.0/go.mod h1:vXOHH3q2+zLk929W+lIq3etuDFTyJJ8nG2DwGHG2R1E= +github.com/filecoin-project/go-fil-markets v1.14.1 h1:Bx+TSbkAN8K97Hpjgu+MpeRFbXIKH/fNpNp1ZGAEH3I= +github.com/filecoin-project/go-fil-markets v1.14.1/go.mod h1:vXOHH3q2+zLk929W+lIq3etuDFTyJJ8nG2DwGHG2R1E= 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= From cddf63efe98de7ff6442c0c81c445585d23925eb Mon Sep 17 00:00:00 2001 From: hannahhoward Date: Fri, 10 Dec 2021 12:28:54 -0800 Subject: [PATCH 146/393] feat(storageminer): add api for transfer diagnostics Add API + CLI for inspecting in depth diagnostics on graphsync transfers with a given peer --- api/api_storage.go | 2 + api/docgen/docgen.go | 2 + api/proxy_gen.go | 13 +++ api/types.go | 25 ++++++ build/openrpc/full.json.gz | Bin 25722 -> 25722 bytes build/openrpc/miner.json.gz | Bin 11532 -> 11753 bytes build/openrpc/worker.json.gz | Bin 3692 -> 3691 bytes cmd/lotus-miner/market.go | 30 +++++++ documentation/en/api-v0-methods-miner.md | 22 +++++ documentation/en/cli-lotus-miner.md | 22 ++++- go.mod | 6 +- go.sum | 20 +++-- node/builder_miner.go | 4 +- node/impl/storminer.go | 107 +++++++++++++++++++++++ node/modules/dtypes/storage.go | 4 +- node/modules/storageminer.go | 16 ++-- 16 files changed, 254 insertions(+), 19 deletions(-) diff --git a/api/api_storage.go b/api/api_storage.go index c0d9c9f9c92..3f0ef50b73b 100644 --- a/api/api_storage.go +++ b/api/api_storage.go @@ -165,6 +165,8 @@ type StorageMiner interface { MarketGetRetrievalAsk(ctx context.Context) (*retrievalmarket.Ask, error) //perm:read MarketListDataTransfers(ctx context.Context) ([]DataTransferChannel, error) //perm:write MarketDataTransferUpdates(ctx context.Context) (<-chan DataTransferChannel, error) //perm:write + // MarketDataTransferDiagnostics generates debugging information about current data transfers over graphsync + MarketDataTransferDiagnostics(ctx context.Context, p peer.ID) (*TransferDiagnostics, error) //perm:write // MarketRestartDataTransfer attempts to restart a data transfer with the given transfer ID and other peer MarketRestartDataTransfer(ctx context.Context, transferID datatransfer.TransferID, otherPeer peer.ID, isInitiator bool) error //perm:write // MarketCancelDataTransfer cancels a data transfer with the given transfer ID and other peer diff --git a/api/docgen/docgen.go b/api/docgen/docgen.go index 5d87e9d20c2..03ce9109dfc 100644 --- a/api/docgen/docgen.go +++ b/api/docgen/docgen.go @@ -15,6 +15,7 @@ import ( "github.com/filecoin-project/go-bitfield" "github.com/google/uuid" "github.com/ipfs/go-cid" + "github.com/ipfs/go-graphsync" "github.com/libp2p/go-libp2p-core/metrics" "github.com/libp2p/go-libp2p-core/network" "github.com/libp2p/go-libp2p-core/peer" @@ -120,6 +121,7 @@ func init() { addExample(api.FullAPIVersion1) addExample(api.PCHInbound) addExample(time.Minute) + addExample(graphsync.RequestID(4)) addExample(datatransfer.TransferID(3)) addExample(datatransfer.Ongoing) addExample(storeIDExample) diff --git a/api/proxy_gen.go b/api/proxy_gen.go index 10a21b8fa5e..09c71a167e1 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -668,6 +668,8 @@ type StorageMinerStruct struct { MarketCancelDataTransfer func(p0 context.Context, p1 datatransfer.TransferID, p2 peer.ID, p3 bool) error `perm:"write"` + MarketDataTransferDiagnostics func(p0 context.Context, p1 peer.ID) (*TransferDiagnostics, error) `perm:"write"` + MarketDataTransferUpdates func(p0 context.Context) (<-chan DataTransferChannel, error) `perm:"write"` MarketGetAsk func(p0 context.Context) (*storagemarket.SignedStorageAsk, error) `perm:"read"` @@ -3972,6 +3974,17 @@ func (s *StorageMinerStub) MarketCancelDataTransfer(p0 context.Context, p1 datat return ErrNotSupported } +func (s *StorageMinerStruct) MarketDataTransferDiagnostics(p0 context.Context, p1 peer.ID) (*TransferDiagnostics, error) { + if s.Internal.MarketDataTransferDiagnostics == nil { + return nil, ErrNotSupported + } + return s.Internal.MarketDataTransferDiagnostics(p0, p1) +} + +func (s *StorageMinerStub) MarketDataTransferDiagnostics(p0 context.Context, p1 peer.ID) (*TransferDiagnostics, error) { + return nil, ErrNotSupported +} + func (s *StorageMinerStruct) MarketDataTransferUpdates(p0 context.Context) (<-chan DataTransferChannel, error) { if s.Internal.MarketDataTransferUpdates == nil { return nil, ErrNotSupported diff --git a/api/types.go b/api/types.go index 0ecda040597..81345306d61 100644 --- a/api/types.go +++ b/api/types.go @@ -10,6 +10,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/lotus/chain/types" "github.com/ipfs/go-cid" + "github.com/ipfs/go-graphsync" "github.com/libp2p/go-libp2p-core/peer" pubsub "github.com/libp2p/go-libp2p-pubsub" @@ -53,6 +54,30 @@ type MessageSendSpec struct { MaxFee abi.TokenAmount } +// GraphSyncDataTransfer provides diagnostics on a data transfer happening over graphsync +type GraphSyncDataTransfer struct { + // GraphSync request id for this transfer + RequestID graphsync.RequestID + // Graphsync state for this transfer + RequestState string + // If a channel ID is present, indicates whether this is the current graphsync request for this channel + // (could have changed in a restart) + IsCurrentChannelRequest bool + // Data transfer channel ID for this transfer + ChannelID *datatransfer.ChannelID + // Data transfer state for this transfer + ChannelState *DataTransferChannel + // Diagnostic information about this request -- and unexpected inconsistencies in + // request state + Diagnostics []string +} + +// TransferDiagnostics give current information about transfers going over graphsync that may be helpful for debugging +type TransferDiagnostics struct { + ReceivingTransfers []*GraphSyncDataTransfer + SendingTransfers []*GraphSyncDataTransfer +} + type DataTransferChannel struct { TransferID datatransfer.TransferID Status datatransfer.Status diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 33a869e4a274fa86cf427e358072b8addad32fda..c5b98140478ca8678d72b59367c8df5d52328aaf 100644 GIT binary patch delta 22811 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 Z0Tjj8`SI3+w;@ delta 22784 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 X_jiR#_T&Er00960>pyO!!V3ie!@BC; diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index 792ad55b90da6475e557702e55641e25670ee06a..b3228b6a69e7199640a2ce7be753fec98c80ac5d 100644 GIT binary patch literal 11753 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 LJa@|?%{Kx7_PQX9 literal 11532 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 Date: Fri, 10 Dec 2021 12:49:53 -0800 Subject: [PATCH 147/393] fix(storageminer): lint/mod-tidy/extra checks --- node/impl/storminer.go | 40 ++++++++++++++++++++++++++-------------- 1 file changed, 26 insertions(+), 14 deletions(-) diff --git a/node/impl/storminer.go b/node/impl/storminer.go index 3a6752431a0..42818067a58 100644 --- a/node/impl/storminer.go +++ b/node/impl/storminer.go @@ -3,6 +3,7 @@ package impl import ( "context" "encoding/json" + "errors" "fmt" "net/http" "os" @@ -560,11 +561,18 @@ func (sm *StorageMinerAPI) MarketDataTransferUpdates(ctx context.Context) (<-cha } func (sm *StorageMinerAPI) MarketDataTransferDiagnostics(ctx context.Context, mpid peer.ID) (*api.TransferDiagnostics, error) { - + gsTransport, ok := sm.Transport.(*gst.Transport) + if !ok { + return nil, errors.New("api only works for graphsync as transport") + } + graphsyncConcrete, ok := sm.StagingGraphsync.(*gsimpl.GraphSync) + if !ok { + return nil, errors.New("api only works for non-mock graphsync implementation") + } // gather information about active transport channels - transportChannels := sm.Transport.(*gst.Transport).ChannelsForPeer(mpid) + transportChannels := gsTransport.ChannelsForPeer(mpid) // gather information about graphsync state for peer - gsPeerState := sm.StagingGraphsync.(*gsimpl.GraphSync).PeerState(mpid) + gsPeerState := graphsyncConcrete.PeerState(mpid) sendingTransfers := sm.generateTransfers(ctx, transportChannels.SendingChannels, gsPeerState.IncomingState) receivingTransfers := sm.generateTransfers(ctx, transportChannels.ReceivingChannels, gsPeerState.OutgoingState) @@ -598,10 +606,10 @@ func (sm *StorageMinerAPI) generateTransfers(ctx context.Context, channelState = &cs } // add the current request for this channel - tc.convertTransfer(&channelID, channelState, baseDiagnostics, channelRequests.Current, true) + tc.convertTransfer(channelID, true, channelState, baseDiagnostics, channelRequests.Current, true) for _, requestID := range channelRequests.Previous { // add any previous requests that were cancelled for a restart - tc.convertTransfer(&channelID, channelState, baseDiagnostics, requestID, false) + tc.convertTransfer(channelID, true, channelState, baseDiagnostics, requestID, false) } } @@ -619,7 +627,7 @@ type transferConverter struct { } // convert transfer assembles transfer and diagnostic data for a given graphsync/data-transfer request -func (tc *transferConverter) convertTransfer(channelID *datatransfer.ChannelID, channelState *api.DataTransferChannel, baseDiagnostics []string, +func (tc *transferConverter) convertTransfer(channelID datatransfer.ChannelID, hasChannelID bool, channelState *api.DataTransferChannel, baseDiagnostics []string, requestID graphsync.RequestID, isCurrentChannelRequest bool) { diagnostics := baseDiagnostics state, hasState := tc.requestStates[requestID] @@ -627,19 +635,23 @@ func (tc *transferConverter) convertTransfer(channelID *datatransfer.ChannelID, if !hasState { stateString = "no graphsync state found" } - if channelID == nil { + var channelIDPtr *datatransfer.ChannelID + if hasChannelID { diagnostics = append(diagnostics, fmt.Sprintf("No data transfer channel id for GraphSync request ID %d", requestID)) - } else if isCurrentChannelRequest && !hasState { - diagnostics = append(diagnostics, fmt.Sprintf("No current request state for data transfer channel id %s", channelID)) - } else if !isCurrentChannelRequest && hasState { - diagnostics = append(diagnostics, fmt.Sprintf("Graphsync request %d is a previous request on data transfer channel id %s that was restarted, but it is still running", requestID, channelID)) + } else { + channelIDPtr = &channelID + if isCurrentChannelRequest && !hasState { + diagnostics = append(diagnostics, fmt.Sprintf("No current request state for data transfer channel id %s", channelID)) + } else if !isCurrentChannelRequest && hasState { + diagnostics = append(diagnostics, fmt.Sprintf("Graphsync request %d is a previous request on data transfer channel id %s that was restarted, but it is still running", requestID, channelID)) + } } diagnostics = append(diagnostics, tc.gsDiagnostics[requestID]...) transfer := &api.GraphSyncDataTransfer{ RequestID: requestID, RequestState: stateString, IsCurrentChannelRequest: isCurrentChannelRequest, - ChannelID: channelID, + ChannelID: channelIDPtr, ChannelState: channelState, Diagnostics: diagnostics, } @@ -650,12 +662,12 @@ func (tc *transferConverter) convertTransfer(channelID *datatransfer.ChannelID, func (tc *transferConverter) collectRemainingTransfers() { for requestID := range tc.requestStates { if _, ok := tc.matchedRequests[requestID]; !ok { - tc.convertTransfer(nil, nil, nil, requestID, false) + tc.convertTransfer(datatransfer.ChannelID{}, false, nil, nil, requestID, false) } } for requestID := range tc.gsDiagnostics { if _, ok := tc.matchedRequests[requestID]; !ok { - tc.convertTransfer(nil, nil, nil, requestID, false) + tc.convertTransfer(datatransfer.ChannelID{}, false, nil, nil, requestID, false) } } } From ced22687eb747078fa67438c525ae9cff9d065f8 Mon Sep 17 00:00:00 2001 From: hannahhoward Date: Fri, 10 Dec 2021 16:49:39 -0800 Subject: [PATCH 148/393] fix(cmd): fix cli peer decoding --- cmd/lotus-miner/market.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/cmd/lotus-miner/market.go b/cmd/lotus-miner/market.go index 531e46ce911..c7089e74ecc 100644 --- a/cmd/lotus-miner/market.go +++ b/cmd/lotus-miner/market.go @@ -873,7 +873,10 @@ var transfersDiagnosticsCmd = &cli.Command{ defer closer() ctx := lcli.ReqContext(cctx) - targetPeer := peer.ID(cctx.Args().First()) + targetPeer, err := peer.Decode(cctx.Args().First()) + if err != nil { + return err + } diagnostics, err := api.MarketDataTransferDiagnostics(ctx, targetPeer) if err != nil { return err From 8a923fb420ad2ae0d81a2c797924347886cc19df Mon Sep 17 00:00:00 2001 From: hannahhoward Date: Fri, 10 Dec 2021 17:50:12 -0800 Subject: [PATCH 149/393] fix(storageminer): fix conditional --- node/impl/storminer.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/node/impl/storminer.go b/node/impl/storminer.go index 42818067a58..8a3f94e35c7 100644 --- a/node/impl/storminer.go +++ b/node/impl/storminer.go @@ -636,7 +636,7 @@ func (tc *transferConverter) convertTransfer(channelID datatransfer.ChannelID, h stateString = "no graphsync state found" } var channelIDPtr *datatransfer.ChannelID - if hasChannelID { + if !hasChannelID { diagnostics = append(diagnostics, fmt.Sprintf("No data transfer channel id for GraphSync request ID %d", requestID)) } else { channelIDPtr = &channelID From 1078dff3a92e926fac02994b27dc49a75b428bcb Mon Sep 17 00:00:00 2001 From: hannahhoward Date: Mon, 13 Dec 2021 11:24:19 -0800 Subject: [PATCH 150/393] feat(storageminer): also list data transfers with no id --- node/impl/storminer.go | 68 +++++++++++++++++++++++++++++++++++------- 1 file changed, 58 insertions(+), 10 deletions(-) diff --git a/node/impl/storminer.go b/node/impl/storminer.go index 8a3f94e35c7..764e4fb3666 100644 --- a/node/impl/storminer.go +++ b/node/impl/storminer.go @@ -569,13 +569,38 @@ func (sm *StorageMinerAPI) MarketDataTransferDiagnostics(ctx context.Context, mp if !ok { return nil, errors.New("api only works for non-mock graphsync implementation") } + + inProgressChannels, err := sm.DataTransfer.InProgressChannels(ctx) + if err != nil { + return nil, err + } + + allReceivingChannels := make(map[datatransfer.ChannelID]datatransfer.ChannelState) + allSendingChannels := make(map[datatransfer.ChannelID]datatransfer.ChannelState) + for channelID, channel := range inProgressChannels { + if channel.OtherPeer() != mpid { + continue + } + if channel.Status() == datatransfer.Completed { + continue + } + if channel.Status() == datatransfer.Failed || channel.Status() == datatransfer.Cancelled { + continue + } + if channel.SelfPeer() == channel.Sender() { + allSendingChannels[channelID] = channel + } else { + allReceivingChannels[channelID] = channel + } + } + // gather information about active transport channels transportChannels := gsTransport.ChannelsForPeer(mpid) // gather information about graphsync state for peer gsPeerState := graphsyncConcrete.PeerState(mpid) - sendingTransfers := sm.generateTransfers(ctx, transportChannels.SendingChannels, gsPeerState.IncomingState) - receivingTransfers := sm.generateTransfers(ctx, transportChannels.ReceivingChannels, gsPeerState.OutgoingState) + sendingTransfers := sm.generateTransfers(ctx, transportChannels.SendingChannels, gsPeerState.IncomingState, allSendingChannels) + receivingTransfers := sm.generateTransfers(ctx, transportChannels.ReceivingChannels, gsPeerState.OutgoingState, allReceivingChannels) return &api.TransferDiagnostics{ SendingTransfers: sendingTransfers, @@ -587,11 +612,14 @@ func (sm *StorageMinerAPI) MarketDataTransferDiagnostics(ctx context.Context, mp // to produce detailed output on what's happening with a transfer func (sm *StorageMinerAPI) generateTransfers(ctx context.Context, transportChannels map[datatransfer.ChannelID]gst.ChannelGraphsyncRequests, - gsPeerState peerstate.PeerState) []*api.GraphSyncDataTransfer { + gsPeerState peerstate.PeerState, + allChannels map[datatransfer.ChannelID]datatransfer.ChannelState) []*api.GraphSyncDataTransfer { tc := &transferConverter{ - matchedRequests: make(map[graphsync.RequestID]*api.GraphSyncDataTransfer), - gsDiagnostics: gsPeerState.Diagnostics(), - requestStates: gsPeerState.RequestStates, + matchedChannelIds: make(map[datatransfer.ChannelID]struct{}), + matchedRequests: make(map[graphsync.RequestID]*api.GraphSyncDataTransfer), + gsDiagnostics: gsPeerState.Diagnostics(), + requestStates: gsPeerState.RequestStates, + allChannels: allChannels, } // iterate through all operating data transfer transport channels @@ -620,10 +648,12 @@ func (sm *StorageMinerAPI) generateTransfers(ctx context.Context, } type transferConverter struct { - matchedRequests map[graphsync.RequestID]*api.GraphSyncDataTransfer - transfers []*api.GraphSyncDataTransfer - gsDiagnostics map[graphsync.RequestID][]string - requestStates graphsync.RequestStates + matchedChannelIds map[datatransfer.ChannelID]struct{} + matchedRequests map[graphsync.RequestID]*api.GraphSyncDataTransfer + transfers []*api.GraphSyncDataTransfer + gsDiagnostics map[graphsync.RequestID][]string + requestStates graphsync.RequestStates + allChannels map[datatransfer.ChannelID]datatransfer.ChannelState } // convert transfer assembles transfer and diagnostic data for a given graphsync/data-transfer request @@ -657,6 +687,9 @@ func (tc *transferConverter) convertTransfer(channelID datatransfer.ChannelID, h } tc.transfers = append(tc.transfers, transfer) tc.matchedRequests[requestID] = transfer + if hasChannelID { + tc.matchedChannelIds[channelID] = struct{}{} + } } func (tc *transferConverter) collectRemainingTransfers() { @@ -670,6 +703,21 @@ func (tc *transferConverter) collectRemainingTransfers() { tc.convertTransfer(datatransfer.ChannelID{}, false, nil, nil, requestID, false) } } + for channelID, channelState := range tc.allChannels { + if _, ok := tc.matchedChannelIds[channelID]; !ok { + channelID := channelID + cs := api.NewDataTransferChannel(channelState.SelfPeer(), channelState) + transfer := &api.GraphSyncDataTransfer{ + RequestID: graphsync.RequestID(-1), + RequestState: "graphsync state unknown", + IsCurrentChannelRequest: false, + ChannelID: &channelID, + ChannelState: &cs, + Diagnostics: []string{"data transfer with no open transport channel, cannot determine linked graphsync request"}, + } + tc.transfers = append(tc.transfers, transfer) + } + } } func (sm *StorageMinerAPI) MarketPendingDeals(ctx context.Context) (api.PendingDealInfo, error) { From f82a262ffec41b486dbf00b5c3d349ec1fc6a975 Mon Sep 17 00:00:00 2001 From: pefish Date: Wed, 29 Dec 2021 17:37:37 +0800 Subject: [PATCH 151/393] Update wdpost_run.go --- storage/wdpost_run.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/storage/wdpost_run.go b/storage/wdpost_run.go index 038ed3ac7cc..83802a7f325 100644 --- a/storage/wdpost_run.go +++ b/storage/wdpost_run.go @@ -181,9 +181,10 @@ func (s *WindowPoStScheduler) runSubmitPoST( post.ChainCommitRand = commRand // Submit PoST - sm, submitErr := s.submitPoStMessage(ctx, post) - if submitErr != nil { - log.Errorf("submit window post failed: %+v", submitErr) + sm, err := s.submitPoStMessage(ctx, post) + if err != nil { + log.Errorf("submit window post failed: %+v", err) + submitErr = err } else { s.recordProofsEvent(post.Partitions, sm.Cid()) } From 4172a3c8b778e3f62b20ac37291df275792b9c29 Mon Sep 17 00:00:00 2001 From: zl Date: Tue, 28 Dec 2021 10:38:12 +0800 Subject: [PATCH 152/393] ExampleValue for a silce is nil --- api/docgen/docgen.go | 4 +- build/openrpc/full.json.gz | Bin 25722 -> 26581 bytes build/openrpc/miner.json.gz | Bin 11753 -> 12555 bytes build/openrpc/worker.json.gz | Bin 3691 -> 3803 bytes documentation/en/api-v0-methods-miner.md | 773 ++++++++- documentation/en/api-v0-methods-worker.md | 78 +- documentation/en/api-v0-methods.md | 1537 +++++++++++++++-- documentation/en/api-v1-unstable-methods.md | 1642 +++++++++++++++++-- 8 files changed, 3725 insertions(+), 309 deletions(-) diff --git a/api/docgen/docgen.go b/api/docgen/docgen.go index 03ce9109dfc..57159993590 100644 --- a/api/docgen/docgen.go +++ b/api/docgen/docgen.go @@ -1,6 +1,7 @@ package docgen import ( + "encoding/json" "fmt" "go/ast" "go/parser" @@ -252,6 +253,7 @@ func init() { addExample(map[abi.SectorNumber]string{ 123: "can't acquire read lock", }) + addExample(json.RawMessage(`"json raw message"`)) addExample(map[api.SectorState]int{ api.SectorState(sealing.Proving): 120, }) @@ -348,7 +350,7 @@ func ExampleValue(method string, t, parent reflect.Type) interface{} { switch t.Kind() { case reflect.Slice: out := reflect.New(t).Elem() - reflect.Append(out, reflect.ValueOf(ExampleValue(method, t.Elem(), t))) + out = reflect.Append(out, reflect.ValueOf(ExampleValue(method, t.Elem(), t))) return out.Interface() case reflect.Chan: return ExampleValue(method, t.Elem(), nil) diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index c5b98140478ca8678d72b59367c8df5d52328aaf..7ca7301ff72e35e16c485e85f0cd4c306540d3c5 100644 GIT binary patch literal 26581 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 YMei@~G%w9(00030|Cve8McqaP0D>m3!vFvP literal 25722 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 diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index b3228b6a69e7199640a2ce7be753fec98c80ac5d..e7083de2449cc0fec7b2962d0b1856b7fc1e71b9 100644 GIT binary patch literal 12555 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 literal 11753 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 LJa@|?%{Kx7_PQX9 diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index 1a0cb26b543ca19a460774835bc329b0e76b2aca..717eeaacb2879bc3d4445218e554bffe547f727c 100644 GIT binary patch literal 3803 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 R{|^8F|NkJWl}sqf008mFeN_Me literal 3691 zcmV-x4wUg9iwFP!00000|Lk2`bK5o+{wo;nOWdJlillCy=|k$YScJM)1)^AcHziZ}fmSxm_` zN}z(zs~T>XsuG}oLL4AlIb}hJ_+a<}vLNFrQR9~CX0-IeXjN!KtuZ5^@D#9L_;C=0f+Njp;g(${qJwxnf(%`hufiyNVO zT2-wnoPk;#-SSK{bQrHY;Vo~kN;%DCsAB_So3YgnaAj7sQT*R=$v>=B|ZHfvw1iL0dhTt zfP=}sqAFqFD5uJtF`u5EoZLlOdY0#&%n}H3><1p_>%`%3kj;~1GnM?-in{%yXCpyS8?o9IqFwbvJvb|I>ko)qtK_~rP}c&YD+1G^hSrig zg(B!+a;K!2qAZ9~+JTt``%sTB*Ly&XnUY9TBF)!^G|fQ;Jir7x_&Z9*LJ%ip3X3j( zttN>J41_^Va~7-E{0)YP< ztkq_+s-zMgm5<21m@g={prf3cy2=x-DHqA)$JJNpXMSwHo?Tqi_^t=?DbaIP) zY^q(VijiZ*)F)i|^~o^9N;fZY zBb$>$kBBwlNi# z&2Efoqfy8k(`RHQZ%m(!m7+1#cQB>}YrbD(x&wJ}V>;|>!@fQ;N?h&^d~B#`CDzo? z^}enT%#p5DFr#U;*f}oeXIS9JFpa@vWQ>jBxWuFmO;a}q+Qc-qymV-NZDI}w!yO{1|S6dO&x^{IRVwyLs&n>2T>-xN6nliDoD8{nHzVknq1GP(1`VAc3j`suHNaAfUQj3I9QnLYn^9x{C=5>tP-Fc z$7$6GgnXamT!(rV7|n-fX5z={kXVP531p5#&T1B@pE=W?K4c69HWh z+r8`S?N~5d(H7lX*CwWLc|OZEFD}TPO8|-OxquS_-VA(=S`BDiUIll_(QG@(=q$k3 zIU-5E8{)_G0A(;>VmI}csr0(hh2cqmsd3v=Er;F74Y5zV;MbvM{eGpIJ)leEJJ^EP zz6}{FP92`qwR{bYu04n@8r=MCHoOj@gq^Ntapf(ScMTpSMm>aCoxBR+8LvXvdVQiC znZp>F;vJH5WaRZBa&bp4?zD!4b-gYUE;?{gB&@fJgjL`V)+G}Y`()+wHKS#PNpk8dDj7~ZzMLh&yF0ag&{!{wTSM5K|ir45a zQS>sCsN3X)s=Otf;>7NszdMROV7UY2m6ZEE5&xF3!bz9Av{mfy3HY7OQPA3Z#_4v} z)bZ_ zr4|LIDZ<^s(roJ_C_Mz-KQK_5k>bulX+-HP2>{);s8)#oln_-yR0&ac_M*dzSDmg9 zbk3rCSwuq_QzgYbXbkP3a~Vb55=3dVhs%>A7X~ecA5bBOnRmUJ9p0G48Ma0DbyLmg z${%NYO77!I&%DJm7qz3|en(3&-;LtBw{3@R)$8ccH0Uu^Qv9|Co|?eO-$T|I z=5`jgm~EU~bUG;AJOpT46ylc$_oSbbe(tsTxpBpPvJy02s*kr=IDco$%ym80Prp+7r zdjSn{@_cZrdI*4_RGMENW{{pwdcIfY`TG5eTiKdj$F}=DY+YTz_SDU5AMicO-6p4k zX~@9(N;Z;2ET`^S<62;23a1XIE$>+SLGD=V>lJsbT_N@>iKIbTZ&n4XVB*yCoGmf) zn+kS~o6oSaC3b#8(1pQ01#FI1S^+6Q@wbzecJ#m}j{!D^{2xpKMT}u`cSBsb01VzE z0Kp7>1r%8xu_<64;N~6PL5BDb2I)QE;%2H;Bmp$}JUcA@{d zIPkYLD*d?JHZfk;yk%cfa#Q_=#2&M&#-Ibr#&p z-};S0UYkC;^~#ryMis|$;_%&QPg78PQYD){2z5<-XxqsCWx>!nvC+5n`JC04sQN4X z9YyDIO2ah<4X-3m@!!>UOSX&Tc^tX#QtNT4f?9O zx%h2JO&!m=rywK@JAlnmfB*~-An`681wlwiw70jT#QtcDQMxu!mdo4a{{sL3|NoQ& JrGG@n003TMK^_1A diff --git a/documentation/en/api-v0-methods-miner.md b/documentation/en/api-v0-methods-miner.md index 49e8c7a1eb9..013aed641ce 100644 --- a/documentation/en/api-v0-methods-miner.md +++ b/documentation/en/api-v0-methods-miner.md @@ -242,10 +242,18 @@ Inputs: `null` Response: ```json { - "PreCommitControl": null, - "CommitControl": null, - "TerminateControl": null, - "DealPublishControl": null, + "PreCommitControl": [ + "f01234" + ], + "CommitControl": [ + "f01234" + ], + "TerminateControl": [ + "f01234" + ], + "DealPublishControl": [ + "f01234" + ], "DisableOwnerFallback": true, "DisableWorkerFallback": true } @@ -276,7 +284,9 @@ Perms: admin Inputs: ```json [ - null + [ + "write" + ] ] ``` @@ -294,7 +304,12 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + "write" +] +``` ## Check @@ -308,7 +323,15 @@ Inputs: ```json [ 8, - null, + [ + { + "ID": { + "Miner": 1000, + "Number": 9 + }, + "ProofType": 8 + } + ], true ] ``` @@ -331,12 +354,28 @@ Perms: read Inputs: ```json [ - null, - null + [ + { + "SealProof": 8, + "SectorNumber": 9, + "SealedCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + } + ], + "Bw==" ] ``` -Response: `null` +Response: +```json +[ + { + "PoStProof": 8, + "ProofBytes": "Ynl0ZSBhcnJheQ==" + } +] +``` ## Create @@ -370,7 +409,16 @@ Perms: admin Inputs: `null` -Response: `null` +Response: +```json +[ + { + "Key": "baga6ea4seaqecmtz7iak33dsfshi627abz4i4665dfuzr3qfs4bmad6dx3iigdq", + "Success": false, + "Error": "\u003cerror\u003e" + } +] +``` ### DagstoreInitializeAll DagstoreInitializeAll initializes all uninitialized shards in bulk, @@ -446,7 +494,16 @@ Perms: read Inputs: `null` -Response: `null` +Response: +```json +[ + { + "Key": "baga6ea4seaqecmtz7iak33dsfshi627abz4i4665dfuzr3qfs4bmad6dx3iigdq", + "State": "ShardStateAvailable", + "Error": "\u003cerror\u003e" + } +] +``` ### DagstoreRecoverShard DagstoreRecoverShard attempts to recover a failed shard. @@ -548,7 +605,33 @@ Perms: admin Inputs: `null` -Response: `null` +Response: +```json +[ + { + "Proposal": { + "PieceCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "PieceSize": 1032, + "VerifiedDeal": true, + "Client": "f01234", + "Provider": "f01234", + "Label": "string value", + "StartEpoch": 10101, + "EndEpoch": 10101, + "StoragePricePerEpoch": "0", + "ProviderCollateral": "0", + "ClientCollateral": "0" + }, + "State": { + "SectorStartEpoch": 10101, + "LastUpdatedEpoch": 10101, + "SlashEpoch": 10101 + } + } +] +``` ### DealsPieceCidBlocklist @@ -557,7 +640,14 @@ Perms: admin Inputs: `null` -Response: `null` +Response: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` ### DealsSetConsiderOfflineRetrievalDeals @@ -651,7 +741,11 @@ Perms: admin Inputs: ```json [ - null + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + ] ] ``` @@ -679,7 +773,28 @@ Perms: admin Inputs: `null` -Response: `null` +Response: +```json +[ + { + "Type": { + "System": "string value", + "Subsystem": "string value" + }, + "Active": true, + "LastActive": { + "Type": "string value", + "Message": "json raw message", + "Time": "0001-01-01T00:00:00Z" + }, + "LastResolved": { + "Type": "string value", + "Message": "json raw message", + "Time": "0001-01-01T00:00:00Z" + } + } +] +``` ### LogList @@ -688,7 +803,12 @@ Perms: write Inputs: `null` -Response: `null` +Response: +```json +[ + "string value" +] +``` ### LogSetLevel @@ -741,8 +861,94 @@ Inputs: Response: ```json { - "ReceivingTransfers": null, - "SendingTransfers": null + "ReceivingTransfers": [ + { + "RequestID": 4, + "RequestState": "string value", + "IsCurrentChannelRequest": true, + "ChannelID": { + "Initiator": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Responder": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "ID": 3 + }, + "ChannelState": { + "TransferID": 3, + "Status": 1, + "BaseCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "IsInitiator": true, + "IsSender": true, + "Voucher": "string value", + "Message": "string value", + "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Transferred": 42, + "Stages": { + "Stages": [ + { + "Name": "string value", + "Description": "string value", + "CreatedTime": "0001-01-01T00:00:00Z", + "UpdatedTime": "0001-01-01T00:00:00Z", + "Logs": [ + { + "Log": "string value", + "UpdatedTime": "0001-01-01T00:00:00Z" + } + ] + } + ] + } + }, + "Diagnostics": [ + "string value" + ] + } + ], + "SendingTransfers": [ + { + "RequestID": 4, + "RequestState": "string value", + "IsCurrentChannelRequest": true, + "ChannelID": { + "Initiator": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Responder": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "ID": 3 + }, + "ChannelState": { + "TransferID": 3, + "Status": 1, + "BaseCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "IsInitiator": true, + "IsSender": true, + "Voucher": "string value", + "Message": "string value", + "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Transferred": 42, + "Stages": { + "Stages": [ + { + "Name": "string value", + "Description": "string value", + "CreatedTime": "0001-01-01T00:00:00Z", + "UpdatedTime": "0001-01-01T00:00:00Z", + "Logs": [ + { + "Log": "string value", + "UpdatedTime": "0001-01-01T00:00:00Z" + } + ] + } + ] + } + }, + "Diagnostics": [ + "string value" + ] + } + ] } ``` @@ -768,7 +974,20 @@ Response: "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", "Transferred": 42, "Stages": { - "Stages": null + "Stages": [ + { + "Name": "string value", + "Description": "string value", + "CreatedTime": "0001-01-01T00:00:00Z", + "UpdatedTime": "0001-01-01T00:00:00Z", + "Logs": [ + { + "Log": "string value", + "UpdatedTime": "0001-01-01T00:00:00Z" + } + ] + } + ] } } ``` @@ -906,7 +1125,40 @@ Perms: write Inputs: `null` -Response: `null` +Response: +```json +[ + { + "TransferID": 3, + "Status": 1, + "BaseCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "IsInitiator": true, + "IsSender": true, + "Voucher": "string value", + "Message": "string value", + "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Transferred": 42, + "Stages": { + "Stages": [ + { + "Name": "string value", + "Description": "string value", + "CreatedTime": "0001-01-01T00:00:00Z", + "UpdatedTime": "0001-01-01T00:00:00Z", + "Logs": [ + { + "Log": "string value", + "UpdatedTime": "0001-01-01T00:00:00Z" + } + ] + } + ] + } + } +] +``` ### MarketListDeals @@ -915,7 +1167,33 @@ Perms: read Inputs: `null` -Response: `null` +Response: +```json +[ + { + "Proposal": { + "PieceCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "PieceSize": 1032, + "VerifiedDeal": true, + "Client": "f01234", + "Provider": "f01234", + "Label": "string value", + "StartEpoch": 10101, + "EndEpoch": 10101, + "StoragePricePerEpoch": "0", + "ProviderCollateral": "0", + "ClientCollateral": "0" + }, + "State": { + "SectorStartEpoch": 10101, + "LastUpdatedEpoch": 10101, + "SlashEpoch": 10101 + } + } +] +``` ### MarketListIncompleteDeals @@ -924,7 +1202,65 @@ Perms: read Inputs: `null` -Response: `null` +Response: +```json +[ + { + "Proposal": { + "PieceCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "PieceSize": 1032, + "VerifiedDeal": true, + "Client": "f01234", + "Provider": "f01234", + "Label": "string value", + "StartEpoch": 10101, + "EndEpoch": 10101, + "StoragePricePerEpoch": "0", + "ProviderCollateral": "0", + "ClientCollateral": "0" + }, + "ClientSignature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "ProposalCid": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "AddFundsCid": null, + "PublishCid": null, + "Miner": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Client": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "State": 42, + "PiecePath": ".lotusminer/fstmp123", + "MetadataPath": ".lotusminer/fstmp123", + "SlashEpoch": 10101, + "FastRetrieval": true, + "Message": "string value", + "FundsReserved": "0", + "Ref": { + "TransferType": "string value", + "Root": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "PieceCid": null, + "PieceSize": 1024, + "RawBlockSize": 42 + }, + "AvailableForRetrieval": true, + "DealID": 5432, + "CreationTime": "0001-01-01T00:00:00Z", + "TransferChannelId": { + "Initiator": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Responder": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "ID": 3 + }, + "SectorNumber": 9, + "InboundCAR": "string value" + } +] +``` ### MarketListRetrievalDeals @@ -933,7 +1269,51 @@ Perms: read Inputs: `null` -Response: `null` +Response: +```json +[ + { + "PayloadCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "ID": 5, + "Selector": { + "Raw": "Ynl0ZSBhcnJheQ==" + }, + "PieceCID": null, + "PricePerByte": "0", + "PaymentInterval": 42, + "PaymentIntervalIncrease": 42, + "UnsealPrice": "0", + "StoreID": 42, + "ChannelID": { + "Initiator": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Responder": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "ID": 3 + }, + "PieceInfo": { + "PieceCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Deals": [ + { + "DealID": 5432, + "SectorID": 9, + "Offset": 1032, + "Length": 1032 + } + ] + }, + "Status": 0, + "Receiver": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "TotalSent": 42, + "FundsReceived": "0", + "Message": "string value", + "CurrentInterval": 42, + "LegacyProtocol": true + } +] +``` ### MarketPendingDeals @@ -945,7 +1325,29 @@ Inputs: `null` Response: ```json { - "Deals": null, + "Deals": [ + { + "Proposal": { + "PieceCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "PieceSize": 1032, + "VerifiedDeal": true, + "Client": "f01234", + "Provider": "f01234", + "Label": "string value", + "StartEpoch": 10101, + "EndEpoch": 10101, + "StoragePricePerEpoch": "0", + "ProviderCollateral": "0", + "ClientCollateral": "0" + }, + "ClientSignature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + } + } + ], "PublishPeriodStart": "0001-01-01T00:00:00Z", "PublishPeriod": 60000000000 } @@ -1063,7 +1465,9 @@ Response: ```json { "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", - "Addrs": [] + "Addrs": [ + "/ip4/52.36.61.156/tcp/1347/p2p/12D3KooWFETiESTf1v4PGUvtnxMAcEFMzLZbJGg4tjWfGEimYior" + ] } ``` @@ -1160,9 +1564,15 @@ Inputs: ```json [ { - "Peers": null, - "IPAddrs": null, - "IPSubnets": null + "Peers": [ + "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf" + ], + "IPAddrs": [ + "string value" + ], + "IPSubnets": [ + "string value" + ] } ] ``` @@ -1179,9 +1589,15 @@ Inputs: `null` Response: ```json { - "Peers": null, - "IPAddrs": null, - "IPSubnets": null + "Peers": [ + "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf" + ], + "IPAddrs": [ + "string value" + ], + "IPSubnets": [ + "string value" + ] } ``` @@ -1194,9 +1610,15 @@ Inputs: ```json [ { - "Peers": null, - "IPAddrs": null, - "IPSubnets": null + "Peers": [ + "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf" + ], + "IPAddrs": [ + "string value" + ], + "IPSubnets": [ + "string value" + ] } ] ``` @@ -1213,7 +1635,9 @@ Inputs: [ { "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", - "Addrs": [] + "Addrs": [ + "/ip4/52.36.61.156/tcp/1347/p2p/12D3KooWFETiESTf1v4PGUvtnxMAcEFMzLZbJGg4tjWfGEimYior" + ] } ] ``` @@ -1264,7 +1688,9 @@ Response: ```json { "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", - "Addrs": [] + "Addrs": [ + "/ip4/52.36.61.156/tcp/1347/p2p/12D3KooWFETiESTf1v4PGUvtnxMAcEFMzLZbJGg4tjWfGEimYior" + ] } ``` @@ -1285,8 +1711,12 @@ Response: { "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", "Agent": "string value", - "Addrs": null, - "Protocols": null, + "Addrs": [ + "string value" + ], + "Protocols": [ + "string value" + ], "ConnMgrMeta": { "FirstSeen": "0001-01-01T00:00:00Z", "Value": 123, @@ -1307,7 +1737,17 @@ Perms: read Inputs: `null` -Response: `null` +Response: +```json +[ + { + "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Addrs": [ + "/ip4/52.36.61.156/tcp/1347/p2p/12D3KooWFETiESTf1v4PGUvtnxMAcEFMzLZbJGg4tjWfGEimYior" + ] + } +] +``` ### NetPubsubScores @@ -1316,7 +1756,28 @@ Perms: read Inputs: `null` -Response: `null` +Response: +```json +[ + { + "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Score": { + "Score": 12.3, + "Topics": { + "/blocks": { + "TimeInMesh": 60000000000, + "FirstMessageDeliveries": 122, + "MeshMessageDeliveries": 1234, + "InvalidMessageDeliveries": 3 + } + }, + "AppSpecificScore": 12.3, + "IPColocationFactor": 12.3, + "BehaviourPenalty": 12.3 + } + } +] +``` ## Pieces @@ -1341,7 +1802,15 @@ Response: "CID": { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, - "PieceBlockLocations": null + "PieceBlockLocations": [ + { + "RelOffset": 42, + "BlockSize": 42, + "PieceCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + } + ] } ``` @@ -1365,7 +1834,14 @@ Response: "PieceCID": { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, - "Deals": null + "Deals": [ + { + "DealID": 5432, + "SectorID": 9, + "Offset": 1032, + "Length": 1032 + } + ] } ``` @@ -1376,7 +1852,14 @@ Perms: read Inputs: `null` -Response: `null` +Response: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` ### PiecesListPieces @@ -1385,7 +1868,14 @@ Perms: read Inputs: `null` -Response: `null` +Response: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` ## Pledge @@ -1551,7 +2041,9 @@ Inputs: }, "ID": "07070707-0707-0707-0707-070707070707" }, - null, + [ + "Ynl0ZSBhcnJheQ==" + ], { "Code": 0, "Message": "string value" @@ -1576,7 +2068,7 @@ Inputs: }, "ID": "07070707-0707-0707-0707-070707070707" }, - null, + "Bw==", { "Code": 0, "Message": "string value" @@ -1682,7 +2174,7 @@ Inputs: }, "ID": "07070707-0707-0707-0707-070707070707" }, - null, + "Bw==", { "Code": 0, "Message": "string value" @@ -1707,7 +2199,7 @@ Inputs: }, "ID": "07070707-0707-0707-0707-070707070707" }, - null, + "Bw==", { "Code": 0, "Message": "string value" @@ -1732,7 +2224,7 @@ Inputs: }, "ID": "07070707-0707-0707-0707-070707070707" }, - null, + "Bw==", { "Code": 0, "Message": "string value" @@ -1918,7 +2410,22 @@ Perms: admin Inputs: `null` -Response: `null` +Response: +```json +[ + { + "Sectors": [ + 123, + 124 + ], + "FailedSectors": { + "123": "can't acquire read lock" + }, + "Msg": null, + "Error": "string value" + } +] +``` ### SectorCommitPending SectorCommitPending returns a list of pending Commit sectors to be sent in the next aggregate message @@ -1928,7 +2435,15 @@ Perms: admin Inputs: `null` -Response: `null` +Response: +```json +[ + { + "Miner": 1000, + "Number": 9 + } +] +``` ### SectorGetExpectedSealDuration SectorGetExpectedSealDuration gets the expected time for a sector to seal @@ -1974,7 +2489,19 @@ Perms: admin Inputs: `null` -Response: `null` +Response: +```json +[ + { + "Sectors": [ + 123, + 124 + ], + "Msg": null, + "Error": "string value" + } +] +``` ### SectorPreCommitPending SectorPreCommitPending returns a list of pending PreCommit sectors to be sent in the next batch message @@ -1984,7 +2511,15 @@ Perms: admin Inputs: `null` -Response: `null` +Response: +```json +[ + { + "Miner": 1000, + "Number": 9 + } +] +``` ### SectorRemove SectorRemove removes the sector from storage. It doesn't terminate it on-chain, which can @@ -2084,7 +2619,15 @@ Perms: admin Inputs: `null` -Response: `null` +Response: +```json +[ + { + "Miner": 1000, + "Number": 9 + } +] +``` ## Sectors @@ -2114,7 +2657,9 @@ Perms: read Inputs: ```json [ - null + [ + "Proving" + ] ] ``` @@ -2168,14 +2713,49 @@ Response: "CommD": null, "CommR": null, "Proof": "Ynl0ZSBhcnJheQ==", - "Deals": null, - "Pieces": null, + "Deals": [ + 5432 + ], + "Pieces": [ + { + "Piece": { + "Size": 1032, + "PieceCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + }, + "DealInfo": { + "PublishCid": null, + "DealID": 5432, + "DealProposal": { + "PieceCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "PieceSize": 1032, + "VerifiedDeal": true, + "Client": "f01234", + "Provider": "f01234", + "Label": "string value", + "StartEpoch": 10101, + "EndEpoch": 10101, + "StoragePricePerEpoch": "0", + "ProviderCollateral": "0", + "ClientCollateral": "0" + }, + "DealSchedule": { + "StartEpoch": 10101, + "EndEpoch": 10101 + }, + "KeepUnsealed": true + } + } + ], "Ticket": { - "Value": null, + "Value": "Bw==", "Epoch": 10101 }, "Seed": { - "Value": null, + "Value": "Bw==", "Epoch": 10101 }, "PreCommitMsg": null, @@ -2183,7 +2763,14 @@ Response: "Retries": 42, "ToUpgrade": true, "LastErr": "string value", - "Log": null, + "Log": [ + { + "Kind": "string value", + "Timestamp": 42, + "Trace": "string value", + "Message": "string value" + } + ], "SealProof": 8, "Activation": 10101, "Expiration": 10101, @@ -2227,7 +2814,7 @@ Inputs: }, 1040384, 1024, - null, + "Bw==", null ] ``` @@ -2277,13 +2864,19 @@ Inputs: [ { "ID": "76f1988b-ef30-4d7e-b3ec-9a627f4ba5a8", - "URLs": null, + "URLs": [ + "string value" + ], "Weight": 42, "MaxStorage": 42, "CanSeal": true, "CanStore": true, - "Groups": null, - "AllowTo": null + "Groups": [ + "string value" + ], + "AllowTo": [ + "string value" + ] }, { "Capacity": 9, @@ -2312,7 +2905,27 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "ID": "76f1988b-ef30-4d7e-b3ec-9a627f4ba5a8", + "URLs": [ + "string value" + ], + "Weight": 42, + "MaxStorage": 42, + "CanSeal": true, + "CanStore": true, + "Groups": [ + "string value" + ], + "AllowTo": [ + "string value" + ] + } +] +``` ### StorageDeclareSector @@ -2371,7 +2984,21 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "ID": "76f1988b-ef30-4d7e-b3ec-9a627f4ba5a8", + "URLs": [ + "string value" + ], + "Weight": 42, + "CanSeal": true, + "CanStore": true, + "Primary": true + } +] +``` ### StorageGetLocks @@ -2424,13 +3051,19 @@ Response: ```json { "ID": "76f1988b-ef30-4d7e-b3ec-9a627f4ba5a8", - "URLs": null, + "URLs": [ + "string value" + ], "Weight": 42, "MaxStorage": 42, "CanSeal": true, "CanStore": true, - "Groups": null, - "AllowTo": null + "Groups": [ + "string value" + ], + "AllowTo": [ + "string value" + ] } ``` diff --git a/documentation/en/api-v0-methods-worker.md b/documentation/en/api-v0-methods-worker.md index 35f33712194..566a650fa17 100644 --- a/documentation/en/api-v0-methods-worker.md +++ b/documentation/en/api-v0-methods-worker.md @@ -103,7 +103,9 @@ Response: "MemSwap": 42, "MemSwapUsed": 42, "CPUs": 42, - "GPUs": null, + "GPUs": [ + "string value" + ], "Resources": { "seal/v0/addpiece": { "0": { @@ -691,7 +693,18 @@ Perms: admin Inputs: `null` -Response: `null` +Response: +```json +[ + { + "ID": "76f1988b-ef30-4d7e-b3ec-9a627f4ba5a8", + "Weight": 42, + "LocalPath": "string value", + "CanSeal": true, + "CanStore": true + } +] +``` ### Remove Storage / Other @@ -749,7 +762,9 @@ Inputs: }, "ProofType": 8 }, - null, + [ + 1024 + ], 1024, {} ] @@ -784,7 +799,12 @@ Inputs: }, "ProofType": 8 }, - null + [ + { + "Offset": 1024, + "Size": 1024 + } + ] ] ``` @@ -946,7 +966,9 @@ Inputs: { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, - null + [ + "Ynl0ZSBhcnJheQ==" + ] ] ``` @@ -979,7 +1001,12 @@ Inputs: }, "ProofType": 8 }, - null + [ + { + "Offset": 1024, + "Size": 1024 + } + ] ] ``` @@ -1012,7 +1039,14 @@ Inputs: }, "ProofType": 8 }, - null + [ + { + "Size": 1032, + "PieceCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + } + ] ] ``` @@ -1045,9 +1079,16 @@ Inputs: }, "ProofType": 8 }, - null, - null, - null, + "Bw==", + "Bw==", + [ + { + "Size": 1032, + "PieceCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + } + ], { "Unsealed": { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" @@ -1085,7 +1126,7 @@ Inputs: }, "ProofType": 8 }, - null + "Bw==" ] ``` @@ -1115,8 +1156,15 @@ Inputs: }, "ProofType": 8 }, - null, - null + "Bw==", + [ + { + "Size": 1032, + "PieceCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + } + ] ] ``` @@ -1146,7 +1194,7 @@ Inputs: }, "ProofType": 8 }, - null + "Bw==" ] ``` @@ -1263,7 +1311,7 @@ Inputs: }, 1040384, 1024, - null, + "Bw==", { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" } diff --git a/documentation/en/api-v0-methods.md b/documentation/en/api-v0-methods.md index 0544a9acc97..59dfb09f6ef 100644 --- a/documentation/en/api-v0-methods.md +++ b/documentation/en/api-v0-methods.md @@ -299,7 +299,9 @@ Perms: admin Inputs: ```json [ - null + [ + "write" + ] ] ``` @@ -317,7 +319,12 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + "write" +] +``` ## Beacon The Beacon method group contains methods for interacting with the random beacon (DRAND) @@ -422,9 +429,23 @@ Response: "WinCount": 9, "VRFProof": "Ynl0ZSBhcnJheQ==" }, - "BeaconEntries": null, - "WinPoStProof": null, - "Parents": null, + "BeaconEntries": [ + { + "Round": 42, + "Data": "Ynl0ZSBhcnJheQ==" + } + ], + "WinPoStProof": [ + { + "PoStProof": 8, + "ProofBytes": "Ynl0ZSBhcnJheQ==" + } + ], + "Parents": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + ], "ParentWeight": "0", "Height": 10101, "ParentStateRoot": { @@ -479,9 +500,54 @@ Inputs: Response: ```json { - "BlsMessages": null, - "SecpkMessages": null, - "Cids": null + "BlsMessages": [ + { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } + ], + "SecpkMessages": [ + { + "Message": { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + }, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } + ], + "Cids": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + ] } ``` @@ -557,7 +623,31 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "Cid": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Message": { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } + } +] +``` ### ChainGetNode @@ -597,7 +687,31 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "Cid": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Message": { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } + } +] +``` ### ChainGetParentReceipts ChainGetParentReceipts returns receipts for messages in parent tipset of @@ -616,7 +730,16 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + } +] +``` ### ChainGetPath ChainGetPath returns a set of revert/apply operations needed to get from @@ -658,7 +781,19 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "Type": "string value", + "Val": { + "Cids": null, + "Blocks": null, + "Height": 0 + } + } +] +``` ### ChainGetRandomnessFromBeacon ChainGetRandomnessFromBeacon is used to sample the beacon for randomness. @@ -683,7 +818,7 @@ Inputs: ] ``` -Response: `null` +Response: `"Bw=="` ### ChainGetRandomnessFromTickets ChainGetRandomnessFromTickets is used to sample the chain for randomness. @@ -708,7 +843,7 @@ Inputs: ] ``` -Response: `null` +Response: `"Bw=="` ### ChainGetTipSet ChainGetTipSet returns the tipset specified by the given TipSetKey. @@ -814,7 +949,19 @@ Perms: read Inputs: `null` -Response: `null` +Response: +```json +[ + { + "Type": "string value", + "Val": { + "Cids": null, + "Blocks": null, + "Height": 0 + } + } +] +``` ### ChainReadObj ChainReadObj reads ipld nodes referenced by the specified CID from chain @@ -988,7 +1135,20 @@ Response: "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", "Transferred": 42, "Stages": { - "Stages": null + "Stages": [ + { + "Name": "string value", + "Description": "string value", + "CreatedTime": "0001-01-01T00:00:00Z", + "UpdatedTime": "0001-01-01T00:00:00Z", + "Logs": [ + { + "Log": "string value", + "UpdatedTime": "0001-01-01T00:00:00Z" + } + ] + } + ] } } ``` @@ -1058,7 +1218,30 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "Err": "string value", + "Root": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Piece": null, + "Size": 42, + "MinPrice": "0", + "UnsealPrice": "0", + "PricePerByte": "0", + "PaymentInterval": 42, + "PaymentIntervalIncrease": 42, + "Miner": "f01234", + "MinerPeer": { + "Address": "f01234", + "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "PieceCID": null + } + } +] +``` ### ClientGenCar ClientGenCar generates a CAR file for the specified file. @@ -1103,7 +1286,21 @@ Response: "State": 42, "Message": "string value", "DealStages": { - "Stages": null + "Stages": [ + { + "Name": "string value", + "Description": "string value", + "ExpectedDuration": "string value", + "CreatedTime": "0001-01-01T00:00:00Z", + "UpdatedTime": "0001-01-01T00:00:00Z", + "Logs": [ + { + "Log": "string value", + "UpdatedTime": "0001-01-01T00:00:00Z" + } + ] + } + ] }, "Provider": "f01234", "DataRef": { @@ -1142,7 +1339,20 @@ Response: "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", "Transferred": 42, "Stages": { - "Stages": null + "Stages": [ + { + "Name": "string value", + "Description": "string value", + "CreatedTime": "0001-01-01T00:00:00Z", + "UpdatedTime": "0001-01-01T00:00:00Z", + "Logs": [ + { + "Log": "string value", + "UpdatedTime": "0001-01-01T00:00:00Z" + } + ] + } + ] } } } @@ -1180,7 +1390,21 @@ Response: "State": 42, "Message": "string value", "DealStages": { - "Stages": null + "Stages": [ + { + "Name": "string value", + "Description": "string value", + "ExpectedDuration": "string value", + "CreatedTime": "0001-01-01T00:00:00Z", + "UpdatedTime": "0001-01-01T00:00:00Z", + "Logs": [ + { + "Log": "string value", + "UpdatedTime": "0001-01-01T00:00:00Z" + } + ] + } + ] }, "Provider": "f01234", "DataRef": { @@ -1219,7 +1443,20 @@ Response: "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", "Transferred": 42, "Stages": { - "Stages": null + "Stages": [ + { + "Name": "string value", + "Description": "string value", + "CreatedTime": "0001-01-01T00:00:00Z", + "UpdatedTime": "0001-01-01T00:00:00Z", + "Logs": [ + { + "Log": "string value", + "UpdatedTime": "0001-01-01T00:00:00Z" + } + ] + } + ] } } } @@ -1267,7 +1504,20 @@ Response: "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", "Transferred": 42, "Stages": { - "Stages": null + "Stages": [ + { + "Name": "string value", + "Description": "string value", + "CreatedTime": "0001-01-01T00:00:00Z", + "UpdatedTime": "0001-01-01T00:00:00Z", + "Logs": [ + { + "Log": "string value", + "UpdatedTime": "0001-01-01T00:00:00Z" + } + ] + } + ] } }, "Event": 5 @@ -1325,7 +1575,40 @@ Perms: write Inputs: `null` -Response: `null` +Response: +```json +[ + { + "TransferID": 3, + "Status": 1, + "BaseCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "IsInitiator": true, + "IsSender": true, + "Voucher": "string value", + "Message": "string value", + "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Transferred": 42, + "Stages": { + "Stages": [ + { + "Name": "string value", + "Description": "string value", + "CreatedTime": "0001-01-01T00:00:00Z", + "UpdatedTime": "0001-01-01T00:00:00Z", + "Logs": [ + { + "Log": "string value", + "UpdatedTime": "0001-01-01T00:00:00Z" + } + ] + } + ] + } + } +] +``` ### ClientListDeals ClientListDeals returns information about the deals made by the local client. @@ -1335,7 +1618,88 @@ Perms: write Inputs: `null` -Response: `null` +Response: +```json +[ + { + "ProposalCid": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "State": 42, + "Message": "string value", + "DealStages": { + "Stages": [ + { + "Name": "string value", + "Description": "string value", + "ExpectedDuration": "string value", + "CreatedTime": "0001-01-01T00:00:00Z", + "UpdatedTime": "0001-01-01T00:00:00Z", + "Logs": [ + { + "Log": "string value", + "UpdatedTime": "0001-01-01T00:00:00Z" + } + ] + } + ] + }, + "Provider": "f01234", + "DataRef": { + "TransferType": "string value", + "Root": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "PieceCid": null, + "PieceSize": 1024, + "RawBlockSize": 42 + }, + "PieceCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Size": 42, + "PricePerEpoch": "0", + "Duration": 42, + "DealID": 5432, + "CreationTime": "0001-01-01T00:00:00Z", + "Verified": true, + "TransferChannelID": { + "Initiator": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Responder": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "ID": 3 + }, + "DataTransfer": { + "TransferID": 3, + "Status": 1, + "BaseCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "IsInitiator": true, + "IsSender": true, + "Voucher": "string value", + "Message": "string value", + "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Transferred": 42, + "Stages": { + "Stages": [ + { + "Name": "string value", + "Description": "string value", + "CreatedTime": "0001-01-01T00:00:00Z", + "UpdatedTime": "0001-01-01T00:00:00Z", + "Logs": [ + { + "Log": "string value", + "UpdatedTime": "0001-01-01T00:00:00Z" + } + ] + } + ] + } + } + } +] +``` ### ClientListImports ClientListImports lists imported files and their root CIDs @@ -1345,7 +1709,19 @@ Perms: write Inputs: `null` -Response: `null` +Response: +```json +[ + { + "Key": 50, + "Err": "string value", + "Root": null, + "Source": "string value", + "FilePath": "string value", + "CARPath": "string value" + } +] +``` ### ClientListRetrievals ClientQueryAsk returns a signed StorageAsk from the specified miner. @@ -1356,7 +1732,61 @@ Perms: write Inputs: `null` -Response: `null` +Response: +```json +[ + { + "PayloadCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "ID": 5, + "PieceCID": null, + "PricePerByte": "0", + "UnsealPrice": "0", + "Status": 0, + "Message": "string value", + "Provider": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "BytesReceived": 42, + "BytesPaidFor": 42, + "TotalPaid": "0", + "TransferChannelID": { + "Initiator": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Responder": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "ID": 3 + }, + "DataTransfer": { + "TransferID": 3, + "Status": 1, + "BaseCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "IsInitiator": true, + "IsSender": true, + "Voucher": "string value", + "Message": "string value", + "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Transferred": 42, + "Stages": { + "Stages": [ + { + "Name": "string value", + "Description": "string value", + "CreatedTime": "0001-01-01T00:00:00Z", + "UpdatedTime": "0001-01-01T00:00:00Z", + "Logs": [ + { + "Log": "string value", + "UpdatedTime": "0001-01-01T00:00:00Z" + } + ] + } + ] + } + }, + "Event": 5 + } +] +``` ### ClientMinerQueryOffer ClientMinerQueryOffer returns a QueryOffer for the specific miner and file. @@ -1830,7 +2260,28 @@ Perms: admin Inputs: `null` -Response: `null` +Response: +```json +[ + { + "Type": { + "System": "string value", + "Subsystem": "string value" + }, + "Active": true, + "LastActive": { + "Type": "string value", + "Message": "json raw message", + "Time": "0001-01-01T00:00:00Z" + }, + "LastResolved": { + "Type": "string value", + "Message": "json raw message", + "Time": "0001-01-01T00:00:00Z" + } + } +] +``` ### LogList @@ -1839,7 +2290,12 @@ Perms: write Inputs: `null` -Response: `null` +Response: +```json +[ + "string value" +] +``` ### LogSetLevel @@ -1984,11 +2440,46 @@ Inputs: "WinCount": 9, "VRFProof": "Ynl0ZSBhcnJheQ==" }, - "BeaconValues": null, - "Messages": null, + "BeaconValues": [ + { + "Round": 42, + "Data": "Ynl0ZSBhcnJheQ==" + } + ], + "Messages": [ + { + "Message": { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + }, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } + ], "Epoch": 10101, "Timestamp": 42, - "WinningPoStProof": null + "WinningPoStProof": [ + { + "PoStProof": 8, + "ProofBytes": "Ynl0ZSBhcnJheQ==" + } + ] } ] ``` @@ -2005,9 +2496,23 @@ Response: "WinCount": 9, "VRFProof": "Ynl0ZSBhcnJheQ==" }, - "BeaconEntries": null, - "WinPoStProof": null, - "Parents": null, + "BeaconEntries": [ + { + "Round": 42, + "Data": "Ynl0ZSBhcnJheQ==" + } + ], + "WinPoStProof": [ + { + "PoStProof": 8, + "ProofBytes": "Ynl0ZSBhcnJheQ==" + } + ], + "Parents": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + ], "ParentWeight": "0", "Height": 10101, "ParentStateRoot": { @@ -2031,8 +2536,16 @@ Response: "ForkSignaling": 42, "ParentBaseFee": "0" }, - "BlsMessages": null, - "SecpkMessages": null + "BlsMessages": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + ], + "SecpkMessages": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + ] } ``` @@ -2062,14 +2575,27 @@ Response: { "MinerPower": "0", "NetworkPower": "0", - "Sectors": null, + "Sectors": [ + { + "SealProof": 8, + "SectorNumber": 9, + "SealedCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + } + ], "WorkerKey": "f01234", "SectorSize": 34359738368, "PrevBeaconEntry": { "Round": 42, "Data": "Ynl0ZSBhcnJheQ==" }, - "BeaconEntries": null, + "BeaconEntries": [ + { + "Round": 42, + "Data": "Ynl0ZSBhcnJheQ==" + } + ], "EligibleForMining": true } ``` @@ -2088,11 +2614,43 @@ Perms: write Inputs: ```json [ - null + [ + { + "Message": { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + }, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } + ] ] ``` -Response: `null` +Response: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` ### MpoolBatchPushMessage MpoolBatchPushMessage batch pushes a unsigned message to mempool. @@ -2103,14 +2661,58 @@ Perms: sign Inputs: ```json [ - null, + [ + { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } + ], { "MaxFee": "0" } ] ``` -Response: `null` +Response: +```json +[ + { + "Message": { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + }, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } +] +``` ### MpoolBatchPushUntrusted MpoolBatchPushUntrusted batch pushes a signed message to mempool from untrusted sources. @@ -2121,11 +2723,43 @@ Perms: write Inputs: ```json [ - null + [ + { + "Message": { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + }, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } + ] ] ``` -Response: `null` +Response: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` ### MpoolClear MpoolClear clears pending messages from the mpool @@ -2153,7 +2787,9 @@ Inputs: `null` Response: ```json { - "PriorityAddrs": null, + "PriorityAddrs": [ + "f01234" + ], "SizeLimitHigh": 123, "SizeLimitLow": 123, "ReplaceByFeeRatio": 12.3, @@ -2198,7 +2834,35 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "Message": { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + }, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } +] +``` ### MpoolPush MpoolPush pushes a signed message to mempool. @@ -2370,7 +3034,35 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "Message": { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + }, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } +] +``` ### MpoolSetConfig MpoolSetConfig sets the mpool config to (a copy of) the supplied config @@ -2382,7 +3074,9 @@ Inputs: ```json [ { - "PriorityAddrs": null, + "PriorityAddrs": [ + "f01234" + ], "SizeLimitHigh": 123, "SizeLimitLow": 123, "ReplaceByFeeRatio": 12.3, @@ -2610,7 +3304,9 @@ Inputs: ```json [ 42, - null, + [ + "f01234" + ], 10101, "0", "f01234", @@ -2671,8 +3367,22 @@ Inputs: ] ``` -Response: `null` - +Response: +```json +[ + { + "ID": 9, + "To": "f01234", + "Value": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "Approved": [ + "f01234" + ] + } +] +``` + ### MsigGetVested MsigGetVested returns the amount of FIL that vested in a multisig in a certain period. It takes the following params: , , @@ -2881,7 +3591,9 @@ Response: ```json { "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", - "Addrs": [] + "Addrs": [ + "/ip4/52.36.61.156/tcp/1347/p2p/12D3KooWFETiESTf1v4PGUvtnxMAcEFMzLZbJGg4tjWfGEimYior" + ] } ``` @@ -2978,9 +3690,15 @@ Inputs: ```json [ { - "Peers": null, - "IPAddrs": null, - "IPSubnets": null + "Peers": [ + "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf" + ], + "IPAddrs": [ + "string value" + ], + "IPSubnets": [ + "string value" + ] } ] ``` @@ -2997,9 +3715,15 @@ Inputs: `null` Response: ```json { - "Peers": null, - "IPAddrs": null, - "IPSubnets": null + "Peers": [ + "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf" + ], + "IPAddrs": [ + "string value" + ], + "IPSubnets": [ + "string value" + ] } ``` @@ -3012,9 +3736,15 @@ Inputs: ```json [ { - "Peers": null, - "IPAddrs": null, - "IPSubnets": null + "Peers": [ + "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf" + ], + "IPAddrs": [ + "string value" + ], + "IPSubnets": [ + "string value" + ] } ] ``` @@ -3031,7 +3761,9 @@ Inputs: [ { "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", - "Addrs": [] + "Addrs": [ + "/ip4/52.36.61.156/tcp/1347/p2p/12D3KooWFETiESTf1v4PGUvtnxMAcEFMzLZbJGg4tjWfGEimYior" + ] } ] ``` @@ -3082,7 +3814,9 @@ Response: ```json { "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", - "Addrs": [] + "Addrs": [ + "/ip4/52.36.61.156/tcp/1347/p2p/12D3KooWFETiESTf1v4PGUvtnxMAcEFMzLZbJGg4tjWfGEimYior" + ] } ``` @@ -3103,8 +3837,12 @@ Response: { "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", "Agent": "string value", - "Addrs": null, - "Protocols": null, + "Addrs": [ + "string value" + ], + "Protocols": [ + "string value" + ], "ConnMgrMeta": { "FirstSeen": "0001-01-01T00:00:00Z", "Value": 123, @@ -3125,7 +3863,17 @@ Perms: read Inputs: `null` -Response: `null` +Response: +```json +[ + { + "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Addrs": [ + "/ip4/52.36.61.156/tcp/1347/p2p/12D3KooWFETiESTf1v4PGUvtnxMAcEFMzLZbJGg4tjWfGEimYior" + ] + } +] +``` ### NetPubsubScores @@ -3134,7 +3882,28 @@ Perms: read Inputs: `null` -Response: `null` +Response: +```json +[ + { + "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Score": { + "Score": 12.3, + "Topics": { + "/blocks": { + "TimeInMesh": 60000000000, + "FirstMessageDeliveries": 122, + "MeshMessageDeliveries": 1234, + "InvalidMessageDeliveries": 3 + } + }, + "AppSpecificScore": 12.3, + "IPColocationFactor": 12.3, + "BehaviourPenalty": 12.3 + } + } +] +``` ## Paych The Paych methods are for interacting with and managing payment channels @@ -3273,7 +4042,12 @@ Perms: read Inputs: `null` -Response: `null` +Response: +```json +[ + "f01234" +] +``` ### PaychNewPayment @@ -3285,7 +4059,19 @@ Inputs: [ "f01234", "f01234", - null + [ + { + "Amount": "0", + "TimeLockMin": 10101, + "TimeLockMax": 10101, + "MinSettle": 10101, + "Extra": { + "Actor": "f01234", + "Method": 1, + "Data": "Ynl0ZSBhcnJheQ==" + } + } + ] ] ``` @@ -3296,7 +4082,33 @@ Response: "WaitSentinel": { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, - "Vouchers": null + "Vouchers": [ + { + "ChannelAddr": "f01234", + "TimeLockMin": 10101, + "TimeLockMax": 10101, + "SecretPreimage": "Ynl0ZSBhcnJheQ==", + "Extra": { + "Actor": "f01234", + "Method": 1, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "Lane": 42, + "Nonce": 42, + "Amount": "0", + "MinSettleHeight": 10101, + "Merges": [ + { + "Lane": 42, + "Nonce": 42 + } + ], + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + } + } + ] } ``` @@ -3362,7 +4174,12 @@ Inputs: "Nonce": 42, "Amount": "0", "MinSettleHeight": 10101, - "Merges": null, + "Merges": [ + { + "Lane": 42, + "Nonce": 42 + } + ], "Signature": { "Type": 2, "Data": "Ynl0ZSBhcnJheQ==" @@ -3398,7 +4215,12 @@ Inputs: "Nonce": 42, "Amount": "0", "MinSettleHeight": 10101, - "Merges": null, + "Merges": [ + { + "Lane": 42, + "Nonce": 42 + } + ], "Signature": { "Type": 2, "Data": "Ynl0ZSBhcnJheQ==" @@ -3434,7 +4256,12 @@ Inputs: "Nonce": 42, "Amount": "0", "MinSettleHeight": 10101, - "Merges": null, + "Merges": [ + { + "Lane": 42, + "Nonce": 42 + } + ], "Signature": { "Type": 2, "Data": "Ynl0ZSBhcnJheQ==" @@ -3476,7 +4303,12 @@ Response: "Nonce": 42, "Amount": "0", "MinSettleHeight": 10101, - "Merges": null, + "Merges": [ + { + "Lane": 42, + "Nonce": 42 + } + ], "Signature": { "Type": 2, "Data": "Ynl0ZSBhcnJheQ==" @@ -3498,7 +4330,36 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "ChannelAddr": "f01234", + "TimeLockMin": 10101, + "TimeLockMax": 10101, + "SecretPreimage": "Ynl0ZSBhcnJheQ==", + "Extra": { + "Actor": "f01234", + "Method": 1, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "Lane": 42, + "Nonce": 42, + "Amount": "0", + "MinSettleHeight": 10101, + "Merges": [ + { + "Lane": 42, + "Nonce": 42 + } + ], + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + } + } +] +``` ### PaychVoucherSubmit @@ -3523,7 +4384,12 @@ Inputs: "Nonce": 42, "Amount": "0", "MinSettleHeight": 10101, - "Merges": null, + "Merges": [ + { + "Lane": 42, + "Nonce": 42 + } + ], "Signature": { "Type": 2, "Data": "Ynl0ZSBhcnJheQ==" @@ -3591,7 +4457,15 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "Miner": "f01234", + "Epoch": 10101 + } +] +``` ### StateCall StateCall runs the given message and returns its result without any persisted changes. @@ -3693,8 +4567,73 @@ Response: }, "Error": "string value", "Duration": 60000000000, - "GasCharges": null, - "Subcalls": null + "GasCharges": [ + { + "Name": "string value", + "loc": [ + { + "File": "string value", + "Line": 123, + "Function": "string value" + } + ], + "tg": 9, + "cg": 9, + "sg": 9, + "vtg": 9, + "vcg": 9, + "vsg": 9, + "tt": 60000000000, + "ex": {} + } + ], + "Subcalls": [ + { + "Msg": { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + }, + "MsgRct": { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + }, + "Error": "string value", + "Duration": 60000000000, + "GasCharges": [ + { + "Name": "string value", + "loc": [ + { + "File": "string value", + "Line": 123, + "Function": "string value" + } + ], + "tg": 9, + "cg": 9, + "sg": 9, + "vtg": 9, + "vcg": 9, + "vsg": 9, + "tt": 60000000000, + "ex": {} + } + ], + "Subcalls": null + } + ] }, "Error": "string value", "Duration": 60000000000 @@ -3800,7 +4739,23 @@ Inputs: ```json [ 10101, - null, + [ + { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } + ], [ { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" @@ -3818,7 +4773,138 @@ Response: "Root": { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, - "Trace": null + "Trace": [ + { + "MsgCid": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Msg": { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + }, + "MsgRct": { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + }, + "GasCost": { + "Message": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "GasUsed": "0", + "BaseFeeBurn": "0", + "OverEstimationBurn": "0", + "MinerPenalty": "0", + "MinerTip": "0", + "Refund": "0", + "TotalCost": "0" + }, + "ExecutionTrace": { + "Msg": { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + }, + "MsgRct": { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + }, + "Error": "string value", + "Duration": 60000000000, + "GasCharges": [ + { + "Name": "string value", + "loc": [ + { + "File": "string value", + "Line": 123, + "Function": "string value" + } + ], + "tg": 9, + "cg": 9, + "sg": 9, + "vtg": 9, + "vcg": 9, + "vsg": 9, + "tt": 60000000000, + "ex": {} + } + ], + "Subcalls": [ + { + "Msg": { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + }, + "MsgRct": { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + }, + "Error": "string value", + "Duration": 60000000000, + "GasCharges": [ + { + "Name": "string value", + "loc": [ + { + "File": "string value", + "Line": 123, + "Function": "string value" + } + ], + "tg": 9, + "cg": 9, + "sg": 9, + "vtg": 9, + "vcg": 9, + "vsg": 9, + "tt": 60000000000, + "ex": {} + } + ], + "Subcalls": null + } + ] + }, + "Error": "string value", + "Duration": 60000000000 + } + ] } ``` @@ -3936,7 +5022,7 @@ Inputs: ] ``` -Response: `null` +Response: `"Bw=="` ### StateGetRandomnessFromTickets StateGetRandomnessFromTickets is used to sample the chain for randomness. @@ -3961,7 +5047,7 @@ Inputs: ] ``` -Response: `null` +Response: `"Bw=="` ### StateGetReceipt StateGetReceipt returns the message receipt for the given message or for a @@ -4023,7 +5109,12 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + "f01234" +] +``` ### StateListMessages StateListMessages looks back and returns all messages with a matching to or from address, stopping at the given height. @@ -4050,7 +5141,14 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` ### StateListMiners StateListMiners returns the addresses of every miner that has claimed power in the Power Actor @@ -4072,7 +5170,12 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + "f01234" +] +``` ### StateLookupID StateLookupID retrieves the ID address of the given address @@ -4272,7 +5375,29 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "SectorNumber": 9, + "SealProof": 8, + "SealedCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "DealIDs": [ + 5432 + ], + "Activation": 10101, + "Expiration": 10101, + "DealWeight": "0", + "VerifiedDealWeight": "0", + "InitialPledge": "0", + "ExpectedDayReward": "0", + "ExpectedStoragePledge": "0", + "SectorKeyCID": null + } +] +``` ### StateMinerAvailableBalance StateMinerAvailableBalance returns the portion of a miner's balance that can be withdrawn or spent @@ -4318,7 +5443,18 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "PostSubmissions": [ + 5, + 1 + ], + "DisputableProofCount": 42 + } +] +``` ### StateMinerFaults StateMinerFaults returns a bitfield indicating the faulty sectors of the given miner @@ -4376,10 +5512,14 @@ Response: "Owner": "f01234", "Worker": "f01234", "NewWorker": "f01234", - "ControlAddresses": null, + "ControlAddresses": [ + "f01234" + ], "WorkerChangeEpoch": 10101, "PeerId": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", - "Multiaddrs": null, + "Multiaddrs": [ + "Ynl0ZSBhcnJheQ==" + ], "WindowPoStProofType": 8, "SectorSize": 34359738368, "WindowPoStPartitionSectors": 42, @@ -4404,7 +5544,9 @@ Inputs: "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, "SealRandEpoch": 10101, - "DealIDs": null, + "DealIDs": [ + 5432 + ], "Expiration": 10101, "ReplaceCapacity": true, "ReplaceSectorDeadline": 42, @@ -4446,7 +5588,33 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "AllSectors": [ + 5, + 1 + ], + "FaultySectors": [ + 5, + 1 + ], + "RecoveringSectors": [ + 5, + 1 + ], + "LiveSectors": [ + 5, + 1 + ], + "ActiveSectors": [ + 5, + 1 + ] + } +] +``` ### StateMinerPower StateMinerPower returns the power of the indicated miner @@ -4501,7 +5669,9 @@ Inputs: "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, "SealRandEpoch": 10101, - "DealIDs": null, + "DealIDs": [ + 5432 + ], "Expiration": 10101, "ReplaceCapacity": true, "ReplaceSectorDeadline": 42, @@ -4668,7 +5838,29 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "SectorNumber": 9, + "SealProof": 8, + "SealedCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "DealIDs": [ + 5432 + ], + "Activation": 10101, + "Expiration": 10101, + "DealWeight": "0", + "VerifiedDealWeight": "0", + "InitialPledge": "0", + "ExpectedDayReward": "0", + "ExpectedStoragePledge": "0", + "SectorKeyCID": null + } +] +``` ### StateNetworkName StateNetworkName returns the name of the network the node is synced to @@ -4834,8 +6026,73 @@ Response: }, "Error": "string value", "Duration": 60000000000, - "GasCharges": null, - "Subcalls": null + "GasCharges": [ + { + "Name": "string value", + "loc": [ + { + "File": "string value", + "Line": 123, + "Function": "string value" + } + ], + "tg": 9, + "cg": 9, + "sg": 9, + "vtg": 9, + "vcg": 9, + "vsg": 9, + "tt": 60000000000, + "ex": {} + } + ], + "Subcalls": [ + { + "Msg": { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + }, + "MsgRct": { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + }, + "Error": "string value", + "Duration": 60000000000, + "GasCharges": [ + { + "Name": "string value", + "loc": [ + { + "File": "string value", + "Line": 123, + "Function": "string value" + } + ], + "tg": 9, + "cg": 9, + "sg": 9, + "vtg": 9, + "vcg": 9, + "vsg": 9, + "tt": 60000000000, + "ex": {} + } + ], + "Subcalls": null + } + ] }, "Error": "string value", "Duration": 60000000000 @@ -5011,7 +6268,9 @@ Response: "SealedCID": { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, - "DealIDs": null, + "DealIDs": [ + 5432 + ], "Activation": 10101, "Expiration": 10101, "DealWeight": "0", @@ -5085,7 +6344,9 @@ Response: "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, "SealRandEpoch": 10101, - "DealIDs": null, + "DealIDs": [ + 5432 + ], "Expiration": 10101, "ReplaceCapacity": true, "ReplaceSectorDeadline": 42, @@ -5381,9 +6642,23 @@ Response: "WinCount": 9, "VRFProof": "Ynl0ZSBhcnJheQ==" }, - "BeaconEntries": null, - "WinPoStProof": null, - "Parents": null, + "BeaconEntries": [ + { + "Round": 42, + "Data": "Ynl0ZSBhcnJheQ==" + } + ], + "WinPoStProof": [ + { + "PoStProof": 8, + "ProofBytes": "Ynl0ZSBhcnJheQ==" + } + ], + "Parents": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + ], "ParentWeight": "0", "Height": 10101, "ParentStateRoot": { @@ -5438,7 +6713,26 @@ Inputs: `null` Response: ```json { - "ActiveSyncs": null, + "ActiveSyncs": [ + { + "WorkerID": 42, + "Base": { + "Cids": null, + "Blocks": null, + "Height": 0 + }, + "Target": { + "Cids": null, + "Blocks": null, + "Height": 0 + }, + "Stage": 1, + "Height": 10101, + "Start": "0001-01-01T00:00:00Z", + "End": "0001-01-01T00:00:00Z", + "Message": "string value" + } + ], "VMApplied": 42 } ``` @@ -5463,9 +6757,23 @@ Inputs: "WinCount": 9, "VRFProof": "Ynl0ZSBhcnJheQ==" }, - "BeaconEntries": null, - "WinPoStProof": null, - "Parents": null, + "BeaconEntries": [ + { + "Round": 42, + "Data": "Ynl0ZSBhcnJheQ==" + } + ], + "WinPoStProof": [ + { + "PoStProof": 8, + "ProofBytes": "Ynl0ZSBhcnJheQ==" + } + ], + "Parents": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + ], "ParentWeight": "0", "Height": 10101, "ParentStateRoot": { @@ -5489,8 +6797,16 @@ Inputs: "ForkSignaling": 42, "ParentBaseFee": "0" }, - "BlsMessages": null, - "SecpkMessages": null + "BlsMessages": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + ], + "SecpkMessages": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + ] } ] ``` @@ -5651,7 +6967,12 @@ Perms: write Inputs: `null` -Response: `null` +Response: +```json +[ + "f01234" +] +``` ### WalletNew WalletNew creates a new address in the wallet with the given sigType. diff --git a/documentation/en/api-v1-unstable-methods.md b/documentation/en/api-v1-unstable-methods.md index c1d6c76e0f4..24a14222491 100644 --- a/documentation/en/api-v1-unstable-methods.md +++ b/documentation/en/api-v1-unstable-methods.md @@ -305,7 +305,9 @@ Perms: admin Inputs: ```json [ - null + [ + "write" + ] ] ``` @@ -323,7 +325,12 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + "write" +] +``` ## Beacon The Beacon method group contains methods for interacting with the random beacon (DRAND) @@ -454,9 +461,23 @@ Response: "WinCount": 9, "VRFProof": "Ynl0ZSBhcnJheQ==" }, - "BeaconEntries": null, - "WinPoStProof": null, - "Parents": null, + "BeaconEntries": [ + { + "Round": 42, + "Data": "Ynl0ZSBhcnJheQ==" + } + ], + "WinPoStProof": [ + { + "PoStProof": 8, + "ProofBytes": "Ynl0ZSBhcnJheQ==" + } + ], + "Parents": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + ], "ParentWeight": "0", "Height": 10101, "ParentStateRoot": { @@ -511,9 +532,54 @@ Inputs: Response: ```json { - "BlsMessages": null, - "SecpkMessages": null, - "Cids": null + "BlsMessages": [ + { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } + ], + "SecpkMessages": [ + { + "Message": { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + }, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } + ], + "Cids": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + ] } ``` @@ -589,7 +655,31 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "Cid": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Message": { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } + } +] +``` ### ChainGetNode @@ -629,7 +719,31 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "Cid": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Message": { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } + } +] +``` ### ChainGetParentReceipts ChainGetParentReceipts returns receipts for messages in parent tipset of @@ -648,7 +762,16 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + } +] +``` ### ChainGetPath ChainGetPath returns a set of revert/apply operations needed to get from @@ -690,7 +813,19 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "Type": "string value", + "Val": { + "Cids": null, + "Blocks": null, + "Height": 0 + } + } +] +``` ### ChainGetTipSet ChainGetTipSet returns the tipset specified by the given TipSetKey. @@ -828,7 +963,19 @@ Perms: read Inputs: `null` -Response: `null` +Response: +```json +[ + { + "Type": "string value", + "Val": { + "Cids": null, + "Blocks": null, + "Height": 0 + } + } +] +``` ### ChainReadObj ChainReadObj reads ipld nodes referenced by the specified CID from chain @@ -1002,7 +1149,20 @@ Response: "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", "Transferred": 42, "Stages": { - "Stages": null + "Stages": [ + { + "Name": "string value", + "Description": "string value", + "CreatedTime": "0001-01-01T00:00:00Z", + "UpdatedTime": "0001-01-01T00:00:00Z", + "Logs": [ + { + "Log": "string value", + "UpdatedTime": "0001-01-01T00:00:00Z" + } + ] + } + ] } } ``` @@ -1069,7 +1229,12 @@ Inputs: "Root": { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, - "DAGs": null, + "DAGs": [ + { + "DataSelector": "Links/21/Hash/Links/42/Hash", + "ExportMerkleProof": true + } + ], "FromLocalCAR": "string value", "DealID": 5 }, @@ -1098,7 +1263,30 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "Err": "string value", + "Root": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Piece": null, + "Size": 42, + "MinPrice": "0", + "UnsealPrice": "0", + "PricePerByte": "0", + "PaymentInterval": 42, + "PaymentIntervalIncrease": 42, + "Miner": "f01234", + "MinerPeer": { + "Address": "f01234", + "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "PieceCID": null + } + } +] +``` ### ClientGenCar ClientGenCar generates a CAR file for the specified file. @@ -1143,7 +1331,21 @@ Response: "State": 42, "Message": "string value", "DealStages": { - "Stages": null + "Stages": [ + { + "Name": "string value", + "Description": "string value", + "ExpectedDuration": "string value", + "CreatedTime": "0001-01-01T00:00:00Z", + "UpdatedTime": "0001-01-01T00:00:00Z", + "Logs": [ + { + "Log": "string value", + "UpdatedTime": "0001-01-01T00:00:00Z" + } + ] + } + ] }, "Provider": "f01234", "DataRef": { @@ -1182,7 +1384,20 @@ Response: "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", "Transferred": 42, "Stages": { - "Stages": null + "Stages": [ + { + "Name": "string value", + "Description": "string value", + "CreatedTime": "0001-01-01T00:00:00Z", + "UpdatedTime": "0001-01-01T00:00:00Z", + "Logs": [ + { + "Log": "string value", + "UpdatedTime": "0001-01-01T00:00:00Z" + } + ] + } + ] } } } @@ -1220,7 +1435,21 @@ Response: "State": 42, "Message": "string value", "DealStages": { - "Stages": null + "Stages": [ + { + "Name": "string value", + "Description": "string value", + "ExpectedDuration": "string value", + "CreatedTime": "0001-01-01T00:00:00Z", + "UpdatedTime": "0001-01-01T00:00:00Z", + "Logs": [ + { + "Log": "string value", + "UpdatedTime": "0001-01-01T00:00:00Z" + } + ] + } + ] }, "Provider": "f01234", "DataRef": { @@ -1259,7 +1488,20 @@ Response: "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", "Transferred": 42, "Stages": { - "Stages": null + "Stages": [ + { + "Name": "string value", + "Description": "string value", + "CreatedTime": "0001-01-01T00:00:00Z", + "UpdatedTime": "0001-01-01T00:00:00Z", + "Logs": [ + { + "Log": "string value", + "UpdatedTime": "0001-01-01T00:00:00Z" + } + ] + } + ] } } } @@ -1307,7 +1549,20 @@ Response: "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", "Transferred": 42, "Stages": { - "Stages": null + "Stages": [ + { + "Name": "string value", + "Description": "string value", + "CreatedTime": "0001-01-01T00:00:00Z", + "UpdatedTime": "0001-01-01T00:00:00Z", + "Logs": [ + { + "Log": "string value", + "UpdatedTime": "0001-01-01T00:00:00Z" + } + ] + } + ] } }, "Event": 5 @@ -1365,7 +1620,40 @@ Perms: write Inputs: `null` -Response: `null` +Response: +```json +[ + { + "TransferID": 3, + "Status": 1, + "BaseCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "IsInitiator": true, + "IsSender": true, + "Voucher": "string value", + "Message": "string value", + "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Transferred": 42, + "Stages": { + "Stages": [ + { + "Name": "string value", + "Description": "string value", + "CreatedTime": "0001-01-01T00:00:00Z", + "UpdatedTime": "0001-01-01T00:00:00Z", + "Logs": [ + { + "Log": "string value", + "UpdatedTime": "0001-01-01T00:00:00Z" + } + ] + } + ] + } + } +] +``` ### ClientListDeals ClientListDeals returns information about the deals made by the local client. @@ -1375,7 +1663,88 @@ Perms: write Inputs: `null` -Response: `null` +Response: +```json +[ + { + "ProposalCid": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "State": 42, + "Message": "string value", + "DealStages": { + "Stages": [ + { + "Name": "string value", + "Description": "string value", + "ExpectedDuration": "string value", + "CreatedTime": "0001-01-01T00:00:00Z", + "UpdatedTime": "0001-01-01T00:00:00Z", + "Logs": [ + { + "Log": "string value", + "UpdatedTime": "0001-01-01T00:00:00Z" + } + ] + } + ] + }, + "Provider": "f01234", + "DataRef": { + "TransferType": "string value", + "Root": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "PieceCid": null, + "PieceSize": 1024, + "RawBlockSize": 42 + }, + "PieceCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Size": 42, + "PricePerEpoch": "0", + "Duration": 42, + "DealID": 5432, + "CreationTime": "0001-01-01T00:00:00Z", + "Verified": true, + "TransferChannelID": { + "Initiator": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Responder": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "ID": 3 + }, + "DataTransfer": { + "TransferID": 3, + "Status": 1, + "BaseCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "IsInitiator": true, + "IsSender": true, + "Voucher": "string value", + "Message": "string value", + "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Transferred": 42, + "Stages": { + "Stages": [ + { + "Name": "string value", + "Description": "string value", + "CreatedTime": "0001-01-01T00:00:00Z", + "UpdatedTime": "0001-01-01T00:00:00Z", + "Logs": [ + { + "Log": "string value", + "UpdatedTime": "0001-01-01T00:00:00Z" + } + ] + } + ] + } + } + } +] +``` ### ClientListImports ClientListImports lists imported files and their root CIDs @@ -1385,7 +1754,19 @@ Perms: write Inputs: `null` -Response: `null` +Response: +```json +[ + { + "Key": 50, + "Err": "string value", + "Root": null, + "Source": "string value", + "FilePath": "string value", + "CARPath": "string value" + } +] +``` ### ClientListRetrievals ClientListRetrievals returns information about retrievals made by the local client @@ -1395,7 +1776,61 @@ Perms: write Inputs: `null` -Response: `null` +Response: +```json +[ + { + "PayloadCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "ID": 5, + "PieceCID": null, + "PricePerByte": "0", + "UnsealPrice": "0", + "Status": 0, + "Message": "string value", + "Provider": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "BytesReceived": 42, + "BytesPaidFor": 42, + "TotalPaid": "0", + "TransferChannelID": { + "Initiator": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Responder": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "ID": 3 + }, + "DataTransfer": { + "TransferID": 3, + "Status": 1, + "BaseCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "IsInitiator": true, + "IsSender": true, + "Voucher": "string value", + "Message": "string value", + "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Transferred": 42, + "Stages": { + "Stages": [ + { + "Name": "string value", + "Description": "string value", + "CreatedTime": "0001-01-01T00:00:00Z", + "UpdatedTime": "0001-01-01T00:00:00Z", + "Logs": [ + { + "Log": "string value", + "UpdatedTime": "0001-01-01T00:00:00Z" + } + ] + } + ] + } + }, + "Event": 5 + } +] +``` ### ClientMinerQueryOffer ClientMinerQueryOffer returns a QueryOffer for the specific miner and file. @@ -1837,7 +2272,28 @@ Perms: admin Inputs: `null` -Response: `null` +Response: +```json +[ + { + "Type": { + "System": "string value", + "Subsystem": "string value" + }, + "Active": true, + "LastActive": { + "Type": "string value", + "Message": "json raw message", + "Time": "0001-01-01T00:00:00Z" + }, + "LastResolved": { + "Type": "string value", + "Message": "json raw message", + "Time": "0001-01-01T00:00:00Z" + } + } +] +``` ### LogList @@ -1846,7 +2302,12 @@ Perms: write Inputs: `null` -Response: `null` +Response: +```json +[ + "string value" +] +``` ### LogSetLevel @@ -1991,12 +2452,47 @@ Inputs: "WinCount": 9, "VRFProof": "Ynl0ZSBhcnJheQ==" }, - "BeaconValues": null, - "Messages": null, - "Epoch": 10101, - "Timestamp": 42, - "WinningPoStProof": null - } + "BeaconValues": [ + { + "Round": 42, + "Data": "Ynl0ZSBhcnJheQ==" + } + ], + "Messages": [ + { + "Message": { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + }, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } + ], + "Epoch": 10101, + "Timestamp": 42, + "WinningPoStProof": [ + { + "PoStProof": 8, + "ProofBytes": "Ynl0ZSBhcnJheQ==" + } + ] + } ] ``` @@ -2012,9 +2508,23 @@ Response: "WinCount": 9, "VRFProof": "Ynl0ZSBhcnJheQ==" }, - "BeaconEntries": null, - "WinPoStProof": null, - "Parents": null, + "BeaconEntries": [ + { + "Round": 42, + "Data": "Ynl0ZSBhcnJheQ==" + } + ], + "WinPoStProof": [ + { + "PoStProof": 8, + "ProofBytes": "Ynl0ZSBhcnJheQ==" + } + ], + "Parents": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + ], "ParentWeight": "0", "Height": 10101, "ParentStateRoot": { @@ -2038,8 +2548,16 @@ Response: "ForkSignaling": 42, "ParentBaseFee": "0" }, - "BlsMessages": null, - "SecpkMessages": null + "BlsMessages": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + ], + "SecpkMessages": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + ] } ``` @@ -2069,14 +2587,27 @@ Response: { "MinerPower": "0", "NetworkPower": "0", - "Sectors": null, + "Sectors": [ + { + "SealProof": 8, + "SectorNumber": 9, + "SealedCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + } + ], "WorkerKey": "f01234", "SectorSize": 34359738368, "PrevBeaconEntry": { "Round": 42, "Data": "Ynl0ZSBhcnJheQ==" }, - "BeaconEntries": null, + "BeaconEntries": [ + { + "Round": 42, + "Data": "Ynl0ZSBhcnJheQ==" + } + ], "EligibleForMining": true } ``` @@ -2095,11 +2626,43 @@ Perms: write Inputs: ```json [ - null + [ + { + "Message": { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + }, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } + ] ] ``` -Response: `null` +Response: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` ### MpoolBatchPushMessage MpoolBatchPushMessage batch pushes a unsigned message to mempool. @@ -2110,14 +2673,58 @@ Perms: sign Inputs: ```json [ - null, + [ + { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } + ], { "MaxFee": "0" } ] ``` -Response: `null` +Response: +```json +[ + { + "Message": { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + }, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } +] +``` ### MpoolBatchPushUntrusted MpoolBatchPushUntrusted batch pushes a signed message to mempool from untrusted sources. @@ -2128,11 +2735,43 @@ Perms: write Inputs: ```json [ - null + [ + { + "Message": { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + }, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } + ] ] ``` -Response: `null` +Response: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` ### MpoolCheckMessages MpoolCheckMessages performs logical checks on a batch of messages @@ -2143,11 +2782,47 @@ Perms: read Inputs: ```json [ - null + [ + { + "Message": { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + }, + "ValidNonce": true + } + ] ] ``` -Response: `null` +Response: +```json +[ + [ + { + "Cid": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Code": 0, + "OK": true, + "Err": "string value", + "Hint": { + "abc": 123 + } + } + ] +] +``` ### MpoolCheckPendingMessages MpoolCheckPendingMessages performs logical checks for all pending messages from a given address @@ -2162,7 +2837,24 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + [ + { + "Cid": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Code": 0, + "OK": true, + "Err": "string value", + "Hint": { + "abc": 123 + } + } + ] +] +``` ### MpoolCheckReplaceMessages MpoolCheckReplaceMessages performs logical checks on pending messages with replacement @@ -2173,11 +2865,44 @@ Perms: read Inputs: ```json [ - null + [ + { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } + ] ] ``` -Response: `null` +Response: +```json +[ + [ + { + "Cid": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Code": 0, + "OK": true, + "Err": "string value", + "Hint": { + "abc": 123 + } + } + ] +] +``` ### MpoolClear MpoolClear clears pending messages from the mpool @@ -2205,7 +2930,9 @@ Inputs: `null` Response: ```json { - "PriorityAddrs": null, + "PriorityAddrs": [ + "f01234" + ], "SizeLimitHigh": 123, "SizeLimitLow": 123, "ReplaceByFeeRatio": 12.3, @@ -2250,7 +2977,35 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "Message": { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + }, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } +] +``` ### MpoolPush MpoolPush pushes a signed message to mempool. @@ -2422,7 +3177,35 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "Message": { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + }, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } +] +``` ### MpoolSetConfig MpoolSetConfig sets the mpool config to (a copy of) the supplied config @@ -2434,7 +3217,9 @@ Inputs: ```json [ { - "PriorityAddrs": null, + "PriorityAddrs": [ + "f01234" + ], "SizeLimitHigh": 123, "SizeLimitLow": 123, "ReplaceByFeeRatio": 12.3, @@ -2790,7 +3575,9 @@ Inputs: ```json [ 42, - null, + [ + "f01234" + ], 10101, "0", "f01234", @@ -2866,7 +3653,21 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "ID": 9, + "To": "f01234", + "Value": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "Approved": [ + "f01234" + ] + } +] +``` ### MsigGetVested MsigGetVested returns the amount of FIL that vested in a multisig in a certain period. @@ -3151,7 +3952,9 @@ Response: ```json { "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", - "Addrs": [] + "Addrs": [ + "/ip4/52.36.61.156/tcp/1347/p2p/12D3KooWFETiESTf1v4PGUvtnxMAcEFMzLZbJGg4tjWfGEimYior" + ] } ``` @@ -3248,9 +4051,15 @@ Inputs: ```json [ { - "Peers": null, - "IPAddrs": null, - "IPSubnets": null + "Peers": [ + "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf" + ], + "IPAddrs": [ + "string value" + ], + "IPSubnets": [ + "string value" + ] } ] ``` @@ -3267,9 +4076,15 @@ Inputs: `null` Response: ```json { - "Peers": null, - "IPAddrs": null, - "IPSubnets": null + "Peers": [ + "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf" + ], + "IPAddrs": [ + "string value" + ], + "IPSubnets": [ + "string value" + ] } ``` @@ -3282,9 +4097,15 @@ Inputs: ```json [ { - "Peers": null, - "IPAddrs": null, - "IPSubnets": null + "Peers": [ + "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf" + ], + "IPAddrs": [ + "string value" + ], + "IPSubnets": [ + "string value" + ] } ] ``` @@ -3301,7 +4122,9 @@ Inputs: [ { "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", - "Addrs": [] + "Addrs": [ + "/ip4/52.36.61.156/tcp/1347/p2p/12D3KooWFETiESTf1v4PGUvtnxMAcEFMzLZbJGg4tjWfGEimYior" + ] } ] ``` @@ -3352,7 +4175,9 @@ Response: ```json { "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", - "Addrs": [] + "Addrs": [ + "/ip4/52.36.61.156/tcp/1347/p2p/12D3KooWFETiESTf1v4PGUvtnxMAcEFMzLZbJGg4tjWfGEimYior" + ] } ``` @@ -3373,8 +4198,12 @@ Response: { "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", "Agent": "string value", - "Addrs": null, - "Protocols": null, + "Addrs": [ + "string value" + ], + "Protocols": [ + "string value" + ], "ConnMgrMeta": { "FirstSeen": "0001-01-01T00:00:00Z", "Value": 123, @@ -3395,7 +4224,17 @@ Perms: read Inputs: `null` -Response: `null` +Response: +```json +[ + { + "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Addrs": [ + "/ip4/52.36.61.156/tcp/1347/p2p/12D3KooWFETiESTf1v4PGUvtnxMAcEFMzLZbJGg4tjWfGEimYior" + ] + } +] +``` ### NetPubsubScores @@ -3404,7 +4243,28 @@ Perms: read Inputs: `null` -Response: `null` +Response: +```json +[ + { + "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Score": { + "Score": 12.3, + "Topics": { + "/blocks": { + "TimeInMesh": 60000000000, + "FirstMessageDeliveries": 122, + "MeshMessageDeliveries": 1234, + "InvalidMessageDeliveries": 3 + } + }, + "AppSpecificScore": 12.3, + "IPColocationFactor": 12.3, + "BehaviourPenalty": 12.3 + } + } +] +``` ## Node These methods are general node management and status commands @@ -3577,7 +4437,12 @@ Perms: read Inputs: `null` -Response: `null` +Response: +```json +[ + "f01234" +] +``` ### PaychNewPayment @@ -3589,7 +4454,19 @@ Inputs: [ "f01234", "f01234", - null + [ + { + "Amount": "0", + "TimeLockMin": 10101, + "TimeLockMax": 10101, + "MinSettle": 10101, + "Extra": { + "Actor": "f01234", + "Method": 1, + "Data": "Ynl0ZSBhcnJheQ==" + } + } + ] ] ``` @@ -3600,7 +4477,33 @@ Response: "WaitSentinel": { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, - "Vouchers": null + "Vouchers": [ + { + "ChannelAddr": "f01234", + "TimeLockMin": 10101, + "TimeLockMax": 10101, + "SecretPreimage": "Ynl0ZSBhcnJheQ==", + "Extra": { + "Actor": "f01234", + "Method": 1, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "Lane": 42, + "Nonce": 42, + "Amount": "0", + "MinSettleHeight": 10101, + "Merges": [ + { + "Lane": 42, + "Nonce": 42 + } + ], + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + } + } + ] } ``` @@ -3666,7 +4569,12 @@ Inputs: "Nonce": 42, "Amount": "0", "MinSettleHeight": 10101, - "Merges": null, + "Merges": [ + { + "Lane": 42, + "Nonce": 42 + } + ], "Signature": { "Type": 2, "Data": "Ynl0ZSBhcnJheQ==" @@ -3702,7 +4610,12 @@ Inputs: "Nonce": 42, "Amount": "0", "MinSettleHeight": 10101, - "Merges": null, + "Merges": [ + { + "Lane": 42, + "Nonce": 42 + } + ], "Signature": { "Type": 2, "Data": "Ynl0ZSBhcnJheQ==" @@ -3738,7 +4651,12 @@ Inputs: "Nonce": 42, "Amount": "0", "MinSettleHeight": 10101, - "Merges": null, + "Merges": [ + { + "Lane": 42, + "Nonce": 42 + } + ], "Signature": { "Type": 2, "Data": "Ynl0ZSBhcnJheQ==" @@ -3780,7 +4698,12 @@ Response: "Nonce": 42, "Amount": "0", "MinSettleHeight": 10101, - "Merges": null, + "Merges": [ + { + "Lane": 42, + "Nonce": 42 + } + ], "Signature": { "Type": 2, "Data": "Ynl0ZSBhcnJheQ==" @@ -3802,7 +4725,36 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "ChannelAddr": "f01234", + "TimeLockMin": 10101, + "TimeLockMax": 10101, + "SecretPreimage": "Ynl0ZSBhcnJheQ==", + "Extra": { + "Actor": "f01234", + "Method": 1, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "Lane": 42, + "Nonce": 42, + "Amount": "0", + "MinSettleHeight": 10101, + "Merges": [ + { + "Lane": 42, + "Nonce": 42 + } + ], + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + } + } +] +``` ### PaychVoucherSubmit @@ -3827,7 +4779,12 @@ Inputs: "Nonce": 42, "Amount": "0", "MinSettleHeight": 10101, - "Merges": null, + "Merges": [ + { + "Lane": 42, + "Nonce": 42 + } + ], "Signature": { "Type": 2, "Data": "Ynl0ZSBhcnJheQ==" @@ -3895,7 +4852,15 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "Miner": "f01234", + "Epoch": 10101 + } +] +``` ### StateCall StateCall runs the given message and returns its result without any persisted changes. @@ -3997,8 +4962,73 @@ Response: }, "Error": "string value", "Duration": 60000000000, - "GasCharges": null, - "Subcalls": null + "GasCharges": [ + { + "Name": "string value", + "loc": [ + { + "File": "string value", + "Line": 123, + "Function": "string value" + } + ], + "tg": 9, + "cg": 9, + "sg": 9, + "vtg": 9, + "vcg": 9, + "vsg": 9, + "tt": 60000000000, + "ex": {} + } + ], + "Subcalls": [ + { + "Msg": { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + }, + "MsgRct": { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + }, + "Error": "string value", + "Duration": 60000000000, + "GasCharges": [ + { + "Name": "string value", + "loc": [ + { + "File": "string value", + "Line": 123, + "Function": "string value" + } + ], + "tg": 9, + "cg": 9, + "sg": 9, + "vtg": 9, + "vcg": 9, + "vsg": 9, + "tt": 60000000000, + "ex": {} + } + ], + "Subcalls": null + } + ] }, "Error": "string value", "Duration": 60000000000 @@ -4104,7 +5134,23 @@ Inputs: ```json [ 10101, - null, + [ + { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } + ], [ { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" @@ -4122,7 +5168,138 @@ Response: "Root": { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, - "Trace": null + "Trace": [ + { + "MsgCid": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Msg": { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + }, + "MsgRct": { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + }, + "GasCost": { + "Message": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "GasUsed": "0", + "BaseFeeBurn": "0", + "OverEstimationBurn": "0", + "MinerPenalty": "0", + "MinerTip": "0", + "Refund": "0", + "TotalCost": "0" + }, + "ExecutionTrace": { + "Msg": { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + }, + "MsgRct": { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + }, + "Error": "string value", + "Duration": 60000000000, + "GasCharges": [ + { + "Name": "string value", + "loc": [ + { + "File": "string value", + "Line": 123, + "Function": "string value" + } + ], + "tg": 9, + "cg": 9, + "sg": 9, + "vtg": 9, + "vcg": 9, + "vsg": 9, + "tt": 60000000000, + "ex": {} + } + ], + "Subcalls": [ + { + "Msg": { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + }, + "MsgRct": { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + }, + "Error": "string value", + "Duration": 60000000000, + "GasCharges": [ + { + "Name": "string value", + "loc": [ + { + "File": "string value", + "Line": 123, + "Function": "string value" + } + ], + "tg": 9, + "cg": 9, + "sg": 9, + "vtg": 9, + "vcg": 9, + "vsg": 9, + "tt": 60000000000, + "ex": {} + } + ], + "Subcalls": null + } + ] + }, + "Error": "string value", + "Duration": 60000000000 + } + ] } ``` @@ -4195,7 +5372,7 @@ Inputs: "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, 1, - null + "json raw message" ] ``` @@ -4259,7 +5436,7 @@ Inputs: ] ``` -Response: `null` +Response: `"Bw=="` ### StateGetRandomnessFromTickets StateGetRandomnessFromTickets is used to sample the chain for randomness. @@ -4284,7 +5461,7 @@ Inputs: ] ``` -Response: `null` +Response: `"Bw=="` ### StateListActors StateListActors returns the addresses of every actor in the state @@ -4306,7 +5483,12 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + "f01234" +] +``` ### StateListMessages StateListMessages looks back and returns all messages with a matching to or from address, stopping at the given height. @@ -4333,7 +5515,14 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` ### StateListMiners StateListMiners returns the addresses of every miner that has claimed power in the Power Actor @@ -4355,7 +5544,12 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + "f01234" +] +``` ### StateLookupID StateLookupID retrieves the ID address of the given address @@ -4555,7 +5749,29 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "SectorNumber": 9, + "SealProof": 8, + "SealedCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "DealIDs": [ + 5432 + ], + "Activation": 10101, + "Expiration": 10101, + "DealWeight": "0", + "VerifiedDealWeight": "0", + "InitialPledge": "0", + "ExpectedDayReward": "0", + "ExpectedStoragePledge": "0", + "SectorKeyCID": null + } +] +``` ### StateMinerAvailableBalance StateMinerAvailableBalance returns the portion of a miner's balance that can be withdrawn or spent @@ -4601,7 +5817,18 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "PostSubmissions": [ + 5, + 1 + ], + "DisputableProofCount": 42 + } +] +``` ### StateMinerFaults StateMinerFaults returns a bitfield indicating the faulty sectors of the given miner @@ -4659,10 +5886,14 @@ Response: "Owner": "f01234", "Worker": "f01234", "NewWorker": "f01234", - "ControlAddresses": null, + "ControlAddresses": [ + "f01234" + ], "WorkerChangeEpoch": 10101, "PeerId": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", - "Multiaddrs": null, + "Multiaddrs": [ + "Ynl0ZSBhcnJheQ==" + ], "WindowPoStProofType": 8, "SectorSize": 34359738368, "WindowPoStPartitionSectors": 42, @@ -4687,7 +5918,9 @@ Inputs: "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, "SealRandEpoch": 10101, - "DealIDs": null, + "DealIDs": [ + 5432 + ], "Expiration": 10101, "ReplaceCapacity": true, "ReplaceSectorDeadline": 42, @@ -4729,7 +5962,33 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "AllSectors": [ + 5, + 1 + ], + "FaultySectors": [ + 5, + 1 + ], + "RecoveringSectors": [ + 5, + 1 + ], + "LiveSectors": [ + 5, + 1 + ], + "ActiveSectors": [ + 5, + 1 + ] + } +] +``` ### StateMinerPower StateMinerPower returns the power of the indicated miner @@ -4784,7 +6043,9 @@ Inputs: "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, "SealRandEpoch": 10101, - "DealIDs": null, + "DealIDs": [ + 5432 + ], "Expiration": 10101, "ReplaceCapacity": true, "ReplaceSectorDeadline": 42, @@ -4951,7 +6212,29 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "SectorNumber": 9, + "SealProof": 8, + "SealedCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "DealIDs": [ + 5432 + ], + "Activation": 10101, + "Expiration": 10101, + "DealWeight": "0", + "VerifiedDealWeight": "0", + "InitialPledge": "0", + "ExpectedDayReward": "0", + "ExpectedStoragePledge": "0", + "SectorKeyCID": null + } +] +``` ### StateNetworkName StateNetworkName returns the name of the network the node is synced to @@ -5117,8 +6400,73 @@ Response: }, "Error": "string value", "Duration": 60000000000, - "GasCharges": null, - "Subcalls": null + "GasCharges": [ + { + "Name": "string value", + "loc": [ + { + "File": "string value", + "Line": 123, + "Function": "string value" + } + ], + "tg": 9, + "cg": 9, + "sg": 9, + "vtg": 9, + "vcg": 9, + "vsg": 9, + "tt": 60000000000, + "ex": {} + } + ], + "Subcalls": [ + { + "Msg": { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + }, + "MsgRct": { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + }, + "Error": "string value", + "Duration": 60000000000, + "GasCharges": [ + { + "Name": "string value", + "loc": [ + { + "File": "string value", + "Line": 123, + "Function": "string value" + } + ], + "tg": 9, + "cg": 9, + "sg": 9, + "vtg": 9, + "vcg": 9, + "vsg": 9, + "tt": 60000000000, + "ex": {} + } + ], + "Subcalls": null + } + ] }, "Error": "string value", "Duration": 60000000000 @@ -5251,7 +6599,9 @@ Response: "SealedCID": { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, - "DealIDs": null, + "DealIDs": [ + 5432 + ], "Activation": 10101, "Expiration": 10101, "DealWeight": "0", @@ -5325,7 +6675,9 @@ Response: "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, "SealRandEpoch": 10101, - "DealIDs": null, + "DealIDs": [ + 5432 + ], "Expiration": 10101, "ReplaceCapacity": true, "ReplaceSectorDeadline": 42, @@ -5568,9 +6920,23 @@ Response: "WinCount": 9, "VRFProof": "Ynl0ZSBhcnJheQ==" }, - "BeaconEntries": null, - "WinPoStProof": null, - "Parents": null, + "BeaconEntries": [ + { + "Round": 42, + "Data": "Ynl0ZSBhcnJheQ==" + } + ], + "WinPoStProof": [ + { + "PoStProof": 8, + "ProofBytes": "Ynl0ZSBhcnJheQ==" + } + ], + "Parents": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + ], "ParentWeight": "0", "Height": 10101, "ParentStateRoot": { @@ -5625,7 +6991,26 @@ Inputs: `null` Response: ```json { - "ActiveSyncs": null, + "ActiveSyncs": [ + { + "WorkerID": 42, + "Base": { + "Cids": null, + "Blocks": null, + "Height": 0 + }, + "Target": { + "Cids": null, + "Blocks": null, + "Height": 0 + }, + "Stage": 1, + "Height": 10101, + "Start": "0001-01-01T00:00:00Z", + "End": "0001-01-01T00:00:00Z", + "Message": "string value" + } + ], "VMApplied": 42 } ``` @@ -5650,9 +7035,23 @@ Inputs: "WinCount": 9, "VRFProof": "Ynl0ZSBhcnJheQ==" }, - "BeaconEntries": null, - "WinPoStProof": null, - "Parents": null, + "BeaconEntries": [ + { + "Round": 42, + "Data": "Ynl0ZSBhcnJheQ==" + } + ], + "WinPoStProof": [ + { + "PoStProof": 8, + "ProofBytes": "Ynl0ZSBhcnJheQ==" + } + ], + "Parents": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + ], "ParentWeight": "0", "Height": 10101, "ParentStateRoot": { @@ -5676,8 +7075,16 @@ Inputs: "ForkSignaling": 42, "ParentBaseFee": "0" }, - "BlsMessages": null, - "SecpkMessages": null + "BlsMessages": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + ], + "SecpkMessages": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + ] } ] ``` @@ -5838,7 +7245,12 @@ Perms: write Inputs: `null` -Response: `null` +Response: +```json +[ + "f01234" +] +``` ### WalletNew WalletNew creates a new address in the wallet with the given sigType. From 2c3d0d826d1f4ec9d77ee4552f658ad8751bdb36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Tue, 4 Jan 2022 17:23:17 +0000 Subject: [PATCH 153/393] tvx runner: use network version from variant. --- conformance/driver.go | 22 +++++++++------------- conformance/runner.go | 19 +++++++++++-------- 2 files changed, 20 insertions(+), 21 deletions(-) diff --git a/conformance/driver.go b/conformance/driver.go index 6df7b911549..a065d15305d 100644 --- a/conformance/driver.go +++ b/conformance/driver.go @@ -5,6 +5,8 @@ import ( gobig "math/big" "os" + "github.com/filecoin-project/go-state-types/network" + "github.com/filecoin-project/lotus/blockstore" "github.com/filecoin-project/lotus/chain/consensus/filcns" "github.com/filecoin-project/lotus/chain/state" @@ -187,11 +189,12 @@ func (d *Driver) ExecuteTipset(bs blockstore.Blockstore, ds ds.Batching, params } type ExecuteMessageParams struct { - Preroot cid.Cid - Epoch abi.ChainEpoch - Message *types.Message - CircSupply abi.TokenAmount - BaseFee abi.TokenAmount + Preroot cid.Cid + Epoch abi.ChainEpoch + Message *types.Message + CircSupply abi.TokenAmount + BaseFee abi.TokenAmount + NetworkVersion network.Version // Rand is an optional vm.Rand implementation to use. If nil, the driver // will use a vm.Rand that returns a fixed value for all calls. @@ -210,13 +213,6 @@ func (d *Driver) ExecuteMessage(bs blockstore.Blockstore, params ExecuteMessageP params.Rand = NewFixedRand() } - // dummy state manager; only to reference the GetNetworkVersion method, - // which does not depend on state. - sm, err := stmgr.NewStateManager(nil, filcns.NewTipSetExecutor(), nil, filcns.DefaultUpgradeSchedule(), nil) - if err != nil { - return nil, cid.Cid{}, err - } - vmOpts := &vm.VMOpts{ StateBase: params.Preroot, Epoch: params.Epoch, @@ -227,7 +223,7 @@ func (d *Driver) ExecuteMessage(bs blockstore.Blockstore, params ExecuteMessageP }, Rand: params.Rand, BaseFee: params.BaseFee, - NetworkVersion: sm.GetNetworkVersion(context.Background(), params.Epoch), + NetworkVersion: params.NetworkVersion, } lvm, err := vm.NewVM(context.TODO(), vmOpts) diff --git a/conformance/runner.go b/conformance/runner.go index e597f0bbefd..1f35f034c9d 100644 --- a/conformance/runner.go +++ b/conformance/runner.go @@ -14,6 +14,7 @@ import ( "github.com/fatih/color" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/exitcode" + "github.com/filecoin-project/go-state-types/network" "github.com/hashicorp/go-multierror" blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-blockservice" @@ -54,7 +55,8 @@ var TipsetVectorOpts struct { func ExecuteMessageVector(r Reporter, vector *schema.TestVector, variant *schema.Variant) (diffs []string, err error) { var ( ctx = context.Background() - baseEpoch = variant.Epoch + baseEpoch = abi.ChainEpoch(variant.Epoch) + nv = network.Version(variant.NetworkVersion) root = vector.Pre.StateTree.RootCID ) @@ -76,18 +78,19 @@ func ExecuteMessageVector(r Reporter, vector *schema.TestVector, variant *schema // add the epoch offset if one is set. if m.EpochOffset != nil { - baseEpoch += *m.EpochOffset + baseEpoch += abi.ChainEpoch(*m.EpochOffset) } // Execute the message. var ret *vm.ApplyRet ret, root, err = driver.ExecuteMessage(bs, ExecuteMessageParams{ - Preroot: root, - Epoch: abi.ChainEpoch(baseEpoch), - Message: msg, - BaseFee: BaseFeeOrDefault(vector.Pre.BaseFee), - CircSupply: CircSupplyOrDefault(vector.Pre.CircSupply), - Rand: NewReplayingRand(r, vector.Randomness), + Preroot: root, + Epoch: baseEpoch, + Message: msg, + BaseFee: BaseFeeOrDefault(vector.Pre.BaseFee), + CircSupply: CircSupplyOrDefault(vector.Pre.CircSupply), + Rand: NewReplayingRand(r, vector.Randomness), + NetworkVersion: nv, }) if err != nil { r.Fatalf("fatal failure when executing message: %s", err) From d4fa5a0f1db6f6bd6e4a97dd9735d39ae7c98b1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Tue, 4 Jan 2022 17:23:54 +0000 Subject: [PATCH 154/393] tvx runner: adjust gas pricing to cope with synthetic epochs. --- chain/vm/gas.go | 11 +++++---- conformance/runner.go | 52 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 4 deletions(-) diff --git a/chain/vm/gas.go b/chain/vm/gas.go index 27d9c8d94ae..c6f8810f2f1 100644 --- a/chain/vm/gas.go +++ b/chain/vm/gas.go @@ -10,8 +10,9 @@ import ( addr "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/build" "github.com/ipfs/go-cid" + + "github.com/filecoin-project/lotus/build" ) type GasCharge struct { @@ -81,7 +82,9 @@ type Pricelist interface { OnVerifyConsensusFault() GasCharge } -var prices = map[abi.ChainEpoch]Pricelist{ +// Prices are the price lists per starting epoch. Public for testing purposes +// (concretely to allow the test vector runner to rebase prices). +var Prices = map[abi.ChainEpoch]Pricelist{ abi.ChainEpoch(0): &pricelistV0{ computeGasMulti: 1, storageGasMulti: 1000, @@ -214,8 +217,8 @@ func PricelistByEpoch(epoch abi.ChainEpoch) Pricelist { // since we are storing the prices as map or epoch to price // we need to get the price with the highest epoch that is lower or equal to the `epoch` arg bestEpoch := abi.ChainEpoch(0) - bestPrice := prices[bestEpoch] - for e, pl := range prices { + bestPrice := Prices[bestEpoch] + for e, pl := range Prices { // if `e` happened after `bestEpoch` and `e` is earlier or equal to the target `epoch` if e > bestEpoch && e <= epoch { bestEpoch = e diff --git a/conformance/runner.go b/conformance/runner.go index 1f35f034c9d..3dfedc748ce 100644 --- a/conformance/runner.go +++ b/conformance/runner.go @@ -7,6 +7,7 @@ import ( "encoding/base64" "fmt" "io/ioutil" + "math" "os" "os/exec" "strconv" @@ -28,6 +29,7 @@ import ( "github.com/filecoin-project/test-vectors/schema" "github.com/filecoin-project/lotus/blockstore" + "github.com/filecoin-project/lotus/chain/consensus/filcns" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/chain/vm" ) @@ -51,6 +53,52 @@ var TipsetVectorOpts struct { OnTipsetApplied []func(bs blockstore.Blockstore, params *ExecuteTipsetParams, res *ExecuteTipsetResult) } +type GasPricingRestoreFn func() + +// adjustGasPricing adjusts the global gas price mapping to make sure that the +// gas pricelist for vector's network version is used at the vector's epoch. +// Because it manipulates a global, it returns a function that reverts the +// change. The caller MUST invoke this function or the test vector runner will +// become invalid. +func adjustGasPricing(vectorEpoch abi.ChainEpoch, vectorNv network.Version) GasPricingRestoreFn { + // Stash the current pricing mapping. + // Ok to take a reference instead of a copy, because we override the map + // with a new one below. + var old = vm.Prices + + // Resolve the epoch at which the vector network version kicks in. + var epoch abi.ChainEpoch = math.MaxInt64 + if vectorNv == network.Version0 { + // genesis is not an upgrade. + epoch = 0 + } else { + for _, u := range filcns.DefaultUpgradeSchedule() { + if u.Network == vectorNv { + epoch = u.Height + break + } + } + } + + if epoch == math.MaxInt64 { + panic(fmt.Sprintf("could not resolve network version %d to height", vectorNv)) + } + + // Find the right pricelist for this network version. + pricelist := vm.PricelistByEpoch(epoch) + + // Override the pricing mapping by setting the relevant pricelist for the + // network version at the epoch where the vector runs. + vm.Prices = map[abi.ChainEpoch]vm.Pricelist{ + vectorEpoch: pricelist, + } + + // Return a function to restore the original mapping. + return func() { + vm.Prices = old + } +} + // ExecuteMessageVector executes a message-class test vector. func ExecuteMessageVector(r Reporter, vector *schema.TestVector, variant *schema.Variant) (diffs []string, err error) { var ( @@ -69,6 +117,10 @@ func ExecuteMessageVector(r Reporter, vector *schema.TestVector, variant *schema // Create a new Driver. driver := NewDriver(ctx, vector.Selector, DriverOpts{DisableVMFlush: true}) + // Monkey patch the gas pricing. + revertFn := adjustGasPricing(baseEpoch, nv) + defer revertFn() + // Apply every message. for i, m := range vector.ApplyMessages { msg, err := types.DecodeMessage(m.Bytes) From 1215f26a844da59deca6d56e3a917b5957e66bd5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Tue, 4 Jan 2022 17:24:06 +0000 Subject: [PATCH 155/393] tvx runner: improve error reporting. --- conformance/runner.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/conformance/runner.go b/conformance/runner.go index 3dfedc748ce..fd44ecff9e4 100644 --- a/conformance/runner.go +++ b/conformance/runner.go @@ -239,8 +239,10 @@ func ExecuteTipsetVector(r Reporter, vector *schema.TestVector, variant *schema. func AssertMsgResult(r Reporter, expected *schema.Receipt, actual *vm.ApplyRet, label string) { r.Helper() + applyret := actual if expected, actual := exitcode.ExitCode(expected.ExitCode), actual.ExitCode; expected != actual { r.Errorf("exit code of msg %s did not match; expected: %s, got: %s", label, expected, actual) + r.Errorf("\t\\==> actor error: %s", applyret.ActorErr) } if expected, actual := expected.GasUsed, actual.GasUsed; expected != actual { r.Errorf("gas used of msg %s did not match; expected: %d, got: %d", label, expected, actual) From 75d8c5200483df82e6914458c20b5183a870c169 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Tue, 4 Jan 2022 17:42:24 +0000 Subject: [PATCH 156/393] tvx runner: exec: add support for multiple-level dirs. --- cmd/tvx/exec.go | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/cmd/tvx/exec.go b/cmd/tvx/exec.go index 15bb543a50e..750684c363b 100644 --- a/cmd/tvx/exec.go +++ b/cmd/tvx/exec.go @@ -5,6 +5,7 @@ import ( "encoding/json" "fmt" "io" + "io/fs" "log" "os" "path/filepath" @@ -136,25 +137,31 @@ func processTipsetOpts() error { } func execVectorDir(path string, outdir string) error { - files, err := filepath.Glob(filepath.Join(path, "*")) - if err != nil { - return fmt.Errorf("failed to glob input directory %s: %w", path, err) - } - for _, f := range files { - outfile := strings.TrimSuffix(filepath.Base(f), filepath.Ext(f)) + ".out" + return filepath.WalkDir(path, func(path string, d fs.DirEntry, err error) error { + if err != nil { + return fmt.Errorf("failed while visiting path %s: %w", path, err) + } + if d.IsDir() || !strings.HasSuffix(path, "json") { + return nil + } + // Create an output file to capture the output from the run of the vector. + outfile := strings.TrimSuffix(filepath.Base(path), filepath.Ext(path)) + ".out" outpath := filepath.Join(outdir, outfile) outw, err := os.Create(outpath) if err != nil { return fmt.Errorf("failed to create file %s: %w", outpath, err) } - log.Printf("processing vector %s; sending output to %s", f, outpath) + log.Printf("processing vector %s; sending output to %s", path, outpath) + + // Actually run the vector. log.SetOutput(io.MultiWriter(os.Stderr, outw)) // tee the output. - _, _ = execVectorFile(new(conformance.LogReporter), f) + _, _ = execVectorFile(new(conformance.LogReporter), path) log.SetOutput(os.Stderr) _ = outw.Close() - } - return nil + + return nil + }) } func execVectorsStdin() error { From 61e173215bb9896d8aa2f1552bb2fa31f128d87d Mon Sep 17 00:00:00 2001 From: zenground0 Date: Wed, 8 Dec 2021 12:11:19 -0500 Subject: [PATCH 157/393] Snap Deals Integration - FSM handles the actual cc upgrade process including error states - PoSting (winning and window) works over upgraded and upgrading sectors - Integration test and changes to itest framework to reduce flakes - Update CLI to handle new upgrade - Update dependencies --- api/api_full.go | 2 +- api/api_storage.go | 8 +- api/proxy_gen.go | 30 +- api/v0api/gateway.go | 4 +- api/v0api/proxy_gen.go | 12 +- api/version.go | 2 +- build/openrpc/full.json.gz | Bin 26581 -> 26593 bytes build/openrpc/miner.json.gz | Bin 12555 -> 12680 bytes build/openrpc/worker.json.gz | Bin 3803 -> 3805 bytes build/params_2k.go | 2 +- chain/actors/builtin/builtin.go | 1 + chain/actors/builtin/builtin.go.template | 1 + chain/actors/builtin/miner/actor.go.template | 3 + chain/actors/builtin/miner/miner.go | 3 + chain/consensus/filcns/filecoin.go | 17 +- chain/gen/gen.go | 10 +- chain/stmgr/actors.go | 7 +- chain/sync_test.go | 3 +- chain/vm/syscalls.go | 4 +- cmd/lotus-bench/caching_verifier.go | 5 +- cmd/lotus-bench/main.go | 53 ++-- cmd/lotus-miner/info.go | 12 + cmd/lotus-miner/sectors.go | 76 ++++- cmd/lotus-seal-worker/main.go | 16 ++ cmd/lotus-sim/simulation/mock/mock.go | 3 +- documentation/en/api-v0-methods-miner.md | 18 +- documentation/en/api-v0-methods.md | 1 + documentation/en/api-v1-unstable-methods.md | 1 + documentation/en/cli-lotus-miner.md | 14 + .../en/default-lotus-miner-config.toml | 9 + .../sector-storage/ffiwrapper/sealer_cgo.go | 9 +- .../sector-storage/ffiwrapper/sealer_test.go | 18 +- extern/sector-storage/ffiwrapper/types.go | 17 +- .../sector-storage/ffiwrapper/verifier_cgo.go | 70 +++-- extern/sector-storage/manager.go | 47 ++- extern/sector-storage/mock/mock.go | 67 +++-- extern/sector-storage/teststorage_test.go | 14 +- extern/storage-sealing/cbor_gen.go | 272 +++++++++++++++++- extern/storage-sealing/checks.go | 32 +++ extern/storage-sealing/fsm.go | 119 +++++++- extern/storage-sealing/fsm_events.go | 94 ++++++ extern/storage-sealing/input.go | 39 +++ extern/storage-sealing/mocks/api.go | 15 + extern/storage-sealing/sealing.go | 16 +- extern/storage-sealing/sector_state.go | 123 +++++--- extern/storage-sealing/states_failed.go | 200 ++++++++++--- extern/storage-sealing/states_failed_test.go | 8 +- .../storage-sealing/states_replica_update.go | 209 ++++++++++++++ extern/storage-sealing/states_sealing.go | 6 +- extern/storage-sealing/types.go | 10 +- extern/storage-sealing/upgrade_queue.go | 68 ++++- go.mod | 8 +- go.sum | 12 +- itests/ccupgrade_test.go | 135 ++++++--- itests/kit/blockminer.go | 137 +++++++++ itests/kit/deals.go | 7 +- itests/kit/ensemble.go | 37 +++ .../storageadapter/ondealsectorcommitted.go | 53 +++- miner/miner.go | 6 +- miner/warmup.go | 16 +- node/config/def.go | 21 +- node/impl/storminer.go | 13 +- storage/adapter_storage_miner.go | 9 + storage/miner.go | 3 +- storage/miner_sealing.go | 11 +- storage/wdpost_changehandler_test.go | 2 +- storage/wdpost_run.go | 46 ++- storage/wdpost_run_test.go | 6 +- 68 files changed, 1961 insertions(+), 331 deletions(-) create mode 100644 extern/storage-sealing/states_replica_update.go diff --git a/api/api_full.go b/api/api_full.go index 9ca0f883aa5..cf58a3cc6ee 100644 --- a/api/api_full.go +++ b/api/api_full.go @@ -1084,7 +1084,7 @@ type CirculatingSupply struct { type MiningBaseInfo struct { MinerPower types.BigInt NetworkPower types.BigInt - Sectors []builtin.SectorInfo + Sectors []builtin.ExtendedSectorInfo WorkerKey address.Address SectorSize abi.SectorSize PrevBeaconEntry types.BeaconEntry diff --git a/api/api_storage.go b/api/api_storage.go index 3f0ef50b73b..c032a8e1b64 100644 --- a/api/api_storage.go +++ b/api/api_storage.go @@ -14,6 +14,7 @@ import ( "github.com/filecoin-project/go-address" datatransfer "github.com/filecoin-project/go-data-transfer" "github.com/filecoin-project/go-state-types/abi" + abinetwork "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/specs-actors/v2/actors/builtin/market" "github.com/filecoin-project/specs-storage/storage" @@ -99,8 +100,8 @@ type StorageMiner interface { // Returns null if message wasn't sent SectorTerminateFlush(ctx context.Context) (*cid.Cid, error) //perm:admin // SectorTerminatePending returns a list of pending sector terminations to be sent in the next batch message - SectorTerminatePending(ctx context.Context) ([]abi.SectorID, error) //perm:admin - SectorMarkForUpgrade(ctx context.Context, id abi.SectorNumber) error //perm:admin + SectorTerminatePending(ctx context.Context) ([]abi.SectorID, error) //perm:admin + SectorMarkForUpgrade(ctx context.Context, id abi.SectorNumber, snap bool) error //perm:admin // SectorPreCommitFlush immediately sends a PreCommit message with sectors batched for PreCommit. // Returns null if message wasn't sent SectorPreCommitFlush(ctx context.Context) ([]sealiface.PreCommitBatchRes, error) //perm:admin @@ -111,6 +112,7 @@ type StorageMiner interface { SectorCommitFlush(ctx context.Context) ([]sealiface.CommitBatchRes, error) //perm:admin // SectorCommitPending returns a list of pending Commit sectors to be sent in the next aggregate message SectorCommitPending(ctx context.Context) ([]abi.SectorID, error) //perm:admin + SectorMatchPendingPiecesToOpenSectors(ctx context.Context) error //perm:admin // WorkerConnect tells the node to connect to workers RPC WorkerConnect(context.Context, string) error //perm:admin retry:true @@ -253,7 +255,7 @@ type StorageMiner interface { CheckProvable(ctx context.Context, pp abi.RegisteredPoStProof, sectors []storage.SectorRef, expensive bool) (map[abi.SectorNumber]string, error) //perm:admin - ComputeProof(ctx context.Context, ssi []builtin.SectorInfo, rand abi.PoStRandomness) ([]builtin.PoStProof, error) //perm:read + ComputeProof(ctx context.Context, ssi []builtin.ExtendedSectorInfo, rand abi.PoStRandomness, poStEpoch abi.ChainEpoch, nv abinetwork.Version) ([]builtin.PoStProof, error) //perm:read } var _ storiface.WorkerReturn = *new(StorageMiner) diff --git a/api/proxy_gen.go b/api/proxy_gen.go index 09c71a167e1..0a644e58572 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -17,6 +17,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" "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" apitypes "github.com/filecoin-project/lotus/api/types" "github.com/filecoin-project/lotus/chain/actors/builtin" "github.com/filecoin-project/lotus/chain/actors/builtin/miner" @@ -620,7 +621,7 @@ type StorageMinerStruct struct { CheckProvable func(p0 context.Context, p1 abi.RegisteredPoStProof, p2 []storage.SectorRef, p3 bool) (map[abi.SectorNumber]string, error) `perm:"admin"` - ComputeProof func(p0 context.Context, p1 []builtin.SectorInfo, p2 abi.PoStRandomness) ([]builtin.PoStProof, error) `perm:"read"` + ComputeProof func(p0 context.Context, p1 []builtin.ExtendedSectorInfo, p2 abi.PoStRandomness, p3 abi.ChainEpoch, p4 abinetwork.Version) ([]builtin.PoStProof, error) `perm:"read"` CreateBackup func(p0 context.Context, p1 string) error `perm:"admin"` @@ -758,7 +759,9 @@ type StorageMinerStruct struct { SectorGetSealDelay func(p0 context.Context) (time.Duration, error) `perm:"read"` - SectorMarkForUpgrade func(p0 context.Context, p1 abi.SectorNumber) error `perm:"admin"` + SectorMarkForUpgrade func(p0 context.Context, p1 abi.SectorNumber, p2 bool) error `perm:"admin"` + + SectorMatchPendingPiecesToOpenSectors func(p0 context.Context) error `perm:"admin"` SectorPreCommitFlush func(p0 context.Context) ([]sealiface.PreCommitBatchRes, error) `perm:"admin"` @@ -3710,14 +3713,14 @@ func (s *StorageMinerStub) CheckProvable(p0 context.Context, p1 abi.RegisteredPo return *new(map[abi.SectorNumber]string), ErrNotSupported } -func (s *StorageMinerStruct) ComputeProof(p0 context.Context, p1 []builtin.SectorInfo, p2 abi.PoStRandomness) ([]builtin.PoStProof, error) { +func (s *StorageMinerStruct) ComputeProof(p0 context.Context, p1 []builtin.ExtendedSectorInfo, p2 abi.PoStRandomness, p3 abi.ChainEpoch, p4 abinetwork.Version) ([]builtin.PoStProof, error) { if s.Internal.ComputeProof == nil { return *new([]builtin.PoStProof), ErrNotSupported } - return s.Internal.ComputeProof(p0, p1, p2) + return s.Internal.ComputeProof(p0, p1, p2, p3, p4) } -func (s *StorageMinerStub) ComputeProof(p0 context.Context, p1 []builtin.SectorInfo, p2 abi.PoStRandomness) ([]builtin.PoStProof, error) { +func (s *StorageMinerStub) ComputeProof(p0 context.Context, p1 []builtin.ExtendedSectorInfo, p2 abi.PoStRandomness, p3 abi.ChainEpoch, p4 abinetwork.Version) ([]builtin.PoStProof, error) { return *new([]builtin.PoStProof), ErrNotSupported } @@ -4469,14 +4472,25 @@ func (s *StorageMinerStub) SectorGetSealDelay(p0 context.Context) (time.Duration return *new(time.Duration), ErrNotSupported } -func (s *StorageMinerStruct) SectorMarkForUpgrade(p0 context.Context, p1 abi.SectorNumber) error { +func (s *StorageMinerStruct) SectorMarkForUpgrade(p0 context.Context, p1 abi.SectorNumber, p2 bool) error { if s.Internal.SectorMarkForUpgrade == nil { return ErrNotSupported } - return s.Internal.SectorMarkForUpgrade(p0, p1) + return s.Internal.SectorMarkForUpgrade(p0, p1, p2) +} + +func (s *StorageMinerStub) SectorMarkForUpgrade(p0 context.Context, p1 abi.SectorNumber, p2 bool) error { + return ErrNotSupported +} + +func (s *StorageMinerStruct) SectorMatchPendingPiecesToOpenSectors(p0 context.Context) error { + if s.Internal.SectorMatchPendingPiecesToOpenSectors == nil { + return ErrNotSupported + } + return s.Internal.SectorMatchPendingPiecesToOpenSectors(p0) } -func (s *StorageMinerStub) SectorMarkForUpgrade(p0 context.Context, p1 abi.SectorNumber) error { +func (s *StorageMinerStub) SectorMatchPendingPiecesToOpenSectors(p0 context.Context) error { return ErrNotSupported } diff --git a/api/v0api/gateway.go b/api/v0api/gateway.go index 18a5ec7d6e6..e3ba56899ae 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/dline" - "github.com/filecoin-project/go-state-types/network" + abinetwork "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/chain/actors/builtin/miner" @@ -57,7 +57,7 @@ type Gateway interface { StateMinerInfo(ctx context.Context, actor address.Address, tsk types.TipSetKey) (miner.MinerInfo, error) StateMinerProvingDeadline(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*dline.Info, error) StateMinerPower(context.Context, address.Address, types.TipSetKey) (*api.MinerPower, error) - StateNetworkVersion(context.Context, types.TipSetKey) (network.Version, error) + StateNetworkVersion(context.Context, types.TipSetKey) (abinetwork.Version, error) StateSearchMsg(ctx context.Context, msg cid.Cid) (*api.MsgLookup, error) StateSectorGetInfo(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk types.TipSetKey) (*miner.SectorOnChainInfo, error) StateVerifiedClientStatus(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*abi.StoragePower, error) diff --git a/api/v0api/proxy_gen.go b/api/v0api/proxy_gen.go index af0687fe5ae..49ebad42892 100644 --- a/api/v0api/proxy_gen.go +++ b/api/v0api/proxy_gen.go @@ -13,7 +13,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/go-state-types/dline" - "github.com/filecoin-project/go-state-types/network" + abinetwork "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/lotus/api" apitypes "github.com/filecoin-project/lotus/api/types" "github.com/filecoin-project/lotus/chain/actors/builtin/miner" @@ -451,7 +451,7 @@ type GatewayStruct struct { StateMinerProvingDeadline func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*dline.Info, error) `` - StateNetworkVersion func(p0 context.Context, p1 types.TipSetKey) (network.Version, error) `` + StateNetworkVersion func(p0 context.Context, p1 types.TipSetKey) (abinetwork.Version, error) `` StateSearchMsg func(p0 context.Context, p1 cid.Cid) (*api.MsgLookup, error) `` @@ -2703,15 +2703,15 @@ func (s *GatewayStub) StateMinerProvingDeadline(p0 context.Context, p1 address.A return nil, ErrNotSupported } -func (s *GatewayStruct) StateNetworkVersion(p0 context.Context, p1 types.TipSetKey) (network.Version, error) { +func (s *GatewayStruct) StateNetworkVersion(p0 context.Context, p1 types.TipSetKey) (abinetwork.Version, error) { if s.Internal.StateNetworkVersion == nil { - return *new(network.Version), ErrNotSupported + return *new(abinetwork.Version), ErrNotSupported } return s.Internal.StateNetworkVersion(p0, p1) } -func (s *GatewayStub) StateNetworkVersion(p0 context.Context, p1 types.TipSetKey) (network.Version, error) { - return *new(network.Version), ErrNotSupported +func (s *GatewayStub) StateNetworkVersion(p0 context.Context, p1 types.TipSetKey) (abinetwork.Version, error) { + return *new(abinetwork.Version), ErrNotSupported } func (s *GatewayStruct) StateSearchMsg(p0 context.Context, p1 cid.Cid) (*api.MsgLookup, error) { diff --git a/api/version.go b/api/version.go index 93148f28df4..0be7de878bc 100644 --- a/api/version.go +++ b/api/version.go @@ -57,7 +57,7 @@ var ( FullAPIVersion0 = newVer(1, 4, 0) FullAPIVersion1 = newVer(2, 1, 0) - MinerAPIVersion0 = newVer(1, 2, 0) + MinerAPIVersion0 = newVer(1, 3, 0) WorkerAPIVersion0 = newVer(1, 5, 0) ) diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 7ca7301ff72e35e16c485e85f0cd4c306540d3c5..1e4efea1a4fcc8ed6a49cd9c92876b457456c26f 100644 GIT binary patch delta 22257 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 delta 22245 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 E00)OA_y7O^ diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index e7083de2449cc0fec7b2962d0b1856b7fc1e71b9..08f41f3c55cb320b41642fb0e29238561a56591c 100644 GIT binary patch literal 12680 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 CH?hC~ literal 12555 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 diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index 717eeaacb2879bc3d4445218e554bffe547f727c..c82ad677093007288784c12142827b97d9bd444d 100644 GIT binary patch delta 2674 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 diff --git a/build/params_2k.go b/build/params_2k.go index 84023c38c6d..6c0918c513e 100644 --- a/build/params_2k.go +++ b/build/params_2k.go @@ -17,7 +17,7 @@ import ( const BootstrappersFile = "" const GenesisFile = "" -const GenesisNetworkVersion = network.Version14 +const GenesisNetworkVersion = network.Version15 var UpgradeBreezeHeight = abi.ChainEpoch(-1) diff --git a/chain/actors/builtin/builtin.go b/chain/actors/builtin/builtin.go index d9373299939..febbca4796c 100644 --- a/chain/actors/builtin/builtin.go +++ b/chain/actors/builtin/builtin.go @@ -61,6 +61,7 @@ const ( // These are all just type aliases across actor versions. In the future, that might change // and we might need to do something fancier. type SectorInfo = proof7.SectorInfo +type ExtendedSectorInfo = proof7.ExtendedSectorInfo type PoStProof = proof7.PoStProof type FilterEstimate = smoothing0.FilterEstimate diff --git a/chain/actors/builtin/builtin.go.template b/chain/actors/builtin/builtin.go.template index 031c05182e4..f5d5eb77b7e 100644 --- a/chain/actors/builtin/builtin.go.template +++ b/chain/actors/builtin/builtin.go.template @@ -45,6 +45,7 @@ const ( // These are all just type aliases across actor versions. In the future, that might change // and we might need to do something fancier. type SectorInfo = proof{{.latestVersion}}.SectorInfo +type ExtendedSectorInfo = proof{{.latestVersion}}.ExtendedSectorInfo type PoStProof = proof{{.latestVersion}}.PoStProof type FilterEstimate = smoothing0.FilterEstimate diff --git a/chain/actors/builtin/miner/actor.go.template b/chain/actors/builtin/miner/actor.go.template index 2b6b78ebcea..74c16be3638 100644 --- a/chain/actors/builtin/miner/actor.go.template +++ b/chain/actors/builtin/miner/actor.go.template @@ -23,6 +23,7 @@ import ( miner2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/miner" miner3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/miner" miner5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/miner" + miner7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/miner" {{range .versions}} builtin{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin" {{end}} @@ -193,6 +194,7 @@ type SectorPreCommitOnChainInfo struct { type PoStPartition = miner0.PoStPartition type RecoveryDeclaration = miner0.RecoveryDeclaration type FaultDeclaration = miner0.FaultDeclaration +type ReplicaUpdate = miner7.ReplicaUpdate // Params type DeclareFaultsParams = miner0.DeclareFaultsParams @@ -201,6 +203,7 @@ type SubmitWindowedPoStParams = miner0.SubmitWindowedPoStParams type ProveCommitSectorParams = miner0.ProveCommitSectorParams type DisputeWindowedPoStParams = miner3.DisputeWindowedPoStParams type ProveCommitAggregateParams = miner5.ProveCommitAggregateParams +type ProveReplicaUpdatesParams = miner7.ProveReplicaUpdatesParams 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 diff --git a/chain/actors/builtin/miner/miner.go b/chain/actors/builtin/miner/miner.go index e60ff8da8b4..7889d7a4dff 100644 --- a/chain/actors/builtin/miner/miner.go +++ b/chain/actors/builtin/miner/miner.go @@ -23,6 +23,7 @@ import ( miner2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/miner" miner3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/miner" miner5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/miner" + miner7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/miner" builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" @@ -282,6 +283,7 @@ type SectorPreCommitOnChainInfo struct { type PoStPartition = miner0.PoStPartition type RecoveryDeclaration = miner0.RecoveryDeclaration type FaultDeclaration = miner0.FaultDeclaration +type ReplicaUpdate = miner7.ReplicaUpdate // Params type DeclareFaultsParams = miner0.DeclareFaultsParams @@ -290,6 +292,7 @@ type SubmitWindowedPoStParams = miner0.SubmitWindowedPoStParams type ProveCommitSectorParams = miner0.ProveCommitSectorParams type DisputeWindowedPoStParams = miner3.DisputeWindowedPoStParams type ProveCommitAggregateParams = miner5.ProveCommitAggregateParams +type ProveReplicaUpdatesParams = miner7.ProveReplicaUpdatesParams 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 diff --git a/chain/consensus/filcns/filecoin.go b/chain/consensus/filcns/filecoin.go index 6d4c8da6473..e112e2bf993 100644 --- a/chain/consensus/filcns/filecoin.go +++ b/chain/consensus/filcns/filecoin.go @@ -26,7 +26,7 @@ import ( "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/go-state-types/network" blockadt "github.com/filecoin-project/specs-actors/actors/util/adt" - proof2 "github.com/filecoin-project/specs-actors/v2/actors/runtime/proof" + "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" bstore "github.com/filecoin-project/lotus/blockstore" "github.com/filecoin-project/lotus/build" @@ -400,17 +400,26 @@ func (filec *FilecoinEC) VerifyWinningPoStProof(ctx context.Context, nv network. return xerrors.Errorf("failed to get ID from miner address %s: %w", h.Miner, err) } - sectors, err := stmgr.GetSectorsForWinningPoSt(ctx, nv, filec.verifier, filec.sm, lbst, h.Miner, rand) + xsectors, err := stmgr.GetSectorsForWinningPoSt(ctx, nv, filec.verifier, filec.sm, lbst, h.Miner, rand) if err != nil { return xerrors.Errorf("getting winning post sector set: %w", err) } - ok, err := ffiwrapper.ProofVerifier.VerifyWinningPoSt(ctx, proof2.WinningPoStVerifyInfo{ + sectors := make([]proof.SectorInfo, len(xsectors)) + for i, xsi := range xsectors { + sectors[i] = proof.SectorInfo{ + SealProof: xsi.SealProof, + SectorNumber: xsi.SectorNumber, + SealedCID: xsi.SealedCID, + } + } + + ok, err := ffiwrapper.ProofVerifier.VerifyWinningPoSt(ctx, proof.WinningPoStVerifyInfo{ Randomness: rand, Proofs: h.WinPoStProof, ChallengedSectors: sectors, Prover: abi.ActorID(mid), - }) + }, h.Height, nv) if err != nil { return xerrors.Errorf("failed to verify election post: %w", err) } diff --git a/chain/gen/gen.go b/chain/gen/gen.go index 461a826e8c3..4bf8dbc12f8 100644 --- a/chain/gen/gen.go +++ b/chain/gen/gen.go @@ -461,7 +461,7 @@ func (cg *ChainGen) NextTipSetFromMinersWithMessagesAndNulls(base *types.TipSet, if et != nil { // TODO: maybe think about passing in more real parameters to this? - wpost, err := cg.eppProvs[m].ComputeProof(context.TODO(), nil, nil) + wpost, err := cg.eppProvs[m].ComputeProof(context.TODO(), nil, nil, round, network.Version0) if err != nil { return nil, err } @@ -620,7 +620,7 @@ func (mca mca) WalletSign(ctx context.Context, a address.Address, v []byte) (*cr type WinningPoStProver interface { GenerateCandidates(context.Context, abi.PoStRandomness, uint64) ([]uint64, error) - ComputeProof(context.Context, []proof5.SectorInfo, abi.PoStRandomness) ([]proof5.PoStProof, error) + ComputeProof(context.Context, []proof7.ExtendedSectorInfo, abi.PoStRandomness, abi.ChainEpoch, network.Version) ([]proof5.PoStProof, error) } type wppProvider struct{} @@ -629,7 +629,7 @@ func (wpp *wppProvider) GenerateCandidates(ctx context.Context, _ abi.PoStRandom return []uint64{0}, nil } -func (wpp *wppProvider) ComputeProof(context.Context, []proof5.SectorInfo, abi.PoStRandomness) ([]proof5.PoStProof, error) { +func (wpp *wppProvider) ComputeProof(context.Context, []proof7.ExtendedSectorInfo, abi.PoStRandomness, abi.ChainEpoch, network.Version) ([]proof5.PoStProof, error) { return ValidWpostForTesting, nil } @@ -692,11 +692,11 @@ func (m genFakeVerifier) VerifyReplicaUpdate(update proof7.ReplicaUpdateInfo) (b panic("not supported") } -func (m genFakeVerifier) VerifyWinningPoSt(ctx context.Context, info proof5.WinningPoStVerifyInfo) (bool, error) { +func (m genFakeVerifier) VerifyWinningPoSt(ctx context.Context, info proof7.WinningPoStVerifyInfo, poStEpoch abi.ChainEpoch, nv network.Version) (bool, error) { panic("not supported") } -func (m genFakeVerifier) VerifyWindowPoSt(ctx context.Context, info proof5.WindowPoStVerifyInfo) (bool, error) { +func (m genFakeVerifier) VerifyWindowPoSt(ctx context.Context, info proof7.WindowPoStVerifyInfo) (bool, error) { panic("not supported") } diff --git a/chain/stmgr/actors.go b/chain/stmgr/actors.go index a8958ee4ce2..52773e1e4d2 100644 --- a/chain/stmgr/actors.go +++ b/chain/stmgr/actors.go @@ -117,7 +117,7 @@ func MinerSectorInfo(ctx context.Context, sm *StateManager, maddr address.Addres return mas.GetSector(sid) } -func GetSectorsForWinningPoSt(ctx context.Context, nv network.Version, pv ffiwrapper.Verifier, sm *StateManager, st cid.Cid, maddr address.Address, rand abi.PoStRandomness) ([]builtin.SectorInfo, error) { +func GetSectorsForWinningPoSt(ctx context.Context, nv network.Version, pv ffiwrapper.Verifier, sm *StateManager, st cid.Cid, maddr address.Address, rand abi.PoStRandomness) ([]builtin.ExtendedSectorInfo, error) { act, err := sm.LoadActorRaw(ctx, maddr, st) if err != nil { return nil, xerrors.Errorf("failed to load miner actor: %w", err) @@ -203,12 +203,13 @@ func GetSectorsForWinningPoSt(ctx context.Context, nv network.Version, pv ffiwra return nil, xerrors.Errorf("loading proving sectors: %w", err) } - out := make([]builtin.SectorInfo, len(sectors)) + out := make([]builtin.ExtendedSectorInfo, len(sectors)) for i, sinfo := range sectors { - out[i] = builtin.SectorInfo{ + out[i] = builtin.ExtendedSectorInfo{ SealProof: sinfo.SealProof, SectorNumber: sinfo.SectorNumber, SealedCID: sinfo.SealedCID, + SectorKey: sinfo.SectorKeyCID, } } diff --git a/chain/sync_test.go b/chain/sync_test.go index 3293856c7a1..2af8aeb5433 100644 --- a/chain/sync_test.go +++ b/chain/sync_test.go @@ -22,6 +22,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" proof2 "github.com/filecoin-project/specs-actors/v2/actors/runtime/proof" + proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/build" @@ -543,7 +544,7 @@ func (wpp badWpp) GenerateCandidates(context.Context, abi.PoStRandomness, uint64 return []uint64{1}, nil } -func (wpp badWpp) ComputeProof(context.Context, []proof2.SectorInfo, abi.PoStRandomness) ([]proof2.PoStProof, error) { +func (wpp badWpp) ComputeProof(context.Context, []proof7.ExtendedSectorInfo, abi.PoStRandomness, abi.ChainEpoch, network.Version) ([]proof2.PoStProof, error) { return []proof2.PoStProof{ { PoStProof: abi.RegisteredPoStProof_StackedDrgWinning2KiBV1, diff --git a/chain/vm/syscalls.go b/chain/vm/syscalls.go index b8c027bd7b4..cd143279e1c 100644 --- a/chain/vm/syscalls.go +++ b/chain/vm/syscalls.go @@ -245,8 +245,8 @@ func (ss *syscallShim) workerKeyAtLookback(height abi.ChainEpoch) (address.Addre return ResolveToKeyAddr(ss.cstate, ss.cst, info.Worker) } -func (ss *syscallShim) VerifyPoSt(proof proof5.WindowPoStVerifyInfo) error { - ok, err := ss.verifier.VerifyWindowPoSt(context.TODO(), proof) +func (ss *syscallShim) VerifyPoSt(info proof5.WindowPoStVerifyInfo) error { + ok, err := ss.verifier.VerifyWindowPoSt(context.TODO(), info) if err != nil { return err } diff --git a/cmd/lotus-bench/caching_verifier.go b/cmd/lotus-bench/caching_verifier.go index 358fbd04603..9fd6a33f7c3 100644 --- a/cmd/lotus-bench/caching_verifier.go +++ b/cmd/lotus-bench/caching_verifier.go @@ -8,6 +8,7 @@ import ( proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/lotus/extern/sector-storage/ffiwrapper" proof2 "github.com/filecoin-project/specs-actors/v2/actors/runtime/proof" "github.com/ipfs/go-datastore" @@ -86,8 +87,8 @@ func (cv *cachingVerifier) VerifySeal(svi proof2.SealVerifyInfo) (bool, error) { }, &svi) } -func (cv *cachingVerifier) VerifyWinningPoSt(ctx context.Context, info proof2.WinningPoStVerifyInfo) (bool, error) { - return cv.backend.VerifyWinningPoSt(ctx, info) +func (cv *cachingVerifier) VerifyWinningPoSt(ctx context.Context, info proof7.WinningPoStVerifyInfo, poStEpoch abi.ChainEpoch, nv network.Version) (bool, error) { + return cv.backend.VerifyWinningPoSt(ctx, info, poStEpoch, nv) } func (cv *cachingVerifier) VerifyWindowPoSt(ctx context.Context, info proof2.WindowPoStVerifyInfo) (bool, error) { return cv.withCache(func() (bool, error) { diff --git a/cmd/lotus-bench/main.go b/cmd/lotus-bench/main.go index 0b8ec6fe3fc..8893e7b8e4c 100644 --- a/cmd/lotus-bench/main.go +++ b/cmd/lotus-bench/main.go @@ -12,6 +12,8 @@ import ( "time" saproof2 "github.com/filecoin-project/specs-actors/v2/actors/runtime/proof" + "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" + saproof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" "github.com/docker/go-units" logging "github.com/ipfs/go-log/v2" @@ -260,7 +262,8 @@ var sealBenchCmd = &cli.Command{ sectorNumber := c.Int("num-sectors") var sealTimings []SealingResult - var sealedSectors []saproof2.SectorInfo + var extendedSealedSectors []saproof7.ExtendedSectorInfo + var sealedSectors []saproof7.SectorInfo if robench == "" { var err error @@ -269,7 +272,7 @@ var sealBenchCmd = &cli.Command{ PreCommit2: 1, Commit: 1, } - sealTimings, sealedSectors, err = runSeals(sb, sbfs, sectorNumber, parCfg, mid, sectorSize, []byte(c.String("ticket-preimage")), c.String("save-commit2-input"), skipc2, c.Bool("skip-unseal")) + sealTimings, extendedSealedSectors, err = runSeals(sb, sbfs, sectorNumber, parCfg, mid, sectorSize, []byte(c.String("ticket-preimage")), c.String("save-commit2-input"), skipc2, c.Bool("skip-unseal")) if err != nil { return xerrors.Errorf("failed to run seals: %w", err) } @@ -296,7 +299,13 @@ var sealBenchCmd = &cli.Command{ } for _, s := range genm.Sectors { - sealedSectors = append(sealedSectors, saproof2.SectorInfo{ + extendedSealedSectors = append(extendedSealedSectors, saproof7.ExtendedSectorInfo{ + SealedCID: s.CommR, + SectorNumber: s.SectorID, + SealProof: s.ProofType, + SectorKey: nil, + }) + sealedSectors = append(sealedSectors, proof.SectorInfo{ SealedCID: s.CommR, SectorNumber: s.SectorID, SealProof: s.ProofType, @@ -325,20 +334,20 @@ var sealBenchCmd = &cli.Command{ return err } - fcandidates, err := ffiwrapper.ProofVerifier.GenerateWinningPoStSectorChallenge(context.TODO(), wipt, mid, challenge[:], uint64(len(sealedSectors))) + fcandidates, err := ffiwrapper.ProofVerifier.GenerateWinningPoStSectorChallenge(context.TODO(), wipt, mid, challenge[:], uint64(len(extendedSealedSectors))) if err != nil { return err } - candidates := make([]saproof2.SectorInfo, len(fcandidates)) + xcandidates := make([]saproof7.ExtendedSectorInfo, len(fcandidates)) for i, fcandidate := range fcandidates { - candidates[i] = sealedSectors[fcandidate] + xcandidates[i] = extendedSealedSectors[fcandidate] } gencandidates := time.Now() log.Info("computing winning post snark (cold)") - proof1, err := sb.GenerateWinningPoSt(context.TODO(), mid, candidates, challenge[:]) + proof1, err := sb.GenerateWinningPoSt(context.TODO(), mid, xcandidates, challenge[:]) if err != nil { return err } @@ -346,20 +355,29 @@ var sealBenchCmd = &cli.Command{ winningpost1 := time.Now() log.Info("computing winning post snark (hot)") - proof2, err := sb.GenerateWinningPoSt(context.TODO(), mid, candidates, challenge[:]) + proof2, err := sb.GenerateWinningPoSt(context.TODO(), mid, xcandidates, challenge[:]) if err != nil { return err } + candidates := make([]saproof7.SectorInfo, len(xcandidates)) + for i, xsi := range xcandidates { + candidates[i] = saproof7.SectorInfo{ + SealedCID: xsi.SealedCID, + SectorNumber: xsi.SectorNumber, + SealProof: xsi.SealProof, + } + } + winnningpost2 := time.Now() - pvi1 := saproof2.WinningPoStVerifyInfo{ + pvi1 := saproof7.WinningPoStVerifyInfo{ Randomness: abi.PoStRandomness(challenge[:]), Proofs: proof1, ChallengedSectors: candidates, Prover: mid, } - ok, err := ffiwrapper.ProofVerifier.VerifyWinningPoSt(context.TODO(), pvi1) + ok, err := ffiwrapper.ProofVerifier.VerifyWinningPoSt(context.TODO(), pvi1, 0, build.NewestNetworkVersion) if err != nil { return err } @@ -369,14 +387,14 @@ var sealBenchCmd = &cli.Command{ verifyWinningPost1 := time.Now() - pvi2 := saproof2.WinningPoStVerifyInfo{ + pvi2 := saproof7.WinningPoStVerifyInfo{ Randomness: abi.PoStRandomness(challenge[:]), Proofs: proof2, ChallengedSectors: candidates, Prover: mid, } - ok, err = ffiwrapper.ProofVerifier.VerifyWinningPoSt(context.TODO(), pvi2) + ok, err = ffiwrapper.ProofVerifier.VerifyWinningPoSt(context.TODO(), pvi2, 0, build.NewestNetworkVersion) if err != nil { return err } @@ -386,7 +404,7 @@ var sealBenchCmd = &cli.Command{ verifyWinningPost2 := time.Now() log.Info("computing window post snark (cold)") - wproof1, _, err := sb.GenerateWindowPoSt(context.TODO(), mid, sealedSectors, challenge[:]) + wproof1, _, err := sb.GenerateWindowPoSt(context.TODO(), mid, extendedSealedSectors, challenge[:]) if err != nil { return err } @@ -394,7 +412,7 @@ var sealBenchCmd = &cli.Command{ windowpost1 := time.Now() log.Info("computing window post snark (hot)") - wproof2, _, err := sb.GenerateWindowPoSt(context.TODO(), mid, sealedSectors, challenge[:]) + wproof2, _, err := sb.GenerateWindowPoSt(context.TODO(), mid, extendedSealedSectors, challenge[:]) if err != nil { return err } @@ -502,10 +520,10 @@ type ParCfg struct { Commit int } -func runSeals(sb *ffiwrapper.Sealer, sbfs *basicfs.Provider, numSectors int, par ParCfg, mid abi.ActorID, sectorSize abi.SectorSize, ticketPreimage []byte, saveC2inp string, skipc2, skipunseal bool) ([]SealingResult, []saproof2.SectorInfo, error) { +func runSeals(sb *ffiwrapper.Sealer, sbfs *basicfs.Provider, numSectors int, par ParCfg, mid abi.ActorID, sectorSize abi.SectorSize, ticketPreimage []byte, saveC2inp string, skipc2, skipunseal bool) ([]SealingResult, []saproof7.ExtendedSectorInfo, error) { var pieces []abi.PieceInfo sealTimings := make([]SealingResult, numSectors) - sealedSectors := make([]saproof2.SectorInfo, numSectors) + sealedSectors := make([]saproof7.ExtendedSectorInfo, numSectors) preCommit2Sema := make(chan struct{}, par.PreCommit2) commitSema := make(chan struct{}, par.Commit) @@ -579,10 +597,11 @@ func runSeals(sb *ffiwrapper.Sealer, sbfs *basicfs.Provider, numSectors int, par precommit2 := time.Now() <-preCommit2Sema - sealedSectors[i] = saproof2.SectorInfo{ + sealedSectors[i] = saproof7.ExtendedSectorInfo{ SealProof: sid.ProofType, SectorNumber: i, SealedCID: cids.Sealed, + SectorKey: nil, } seed := lapi.SealSeed{ diff --git a/cmd/lotus-miner/info.go b/cmd/lotus-miner/info.go index e50c4366ef3..39de942aa28 100644 --- a/cmd/lotus-miner/info.go +++ b/cmd/lotus-miner/info.go @@ -470,6 +470,8 @@ var stateList = []stateMeta{ {col: color.FgBlue, state: sealing.Empty}, {col: color.FgBlue, state: sealing.WaitDeals}, {col: color.FgBlue, state: sealing.AddPiece}, + {col: color.FgBlue, state: sealing.SnapDealsWaitDeals}, + {col: color.FgBlue, state: sealing.SnapDealsAddPiece}, {col: color.FgRed, state: sealing.UndefinedSectorState}, {col: color.FgYellow, state: sealing.Packing}, @@ -488,6 +490,12 @@ var stateList = []stateMeta{ {col: color.FgYellow, state: sealing.SubmitCommitAggregate}, {col: color.FgYellow, state: sealing.CommitAggregateWait}, {col: color.FgYellow, state: sealing.FinalizeSector}, + {col: color.FgYellow, state: sealing.SnapDealsPacking}, + {col: color.FgYellow, state: sealing.UpdateReplica}, + {col: color.FgYellow, state: sealing.ProveReplicaUpdate}, + {col: color.FgYellow, state: sealing.SubmitReplicaUpdate}, + {col: color.FgYellow, state: sealing.ReplicaUpdateWait}, + {col: color.FgYellow, state: sealing.FinalizeReplicaUpdate}, {col: color.FgCyan, state: sealing.Terminating}, {col: color.FgCyan, state: sealing.TerminateWait}, @@ -495,6 +503,7 @@ var stateList = []stateMeta{ {col: color.FgCyan, state: sealing.TerminateFailed}, {col: color.FgCyan, state: sealing.Removing}, {col: color.FgCyan, state: sealing.Removed}, + {col: color.FgCyan, state: sealing.AbortUpgrade}, {col: color.FgRed, state: sealing.FailedUnrecoverable}, {col: color.FgRed, state: sealing.AddPieceFailed}, @@ -512,6 +521,9 @@ var stateList = []stateMeta{ {col: color.FgRed, state: sealing.RemoveFailed}, {col: color.FgRed, state: sealing.DealsExpired}, {col: color.FgRed, state: sealing.RecoverDealIDs}, + {col: color.FgRed, state: sealing.SnapDealsAddPieceFailed}, + {col: color.FgRed, state: sealing.SnapDealsDealsExpired}, + {col: color.FgRed, state: sealing.ReplicaUpdateFailed}, } func init() { diff --git a/cmd/lotus-miner/sectors.go b/cmd/lotus-miner/sectors.go index b2059a73714..629ff790333 100644 --- a/cmd/lotus-miner/sectors.go +++ b/cmd/lotus-miner/sectors.go @@ -20,6 +20,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/network" miner5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/miner" "github.com/filecoin-project/lotus/api" @@ -50,11 +51,13 @@ var sectorsCmd = &cli.Command{ sectorsExtendCmd, sectorsTerminateCmd, sectorsRemoveCmd, + sectorsSnapUpCmd, sectorsMarkForUpgradeCmd, sectorsStartSealCmd, sectorsSealDelayCmd, sectorsCapacityCollateralCmd, sectorsBatching, + sectorsRefreshPieceMatchingCmd, }, } @@ -1476,6 +1479,44 @@ var sectorsRemoveCmd = &cli.Command{ }, } +var sectorsSnapUpCmd = &cli.Command{ + Name: "snap-up", + Usage: "Mark a committed capacity sector to be filled with deals", + ArgsUsage: "", + Action: func(cctx *cli.Context) error { + if cctx.Args().Len() != 1 { + return lcli.ShowHelp(cctx, xerrors.Errorf("must pass sector number")) + } + + nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx) + if err != nil { + return err + } + defer closer() + api, nCloser, err := lcli.GetFullNodeAPI(cctx) + if err != nil { + return err + } + defer nCloser() + ctx := lcli.ReqContext(cctx) + + nv, err := api.StateNetworkVersion(ctx, types.EmptyTSK) + if err != nil { + return xerrors.Errorf("failed to get network version: %w", err) + } + if nv < network.Version15 { + return xerrors.Errorf("snap deals upgrades enabled in network v15") + } + + id, err := strconv.ParseUint(cctx.Args().Get(0), 10, 64) + if err != nil { + return xerrors.Errorf("could not parse sector number: %w", err) + } + + return nodeApi.SectorMarkForUpgrade(ctx, abi.SectorNumber(id), true) + }, +} + var sectorsMarkForUpgradeCmd = &cli.Command{ Name: "mark-for-upgrade", Usage: "Mark a committed capacity sector for replacement by a sector with deals", @@ -1490,14 +1531,28 @@ var sectorsMarkForUpgradeCmd = &cli.Command{ return err } defer closer() + + api, nCloser, err := lcli.GetFullNodeAPI(cctx) + if err != nil { + return err + } + defer nCloser() ctx := lcli.ReqContext(cctx) + nv, err := api.StateNetworkVersion(ctx, types.EmptyTSK) + if err != nil { + return xerrors.Errorf("failed to get network version: %w", err) + } + if nv >= network.Version15 { + return xerrors.Errorf("classic cc upgrades disabled v15 and beyond, use `snap-up`") + } + id, err := strconv.ParseUint(cctx.Args().Get(0), 10, 64) if err != nil { return xerrors.Errorf("could not parse sector number: %w", err) } - return nodeApi.SectorMarkForUpgrade(ctx, abi.SectorNumber(id)) + return nodeApi.SectorMarkForUpgrade(ctx, abi.SectorNumber(id), false) }, } @@ -2000,6 +2055,25 @@ var sectorsBatchingPendingPreCommit = &cli.Command{ }, } +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) + if err != nil { + return err + } + defer closer() + ctx := lcli.ReqContext(cctx) + + if err := nodeApi.SectorMatchPendingPiecesToOpenSectors(ctx); err != nil { + return err + } + + return nil + }, +} + func yesno(b bool) string { if b { return color.GreenString("YES") diff --git a/cmd/lotus-seal-worker/main.go b/cmd/lotus-seal-worker/main.go index 5aec2f52f22..e6d6c0b6f36 100644 --- a/cmd/lotus-seal-worker/main.go +++ b/cmd/lotus-seal-worker/main.go @@ -163,6 +163,16 @@ var runCmd = &cli.Command{ Usage: "enable commit (32G sectors: all cores or GPUs, 128GiB Memory + 64GiB swap)", Value: true, }, + &cli.BoolFlag{ + Name: "replica-update", + Usage: "enable replica update", + Value: true, + }, + &cli.BoolFlag{ + Name: "prove-replica-update2", + Usage: "enable prove replica update 2", + Value: true, + }, &cli.IntFlag{ Name: "parallel-fetch-limit", Usage: "maximum fetch operations to run in parallel", @@ -268,6 +278,12 @@ var runCmd = &cli.Command{ if cctx.Bool("commit") { taskTypes = append(taskTypes, sealtasks.TTCommit2) } + if cctx.Bool("replicaupdate") { + taskTypes = append(taskTypes, sealtasks.TTReplicaUpdate) + } + if cctx.Bool("prove-replica-update2") { + taskTypes = append(taskTypes, sealtasks.TTProveReplicaUpdate2) + } if len(taskTypes) == 0 { return xerrors.Errorf("no task types specified") diff --git a/cmd/lotus-sim/simulation/mock/mock.go b/cmd/lotus-sim/simulation/mock/mock.go index 7656aaa28a6..70f9ba55013 100644 --- a/cmd/lotus-sim/simulation/mock/mock.go +++ b/cmd/lotus-sim/simulation/mock/mock.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/network" "github.com/ipfs/go-cid" logging "github.com/ipfs/go-log/v2" @@ -78,7 +79,7 @@ func (mockVerifier) VerifyReplicaUpdate(update proof7.ReplicaUpdateInfo) (bool, return false, nil } -func (mockVerifier) VerifyWinningPoSt(ctx context.Context, info proof5.WinningPoStVerifyInfo) (bool, error) { +func (mockVerifier) VerifyWinningPoSt(ctx context.Context, info proof7.WinningPoStVerifyInfo, poStEpoch abi.ChainEpoch, nv network.Version) (bool, error) { panic("should not be called") } func (mockVerifier) VerifyWindowPoSt(ctx context.Context, info proof5.WindowPoStVerifyInfo) (bool, error) { diff --git a/documentation/en/api-v0-methods-miner.md b/documentation/en/api-v0-methods-miner.md index 013aed641ce..272734c56f3 100644 --- a/documentation/en/api-v0-methods-miner.md +++ b/documentation/en/api-v0-methods-miner.md @@ -119,6 +119,7 @@ * [SectorGetExpectedSealDuration](#SectorGetExpectedSealDuration) * [SectorGetSealDelay](#SectorGetSealDelay) * [SectorMarkForUpgrade](#SectorMarkForUpgrade) + * [SectorMatchPendingPiecesToOpenSectors](#SectorMatchPendingPiecesToOpenSectors) * [SectorPreCommitFlush](#SectorPreCommitFlush) * [SectorPreCommitPending](#SectorPreCommitPending) * [SectorRemove](#SectorRemove) @@ -358,12 +359,15 @@ Inputs: { "SealProof": 8, "SectorNumber": 9, + "SectorKey": null, "SealedCID": { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" } } ], - "Bw==" + "Bw==", + 10101, + 15 ] ``` @@ -2474,12 +2478,22 @@ Perms: admin Inputs: ```json [ - 9 + 9, + true ] ``` Response: `{}` +### SectorMatchPendingPiecesToOpenSectors + + +Perms: admin + +Inputs: `null` + +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/api-v0-methods.md b/documentation/en/api-v0-methods.md index 59dfb09f6ef..8f851e319fc 100644 --- a/documentation/en/api-v0-methods.md +++ b/documentation/en/api-v0-methods.md @@ -2579,6 +2579,7 @@ Response: { "SealProof": 8, "SectorNumber": 9, + "SectorKey": null, "SealedCID": { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" } diff --git a/documentation/en/api-v1-unstable-methods.md b/documentation/en/api-v1-unstable-methods.md index 24a14222491..8aa2bfdd2d8 100644 --- a/documentation/en/api-v1-unstable-methods.md +++ b/documentation/en/api-v1-unstable-methods.md @@ -2591,6 +2591,7 @@ Response: { "SealProof": 8, "SectorNumber": 9, + "SectorKey": null, "SealedCID": { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" } diff --git a/documentation/en/cli-lotus-miner.md b/documentation/en/cli-lotus-miner.md index d501619572a..e609a8a0127 100644 --- a/documentation/en/cli-lotus-miner.md +++ b/documentation/en/cli-lotus-miner.md @@ -1525,6 +1525,7 @@ COMMANDS: extend Extend sector expiration terminate Terminate sector on-chain then remove (WARNING: This means losing power and collateral for the removed sector) remove Forcefully remove a sector (WARNING: This means losing power and collateral for the removed sector (use 'terminate' for lower penalty)) + snap-up Mark a committed capacity sector to be filled with deals mark-for-upgrade Mark a committed capacity sector for replacement by a sector with deals seal Manually start sealing a sector (filling any unused space with junk) set-seal-delay Set the time, in minutes, that a new sector waits for deals before sealing starts @@ -1746,6 +1747,19 @@ OPTIONS: ``` +### lotus-miner sectors snap-up +``` +NAME: + lotus-miner sectors snap-up - Mark a committed capacity sector to be filled with deals + +USAGE: + lotus-miner sectors snap-up [command options] + +OPTIONS: + --help, -h show help (default: false) + +``` + ### lotus-miner sectors mark-for-upgrade ``` NAME: diff --git a/documentation/en/default-lotus-miner-config.toml b/documentation/en/default-lotus-miner-config.toml index b034698a2d8..ced8e8a39a6 100644 --- a/documentation/en/default-lotus-miner-config.toml +++ b/documentation/en/default-lotus-miner-config.toml @@ -424,6 +424,15 @@ # env var: LOTUS_STORAGE_ALLOWUNSEAL #AllowUnseal = true + # env var: LOTUS_STORAGE_ALLOWREPLICAUPDATE + #AllowReplicaUpdate = true + + # env var: LOTUS_STORAGE_ALLOWPROVEREPLICAUPDATE1 + #AllowProveReplicaUpdate1 = true + + # env var: LOTUS_STORAGE_ALLOWPROVEREPLICAUPDATE2 + #AllowProveReplicaUpdate2 = true + # env var: LOTUS_STORAGE_RESOURCEFILTERING #ResourceFiltering = "hardware" diff --git a/extern/sector-storage/ffiwrapper/sealer_cgo.go b/extern/sector-storage/ffiwrapper/sealer_cgo.go index ec8554f34ae..e3939d3d10f 100644 --- a/extern/sector-storage/ffiwrapper/sealer_cgo.go +++ b/extern/sector-storage/ffiwrapper/sealer_cgo.go @@ -714,7 +714,6 @@ func (sb *Sealer) ReplicaUpdate(ctx context.Context, sector storage.SectorRef, p if err != nil { return empty, xerrors.Errorf("failed to update replica %d with new deal data: %w", sector.ID.Number, err) } - return storage.ReplicaUpdateOut{NewSealed: sealed, NewUnsealed: unsealed}, nil } @@ -854,6 +853,14 @@ func (sb *Sealer) ReleaseUnsealed(ctx context.Context, sector storage.SectorRef, return xerrors.Errorf("not supported at this layer") } +func (sb *Sealer) ReleaseReplicaUpgrade(ctx context.Context, sector storage.SectorRef) error { + return xerrors.Errorf("not supported at this layer") +} + +func (sb *Sealer) ReleaseSectorKey(ctx context.Context, sector storage.SectorRef) error { + return xerrors.Errorf("not supported at this layer") +} + func (sb *Sealer) Remove(ctx context.Context, sector storage.SectorRef) error { return xerrors.Errorf("not supported at this layer") // happens in localworker } diff --git a/extern/sector-storage/ffiwrapper/sealer_test.go b/extern/sector-storage/ffiwrapper/sealer_test.go index 509efe53269..cf8978464a4 100644 --- a/extern/sector-storage/ffiwrapper/sealer_test.go +++ b/extern/sector-storage/ffiwrapper/sealer_test.go @@ -19,6 +19,7 @@ import ( proof2 "github.com/filecoin-project/specs-actors/v2/actors/runtime/proof" proof5 "github.com/filecoin-project/specs-actors/v5/actors/runtime/proof" + proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" "github.com/ipfs/go-cid" @@ -180,16 +181,16 @@ func (s *seal) unseal(t *testing.T, sb *Sealer, sp *basicfs.Provider, si storage func post(t *testing.T, sealer *Sealer, skipped []abi.SectorID, seals ...seal) { randomness := abi.PoStRandomness{0, 9, 2, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 45, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 7} - sis := make([]proof2.SectorInfo, len(seals)) + xsis := make([]proof7.ExtendedSectorInfo, len(seals)) for i, s := range seals { - sis[i] = proof2.SectorInfo{ + xsis[i] = proof7.ExtendedSectorInfo{ SealProof: s.ref.ProofType, SectorNumber: s.ref.ID.Number, SealedCID: s.cids.Sealed, } } - proofs, skp, err := sealer.GenerateWindowPoSt(context.TODO(), seals[0].ref.ID.Miner, sis, randomness) + proofs, skp, err := sealer.GenerateWindowPoSt(context.TODO(), seals[0].ref.ID.Miner, xsis, randomness) if len(skipped) > 0 { require.Error(t, err) require.EqualValues(t, skipped, skp) @@ -200,7 +201,16 @@ func post(t *testing.T, sealer *Sealer, skipped []abi.SectorID, seals ...seal) { t.Fatalf("%+v", err) } - ok, err := ProofVerifier.VerifyWindowPoSt(context.TODO(), proof2.WindowPoStVerifyInfo{ + sis := make([]proof7.SectorInfo, len(seals)) + for i, xsi := range xsis { + sis[i] = proof7.SectorInfo{ + SealProof: xsi.SealProof, + SectorNumber: xsi.SectorNumber, + SealedCID: xsi.SealedCID, + } + } + + ok, err := ProofVerifier.VerifyWindowPoSt(context.TODO(), proof7.WindowPoStVerifyInfo{ Randomness: randomness, Proofs: proofs, ChallengedSectors: sis, diff --git a/extern/sector-storage/ffiwrapper/types.go b/extern/sector-storage/ffiwrapper/types.go index 1da7ea832b8..78d2c6eca39 100644 --- a/extern/sector-storage/ffiwrapper/types.go +++ b/extern/sector-storage/ffiwrapper/types.go @@ -4,13 +4,12 @@ import ( "context" "io" - proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" - - proof5 "github.com/filecoin-project/specs-actors/v5/actors/runtime/proof" + "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" "github.com/ipfs/go-cid" "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/specs-storage/storage" "github.com/filecoin-project/lotus/extern/sector-storage/ffiwrapper/basicfs" @@ -36,11 +35,11 @@ type Storage interface { } type Verifier interface { - VerifySeal(proof5.SealVerifyInfo) (bool, error) - VerifyAggregateSeals(aggregate proof5.AggregateSealVerifyProofAndInfos) (bool, error) - VerifyReplicaUpdate(update proof7.ReplicaUpdateInfo) (bool, error) - VerifyWinningPoSt(ctx context.Context, info proof5.WinningPoStVerifyInfo) (bool, error) - VerifyWindowPoSt(ctx context.Context, info proof5.WindowPoStVerifyInfo) (bool, error) + VerifySeal(proof.SealVerifyInfo) (bool, error) + VerifyAggregateSeals(aggregate proof.AggregateSealVerifyProofAndInfos) (bool, error) + VerifyReplicaUpdate(update proof.ReplicaUpdateInfo) (bool, error) + VerifyWinningPoSt(ctx context.Context, info proof.WinningPoStVerifyInfo, currEpoch abi.ChainEpoch, v network.Version) (bool, error) + VerifyWindowPoSt(ctx context.Context, info proof.WindowPoStVerifyInfo) (bool, error) GenerateWinningPoStSectorChallenge(context.Context, abi.RegisteredPoStProof, abi.ActorID, abi.PoStRandomness, uint64) ([]uint64, error) } @@ -49,7 +48,7 @@ type Verifier interface { type Prover interface { // TODO: move GenerateWinningPoStSectorChallenge from the Verifier interface to here - AggregateSealProofs(aggregateInfo proof5.AggregateSealVerifyProofAndInfos, proofs [][]byte) ([]byte, error) + AggregateSealProofs(aggregateInfo proof.AggregateSealVerifyProofAndInfos, proofs [][]byte) ([]byte, error) } type SectorProvider interface { diff --git a/extern/sector-storage/ffiwrapper/verifier_cgo.go b/extern/sector-storage/ffiwrapper/verifier_cgo.go index 66064b1f3ad..be38189f120 100644 --- a/extern/sector-storage/ffiwrapper/verifier_cgo.go +++ b/extern/sector-storage/ffiwrapper/verifier_cgo.go @@ -11,16 +11,17 @@ import ( ffi "github.com/filecoin-project/filecoin-ffi" "github.com/filecoin-project/go-state-types/abi" - proof5 "github.com/filecoin-project/specs-actors/v5/actors/runtime/proof" - proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" + "github.com/filecoin-project/go-state-types/network" + ffiproof "github.com/filecoin-project/specs-actors/v5/actors/runtime/proof" + "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" "github.com/filecoin-project/specs-storage/storage" "github.com/filecoin-project/lotus/extern/sector-storage/storiface" ) -func (sb *Sealer) GenerateWinningPoSt(ctx context.Context, minerID abi.ActorID, sectorInfo []proof5.SectorInfo, randomness abi.PoStRandomness) ([]proof5.PoStProof, error) { +func (sb *Sealer) GenerateWinningPoSt(ctx context.Context, minerID abi.ActorID, sectorInfo []proof.ExtendedSectorInfo, randomness abi.PoStRandomness) ([]proof.PoStProof, error) { randomness[31] &= 0x3f - privsectors, skipped, done, err := sb.pubSectorToPriv(ctx, minerID, sectorInfo, nil, abi.RegisteredSealProof.RegisteredWinningPoStProof) // TODO: FAULTS? + privsectors, skipped, done, err := sb.pubExtendedSectorToPriv(ctx, minerID, sectorInfo, nil, abi.RegisteredSealProof.RegisteredWinningPoStProof) // TODO: FAULTS? if err != nil { return nil, err } @@ -32,12 +33,13 @@ func (sb *Sealer) GenerateWinningPoSt(ctx context.Context, minerID abi.ActorID, return ffi.GenerateWinningPoSt(minerID, privsectors, randomness) } -func (sb *Sealer) GenerateWindowPoSt(ctx context.Context, minerID abi.ActorID, sectorInfo []proof5.SectorInfo, randomness abi.PoStRandomness) ([]proof5.PoStProof, []abi.SectorID, error) { +func (sb *Sealer) GenerateWindowPoSt(ctx context.Context, minerID abi.ActorID, sectorInfo []proof.ExtendedSectorInfo, randomness abi.PoStRandomness) ([]proof.PoStProof, []abi.SectorID, error) { randomness[31] &= 0x3f - privsectors, skipped, done, err := sb.pubSectorToPriv(ctx, minerID, sectorInfo, nil, abi.RegisteredSealProof.RegisteredWindowPoStProof) + privsectors, skipped, done, err := sb.pubExtendedSectorToPriv(ctx, minerID, sectorInfo, nil, abi.RegisteredSealProof.RegisteredWindowPoStProof) if err != nil { return nil, nil, xerrors.Errorf("gathering sector info: %w", err) } + defer done() if len(skipped) > 0 { @@ -53,11 +55,10 @@ func (sb *Sealer) GenerateWindowPoSt(ctx context.Context, minerID abi.ActorID, s Number: f, }) } - return proof, faultyIDs, err } -func (sb *Sealer) pubSectorToPriv(ctx context.Context, mid abi.ActorID, sectorInfo []proof5.SectorInfo, faults []abi.SectorNumber, rpt func(abi.RegisteredSealProof) (abi.RegisteredPoStProof, error)) (ffi.SortedPrivateSectorInfo, []abi.SectorID, func(), error) { +func (sb *Sealer) pubExtendedSectorToPriv(ctx context.Context, mid abi.ActorID, sectorInfo []proof.ExtendedSectorInfo, faults []abi.SectorNumber, rpt func(abi.RegisteredSealProof) (abi.RegisteredPoStProof, error)) (ffi.SortedPrivateSectorInfo, []abi.SectorID, func(), error) { fmap := map[abi.SectorNumber]struct{}{} for _, fault := range faults { fmap[fault] = struct{}{} @@ -81,14 +82,32 @@ func (sb *Sealer) pubSectorToPriv(ctx context.Context, mid abi.ActorID, sectorIn ID: abi.SectorID{Miner: mid, Number: s.SectorNumber}, ProofType: s.SealProof, } - - paths, d, err := sb.sectors.AcquireSector(ctx, sid, storiface.FTCache|storiface.FTSealed, 0, storiface.PathStorage) - if err != nil { - log.Warnw("failed to acquire sector, skipping", "sector", sid.ID, "error", err) - skipped = append(skipped, sid.ID) - continue + proveUpdate := s.SectorKey != nil + var cache string + var sealed string + if proveUpdate { + log.Debugf("Posting over updated sector for sector id: %d", s.SectorNumber) + paths, d, err := sb.sectors.AcquireSector(ctx, sid, storiface.FTUpdateCache|storiface.FTUpdate, 0, storiface.PathStorage) + if err != nil { + log.Warnw("failed to acquire FTUpdateCache and FTUpdate of sector, skipping", "sector", sid.ID, "error", err) + skipped = append(skipped, sid.ID) + continue + } + doneFuncs = append(doneFuncs, d) + cache = paths.UpdateCache + sealed = paths.Update + } else { + log.Debugf("Posting over sector key sector for sector id: %d", s.SectorNumber) + paths, d, err := sb.sectors.AcquireSector(ctx, sid, storiface.FTCache|storiface.FTSealed, 0, storiface.PathStorage) + if err != nil { + log.Warnw("failed to acquire FTCache and FTSealed of sector, skipping", "sector", sid.ID, "error", err) + skipped = append(skipped, sid.ID) + continue + } + doneFuncs = append(doneFuncs, d) + cache = paths.Cache + sealed = paths.Sealed } - doneFuncs = append(doneFuncs, d) postProofType, err := rpt(s.SealProof) if err != nil { @@ -96,11 +115,16 @@ func (sb *Sealer) pubSectorToPriv(ctx context.Context, mid abi.ActorID, sectorIn return ffi.SortedPrivateSectorInfo{}, nil, nil, xerrors.Errorf("acquiring registered PoSt proof from sector info %+v: %w", s, err) } + ffiInfo := ffiproof.SectorInfo{ + SealProof: s.SealProof, + SectorNumber: s.SectorNumber, + SealedCID: s.SealedCID, + } out = append(out, ffi.PrivateSectorInfo{ - CacheDirPath: paths.Cache, + CacheDirPath: cache, PoStProofType: postProofType, - SealedSectorPath: paths.Sealed, - SectorInfo: s, + SealedSectorPath: sealed, + SectorInfo: ffiInfo, }) } @@ -113,19 +137,19 @@ type proofVerifier struct{} var ProofVerifier = proofVerifier{} -func (proofVerifier) VerifySeal(info proof5.SealVerifyInfo) (bool, error) { +func (proofVerifier) VerifySeal(info proof.SealVerifyInfo) (bool, error) { return ffi.VerifySeal(info) } -func (proofVerifier) VerifyAggregateSeals(aggregate proof5.AggregateSealVerifyProofAndInfos) (bool, error) { +func (proofVerifier) VerifyAggregateSeals(aggregate proof.AggregateSealVerifyProofAndInfos) (bool, error) { return ffi.VerifyAggregateSeals(aggregate) } -func (proofVerifier) VerifyReplicaUpdate(update proof7.ReplicaUpdateInfo) (bool, error) { +func (proofVerifier) VerifyReplicaUpdate(update proof.ReplicaUpdateInfo) (bool, error) { return ffi.SectorUpdate.VerifyUpdateProof(update) } -func (proofVerifier) VerifyWinningPoSt(ctx context.Context, info proof5.WinningPoStVerifyInfo) (bool, error) { +func (proofVerifier) VerifyWinningPoSt(ctx context.Context, info proof.WinningPoStVerifyInfo, poStEpoch abi.ChainEpoch, version network.Version) (bool, error) { info.Randomness[31] &= 0x3f _, span := trace.StartSpan(ctx, "VerifyWinningPoSt") defer span.End() @@ -133,7 +157,7 @@ func (proofVerifier) VerifyWinningPoSt(ctx context.Context, info proof5.WinningP return ffi.VerifyWinningPoSt(info) } -func (proofVerifier) VerifyWindowPoSt(ctx context.Context, info proof5.WindowPoStVerifyInfo) (bool, error) { +func (proofVerifier) VerifyWindowPoSt(ctx context.Context, info proof.WindowPoStVerifyInfo) (bool, error) { info.Randomness[31] &= 0x3f _, span := trace.StartSpan(ctx, "VerifyWindowPoSt") defer span.End() diff --git a/extern/sector-storage/manager.go b/extern/sector-storage/manager.go index 748681544dc..ecabf0398d4 100644 --- a/extern/sector-storage/manager.go +++ b/extern/sector-storage/manager.go @@ -98,11 +98,13 @@ type SealerConfig struct { ParallelFetchLimit int // Local worker config - AllowAddPiece bool - AllowPreCommit1 bool - AllowPreCommit2 bool - AllowCommit bool - AllowUnseal bool + AllowAddPiece bool + AllowPreCommit1 bool + AllowPreCommit2 bool + AllowCommit bool + AllowUnseal bool + AllowReplicaUpdate bool + AllowProveReplicaUpdate2 bool // ResourceFiltering instructs the system which resource filtering strategy // to use when evaluating tasks against this worker. An empty value defaults @@ -144,7 +146,7 @@ func New(ctx context.Context, lstor *stores.Local, stor *stores.Remote, ls store go m.sched.runSched() localTasks := []sealtasks.TaskType{ - sealtasks.TTCommit1, sealtasks.TTFinalize, sealtasks.TTFetch, + sealtasks.TTCommit1, sealtasks.TTProveReplicaUpdate1, sealtasks.TTFinalize, sealtasks.TTFetch, } if sc.AllowAddPiece { localTasks = append(localTasks, sealtasks.TTAddPiece) @@ -161,6 +163,12 @@ func New(ctx context.Context, lstor *stores.Local, stor *stores.Remote, ls store if sc.AllowUnseal { localTasks = append(localTasks, sealtasks.TTUnseal) } + if sc.AllowReplicaUpdate { + localTasks = append(localTasks, sealtasks.TTReplicaUpdate) + } + if sc.AllowProveReplicaUpdate2 { + localTasks = append(localTasks, sealtasks.TTProveReplicaUpdate2) + } wcfg := WorkerConfig{ IgnoreResourceFiltering: sc.ResourceFiltering == ResourceFilteringDisabled, @@ -584,6 +592,23 @@ func (m *Manager) ReleaseSectorKey(ctx context.Context, sector storage.SectorRef return m.storage.Remove(ctx, sector.ID, storiface.FTSealed, true, nil) } +func (m *Manager) ReleaseReplicaUpgrade(ctx context.Context, sector storage.SectorRef) error { + ctx, cancel := context.WithCancel(ctx) + defer cancel() + + if err := m.index.StorageLock(ctx, sector.ID, storiface.FTNone, storiface.FTUpdateCache|storiface.FTUpdate); err != nil { + return xerrors.Errorf("acquiring sector lock: %w", err) + } + + if err := m.storage.Remove(ctx, sector.ID, storiface.FTUpdateCache, true, nil); err != nil { + return xerrors.Errorf("removing update cache: %w", err) + } + if err := m.storage.Remove(ctx, sector.ID, storiface.FTUpdate, true, nil); err != nil { + return xerrors.Errorf("removing update: %w", err) + } + return nil +} + func (m *Manager) GenerateSectorKeyFromData(ctx context.Context, sector storage.SectorRef, commD cid.Cid) error { ctx, cancel := context.WithCancel(ctx) @@ -666,7 +691,7 @@ func (m *Manager) Remove(ctx context.Context, sector storage.SectorRef) error { func (m *Manager) ReplicaUpdate(ctx context.Context, sector storage.SectorRef, pieces []abi.PieceInfo) (out storage.ReplicaUpdateOut, err error) { ctx, cancel := context.WithCancel(ctx) defer cancel() - + log.Errorf("manager is doing replica update") wk, wait, cancel, err := m.getWork(ctx, sealtasks.TTReplicaUpdate, sector, pieces) if err != nil { return storage.ReplicaUpdateOut{}, xerrors.Errorf("getWork: %w", err) @@ -677,7 +702,7 @@ func (m *Manager) ReplicaUpdate(ctx context.Context, sector storage.SectorRef, p waitRes := func() { p, werr := m.waitWork(ctx, wk) if werr != nil { - waitErr = werr + waitErr = xerrors.Errorf("waitWork: %w", werr) return } if p != nil { @@ -697,17 +722,17 @@ func (m *Manager) ReplicaUpdate(ctx context.Context, sector storage.SectorRef, p selector := newAllocSelector(m.index, storiface.FTUpdate|storiface.FTUpdateCache, storiface.PathSealing) err = m.sched.Schedule(ctx, sector, sealtasks.TTReplicaUpdate, selector, m.schedFetch(sector, storiface.FTSealed, storiface.PathSealing, storiface.AcquireCopy), func(ctx context.Context, w Worker) error { - + log.Errorf("scheduled work for replica update") err := m.startWork(ctx, w, wk)(w.ReplicaUpdate(ctx, sector, pieces)) if err != nil { - return err + return xerrors.Errorf("startWork: %w", err) } waitRes() return nil }) if err != nil { - return storage.ReplicaUpdateOut{}, err + return storage.ReplicaUpdateOut{}, xerrors.Errorf("Schedule: %w", err) } return out, waitErr } diff --git a/extern/sector-storage/mock/mock.go b/extern/sector-storage/mock/mock.go index ead4ebe26d8..7ef7800877b 100644 --- a/extern/sector-storage/mock/mock.go +++ b/extern/sector-storage/mock/mock.go @@ -10,14 +10,13 @@ import ( "math/rand" "sync" - proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" - - proof5 "github.com/filecoin-project/specs-actors/v5/actors/runtime/proof" + "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" "github.com/filecoin-project/dagstore/mount" ffiwrapper2 "github.com/filecoin-project/go-commp-utils/ffiwrapper" commcid "github.com/filecoin-project/go-fil-commcid" "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/specs-storage/storage" "github.com/ipfs/go-cid" logging "github.com/ipfs/go-log/v2" @@ -39,7 +38,7 @@ type SectorMgr struct { } type mockVerifProver struct { - aggregates map[string]proof5.AggregateSealVerifyProofAndInfos // used for logging bad verifies + aggregates map[string]proof.AggregateSealVerifyProofAndInfos // used for logging bad verifies } func NewMockSectorMgr(genesisSectors []abi.SectorID) *SectorMgr { @@ -336,14 +335,23 @@ func AddOpFinish(ctx context.Context) (context.Context, func()) { } } -func (mgr *SectorMgr) GenerateWinningPoSt(ctx context.Context, minerID abi.ActorID, sectorInfo []proof5.SectorInfo, randomness abi.PoStRandomness) ([]proof5.PoStProof, error) { +func (mgr *SectorMgr) GenerateWinningPoSt(ctx context.Context, minerID abi.ActorID, xSectorInfo []proof.ExtendedSectorInfo, randomness abi.PoStRandomness) ([]proof.PoStProof, error) { mgr.lk.Lock() defer mgr.lk.Unlock() + sectorInfo := make([]proof.SectorInfo, len(xSectorInfo)) + for i, xssi := range xSectorInfo { + sectorInfo[i] = proof.SectorInfo{ + SealProof: xssi.SealProof, + SectorNumber: xssi.SectorNumber, + SealedCID: xssi.SealedCID, + } + } + return generateFakePoSt(sectorInfo, abi.RegisteredSealProof.RegisteredWinningPoStProof, randomness), nil } -func (mgr *SectorMgr) GenerateWindowPoSt(ctx context.Context, minerID abi.ActorID, sectorInfo []proof5.SectorInfo, randomness abi.PoStRandomness) ([]proof5.PoStProof, []abi.SectorID, error) { +func (mgr *SectorMgr) GenerateWindowPoSt(ctx context.Context, minerID abi.ActorID, xSectorInfo []proof.ExtendedSectorInfo, randomness abi.PoStRandomness) ([]proof.PoStProof, []abi.SectorID, error) { mgr.lk.Lock() defer mgr.lk.Unlock() @@ -351,22 +359,22 @@ func (mgr *SectorMgr) GenerateWindowPoSt(ctx context.Context, minerID abi.ActorI return nil, nil, xerrors.Errorf("failed to post (mock)") } - si := make([]proof5.SectorInfo, 0, len(sectorInfo)) + si := make([]proof.ExtendedSectorInfo, 0, len(xSectorInfo)) var skipped []abi.SectorID var err error - for _, info := range sectorInfo { + for _, xsi := range xSectorInfo { sid := abi.SectorID{ Miner: minerID, - Number: info.SectorNumber, + Number: xsi.SectorNumber, } _, found := mgr.sectors[sid] if found && !mgr.sectors[sid].failed && !mgr.sectors[sid].corrupted { - si = append(si, info) + si = append(si, xsi) } else { skipped = append(skipped, sid) err = xerrors.Errorf("skipped some sectors") @@ -377,10 +385,19 @@ func (mgr *SectorMgr) GenerateWindowPoSt(ctx context.Context, minerID abi.ActorI return nil, skipped, err } - return generateFakePoSt(si, abi.RegisteredSealProof.RegisteredWindowPoStProof, randomness), skipped, nil + sectorInfo := make([]proof.SectorInfo, len(si)) + for i, xssi := range si { + sectorInfo[i] = proof.SectorInfo{ + SealProof: xssi.SealProof, + SectorNumber: xssi.SectorNumber, + SealedCID: xssi.SealedCID, + } + } + + return generateFakePoSt(sectorInfo, abi.RegisteredSealProof.RegisteredWindowPoStProof, randomness), skipped, nil } -func generateFakePoStProof(sectorInfo []proof5.SectorInfo, randomness abi.PoStRandomness) []byte { +func generateFakePoStProof(sectorInfo []proof.SectorInfo, randomness abi.PoStRandomness) []byte { randomness[31] &= 0x3f hasher := sha256.New() @@ -395,13 +412,13 @@ func generateFakePoStProof(sectorInfo []proof5.SectorInfo, randomness abi.PoStRa } -func generateFakePoSt(sectorInfo []proof5.SectorInfo, rpt func(abi.RegisteredSealProof) (abi.RegisteredPoStProof, error), randomness abi.PoStRandomness) []proof5.PoStProof { +func generateFakePoSt(sectorInfo []proof.SectorInfo, rpt func(abi.RegisteredSealProof) (abi.RegisteredPoStProof, error), randomness abi.PoStRandomness) []proof.PoStProof { wp, err := rpt(sectorInfo[0].SealProof) if err != nil { panic(err) } - return []proof5.PoStProof{ + return []proof.PoStProof{ { PoStProof: wp, ProofBytes: generateFakePoStProof(sectorInfo, randomness), @@ -465,6 +482,14 @@ func (mgr *SectorMgr) ReleaseUnsealed(ctx context.Context, sector storage.Sector return nil } +func (mgr *SectorMgr) ReleaseReplicaUpgrade(ctx context.Context, sector storage.SectorRef) error { + return nil +} + +func (mgr *SectorMgr) ReleaseSectorKey(ctx context.Context, sector storage.SectorRef) error { + return nil +} + func (mgr *SectorMgr) Remove(ctx context.Context, sector storage.SectorRef) error { mgr.lk.Lock() defer mgr.lk.Unlock() @@ -553,7 +578,7 @@ func (mgr *SectorMgr) ReturnGenerateSectorKeyFromData(ctx context.Context, callI panic("not supported") } -func (m mockVerifProver) VerifySeal(svi proof5.SealVerifyInfo) (bool, error) { +func (m mockVerifProver) VerifySeal(svi proof.SealVerifyInfo) (bool, error) { plen, err := svi.SealProof.ProofSize() if err != nil { return false, err @@ -574,7 +599,7 @@ func (m mockVerifProver) VerifySeal(svi proof5.SealVerifyInfo) (bool, error) { return true, nil } -func (m mockVerifProver) VerifyAggregateSeals(aggregate proof5.AggregateSealVerifyProofAndInfos) (bool, error) { +func (m mockVerifProver) VerifyAggregateSeals(aggregate proof.AggregateSealVerifyProofAndInfos) (bool, error) { out := make([]byte, m.aggLen(len(aggregate.Infos))) for pi, svi := range aggregate.Infos { for i := 0; i < 32; i++ { @@ -600,11 +625,11 @@ func (m mockVerifProver) VerifyAggregateSeals(aggregate proof5.AggregateSealVeri return ok, nil } -func (m mockVerifProver) VerifyReplicaUpdate(update proof7.ReplicaUpdateInfo) (bool, error) { +func (m mockVerifProver) VerifyReplicaUpdate(update proof.ReplicaUpdateInfo) (bool, error) { return true, nil } -func (m mockVerifProver) AggregateSealProofs(aggregateInfo proof5.AggregateSealVerifyProofAndInfos, proofs [][]byte) ([]byte, error) { +func (m mockVerifProver) AggregateSealProofs(aggregateInfo proof.AggregateSealVerifyProofAndInfos, proofs [][]byte) ([]byte, error) { out := make([]byte, m.aggLen(len(aggregateInfo.Infos))) // todo: figure out more real length for pi, proof := range proofs { for i := range proof[:32] { @@ -646,12 +671,12 @@ func (m mockVerifProver) aggLen(nproofs int) int { } } -func (m mockVerifProver) VerifyWinningPoSt(ctx context.Context, info proof5.WinningPoStVerifyInfo) (bool, error) { +func (m mockVerifProver) VerifyWinningPoSt(ctx context.Context, info proof.WinningPoStVerifyInfo, poStEpoch abi.ChainEpoch, nv network.Version) (bool, error) { info.Randomness[31] &= 0x3f return true, nil } -func (m mockVerifProver) VerifyWindowPoSt(ctx context.Context, info proof5.WindowPoStVerifyInfo) (bool, error) { +func (m mockVerifProver) VerifyWindowPoSt(ctx context.Context, info proof.WindowPoStVerifyInfo) (bool, error) { if len(info.Proofs) != 1 { return false, xerrors.Errorf("expected 1 proof entry") } @@ -674,7 +699,7 @@ func (m mockVerifProver) GenerateWinningPoStSectorChallenge(ctx context.Context, } var MockVerifier = mockVerifProver{ - aggregates: map[string]proof5.AggregateSealVerifyProofAndInfos{}, + aggregates: map[string]proof.AggregateSealVerifyProofAndInfos{}, } var MockProver = MockVerifier diff --git a/extern/sector-storage/teststorage_test.go b/extern/sector-storage/teststorage_test.go index 9fdb3a913dd..cb15184be04 100644 --- a/extern/sector-storage/teststorage_test.go +++ b/extern/sector-storage/teststorage_test.go @@ -7,7 +7,7 @@ import ( "github.com/ipfs/go-cid" "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/specs-actors/actors/runtime/proof" + "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" "github.com/filecoin-project/specs-storage/storage" "github.com/filecoin-project/lotus/extern/sector-storage/ffiwrapper" @@ -23,11 +23,11 @@ type testExec struct { apch chan chan apres } -func (t *testExec) GenerateWinningPoSt(ctx context.Context, minerID abi.ActorID, sectorInfo []proof.SectorInfo, randomness abi.PoStRandomness) ([]proof.PoStProof, error) { +func (t *testExec) GenerateWinningPoSt(ctx context.Context, minerID abi.ActorID, sectorInfo []proof.ExtendedSectorInfo, randomness abi.PoStRandomness) ([]proof.PoStProof, error) { panic("implement me") } -func (t *testExec) GenerateWindowPoSt(ctx context.Context, minerID abi.ActorID, sectorInfo []proof.SectorInfo, randomness abi.PoStRandomness) (proof []proof.PoStProof, skipped []abi.SectorID, err error) { +func (t *testExec) GenerateWindowPoSt(ctx context.Context, minerID abi.ActorID, sectorInfo []proof.ExtendedSectorInfo, randomness abi.PoStRandomness) (proof []proof.PoStProof, skipped []abi.SectorID, err error) { panic("implement me") } @@ -59,6 +59,14 @@ func (t *testExec) ReleaseSealed(ctx context.Context, sector storage.SectorRef) panic("implement me") } +func (t *testExec) ReleaseSectorKey(ctx context.Context, sector storage.SectorRef) error { + panic("implement me") +} + +func (t *testExec) ReleaseReplicaUpgrade(ctx context.Context, sector storage.SectorRef) error { + panic("implement me") +} + func (t *testExec) Remove(ctx context.Context, sector storage.SectorRef) error { panic("implement me") } diff --git a/extern/storage-sealing/cbor_gen.go b/extern/storage-sealing/cbor_gen.go index 1dfaf54a5de..c1e2b08fa4c 100644 --- a/extern/storage-sealing/cbor_gen.go +++ b/extern/storage-sealing/cbor_gen.go @@ -143,7 +143,7 @@ func (t *SectorInfo) MarshalCBOR(w io.Writer) error { _, err := w.Write(cbg.CborNull) return err } - if _, err := w.Write([]byte{184, 26}); err != nil { + if _, err := w.Write([]byte{184, 32}); err != nil { return err } @@ -573,6 +573,137 @@ func (t *SectorInfo) MarshalCBOR(w io.Writer) error { return err } + // t.CCUpdate (bool) (bool) + if len("CCUpdate") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"CCUpdate\" was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajTextString, uint64(len("CCUpdate"))); err != nil { + return err + } + if _, err := io.WriteString(w, string("CCUpdate")); err != nil { + return err + } + + if err := cbg.WriteBool(w, t.CCUpdate); err != nil { + return err + } + + // t.CCPieces ([]sealing.Piece) (slice) + if len("CCPieces") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"CCPieces\" was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajTextString, uint64(len("CCPieces"))); err != nil { + return err + } + if _, err := io.WriteString(w, string("CCPieces")); err != nil { + return err + } + + if len(t.CCPieces) > cbg.MaxLength { + return xerrors.Errorf("Slice value in field t.CCPieces was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajArray, uint64(len(t.CCPieces))); err != nil { + return err + } + for _, v := range t.CCPieces { + if err := v.MarshalCBOR(w); err != nil { + return err + } + } + + // t.UpdateSealed (cid.Cid) (struct) + if len("UpdateSealed") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"UpdateSealed\" was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajTextString, uint64(len("UpdateSealed"))); err != nil { + return err + } + if _, err := io.WriteString(w, string("UpdateSealed")); err != nil { + return err + } + + if t.UpdateSealed == nil { + if _, err := w.Write(cbg.CborNull); err != nil { + return err + } + } else { + if err := cbg.WriteCidBuf(scratch, w, *t.UpdateSealed); err != nil { + return xerrors.Errorf("failed to write cid field t.UpdateSealed: %w", err) + } + } + + // t.UpdateUnsealed (cid.Cid) (struct) + if len("UpdateUnsealed") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"UpdateUnsealed\" was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajTextString, uint64(len("UpdateUnsealed"))); err != nil { + return err + } + if _, err := io.WriteString(w, string("UpdateUnsealed")); err != nil { + return err + } + + if t.UpdateUnsealed == nil { + if _, err := w.Write(cbg.CborNull); err != nil { + return err + } + } else { + if err := cbg.WriteCidBuf(scratch, w, *t.UpdateUnsealed); err != nil { + return xerrors.Errorf("failed to write cid field t.UpdateUnsealed: %w", err) + } + } + + // t.ReplicaUpdateProof (storage.ReplicaUpdateProof) (slice) + if len("ReplicaUpdateProof") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"ReplicaUpdateProof\" was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajTextString, uint64(len("ReplicaUpdateProof"))); err != nil { + return err + } + if _, err := io.WriteString(w, string("ReplicaUpdateProof")); err != nil { + return err + } + + if len(t.ReplicaUpdateProof) > cbg.ByteArrayMaxLen { + return xerrors.Errorf("Byte array in field t.ReplicaUpdateProof was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajByteString, uint64(len(t.ReplicaUpdateProof))); err != nil { + return err + } + + if _, err := w.Write(t.ReplicaUpdateProof[:]); err != nil { + return err + } + + // t.ReplicaUpdateMessage (cid.Cid) (struct) + if len("ReplicaUpdateMessage") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"ReplicaUpdateMessage\" was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajTextString, uint64(len("ReplicaUpdateMessage"))); err != nil { + return err + } + if _, err := io.WriteString(w, string("ReplicaUpdateMessage")); err != nil { + return err + } + + if t.ReplicaUpdateMessage == nil { + if _, err := w.Write(cbg.CborNull); err != nil { + return err + } + } else { + if err := cbg.WriteCidBuf(scratch, w, *t.ReplicaUpdateMessage); err != nil { + return xerrors.Errorf("failed to write cid field t.ReplicaUpdateMessage: %w", err) + } + } + // t.FaultReportMsg (cid.Cid) (struct) if len("FaultReportMsg") > cbg.MaxLength { return xerrors.Errorf("Value in field \"FaultReportMsg\" was too long") @@ -1166,6 +1297,145 @@ func (t *SectorInfo) UnmarshalCBOR(r io.Reader) error { } t.InvalidProofs = uint64(extra) + } + // t.CCUpdate (bool) (bool) + case "CCUpdate": + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajOther { + return fmt.Errorf("booleans must be major type 7") + } + switch extra { + case 20: + t.CCUpdate = false + case 21: + t.CCUpdate = true + default: + return fmt.Errorf("booleans are either major type 7, value 20 or 21 (got %d)", extra) + } + // t.CCPieces ([]sealing.Piece) (slice) + case "CCPieces": + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + + if extra > cbg.MaxLength { + return fmt.Errorf("t.CCPieces: array too large (%d)", extra) + } + + if maj != cbg.MajArray { + return fmt.Errorf("expected cbor array") + } + + if extra > 0 { + t.CCPieces = make([]Piece, extra) + } + + for i := 0; i < int(extra); i++ { + + var v Piece + if err := v.UnmarshalCBOR(br); err != nil { + return err + } + + t.CCPieces[i] = v + } + + // t.UpdateSealed (cid.Cid) (struct) + case "UpdateSealed": + + { + + b, err := br.ReadByte() + if err != nil { + return err + } + if b != cbg.CborNull[0] { + if err := br.UnreadByte(); err != nil { + return err + } + + c, err := cbg.ReadCid(br) + if err != nil { + return xerrors.Errorf("failed to read cid field t.UpdateSealed: %w", err) + } + + t.UpdateSealed = &c + } + + } + // t.UpdateUnsealed (cid.Cid) (struct) + case "UpdateUnsealed": + + { + + b, err := br.ReadByte() + if err != nil { + return err + } + if b != cbg.CborNull[0] { + if err := br.UnreadByte(); err != nil { + return err + } + + c, err := cbg.ReadCid(br) + if err != nil { + return xerrors.Errorf("failed to read cid field t.UpdateUnsealed: %w", err) + } + + t.UpdateUnsealed = &c + } + + } + // t.ReplicaUpdateProof (storage.ReplicaUpdateProof) (slice) + case "ReplicaUpdateProof": + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + + if extra > cbg.ByteArrayMaxLen { + return fmt.Errorf("t.ReplicaUpdateProof: byte array too large (%d)", extra) + } + if maj != cbg.MajByteString { + return fmt.Errorf("expected byte array") + } + + if extra > 0 { + t.ReplicaUpdateProof = make([]uint8, extra) + } + + if _, err := io.ReadFull(br, t.ReplicaUpdateProof[:]); err != nil { + return err + } + // t.ReplicaUpdateMessage (cid.Cid) (struct) + case "ReplicaUpdateMessage": + + { + + b, err := br.ReadByte() + if err != nil { + return err + } + if b != cbg.CborNull[0] { + if err := br.UnreadByte(); err != nil { + return err + } + + c, err := cbg.ReadCid(br) + if err != nil { + return xerrors.Errorf("failed to read cid field t.ReplicaUpdateMessage: %w", err) + } + + t.ReplicaUpdateMessage = &c + } + } // t.FaultReportMsg (cid.Cid) (struct) case "FaultReportMsg": diff --git a/extern/storage-sealing/checks.go b/extern/storage-sealing/checks.go index 74a791fcbef..42425e78243 100644 --- a/extern/storage-sealing/checks.go +++ b/extern/storage-sealing/checks.go @@ -35,6 +35,9 @@ type ErrInvalidProof struct{ error } type ErrNoPrecommit struct{ error } type ErrCommitWaitFailed struct{ error } +type ErrBadRU struct{ error } +type ErrBadPR struct{ error } + func checkPieces(ctx context.Context, maddr address.Address, si SectorInfo, api SealingAPI) error { tok, height, err := api.ChainHead(ctx) if err != nil { @@ -187,3 +190,32 @@ func (m *Sealing) checkCommit(ctx context.Context, si SectorInfo, proof []byte, return nil } + +// check that sector info is good after running a replica update +func checkReplicaUpdate(ctx context.Context, maddr address.Address, si SectorInfo, tok TipSetToken, api SealingAPI) error { + + if err := checkPieces(ctx, maddr, si, api); err != nil { + return err + } + if !si.CCUpdate { + return xerrors.Errorf("replica update on sector not marked for update") + } + + commD, err := api.StateComputeDataCommitment(ctx, maddr, si.SectorType, si.dealIDs(), tok) + if err != nil { + return &ErrApi{xerrors.Errorf("calling StateComputeDataCommitment: %w", err)} + } + if si.UpdateUnsealed == nil || !commD.Equals(*si.UpdateUnsealed) { + return &ErrBadRU{xerrors.Errorf("on chain CommD differs from sector: %s != %s", commD, si.CommD)} + } + + if si.UpdateSealed == nil { + return &ErrBadRU{xerrors.Errorf("nil sealed cid")} + } + if si.ReplicaUpdateProof == nil { + return ErrBadPR{xerrors.Errorf("nil PR2 proof")} + } + + return nil + +} diff --git a/extern/storage-sealing/fsm.go b/extern/storage-sealing/fsm.go index 10bec7e0bd9..83874e907de 100644 --- a/extern/storage-sealing/fsm.go +++ b/extern/storage-sealing/fsm.go @@ -133,6 +133,44 @@ var fsmPlanners = map[SectorState]func(events []statemachine.Event, state *Secto on(SectorFinalizeFailed{}, FinalizeFailed), ), + // Snap deals + SnapDealsWaitDeals: planOne( + on(SectorAddPiece{}, SnapDealsAddPiece), + on(SectorStartPacking{}, SnapDealsPacking), + ), + SnapDealsAddPiece: planOne( + on(SectorPieceAdded{}, SnapDealsWaitDeals), + apply(SectorStartPacking{}), + apply(SectorAddPiece{}), + on(SectorAddPieceFailed{}, SnapDealsAddPieceFailed), + ), + SnapDealsPacking: planOne( + on(SectorPacked{}, UpdateReplica), + ), + UpdateReplica: planOne( + on(SectorReplicaUpdate{}, ProveReplicaUpdate), + on(SectorUpdateReplicaFailed{}, ReplicaUpdateFailed), + on(SectorDealsExpired{}, SnapDealsDealsExpired), + on(SectorInvalidDealIDs{}, SnapDealsRecoverDealIDs), + ), + ProveReplicaUpdate: planOne( + on(SectorProveReplicaUpdate{}, SubmitReplicaUpdate), + on(SectorProveReplicaUpdateFailed{}, ReplicaUpdateFailed), + on(SectorDealsExpired{}, SnapDealsDealsExpired), + on(SectorInvalidDealIDs{}, SnapDealsRecoverDealIDs), + ), + SubmitReplicaUpdate: planOne( + on(SectorReplicaUpdateSubmitted{}, ReplicaUpdateWait), + on(SectorSubmitReplicaUpdateFailed{}, ReplicaUpdateFailed), + ), + ReplicaUpdateWait: planOne( + on(SectorReplicaUpdateLanded{}, FinalizeReplicaUpdate), + on(SectorSubmitReplicaUpdateFailed{}, ReplicaUpdateFailed), + on(SectorAbortUpgrade{}, AbortUpgrade), + ), + FinalizeReplicaUpdate: planOne( + on(SectorFinalized{}, Proving), + ), // Sealing errors AddPieceFailed: planOne( @@ -188,11 +226,37 @@ var fsmPlanners = map[SectorState]func(events []statemachine.Event, state *Secto onReturning(SectorUpdateDealIDs{}), ), + // Snap Deals Errors + SnapDealsAddPieceFailed: planOne( + on(SectorRetryWaitDeals{}, SnapDealsWaitDeals), + apply(SectorStartPacking{}), + apply(SectorAddPiece{}), + ), + SnapDealsDealsExpired: planOne( + on(SectorAbortUpgrade{}, AbortUpgrade), + ), + SnapDealsRecoverDealIDs: planOne( + on(SectorUpdateDealIDs{}, SubmitReplicaUpdate), + on(SectorAbortUpgrade{}, AbortUpgrade), + ), + AbortUpgrade: planOneOrIgnore( + on(SectorRevertUpgradeToProving{}, Proving), + ), + ReplicaUpdateFailed: planOne( + on(SectorRetrySubmitReplicaUpdateWait{}, ReplicaUpdateWait), + on(SectorRetrySubmitReplicaUpdate{}, SubmitReplicaUpdate), + on(SectorRetryReplicaUpdate{}, UpdateReplica), + on(SectorRetryProveReplicaUpdate{}, ProveReplicaUpdate), + on(SectorInvalidDealIDs{}, SnapDealsRecoverDealIDs), + on(SectorDealsExpired{}, SnapDealsDealsExpired), + ), + // Post-seal Proving: planOne( on(SectorFaultReported{}, FaultReported), on(SectorFaulty{}, Faulty), + on(SectorStartCCUpdate{}, SnapDealsWaitDeals), ), Terminating: planOne( on(SectorTerminating{}, TerminateWait), @@ -209,7 +273,7 @@ var fsmPlanners = map[SectorState]func(events []statemachine.Event, state *Secto TerminateFailed: planOne( // SectorTerminating (global) ), - Removing: planOne( + Removing: planOneOrIgnore( on(SectorRemoved{}, Removed), on(SectorRemoveFailed{}, RemoveFailed), ), @@ -355,13 +419,6 @@ func (m *Sealing) plan(events []statemachine.Event, state *SectorInfo) (func(sta log.Errorw("update sector stats", "error", err) } - // todo: drop this, use Context iface everywhere - wrapCtx := func(f func(Context, SectorInfo) error) func(statemachine.Context, SectorInfo) error { - return func(ctx statemachine.Context, info SectorInfo) error { - return f(&ctx, info) - } - } - switch state.State { // Happy path case Empty: @@ -403,6 +460,24 @@ func (m *Sealing) plan(events []statemachine.Event, state *SectorInfo) (func(sta case FinalizeSector: return m.handleFinalizeSector, processed, nil + // Snap deals updates + case SnapDealsWaitDeals: + return m.handleWaitDeals, processed, nil + case SnapDealsAddPiece: + return m.handleAddPiece, processed, nil + case SnapDealsPacking: + return m.handlePacking, processed, nil + case UpdateReplica: + return m.handleReplicaUpdate, processed, nil + case ProveReplicaUpdate: + return m.handleProveReplicaUpdate, processed, nil + case SubmitReplicaUpdate: + return m.handleSubmitReplicaUpdate, processed, nil + case ReplicaUpdateWait: + return m.handleReplicaUpdateWait, processed, nil + case FinalizeReplicaUpdate: + return m.handleFinalizeReplicaUpdate, processed, nil + // Handled failure modes case AddPieceFailed: return m.handleAddPieceFailed, processed, nil @@ -426,7 +501,20 @@ func (m *Sealing) plan(events []statemachine.Event, state *SectorInfo) (func(sta case DealsExpired: return m.handleDealsExpired, processed, nil case RecoverDealIDs: - return wrapCtx(m.HandleRecoverDealIDs), processed, nil + return m.HandleRecoverDealIDs, processed, nil + + // Snap Deals failure modes + case SnapDealsAddPieceFailed: + return m.handleAddPieceFailed, processed, nil + + case SnapDealsDealsExpired: + return m.handleDealsExpiredSnapDeals, processed, nil + case SnapDealsRecoverDealIDs: + return m.handleSnapDealsRecoverDealIDs, processed, nil + case ReplicaUpdateFailed: + return m.handleSubmitReplicaUpdateFailed, processed, nil + case AbortUpgrade: + return m.handleAbortUpgrade, processed, nil // Post-seal case Proving: @@ -642,3 +730,16 @@ func planOne(ts ...func() (mut mutator, next func(*SectorInfo) (more bool, err e return uint64(len(events)), nil } } + +// planOne but ignores unhandled states without erroring, this prevents the need to handle all possible events creating +// error during forced override +func planOneOrIgnore(ts ...func() (mut mutator, next func(*SectorInfo) (more bool, err error))) func(events []statemachine.Event, state *SectorInfo) (uint64, error) { + f := planOne(ts...) + return func(events []statemachine.Event, state *SectorInfo) (uint64, error) { + cnt, err := f(events, state) + if err != nil { + log.Warnf("planOneOrIgnore: ignoring error from planOne: %s", err) + } + return cnt, nil + } +} diff --git a/extern/storage-sealing/fsm_events.go b/extern/storage-sealing/fsm_events.go index 650a817995e..395c4b94a74 100644 --- a/extern/storage-sealing/fsm_events.go +++ b/extern/storage-sealing/fsm_events.go @@ -295,6 +295,46 @@ type SectorFinalizeFailed struct{ error } func (evt SectorFinalizeFailed) FormatError(xerrors.Printer) (next error) { return evt.error } func (evt SectorFinalizeFailed) apply(*SectorInfo) {} +// Snap deals // CC update path + +type SectorStartCCUpdate struct{} + +func (evt SectorStartCCUpdate) apply(state *SectorInfo) { + state.CCUpdate = true + // Clear filler piece but remember in case of abort + state.CCPieces = state.Pieces + state.Pieces = nil +} + +type SectorReplicaUpdate struct { + Out storage.ReplicaUpdateOut +} + +func (evt SectorReplicaUpdate) apply(state *SectorInfo) { + state.UpdateSealed = &evt.Out.NewSealed + state.UpdateUnsealed = &evt.Out.NewUnsealed +} + +type SectorProveReplicaUpdate struct { + Proof storage.ReplicaUpdateProof +} + +func (evt SectorProveReplicaUpdate) apply(state *SectorInfo) { + state.ReplicaUpdateProof = evt.Proof +} + +type SectorReplicaUpdateSubmitted struct { + Message cid.Cid +} + +func (evt SectorReplicaUpdateSubmitted) apply(state *SectorInfo) { + state.ReplicaUpdateMessage = &evt.Message +} + +type SectorReplicaUpdateLanded struct{} + +func (evt SectorReplicaUpdateLanded) apply(state *SectorInfo) {} + // Failed state recovery type SectorRetrySealPreCommit1 struct{} @@ -351,6 +391,60 @@ func (evt SectorUpdateDealIDs) apply(state *SectorInfo) { } } +// Snap Deals failure and recovery + +type SectorRetryReplicaUpdate struct{} + +func (evt SectorRetryReplicaUpdate) apply(state *SectorInfo) {} + +type SectorRetryProveReplicaUpdate struct{} + +func (evt SectorRetryProveReplicaUpdate) apply(state *SectorInfo) {} + +type SectorUpdateReplicaFailed struct{ error } + +func (evt SectorUpdateReplicaFailed) FormatError(xerrors.Printer) (next error) { return evt.error } +func (evt SectorUpdateReplicaFailed) apply(state *SectorInfo) {} + +type SectorProveReplicaUpdateFailed struct{ error } + +func (evt SectorProveReplicaUpdateFailed) FormatError(xerrors.Printer) (next error) { + return evt.error +} +func (evt SectorProveReplicaUpdateFailed) apply(state *SectorInfo) {} + +type SectorAbortUpgrade struct{ error } + +func (evt SectorAbortUpgrade) apply(state *SectorInfo) {} +func (evt SectorAbortUpgrade) FormatError(xerrors.Printer) (next error) { + return evt.error +} + +type SectorRevertUpgradeToProving struct{} + +func (evt SectorRevertUpgradeToProving) apply(state *SectorInfo) { + // cleanup sector state so that it is back in proving + state.CCUpdate = false + state.UpdateSealed = nil + state.UpdateUnsealed = nil + state.ReplicaUpdateProof = nil + state.ReplicaUpdateMessage = nil + state.Pieces = state.CCPieces + state.CCPieces = nil +} + +type SectorRetrySubmitReplicaUpdateWait struct{} + +func (evt SectorRetrySubmitReplicaUpdateWait) apply(state *SectorInfo) {} + +type SectorRetrySubmitReplicaUpdate struct{} + +func (evt SectorRetrySubmitReplicaUpdate) apply(state *SectorInfo) {} + +type SectorSubmitReplicaUpdateFailed struct{} + +func (evt SectorSubmitReplicaUpdateFailed) apply(state *SectorInfo) {} + // Faults type SectorFaulty struct{} diff --git a/extern/storage-sealing/input.go b/extern/storage-sealing/input.go index 60c3a79e288..f3259f0cced 100644 --- a/extern/storage-sealing/input.go +++ b/extern/storage-sealing/input.go @@ -59,6 +59,8 @@ func (m *Sealing) handleWaitDeals(ctx statemachine.Context, sector SectorInfo) e return ctx.Send(SectorAddPiece{}) }, + number: sector.SectorNumber, + ccUpdate: sector.CCUpdate, } } else { // make sure we're only accounting for pieces which were correctly added @@ -329,6 +331,17 @@ func (m *Sealing) SectorAddPieceToAny(ctx context.Context, size abi.UnpaddedPiec return api.SectorOffset{Sector: res.sn, Offset: res.offset.Padded()}, res.err } +func (m *Sealing) MatchPendingPiecesToOpenSectors(ctx context.Context) error { + sp, err := m.currentSealProof(ctx) + if err != nil { + return xerrors.Errorf("failed to get current seal proof: %w", err) + } + log.Debug("pieces to sector matching waiting for lock") + m.inputLk.Lock() + defer m.inputLk.Unlock() + return m.updateInput(ctx, sp) +} + // called with m.inputLk func (m *Sealing) updateInput(ctx context.Context, sp abi.RegisteredSealProof) error { ssize, err := sp.SectorSize() @@ -356,8 +369,33 @@ func (m *Sealing) updateInput(ctx context.Context, sp abi.RegisteredSealProof) e toAssign[proposalCid] = struct{}{} + memo := make(map[abi.SectorNumber]abi.ChainEpoch) + expF := func(sn abi.SectorNumber) (abi.ChainEpoch, error) { + if exp, ok := memo[sn]; ok { + return exp, nil + } + onChainInfo, err := m.Api.StateSectorGetInfo(ctx, m.maddr, sn, TipSetToken{}) + if err != nil { + return 0, err + } + memo[sn] = onChainInfo.Expiration + return onChainInfo.Expiration, nil + } + for id, sector := range m.openSectors { 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) + if err != nil { + log.Errorf("failed to check expiration for cc Update sector %d", sector.number) + continue + } + if !ok { + exp, _ := expF(sector.number) + log.Infof("CC update sector %d cannot fit deal, expiration %d before deal end epoch %d", id, exp, piece.deal.DealProposal.EndEpoch) + continue + } if piece.size <= avail { // (note: if we have enough space for the piece, we also have enough space for inter-piece padding) matches = append(matches, match{ @@ -416,6 +454,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.tryCreateDealSector(ctx, sp); err != nil { log.Errorw("Failed to create a new sector for deals", "error", err) } diff --git a/extern/storage-sealing/mocks/api.go b/extern/storage-sealing/mocks/api.go index cc8561dc793..95c222ecdc4 100644 --- a/extern/storage-sealing/mocks/api.go +++ b/extern/storage-sealing/mocks/api.go @@ -213,6 +213,21 @@ func (mr *MockSealingAPIMockRecorder) StateMarketStorageDealProposal(arg0, arg1, return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMarketStorageDealProposal", reflect.TypeOf((*MockSealingAPI)(nil).StateMarketStorageDealProposal), arg0, arg1, arg2) } +// StateMinerActiveSectors mocks base method. +func (m *MockSealingAPI) StateMinerActiveSectors(arg0 context.Context, arg1 address.Address, arg2 sealing.TipSetToken) ([]*miner.SectorOnChainInfo, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateMinerActiveSectors", arg0, arg1, arg2) + ret0, _ := ret[0].([]*miner.SectorOnChainInfo) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateMinerActiveSectors indicates an expected call of StateMinerActiveSectors. +func (mr *MockSealingAPIMockRecorder) StateMinerActiveSectors(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMinerActiveSectors", reflect.TypeOf((*MockSealingAPI)(nil).StateMinerActiveSectors), arg0, arg1, arg2) +} + // StateMinerAvailableBalance mocks base method. func (m *MockSealingAPI) StateMinerAvailableBalance(arg0 context.Context, arg1 address.Address, arg2 sealing.TipSetToken) (big.Int, error) { m.ctrl.T.Helper() diff --git a/extern/storage-sealing/sealing.go b/extern/storage-sealing/sealing.go index 583bed05260..81f6b38e93c 100644 --- a/extern/storage-sealing/sealing.go +++ b/extern/storage-sealing/sealing.go @@ -63,6 +63,7 @@ type SealingAPI interface { StateMinerInfo(context.Context, address.Address, TipSetToken) (miner.MinerInfo, error) StateMinerAvailableBalance(context.Context, address.Address, TipSetToken) (big.Int, error) StateMinerSectorAllocated(context.Context, address.Address, abi.SectorNumber, TipSetToken) (bool, error) + StateMinerActiveSectors(context.Context, address.Address, TipSetToken) ([]*miner.SectorOnChainInfo, error) StateMarketStorageDeal(context.Context, abi.DealID, TipSetToken) (*api.MarketDeal, error) StateMarketStorageDealProposal(context.Context, abi.DealID, TipSetToken) (market.DealProposal, error) StateNetworkVersion(ctx context.Context, tok TipSetToken) (network.Version, error) @@ -121,11 +122,24 @@ type Sealing struct { } type openSector struct { - used abi.UnpaddedPieceSize // change to bitfield/rle when AddPiece gains offset support to better fill sectors + used abi.UnpaddedPieceSize // change to bitfield/rle when AddPiece gains offset support to better fill sectors + number abi.SectorNumber + ccUpdate bool maybeAccept func(cid.Cid) error // called with inputLk } +func (o *openSector) dealFitsInLifetime(dealEnd abi.ChainEpoch, expF func(sn abi.SectorNumber) (abi.ChainEpoch, error)) (bool, error) { + if !o.ccUpdate { + return true, nil + } + expiration, err := expF(o.number) + if err != nil { + return false, err + } + return expiration >= dealEnd, nil +} + type pendingPiece struct { size abi.UnpaddedPieceSize deal api.PieceDealInfo diff --git a/extern/storage-sealing/sector_state.go b/extern/storage-sealing/sector_state.go index b606de5aeb5..ba6df7ff486 100644 --- a/extern/storage-sealing/sector_state.go +++ b/extern/storage-sealing/sector_state.go @@ -3,50 +3,65 @@ package sealing type SectorState string var ExistSectorStateList = map[SectorState]struct{}{ - Empty: {}, - WaitDeals: {}, - Packing: {}, - AddPiece: {}, - AddPieceFailed: {}, - GetTicket: {}, - PreCommit1: {}, - PreCommit2: {}, - PreCommitting: {}, - PreCommitWait: {}, - SubmitPreCommitBatch: {}, - PreCommitBatchWait: {}, - WaitSeed: {}, - Committing: {}, - CommitFinalize: {}, - CommitFinalizeFailed: {}, - SubmitCommit: {}, - CommitWait: {}, - SubmitCommitAggregate: {}, - CommitAggregateWait: {}, - FinalizeSector: {}, - Proving: {}, - FailedUnrecoverable: {}, - SealPreCommit1Failed: {}, - SealPreCommit2Failed: {}, - PreCommitFailed: {}, - ComputeProofFailed: {}, - CommitFailed: {}, - PackingFailed: {}, - FinalizeFailed: {}, - DealsExpired: {}, - RecoverDealIDs: {}, - Faulty: {}, - FaultReported: {}, - FaultedFinal: {}, - Terminating: {}, - TerminateWait: {}, - TerminateFinality: {}, - TerminateFailed: {}, - Removing: {}, - RemoveFailed: {}, - Removed: {}, + Empty: {}, + WaitDeals: {}, + Packing: {}, + AddPiece: {}, + AddPieceFailed: {}, + GetTicket: {}, + PreCommit1: {}, + PreCommit2: {}, + PreCommitting: {}, + PreCommitWait: {}, + SubmitPreCommitBatch: {}, + PreCommitBatchWait: {}, + WaitSeed: {}, + Committing: {}, + CommitFinalize: {}, + CommitFinalizeFailed: {}, + SubmitCommit: {}, + CommitWait: {}, + SubmitCommitAggregate: {}, + CommitAggregateWait: {}, + FinalizeSector: {}, + Proving: {}, + FailedUnrecoverable: {}, + SealPreCommit1Failed: {}, + SealPreCommit2Failed: {}, + PreCommitFailed: {}, + ComputeProofFailed: {}, + CommitFailed: {}, + PackingFailed: {}, + FinalizeFailed: {}, + DealsExpired: {}, + RecoverDealIDs: {}, + Faulty: {}, + FaultReported: {}, + FaultedFinal: {}, + Terminating: {}, + TerminateWait: {}, + TerminateFinality: {}, + TerminateFailed: {}, + Removing: {}, + RemoveFailed: {}, + Removed: {}, + SnapDealsWaitDeals: {}, + SnapDealsAddPiece: {}, + SnapDealsPacking: {}, + UpdateReplica: {}, + ProveReplicaUpdate: {}, + SubmitReplicaUpdate: {}, + ReplicaUpdateWait: {}, + FinalizeReplicaUpdate: {}, + SnapDealsAddPieceFailed: {}, + SnapDealsDealsExpired: {}, + SnapDealsRecoverDealIDs: {}, + ReplicaUpdateFailed: {}, + AbortUpgrade: {}, } +// cmd/lotus-miner/info.go defines CLI colors corresponding to these states +// update files there when adding new states const ( UndefinedSectorState SectorState = "" @@ -79,6 +94,17 @@ const ( FinalizeSector SectorState = "FinalizeSector" Proving SectorState = "Proving" + + // snap deals / cc update + SnapDealsWaitDeals SectorState = "SnapDealsWaitDeals" + SnapDealsAddPiece SectorState = "SnapDealsAddPiece" + SnapDealsPacking SectorState = "SnapDealsPacking" + UpdateReplica SectorState = "UpdateReplica" + ProveReplicaUpdate SectorState = "ProveReplicaUpdate" + SubmitReplicaUpdate SectorState = "SubmitReplicaUpdate" + ReplicaUpdateWait SectorState = "ReplicaUpdateWait" + FinalizeReplicaUpdate SectorState = "FinalizeReplicaUpdate" + // error modes FailedUnrecoverable SectorState = "FailedUnrecoverable" AddPieceFailed SectorState = "AddPieceFailed" @@ -92,6 +118,13 @@ const ( DealsExpired SectorState = "DealsExpired" RecoverDealIDs SectorState = "RecoverDealIDs" + // snap deals error modes + SnapDealsAddPieceFailed SectorState = "SnapDealsAddPieceFailed" + SnapDealsDealsExpired SectorState = "SnapDealsDealsExpired" + SnapDealsRecoverDealIDs SectorState = "SnapDealsRecoverDealIDs" + AbortUpgrade SectorState = "AbortUpgrade" + ReplicaUpdateFailed SectorState = "ReplicaUpdateFailed" + Faulty SectorState = "Faulty" // sector is corrupted or gone for some reason FaultReported SectorState = "FaultReported" // sector has been declared as a fault on chain FaultedFinal SectorState = "FaultedFinal" // fault declared on chain @@ -108,11 +141,11 @@ const ( func toStatState(st SectorState, finEarly bool) statSectorState { switch st { - case UndefinedSectorState, Empty, WaitDeals, AddPiece, AddPieceFailed: + case UndefinedSectorState, Empty, WaitDeals, AddPiece, AddPieceFailed, SnapDealsWaitDeals, SnapDealsAddPiece: return sstStaging - case Packing, GetTicket, PreCommit1, PreCommit2, PreCommitting, PreCommitWait, SubmitPreCommitBatch, PreCommitBatchWait, WaitSeed, Committing, CommitFinalize, FinalizeSector: + case Packing, GetTicket, PreCommit1, PreCommit2, PreCommitting, PreCommitWait, SubmitPreCommitBatch, PreCommitBatchWait, WaitSeed, Committing, CommitFinalize, FinalizeSector, SnapDealsPacking, UpdateReplica, ProveReplicaUpdate, FinalizeReplicaUpdate: return sstSealing - case SubmitCommit, CommitWait, SubmitCommitAggregate, CommitAggregateWait: + case SubmitCommit, CommitWait, SubmitCommitAggregate, CommitAggregateWait, SubmitReplicaUpdate, ReplicaUpdateWait: if finEarly { // we use statSectorState for throttling storage use. With FinalizeEarly // we can consider sectors in states after CommitFinalize as finalized, so diff --git a/extern/storage-sealing/states_failed.go b/extern/storage-sealing/states_failed.go index 0c88cc38452..a93cda3f56e 100644 --- a/extern/storage-sealing/states_failed.go +++ b/extern/storage-sealing/states_failed.go @@ -1,11 +1,13 @@ package sealing import ( + "context" "time" "github.com/hashicorp/go-multierror" "golang.org/x/xerrors" + "github.com/filecoin-project/go-address" "github.com/filecoin-project/lotus/chain/actors/builtin/market" "github.com/filecoin-project/lotus/chain/actors/builtin/miner" @@ -181,6 +183,67 @@ func (m *Sealing) handleComputeProofFailed(ctx statemachine.Context, sector Sect return ctx.Send(SectorRetryComputeProof{}) } +func (m *Sealing) handleSubmitReplicaUpdateFailed(ctx statemachine.Context, sector SectorInfo) error { + if sector.ReplicaUpdateMessage != nil { + mw, err := m.Api.StateSearchMsg(ctx.Context(), *sector.ReplicaUpdateMessage) + if err != nil { + // API error + if err := failedCooldown(ctx, sector); err != nil { + return err + } + + return ctx.Send(SectorRetrySubmitReplicaUpdateWait{}) + } + + if mw == nil { + return ctx.Send(SectorRetrySubmitReplicaUpdateWait{}) + } + + switch mw.Receipt.ExitCode { + case exitcode.Ok: + return ctx.Send(SectorRetrySubmitReplicaUpdateWait{}) + case exitcode.SysErrOutOfGas: + return ctx.Send(SectorRetrySubmitReplicaUpdate{}) + default: + // something else went wrong + } + } + + tok, _, err := m.Api.ChainHead(ctx.Context()) + if err != nil { + log.Errorf("handleCommitting: api error, not proceeding: %+v", err) + return nil + } + + if err := checkReplicaUpdate(ctx.Context(), m.maddr, sector, tok, m.Api); err != nil { + switch err.(type) { + case *ErrApi: + log.Errorf("handleSubmitReplicaUpdateFailed: api error, not proceeding: %+v", err) + return nil + case *ErrBadRU: + log.Errorf("bad replica update: %+v", err) + return ctx.Send(SectorRetryReplicaUpdate{}) + case *ErrBadPR: + log.Errorf("bad PR1: +%v", err) + return ctx.Send(SectorRetryProveReplicaUpdate{}) + + case *ErrInvalidDeals: + return ctx.Send(SectorInvalidDealIDs{}) + case *ErrExpiredDeals: + return ctx.Send(SectorDealsExpired{xerrors.Errorf("expired dealIDs in sector: %w", err)}) + default: + log.Errorf("sanity check error, not proceeding: +%v", err) + return xerrors.Errorf("checkPieces sanity check error: %w", err) + } + } + + if err := failedCooldown(ctx, sector); err != nil { + return err + } + + return ctx.Send(SectorRetrySubmitReplicaUpdate{}) +} + func (m *Sealing) handleCommitFailed(ctx statemachine.Context, sector SectorInfo) error { tok, _, err := m.Api.ChainHead(ctx.Context()) if err != nil { @@ -319,61 +382,40 @@ func (m *Sealing) handleDealsExpired(ctx statemachine.Context, sector SectorInfo return ctx.Send(SectorRemove{}) } -func (m *Sealing) HandleRecoverDealIDs(ctx Context, sector SectorInfo) error { - tok, height, err := m.Api.ChainHead(ctx.Context()) - if err != nil { - return xerrors.Errorf("getting chain head: %w", err) +func (m *Sealing) handleDealsExpiredSnapDeals(ctx statemachine.Context, sector SectorInfo) error { + if !sector.CCUpdate { + // Should be impossible + return xerrors.Errorf("should never reach SnapDealsDealsExpired as a non-CCUpdate sector") } - var toFix []int - paddingPieces := 0 - - for i, p := range sector.Pieces { - // 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 { - exp := zerocomm.ZeroPieceCommitment(p.Piece.Size.Unpadded()) - if !p.Piece.PieceCID.Equals(exp) { - return xerrors.Errorf("sector %d piece %d had non-zero PieceCID %+v", sector.SectorNumber, i, p.Piece.PieceCID) - } - paddingPieces++ - continue - } - - proposal, err := m.Api.StateMarketStorageDealProposal(ctx.Context(), p.DealInfo.DealID, tok) - if err != nil { - log.Warnf("getting deal %d for piece %d: %+v", p.DealInfo.DealID, i, err) - toFix = append(toFix, i) - continue - } - - if proposal.Provider != m.maddr { - log.Warnf("piece %d (of %d) of sector %d refers deal %d with wrong provider: %s != %s", i, len(sector.Pieces), sector.SectorNumber, p.DealInfo.DealID, proposal.Provider, m.maddr) - toFix = append(toFix, i) - continue - } - - if proposal.PieceCID != p.Piece.PieceCID { - log.Warnf("piece %d (of %d) of sector %d refers deal %d with wrong PieceCID: %s != %s", i, len(sector.Pieces), sector.SectorNumber, p.DealInfo.DealID, p.Piece.PieceCID, proposal.PieceCID) - toFix = append(toFix, i) - continue - } + return ctx.Send(SectorAbortUpgrade{xerrors.Errorf("one of upgrade deals expired")}) +} - if p.Piece.Size != proposal.PieceSize { - log.Warnf("piece %d (of %d) of sector %d refers deal %d with different size: %d != %d", i, len(sector.Pieces), sector.SectorNumber, p.DealInfo.DealID, p.Piece.Size, proposal.PieceSize) - toFix = append(toFix, i) - continue - } +func (m *Sealing) handleAbortUpgrade(ctx statemachine.Context, sector SectorInfo) error { + if !sector.CCUpdate { + return xerrors.Errorf("should never reach AbortUpgrade as a non-CCUpdate sector") + } - if height >= proposal.StartEpoch { - // TODO: check if we are in an early enough state (before precommit), try to remove the offending pieces - // (tricky as we have to 'defragment' the sector while doing that, and update piece references for retrieval) - return xerrors.Errorf("can't fix sector deals: piece %d (of %d) of sector %d refers expired deal %d - should start at %d, head %d", i, len(sector.Pieces), sector.SectorNumber, p.DealInfo.DealID, proposal.StartEpoch, height) - } + // Remove snap deals replica if any + if err := m.sealer.ReleaseReplicaUpgrade(ctx.Context(), m.minerSector(sector.SectorType, sector.SectorNumber)); err != nil { + return xerrors.Errorf("removing CC update files from sector storage") } + return ctx.Send(SectorRevertUpgradeToProving{}) +} +// failWith is a mutator or global mutator +func (m *Sealing) handleRecoverDealIDsOrFailWith(ctx statemachine.Context, sector SectorInfo, failWith interface{}) error { + toFix, paddingPieces, err := recoveryPiecesToFix(ctx.Context(), m.Api, sector, m.maddr) + if err != nil { + return err + } + tok, _, err := m.Api.ChainHead(ctx.Context()) + if err != nil { + return err + } failed := map[int]error{} updates := map[int]abi.DealID{} + for _, i := range toFix { p := sector.Pieces[i] @@ -430,3 +472,67 @@ func (m *Sealing) HandleRecoverDealIDs(ctx Context, sector SectorInfo) error { // Not much to do here, we can't go back in time to commit this sector return ctx.Send(SectorUpdateDealIDs{Updates: updates}) } + +func (m *Sealing) HandleRecoverDealIDs(ctx statemachine.Context, sector SectorInfo) error { + return m.handleRecoverDealIDsOrFailWith(ctx, sector, SectorRemove{}) +} + +func (m *Sealing) handleSnapDealsRecoverDealIDs(ctx statemachine.Context, sector SectorInfo) error { + return m.handleRecoverDealIDsOrFailWith(ctx, sector, SectorAbortUpgrade{}) +} + +func recoveryPiecesToFix(ctx context.Context, api SealingAPI, sector SectorInfo, maddr address.Address) ([]int, int, error) { + tok, height, err := api.ChainHead(ctx) + if err != nil { + return nil, 0, xerrors.Errorf("getting chain head: %w", err) + } + + var toFix []int + paddingPieces := 0 + + for i, p := range sector.Pieces { + // 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 { + exp := zerocomm.ZeroPieceCommitment(p.Piece.Size.Unpadded()) + if !p.Piece.PieceCID.Equals(exp) { + return nil, 0, xerrors.Errorf("sector %d piece %d had non-zero PieceCID %+v", sector.SectorNumber, i, p.Piece.PieceCID) + } + paddingPieces++ + continue + } + + proposal, err := api.StateMarketStorageDealProposal(ctx, p.DealInfo.DealID, tok) + if err != nil { + log.Warnf("getting deal %d for piece %d: %+v", p.DealInfo.DealID, i, err) + toFix = append(toFix, i) + continue + } + + if proposal.Provider != maddr { + log.Warnf("piece %d (of %d) of sector %d refers deal %d with wrong provider: %s != %s", i, len(sector.Pieces), sector.SectorNumber, p.DealInfo.DealID, proposal.Provider, maddr) + toFix = append(toFix, i) + continue + } + + if proposal.PieceCID != p.Piece.PieceCID { + log.Warnf("piece %d (of %d) of sector %d refers deal %d with wrong PieceCID: %s != %s", i, len(sector.Pieces), sector.SectorNumber, p.DealInfo.DealID, p.Piece.PieceCID, proposal.PieceCID) + toFix = append(toFix, i) + continue + } + + if p.Piece.Size != proposal.PieceSize { + log.Warnf("piece %d (of %d) of sector %d refers deal %d with different size: %d != %d", i, len(sector.Pieces), sector.SectorNumber, p.DealInfo.DealID, p.Piece.Size, proposal.PieceSize) + toFix = append(toFix, i) + continue + } + + if height >= proposal.StartEpoch { + // TODO: check if we are in an early enough state (before precommit), try to remove the offending pieces + // (tricky as we have to 'defragment' the sector while doing that, and update piece references for retrieval) + return nil, 0, xerrors.Errorf("can't fix sector deals: piece %d (of %d) of sector %d refers expired deal %d - should start at %d, head %d", i, len(sector.Pieces), sector.SectorNumber, p.DealInfo.DealID, proposal.StartEpoch, height) + } + } + + return toFix, paddingPieces, nil +} diff --git a/extern/storage-sealing/states_failed_test.go b/extern/storage-sealing/states_failed_test.go index 22c245afd5e..86f69b11f45 100644 --- a/extern/storage-sealing/states_failed_test.go +++ b/extern/storage-sealing/states_failed_test.go @@ -6,6 +6,7 @@ import ( "testing" "github.com/filecoin-project/go-state-types/network" + statemachine "github.com/filecoin-project/go-statemachine" market0 "github.com/filecoin-project/specs-actors/actors/builtin/market" @@ -25,6 +26,7 @@ import ( ) func TestStateRecoverDealIDs(t *testing.T) { + t.Skip("Bring this back when we can correctly mock a state machine context: Issue #7867") mockCtrl := gomock.NewController(t) defer mockCtrl.Finish() @@ -40,7 +42,7 @@ func TestStateRecoverDealIDs(t *testing.T) { sctx := mocks.NewMockContext(mockCtrl) sctx.EXPECT().Context().AnyTimes().Return(ctx) - api.EXPECT().ChainHead(ctx).Times(1).Return(nil, abi.ChainEpoch(10), nil) + api.EXPECT().ChainHead(ctx).Times(2).Return(nil, abi.ChainEpoch(10), nil) var dealId abi.DealID = 12 dealProposal := market.DealProposal{ @@ -70,7 +72,9 @@ func TestStateRecoverDealIDs(t *testing.T) { sctx.EXPECT().Send(sealing.SectorRemove{}).Return(nil) - err := fakeSealing.HandleRecoverDealIDs(sctx, sealing.SectorInfo{ + // 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{}, sealing.SectorInfo{ Pieces: []sealing.Piece{ { DealInfo: &api2.PieceDealInfo{ diff --git a/extern/storage-sealing/states_replica_update.go b/extern/storage-sealing/states_replica_update.go new file mode 100644 index 00000000000..28c5ede0b9e --- /dev/null +++ b/extern/storage-sealing/states_replica_update.go @@ -0,0 +1,209 @@ +package sealing + +import ( + "bytes" + + "github.com/filecoin-project/go-state-types/big" + "github.com/filecoin-project/go-state-types/exitcode" + statemachine "github.com/filecoin-project/go-statemachine" + api "github.com/filecoin-project/lotus/api" + "github.com/filecoin-project/lotus/chain/actors/builtin/miner" + "golang.org/x/xerrors" +) + +func (m *Sealing) handleReplicaUpdate(ctx statemachine.Context, sector SectorInfo) error { + if err := checkPieces(ctx.Context(), m.maddr, sector, m.Api); err != nil { // Sanity check state + switch err.(type) { + case *ErrApi: + log.Errorf("handleReplicaUpdate: api error, not proceeding: %+v", err) + return nil + case *ErrInvalidDeals: + log.Warnf("invalid deals in sector %d: %v", sector.SectorNumber, err) + return ctx.Send(SectorInvalidDealIDs{}) + 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) + } + } + out, err := m.sealer.ReplicaUpdate(sector.sealingCtx(ctx.Context()), m.minerSector(sector.SectorType, sector.SectorNumber), sector.pieceInfos()) + if err != nil { + return ctx.Send(SectorUpdateReplicaFailed{xerrors.Errorf("replica update failed: %w", err)}) + } + return ctx.Send(SectorReplicaUpdate{ + Out: out, + }) +} + +func (m *Sealing) handleProveReplicaUpdate(ctx statemachine.Context, sector SectorInfo) error { + if sector.UpdateSealed == nil || sector.UpdateUnsealed == nil { + return xerrors.Errorf("invalid sector %d with nil UpdateSealed or UpdateUnsealed output", sector.SectorNumber) + } + if sector.CommR == nil { + return xerrors.Errorf("invalid sector %d with nil CommR", sector.SectorNumber) + } + vanillaProofs, err := m.sealer.ProveReplicaUpdate1(sector.sealingCtx(ctx.Context()), m.minerSector(sector.SectorType, sector.SectorNumber), *sector.CommR, *sector.UpdateSealed, *sector.UpdateUnsealed) + if err != nil { + return ctx.Send(SectorProveReplicaUpdateFailed{xerrors.Errorf("prove replica update (1) failed: %w", err)}) + } + + proof, err := m.sealer.ProveReplicaUpdate2(sector.sealingCtx(ctx.Context()), m.minerSector(sector.SectorType, sector.SectorNumber), *sector.CommR, *sector.UpdateSealed, *sector.UpdateUnsealed, vanillaProofs) + if err != nil { + return ctx.Send(SectorProveReplicaUpdateFailed{xerrors.Errorf("prove replica update (2) failed: %w", err)}) + + } + return ctx.Send(SectorProveReplicaUpdate{ + Proof: proof, + }) +} + +func (m *Sealing) handleSubmitReplicaUpdate(ctx statemachine.Context, sector SectorInfo) error { + + tok, _, err := m.Api.ChainHead(ctx.Context()) + if err != nil { + log.Errorf("handleSubmitReplicaUpdate: api error, not proceeding: %+v", err) + return nil + } + + if err := checkReplicaUpdate(ctx.Context(), m.maddr, sector, tok, m.Api); err != nil { + return ctx.Send(SectorSubmitReplicaUpdateFailed{}) + } + + sl, err := m.Api.StateSectorPartition(ctx.Context(), m.maddr, sector.SectorNumber, tok) + if err != nil { + log.Errorf("handleSubmitReplicaUpdate: api error, not proceeding: %+v", err) + return nil + } + updateProof, err := sector.SectorType.RegisteredUpdateProof() + if err != nil { + log.Errorf("failed to get update proof type from seal proof: %+v", err) + return ctx.Send(SectorSubmitReplicaUpdateFailed{}) + } + enc := new(bytes.Buffer) + params := &miner.ProveReplicaUpdatesParams{ + Updates: []miner.ReplicaUpdate{ + { + SectorID: sector.SectorNumber, + Deadline: sl.Deadline, + Partition: sl.Partition, + NewSealedSectorCID: *sector.UpdateSealed, + Deals: sector.dealIDs(), + UpdateProofType: updateProof, + ReplicaProof: sector.ReplicaUpdateProof, + }, + }, + } + if err := params.MarshalCBOR(enc); err != nil { + log.Errorf("failed to serialize update replica params: %w", err) + return ctx.Send(SectorSubmitReplicaUpdateFailed{}) + } + + cfg, err := m.getConfig() + if err != nil { + return xerrors.Errorf("getting config: %w", err) + } + + onChainInfo, err := m.Api.StateSectorGetInfo(ctx.Context(), m.maddr, sector.SectorNumber, tok) + if err != nil { + log.Errorf("handleSubmitReplicaUpdate: api error, not proceeding: %+v", err) + return nil + } + sp, err := m.currentSealProof(ctx.Context()) + if err != nil { + log.Errorf("sealer failed to return current seal proof not proceeding: %+v", err) + return nil + } + virtualPCI := miner.SectorPreCommitInfo{ + SealProof: sp, + SectorNumber: sector.SectorNumber, + SealedCID: *sector.UpdateSealed, + //SealRandEpoch: 0, + DealIDs: sector.dealIDs(), + Expiration: onChainInfo.Expiration, + //ReplaceCapacity: false, + //ReplaceSectorDeadline: 0, + //ReplaceSectorPartition: 0, + //ReplaceSectorNumber: 0, + } + + collateral, err := m.Api.StateMinerInitialPledgeCollateral(ctx.Context(), m.maddr, virtualPCI, tok) + if err != nil { + return xerrors.Errorf("getting initial pledge collateral: %w", err) + } + + collateral = big.Sub(collateral, onChainInfo.InitialPledge) + if collateral.LessThan(big.Zero()) { + collateral = big.Zero() + } + + collateral, err = collateralSendAmount(ctx.Context(), m.Api, m.maddr, cfg, collateral) + if err != nil { + log.Errorf("collateral send amount failed not proceeding: %+v", err) + return nil + } + + goodFunds := big.Add(collateral, big.Int(m.feeCfg.MaxCommitGasFee)) + + mi, err := m.Api.StateMinerInfo(ctx.Context(), m.maddr, tok) + if err != nil { + log.Errorf("handleSubmitReplicaUpdate: api error, not proceeding: %+v", err) + return nil + } + + from, _, err := m.addrSel(ctx.Context(), 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{}) + } + mcid, err := m.Api.SendMsg(ctx.Context(), from, m.maddr, miner.Methods.ProveReplicaUpdates, big.Zero(), big.Int(m.feeCfg.MaxCommitGasFee), enc.Bytes()) + if err != nil { + log.Errorf("handleSubmitReplicaUpdate: error sending message: %+v", err) + return ctx.Send(SectorSubmitReplicaUpdateFailed{}) + } + + return ctx.Send(SectorReplicaUpdateSubmitted{Message: mcid}) +} + +func (m *Sealing) handleReplicaUpdateWait(ctx statemachine.Context, sector SectorInfo) error { + if sector.ReplicaUpdateMessage == nil { + log.Errorf("handleReplicaUpdateWait: no replica update message cid recorded") + return ctx.Send(SectorSubmitReplicaUpdateFailed{}) + } + + mw, err := m.Api.StateWaitMsg(ctx.Context(), *sector.ReplicaUpdateMessage) + if err != nil { + log.Errorf("handleReplicaUpdateWait: failed to wait for message: %+v", err) + return ctx.Send(SectorSubmitReplicaUpdateFailed{}) + } + + switch mw.Receipt.ExitCode { + case exitcode.Ok: + //expected + case exitcode.SysErrInsufficientFunds: + fallthrough + case exitcode.SysErrOutOfGas: + log.Errorf("gas estimator was wrong or out of funds") + return ctx.Send(SectorSubmitReplicaUpdateFailed{}) + default: + return ctx.Send(SectorSubmitReplicaUpdateFailed{}) + } + si, err := m.Api.StateSectorGetInfo(ctx.Context(), m.maddr, sector.SectorNumber, mw.TipSetTok) + if err != nil { + log.Errorf("api err failed to get sector info: %+v", err) + return ctx.Send(SectorSubmitReplicaUpdateFailed{}) + } + if si == nil { + log.Errorf("api err sector not found") + return ctx.Send(SectorSubmitReplicaUpdateFailed{}) + } + + if !si.SealedCID.Equals(*sector.UpdateSealed) { + log.Errorf("mismatch of expected onchain sealed cid after replica update, expected %s got %s", sector.UpdateSealed, si.SealedCID) + return ctx.Send(SectorAbortUpgrade{}) + } + return ctx.Send(SectorReplicaUpdateLanded{}) +} + +func (m *Sealing) handleFinalizeReplicaUpdate(ctx statemachine.Context, sector SectorInfo) error { + return ctx.Send(SectorFinalized{}) +} diff --git a/extern/storage-sealing/states_sealing.go b/extern/storage-sealing/states_sealing.go index c6cd0bb492e..2258250f47d 100644 --- a/extern/storage-sealing/states_sealing.go +++ b/extern/storage-sealing/states_sealing.go @@ -280,8 +280,8 @@ func (m *Sealing) handlePreCommit2(ctx statemachine.Context, sector SectorInfo) } // TODO: We should probably invoke this method in most (if not all) state transition failures after handlePreCommitting -func (m *Sealing) remarkForUpgrade(sid abi.SectorNumber) { - err := m.MarkForUpgrade(sid) +func (m *Sealing) remarkForUpgrade(ctx context.Context, sid abi.SectorNumber) { + err := m.MarkForUpgrade(ctx, sid) if err != nil { log.Errorf("error re-marking sector %d as for upgrade: %+v", sid, err) } @@ -424,7 +424,7 @@ func (m *Sealing) handlePreCommitting(ctx statemachine.Context, sector SectorInf mcid, err := m.Api.SendMsg(ctx.Context(), from, m.maddr, miner.Methods.PreCommitSector, deposit, big.Int(m.feeCfg.MaxPreCommitGasFee), enc.Bytes()) if err != nil { if params.ReplaceCapacity { - m.remarkForUpgrade(params.ReplaceSectorNumber) + m.remarkForUpgrade(ctx.Context(), params.ReplaceSectorNumber) } return ctx.Send(SectorChainPreCommitFailed{xerrors.Errorf("pushing message to mpool: %w", err)}) } diff --git a/extern/storage-sealing/types.go b/extern/storage-sealing/types.go index aeb378f29d9..db53f43d3cc 100644 --- a/extern/storage-sealing/types.go +++ b/extern/storage-sealing/types.go @@ -73,7 +73,7 @@ type SectorInfo struct { // PreCommit2 CommD *cid.Cid - CommR *cid.Cid + CommR *cid.Cid // SectorKey Proof []byte PreCommitInfo *miner.SectorPreCommitInfo @@ -91,6 +91,14 @@ type SectorInfo struct { CommitMessage *cid.Cid InvalidProofs uint64 // failed proof computations (doesn't validate with proof inputs; can't compute) + // CCUpdate + CCUpdate bool + CCPieces []Piece + UpdateSealed *cid.Cid + UpdateUnsealed *cid.Cid + ReplicaUpdateProof storage.ReplicaUpdateProof + ReplicaUpdateMessage *cid.Cid + // Faults FaultReportMsg *cid.Cid diff --git a/extern/storage-sealing/upgrade_queue.go b/extern/storage-sealing/upgrade_queue.go index 02db41fdeff..aab1e67b048 100644 --- a/extern/storage-sealing/upgrade_queue.go +++ b/extern/storage-sealing/upgrade_queue.go @@ -4,6 +4,7 @@ import ( "context" "github.com/filecoin-project/lotus/chain/actors/builtin/miner" + market7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/market" "golang.org/x/xerrors" @@ -18,7 +19,8 @@ func (m *Sealing) IsMarkedForUpgrade(id abi.SectorNumber) bool { return found } -func (m *Sealing) MarkForUpgrade(id abi.SectorNumber) error { +func (m *Sealing) MarkForUpgrade(ctx context.Context, id abi.SectorNumber) error { + m.upgradeLk.Lock() defer m.upgradeLk.Unlock() @@ -27,6 +29,37 @@ func (m *Sealing) MarkForUpgrade(id abi.SectorNumber) error { return xerrors.Errorf("sector %d already marked for upgrade", id) } + si, err := m.GetSectorInfo(id) + if err != nil { + return xerrors.Errorf("getting sector info: %w", err) + } + if si.State != Proving { + return xerrors.Errorf("can't mark sectors not in the 'Proving' state for upgrade") + } + if len(si.Pieces) != 1 { + return xerrors.Errorf("not a committed-capacity sector, expected 1 piece") + } + if si.Pieces[0].DealInfo != nil { + return xerrors.Errorf("not a committed-capacity sector, has deals") + } + + m.toUpgrade[id] = struct{}{} + + return nil +} + +func (m *Sealing) MarkForSnapUpgrade(ctx context.Context, id abi.SectorNumber) error { + cfg, err := m.getConfig() + if err != nil { + return xerrors.Errorf("getting storage config: %w", err) + } + + curStaging := m.stats.curStaging() + if cfg.MaxWaitDealsSectors > 0 && curStaging >= cfg.MaxWaitDealsSectors { + return xerrors.Errorf("already waiting for deals in %d >= %d (cfg.MaxWaitDealsSectors) sectors, no free resources to wait for deals in another", + curStaging, cfg.MaxWaitDealsSectors) + } + si, err := m.GetSectorInfo(id) if err != nil { return xerrors.Errorf("getting sector info: %w", err) @@ -44,11 +77,38 @@ func (m *Sealing) MarkForUpgrade(id abi.SectorNumber) error { return xerrors.Errorf("not a committed-capacity sector, has deals") } - // TODO: more checks to match actor constraints + tok, head, err := m.Api.ChainHead(ctx) + if err != nil { + return xerrors.Errorf("couldnt get chain head: %w", err) + } + onChainInfo, err := m.Api.StateSectorGetInfo(ctx, m.maddr, id, tok) + if err != nil { + return xerrors.Errorf("failed to read sector on chain info: %w", err) + } - m.toUpgrade[id] = struct{}{} + active, err := m.Api.StateMinerActiveSectors(ctx, m.maddr, tok) + if err != nil { + return xerrors.Errorf("failed to check active sectors: %w", err) + } + // Ensure the upgraded sector is active + var found bool + for _, si := range active { + if si.SectorNumber == id { + found = true + break + } + } + if !found { + return xerrors.Errorf("cannot mark inactive sector for upgrade") + } - return nil + if onChainInfo.Expiration-head < market7.DealMinDuration { + return xerrors.Errorf("pointless to upgrade sector %d, expiration %d is less than a min deal duration away from current epoch."+ + "Upgrade expiration before marking for upgrade", id, onChainInfo.Expiration) + } + + log.Errorf("updating sector number %d", id) + return m.sectors.Send(uint64(id), SectorStartCCUpdate{}) } func (m *Sealing) tryUpgradeSector(ctx context.Context, params *miner.SectorPreCommitInfo) big.Int { diff --git a/go.mod b/go.mod index 551af628db5..2cf84d12849 100644 --- a/go.mod +++ b/go.mod @@ -50,8 +50,8 @@ require ( github.com/filecoin-project/specs-actors/v4 v4.0.1 github.com/filecoin-project/specs-actors/v5 v5.0.4 github.com/filecoin-project/specs-actors/v6 v6.0.1 - github.com/filecoin-project/specs-actors/v7 v7.0.0-20211118013026-3dce48197cec - github.com/filecoin-project/specs-storage v0.1.1-0.20211213202648-f14267c929ff + github.com/filecoin-project/specs-actors/v7 v7.0.0-20211230214648-aeae366b083a + github.com/filecoin-project/specs-storage v0.1.1-0.20211228030229-6d460d25a0c9 github.com/filecoin-project/test-vectors/schema v0.0.5 github.com/gbrlsnchs/jwt/v3 v3.0.1 github.com/gdamore/tcell/v2 v2.2.0 @@ -173,3 +173,7 @@ require ( replace github.com/filecoin-project/filecoin-ffi => ./extern/filecoin-ffi replace github.com/filecoin-project/test-vectors => ./extern/test-vectors + +//replace github.com/filecoin-project/specs-actors/v7 => /Users/zenground0/pl/repos/specs-actors + +// replace github.com/filecon-project/specs-storage => /Users/zenground0/pl/repos/specs-storage diff --git a/go.sum b/go.sum index 45625140b39..3efacc2164e 100644 --- a/go.sum +++ b/go.sum @@ -341,7 +341,6 @@ github.com/filecoin-project/go-padreader v0.0.1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MU github.com/filecoin-project/go-paramfetch v0.0.2 h1:a6W3Ij6CKhwHYYlx+5mqvBIyw4CabZH2ojdEaoAZ6/g= github.com/filecoin-project/go-paramfetch v0.0.2/go.mod h1:1FH85P8U+DUEmWk1Jkw3Bw7FrwTVUNHk/95PSPG+dts= github.com/filecoin-project/go-state-types v0.0.0-20200903145444-247639ffa6ad/go.mod h1:IQ0MBPnonv35CJHtWSN3YY1Hz2gkPru1Q9qoaYLxx9I= -github.com/filecoin-project/go-state-types v0.0.0-20200904021452-1883f36ca2f4/go.mod h1:IQ0MBPnonv35CJHtWSN3YY1Hz2gkPru1Q9qoaYLxx9I= 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= @@ -357,7 +356,6 @@ github.com/filecoin-project/go-statestore v0.2.0 h1:cRRO0aPLrxKQCZ2UOQbzFGn4WDNd github.com/filecoin-project/go-statestore v0.2.0/go.mod h1:8sjBYbS35HwPzct7iT4lIXjLlYyPor80aU7t7a/Kspo= github.com/filecoin-project/go-storedcounter v0.1.0 h1:Mui6wSUBC+cQGHbDUBcO7rfh5zQkWJM/CpAZa/uOuus= github.com/filecoin-project/go-storedcounter v0.1.0/go.mod h1:4ceukaXi4vFURIoxYMfKzaRF5Xv/Pinh2oTnoxpv+z8= -github.com/filecoin-project/specs-actors v0.9.4/go.mod h1:BStZQzx5x7TmCkLv0Bpa07U6cPKol6fd3w9KjMPZ6Z4= github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors v0.9.14 h1:68PVstg2UB3ZsMLF+DKFTAs/YKsqhKWynkr0IqmVRQY= github.com/filecoin-project/specs-actors v0.9.14/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= @@ -376,10 +374,11 @@ github.com/filecoin-project/specs-actors/v6 v6.0.0/go.mod h1:V1AYfi5GkHXipx1mnVi github.com/filecoin-project/specs-actors/v6 v6.0.1 h1:laxvHNsvrq83Y9n+W7znVCePi3oLyRf0Rkl4jFO8Wew= github.com/filecoin-project/specs-actors/v6 v6.0.1/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= github.com/filecoin-project/specs-actors/v7 v7.0.0-20211117170924-fd07a4c7dff9/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= -github.com/filecoin-project/specs-actors/v7 v7.0.0-20211118013026-3dce48197cec h1:KV9vE+Sl2Y3qKsrpba4HcE7wHwK7v6O5U/S0xHbje6A= -github.com/filecoin-project/specs-actors/v7 v7.0.0-20211118013026-3dce48197cec/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= -github.com/filecoin-project/specs-storage v0.1.1-0.20211213202648-f14267c929ff h1:JO62nquOGhjoDf9+JkAcV+wsD5yhoyIKOMj70ZNdD3Q= -github.com/filecoin-project/specs-storage v0.1.1-0.20211213202648-f14267c929ff/go.mod h1:nJRRM7Aa9XVvygr3W9k6xGF46RWzr2zxF/iGoAIfA/g= +github.com/filecoin-project/specs-actors/v7 v7.0.0-20211222192039-c83bea50c402/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= +github.com/filecoin-project/specs-actors/v7 v7.0.0-20211230214648-aeae366b083a h1:MS1mtAhZh0iSE7OxP1bb6+UNyYKsxg8n51FpHlX1d54= +github.com/filecoin-project/specs-actors/v7 v7.0.0-20211230214648-aeae366b083a/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= +github.com/filecoin-project/specs-storage v0.1.1-0.20211228030229-6d460d25a0c9 h1:oUYOvF7EvdXS0Zmk9mNkaB6Bu0l+WXBYPzVodKMiLug= +github.com/filecoin-project/specs-storage v0.1.1-0.20211228030229-6d460d25a0c9/go.mod h1:Tb88Zq+IBJbvAn3mS89GYj3jdRThBTE/771HCVZdRJU= 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= @@ -722,7 +721,6 @@ github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28 github.com/ipfs/go-graphsync v0.11.0/go.mod h1:wC+c8vGVjAHthsVIl8LKr37cUra2GOaMYcQNNmMxDqE= github.com/ipfs/go-graphsync v0.11.5 h1:WA5hVxGBtcal6L6nqubKiqRolaZxbexOK3GumGFJRR4= github.com/ipfs/go-graphsync v0.11.5/go.mod h1:+/sZqRwRCQRrV7NCzgBtufmr5QGpUE98XSa7NlsztmM= -github.com/ipfs/go-hamt-ipld v0.1.1/go.mod h1:1EZCr2v0jlCnhpa+aZ0JZYp8Tt2w16+JJOAVz17YcDk= 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.2.1/go.mod h1:jGesd8EtCM3/zPgx+qr0/feTXGUeRai6adgwC+Q+JvE= diff --git a/itests/ccupgrade_test.go b/itests/ccupgrade_test.go index b5ca414161c..487a15659c8 100644 --- a/itests/ccupgrade_test.go +++ b/itests/ccupgrade_test.go @@ -6,14 +6,16 @@ import ( "testing" "time" + "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/chain/types" "github.com/filecoin-project/lotus/itests/kit" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) -// TODO: This needs to be repurposed into a SnapDeals test suite func TestCCUpgrade(t *testing.T) { kit.QuietMiningLogs() @@ -29,37 +31,45 @@ func TestCCUpgrade(t *testing.T) { } } -func runTestCCUpgrade(t *testing.T, upgradeHeight abi.ChainEpoch) { +func runTestCCUpgrade(t *testing.T, upgradeHeight abi.ChainEpoch) *kit.TestFullNode { ctx := context.Background() blockTime := 5 * time.Millisecond - client, miner, ens := kit.EnsembleMinimal(t, kit.MockProofs(), kit.TurboUpgradeAt(upgradeHeight)) - ens.InterconnectAll().BeginMining(blockTime) + client, miner, ens := kit.EnsembleMinimal(t, kit.GenesisNetworkVersion(network.Version15)) + ens.InterconnectAll().BeginMiningMustPost(blockTime) maddr, err := miner.ActorAddress(ctx) if err != nil { t.Fatal(err) } - CC := abi.SectorNumber(kit.DefaultPresealsPerBootstrapMiner + 1) - Upgraded := CC + 1 + CCUpgrade := abi.SectorNumber(kit.DefaultPresealsPerBootstrapMiner + 1) + fmt.Printf("CCUpgrade: %d\n", CCUpgrade) + // wait for deadline 0 to pass so that committing starts after post on preseals + // this gives max time for post to complete minimizing chances of timeout + // waitForDeadline(ctx, t, 1, client, maddr) miner.PledgeSectors(ctx, 1, 0, nil) sl, err := miner.SectorsList(ctx) require.NoError(t, err) require.Len(t, sl, 1, "expected 1 sector") - require.Equal(t, CC, sl[0], "unexpected sector number") - + require.Equal(t, CCUpgrade, sl[0], "unexpected sector number") { - si, err := client.StateSectorGetInfo(ctx, maddr, CC, types.EmptyTSK) + si, err := client.StateSectorGetInfo(ctx, maddr, CCUpgrade, types.EmptyTSK) require.NoError(t, err) require.Less(t, 50000, int(si.Expiration)) } - err = miner.SectorMarkForUpgrade(ctx, sl[0]) + waitForSectorActive(ctx, t, CCUpgrade, client, maddr) + + err = miner.SectorMarkForUpgrade(ctx, sl[0], true) require.NoError(t, err) + sl, err = miner.SectorsList(ctx) + require.NoError(t, err) + require.Len(t, sl, 1, "expected 1 sector") + dh := kit.NewDealHarness(t, client, miner, miner) deal, res, inPath := dh.MakeOnlineDeal(ctx, kit.MakeFullDealParams{ Rseed: 6, @@ -68,37 +78,96 @@ func runTestCCUpgrade(t *testing.T, upgradeHeight abi.ChainEpoch) { outPath := dh.PerformRetrieval(context.Background(), deal, res.Root, false) kit.AssertFilesEqual(t, inPath, outPath) - // Validate upgrade + status, err := miner.SectorsStatus(ctx, CCUpgrade, true) + require.NoError(t, err) + assert.Equal(t, 1, len(status.Deals)) + return client +} - { - exp, err := client.StateSectorExpiration(ctx, maddr, CC, types.EmptyTSK) - if err != nil { - require.Contains(t, err.Error(), "failed to find sector 3") // already cleaned up - } else { - require.NoError(t, err) - require.NotNil(t, exp) - require.Greater(t, 50000, int(exp.OnTime)) +func waitForDeadline(ctx context.Context, t *testing.T, waitIdx uint64, node *kit.TestFullNode, maddr address.Address) { + for { + ts, err := node.ChainHead(ctx) + require.NoError(t, err) + dl, err := node.StateMinerProvingDeadline(ctx, maddr, ts.Key()) + require.NoError(t, err) + if dl.Index == waitIdx { + return } } - { - exp, err := client.StateSectorExpiration(ctx, maddr, Upgraded, types.EmptyTSK) +} + +func waitForSectorActive(ctx context.Context, t *testing.T, sn abi.SectorNumber, node *kit.TestFullNode, maddr address.Address) { + for { + active, err := node.StateMinerActiveSectors(ctx, maddr, types.EmptyTSK) require.NoError(t, err) - require.Less(t, 50000, int(exp.OnTime)) + for _, si := range active { + if si.SectorNumber == sn { + fmt.Printf("ACTIVE\n") + return + } + } + + time.Sleep(time.Second) } +} + +func TestCCUpgradeAndPoSt(t *testing.T) { + kit.QuietMiningLogs() + t.Run("upgrade and then post", func(t *testing.T) { + ctx := context.Background() + n := runTestCCUpgrade(t, 100) + ts, err := n.ChainHead(ctx) + require.NoError(t, err) + start := ts.Height() + // wait for a full proving period + n.WaitTillChain(ctx, func(ts *types.TipSet) bool { + if ts.Height() > start+abi.ChainEpoch(2880) { + return true + } + return false + }) + }) +} - dlInfo, err := client.StateMinerProvingDeadline(ctx, maddr, types.EmptyTSK) +func TestTooManyMarkedForUpgrade(t *testing.T) { + kit.QuietMiningLogs() + + ctx := context.Background() + blockTime := 5 * time.Millisecond + + client, miner, ens := kit.EnsembleMinimal(t, kit.GenesisNetworkVersion(network.Version15)) + ens.InterconnectAll().BeginMining(blockTime) + + maddr, err := miner.ActorAddress(ctx) + if err != nil { + t.Fatal(err) + } + + CCUpgrade := abi.SectorNumber(kit.DefaultPresealsPerBootstrapMiner + 1) + waitForDeadline(ctx, t, 1, client, maddr) + miner.PledgeSectors(ctx, 3, 0, nil) + + sl, err := miner.SectorsList(ctx) require.NoError(t, err) + require.Len(t, sl, 3, "expected 3 sectors") - // Sector should expire. - for { - // Wait for the sector to expire. - status, err := miner.SectorsStatus(ctx, CC, true) + { + si, err := client.StateSectorGetInfo(ctx, maddr, CCUpgrade, types.EmptyTSK) require.NoError(t, err) - if status.OnTime == 0 && status.Early == 0 { - break - } - t.Log("waiting for sector to expire") - // wait one deadline per loop. - time.Sleep(time.Duration(dlInfo.WPoStChallengeWindow) * blockTime) + require.Less(t, 50000, int(si.Expiration)) } + + waitForSectorActive(ctx, t, CCUpgrade, client, maddr) + waitForSectorActive(ctx, t, CCUpgrade+1, client, maddr) + waitForSectorActive(ctx, t, CCUpgrade+2, client, maddr) + + err = miner.SectorMarkForUpgrade(ctx, CCUpgrade, true) + require.NoError(t, err) + err = miner.SectorMarkForUpgrade(ctx, CCUpgrade+1, true) + require.NoError(t, err) + + err = miner.SectorMarkForUpgrade(ctx, CCUpgrade+2, true) + require.Error(t, err) + assert.Contains(t, err.Error(), "no free resources to wait for deals") + } diff --git a/itests/kit/blockminer.go b/itests/kit/blockminer.go index 2c9bd47c6cf..c1061b5585a 100644 --- a/itests/kit/blockminer.go +++ b/itests/kit/blockminer.go @@ -1,13 +1,18 @@ package kit import ( + "bytes" "context" "sync" "sync/atomic" "testing" "time" + "github.com/filecoin-project/go-bitfield" "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/lotus/api" + aminer "github.com/filecoin-project/lotus/chain/actors/builtin/miner" + "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/miner" "github.com/stretchr/testify/require" ) @@ -30,6 +35,138 @@ func NewBlockMiner(t *testing.T, miner *TestMiner) *BlockMiner { } } +type partitionTracker struct { + partitions []api.Partition + posted bitfield.BitField +} + +func newPartitionTracker(ctx context.Context, dlIdx uint64, bm *BlockMiner) *partitionTracker { + dlines, err := bm.miner.FullNode.StateMinerDeadlines(ctx, bm.miner.ActorAddr, types.EmptyTSK) + require.NoError(bm.t, err) + dl := dlines[dlIdx] + + parts, err := bm.miner.FullNode.StateMinerPartitions(ctx, bm.miner.ActorAddr, dlIdx, types.EmptyTSK) + require.NoError(bm.t, err) + return &partitionTracker{ + partitions: parts, + posted: dl.PostSubmissions, + } +} + +func (p *partitionTracker) count(t *testing.T) uint64 { + pCnt, err := p.posted.Count() + require.NoError(t, err) + return pCnt +} + +func (p *partitionTracker) done(t *testing.T) bool { + return uint64(len(p.partitions)) == p.count(t) +} + +func (p *partitionTracker) recordIfPost(t *testing.T, bm *BlockMiner, smsg *types.SignedMessage) (ret bool) { + defer func() { + ret = p.done(t) + }() + msg := smsg.Message + if !(msg.To == bm.miner.ActorAddr) { + return + } + if msg.Method != aminer.Methods.SubmitWindowedPoSt { + return + } + params := aminer.SubmitWindowedPoStParams{} + require.NoError(t, params.UnmarshalCBOR(bytes.NewReader(msg.Params))) + for _, part := range params.Partitions { + p.posted.Set(part.Index) + } + return +} + +// Like MineBlocks but refuses to mine until the window post scheduler has wdpost messages in the mempool +// and everything shuts down if a post fails +func (bm *BlockMiner) MineBlocksMustPost(ctx context.Context, blocktime time.Duration) { + + time.Sleep(time.Second) + + // wrap context in a cancellable context. + ctx, bm.cancel = context.WithCancel(ctx) + bm.wg.Add(1) + go func() { + defer bm.wg.Done() + + activeDeadlines := make(map[int]struct{}) + _ = activeDeadlines + + for { + select { + case <-time.After(blocktime): + case <-ctx.Done(): + return + } + nulls := atomic.SwapInt64(&bm.nextNulls, 0) + require.Equal(bm.t, int64(0), nulls, "Injecting > 0 null blocks while `MustPost` mining is currently unsupported") + + // Wake up and figure out if we are at the end of an active deadline + ts, err := bm.miner.FullNode.ChainHead(ctx) + require.NoError(bm.t, err) + tsk := ts.Key() + dlinfo, err := bm.miner.FullNode.StateMinerProvingDeadline(ctx, bm.miner.ActorAddr, tsk) + require.NoError(bm.t, err) + if ts.Height()+1 == dlinfo.Last() { // Last epoch in dline, we need to check that miner has posted + + tracker := newPartitionTracker(ctx, dlinfo.Index, bm) + if !tracker.done(bm.t) { // need to wait for post + bm.t.Logf("expect %d partitions proved but only see %d", len(tracker.partitions), tracker.count(bm.t)) + poolEvts, err := bm.miner.FullNode.MpoolSub(ctx) + require.NoError(bm.t, err) + + // First check pending messages we'll mine this epoch + msgs, err := bm.miner.FullNode.MpoolPending(ctx, types.EmptyTSK) + require.NoError(bm.t, err) + for _, msg := range msgs { + tracker.recordIfPost(bm.t, bm, msg) + } + + // post not yet in mpool, wait for it + if !tracker.done(bm.t) { + bm.t.Logf("post missing from mpool, block mining suspended until it arrives") + POOL: + for { + select { + case <-ctx.Done(): + return + case evt := <-poolEvts: + if evt.Type == api.MpoolAdd { + bm.t.Logf("incoming message %v", evt.Message) + if tracker.recordIfPost(bm.t, bm, evt.Message) { + break POOL + } + } + } + } + + } + + } + + } + + err = bm.miner.MineOne(ctx, miner.MineReq{ + InjectNulls: abi.ChainEpoch(nulls), + Done: func(bool, abi.ChainEpoch, error) {}, + }) + switch { + case err == nil: // wrap around + case ctx.Err() != nil: // context fired. + return + default: // log error + bm.t.Error(err) + } + } + }() + +} + func (bm *BlockMiner) MineBlocks(ctx context.Context, blocktime time.Duration) { time.Sleep(time.Second) diff --git a/itests/kit/deals.go b/itests/kit/deals.go index 29da37c15bd..f8de14d624a 100644 --- a/itests/kit/deals.go +++ b/itests/kit/deals.go @@ -104,8 +104,9 @@ func (dh *DealHarness) MakeOnlineDeal(ctx context.Context, params MakeFullDealPa // TODO: this sleep is only necessary because deals don't immediately get logged in the dealstore, we should fix this time.Sleep(time.Second) + fmt.Printf("WAIT DEAL SEALEDS START\n") dh.WaitDealSealed(ctx, deal, false, false, nil) - + fmt.Printf("WAIT DEAL SEALEDS END\n") return deal, res, path } @@ -176,6 +177,7 @@ loop: cb() } } + fmt.Printf("WAIT DEAL SEALED LOOP BROKEN\n") } // WaitDealSealedQuiet waits until the deal is sealed, without logging anything. @@ -290,12 +292,11 @@ func (dh *DealHarness) WaitDealPublished(ctx context.Context, deal *cid.Cid) { func (dh *DealHarness) StartSealingWaiting(ctx context.Context) { snums, err := dh.main.SectorsList(ctx) require.NoError(dh.t, err) - for _, snum := range snums { si, err := dh.main.SectorsStatus(ctx, snum, false) require.NoError(dh.t, err) - dh.t.Logf("Sector state: %s", si.State) + dh.t.Logf("Sector state <%d>-[%d]:, %s", snum, si.SealProof, si.State) if si.State == api.SectorState(sealing.WaitDeals) { require.NoError(dh.t, dh.main.SectorStartSealing(ctx, snum)) } diff --git a/itests/kit/ensemble.go b/itests/kit/ensemble.go index 2a6d16a951c..dfd3d8cd74a 100644 --- a/itests/kit/ensemble.go +++ b/itests/kit/ensemble.go @@ -675,6 +675,43 @@ func (n *Ensemble) Connect(from api.Net, to ...api.Net) *Ensemble { return n } +func (n *Ensemble) BeginMiningMustPost(blocktime time.Duration, miners ...*TestMiner) []*BlockMiner { + ctx := context.Background() + + // wait one second to make sure that nodes are connected and have handshaken. + // TODO make this deterministic by listening to identify events on the + // libp2p eventbus instead (or something else). + time.Sleep(1 * time.Second) + + var bms []*BlockMiner + if len(miners) == 0 { + // no miners have been provided explicitly, instantiate block miners + // for all active miners that aren't still mining. + for _, m := range n.active.miners { + if _, ok := n.active.bms[m]; ok { + continue // skip, already have a block miner + } + miners = append(miners, m) + } + } + + if len(miners) > 1 { + n.t.Fatalf("Only one active miner for MustPost, but have %d", len(miners)) + } + + for _, m := range miners { + bm := NewBlockMiner(n.t, m) + bm.MineBlocksMustPost(ctx, blocktime) + n.t.Cleanup(bm.Stop) + + bms = append(bms, bm) + + n.active.bms[m] = bm + } + + return bms +} + // BeginMining kicks off mining for the specified miners. If nil or 0-length, // it will kick off mining for all enrolled and active miners. It also adds a // cleanup function to stop all mining operations on test teardown. diff --git a/markets/storageadapter/ondealsectorcommitted.go b/markets/storageadapter/ondealsectorcommitted.go index 4cd0a2d681d..94eaadef4ca 100644 --- a/markets/storageadapter/ondealsectorcommitted.go +++ b/markets/storageadapter/ondealsectorcommitted.go @@ -5,6 +5,7 @@ import ( "context" "sync" + "github.com/filecoin-project/go-bitfield" sealing "github.com/filecoin-project/lotus/extern/storage-sealing" "github.com/ipfs/go-cid" "golang.org/x/xerrors" @@ -110,7 +111,7 @@ func (mgr *SectorCommittedManager) OnDealSectorPreCommitted(ctx context.Context, // Watch for a pre-commit message to the provider. matchEvent := func(msg *types.Message) (bool, error) { - matched := msg.To == provider && (msg.Method == miner.Methods.PreCommitSector || msg.Method == miner.Methods.PreCommitSectorBatch) + matched := msg.To == provider && (msg.Method == miner.Methods.PreCommitSector || msg.Method == miner.Methods.PreCommitSectorBatch || msg.Method == miner.Methods.ProveReplicaUpdates) return matched, nil } @@ -145,6 +146,20 @@ func (mgr *SectorCommittedManager) OnDealSectorPreCommitted(ctx context.Context, return false, err } + // If this is a replica update method that succeeded the deal is active + if msg.Method == miner.Methods.ProveReplicaUpdates { + sn, err := dealSectorInReplicaUpdateSuccess(msg, rec, res) + if err != nil { + return false, err + } + if sn != nil { + cb(*sn, true, nil) + return false, nil + } + // Didn't find the deal ID in this message, so keep looking + return true, nil + } + // Extract the message parameters sn, err := dealSectorInPreCommitMsg(msg, res) if err != nil { @@ -264,6 +279,42 @@ func (mgr *SectorCommittedManager) OnDealSectorCommitted(ctx context.Context, pr return nil } +func dealSectorInReplicaUpdateSuccess(msg *types.Message, rec *types.MessageReceipt, res sealing.CurrentDealInfo) (*abi.SectorNumber, error) { + var params miner.ProveReplicaUpdatesParams + if err := params.UnmarshalCBOR(bytes.NewReader(msg.Params)); err != nil { + return nil, xerrors.Errorf("unmarshal prove replica update: %w", err) + } + + var seekUpdate miner.ReplicaUpdate + var found bool + for _, update := range params.Updates { + for _, did := range update.Deals { + if did == res.DealID { + seekUpdate = update + found = true + break + } + } + } + if !found { + return nil, nil + } + + // check that this update passed validation steps + var successBf bitfield.BitField + if err := successBf.UnmarshalCBOR(bytes.NewReader(rec.Return)); err != nil { + return nil, xerrors.Errorf("unmarshal return value: %w", err) + } + success, err := successBf.IsSet(uint64(seekUpdate.SectorID)) + if err != nil { + return nil, xerrors.Errorf("failed to check success of replica update: %w", err) + } + if !success { + return nil, xerrors.Errorf("replica update %d failed", seekUpdate.SectorID) + } + return &seekUpdate.SectorID, nil +} + // dealSectorInPreCommitMsg tries to find a sector containing the specified deal func dealSectorInPreCommitMsg(msg *types.Message, res sealing.CurrentDealInfo) (*abi.SectorNumber, error) { switch msg.Method { diff --git a/miner/miner.go b/miner/miner.go index c5f0a012956..976e9ca6ff8 100644 --- a/miner/miner.go +++ b/miner/miner.go @@ -535,8 +535,12 @@ func (m *Miner) mineOne(ctx context.Context, base *MiningBase) (minedBlock *type prand := abi.PoStRandomness(rand) tSeed := build.Clock.Now() + nv, err := m.api.StateNetworkVersion(ctx, base.TipSet.Key()) + if err != nil { + return nil, err + } - postProof, err := m.epp.ComputeProof(ctx, mbi.Sectors, prand) + postProof, err := m.epp.ComputeProof(ctx, mbi.Sectors, prand, round, nv) if err != nil { err = xerrors.Errorf("failed to compute winning post proof: %w", err) return nil, err diff --git a/miner/warmup.go b/miner/warmup.go index 991679c0936..be5ac3ea7d7 100644 --- a/miner/warmup.go +++ b/miner/warmup.go @@ -10,8 +10,7 @@ import ( "github.com/filecoin-project/go-bitfield" "github.com/filecoin-project/go-state-types/abi" - - proof2 "github.com/filecoin-project/specs-actors/v2/actors/runtime/proof" + proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" "github.com/filecoin-project/lotus/chain/types" ) @@ -61,13 +60,22 @@ out: return xerrors.Errorf("getting sector info: %w", err) } - _, err = m.epp.ComputeProof(ctx, []proof2.SectorInfo{ + ts, err := m.api.ChainHead(ctx) + if err != nil { + return xerrors.Errorf("getting chain head") + } + nv, err := m.api.StateNetworkVersion(ctx, ts.Key()) + if err != nil { + return xerrors.Errorf("getting network version") + } + + _, err = m.epp.ComputeProof(ctx, []proof7.ExtendedSectorInfo{ { SealProof: si.SealProof, SectorNumber: sector, SealedCID: si.SealedCID, }, - }, r) + }, r, ts.Height(), nv) if err != nil { return xerrors.Errorf("failed to compute proof: %w", err) } diff --git a/node/config/def.go b/node/config/def.go index 4a525e697c9..9c39c197ce5 100644 --- a/node/config/def.go +++ b/node/config/def.go @@ -109,10 +109,11 @@ func DefaultStorageMiner() *StorageMiner { AvailableBalanceBuffer: types.FIL(big.Zero()), DisableCollateralFallback: false, - BatchPreCommits: true, - MaxPreCommitBatch: miner5.PreCommitSectorBatchMaxSize, // up to 256 sectors - PreCommitBatchWait: Duration(24 * time.Hour), // this should be less than 31.5 hours, which is the expiration of a precommit ticket - PreCommitBatchSlack: Duration(3 * time.Hour), // time buffer for forceful batch submission before sectors/deals in batch would start expiring, higher value will lower the chances for message fail due to expiration + BatchPreCommits: true, + MaxPreCommitBatch: miner5.PreCommitSectorBatchMaxSize, // up to 256 sectors + PreCommitBatchWait: Duration(24 * time.Hour), // this should be less than 31.5 hours, which is the expiration of a precommit ticket + // XXX snap deals wait deals slack if first + PreCommitBatchSlack: Duration(3 * time.Hour), // time buffer for forceful batch submission before sectors/deals in batch would start expiring, higher value will lower the chances for message fail due to expiration CommittedCapacitySectorLifetime: Duration(builtin.EpochDurationSeconds * uint64(policy.GetMaxSectorExpirationExtension()) * uint64(time.Second)), @@ -131,11 +132,13 @@ func DefaultStorageMiner() *StorageMiner { }, Storage: sectorstorage.SealerConfig{ - AllowAddPiece: true, - AllowPreCommit1: true, - AllowPreCommit2: true, - AllowCommit: true, - AllowUnseal: true, + AllowAddPiece: true, + AllowPreCommit1: true, + AllowPreCommit2: true, + AllowCommit: true, + AllowUnseal: true, + AllowReplicaUpdate: true, + AllowProveReplicaUpdate2: true, // Default to 10 - tcp should still be able to figure this out, and // it's the ratio between 10gbit / 1gbit diff --git a/node/impl/storminer.go b/node/impl/storminer.go index 764e4fb3666..3ebac1409f1 100644 --- a/node/impl/storminer.go +++ b/node/impl/storminer.go @@ -37,6 +37,7 @@ 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/network" sectorstorage "github.com/filecoin-project/lotus/extern/sector-storage" "github.com/filecoin-project/lotus/extern/sector-storage/fsutil" @@ -386,8 +387,8 @@ func (sm *StorageMinerAPI) SectorPreCommitPending(ctx context.Context) ([]abi.Se return sm.Miner.SectorPreCommitPending(ctx) } -func (sm *StorageMinerAPI) SectorMarkForUpgrade(ctx context.Context, id abi.SectorNumber) error { - return sm.Miner.MarkForUpgrade(id) +func (sm *StorageMinerAPI) SectorMarkForUpgrade(ctx context.Context, id abi.SectorNumber, snap bool) error { + return sm.Miner.MarkForUpgrade(ctx, id, snap) } func (sm *StorageMinerAPI) SectorCommitFlush(ctx context.Context) ([]sealiface.CommitBatchRes, error) { @@ -398,6 +399,10 @@ func (sm *StorageMinerAPI) SectorCommitPending(ctx context.Context) ([]abi.Secto return sm.Miner.CommitPending(ctx) } +func (sm *StorageMinerAPI) SectorMatchPendingPiecesToOpenSectors(ctx context.Context) error { + return sm.Miner.SectorMatchPendingPiecesToOpenSectors(ctx) +} + func (sm *StorageMinerAPI) WorkerConnect(ctx context.Context, url string) error { w, err := connectRemoteWorker(ctx, sm, url) if err != nil { @@ -1155,8 +1160,8 @@ func (sm *StorageMinerAPI) Discover(ctx context.Context) (apitypes.OpenRPCDocume return build.OpenRPCDiscoverJSON_Miner(), nil } -func (sm *StorageMinerAPI) ComputeProof(ctx context.Context, ssi []builtin.SectorInfo, rand abi.PoStRandomness) ([]builtin.PoStProof, error) { - return sm.Epp.ComputeProof(ctx, ssi, rand) +func (sm *StorageMinerAPI) ComputeProof(ctx context.Context, ssi []builtin.ExtendedSectorInfo, rand abi.PoStRandomness, poStEpoch abi.ChainEpoch, nv network.Version) ([]builtin.PoStProof, error) { + return sm.Epp.ComputeProof(ctx, ssi, rand, poStEpoch, nv) } func (sm *StorageMinerAPI) RuntimeSubsystems(context.Context) (res api.MinerSubsystems, err error) { diff --git a/storage/adapter_storage_miner.go b/storage/adapter_storage_miner.go index 0b4b17f9670..01ff9d8d3a4 100644 --- a/storage/adapter_storage_miner.go +++ b/storage/adapter_storage_miner.go @@ -112,6 +112,15 @@ func (s SealingAPIAdapter) StateMinerSectorAllocated(ctx context.Context, maddr return s.delegate.StateMinerSectorAllocated(ctx, maddr, sid, tsk) } +func (s SealingAPIAdapter) StateMinerActiveSectors(ctx context.Context, maddr address.Address, tok sealing.TipSetToken) ([]*miner.SectorOnChainInfo, error) { + tsk, err := types.TipSetKeyFromBytes(tok) + if err != nil { + return nil, xerrors.Errorf("faile dto unmarshal TipSetToken to TipSetKey: %w", err) + } + + return s.delegate.StateMinerActiveSectors(ctx, maddr, tsk) +} + func (s SealingAPIAdapter) StateWaitMsg(ctx context.Context, mcid cid.Cid) (sealing.MsgLookup, error) { wmsg, err := s.delegate.StateWaitMsg(ctx, mcid, build.MessageConfidence, api.LookbackNoLimit, true) if err != nil { diff --git a/storage/miner.go b/storage/miner.go index 0b1f6684026..c52b786eef1 100644 --- a/storage/miner.go +++ b/storage/miner.go @@ -86,6 +86,7 @@ type fullNodeFilteredAPI interface { StateSectorPartition(ctx context.Context, maddr address.Address, sectorNumber abi.SectorNumber, tok types.TipSetKey) (*miner.SectorLocation, error) StateMinerInfo(context.Context, address.Address, types.TipSetKey) (miner.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) @@ -282,7 +283,7 @@ func (wpp *StorageWpp) GenerateCandidates(ctx context.Context, randomness abi.Po return cds, nil } -func (wpp *StorageWpp) ComputeProof(ctx context.Context, ssi []builtin.SectorInfo, rand abi.PoStRandomness) ([]builtin.PoStProof, error) { +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 } diff --git a/storage/miner_sealing.go b/storage/miner_sealing.go index 01b9546a680..d8ef26835c1 100644 --- a/storage/miner_sealing.go +++ b/storage/miner_sealing.go @@ -71,8 +71,15 @@ func (m *Miner) CommitPending(ctx context.Context) ([]abi.SectorID, error) { return m.sealing.CommitPending(ctx) } -func (m *Miner) MarkForUpgrade(id abi.SectorNumber) error { - return m.sealing.MarkForUpgrade(id) +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 m.sealing.MarkForUpgrade(ctx, id) } func (m *Miner) IsMarkedForUpgrade(id abi.SectorNumber) bool { diff --git a/storage/wdpost_changehandler_test.go b/storage/wdpost_changehandler_test.go index a2283cb7cc2..2fcbe770e58 100644 --- a/storage/wdpost_changehandler_test.go +++ b/storage/wdpost_changehandler_test.go @@ -117,7 +117,7 @@ func (m *mockAPI) startGeneratePoST( completeGeneratePoST CompleteGeneratePoSTCb, ) context.CancelFunc { ctx, cancel := context.WithCancel(ctx) - + log.Errorf("mock posting\n") m.statesLk.Lock() defer m.statesLk.Unlock() m.postStates[deadline.Open] = postStatusProving diff --git a/storage/wdpost_run.go b/storage/wdpost_run.go index 83802a7f325..6a86656c732 100644 --- a/storage/wdpost_run.go +++ b/storage/wdpost_run.go @@ -19,8 +19,8 @@ import ( "go.opencensus.io/trace" "golang.org/x/xerrors" - proof2 "github.com/filecoin-project/specs-actors/v2/actors/runtime/proof" "github.com/filecoin-project/specs-actors/v3/actors/runtime/proof" + proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/build" @@ -568,7 +568,7 @@ func (s *WindowPoStScheduler) runPoStCycle(ctx context.Context, di dline.Info, t for retries := 0; ; retries++ { skipCount := uint64(0) var partitions []miner.PoStPartition - var sinfos []proof2.SectorInfo + var xsinfos []proof7.ExtendedSectorInfo for partIdx, partition := range batch { // TODO: Can do this in parallel toProve, err := bitfield.SubtractBitField(partition.LiveSectors, partition.FaultySectors) @@ -611,14 +611,14 @@ func (s *WindowPoStScheduler) runPoStCycle(ctx context.Context, di dline.Info, t continue } - sinfos = append(sinfos, ssi...) + xsinfos = append(xsinfos, ssi...) partitions = append(partitions, miner.PoStPartition{ Index: uint64(batchPartitionStartIdx + partIdx), Skipped: skipped, }) } - if len(sinfos) == 0 { + if len(xsinfos) == 0 { // nothing to prove for this batch break } @@ -637,14 +637,22 @@ func (s *WindowPoStScheduler) runPoStCycle(ctx context.Context, di dline.Info, t return nil, err } - postOut, ps, err := s.prover.GenerateWindowPoSt(ctx, abi.ActorID(mid), sinfos, append(abi.PoStRandomness{}, rand...)) + defer func() { + if r := recover(); r != nil { + log.Errorf("recover: %s", r) + } + }() + postOut, ps, err := s.prover.GenerateWindowPoSt(ctx, abi.ActorID(mid), xsinfos, append(abi.PoStRandomness{}, rand...)) elapsed := time.Since(tsStart) - log.Infow("computing window post", "batch", batchIdx, "elapsed", elapsed) - + if err != nil { + log.Errorf("error generating window post: %s", err) + } if err == nil { + // If we proved nothing, something is very wrong. if len(postOut) == 0 { + log.Errorf("len(postOut) == 0") return nil, xerrors.Errorf("received no proofs back from generate window post") } @@ -665,6 +673,14 @@ func (s *WindowPoStScheduler) runPoStCycle(ctx context.Context, di dline.Info, t } // If we generated an incorrect proof, try again. + sinfos := make([]proof7.SectorInfo, len(xsinfos)) + for i, xsi := range xsinfos { + sinfos[i] = proof7.SectorInfo{ + SealProof: xsi.SealProof, + SectorNumber: xsi.SectorNumber, + SealedCID: xsi.SealedCID, + } + } if correct, err := s.verifier.VerifyWindowPoSt(ctx, proof.WindowPoStVerifyInfo{ Randomness: abi.PoStRandomness(checkRand), Proofs: postOut, @@ -687,7 +703,7 @@ func (s *WindowPoStScheduler) runPoStCycle(ctx context.Context, di dline.Info, t } // Proof generation failed, so retry - + log.Debugf("Proof generation failed, retry") if len(ps) == 0 { // If we didn't skip any new sectors, we failed // for some other reason and we need to abort. @@ -715,10 +731,8 @@ func (s *WindowPoStScheduler) runPoStCycle(ctx context.Context, di dline.Info, t if !somethingToProve { continue } - posts = append(posts, params) } - return posts, nil } @@ -767,7 +781,7 @@ func (s *WindowPoStScheduler) batchPartitions(partitions []api.Partition, nv net return batches, nil } -func (s *WindowPoStScheduler) sectorsForProof(ctx context.Context, goodSectors, allSectors bitfield.BitField, ts *types.TipSet) ([]proof2.SectorInfo, error) { +func (s *WindowPoStScheduler) sectorsForProof(ctx context.Context, goodSectors, allSectors bitfield.BitField, ts *types.TipSet) ([]proof7.ExtendedSectorInfo, error) { sset, err := s.api.StateMinerSectors(ctx, s.actor, &goodSectors, ts.Key()) if err != nil { return nil, err @@ -777,22 +791,24 @@ func (s *WindowPoStScheduler) sectorsForProof(ctx context.Context, goodSectors, return nil, nil } - substitute := proof2.SectorInfo{ + substitute := proof7.ExtendedSectorInfo{ SectorNumber: sset[0].SectorNumber, SealedCID: sset[0].SealedCID, SealProof: sset[0].SealProof, + SectorKey: sset[0].SectorKeyCID, } - sectorByID := make(map[uint64]proof2.SectorInfo, len(sset)) + sectorByID := make(map[uint64]proof7.ExtendedSectorInfo, len(sset)) for _, sector := range sset { - sectorByID[uint64(sector.SectorNumber)] = proof2.SectorInfo{ + sectorByID[uint64(sector.SectorNumber)] = proof7.ExtendedSectorInfo{ SectorNumber: sector.SectorNumber, SealedCID: sector.SealedCID, SealProof: sector.SealProof, + SectorKey: sector.SectorKeyCID, } } - proofSectors := make([]proof2.SectorInfo, 0, len(sset)) + proofSectors := make([]proof7.ExtendedSectorInfo, 0, len(sset)) if err := allSectors.ForEach(func(sectorNo uint64) error { if info, found := sectorByID[sectorNo]; found { proofSectors = append(proofSectors, info) diff --git a/storage/wdpost_run_test.go b/storage/wdpost_run_test.go index 9ece295caa9..feeaab6ede0 100644 --- a/storage/wdpost_run_test.go +++ b/storage/wdpost_run_test.go @@ -116,11 +116,11 @@ func (m *mockStorageMinerAPI) GasEstimateFeeCap(context.Context, *types.Message, type mockProver struct { } -func (m *mockProver) GenerateWinningPoSt(context.Context, abi.ActorID, []proof2.SectorInfo, abi.PoStRandomness) ([]proof2.PoStProof, error) { +func (m *mockProver) GenerateWinningPoSt(context.Context, abi.ActorID, []proof7.ExtendedSectorInfo, abi.PoStRandomness) ([]proof2.PoStProof, error) { panic("implement me") } -func (m *mockProver) GenerateWindowPoSt(ctx context.Context, aid abi.ActorID, sis []proof2.SectorInfo, pr abi.PoStRandomness) ([]proof2.PoStProof, []abi.SectorID, error) { +func (m *mockProver) GenerateWindowPoSt(ctx context.Context, aid abi.ActorID, sis []proof7.ExtendedSectorInfo, pr abi.PoStRandomness) ([]proof2.PoStProof, []abi.SectorID, error) { return []proof2.PoStProof{ { PoStProof: abi.RegisteredPoStProof_StackedDrgWindow2KiBV1, @@ -132,7 +132,7 @@ func (m *mockProver) GenerateWindowPoSt(ctx context.Context, aid abi.ActorID, si type mockVerif struct { } -func (m mockVerif) VerifyWinningPoSt(ctx context.Context, info proof2.WinningPoStVerifyInfo) (bool, error) { +func (m mockVerif) VerifyWinningPoSt(ctx context.Context, info proof7.WinningPoStVerifyInfo, currEpoch abi.ChainEpoch, nv network.Version) (bool, error) { panic("implement me") } From 237d0bb1b055fead98969d9630a55037484e977a Mon Sep 17 00:00:00 2001 From: zenground0 Date: Wed, 5 Jan 2022 08:24:46 -0500 Subject: [PATCH 158/393] Deflake snap deals integration test --- itests/kit/blockminer.go | 70 ++++++++++++++++++++++++++++++++++------ 1 file changed, 61 insertions(+), 9 deletions(-) diff --git a/itests/kit/blockminer.go b/itests/kit/blockminer.go index c1061b5585a..878f4a6630b 100644 --- a/itests/kit/blockminer.go +++ b/itests/kit/blockminer.go @@ -83,10 +83,10 @@ func (p *partitionTracker) recordIfPost(t *testing.T, bm *BlockMiner, smsg *type } // Like MineBlocks but refuses to mine until the window post scheduler has wdpost messages in the mempool -// and everything shuts down if a post fails +// and everything shuts down if a post fails. It also enforces that every block mined succeeds func (bm *BlockMiner) MineBlocksMustPost(ctx context.Context, blocktime time.Duration) { - time.Sleep(time.Second) + time.Sleep(3 * time.Second) // wrap context in a cancellable context. ctx, bm.cancel = context.WithCancel(ctx) @@ -96,7 +96,20 @@ func (bm *BlockMiner) MineBlocksMustPost(ctx context.Context, blocktime time.Dur activeDeadlines := make(map[int]struct{}) _ = activeDeadlines - + ts, err := bm.miner.FullNode.ChainHead(ctx) + require.NoError(bm.t, err) + wait := make(chan bool) + reportSuccessFn := func(success bool, epoch abi.ChainEpoch, err error) { + bm.t.Logf("done with mine one at epoch %d, success %t", epoch, success) + require.NoError(bm.t, err) + wait <- success + } + chg, err := bm.miner.FullNode.ChainNotify(ctx) + require.NoError(bm.t, err) + // read current out + curr := <-chg + require.Equal(bm.t, ts.Height(), curr[0].Val.Height()) + numMined := curr[0].Val.Height() for { select { case <-time.After(blocktime): @@ -110,6 +123,7 @@ func (bm *BlockMiner) MineBlocksMustPost(ctx context.Context, blocktime time.Dur ts, err := bm.miner.FullNode.ChainHead(ctx) require.NoError(bm.t, err) tsk := ts.Key() + bm.t.Logf("Miner sees head ts: %s at height %d, num mined = %d", tsk, ts.Height(), numMined) dlinfo, err := bm.miner.FullNode.StateMinerProvingDeadline(ctx, bm.miner.ActorAddr, tsk) require.NoError(bm.t, err) if ts.Height()+1 == dlinfo.Last() { // Last epoch in dline, we need to check that miner has posted @@ -132,10 +146,12 @@ func (bm *BlockMiner) MineBlocksMustPost(ctx context.Context, blocktime time.Dur bm.t.Logf("post missing from mpool, block mining suspended until it arrives") POOL: for { + bm.t.Logf("mpool event wait loop at block height %d, ts: %s", ts.Height(), ts.Key()) select { case <-ctx.Done(): return case evt := <-poolEvts: + bm.t.Logf("pool event: %d", evt.Type) if evt.Type == api.MpoolAdd { bm.t.Logf("incoming message %v", evt.Message) if tracker.recordIfPost(bm.t, bm, evt.Message) { @@ -144,17 +160,53 @@ func (bm *BlockMiner) MineBlocksMustPost(ctx context.Context, blocktime time.Dur } } } - + bm.t.Logf("done waiting on mpool") } - } + } + baseHeight := ts.Height() + + syncedToHeight := func(target abi.ChainEpoch) { + headChangeCh, err := bm.miner.FullNode.ChainNotify(ctx) + require.NoError(bm.t, err) + hccurrent, ok1 := <-headChangeCh + for !ok1 { + hccurrent, ok1 = <-headChangeCh + } + if hccurrent[0].Val.Height() >= target { + return + } + var ok2 bool + for { + var headChanges []*api.HeadChange + select { + case headChanges, ok2 = <-headChangeCh: + if !ok2 { // if channel is closed on us fail + bm.t.Log("channel closed") + bm.t.Fatal("chain notify channel closed while waiting to sync") + } + for _, hc := range headChanges { + if hc.Val.Height() >= target { + return + } + } + case <-ctx.Done(): + return + } + } } - err = bm.miner.MineOne(ctx, miner.MineReq{ - InjectNulls: abi.ChainEpoch(nulls), - Done: func(bool, abi.ChainEpoch, error) {}, - }) + var success bool + for i := int64(0); !success; i++ { + err = bm.miner.MineOne(ctx, miner.MineReq{ + InjectNulls: abi.ChainEpoch(nulls + i), + Done: reportSuccessFn, + }) + success = <-wait + } + syncedToHeight(baseHeight + 1) + numMined += 1 switch { case err == nil: // wrap around case ctx.Err() != nil: // context fired. From 5ec5ebac31f9a2b38b52b2b568019351db95761f Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Wed, 5 Jan 2022 13:52:51 -0500 Subject: [PATCH 159/393] Fix circsuypply calc around null blocks --- chain/consensus/filcns/compute_state.go | 5 ++++- chain/vm/vm.go | 9 ++++++++- testplans/lotus-soup/go.mod | 4 ++-- testplans/lotus-soup/go.sum | 23 ++++++++++++++++++----- 4 files changed, 32 insertions(+), 9 deletions(-) diff --git a/chain/consensus/filcns/compute_state.go b/chain/consensus/filcns/compute_state.go index 3c70f61db15..2f8cab7408e 100644 --- a/chain/consensus/filcns/compute_state.go +++ b/chain/consensus/filcns/compute_state.go @@ -169,7 +169,10 @@ func (t *TipSetExecutor) ApplyBlocks(ctx context.Context, sm *stmgr.StateManager } } - vmi.SetBlockHeight(i + 1) + if err = vmi.SetBlockHeight(ctx, i+1); err != nil { + return cid.Undef, cid.Undef, xerrors.Errorf("error advancing vm an epoch: %w", err) + } + pstate = newState } diff --git a/chain/vm/vm.go b/chain/vm/vm.go index 7e9e972ae40..703a19880ea 100644 --- a/chain/vm/vm.go +++ b/chain/vm/vm.go @@ -824,8 +824,15 @@ func (vm *VM) StateTree() types.StateTree { return vm.cstate } -func (vm *VM) SetBlockHeight(h abi.ChainEpoch) { +func (vm *VM) SetBlockHeight(ctx context.Context, h abi.ChainEpoch) error { vm.blockHeight = h + ncirc, err := vm.circSupplyCalc(ctx, vm.blockHeight, vm.cstate) + if err != nil { + return err + } + + vm.baseCircSupply = ncirc + return nil } func (vm *VM) Invoke(act *types.Actor, rt *Runtime, method abi.MethodNum, params []byte) ([]byte, aerrors.ActorError) { diff --git a/testplans/lotus-soup/go.mod b/testplans/lotus-soup/go.mod index e7d03c23b48..308ee5140c7 100644 --- a/testplans/lotus-soup/go.mod +++ b/testplans/lotus-soup/go.mod @@ -8,8 +8,8 @@ require ( github.com/davecgh/go-spew v1.1.1 github.com/drand/drand v1.3.0 github.com/filecoin-project/go-address v0.0.6 - github.com/filecoin-project/go-data-transfer v1.12.0 - github.com/filecoin-project/go-fil-markets v1.13.5 + github.com/filecoin-project/go-data-transfer v1.12.1 + github.com/filecoin-project/go-fil-markets v1.14.1 github.com/filecoin-project/go-jsonrpc v0.1.5 github.com/filecoin-project/go-state-types v0.1.1 github.com/filecoin-project/go-storedcounter v0.1.0 diff --git a/testplans/lotus-soup/go.sum b/testplans/lotus-soup/go.sum index c16a429cc0a..210cf03ad82 100644 --- a/testplans/lotus-soup/go.sum +++ b/testplans/lotus-soup/go.sum @@ -403,8 +403,9 @@ 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-data-transfer v1.12.0 h1:y44x35JvB93kezahMURKizIa/aizGTPSHqi5cbAfTEo= github.com/filecoin-project/go-data-transfer v1.12.0/go.mod h1:tDrD2jLU2TpVhd+5B8iqBp0fQRV4lP80WZccKXugjYc= +github.com/filecoin-project/go-data-transfer v1.12.1 h1:gAznAZKySVs2FS6T/vDq7R3f0DewLnxeROe0oOE6bZU= +github.com/filecoin-project/go-data-transfer v1.12.1/go.mod h1:j3HL645YiQFxcM+q7uPlGApILSqeweDABNgZQP7pDYU= github.com/filecoin-project/go-ds-versioning v0.0.0-20211206185234-508abd7c2aff h1:2bG2ggVZ/rInd/YqUfRj4A5siGuYOPxxuD4I8nYLJF0= 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-fil-commcid v0.0.0-20200716160307-8f644712406f/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= @@ -413,8 +414,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.13.5 h1:NLeF8rI5ZPOJNYEgA6NHrvnuh5QE/2dwuU/7wPW7zP0= -github.com/filecoin-project/go-fil-markets v1.13.5/go.mod h1:vXOHH3q2+zLk929W+lIq3etuDFTyJJ8nG2DwGHG2R1E= +github.com/filecoin-project/go-fil-markets v1.14.1 h1:Bx+TSbkAN8K97Hpjgu+MpeRFbXIKH/fNpNp1ZGAEH3I= +github.com/filecoin-project/go-fil-markets v1.14.1/go.mod h1:vXOHH3q2+zLk929W+lIq3etuDFTyJJ8nG2DwGHG2R1E= 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= @@ -524,6 +525,11 @@ 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.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/stdr v1.2.0/go.mod h1:YkVgnZu1ZjjL7xTxrfm/LLZBfkhTqSR1ydtm6jTKKwI= 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= @@ -934,8 +940,9 @@ github.com/ipfs/go-filestore v1.1.0 h1:Pu4tLBi1bucu6/HU9llaOmb9yLFk/sgP+pW764zND github.com/ipfs/go-filestore v1.1.0/go.mod h1:6e1/5Y6NvLuCRdmda/KA4GUhXJQ3Uat6vcWm2DJfxc8= github.com/ipfs/go-fs-lock v0.0.6 h1:sn3TWwNVQqSeNjlWy6zQ1uUGAZrV3hPOyEA6y1/N2a0= github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28L7zESmM= -github.com/ipfs/go-graphsync v0.11.0 h1:PiiD5CnoC3xEHMW8d6uBGqGcoTwiMB5d9CORIEyF6iA= github.com/ipfs/go-graphsync v0.11.0/go.mod h1:wC+c8vGVjAHthsVIl8LKr37cUra2GOaMYcQNNmMxDqE= +github.com/ipfs/go-graphsync v0.11.5 h1:WA5hVxGBtcal6L6nqubKiqRolaZxbexOK3GumGFJRR4= +github.com/ipfs/go-graphsync v0.11.5/go.mod h1:+/sZqRwRCQRrV7NCzgBtufmr5QGpUE98XSa7NlsztmM= github.com/ipfs/go-hamt-ipld v0.1.1/go.mod h1:1EZCr2v0jlCnhpa+aZ0JZYp8Tt2w16+JJOAVz17YcDk= 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= @@ -1035,8 +1042,9 @@ github.com/ipfs/go-path v0.0.7 h1:H06hKMquQ0aYtHiHryOMLpQC1qC3QwXwkahcEVD51Ho= github.com/ipfs/go-path v0.0.7/go.mod h1:6KTKmeRnBXgqrTvzFrPV3CamxcgvXX/4z79tfAd2Sno= 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.7.0 h1:VyO6G4sbzX80K58N60cCaHsSsypbUNs1GjO5seGNsQ0= 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-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= @@ -2206,6 +2214,8 @@ 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/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= @@ -2213,11 +2223,14 @@ go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9deb go.opentelemetry.io/otel/metric v0.25.0/go.mod h1:E884FSpQfnJOMMUaq+05IWlJ4rjZpk2s/F1Ju+TEEm8= go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= +go.opentelemetry.io/otel/sdk v1.2.0 h1:wKN260u4DesJYhyjxDa7LRFkuhH7ncEVKU37LWcyNIo= go.opentelemetry.io/otel/sdk v1.2.0/go.mod h1:jNN8QtpvbsKhgaC6V5lHiejMoKD+V8uadoSafgHPx1U= go.opentelemetry.io/otel/sdk/export/metric v0.25.0/go.mod h1:Ej7NOa+WpN49EIcr1HMUYRvxXXCCnQCg2+ovdt2z8Pk= 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/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= From a777cf7166c8e0535c3054ade7ffbdee165aa337 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Fri, 7 Jan 2022 00:37:14 -0500 Subject: [PATCH 160/393] remove power change --- build/params_butterfly.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/build/params_butterfly.go b/build/params_butterfly.go index 9a0018e73a2..aefeb63a5e4 100644 --- a/build/params_butterfly.go +++ b/build/params_butterfly.go @@ -16,7 +16,7 @@ var DrandSchedule = map[abi.ChainEpoch]DrandEnum{ 0: DrandMainnet, } -const GenesisNetworkVersion = network.Version13 +const GenesisNetworkVersion = network.Version14 const BootstrappersFile = "butterflynet.pi" const GenesisFile = "butterflynet.car" @@ -40,12 +40,15 @@ const UpgradeTrustHeight = -13 const UpgradeNorwegianHeight = -14 const UpgradeTurboHeight = -15 const UpgradeHyperdriveHeight = -16 -const UpgradeChocolateHeight = 6360 +const UpgradeChocolateHeight = -17 func init() { policy.SetConsensusMinerMinPower(abi.NewStoragePower(2 << 30)) policy.SetSupportedProofTypes( abi.RegisteredSealProof_StackedDrg512MiBV1, + abi.RegisteredSealProof_StackedDrg32GiBV1, + abi.RegisteredSealProof_StackedDrg64GiBV1, + ) SetAddressNetwork(address.Testnet) From 736fb5c5b0847b2b7435a592b91ccbb5a239f90d Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Thu, 6 Jan 2022 15:35:39 +0100 Subject: [PATCH 161/393] Add gas charge for VerifyReplicaUpdate Signed-off-by: Jakub Sztandera --- chain/vm/gas.go | 2 ++ chain/vm/gas_v0.go | 5 +++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/chain/vm/gas.go b/chain/vm/gas.go index c6f8810f2f1..e75c86b9fb4 100644 --- a/chain/vm/gas.go +++ b/chain/vm/gas.go @@ -209,6 +209,8 @@ var Prices = map[abi.ChainEpoch]Pricelist{ }, verifyPostDiscount: false, verifyConsensusFault: 495422, + + verifyReplicaUpdate: 36316136, }, } diff --git a/chain/vm/gas_v0.go b/chain/vm/gas_v0.go index 548227a3356..1bda6dfae21 100644 --- a/chain/vm/gas_v0.go +++ b/chain/vm/gas_v0.go @@ -120,6 +120,8 @@ type pricelistV0 struct { verifyPostLookup map[abi.RegisteredPoStProof]scalingCost verifyPostDiscount bool verifyConsensusFault int64 + + verifyReplicaUpdate int64 } var _ Pricelist = (*pricelistV0)(nil) @@ -229,8 +231,7 @@ func (pl *pricelistV0) OnVerifyAggregateSeals(aggregate proof7.AggregateSealVeri // OnVerifyReplicaUpdate func (pl *pricelistV0) OnVerifyReplicaUpdate(update proof7.ReplicaUpdateInfo) GasCharge { - // TODO: do the thing - return GasCharge{} + return newGasCharge("OnVerifyReplicaUpdate", pl.verifyReplicaUpdate, 0) } // OnVerifyPost From b26d952d09f1e39a436c70b572fd3e71b315d4eb Mon Sep 17 00:00:00 2001 From: zenground0 Date: Fri, 7 Jan 2022 22:20:49 +0530 Subject: [PATCH 162/393] Deflake more practically --- itests/kit/blockminer.go | 62 ++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 38 deletions(-) diff --git a/itests/kit/blockminer.go b/itests/kit/blockminer.go index 878f4a6630b..91ddc2e26e0 100644 --- a/itests/kit/blockminer.go +++ b/itests/kit/blockminer.go @@ -99,17 +99,11 @@ func (bm *BlockMiner) MineBlocksMustPost(ctx context.Context, blocktime time.Dur ts, err := bm.miner.FullNode.ChainHead(ctx) require.NoError(bm.t, err) wait := make(chan bool) - reportSuccessFn := func(success bool, epoch abi.ChainEpoch, err error) { - bm.t.Logf("done with mine one at epoch %d, success %t", epoch, success) - require.NoError(bm.t, err) - wait <- success - } chg, err := bm.miner.FullNode.ChainNotify(ctx) require.NoError(bm.t, err) // read current out curr := <-chg require.Equal(bm.t, ts.Height(), curr[0].Val.Height()) - numMined := curr[0].Val.Height() for { select { case <-time.After(blocktime): @@ -123,7 +117,7 @@ func (bm *BlockMiner) MineBlocksMustPost(ctx context.Context, blocktime time.Dur ts, err := bm.miner.FullNode.ChainHead(ctx) require.NoError(bm.t, err) tsk := ts.Key() - bm.t.Logf("Miner sees head ts: %s at height %d, num mined = %d", tsk, ts.Height(), numMined) + dlinfo, err := bm.miner.FullNode.StateMinerProvingDeadline(ctx, bm.miner.ActorAddr, tsk) require.NoError(bm.t, err) if ts.Height()+1 == dlinfo.Last() { // Last epoch in dline, we need to check that miner has posted @@ -165,36 +159,11 @@ func (bm *BlockMiner) MineBlocksMustPost(ctx context.Context, blocktime time.Dur } } - baseHeight := ts.Height() - - syncedToHeight := func(target abi.ChainEpoch) { - headChangeCh, err := bm.miner.FullNode.ChainNotify(ctx) + var target abi.ChainEpoch + reportSuccessFn := func(success bool, epoch abi.ChainEpoch, err error) { require.NoError(bm.t, err) - hccurrent, ok1 := <-headChangeCh - for !ok1 { - hccurrent, ok1 = <-headChangeCh - } - if hccurrent[0].Val.Height() >= target { - return - } - var ok2 bool - for { - var headChanges []*api.HeadChange - select { - case headChanges, ok2 = <-headChangeCh: - if !ok2 { // if channel is closed on us fail - bm.t.Log("channel closed") - bm.t.Fatal("chain notify channel closed while waiting to sync") - } - for _, hc := range headChanges { - if hc.Val.Height() >= target { - return - } - } - case <-ctx.Done(): - return - } - } + target = epoch + wait <- success } var success bool @@ -205,8 +174,25 @@ func (bm *BlockMiner) MineBlocksMustPost(ctx context.Context, blocktime time.Dur }) success = <-wait } - syncedToHeight(baseHeight + 1) - numMined += 1 + + // Wait until it shows up on the given full nodes ChainHead + // TODO this replicates a flaky condition from MineUntil, + // it would be better to use api to wait for sync, + // but currently this is a bit difficult + // and flaky failure is easy to debug and retry + nloops := 200 + for i := 0; i < nloops; i++ { + ts, err := bm.miner.FullNode.ChainHead(ctx) + require.NoError(bm.t, err) + + if ts.Height() == target { + break + } + + require.NotEqual(bm.t, i, nloops-1, "block never managed to sync to node") + time.Sleep(time.Millisecond * 10) + } + switch { case err == nil: // wrap around case ctx.Err() != nil: // context fired. From a98ca86a4540cf71c6a6b4a14a94aa0b9b12bafd Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Fri, 7 Jan 2022 16:49:55 -0500 Subject: [PATCH 163/393] Update butterflynet params --- build/bootstrap/butterflynet.pi | 4 +-- build/genesis/butterflynet.car | Bin 2265972 -> 2185801 bytes build/params_butterfly.go | 1 - testplans/lotus-soup/go.mod | 4 +-- testplans/lotus-soup/go.sum | 62 +++++++++++++++++++------------- 5 files changed, 42 insertions(+), 29 deletions(-) diff --git a/build/bootstrap/butterflynet.pi b/build/bootstrap/butterflynet.pi index fbfa1e92c78..1972adc5ad0 100644 --- a/build/bootstrap/butterflynet.pi +++ b/build/bootstrap/butterflynet.pi @@ -1,2 +1,2 @@ -/dns4/bootstrap-0.butterfly.fildev.network/tcp/1347/p2p/12D3KooWBzv5sf4eTyo8cjJGfGnpxo6QkEPkRShG9GqjE2A5QaW5 -/dns4/bootstrap-1.butterfly.fildev.network/tcp/1347/p2p/12D3KooWBo9TSD4XXRFtu6snv6QNYvXgRaSaVb116YiYEsDWgKtq +/dns4/bootstrap-0.butterfly.fildev.network/tcp/1347/p2p/12D3KooWBdRCBLUeKvoy22u5DcXs61adFn31v8WWCZgmBjDCjbsC +/dns4/bootstrap-1.butterfly.fildev.network/tcp/1347/p2p/12D3KooWDUQJBA18njjXnG9RtLxoN3muvdU7PEy55QorUEsdAqdy diff --git a/build/genesis/butterflynet.car b/build/genesis/butterflynet.car index cb840104262cb94c6829e637f7653108643adb05..c79eab38eb96c401356d80105c4479513ddf4e2f 100644 GIT binary patch delta 840933 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 *J99XUJz*}iFRtjd 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%0DJ1^0-J$!>uP*`)#FV)$iu|1i6Y*jf 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

!o#*jgy}q^=W4MxoY$b*hA*^hqV4R>dhr$dKa^ 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 Z}7rP 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±XSa=_AZF<`J4 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 RkLo%I1i2 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%0Ah7qLHI63h;$_FFHU?DAl1p%UAB0RhCJx5UI+ zRZVMmxja5w@&Wn~WEPbp_C_(0-r8+MPuzzB$!m2eum25Rt3!E>b^Y&E0r2(z=fF;^ zY7-x;)?<8g{JwZ*ZkHb#>dj9ZlX4!A`u`E-E7m0j|m3PEosUwa80e_3Aoq~PJG-I#SbD> zeP2rNil>MY4C4M8*w>Ojzx`x(dSQpvv-#H7s?%W+$?tB-VSC%mW?L_My6l~E0pieG zV#jcxvF#`&o4C{U+ck4j8U8{|ejK}1#6H@%-x;OaJKIoZ{}Y5cl-X|ol>&io;eK7Q zOZl}Vn7=l%DHIpfa)nCLumv|K>s;5pKF&H>=V6+&cWeZRL$9KcrO3N7KfaCGW8&-5 zO-^kGAB#7e(im#L+Z<`WXV8V(TZcq|Ky%-sOQe(%kZ$Rg5E1E6 z38lkt1rOi*Tf8{`-`DKSxz986%$%9o{n>=UlN z_IFLhw;B!_#HDZCjAW3fxt;}V>D!!gYimpQm*@Lu?CO4h8Nuhth$~YGSaD}R{tBbw zgP4MRKJR%A-LKi+%`-5p`bpw>Q_Ohvr#tISS19;ZnLZ!N{5=B1gO~!{*$pYPwx5Dk z#1b@^U_Pk*@;Nj~Wh*DC)SBsG>YcK9_}VPu3y{)hd>fRyrRNih7n+&;Vw1Mm8lH|t zR5De{Z-V${vd82shKcqBvaYm66;ll@}KWBmn z4pH#Y7ogr#(;r5V_ZGe;j+p7TDdD$C`ab$qE>!$T|2z>Yvl#YjRv`toMUR62rAu2U zM^V8zWYsnDQv_X(RWkCOODGT6hjiY_aBo`O=X;{d`(^kkrH#jlYA_I4bvs(yaBy2J zv2PXR!Hetw4a16wAMrN>7;p{e$M>Bw837|;+$q(ig)ew?X?9up7$VNIH3#VnKJ@ds zXO|Y7e%0DQv~=hs{{rKXRmW{mzMemS;Efl3|C^GG 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 RP@#AdU|2j8 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 Date: Fri, 7 Jan 2022 18:05:36 -0500 Subject: [PATCH 164/393] Disable mark-for-upgrade two days before the network v15 OhSnap upgrade to avoid unexpected edge cases that may cause deal/sector failure --- cmd/lotus-miner/sectors.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/cmd/lotus-miner/sectors.go b/cmd/lotus-miner/sectors.go index 629ff790333..199869eaff8 100644 --- a/cmd/lotus-miner/sectors.go +++ b/cmd/lotus-miner/sectors.go @@ -5,6 +5,8 @@ import ( "encoding/json" "errors" "fmt" + "github.com/filecoin-project/lotus/build" + "github.com/filecoin-project/lotus/chain/actors/builtin" "os" "sort" "strconv" @@ -1547,6 +1549,17 @@ var sectorsMarkForUpgradeCmd = &cli.Command{ return xerrors.Errorf("classic cc upgrades disabled v15 and beyond, use `snap-up`") } + head, err := api.ChainHead(ctx) + if err != nil { + return xerrors.Errorf("failed to get chain head: %w", err) + } + + twoDays := abi.ChainEpoch(2 * builtin.EpochsInDay) + if head.Height() > (build.UpgradeSnapDealsHeight - twoDays) { + return xerrors.Errorf("OhSnap is coming soon, " + + "please use `snap-up` to upgrade your cc sectors after the network v15 upgrade!") + } + id, err := strconv.ParseUint(cctx.Args().Get(0), 10, 64) if err != nil { return xerrors.Errorf("could not parse sector number: %w", err) From bf23e5990072121daf59d4d236586a481063c5a6 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Fri, 7 Jan 2022 18:24:57 -0500 Subject: [PATCH 165/393] fix lint --- cmd/lotus-miner/sectors.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/cmd/lotus-miner/sectors.go b/cmd/lotus-miner/sectors.go index 199869eaff8..5c335f2334d 100644 --- a/cmd/lotus-miner/sectors.go +++ b/cmd/lotus-miner/sectors.go @@ -5,14 +5,15 @@ import ( "encoding/json" "errors" "fmt" - "github.com/filecoin-project/lotus/build" - "github.com/filecoin-project/lotus/chain/actors/builtin" "os" "sort" "strconv" "strings" "time" + "github.com/filecoin-project/lotus/build" + "github.com/filecoin-project/lotus/chain/actors/builtin" + "github.com/docker/go-units" "github.com/fatih/color" cbor "github.com/ipfs/go-ipld-cbor" From d4f46122f78b70a7acd5eb82663b38497541174a Mon Sep 17 00:00:00 2001 From: Jiaying Wang <42981373+jennijuju@users.noreply.github.com> Date: Fri, 7 Jan 2022 19:01:32 -0500 Subject: [PATCH 166/393] Remove ticket number from the title issue number in PR title is not that useful because reader cannot click it and need to mention the issue in the body for auto close either way. --- .github/pull_request_template.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 76d38d2927c..a5f863facc9 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -12,7 +12,7 @@ Before you mark the PR ready for review, please make sure that: - [ ] All commits have a clear commit message. -- [ ] The PR title is in the form of of `: <#issue number> : ` +- [ ] The PR title is in the form of of `: : ` - example: ` fix: #1234 mempool: Introduce a cache for valid signatures` - `PR type`: _fix_, _feat_, _INTERFACE BREAKING CHANGE_, _CONSENSUS BREAKING_, _build_, _chore_, _ci_, _docs_, _misc_,_perf_, _refactor_, _revert_, _style_, _test_ - `area`: _api_, _chain_, _state_, _vm_, _data transfer_, _market_, _mempool_, _message_, _block production_, _multisig_, _networking_, _paychan_, _proving_, _sealing_, _wallet_ From 57fa377730c2cd88165454fd804a6a08aa922cf9 Mon Sep 17 00:00:00 2001 From: Jiaying Wang <42981373+jennijuju@users.noreply.github.com> Date: Fri, 7 Jan 2022 19:02:51 -0500 Subject: [PATCH 167/393] Update pull_request_template.md --- .github/pull_request_template.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index a5f863facc9..c6273f056c3 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -13,7 +13,7 @@ Before you mark the PR ready for review, please make sure that: - [ ] All commits have a clear commit message. - [ ] The PR title is in the form of of `: : ` - - example: ` fix: #1234 mempool: Introduce a cache for valid signatures` + - example: ` fix: mempool: Introduce a cache for valid signatures` - `PR type`: _fix_, _feat_, _INTERFACE BREAKING CHANGE_, _CONSENSUS BREAKING_, _build_, _chore_, _ci_, _docs_, _misc_,_perf_, _refactor_, _revert_, _style_, _test_ - `area`: _api_, _chain_, _state_, _vm_, _data transfer_, _market_, _mempool_, _message_, _block production_, _multisig_, _networking_, _paychan_, _proving_, _sealing_, _wallet_ - [ ] This PR has tests for new functionality or change in behaviour From a64cf77e84dc40c3bfee74e337404d1fdcc98af9 Mon Sep 17 00:00:00 2001 From: zenground0 Date: Sun, 9 Jan 2022 09:33:07 +0530 Subject: [PATCH 168/393] generated vectors from v7 for bleeding edge --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 4daadced557..53611d56515 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -950,7 +950,7 @@ workflows: codecov-upload: false suite: conformance-bleeding-edge target: "./conformance" - vectors-branch: master + vectors-branch: specs-actors-v7 - trigger-testplans: filters: branches: From 4963fe780980fa2718969144bb89f89c40a3f204 Mon Sep 17 00:00:00 2001 From: zenground0 Date: Sun, 9 Jan 2022 09:41:53 +0530 Subject: [PATCH 169/393] Fix template --- .circleci/template.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/template.yml b/.circleci/template.yml index 666ad39f5e8..ef6818c6d5b 100644 --- a/.circleci/template.yml +++ b/.circleci/template.yml @@ -785,7 +785,7 @@ workflows: codecov-upload: false suite: conformance-bleeding-edge target: "./conformance" - vectors-branch: master + vectors-branch: specs-actors-v7 - trigger-testplans: filters: branches: From 33f2d24f54972547f55069c87f41af51a1db852f Mon Sep 17 00:00:00 2001 From: zenground0 Date: Wed, 8 Dec 2021 12:11:19 -0500 Subject: [PATCH 170/393] Snap Deals Integration - FSM handles the actual cc upgrade process including error states - PoSting (winning and window) works over upgraded and upgrading sectors - Integration test and changes to itest framework to reduce flakes - Update CLI to handle new upgrade - Update dependencies --- api/api_full.go | 2 +- api/api_storage.go | 8 +- api/proxy_gen.go | 30 +- api/v0api/gateway.go | 4 +- api/v0api/proxy_gen.go | 12 +- api/version.go | 2 +- build/openrpc/full.json.gz | Bin 26581 -> 26593 bytes build/openrpc/miner.json.gz | Bin 12555 -> 12680 bytes build/openrpc/worker.json.gz | Bin 3803 -> 3805 bytes build/params_2k.go | 2 +- chain/actors/builtin/builtin.go | 1 + chain/actors/builtin/builtin.go.template | 1 + chain/actors/builtin/miner/actor.go.template | 3 + chain/actors/builtin/miner/miner.go | 3 + chain/consensus/filcns/filecoin.go | 17 +- chain/gen/gen.go | 10 +- chain/stmgr/actors.go | 7 +- chain/sync_test.go | 3 +- chain/vm/syscalls.go | 4 +- cmd/lotus-bench/caching_verifier.go | 5 +- cmd/lotus-bench/main.go | 53 ++-- cmd/lotus-miner/info.go | 12 + cmd/lotus-miner/sectors.go | 76 ++++- cmd/lotus-seal-worker/main.go | 16 ++ cmd/lotus-sim/simulation/mock/mock.go | 3 +- documentation/en/api-v0-methods-miner.md | 18 +- documentation/en/api-v0-methods.md | 1 + documentation/en/api-v1-unstable-methods.md | 1 + documentation/en/cli-lotus-miner.md | 14 + .../en/default-lotus-miner-config.toml | 9 + .../sector-storage/ffiwrapper/sealer_cgo.go | 9 +- .../sector-storage/ffiwrapper/sealer_test.go | 18 +- extern/sector-storage/ffiwrapper/types.go | 17 +- .../sector-storage/ffiwrapper/verifier_cgo.go | 70 +++-- extern/sector-storage/manager.go | 47 ++- extern/sector-storage/mock/mock.go | 67 +++-- extern/sector-storage/teststorage_test.go | 14 +- extern/storage-sealing/cbor_gen.go | 272 +++++++++++++++++- extern/storage-sealing/checks.go | 32 +++ extern/storage-sealing/fsm.go | 119 +++++++- extern/storage-sealing/fsm_events.go | 94 ++++++ extern/storage-sealing/input.go | 39 +++ extern/storage-sealing/mocks/api.go | 15 + extern/storage-sealing/sealing.go | 16 +- extern/storage-sealing/sector_state.go | 123 +++++--- extern/storage-sealing/states_failed.go | 200 ++++++++++--- extern/storage-sealing/states_failed_test.go | 8 +- .../storage-sealing/states_replica_update.go | 209 ++++++++++++++ extern/storage-sealing/states_sealing.go | 6 +- extern/storage-sealing/types.go | 10 +- extern/storage-sealing/upgrade_queue.go | 68 ++++- go.mod | 8 +- go.sum | 12 +- itests/ccupgrade_test.go | 135 ++++++--- itests/kit/blockminer.go | 137 +++++++++ itests/kit/deals.go | 7 +- itests/kit/ensemble.go | 37 +++ .../storageadapter/ondealsectorcommitted.go | 53 +++- miner/miner.go | 6 +- miner/warmup.go | 16 +- node/config/def.go | 21 +- node/impl/storminer.go | 13 +- storage/adapter_storage_miner.go | 9 + storage/miner.go | 3 +- storage/miner_sealing.go | 11 +- storage/wdpost_changehandler_test.go | 2 +- storage/wdpost_run.go | 46 ++- storage/wdpost_run_test.go | 6 +- 68 files changed, 1961 insertions(+), 331 deletions(-) create mode 100644 extern/storage-sealing/states_replica_update.go diff --git a/api/api_full.go b/api/api_full.go index 9ca0f883aa5..cf58a3cc6ee 100644 --- a/api/api_full.go +++ b/api/api_full.go @@ -1084,7 +1084,7 @@ type CirculatingSupply struct { type MiningBaseInfo struct { MinerPower types.BigInt NetworkPower types.BigInt - Sectors []builtin.SectorInfo + Sectors []builtin.ExtendedSectorInfo WorkerKey address.Address SectorSize abi.SectorSize PrevBeaconEntry types.BeaconEntry diff --git a/api/api_storage.go b/api/api_storage.go index 3f0ef50b73b..c032a8e1b64 100644 --- a/api/api_storage.go +++ b/api/api_storage.go @@ -14,6 +14,7 @@ import ( "github.com/filecoin-project/go-address" datatransfer "github.com/filecoin-project/go-data-transfer" "github.com/filecoin-project/go-state-types/abi" + abinetwork "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/specs-actors/v2/actors/builtin/market" "github.com/filecoin-project/specs-storage/storage" @@ -99,8 +100,8 @@ type StorageMiner interface { // Returns null if message wasn't sent SectorTerminateFlush(ctx context.Context) (*cid.Cid, error) //perm:admin // SectorTerminatePending returns a list of pending sector terminations to be sent in the next batch message - SectorTerminatePending(ctx context.Context) ([]abi.SectorID, error) //perm:admin - SectorMarkForUpgrade(ctx context.Context, id abi.SectorNumber) error //perm:admin + SectorTerminatePending(ctx context.Context) ([]abi.SectorID, error) //perm:admin + SectorMarkForUpgrade(ctx context.Context, id abi.SectorNumber, snap bool) error //perm:admin // SectorPreCommitFlush immediately sends a PreCommit message with sectors batched for PreCommit. // Returns null if message wasn't sent SectorPreCommitFlush(ctx context.Context) ([]sealiface.PreCommitBatchRes, error) //perm:admin @@ -111,6 +112,7 @@ type StorageMiner interface { SectorCommitFlush(ctx context.Context) ([]sealiface.CommitBatchRes, error) //perm:admin // SectorCommitPending returns a list of pending Commit sectors to be sent in the next aggregate message SectorCommitPending(ctx context.Context) ([]abi.SectorID, error) //perm:admin + SectorMatchPendingPiecesToOpenSectors(ctx context.Context) error //perm:admin // WorkerConnect tells the node to connect to workers RPC WorkerConnect(context.Context, string) error //perm:admin retry:true @@ -253,7 +255,7 @@ type StorageMiner interface { CheckProvable(ctx context.Context, pp abi.RegisteredPoStProof, sectors []storage.SectorRef, expensive bool) (map[abi.SectorNumber]string, error) //perm:admin - ComputeProof(ctx context.Context, ssi []builtin.SectorInfo, rand abi.PoStRandomness) ([]builtin.PoStProof, error) //perm:read + ComputeProof(ctx context.Context, ssi []builtin.ExtendedSectorInfo, rand abi.PoStRandomness, poStEpoch abi.ChainEpoch, nv abinetwork.Version) ([]builtin.PoStProof, error) //perm:read } var _ storiface.WorkerReturn = *new(StorageMiner) diff --git a/api/proxy_gen.go b/api/proxy_gen.go index 09c71a167e1..0a644e58572 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -17,6 +17,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" "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" apitypes "github.com/filecoin-project/lotus/api/types" "github.com/filecoin-project/lotus/chain/actors/builtin" "github.com/filecoin-project/lotus/chain/actors/builtin/miner" @@ -620,7 +621,7 @@ type StorageMinerStruct struct { CheckProvable func(p0 context.Context, p1 abi.RegisteredPoStProof, p2 []storage.SectorRef, p3 bool) (map[abi.SectorNumber]string, error) `perm:"admin"` - ComputeProof func(p0 context.Context, p1 []builtin.SectorInfo, p2 abi.PoStRandomness) ([]builtin.PoStProof, error) `perm:"read"` + ComputeProof func(p0 context.Context, p1 []builtin.ExtendedSectorInfo, p2 abi.PoStRandomness, p3 abi.ChainEpoch, p4 abinetwork.Version) ([]builtin.PoStProof, error) `perm:"read"` CreateBackup func(p0 context.Context, p1 string) error `perm:"admin"` @@ -758,7 +759,9 @@ type StorageMinerStruct struct { SectorGetSealDelay func(p0 context.Context) (time.Duration, error) `perm:"read"` - SectorMarkForUpgrade func(p0 context.Context, p1 abi.SectorNumber) error `perm:"admin"` + SectorMarkForUpgrade func(p0 context.Context, p1 abi.SectorNumber, p2 bool) error `perm:"admin"` + + SectorMatchPendingPiecesToOpenSectors func(p0 context.Context) error `perm:"admin"` SectorPreCommitFlush func(p0 context.Context) ([]sealiface.PreCommitBatchRes, error) `perm:"admin"` @@ -3710,14 +3713,14 @@ func (s *StorageMinerStub) CheckProvable(p0 context.Context, p1 abi.RegisteredPo return *new(map[abi.SectorNumber]string), ErrNotSupported } -func (s *StorageMinerStruct) ComputeProof(p0 context.Context, p1 []builtin.SectorInfo, p2 abi.PoStRandomness) ([]builtin.PoStProof, error) { +func (s *StorageMinerStruct) ComputeProof(p0 context.Context, p1 []builtin.ExtendedSectorInfo, p2 abi.PoStRandomness, p3 abi.ChainEpoch, p4 abinetwork.Version) ([]builtin.PoStProof, error) { if s.Internal.ComputeProof == nil { return *new([]builtin.PoStProof), ErrNotSupported } - return s.Internal.ComputeProof(p0, p1, p2) + return s.Internal.ComputeProof(p0, p1, p2, p3, p4) } -func (s *StorageMinerStub) ComputeProof(p0 context.Context, p1 []builtin.SectorInfo, p2 abi.PoStRandomness) ([]builtin.PoStProof, error) { +func (s *StorageMinerStub) ComputeProof(p0 context.Context, p1 []builtin.ExtendedSectorInfo, p2 abi.PoStRandomness, p3 abi.ChainEpoch, p4 abinetwork.Version) ([]builtin.PoStProof, error) { return *new([]builtin.PoStProof), ErrNotSupported } @@ -4469,14 +4472,25 @@ func (s *StorageMinerStub) SectorGetSealDelay(p0 context.Context) (time.Duration return *new(time.Duration), ErrNotSupported } -func (s *StorageMinerStruct) SectorMarkForUpgrade(p0 context.Context, p1 abi.SectorNumber) error { +func (s *StorageMinerStruct) SectorMarkForUpgrade(p0 context.Context, p1 abi.SectorNumber, p2 bool) error { if s.Internal.SectorMarkForUpgrade == nil { return ErrNotSupported } - return s.Internal.SectorMarkForUpgrade(p0, p1) + return s.Internal.SectorMarkForUpgrade(p0, p1, p2) +} + +func (s *StorageMinerStub) SectorMarkForUpgrade(p0 context.Context, p1 abi.SectorNumber, p2 bool) error { + return ErrNotSupported +} + +func (s *StorageMinerStruct) SectorMatchPendingPiecesToOpenSectors(p0 context.Context) error { + if s.Internal.SectorMatchPendingPiecesToOpenSectors == nil { + return ErrNotSupported + } + return s.Internal.SectorMatchPendingPiecesToOpenSectors(p0) } -func (s *StorageMinerStub) SectorMarkForUpgrade(p0 context.Context, p1 abi.SectorNumber) error { +func (s *StorageMinerStub) SectorMatchPendingPiecesToOpenSectors(p0 context.Context) error { return ErrNotSupported } diff --git a/api/v0api/gateway.go b/api/v0api/gateway.go index 18a5ec7d6e6..e3ba56899ae 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/dline" - "github.com/filecoin-project/go-state-types/network" + abinetwork "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/chain/actors/builtin/miner" @@ -57,7 +57,7 @@ type Gateway interface { StateMinerInfo(ctx context.Context, actor address.Address, tsk types.TipSetKey) (miner.MinerInfo, error) StateMinerProvingDeadline(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*dline.Info, error) StateMinerPower(context.Context, address.Address, types.TipSetKey) (*api.MinerPower, error) - StateNetworkVersion(context.Context, types.TipSetKey) (network.Version, error) + StateNetworkVersion(context.Context, types.TipSetKey) (abinetwork.Version, error) StateSearchMsg(ctx context.Context, msg cid.Cid) (*api.MsgLookup, error) StateSectorGetInfo(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk types.TipSetKey) (*miner.SectorOnChainInfo, error) StateVerifiedClientStatus(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*abi.StoragePower, error) diff --git a/api/v0api/proxy_gen.go b/api/v0api/proxy_gen.go index af0687fe5ae..49ebad42892 100644 --- a/api/v0api/proxy_gen.go +++ b/api/v0api/proxy_gen.go @@ -13,7 +13,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/go-state-types/dline" - "github.com/filecoin-project/go-state-types/network" + abinetwork "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/lotus/api" apitypes "github.com/filecoin-project/lotus/api/types" "github.com/filecoin-project/lotus/chain/actors/builtin/miner" @@ -451,7 +451,7 @@ type GatewayStruct struct { StateMinerProvingDeadline func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*dline.Info, error) `` - StateNetworkVersion func(p0 context.Context, p1 types.TipSetKey) (network.Version, error) `` + StateNetworkVersion func(p0 context.Context, p1 types.TipSetKey) (abinetwork.Version, error) `` StateSearchMsg func(p0 context.Context, p1 cid.Cid) (*api.MsgLookup, error) `` @@ -2703,15 +2703,15 @@ func (s *GatewayStub) StateMinerProvingDeadline(p0 context.Context, p1 address.A return nil, ErrNotSupported } -func (s *GatewayStruct) StateNetworkVersion(p0 context.Context, p1 types.TipSetKey) (network.Version, error) { +func (s *GatewayStruct) StateNetworkVersion(p0 context.Context, p1 types.TipSetKey) (abinetwork.Version, error) { if s.Internal.StateNetworkVersion == nil { - return *new(network.Version), ErrNotSupported + return *new(abinetwork.Version), ErrNotSupported } return s.Internal.StateNetworkVersion(p0, p1) } -func (s *GatewayStub) StateNetworkVersion(p0 context.Context, p1 types.TipSetKey) (network.Version, error) { - return *new(network.Version), ErrNotSupported +func (s *GatewayStub) StateNetworkVersion(p0 context.Context, p1 types.TipSetKey) (abinetwork.Version, error) { + return *new(abinetwork.Version), ErrNotSupported } func (s *GatewayStruct) StateSearchMsg(p0 context.Context, p1 cid.Cid) (*api.MsgLookup, error) { diff --git a/api/version.go b/api/version.go index 93148f28df4..0be7de878bc 100644 --- a/api/version.go +++ b/api/version.go @@ -57,7 +57,7 @@ var ( FullAPIVersion0 = newVer(1, 4, 0) FullAPIVersion1 = newVer(2, 1, 0) - MinerAPIVersion0 = newVer(1, 2, 0) + MinerAPIVersion0 = newVer(1, 3, 0) WorkerAPIVersion0 = newVer(1, 5, 0) ) diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 7ca7301ff72e35e16c485e85f0cd4c306540d3c5..1e4efea1a4fcc8ed6a49cd9c92876b457456c26f 100644 GIT binary patch delta 22257 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 delta 22245 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 E00)OA_y7O^ diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index e7083de2449cc0fec7b2962d0b1856b7fc1e71b9..08f41f3c55cb320b41642fb0e29238561a56591c 100644 GIT binary patch literal 12680 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 CH?hC~ literal 12555 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 diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index 717eeaacb2879bc3d4445218e554bffe547f727c..c82ad677093007288784c12142827b97d9bd444d 100644 GIT binary patch delta 2674 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 diff --git a/build/params_2k.go b/build/params_2k.go index 84023c38c6d..6c0918c513e 100644 --- a/build/params_2k.go +++ b/build/params_2k.go @@ -17,7 +17,7 @@ import ( const BootstrappersFile = "" const GenesisFile = "" -const GenesisNetworkVersion = network.Version14 +const GenesisNetworkVersion = network.Version15 var UpgradeBreezeHeight = abi.ChainEpoch(-1) diff --git a/chain/actors/builtin/builtin.go b/chain/actors/builtin/builtin.go index d9373299939..febbca4796c 100644 --- a/chain/actors/builtin/builtin.go +++ b/chain/actors/builtin/builtin.go @@ -61,6 +61,7 @@ const ( // These are all just type aliases across actor versions. In the future, that might change // and we might need to do something fancier. type SectorInfo = proof7.SectorInfo +type ExtendedSectorInfo = proof7.ExtendedSectorInfo type PoStProof = proof7.PoStProof type FilterEstimate = smoothing0.FilterEstimate diff --git a/chain/actors/builtin/builtin.go.template b/chain/actors/builtin/builtin.go.template index 031c05182e4..f5d5eb77b7e 100644 --- a/chain/actors/builtin/builtin.go.template +++ b/chain/actors/builtin/builtin.go.template @@ -45,6 +45,7 @@ const ( // These are all just type aliases across actor versions. In the future, that might change // and we might need to do something fancier. type SectorInfo = proof{{.latestVersion}}.SectorInfo +type ExtendedSectorInfo = proof{{.latestVersion}}.ExtendedSectorInfo type PoStProof = proof{{.latestVersion}}.PoStProof type FilterEstimate = smoothing0.FilterEstimate diff --git a/chain/actors/builtin/miner/actor.go.template b/chain/actors/builtin/miner/actor.go.template index 2b6b78ebcea..74c16be3638 100644 --- a/chain/actors/builtin/miner/actor.go.template +++ b/chain/actors/builtin/miner/actor.go.template @@ -23,6 +23,7 @@ import ( miner2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/miner" miner3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/miner" miner5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/miner" + miner7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/miner" {{range .versions}} builtin{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin" {{end}} @@ -193,6 +194,7 @@ type SectorPreCommitOnChainInfo struct { type PoStPartition = miner0.PoStPartition type RecoveryDeclaration = miner0.RecoveryDeclaration type FaultDeclaration = miner0.FaultDeclaration +type ReplicaUpdate = miner7.ReplicaUpdate // Params type DeclareFaultsParams = miner0.DeclareFaultsParams @@ -201,6 +203,7 @@ type SubmitWindowedPoStParams = miner0.SubmitWindowedPoStParams type ProveCommitSectorParams = miner0.ProveCommitSectorParams type DisputeWindowedPoStParams = miner3.DisputeWindowedPoStParams type ProveCommitAggregateParams = miner5.ProveCommitAggregateParams +type ProveReplicaUpdatesParams = miner7.ProveReplicaUpdatesParams 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 diff --git a/chain/actors/builtin/miner/miner.go b/chain/actors/builtin/miner/miner.go index e60ff8da8b4..7889d7a4dff 100644 --- a/chain/actors/builtin/miner/miner.go +++ b/chain/actors/builtin/miner/miner.go @@ -23,6 +23,7 @@ import ( miner2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/miner" miner3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/miner" miner5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/miner" + miner7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/miner" builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" @@ -282,6 +283,7 @@ type SectorPreCommitOnChainInfo struct { type PoStPartition = miner0.PoStPartition type RecoveryDeclaration = miner0.RecoveryDeclaration type FaultDeclaration = miner0.FaultDeclaration +type ReplicaUpdate = miner7.ReplicaUpdate // Params type DeclareFaultsParams = miner0.DeclareFaultsParams @@ -290,6 +292,7 @@ type SubmitWindowedPoStParams = miner0.SubmitWindowedPoStParams type ProveCommitSectorParams = miner0.ProveCommitSectorParams type DisputeWindowedPoStParams = miner3.DisputeWindowedPoStParams type ProveCommitAggregateParams = miner5.ProveCommitAggregateParams +type ProveReplicaUpdatesParams = miner7.ProveReplicaUpdatesParams 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 diff --git a/chain/consensus/filcns/filecoin.go b/chain/consensus/filcns/filecoin.go index 6d4c8da6473..e112e2bf993 100644 --- a/chain/consensus/filcns/filecoin.go +++ b/chain/consensus/filcns/filecoin.go @@ -26,7 +26,7 @@ import ( "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/go-state-types/network" blockadt "github.com/filecoin-project/specs-actors/actors/util/adt" - proof2 "github.com/filecoin-project/specs-actors/v2/actors/runtime/proof" + "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" bstore "github.com/filecoin-project/lotus/blockstore" "github.com/filecoin-project/lotus/build" @@ -400,17 +400,26 @@ func (filec *FilecoinEC) VerifyWinningPoStProof(ctx context.Context, nv network. return xerrors.Errorf("failed to get ID from miner address %s: %w", h.Miner, err) } - sectors, err := stmgr.GetSectorsForWinningPoSt(ctx, nv, filec.verifier, filec.sm, lbst, h.Miner, rand) + xsectors, err := stmgr.GetSectorsForWinningPoSt(ctx, nv, filec.verifier, filec.sm, lbst, h.Miner, rand) if err != nil { return xerrors.Errorf("getting winning post sector set: %w", err) } - ok, err := ffiwrapper.ProofVerifier.VerifyWinningPoSt(ctx, proof2.WinningPoStVerifyInfo{ + sectors := make([]proof.SectorInfo, len(xsectors)) + for i, xsi := range xsectors { + sectors[i] = proof.SectorInfo{ + SealProof: xsi.SealProof, + SectorNumber: xsi.SectorNumber, + SealedCID: xsi.SealedCID, + } + } + + ok, err := ffiwrapper.ProofVerifier.VerifyWinningPoSt(ctx, proof.WinningPoStVerifyInfo{ Randomness: rand, Proofs: h.WinPoStProof, ChallengedSectors: sectors, Prover: abi.ActorID(mid), - }) + }, h.Height, nv) if err != nil { return xerrors.Errorf("failed to verify election post: %w", err) } diff --git a/chain/gen/gen.go b/chain/gen/gen.go index 461a826e8c3..4bf8dbc12f8 100644 --- a/chain/gen/gen.go +++ b/chain/gen/gen.go @@ -461,7 +461,7 @@ func (cg *ChainGen) NextTipSetFromMinersWithMessagesAndNulls(base *types.TipSet, if et != nil { // TODO: maybe think about passing in more real parameters to this? - wpost, err := cg.eppProvs[m].ComputeProof(context.TODO(), nil, nil) + wpost, err := cg.eppProvs[m].ComputeProof(context.TODO(), nil, nil, round, network.Version0) if err != nil { return nil, err } @@ -620,7 +620,7 @@ func (mca mca) WalletSign(ctx context.Context, a address.Address, v []byte) (*cr type WinningPoStProver interface { GenerateCandidates(context.Context, abi.PoStRandomness, uint64) ([]uint64, error) - ComputeProof(context.Context, []proof5.SectorInfo, abi.PoStRandomness) ([]proof5.PoStProof, error) + ComputeProof(context.Context, []proof7.ExtendedSectorInfo, abi.PoStRandomness, abi.ChainEpoch, network.Version) ([]proof5.PoStProof, error) } type wppProvider struct{} @@ -629,7 +629,7 @@ func (wpp *wppProvider) GenerateCandidates(ctx context.Context, _ abi.PoStRandom return []uint64{0}, nil } -func (wpp *wppProvider) ComputeProof(context.Context, []proof5.SectorInfo, abi.PoStRandomness) ([]proof5.PoStProof, error) { +func (wpp *wppProvider) ComputeProof(context.Context, []proof7.ExtendedSectorInfo, abi.PoStRandomness, abi.ChainEpoch, network.Version) ([]proof5.PoStProof, error) { return ValidWpostForTesting, nil } @@ -692,11 +692,11 @@ func (m genFakeVerifier) VerifyReplicaUpdate(update proof7.ReplicaUpdateInfo) (b panic("not supported") } -func (m genFakeVerifier) VerifyWinningPoSt(ctx context.Context, info proof5.WinningPoStVerifyInfo) (bool, error) { +func (m genFakeVerifier) VerifyWinningPoSt(ctx context.Context, info proof7.WinningPoStVerifyInfo, poStEpoch abi.ChainEpoch, nv network.Version) (bool, error) { panic("not supported") } -func (m genFakeVerifier) VerifyWindowPoSt(ctx context.Context, info proof5.WindowPoStVerifyInfo) (bool, error) { +func (m genFakeVerifier) VerifyWindowPoSt(ctx context.Context, info proof7.WindowPoStVerifyInfo) (bool, error) { panic("not supported") } diff --git a/chain/stmgr/actors.go b/chain/stmgr/actors.go index a8958ee4ce2..52773e1e4d2 100644 --- a/chain/stmgr/actors.go +++ b/chain/stmgr/actors.go @@ -117,7 +117,7 @@ func MinerSectorInfo(ctx context.Context, sm *StateManager, maddr address.Addres return mas.GetSector(sid) } -func GetSectorsForWinningPoSt(ctx context.Context, nv network.Version, pv ffiwrapper.Verifier, sm *StateManager, st cid.Cid, maddr address.Address, rand abi.PoStRandomness) ([]builtin.SectorInfo, error) { +func GetSectorsForWinningPoSt(ctx context.Context, nv network.Version, pv ffiwrapper.Verifier, sm *StateManager, st cid.Cid, maddr address.Address, rand abi.PoStRandomness) ([]builtin.ExtendedSectorInfo, error) { act, err := sm.LoadActorRaw(ctx, maddr, st) if err != nil { return nil, xerrors.Errorf("failed to load miner actor: %w", err) @@ -203,12 +203,13 @@ func GetSectorsForWinningPoSt(ctx context.Context, nv network.Version, pv ffiwra return nil, xerrors.Errorf("loading proving sectors: %w", err) } - out := make([]builtin.SectorInfo, len(sectors)) + out := make([]builtin.ExtendedSectorInfo, len(sectors)) for i, sinfo := range sectors { - out[i] = builtin.SectorInfo{ + out[i] = builtin.ExtendedSectorInfo{ SealProof: sinfo.SealProof, SectorNumber: sinfo.SectorNumber, SealedCID: sinfo.SealedCID, + SectorKey: sinfo.SectorKeyCID, } } diff --git a/chain/sync_test.go b/chain/sync_test.go index 3293856c7a1..2af8aeb5433 100644 --- a/chain/sync_test.go +++ b/chain/sync_test.go @@ -22,6 +22,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" proof2 "github.com/filecoin-project/specs-actors/v2/actors/runtime/proof" + proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/build" @@ -543,7 +544,7 @@ func (wpp badWpp) GenerateCandidates(context.Context, abi.PoStRandomness, uint64 return []uint64{1}, nil } -func (wpp badWpp) ComputeProof(context.Context, []proof2.SectorInfo, abi.PoStRandomness) ([]proof2.PoStProof, error) { +func (wpp badWpp) ComputeProof(context.Context, []proof7.ExtendedSectorInfo, abi.PoStRandomness, abi.ChainEpoch, network.Version) ([]proof2.PoStProof, error) { return []proof2.PoStProof{ { PoStProof: abi.RegisteredPoStProof_StackedDrgWinning2KiBV1, diff --git a/chain/vm/syscalls.go b/chain/vm/syscalls.go index b8c027bd7b4..cd143279e1c 100644 --- a/chain/vm/syscalls.go +++ b/chain/vm/syscalls.go @@ -245,8 +245,8 @@ func (ss *syscallShim) workerKeyAtLookback(height abi.ChainEpoch) (address.Addre return ResolveToKeyAddr(ss.cstate, ss.cst, info.Worker) } -func (ss *syscallShim) VerifyPoSt(proof proof5.WindowPoStVerifyInfo) error { - ok, err := ss.verifier.VerifyWindowPoSt(context.TODO(), proof) +func (ss *syscallShim) VerifyPoSt(info proof5.WindowPoStVerifyInfo) error { + ok, err := ss.verifier.VerifyWindowPoSt(context.TODO(), info) if err != nil { return err } diff --git a/cmd/lotus-bench/caching_verifier.go b/cmd/lotus-bench/caching_verifier.go index 358fbd04603..9fd6a33f7c3 100644 --- a/cmd/lotus-bench/caching_verifier.go +++ b/cmd/lotus-bench/caching_verifier.go @@ -8,6 +8,7 @@ import ( proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/lotus/extern/sector-storage/ffiwrapper" proof2 "github.com/filecoin-project/specs-actors/v2/actors/runtime/proof" "github.com/ipfs/go-datastore" @@ -86,8 +87,8 @@ func (cv *cachingVerifier) VerifySeal(svi proof2.SealVerifyInfo) (bool, error) { }, &svi) } -func (cv *cachingVerifier) VerifyWinningPoSt(ctx context.Context, info proof2.WinningPoStVerifyInfo) (bool, error) { - return cv.backend.VerifyWinningPoSt(ctx, info) +func (cv *cachingVerifier) VerifyWinningPoSt(ctx context.Context, info proof7.WinningPoStVerifyInfo, poStEpoch abi.ChainEpoch, nv network.Version) (bool, error) { + return cv.backend.VerifyWinningPoSt(ctx, info, poStEpoch, nv) } func (cv *cachingVerifier) VerifyWindowPoSt(ctx context.Context, info proof2.WindowPoStVerifyInfo) (bool, error) { return cv.withCache(func() (bool, error) { diff --git a/cmd/lotus-bench/main.go b/cmd/lotus-bench/main.go index 0b8ec6fe3fc..8893e7b8e4c 100644 --- a/cmd/lotus-bench/main.go +++ b/cmd/lotus-bench/main.go @@ -12,6 +12,8 @@ import ( "time" saproof2 "github.com/filecoin-project/specs-actors/v2/actors/runtime/proof" + "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" + saproof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" "github.com/docker/go-units" logging "github.com/ipfs/go-log/v2" @@ -260,7 +262,8 @@ var sealBenchCmd = &cli.Command{ sectorNumber := c.Int("num-sectors") var sealTimings []SealingResult - var sealedSectors []saproof2.SectorInfo + var extendedSealedSectors []saproof7.ExtendedSectorInfo + var sealedSectors []saproof7.SectorInfo if robench == "" { var err error @@ -269,7 +272,7 @@ var sealBenchCmd = &cli.Command{ PreCommit2: 1, Commit: 1, } - sealTimings, sealedSectors, err = runSeals(sb, sbfs, sectorNumber, parCfg, mid, sectorSize, []byte(c.String("ticket-preimage")), c.String("save-commit2-input"), skipc2, c.Bool("skip-unseal")) + sealTimings, extendedSealedSectors, err = runSeals(sb, sbfs, sectorNumber, parCfg, mid, sectorSize, []byte(c.String("ticket-preimage")), c.String("save-commit2-input"), skipc2, c.Bool("skip-unseal")) if err != nil { return xerrors.Errorf("failed to run seals: %w", err) } @@ -296,7 +299,13 @@ var sealBenchCmd = &cli.Command{ } for _, s := range genm.Sectors { - sealedSectors = append(sealedSectors, saproof2.SectorInfo{ + extendedSealedSectors = append(extendedSealedSectors, saproof7.ExtendedSectorInfo{ + SealedCID: s.CommR, + SectorNumber: s.SectorID, + SealProof: s.ProofType, + SectorKey: nil, + }) + sealedSectors = append(sealedSectors, proof.SectorInfo{ SealedCID: s.CommR, SectorNumber: s.SectorID, SealProof: s.ProofType, @@ -325,20 +334,20 @@ var sealBenchCmd = &cli.Command{ return err } - fcandidates, err := ffiwrapper.ProofVerifier.GenerateWinningPoStSectorChallenge(context.TODO(), wipt, mid, challenge[:], uint64(len(sealedSectors))) + fcandidates, err := ffiwrapper.ProofVerifier.GenerateWinningPoStSectorChallenge(context.TODO(), wipt, mid, challenge[:], uint64(len(extendedSealedSectors))) if err != nil { return err } - candidates := make([]saproof2.SectorInfo, len(fcandidates)) + xcandidates := make([]saproof7.ExtendedSectorInfo, len(fcandidates)) for i, fcandidate := range fcandidates { - candidates[i] = sealedSectors[fcandidate] + xcandidates[i] = extendedSealedSectors[fcandidate] } gencandidates := time.Now() log.Info("computing winning post snark (cold)") - proof1, err := sb.GenerateWinningPoSt(context.TODO(), mid, candidates, challenge[:]) + proof1, err := sb.GenerateWinningPoSt(context.TODO(), mid, xcandidates, challenge[:]) if err != nil { return err } @@ -346,20 +355,29 @@ var sealBenchCmd = &cli.Command{ winningpost1 := time.Now() log.Info("computing winning post snark (hot)") - proof2, err := sb.GenerateWinningPoSt(context.TODO(), mid, candidates, challenge[:]) + proof2, err := sb.GenerateWinningPoSt(context.TODO(), mid, xcandidates, challenge[:]) if err != nil { return err } + candidates := make([]saproof7.SectorInfo, len(xcandidates)) + for i, xsi := range xcandidates { + candidates[i] = saproof7.SectorInfo{ + SealedCID: xsi.SealedCID, + SectorNumber: xsi.SectorNumber, + SealProof: xsi.SealProof, + } + } + winnningpost2 := time.Now() - pvi1 := saproof2.WinningPoStVerifyInfo{ + pvi1 := saproof7.WinningPoStVerifyInfo{ Randomness: abi.PoStRandomness(challenge[:]), Proofs: proof1, ChallengedSectors: candidates, Prover: mid, } - ok, err := ffiwrapper.ProofVerifier.VerifyWinningPoSt(context.TODO(), pvi1) + ok, err := ffiwrapper.ProofVerifier.VerifyWinningPoSt(context.TODO(), pvi1, 0, build.NewestNetworkVersion) if err != nil { return err } @@ -369,14 +387,14 @@ var sealBenchCmd = &cli.Command{ verifyWinningPost1 := time.Now() - pvi2 := saproof2.WinningPoStVerifyInfo{ + pvi2 := saproof7.WinningPoStVerifyInfo{ Randomness: abi.PoStRandomness(challenge[:]), Proofs: proof2, ChallengedSectors: candidates, Prover: mid, } - ok, err = ffiwrapper.ProofVerifier.VerifyWinningPoSt(context.TODO(), pvi2) + ok, err = ffiwrapper.ProofVerifier.VerifyWinningPoSt(context.TODO(), pvi2, 0, build.NewestNetworkVersion) if err != nil { return err } @@ -386,7 +404,7 @@ var sealBenchCmd = &cli.Command{ verifyWinningPost2 := time.Now() log.Info("computing window post snark (cold)") - wproof1, _, err := sb.GenerateWindowPoSt(context.TODO(), mid, sealedSectors, challenge[:]) + wproof1, _, err := sb.GenerateWindowPoSt(context.TODO(), mid, extendedSealedSectors, challenge[:]) if err != nil { return err } @@ -394,7 +412,7 @@ var sealBenchCmd = &cli.Command{ windowpost1 := time.Now() log.Info("computing window post snark (hot)") - wproof2, _, err := sb.GenerateWindowPoSt(context.TODO(), mid, sealedSectors, challenge[:]) + wproof2, _, err := sb.GenerateWindowPoSt(context.TODO(), mid, extendedSealedSectors, challenge[:]) if err != nil { return err } @@ -502,10 +520,10 @@ type ParCfg struct { Commit int } -func runSeals(sb *ffiwrapper.Sealer, sbfs *basicfs.Provider, numSectors int, par ParCfg, mid abi.ActorID, sectorSize abi.SectorSize, ticketPreimage []byte, saveC2inp string, skipc2, skipunseal bool) ([]SealingResult, []saproof2.SectorInfo, error) { +func runSeals(sb *ffiwrapper.Sealer, sbfs *basicfs.Provider, numSectors int, par ParCfg, mid abi.ActorID, sectorSize abi.SectorSize, ticketPreimage []byte, saveC2inp string, skipc2, skipunseal bool) ([]SealingResult, []saproof7.ExtendedSectorInfo, error) { var pieces []abi.PieceInfo sealTimings := make([]SealingResult, numSectors) - sealedSectors := make([]saproof2.SectorInfo, numSectors) + sealedSectors := make([]saproof7.ExtendedSectorInfo, numSectors) preCommit2Sema := make(chan struct{}, par.PreCommit2) commitSema := make(chan struct{}, par.Commit) @@ -579,10 +597,11 @@ func runSeals(sb *ffiwrapper.Sealer, sbfs *basicfs.Provider, numSectors int, par precommit2 := time.Now() <-preCommit2Sema - sealedSectors[i] = saproof2.SectorInfo{ + sealedSectors[i] = saproof7.ExtendedSectorInfo{ SealProof: sid.ProofType, SectorNumber: i, SealedCID: cids.Sealed, + SectorKey: nil, } seed := lapi.SealSeed{ diff --git a/cmd/lotus-miner/info.go b/cmd/lotus-miner/info.go index e50c4366ef3..39de942aa28 100644 --- a/cmd/lotus-miner/info.go +++ b/cmd/lotus-miner/info.go @@ -470,6 +470,8 @@ var stateList = []stateMeta{ {col: color.FgBlue, state: sealing.Empty}, {col: color.FgBlue, state: sealing.WaitDeals}, {col: color.FgBlue, state: sealing.AddPiece}, + {col: color.FgBlue, state: sealing.SnapDealsWaitDeals}, + {col: color.FgBlue, state: sealing.SnapDealsAddPiece}, {col: color.FgRed, state: sealing.UndefinedSectorState}, {col: color.FgYellow, state: sealing.Packing}, @@ -488,6 +490,12 @@ var stateList = []stateMeta{ {col: color.FgYellow, state: sealing.SubmitCommitAggregate}, {col: color.FgYellow, state: sealing.CommitAggregateWait}, {col: color.FgYellow, state: sealing.FinalizeSector}, + {col: color.FgYellow, state: sealing.SnapDealsPacking}, + {col: color.FgYellow, state: sealing.UpdateReplica}, + {col: color.FgYellow, state: sealing.ProveReplicaUpdate}, + {col: color.FgYellow, state: sealing.SubmitReplicaUpdate}, + {col: color.FgYellow, state: sealing.ReplicaUpdateWait}, + {col: color.FgYellow, state: sealing.FinalizeReplicaUpdate}, {col: color.FgCyan, state: sealing.Terminating}, {col: color.FgCyan, state: sealing.TerminateWait}, @@ -495,6 +503,7 @@ var stateList = []stateMeta{ {col: color.FgCyan, state: sealing.TerminateFailed}, {col: color.FgCyan, state: sealing.Removing}, {col: color.FgCyan, state: sealing.Removed}, + {col: color.FgCyan, state: sealing.AbortUpgrade}, {col: color.FgRed, state: sealing.FailedUnrecoverable}, {col: color.FgRed, state: sealing.AddPieceFailed}, @@ -512,6 +521,9 @@ var stateList = []stateMeta{ {col: color.FgRed, state: sealing.RemoveFailed}, {col: color.FgRed, state: sealing.DealsExpired}, {col: color.FgRed, state: sealing.RecoverDealIDs}, + {col: color.FgRed, state: sealing.SnapDealsAddPieceFailed}, + {col: color.FgRed, state: sealing.SnapDealsDealsExpired}, + {col: color.FgRed, state: sealing.ReplicaUpdateFailed}, } func init() { diff --git a/cmd/lotus-miner/sectors.go b/cmd/lotus-miner/sectors.go index b2059a73714..629ff790333 100644 --- a/cmd/lotus-miner/sectors.go +++ b/cmd/lotus-miner/sectors.go @@ -20,6 +20,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/network" miner5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/miner" "github.com/filecoin-project/lotus/api" @@ -50,11 +51,13 @@ var sectorsCmd = &cli.Command{ sectorsExtendCmd, sectorsTerminateCmd, sectorsRemoveCmd, + sectorsSnapUpCmd, sectorsMarkForUpgradeCmd, sectorsStartSealCmd, sectorsSealDelayCmd, sectorsCapacityCollateralCmd, sectorsBatching, + sectorsRefreshPieceMatchingCmd, }, } @@ -1476,6 +1479,44 @@ var sectorsRemoveCmd = &cli.Command{ }, } +var sectorsSnapUpCmd = &cli.Command{ + Name: "snap-up", + Usage: "Mark a committed capacity sector to be filled with deals", + ArgsUsage: "", + Action: func(cctx *cli.Context) error { + if cctx.Args().Len() != 1 { + return lcli.ShowHelp(cctx, xerrors.Errorf("must pass sector number")) + } + + nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx) + if err != nil { + return err + } + defer closer() + api, nCloser, err := lcli.GetFullNodeAPI(cctx) + if err != nil { + return err + } + defer nCloser() + ctx := lcli.ReqContext(cctx) + + nv, err := api.StateNetworkVersion(ctx, types.EmptyTSK) + if err != nil { + return xerrors.Errorf("failed to get network version: %w", err) + } + if nv < network.Version15 { + return xerrors.Errorf("snap deals upgrades enabled in network v15") + } + + id, err := strconv.ParseUint(cctx.Args().Get(0), 10, 64) + if err != nil { + return xerrors.Errorf("could not parse sector number: %w", err) + } + + return nodeApi.SectorMarkForUpgrade(ctx, abi.SectorNumber(id), true) + }, +} + var sectorsMarkForUpgradeCmd = &cli.Command{ Name: "mark-for-upgrade", Usage: "Mark a committed capacity sector for replacement by a sector with deals", @@ -1490,14 +1531,28 @@ var sectorsMarkForUpgradeCmd = &cli.Command{ return err } defer closer() + + api, nCloser, err := lcli.GetFullNodeAPI(cctx) + if err != nil { + return err + } + defer nCloser() ctx := lcli.ReqContext(cctx) + nv, err := api.StateNetworkVersion(ctx, types.EmptyTSK) + if err != nil { + return xerrors.Errorf("failed to get network version: %w", err) + } + if nv >= network.Version15 { + return xerrors.Errorf("classic cc upgrades disabled v15 and beyond, use `snap-up`") + } + id, err := strconv.ParseUint(cctx.Args().Get(0), 10, 64) if err != nil { return xerrors.Errorf("could not parse sector number: %w", err) } - return nodeApi.SectorMarkForUpgrade(ctx, abi.SectorNumber(id)) + return nodeApi.SectorMarkForUpgrade(ctx, abi.SectorNumber(id), false) }, } @@ -2000,6 +2055,25 @@ var sectorsBatchingPendingPreCommit = &cli.Command{ }, } +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) + if err != nil { + return err + } + defer closer() + ctx := lcli.ReqContext(cctx) + + if err := nodeApi.SectorMatchPendingPiecesToOpenSectors(ctx); err != nil { + return err + } + + return nil + }, +} + func yesno(b bool) string { if b { return color.GreenString("YES") diff --git a/cmd/lotus-seal-worker/main.go b/cmd/lotus-seal-worker/main.go index 5aec2f52f22..e6d6c0b6f36 100644 --- a/cmd/lotus-seal-worker/main.go +++ b/cmd/lotus-seal-worker/main.go @@ -163,6 +163,16 @@ var runCmd = &cli.Command{ Usage: "enable commit (32G sectors: all cores or GPUs, 128GiB Memory + 64GiB swap)", Value: true, }, + &cli.BoolFlag{ + Name: "replica-update", + Usage: "enable replica update", + Value: true, + }, + &cli.BoolFlag{ + Name: "prove-replica-update2", + Usage: "enable prove replica update 2", + Value: true, + }, &cli.IntFlag{ Name: "parallel-fetch-limit", Usage: "maximum fetch operations to run in parallel", @@ -268,6 +278,12 @@ var runCmd = &cli.Command{ if cctx.Bool("commit") { taskTypes = append(taskTypes, sealtasks.TTCommit2) } + if cctx.Bool("replicaupdate") { + taskTypes = append(taskTypes, sealtasks.TTReplicaUpdate) + } + if cctx.Bool("prove-replica-update2") { + taskTypes = append(taskTypes, sealtasks.TTProveReplicaUpdate2) + } if len(taskTypes) == 0 { return xerrors.Errorf("no task types specified") diff --git a/cmd/lotus-sim/simulation/mock/mock.go b/cmd/lotus-sim/simulation/mock/mock.go index 7656aaa28a6..70f9ba55013 100644 --- a/cmd/lotus-sim/simulation/mock/mock.go +++ b/cmd/lotus-sim/simulation/mock/mock.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/network" "github.com/ipfs/go-cid" logging "github.com/ipfs/go-log/v2" @@ -78,7 +79,7 @@ func (mockVerifier) VerifyReplicaUpdate(update proof7.ReplicaUpdateInfo) (bool, return false, nil } -func (mockVerifier) VerifyWinningPoSt(ctx context.Context, info proof5.WinningPoStVerifyInfo) (bool, error) { +func (mockVerifier) VerifyWinningPoSt(ctx context.Context, info proof7.WinningPoStVerifyInfo, poStEpoch abi.ChainEpoch, nv network.Version) (bool, error) { panic("should not be called") } func (mockVerifier) VerifyWindowPoSt(ctx context.Context, info proof5.WindowPoStVerifyInfo) (bool, error) { diff --git a/documentation/en/api-v0-methods-miner.md b/documentation/en/api-v0-methods-miner.md index 013aed641ce..272734c56f3 100644 --- a/documentation/en/api-v0-methods-miner.md +++ b/documentation/en/api-v0-methods-miner.md @@ -119,6 +119,7 @@ * [SectorGetExpectedSealDuration](#SectorGetExpectedSealDuration) * [SectorGetSealDelay](#SectorGetSealDelay) * [SectorMarkForUpgrade](#SectorMarkForUpgrade) + * [SectorMatchPendingPiecesToOpenSectors](#SectorMatchPendingPiecesToOpenSectors) * [SectorPreCommitFlush](#SectorPreCommitFlush) * [SectorPreCommitPending](#SectorPreCommitPending) * [SectorRemove](#SectorRemove) @@ -358,12 +359,15 @@ Inputs: { "SealProof": 8, "SectorNumber": 9, + "SectorKey": null, "SealedCID": { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" } } ], - "Bw==" + "Bw==", + 10101, + 15 ] ``` @@ -2474,12 +2478,22 @@ Perms: admin Inputs: ```json [ - 9 + 9, + true ] ``` Response: `{}` +### SectorMatchPendingPiecesToOpenSectors + + +Perms: admin + +Inputs: `null` + +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/api-v0-methods.md b/documentation/en/api-v0-methods.md index 59dfb09f6ef..8f851e319fc 100644 --- a/documentation/en/api-v0-methods.md +++ b/documentation/en/api-v0-methods.md @@ -2579,6 +2579,7 @@ Response: { "SealProof": 8, "SectorNumber": 9, + "SectorKey": null, "SealedCID": { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" } diff --git a/documentation/en/api-v1-unstable-methods.md b/documentation/en/api-v1-unstable-methods.md index 24a14222491..8aa2bfdd2d8 100644 --- a/documentation/en/api-v1-unstable-methods.md +++ b/documentation/en/api-v1-unstable-methods.md @@ -2591,6 +2591,7 @@ Response: { "SealProof": 8, "SectorNumber": 9, + "SectorKey": null, "SealedCID": { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" } diff --git a/documentation/en/cli-lotus-miner.md b/documentation/en/cli-lotus-miner.md index d501619572a..e609a8a0127 100644 --- a/documentation/en/cli-lotus-miner.md +++ b/documentation/en/cli-lotus-miner.md @@ -1525,6 +1525,7 @@ COMMANDS: extend Extend sector expiration terminate Terminate sector on-chain then remove (WARNING: This means losing power and collateral for the removed sector) remove Forcefully remove a sector (WARNING: This means losing power and collateral for the removed sector (use 'terminate' for lower penalty)) + snap-up Mark a committed capacity sector to be filled with deals mark-for-upgrade Mark a committed capacity sector for replacement by a sector with deals seal Manually start sealing a sector (filling any unused space with junk) set-seal-delay Set the time, in minutes, that a new sector waits for deals before sealing starts @@ -1746,6 +1747,19 @@ OPTIONS: ``` +### lotus-miner sectors snap-up +``` +NAME: + lotus-miner sectors snap-up - Mark a committed capacity sector to be filled with deals + +USAGE: + lotus-miner sectors snap-up [command options] + +OPTIONS: + --help, -h show help (default: false) + +``` + ### lotus-miner sectors mark-for-upgrade ``` NAME: diff --git a/documentation/en/default-lotus-miner-config.toml b/documentation/en/default-lotus-miner-config.toml index b034698a2d8..ced8e8a39a6 100644 --- a/documentation/en/default-lotus-miner-config.toml +++ b/documentation/en/default-lotus-miner-config.toml @@ -424,6 +424,15 @@ # env var: LOTUS_STORAGE_ALLOWUNSEAL #AllowUnseal = true + # env var: LOTUS_STORAGE_ALLOWREPLICAUPDATE + #AllowReplicaUpdate = true + + # env var: LOTUS_STORAGE_ALLOWPROVEREPLICAUPDATE1 + #AllowProveReplicaUpdate1 = true + + # env var: LOTUS_STORAGE_ALLOWPROVEREPLICAUPDATE2 + #AllowProveReplicaUpdate2 = true + # env var: LOTUS_STORAGE_RESOURCEFILTERING #ResourceFiltering = "hardware" diff --git a/extern/sector-storage/ffiwrapper/sealer_cgo.go b/extern/sector-storage/ffiwrapper/sealer_cgo.go index ec8554f34ae..e3939d3d10f 100644 --- a/extern/sector-storage/ffiwrapper/sealer_cgo.go +++ b/extern/sector-storage/ffiwrapper/sealer_cgo.go @@ -714,7 +714,6 @@ func (sb *Sealer) ReplicaUpdate(ctx context.Context, sector storage.SectorRef, p if err != nil { return empty, xerrors.Errorf("failed to update replica %d with new deal data: %w", sector.ID.Number, err) } - return storage.ReplicaUpdateOut{NewSealed: sealed, NewUnsealed: unsealed}, nil } @@ -854,6 +853,14 @@ func (sb *Sealer) ReleaseUnsealed(ctx context.Context, sector storage.SectorRef, return xerrors.Errorf("not supported at this layer") } +func (sb *Sealer) ReleaseReplicaUpgrade(ctx context.Context, sector storage.SectorRef) error { + return xerrors.Errorf("not supported at this layer") +} + +func (sb *Sealer) ReleaseSectorKey(ctx context.Context, sector storage.SectorRef) error { + return xerrors.Errorf("not supported at this layer") +} + func (sb *Sealer) Remove(ctx context.Context, sector storage.SectorRef) error { return xerrors.Errorf("not supported at this layer") // happens in localworker } diff --git a/extern/sector-storage/ffiwrapper/sealer_test.go b/extern/sector-storage/ffiwrapper/sealer_test.go index 509efe53269..cf8978464a4 100644 --- a/extern/sector-storage/ffiwrapper/sealer_test.go +++ b/extern/sector-storage/ffiwrapper/sealer_test.go @@ -19,6 +19,7 @@ import ( proof2 "github.com/filecoin-project/specs-actors/v2/actors/runtime/proof" proof5 "github.com/filecoin-project/specs-actors/v5/actors/runtime/proof" + proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" "github.com/ipfs/go-cid" @@ -180,16 +181,16 @@ func (s *seal) unseal(t *testing.T, sb *Sealer, sp *basicfs.Provider, si storage func post(t *testing.T, sealer *Sealer, skipped []abi.SectorID, seals ...seal) { randomness := abi.PoStRandomness{0, 9, 2, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 45, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 7} - sis := make([]proof2.SectorInfo, len(seals)) + xsis := make([]proof7.ExtendedSectorInfo, len(seals)) for i, s := range seals { - sis[i] = proof2.SectorInfo{ + xsis[i] = proof7.ExtendedSectorInfo{ SealProof: s.ref.ProofType, SectorNumber: s.ref.ID.Number, SealedCID: s.cids.Sealed, } } - proofs, skp, err := sealer.GenerateWindowPoSt(context.TODO(), seals[0].ref.ID.Miner, sis, randomness) + proofs, skp, err := sealer.GenerateWindowPoSt(context.TODO(), seals[0].ref.ID.Miner, xsis, randomness) if len(skipped) > 0 { require.Error(t, err) require.EqualValues(t, skipped, skp) @@ -200,7 +201,16 @@ func post(t *testing.T, sealer *Sealer, skipped []abi.SectorID, seals ...seal) { t.Fatalf("%+v", err) } - ok, err := ProofVerifier.VerifyWindowPoSt(context.TODO(), proof2.WindowPoStVerifyInfo{ + sis := make([]proof7.SectorInfo, len(seals)) + for i, xsi := range xsis { + sis[i] = proof7.SectorInfo{ + SealProof: xsi.SealProof, + SectorNumber: xsi.SectorNumber, + SealedCID: xsi.SealedCID, + } + } + + ok, err := ProofVerifier.VerifyWindowPoSt(context.TODO(), proof7.WindowPoStVerifyInfo{ Randomness: randomness, Proofs: proofs, ChallengedSectors: sis, diff --git a/extern/sector-storage/ffiwrapper/types.go b/extern/sector-storage/ffiwrapper/types.go index 1da7ea832b8..78d2c6eca39 100644 --- a/extern/sector-storage/ffiwrapper/types.go +++ b/extern/sector-storage/ffiwrapper/types.go @@ -4,13 +4,12 @@ import ( "context" "io" - proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" - - proof5 "github.com/filecoin-project/specs-actors/v5/actors/runtime/proof" + "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" "github.com/ipfs/go-cid" "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/specs-storage/storage" "github.com/filecoin-project/lotus/extern/sector-storage/ffiwrapper/basicfs" @@ -36,11 +35,11 @@ type Storage interface { } type Verifier interface { - VerifySeal(proof5.SealVerifyInfo) (bool, error) - VerifyAggregateSeals(aggregate proof5.AggregateSealVerifyProofAndInfos) (bool, error) - VerifyReplicaUpdate(update proof7.ReplicaUpdateInfo) (bool, error) - VerifyWinningPoSt(ctx context.Context, info proof5.WinningPoStVerifyInfo) (bool, error) - VerifyWindowPoSt(ctx context.Context, info proof5.WindowPoStVerifyInfo) (bool, error) + VerifySeal(proof.SealVerifyInfo) (bool, error) + VerifyAggregateSeals(aggregate proof.AggregateSealVerifyProofAndInfos) (bool, error) + VerifyReplicaUpdate(update proof.ReplicaUpdateInfo) (bool, error) + VerifyWinningPoSt(ctx context.Context, info proof.WinningPoStVerifyInfo, currEpoch abi.ChainEpoch, v network.Version) (bool, error) + VerifyWindowPoSt(ctx context.Context, info proof.WindowPoStVerifyInfo) (bool, error) GenerateWinningPoStSectorChallenge(context.Context, abi.RegisteredPoStProof, abi.ActorID, abi.PoStRandomness, uint64) ([]uint64, error) } @@ -49,7 +48,7 @@ type Verifier interface { type Prover interface { // TODO: move GenerateWinningPoStSectorChallenge from the Verifier interface to here - AggregateSealProofs(aggregateInfo proof5.AggregateSealVerifyProofAndInfos, proofs [][]byte) ([]byte, error) + AggregateSealProofs(aggregateInfo proof.AggregateSealVerifyProofAndInfos, proofs [][]byte) ([]byte, error) } type SectorProvider interface { diff --git a/extern/sector-storage/ffiwrapper/verifier_cgo.go b/extern/sector-storage/ffiwrapper/verifier_cgo.go index 66064b1f3ad..be38189f120 100644 --- a/extern/sector-storage/ffiwrapper/verifier_cgo.go +++ b/extern/sector-storage/ffiwrapper/verifier_cgo.go @@ -11,16 +11,17 @@ import ( ffi "github.com/filecoin-project/filecoin-ffi" "github.com/filecoin-project/go-state-types/abi" - proof5 "github.com/filecoin-project/specs-actors/v5/actors/runtime/proof" - proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" + "github.com/filecoin-project/go-state-types/network" + ffiproof "github.com/filecoin-project/specs-actors/v5/actors/runtime/proof" + "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" "github.com/filecoin-project/specs-storage/storage" "github.com/filecoin-project/lotus/extern/sector-storage/storiface" ) -func (sb *Sealer) GenerateWinningPoSt(ctx context.Context, minerID abi.ActorID, sectorInfo []proof5.SectorInfo, randomness abi.PoStRandomness) ([]proof5.PoStProof, error) { +func (sb *Sealer) GenerateWinningPoSt(ctx context.Context, minerID abi.ActorID, sectorInfo []proof.ExtendedSectorInfo, randomness abi.PoStRandomness) ([]proof.PoStProof, error) { randomness[31] &= 0x3f - privsectors, skipped, done, err := sb.pubSectorToPriv(ctx, minerID, sectorInfo, nil, abi.RegisteredSealProof.RegisteredWinningPoStProof) // TODO: FAULTS? + privsectors, skipped, done, err := sb.pubExtendedSectorToPriv(ctx, minerID, sectorInfo, nil, abi.RegisteredSealProof.RegisteredWinningPoStProof) // TODO: FAULTS? if err != nil { return nil, err } @@ -32,12 +33,13 @@ func (sb *Sealer) GenerateWinningPoSt(ctx context.Context, minerID abi.ActorID, return ffi.GenerateWinningPoSt(minerID, privsectors, randomness) } -func (sb *Sealer) GenerateWindowPoSt(ctx context.Context, minerID abi.ActorID, sectorInfo []proof5.SectorInfo, randomness abi.PoStRandomness) ([]proof5.PoStProof, []abi.SectorID, error) { +func (sb *Sealer) GenerateWindowPoSt(ctx context.Context, minerID abi.ActorID, sectorInfo []proof.ExtendedSectorInfo, randomness abi.PoStRandomness) ([]proof.PoStProof, []abi.SectorID, error) { randomness[31] &= 0x3f - privsectors, skipped, done, err := sb.pubSectorToPriv(ctx, minerID, sectorInfo, nil, abi.RegisteredSealProof.RegisteredWindowPoStProof) + privsectors, skipped, done, err := sb.pubExtendedSectorToPriv(ctx, minerID, sectorInfo, nil, abi.RegisteredSealProof.RegisteredWindowPoStProof) if err != nil { return nil, nil, xerrors.Errorf("gathering sector info: %w", err) } + defer done() if len(skipped) > 0 { @@ -53,11 +55,10 @@ func (sb *Sealer) GenerateWindowPoSt(ctx context.Context, minerID abi.ActorID, s Number: f, }) } - return proof, faultyIDs, err } -func (sb *Sealer) pubSectorToPriv(ctx context.Context, mid abi.ActorID, sectorInfo []proof5.SectorInfo, faults []abi.SectorNumber, rpt func(abi.RegisteredSealProof) (abi.RegisteredPoStProof, error)) (ffi.SortedPrivateSectorInfo, []abi.SectorID, func(), error) { +func (sb *Sealer) pubExtendedSectorToPriv(ctx context.Context, mid abi.ActorID, sectorInfo []proof.ExtendedSectorInfo, faults []abi.SectorNumber, rpt func(abi.RegisteredSealProof) (abi.RegisteredPoStProof, error)) (ffi.SortedPrivateSectorInfo, []abi.SectorID, func(), error) { fmap := map[abi.SectorNumber]struct{}{} for _, fault := range faults { fmap[fault] = struct{}{} @@ -81,14 +82,32 @@ func (sb *Sealer) pubSectorToPriv(ctx context.Context, mid abi.ActorID, sectorIn ID: abi.SectorID{Miner: mid, Number: s.SectorNumber}, ProofType: s.SealProof, } - - paths, d, err := sb.sectors.AcquireSector(ctx, sid, storiface.FTCache|storiface.FTSealed, 0, storiface.PathStorage) - if err != nil { - log.Warnw("failed to acquire sector, skipping", "sector", sid.ID, "error", err) - skipped = append(skipped, sid.ID) - continue + proveUpdate := s.SectorKey != nil + var cache string + var sealed string + if proveUpdate { + log.Debugf("Posting over updated sector for sector id: %d", s.SectorNumber) + paths, d, err := sb.sectors.AcquireSector(ctx, sid, storiface.FTUpdateCache|storiface.FTUpdate, 0, storiface.PathStorage) + if err != nil { + log.Warnw("failed to acquire FTUpdateCache and FTUpdate of sector, skipping", "sector", sid.ID, "error", err) + skipped = append(skipped, sid.ID) + continue + } + doneFuncs = append(doneFuncs, d) + cache = paths.UpdateCache + sealed = paths.Update + } else { + log.Debugf("Posting over sector key sector for sector id: %d", s.SectorNumber) + paths, d, err := sb.sectors.AcquireSector(ctx, sid, storiface.FTCache|storiface.FTSealed, 0, storiface.PathStorage) + if err != nil { + log.Warnw("failed to acquire FTCache and FTSealed of sector, skipping", "sector", sid.ID, "error", err) + skipped = append(skipped, sid.ID) + continue + } + doneFuncs = append(doneFuncs, d) + cache = paths.Cache + sealed = paths.Sealed } - doneFuncs = append(doneFuncs, d) postProofType, err := rpt(s.SealProof) if err != nil { @@ -96,11 +115,16 @@ func (sb *Sealer) pubSectorToPriv(ctx context.Context, mid abi.ActorID, sectorIn return ffi.SortedPrivateSectorInfo{}, nil, nil, xerrors.Errorf("acquiring registered PoSt proof from sector info %+v: %w", s, err) } + ffiInfo := ffiproof.SectorInfo{ + SealProof: s.SealProof, + SectorNumber: s.SectorNumber, + SealedCID: s.SealedCID, + } out = append(out, ffi.PrivateSectorInfo{ - CacheDirPath: paths.Cache, + CacheDirPath: cache, PoStProofType: postProofType, - SealedSectorPath: paths.Sealed, - SectorInfo: s, + SealedSectorPath: sealed, + SectorInfo: ffiInfo, }) } @@ -113,19 +137,19 @@ type proofVerifier struct{} var ProofVerifier = proofVerifier{} -func (proofVerifier) VerifySeal(info proof5.SealVerifyInfo) (bool, error) { +func (proofVerifier) VerifySeal(info proof.SealVerifyInfo) (bool, error) { return ffi.VerifySeal(info) } -func (proofVerifier) VerifyAggregateSeals(aggregate proof5.AggregateSealVerifyProofAndInfos) (bool, error) { +func (proofVerifier) VerifyAggregateSeals(aggregate proof.AggregateSealVerifyProofAndInfos) (bool, error) { return ffi.VerifyAggregateSeals(aggregate) } -func (proofVerifier) VerifyReplicaUpdate(update proof7.ReplicaUpdateInfo) (bool, error) { +func (proofVerifier) VerifyReplicaUpdate(update proof.ReplicaUpdateInfo) (bool, error) { return ffi.SectorUpdate.VerifyUpdateProof(update) } -func (proofVerifier) VerifyWinningPoSt(ctx context.Context, info proof5.WinningPoStVerifyInfo) (bool, error) { +func (proofVerifier) VerifyWinningPoSt(ctx context.Context, info proof.WinningPoStVerifyInfo, poStEpoch abi.ChainEpoch, version network.Version) (bool, error) { info.Randomness[31] &= 0x3f _, span := trace.StartSpan(ctx, "VerifyWinningPoSt") defer span.End() @@ -133,7 +157,7 @@ func (proofVerifier) VerifyWinningPoSt(ctx context.Context, info proof5.WinningP return ffi.VerifyWinningPoSt(info) } -func (proofVerifier) VerifyWindowPoSt(ctx context.Context, info proof5.WindowPoStVerifyInfo) (bool, error) { +func (proofVerifier) VerifyWindowPoSt(ctx context.Context, info proof.WindowPoStVerifyInfo) (bool, error) { info.Randomness[31] &= 0x3f _, span := trace.StartSpan(ctx, "VerifyWindowPoSt") defer span.End() diff --git a/extern/sector-storage/manager.go b/extern/sector-storage/manager.go index 748681544dc..ecabf0398d4 100644 --- a/extern/sector-storage/manager.go +++ b/extern/sector-storage/manager.go @@ -98,11 +98,13 @@ type SealerConfig struct { ParallelFetchLimit int // Local worker config - AllowAddPiece bool - AllowPreCommit1 bool - AllowPreCommit2 bool - AllowCommit bool - AllowUnseal bool + AllowAddPiece bool + AllowPreCommit1 bool + AllowPreCommit2 bool + AllowCommit bool + AllowUnseal bool + AllowReplicaUpdate bool + AllowProveReplicaUpdate2 bool // ResourceFiltering instructs the system which resource filtering strategy // to use when evaluating tasks against this worker. An empty value defaults @@ -144,7 +146,7 @@ func New(ctx context.Context, lstor *stores.Local, stor *stores.Remote, ls store go m.sched.runSched() localTasks := []sealtasks.TaskType{ - sealtasks.TTCommit1, sealtasks.TTFinalize, sealtasks.TTFetch, + sealtasks.TTCommit1, sealtasks.TTProveReplicaUpdate1, sealtasks.TTFinalize, sealtasks.TTFetch, } if sc.AllowAddPiece { localTasks = append(localTasks, sealtasks.TTAddPiece) @@ -161,6 +163,12 @@ func New(ctx context.Context, lstor *stores.Local, stor *stores.Remote, ls store if sc.AllowUnseal { localTasks = append(localTasks, sealtasks.TTUnseal) } + if sc.AllowReplicaUpdate { + localTasks = append(localTasks, sealtasks.TTReplicaUpdate) + } + if sc.AllowProveReplicaUpdate2 { + localTasks = append(localTasks, sealtasks.TTProveReplicaUpdate2) + } wcfg := WorkerConfig{ IgnoreResourceFiltering: sc.ResourceFiltering == ResourceFilteringDisabled, @@ -584,6 +592,23 @@ func (m *Manager) ReleaseSectorKey(ctx context.Context, sector storage.SectorRef return m.storage.Remove(ctx, sector.ID, storiface.FTSealed, true, nil) } +func (m *Manager) ReleaseReplicaUpgrade(ctx context.Context, sector storage.SectorRef) error { + ctx, cancel := context.WithCancel(ctx) + defer cancel() + + if err := m.index.StorageLock(ctx, sector.ID, storiface.FTNone, storiface.FTUpdateCache|storiface.FTUpdate); err != nil { + return xerrors.Errorf("acquiring sector lock: %w", err) + } + + if err := m.storage.Remove(ctx, sector.ID, storiface.FTUpdateCache, true, nil); err != nil { + return xerrors.Errorf("removing update cache: %w", err) + } + if err := m.storage.Remove(ctx, sector.ID, storiface.FTUpdate, true, nil); err != nil { + return xerrors.Errorf("removing update: %w", err) + } + return nil +} + func (m *Manager) GenerateSectorKeyFromData(ctx context.Context, sector storage.SectorRef, commD cid.Cid) error { ctx, cancel := context.WithCancel(ctx) @@ -666,7 +691,7 @@ func (m *Manager) Remove(ctx context.Context, sector storage.SectorRef) error { func (m *Manager) ReplicaUpdate(ctx context.Context, sector storage.SectorRef, pieces []abi.PieceInfo) (out storage.ReplicaUpdateOut, err error) { ctx, cancel := context.WithCancel(ctx) defer cancel() - + log.Errorf("manager is doing replica update") wk, wait, cancel, err := m.getWork(ctx, sealtasks.TTReplicaUpdate, sector, pieces) if err != nil { return storage.ReplicaUpdateOut{}, xerrors.Errorf("getWork: %w", err) @@ -677,7 +702,7 @@ func (m *Manager) ReplicaUpdate(ctx context.Context, sector storage.SectorRef, p waitRes := func() { p, werr := m.waitWork(ctx, wk) if werr != nil { - waitErr = werr + waitErr = xerrors.Errorf("waitWork: %w", werr) return } if p != nil { @@ -697,17 +722,17 @@ func (m *Manager) ReplicaUpdate(ctx context.Context, sector storage.SectorRef, p selector := newAllocSelector(m.index, storiface.FTUpdate|storiface.FTUpdateCache, storiface.PathSealing) err = m.sched.Schedule(ctx, sector, sealtasks.TTReplicaUpdate, selector, m.schedFetch(sector, storiface.FTSealed, storiface.PathSealing, storiface.AcquireCopy), func(ctx context.Context, w Worker) error { - + log.Errorf("scheduled work for replica update") err := m.startWork(ctx, w, wk)(w.ReplicaUpdate(ctx, sector, pieces)) if err != nil { - return err + return xerrors.Errorf("startWork: %w", err) } waitRes() return nil }) if err != nil { - return storage.ReplicaUpdateOut{}, err + return storage.ReplicaUpdateOut{}, xerrors.Errorf("Schedule: %w", err) } return out, waitErr } diff --git a/extern/sector-storage/mock/mock.go b/extern/sector-storage/mock/mock.go index ead4ebe26d8..7ef7800877b 100644 --- a/extern/sector-storage/mock/mock.go +++ b/extern/sector-storage/mock/mock.go @@ -10,14 +10,13 @@ import ( "math/rand" "sync" - proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" - - proof5 "github.com/filecoin-project/specs-actors/v5/actors/runtime/proof" + "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" "github.com/filecoin-project/dagstore/mount" ffiwrapper2 "github.com/filecoin-project/go-commp-utils/ffiwrapper" commcid "github.com/filecoin-project/go-fil-commcid" "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/specs-storage/storage" "github.com/ipfs/go-cid" logging "github.com/ipfs/go-log/v2" @@ -39,7 +38,7 @@ type SectorMgr struct { } type mockVerifProver struct { - aggregates map[string]proof5.AggregateSealVerifyProofAndInfos // used for logging bad verifies + aggregates map[string]proof.AggregateSealVerifyProofAndInfos // used for logging bad verifies } func NewMockSectorMgr(genesisSectors []abi.SectorID) *SectorMgr { @@ -336,14 +335,23 @@ func AddOpFinish(ctx context.Context) (context.Context, func()) { } } -func (mgr *SectorMgr) GenerateWinningPoSt(ctx context.Context, minerID abi.ActorID, sectorInfo []proof5.SectorInfo, randomness abi.PoStRandomness) ([]proof5.PoStProof, error) { +func (mgr *SectorMgr) GenerateWinningPoSt(ctx context.Context, minerID abi.ActorID, xSectorInfo []proof.ExtendedSectorInfo, randomness abi.PoStRandomness) ([]proof.PoStProof, error) { mgr.lk.Lock() defer mgr.lk.Unlock() + sectorInfo := make([]proof.SectorInfo, len(xSectorInfo)) + for i, xssi := range xSectorInfo { + sectorInfo[i] = proof.SectorInfo{ + SealProof: xssi.SealProof, + SectorNumber: xssi.SectorNumber, + SealedCID: xssi.SealedCID, + } + } + return generateFakePoSt(sectorInfo, abi.RegisteredSealProof.RegisteredWinningPoStProof, randomness), nil } -func (mgr *SectorMgr) GenerateWindowPoSt(ctx context.Context, minerID abi.ActorID, sectorInfo []proof5.SectorInfo, randomness abi.PoStRandomness) ([]proof5.PoStProof, []abi.SectorID, error) { +func (mgr *SectorMgr) GenerateWindowPoSt(ctx context.Context, minerID abi.ActorID, xSectorInfo []proof.ExtendedSectorInfo, randomness abi.PoStRandomness) ([]proof.PoStProof, []abi.SectorID, error) { mgr.lk.Lock() defer mgr.lk.Unlock() @@ -351,22 +359,22 @@ func (mgr *SectorMgr) GenerateWindowPoSt(ctx context.Context, minerID abi.ActorI return nil, nil, xerrors.Errorf("failed to post (mock)") } - si := make([]proof5.SectorInfo, 0, len(sectorInfo)) + si := make([]proof.ExtendedSectorInfo, 0, len(xSectorInfo)) var skipped []abi.SectorID var err error - for _, info := range sectorInfo { + for _, xsi := range xSectorInfo { sid := abi.SectorID{ Miner: minerID, - Number: info.SectorNumber, + Number: xsi.SectorNumber, } _, found := mgr.sectors[sid] if found && !mgr.sectors[sid].failed && !mgr.sectors[sid].corrupted { - si = append(si, info) + si = append(si, xsi) } else { skipped = append(skipped, sid) err = xerrors.Errorf("skipped some sectors") @@ -377,10 +385,19 @@ func (mgr *SectorMgr) GenerateWindowPoSt(ctx context.Context, minerID abi.ActorI return nil, skipped, err } - return generateFakePoSt(si, abi.RegisteredSealProof.RegisteredWindowPoStProof, randomness), skipped, nil + sectorInfo := make([]proof.SectorInfo, len(si)) + for i, xssi := range si { + sectorInfo[i] = proof.SectorInfo{ + SealProof: xssi.SealProof, + SectorNumber: xssi.SectorNumber, + SealedCID: xssi.SealedCID, + } + } + + return generateFakePoSt(sectorInfo, abi.RegisteredSealProof.RegisteredWindowPoStProof, randomness), skipped, nil } -func generateFakePoStProof(sectorInfo []proof5.SectorInfo, randomness abi.PoStRandomness) []byte { +func generateFakePoStProof(sectorInfo []proof.SectorInfo, randomness abi.PoStRandomness) []byte { randomness[31] &= 0x3f hasher := sha256.New() @@ -395,13 +412,13 @@ func generateFakePoStProof(sectorInfo []proof5.SectorInfo, randomness abi.PoStRa } -func generateFakePoSt(sectorInfo []proof5.SectorInfo, rpt func(abi.RegisteredSealProof) (abi.RegisteredPoStProof, error), randomness abi.PoStRandomness) []proof5.PoStProof { +func generateFakePoSt(sectorInfo []proof.SectorInfo, rpt func(abi.RegisteredSealProof) (abi.RegisteredPoStProof, error), randomness abi.PoStRandomness) []proof.PoStProof { wp, err := rpt(sectorInfo[0].SealProof) if err != nil { panic(err) } - return []proof5.PoStProof{ + return []proof.PoStProof{ { PoStProof: wp, ProofBytes: generateFakePoStProof(sectorInfo, randomness), @@ -465,6 +482,14 @@ func (mgr *SectorMgr) ReleaseUnsealed(ctx context.Context, sector storage.Sector return nil } +func (mgr *SectorMgr) ReleaseReplicaUpgrade(ctx context.Context, sector storage.SectorRef) error { + return nil +} + +func (mgr *SectorMgr) ReleaseSectorKey(ctx context.Context, sector storage.SectorRef) error { + return nil +} + func (mgr *SectorMgr) Remove(ctx context.Context, sector storage.SectorRef) error { mgr.lk.Lock() defer mgr.lk.Unlock() @@ -553,7 +578,7 @@ func (mgr *SectorMgr) ReturnGenerateSectorKeyFromData(ctx context.Context, callI panic("not supported") } -func (m mockVerifProver) VerifySeal(svi proof5.SealVerifyInfo) (bool, error) { +func (m mockVerifProver) VerifySeal(svi proof.SealVerifyInfo) (bool, error) { plen, err := svi.SealProof.ProofSize() if err != nil { return false, err @@ -574,7 +599,7 @@ func (m mockVerifProver) VerifySeal(svi proof5.SealVerifyInfo) (bool, error) { return true, nil } -func (m mockVerifProver) VerifyAggregateSeals(aggregate proof5.AggregateSealVerifyProofAndInfos) (bool, error) { +func (m mockVerifProver) VerifyAggregateSeals(aggregate proof.AggregateSealVerifyProofAndInfos) (bool, error) { out := make([]byte, m.aggLen(len(aggregate.Infos))) for pi, svi := range aggregate.Infos { for i := 0; i < 32; i++ { @@ -600,11 +625,11 @@ func (m mockVerifProver) VerifyAggregateSeals(aggregate proof5.AggregateSealVeri return ok, nil } -func (m mockVerifProver) VerifyReplicaUpdate(update proof7.ReplicaUpdateInfo) (bool, error) { +func (m mockVerifProver) VerifyReplicaUpdate(update proof.ReplicaUpdateInfo) (bool, error) { return true, nil } -func (m mockVerifProver) AggregateSealProofs(aggregateInfo proof5.AggregateSealVerifyProofAndInfos, proofs [][]byte) ([]byte, error) { +func (m mockVerifProver) AggregateSealProofs(aggregateInfo proof.AggregateSealVerifyProofAndInfos, proofs [][]byte) ([]byte, error) { out := make([]byte, m.aggLen(len(aggregateInfo.Infos))) // todo: figure out more real length for pi, proof := range proofs { for i := range proof[:32] { @@ -646,12 +671,12 @@ func (m mockVerifProver) aggLen(nproofs int) int { } } -func (m mockVerifProver) VerifyWinningPoSt(ctx context.Context, info proof5.WinningPoStVerifyInfo) (bool, error) { +func (m mockVerifProver) VerifyWinningPoSt(ctx context.Context, info proof.WinningPoStVerifyInfo, poStEpoch abi.ChainEpoch, nv network.Version) (bool, error) { info.Randomness[31] &= 0x3f return true, nil } -func (m mockVerifProver) VerifyWindowPoSt(ctx context.Context, info proof5.WindowPoStVerifyInfo) (bool, error) { +func (m mockVerifProver) VerifyWindowPoSt(ctx context.Context, info proof.WindowPoStVerifyInfo) (bool, error) { if len(info.Proofs) != 1 { return false, xerrors.Errorf("expected 1 proof entry") } @@ -674,7 +699,7 @@ func (m mockVerifProver) GenerateWinningPoStSectorChallenge(ctx context.Context, } var MockVerifier = mockVerifProver{ - aggregates: map[string]proof5.AggregateSealVerifyProofAndInfos{}, + aggregates: map[string]proof.AggregateSealVerifyProofAndInfos{}, } var MockProver = MockVerifier diff --git a/extern/sector-storage/teststorage_test.go b/extern/sector-storage/teststorage_test.go index 9fdb3a913dd..cb15184be04 100644 --- a/extern/sector-storage/teststorage_test.go +++ b/extern/sector-storage/teststorage_test.go @@ -7,7 +7,7 @@ import ( "github.com/ipfs/go-cid" "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/specs-actors/actors/runtime/proof" + "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" "github.com/filecoin-project/specs-storage/storage" "github.com/filecoin-project/lotus/extern/sector-storage/ffiwrapper" @@ -23,11 +23,11 @@ type testExec struct { apch chan chan apres } -func (t *testExec) GenerateWinningPoSt(ctx context.Context, minerID abi.ActorID, sectorInfo []proof.SectorInfo, randomness abi.PoStRandomness) ([]proof.PoStProof, error) { +func (t *testExec) GenerateWinningPoSt(ctx context.Context, minerID abi.ActorID, sectorInfo []proof.ExtendedSectorInfo, randomness abi.PoStRandomness) ([]proof.PoStProof, error) { panic("implement me") } -func (t *testExec) GenerateWindowPoSt(ctx context.Context, minerID abi.ActorID, sectorInfo []proof.SectorInfo, randomness abi.PoStRandomness) (proof []proof.PoStProof, skipped []abi.SectorID, err error) { +func (t *testExec) GenerateWindowPoSt(ctx context.Context, minerID abi.ActorID, sectorInfo []proof.ExtendedSectorInfo, randomness abi.PoStRandomness) (proof []proof.PoStProof, skipped []abi.SectorID, err error) { panic("implement me") } @@ -59,6 +59,14 @@ func (t *testExec) ReleaseSealed(ctx context.Context, sector storage.SectorRef) panic("implement me") } +func (t *testExec) ReleaseSectorKey(ctx context.Context, sector storage.SectorRef) error { + panic("implement me") +} + +func (t *testExec) ReleaseReplicaUpgrade(ctx context.Context, sector storage.SectorRef) error { + panic("implement me") +} + func (t *testExec) Remove(ctx context.Context, sector storage.SectorRef) error { panic("implement me") } diff --git a/extern/storage-sealing/cbor_gen.go b/extern/storage-sealing/cbor_gen.go index 1dfaf54a5de..c1e2b08fa4c 100644 --- a/extern/storage-sealing/cbor_gen.go +++ b/extern/storage-sealing/cbor_gen.go @@ -143,7 +143,7 @@ func (t *SectorInfo) MarshalCBOR(w io.Writer) error { _, err := w.Write(cbg.CborNull) return err } - if _, err := w.Write([]byte{184, 26}); err != nil { + if _, err := w.Write([]byte{184, 32}); err != nil { return err } @@ -573,6 +573,137 @@ func (t *SectorInfo) MarshalCBOR(w io.Writer) error { return err } + // t.CCUpdate (bool) (bool) + if len("CCUpdate") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"CCUpdate\" was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajTextString, uint64(len("CCUpdate"))); err != nil { + return err + } + if _, err := io.WriteString(w, string("CCUpdate")); err != nil { + return err + } + + if err := cbg.WriteBool(w, t.CCUpdate); err != nil { + return err + } + + // t.CCPieces ([]sealing.Piece) (slice) + if len("CCPieces") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"CCPieces\" was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajTextString, uint64(len("CCPieces"))); err != nil { + return err + } + if _, err := io.WriteString(w, string("CCPieces")); err != nil { + return err + } + + if len(t.CCPieces) > cbg.MaxLength { + return xerrors.Errorf("Slice value in field t.CCPieces was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajArray, uint64(len(t.CCPieces))); err != nil { + return err + } + for _, v := range t.CCPieces { + if err := v.MarshalCBOR(w); err != nil { + return err + } + } + + // t.UpdateSealed (cid.Cid) (struct) + if len("UpdateSealed") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"UpdateSealed\" was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajTextString, uint64(len("UpdateSealed"))); err != nil { + return err + } + if _, err := io.WriteString(w, string("UpdateSealed")); err != nil { + return err + } + + if t.UpdateSealed == nil { + if _, err := w.Write(cbg.CborNull); err != nil { + return err + } + } else { + if err := cbg.WriteCidBuf(scratch, w, *t.UpdateSealed); err != nil { + return xerrors.Errorf("failed to write cid field t.UpdateSealed: %w", err) + } + } + + // t.UpdateUnsealed (cid.Cid) (struct) + if len("UpdateUnsealed") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"UpdateUnsealed\" was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajTextString, uint64(len("UpdateUnsealed"))); err != nil { + return err + } + if _, err := io.WriteString(w, string("UpdateUnsealed")); err != nil { + return err + } + + if t.UpdateUnsealed == nil { + if _, err := w.Write(cbg.CborNull); err != nil { + return err + } + } else { + if err := cbg.WriteCidBuf(scratch, w, *t.UpdateUnsealed); err != nil { + return xerrors.Errorf("failed to write cid field t.UpdateUnsealed: %w", err) + } + } + + // t.ReplicaUpdateProof (storage.ReplicaUpdateProof) (slice) + if len("ReplicaUpdateProof") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"ReplicaUpdateProof\" was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajTextString, uint64(len("ReplicaUpdateProof"))); err != nil { + return err + } + if _, err := io.WriteString(w, string("ReplicaUpdateProof")); err != nil { + return err + } + + if len(t.ReplicaUpdateProof) > cbg.ByteArrayMaxLen { + return xerrors.Errorf("Byte array in field t.ReplicaUpdateProof was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajByteString, uint64(len(t.ReplicaUpdateProof))); err != nil { + return err + } + + if _, err := w.Write(t.ReplicaUpdateProof[:]); err != nil { + return err + } + + // t.ReplicaUpdateMessage (cid.Cid) (struct) + if len("ReplicaUpdateMessage") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"ReplicaUpdateMessage\" was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajTextString, uint64(len("ReplicaUpdateMessage"))); err != nil { + return err + } + if _, err := io.WriteString(w, string("ReplicaUpdateMessage")); err != nil { + return err + } + + if t.ReplicaUpdateMessage == nil { + if _, err := w.Write(cbg.CborNull); err != nil { + return err + } + } else { + if err := cbg.WriteCidBuf(scratch, w, *t.ReplicaUpdateMessage); err != nil { + return xerrors.Errorf("failed to write cid field t.ReplicaUpdateMessage: %w", err) + } + } + // t.FaultReportMsg (cid.Cid) (struct) if len("FaultReportMsg") > cbg.MaxLength { return xerrors.Errorf("Value in field \"FaultReportMsg\" was too long") @@ -1166,6 +1297,145 @@ func (t *SectorInfo) UnmarshalCBOR(r io.Reader) error { } t.InvalidProofs = uint64(extra) + } + // t.CCUpdate (bool) (bool) + case "CCUpdate": + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajOther { + return fmt.Errorf("booleans must be major type 7") + } + switch extra { + case 20: + t.CCUpdate = false + case 21: + t.CCUpdate = true + default: + return fmt.Errorf("booleans are either major type 7, value 20 or 21 (got %d)", extra) + } + // t.CCPieces ([]sealing.Piece) (slice) + case "CCPieces": + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + + if extra > cbg.MaxLength { + return fmt.Errorf("t.CCPieces: array too large (%d)", extra) + } + + if maj != cbg.MajArray { + return fmt.Errorf("expected cbor array") + } + + if extra > 0 { + t.CCPieces = make([]Piece, extra) + } + + for i := 0; i < int(extra); i++ { + + var v Piece + if err := v.UnmarshalCBOR(br); err != nil { + return err + } + + t.CCPieces[i] = v + } + + // t.UpdateSealed (cid.Cid) (struct) + case "UpdateSealed": + + { + + b, err := br.ReadByte() + if err != nil { + return err + } + if b != cbg.CborNull[0] { + if err := br.UnreadByte(); err != nil { + return err + } + + c, err := cbg.ReadCid(br) + if err != nil { + return xerrors.Errorf("failed to read cid field t.UpdateSealed: %w", err) + } + + t.UpdateSealed = &c + } + + } + // t.UpdateUnsealed (cid.Cid) (struct) + case "UpdateUnsealed": + + { + + b, err := br.ReadByte() + if err != nil { + return err + } + if b != cbg.CborNull[0] { + if err := br.UnreadByte(); err != nil { + return err + } + + c, err := cbg.ReadCid(br) + if err != nil { + return xerrors.Errorf("failed to read cid field t.UpdateUnsealed: %w", err) + } + + t.UpdateUnsealed = &c + } + + } + // t.ReplicaUpdateProof (storage.ReplicaUpdateProof) (slice) + case "ReplicaUpdateProof": + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + + if extra > cbg.ByteArrayMaxLen { + return fmt.Errorf("t.ReplicaUpdateProof: byte array too large (%d)", extra) + } + if maj != cbg.MajByteString { + return fmt.Errorf("expected byte array") + } + + if extra > 0 { + t.ReplicaUpdateProof = make([]uint8, extra) + } + + if _, err := io.ReadFull(br, t.ReplicaUpdateProof[:]); err != nil { + return err + } + // t.ReplicaUpdateMessage (cid.Cid) (struct) + case "ReplicaUpdateMessage": + + { + + b, err := br.ReadByte() + if err != nil { + return err + } + if b != cbg.CborNull[0] { + if err := br.UnreadByte(); err != nil { + return err + } + + c, err := cbg.ReadCid(br) + if err != nil { + return xerrors.Errorf("failed to read cid field t.ReplicaUpdateMessage: %w", err) + } + + t.ReplicaUpdateMessage = &c + } + } // t.FaultReportMsg (cid.Cid) (struct) case "FaultReportMsg": diff --git a/extern/storage-sealing/checks.go b/extern/storage-sealing/checks.go index 74a791fcbef..42425e78243 100644 --- a/extern/storage-sealing/checks.go +++ b/extern/storage-sealing/checks.go @@ -35,6 +35,9 @@ type ErrInvalidProof struct{ error } type ErrNoPrecommit struct{ error } type ErrCommitWaitFailed struct{ error } +type ErrBadRU struct{ error } +type ErrBadPR struct{ error } + func checkPieces(ctx context.Context, maddr address.Address, si SectorInfo, api SealingAPI) error { tok, height, err := api.ChainHead(ctx) if err != nil { @@ -187,3 +190,32 @@ func (m *Sealing) checkCommit(ctx context.Context, si SectorInfo, proof []byte, return nil } + +// check that sector info is good after running a replica update +func checkReplicaUpdate(ctx context.Context, maddr address.Address, si SectorInfo, tok TipSetToken, api SealingAPI) error { + + if err := checkPieces(ctx, maddr, si, api); err != nil { + return err + } + if !si.CCUpdate { + return xerrors.Errorf("replica update on sector not marked for update") + } + + commD, err := api.StateComputeDataCommitment(ctx, maddr, si.SectorType, si.dealIDs(), tok) + if err != nil { + return &ErrApi{xerrors.Errorf("calling StateComputeDataCommitment: %w", err)} + } + if si.UpdateUnsealed == nil || !commD.Equals(*si.UpdateUnsealed) { + return &ErrBadRU{xerrors.Errorf("on chain CommD differs from sector: %s != %s", commD, si.CommD)} + } + + if si.UpdateSealed == nil { + return &ErrBadRU{xerrors.Errorf("nil sealed cid")} + } + if si.ReplicaUpdateProof == nil { + return ErrBadPR{xerrors.Errorf("nil PR2 proof")} + } + + return nil + +} diff --git a/extern/storage-sealing/fsm.go b/extern/storage-sealing/fsm.go index 10bec7e0bd9..83874e907de 100644 --- a/extern/storage-sealing/fsm.go +++ b/extern/storage-sealing/fsm.go @@ -133,6 +133,44 @@ var fsmPlanners = map[SectorState]func(events []statemachine.Event, state *Secto on(SectorFinalizeFailed{}, FinalizeFailed), ), + // Snap deals + SnapDealsWaitDeals: planOne( + on(SectorAddPiece{}, SnapDealsAddPiece), + on(SectorStartPacking{}, SnapDealsPacking), + ), + SnapDealsAddPiece: planOne( + on(SectorPieceAdded{}, SnapDealsWaitDeals), + apply(SectorStartPacking{}), + apply(SectorAddPiece{}), + on(SectorAddPieceFailed{}, SnapDealsAddPieceFailed), + ), + SnapDealsPacking: planOne( + on(SectorPacked{}, UpdateReplica), + ), + UpdateReplica: planOne( + on(SectorReplicaUpdate{}, ProveReplicaUpdate), + on(SectorUpdateReplicaFailed{}, ReplicaUpdateFailed), + on(SectorDealsExpired{}, SnapDealsDealsExpired), + on(SectorInvalidDealIDs{}, SnapDealsRecoverDealIDs), + ), + ProveReplicaUpdate: planOne( + on(SectorProveReplicaUpdate{}, SubmitReplicaUpdate), + on(SectorProveReplicaUpdateFailed{}, ReplicaUpdateFailed), + on(SectorDealsExpired{}, SnapDealsDealsExpired), + on(SectorInvalidDealIDs{}, SnapDealsRecoverDealIDs), + ), + SubmitReplicaUpdate: planOne( + on(SectorReplicaUpdateSubmitted{}, ReplicaUpdateWait), + on(SectorSubmitReplicaUpdateFailed{}, ReplicaUpdateFailed), + ), + ReplicaUpdateWait: planOne( + on(SectorReplicaUpdateLanded{}, FinalizeReplicaUpdate), + on(SectorSubmitReplicaUpdateFailed{}, ReplicaUpdateFailed), + on(SectorAbortUpgrade{}, AbortUpgrade), + ), + FinalizeReplicaUpdate: planOne( + on(SectorFinalized{}, Proving), + ), // Sealing errors AddPieceFailed: planOne( @@ -188,11 +226,37 @@ var fsmPlanners = map[SectorState]func(events []statemachine.Event, state *Secto onReturning(SectorUpdateDealIDs{}), ), + // Snap Deals Errors + SnapDealsAddPieceFailed: planOne( + on(SectorRetryWaitDeals{}, SnapDealsWaitDeals), + apply(SectorStartPacking{}), + apply(SectorAddPiece{}), + ), + SnapDealsDealsExpired: planOne( + on(SectorAbortUpgrade{}, AbortUpgrade), + ), + SnapDealsRecoverDealIDs: planOne( + on(SectorUpdateDealIDs{}, SubmitReplicaUpdate), + on(SectorAbortUpgrade{}, AbortUpgrade), + ), + AbortUpgrade: planOneOrIgnore( + on(SectorRevertUpgradeToProving{}, Proving), + ), + ReplicaUpdateFailed: planOne( + on(SectorRetrySubmitReplicaUpdateWait{}, ReplicaUpdateWait), + on(SectorRetrySubmitReplicaUpdate{}, SubmitReplicaUpdate), + on(SectorRetryReplicaUpdate{}, UpdateReplica), + on(SectorRetryProveReplicaUpdate{}, ProveReplicaUpdate), + on(SectorInvalidDealIDs{}, SnapDealsRecoverDealIDs), + on(SectorDealsExpired{}, SnapDealsDealsExpired), + ), + // Post-seal Proving: planOne( on(SectorFaultReported{}, FaultReported), on(SectorFaulty{}, Faulty), + on(SectorStartCCUpdate{}, SnapDealsWaitDeals), ), Terminating: planOne( on(SectorTerminating{}, TerminateWait), @@ -209,7 +273,7 @@ var fsmPlanners = map[SectorState]func(events []statemachine.Event, state *Secto TerminateFailed: planOne( // SectorTerminating (global) ), - Removing: planOne( + Removing: planOneOrIgnore( on(SectorRemoved{}, Removed), on(SectorRemoveFailed{}, RemoveFailed), ), @@ -355,13 +419,6 @@ func (m *Sealing) plan(events []statemachine.Event, state *SectorInfo) (func(sta log.Errorw("update sector stats", "error", err) } - // todo: drop this, use Context iface everywhere - wrapCtx := func(f func(Context, SectorInfo) error) func(statemachine.Context, SectorInfo) error { - return func(ctx statemachine.Context, info SectorInfo) error { - return f(&ctx, info) - } - } - switch state.State { // Happy path case Empty: @@ -403,6 +460,24 @@ func (m *Sealing) plan(events []statemachine.Event, state *SectorInfo) (func(sta case FinalizeSector: return m.handleFinalizeSector, processed, nil + // Snap deals updates + case SnapDealsWaitDeals: + return m.handleWaitDeals, processed, nil + case SnapDealsAddPiece: + return m.handleAddPiece, processed, nil + case SnapDealsPacking: + return m.handlePacking, processed, nil + case UpdateReplica: + return m.handleReplicaUpdate, processed, nil + case ProveReplicaUpdate: + return m.handleProveReplicaUpdate, processed, nil + case SubmitReplicaUpdate: + return m.handleSubmitReplicaUpdate, processed, nil + case ReplicaUpdateWait: + return m.handleReplicaUpdateWait, processed, nil + case FinalizeReplicaUpdate: + return m.handleFinalizeReplicaUpdate, processed, nil + // Handled failure modes case AddPieceFailed: return m.handleAddPieceFailed, processed, nil @@ -426,7 +501,20 @@ func (m *Sealing) plan(events []statemachine.Event, state *SectorInfo) (func(sta case DealsExpired: return m.handleDealsExpired, processed, nil case RecoverDealIDs: - return wrapCtx(m.HandleRecoverDealIDs), processed, nil + return m.HandleRecoverDealIDs, processed, nil + + // Snap Deals failure modes + case SnapDealsAddPieceFailed: + return m.handleAddPieceFailed, processed, nil + + case SnapDealsDealsExpired: + return m.handleDealsExpiredSnapDeals, processed, nil + case SnapDealsRecoverDealIDs: + return m.handleSnapDealsRecoverDealIDs, processed, nil + case ReplicaUpdateFailed: + return m.handleSubmitReplicaUpdateFailed, processed, nil + case AbortUpgrade: + return m.handleAbortUpgrade, processed, nil // Post-seal case Proving: @@ -642,3 +730,16 @@ func planOne(ts ...func() (mut mutator, next func(*SectorInfo) (more bool, err e return uint64(len(events)), nil } } + +// planOne but ignores unhandled states without erroring, this prevents the need to handle all possible events creating +// error during forced override +func planOneOrIgnore(ts ...func() (mut mutator, next func(*SectorInfo) (more bool, err error))) func(events []statemachine.Event, state *SectorInfo) (uint64, error) { + f := planOne(ts...) + return func(events []statemachine.Event, state *SectorInfo) (uint64, error) { + cnt, err := f(events, state) + if err != nil { + log.Warnf("planOneOrIgnore: ignoring error from planOne: %s", err) + } + return cnt, nil + } +} diff --git a/extern/storage-sealing/fsm_events.go b/extern/storage-sealing/fsm_events.go index 650a817995e..395c4b94a74 100644 --- a/extern/storage-sealing/fsm_events.go +++ b/extern/storage-sealing/fsm_events.go @@ -295,6 +295,46 @@ type SectorFinalizeFailed struct{ error } func (evt SectorFinalizeFailed) FormatError(xerrors.Printer) (next error) { return evt.error } func (evt SectorFinalizeFailed) apply(*SectorInfo) {} +// Snap deals // CC update path + +type SectorStartCCUpdate struct{} + +func (evt SectorStartCCUpdate) apply(state *SectorInfo) { + state.CCUpdate = true + // Clear filler piece but remember in case of abort + state.CCPieces = state.Pieces + state.Pieces = nil +} + +type SectorReplicaUpdate struct { + Out storage.ReplicaUpdateOut +} + +func (evt SectorReplicaUpdate) apply(state *SectorInfo) { + state.UpdateSealed = &evt.Out.NewSealed + state.UpdateUnsealed = &evt.Out.NewUnsealed +} + +type SectorProveReplicaUpdate struct { + Proof storage.ReplicaUpdateProof +} + +func (evt SectorProveReplicaUpdate) apply(state *SectorInfo) { + state.ReplicaUpdateProof = evt.Proof +} + +type SectorReplicaUpdateSubmitted struct { + Message cid.Cid +} + +func (evt SectorReplicaUpdateSubmitted) apply(state *SectorInfo) { + state.ReplicaUpdateMessage = &evt.Message +} + +type SectorReplicaUpdateLanded struct{} + +func (evt SectorReplicaUpdateLanded) apply(state *SectorInfo) {} + // Failed state recovery type SectorRetrySealPreCommit1 struct{} @@ -351,6 +391,60 @@ func (evt SectorUpdateDealIDs) apply(state *SectorInfo) { } } +// Snap Deals failure and recovery + +type SectorRetryReplicaUpdate struct{} + +func (evt SectorRetryReplicaUpdate) apply(state *SectorInfo) {} + +type SectorRetryProveReplicaUpdate struct{} + +func (evt SectorRetryProveReplicaUpdate) apply(state *SectorInfo) {} + +type SectorUpdateReplicaFailed struct{ error } + +func (evt SectorUpdateReplicaFailed) FormatError(xerrors.Printer) (next error) { return evt.error } +func (evt SectorUpdateReplicaFailed) apply(state *SectorInfo) {} + +type SectorProveReplicaUpdateFailed struct{ error } + +func (evt SectorProveReplicaUpdateFailed) FormatError(xerrors.Printer) (next error) { + return evt.error +} +func (evt SectorProveReplicaUpdateFailed) apply(state *SectorInfo) {} + +type SectorAbortUpgrade struct{ error } + +func (evt SectorAbortUpgrade) apply(state *SectorInfo) {} +func (evt SectorAbortUpgrade) FormatError(xerrors.Printer) (next error) { + return evt.error +} + +type SectorRevertUpgradeToProving struct{} + +func (evt SectorRevertUpgradeToProving) apply(state *SectorInfo) { + // cleanup sector state so that it is back in proving + state.CCUpdate = false + state.UpdateSealed = nil + state.UpdateUnsealed = nil + state.ReplicaUpdateProof = nil + state.ReplicaUpdateMessage = nil + state.Pieces = state.CCPieces + state.CCPieces = nil +} + +type SectorRetrySubmitReplicaUpdateWait struct{} + +func (evt SectorRetrySubmitReplicaUpdateWait) apply(state *SectorInfo) {} + +type SectorRetrySubmitReplicaUpdate struct{} + +func (evt SectorRetrySubmitReplicaUpdate) apply(state *SectorInfo) {} + +type SectorSubmitReplicaUpdateFailed struct{} + +func (evt SectorSubmitReplicaUpdateFailed) apply(state *SectorInfo) {} + // Faults type SectorFaulty struct{} diff --git a/extern/storage-sealing/input.go b/extern/storage-sealing/input.go index 60c3a79e288..f3259f0cced 100644 --- a/extern/storage-sealing/input.go +++ b/extern/storage-sealing/input.go @@ -59,6 +59,8 @@ func (m *Sealing) handleWaitDeals(ctx statemachine.Context, sector SectorInfo) e return ctx.Send(SectorAddPiece{}) }, + number: sector.SectorNumber, + ccUpdate: sector.CCUpdate, } } else { // make sure we're only accounting for pieces which were correctly added @@ -329,6 +331,17 @@ func (m *Sealing) SectorAddPieceToAny(ctx context.Context, size abi.UnpaddedPiec return api.SectorOffset{Sector: res.sn, Offset: res.offset.Padded()}, res.err } +func (m *Sealing) MatchPendingPiecesToOpenSectors(ctx context.Context) error { + sp, err := m.currentSealProof(ctx) + if err != nil { + return xerrors.Errorf("failed to get current seal proof: %w", err) + } + log.Debug("pieces to sector matching waiting for lock") + m.inputLk.Lock() + defer m.inputLk.Unlock() + return m.updateInput(ctx, sp) +} + // called with m.inputLk func (m *Sealing) updateInput(ctx context.Context, sp abi.RegisteredSealProof) error { ssize, err := sp.SectorSize() @@ -356,8 +369,33 @@ func (m *Sealing) updateInput(ctx context.Context, sp abi.RegisteredSealProof) e toAssign[proposalCid] = struct{}{} + memo := make(map[abi.SectorNumber]abi.ChainEpoch) + expF := func(sn abi.SectorNumber) (abi.ChainEpoch, error) { + if exp, ok := memo[sn]; ok { + return exp, nil + } + onChainInfo, err := m.Api.StateSectorGetInfo(ctx, m.maddr, sn, TipSetToken{}) + if err != nil { + return 0, err + } + memo[sn] = onChainInfo.Expiration + return onChainInfo.Expiration, nil + } + for id, sector := range m.openSectors { 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) + if err != nil { + log.Errorf("failed to check expiration for cc Update sector %d", sector.number) + continue + } + if !ok { + exp, _ := expF(sector.number) + log.Infof("CC update sector %d cannot fit deal, expiration %d before deal end epoch %d", id, exp, piece.deal.DealProposal.EndEpoch) + continue + } if piece.size <= avail { // (note: if we have enough space for the piece, we also have enough space for inter-piece padding) matches = append(matches, match{ @@ -416,6 +454,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.tryCreateDealSector(ctx, sp); err != nil { log.Errorw("Failed to create a new sector for deals", "error", err) } diff --git a/extern/storage-sealing/mocks/api.go b/extern/storage-sealing/mocks/api.go index cc8561dc793..95c222ecdc4 100644 --- a/extern/storage-sealing/mocks/api.go +++ b/extern/storage-sealing/mocks/api.go @@ -213,6 +213,21 @@ func (mr *MockSealingAPIMockRecorder) StateMarketStorageDealProposal(arg0, arg1, return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMarketStorageDealProposal", reflect.TypeOf((*MockSealingAPI)(nil).StateMarketStorageDealProposal), arg0, arg1, arg2) } +// StateMinerActiveSectors mocks base method. +func (m *MockSealingAPI) StateMinerActiveSectors(arg0 context.Context, arg1 address.Address, arg2 sealing.TipSetToken) ([]*miner.SectorOnChainInfo, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateMinerActiveSectors", arg0, arg1, arg2) + ret0, _ := ret[0].([]*miner.SectorOnChainInfo) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateMinerActiveSectors indicates an expected call of StateMinerActiveSectors. +func (mr *MockSealingAPIMockRecorder) StateMinerActiveSectors(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMinerActiveSectors", reflect.TypeOf((*MockSealingAPI)(nil).StateMinerActiveSectors), arg0, arg1, arg2) +} + // StateMinerAvailableBalance mocks base method. func (m *MockSealingAPI) StateMinerAvailableBalance(arg0 context.Context, arg1 address.Address, arg2 sealing.TipSetToken) (big.Int, error) { m.ctrl.T.Helper() diff --git a/extern/storage-sealing/sealing.go b/extern/storage-sealing/sealing.go index 583bed05260..81f6b38e93c 100644 --- a/extern/storage-sealing/sealing.go +++ b/extern/storage-sealing/sealing.go @@ -63,6 +63,7 @@ type SealingAPI interface { StateMinerInfo(context.Context, address.Address, TipSetToken) (miner.MinerInfo, error) StateMinerAvailableBalance(context.Context, address.Address, TipSetToken) (big.Int, error) StateMinerSectorAllocated(context.Context, address.Address, abi.SectorNumber, TipSetToken) (bool, error) + StateMinerActiveSectors(context.Context, address.Address, TipSetToken) ([]*miner.SectorOnChainInfo, error) StateMarketStorageDeal(context.Context, abi.DealID, TipSetToken) (*api.MarketDeal, error) StateMarketStorageDealProposal(context.Context, abi.DealID, TipSetToken) (market.DealProposal, error) StateNetworkVersion(ctx context.Context, tok TipSetToken) (network.Version, error) @@ -121,11 +122,24 @@ type Sealing struct { } type openSector struct { - used abi.UnpaddedPieceSize // change to bitfield/rle when AddPiece gains offset support to better fill sectors + used abi.UnpaddedPieceSize // change to bitfield/rle when AddPiece gains offset support to better fill sectors + number abi.SectorNumber + ccUpdate bool maybeAccept func(cid.Cid) error // called with inputLk } +func (o *openSector) dealFitsInLifetime(dealEnd abi.ChainEpoch, expF func(sn abi.SectorNumber) (abi.ChainEpoch, error)) (bool, error) { + if !o.ccUpdate { + return true, nil + } + expiration, err := expF(o.number) + if err != nil { + return false, err + } + return expiration >= dealEnd, nil +} + type pendingPiece struct { size abi.UnpaddedPieceSize deal api.PieceDealInfo diff --git a/extern/storage-sealing/sector_state.go b/extern/storage-sealing/sector_state.go index b606de5aeb5..ba6df7ff486 100644 --- a/extern/storage-sealing/sector_state.go +++ b/extern/storage-sealing/sector_state.go @@ -3,50 +3,65 @@ package sealing type SectorState string var ExistSectorStateList = map[SectorState]struct{}{ - Empty: {}, - WaitDeals: {}, - Packing: {}, - AddPiece: {}, - AddPieceFailed: {}, - GetTicket: {}, - PreCommit1: {}, - PreCommit2: {}, - PreCommitting: {}, - PreCommitWait: {}, - SubmitPreCommitBatch: {}, - PreCommitBatchWait: {}, - WaitSeed: {}, - Committing: {}, - CommitFinalize: {}, - CommitFinalizeFailed: {}, - SubmitCommit: {}, - CommitWait: {}, - SubmitCommitAggregate: {}, - CommitAggregateWait: {}, - FinalizeSector: {}, - Proving: {}, - FailedUnrecoverable: {}, - SealPreCommit1Failed: {}, - SealPreCommit2Failed: {}, - PreCommitFailed: {}, - ComputeProofFailed: {}, - CommitFailed: {}, - PackingFailed: {}, - FinalizeFailed: {}, - DealsExpired: {}, - RecoverDealIDs: {}, - Faulty: {}, - FaultReported: {}, - FaultedFinal: {}, - Terminating: {}, - TerminateWait: {}, - TerminateFinality: {}, - TerminateFailed: {}, - Removing: {}, - RemoveFailed: {}, - Removed: {}, + Empty: {}, + WaitDeals: {}, + Packing: {}, + AddPiece: {}, + AddPieceFailed: {}, + GetTicket: {}, + PreCommit1: {}, + PreCommit2: {}, + PreCommitting: {}, + PreCommitWait: {}, + SubmitPreCommitBatch: {}, + PreCommitBatchWait: {}, + WaitSeed: {}, + Committing: {}, + CommitFinalize: {}, + CommitFinalizeFailed: {}, + SubmitCommit: {}, + CommitWait: {}, + SubmitCommitAggregate: {}, + CommitAggregateWait: {}, + FinalizeSector: {}, + Proving: {}, + FailedUnrecoverable: {}, + SealPreCommit1Failed: {}, + SealPreCommit2Failed: {}, + PreCommitFailed: {}, + ComputeProofFailed: {}, + CommitFailed: {}, + PackingFailed: {}, + FinalizeFailed: {}, + DealsExpired: {}, + RecoverDealIDs: {}, + Faulty: {}, + FaultReported: {}, + FaultedFinal: {}, + Terminating: {}, + TerminateWait: {}, + TerminateFinality: {}, + TerminateFailed: {}, + Removing: {}, + RemoveFailed: {}, + Removed: {}, + SnapDealsWaitDeals: {}, + SnapDealsAddPiece: {}, + SnapDealsPacking: {}, + UpdateReplica: {}, + ProveReplicaUpdate: {}, + SubmitReplicaUpdate: {}, + ReplicaUpdateWait: {}, + FinalizeReplicaUpdate: {}, + SnapDealsAddPieceFailed: {}, + SnapDealsDealsExpired: {}, + SnapDealsRecoverDealIDs: {}, + ReplicaUpdateFailed: {}, + AbortUpgrade: {}, } +// cmd/lotus-miner/info.go defines CLI colors corresponding to these states +// update files there when adding new states const ( UndefinedSectorState SectorState = "" @@ -79,6 +94,17 @@ const ( FinalizeSector SectorState = "FinalizeSector" Proving SectorState = "Proving" + + // snap deals / cc update + SnapDealsWaitDeals SectorState = "SnapDealsWaitDeals" + SnapDealsAddPiece SectorState = "SnapDealsAddPiece" + SnapDealsPacking SectorState = "SnapDealsPacking" + UpdateReplica SectorState = "UpdateReplica" + ProveReplicaUpdate SectorState = "ProveReplicaUpdate" + SubmitReplicaUpdate SectorState = "SubmitReplicaUpdate" + ReplicaUpdateWait SectorState = "ReplicaUpdateWait" + FinalizeReplicaUpdate SectorState = "FinalizeReplicaUpdate" + // error modes FailedUnrecoverable SectorState = "FailedUnrecoverable" AddPieceFailed SectorState = "AddPieceFailed" @@ -92,6 +118,13 @@ const ( DealsExpired SectorState = "DealsExpired" RecoverDealIDs SectorState = "RecoverDealIDs" + // snap deals error modes + SnapDealsAddPieceFailed SectorState = "SnapDealsAddPieceFailed" + SnapDealsDealsExpired SectorState = "SnapDealsDealsExpired" + SnapDealsRecoverDealIDs SectorState = "SnapDealsRecoverDealIDs" + AbortUpgrade SectorState = "AbortUpgrade" + ReplicaUpdateFailed SectorState = "ReplicaUpdateFailed" + Faulty SectorState = "Faulty" // sector is corrupted or gone for some reason FaultReported SectorState = "FaultReported" // sector has been declared as a fault on chain FaultedFinal SectorState = "FaultedFinal" // fault declared on chain @@ -108,11 +141,11 @@ const ( func toStatState(st SectorState, finEarly bool) statSectorState { switch st { - case UndefinedSectorState, Empty, WaitDeals, AddPiece, AddPieceFailed: + case UndefinedSectorState, Empty, WaitDeals, AddPiece, AddPieceFailed, SnapDealsWaitDeals, SnapDealsAddPiece: return sstStaging - case Packing, GetTicket, PreCommit1, PreCommit2, PreCommitting, PreCommitWait, SubmitPreCommitBatch, PreCommitBatchWait, WaitSeed, Committing, CommitFinalize, FinalizeSector: + case Packing, GetTicket, PreCommit1, PreCommit2, PreCommitting, PreCommitWait, SubmitPreCommitBatch, PreCommitBatchWait, WaitSeed, Committing, CommitFinalize, FinalizeSector, SnapDealsPacking, UpdateReplica, ProveReplicaUpdate, FinalizeReplicaUpdate: return sstSealing - case SubmitCommit, CommitWait, SubmitCommitAggregate, CommitAggregateWait: + case SubmitCommit, CommitWait, SubmitCommitAggregate, CommitAggregateWait, SubmitReplicaUpdate, ReplicaUpdateWait: if finEarly { // we use statSectorState for throttling storage use. With FinalizeEarly // we can consider sectors in states after CommitFinalize as finalized, so diff --git a/extern/storage-sealing/states_failed.go b/extern/storage-sealing/states_failed.go index 0c88cc38452..a93cda3f56e 100644 --- a/extern/storage-sealing/states_failed.go +++ b/extern/storage-sealing/states_failed.go @@ -1,11 +1,13 @@ package sealing import ( + "context" "time" "github.com/hashicorp/go-multierror" "golang.org/x/xerrors" + "github.com/filecoin-project/go-address" "github.com/filecoin-project/lotus/chain/actors/builtin/market" "github.com/filecoin-project/lotus/chain/actors/builtin/miner" @@ -181,6 +183,67 @@ func (m *Sealing) handleComputeProofFailed(ctx statemachine.Context, sector Sect return ctx.Send(SectorRetryComputeProof{}) } +func (m *Sealing) handleSubmitReplicaUpdateFailed(ctx statemachine.Context, sector SectorInfo) error { + if sector.ReplicaUpdateMessage != nil { + mw, err := m.Api.StateSearchMsg(ctx.Context(), *sector.ReplicaUpdateMessage) + if err != nil { + // API error + if err := failedCooldown(ctx, sector); err != nil { + return err + } + + return ctx.Send(SectorRetrySubmitReplicaUpdateWait{}) + } + + if mw == nil { + return ctx.Send(SectorRetrySubmitReplicaUpdateWait{}) + } + + switch mw.Receipt.ExitCode { + case exitcode.Ok: + return ctx.Send(SectorRetrySubmitReplicaUpdateWait{}) + case exitcode.SysErrOutOfGas: + return ctx.Send(SectorRetrySubmitReplicaUpdate{}) + default: + // something else went wrong + } + } + + tok, _, err := m.Api.ChainHead(ctx.Context()) + if err != nil { + log.Errorf("handleCommitting: api error, not proceeding: %+v", err) + return nil + } + + if err := checkReplicaUpdate(ctx.Context(), m.maddr, sector, tok, m.Api); err != nil { + switch err.(type) { + case *ErrApi: + log.Errorf("handleSubmitReplicaUpdateFailed: api error, not proceeding: %+v", err) + return nil + case *ErrBadRU: + log.Errorf("bad replica update: %+v", err) + return ctx.Send(SectorRetryReplicaUpdate{}) + case *ErrBadPR: + log.Errorf("bad PR1: +%v", err) + return ctx.Send(SectorRetryProveReplicaUpdate{}) + + case *ErrInvalidDeals: + return ctx.Send(SectorInvalidDealIDs{}) + case *ErrExpiredDeals: + return ctx.Send(SectorDealsExpired{xerrors.Errorf("expired dealIDs in sector: %w", err)}) + default: + log.Errorf("sanity check error, not proceeding: +%v", err) + return xerrors.Errorf("checkPieces sanity check error: %w", err) + } + } + + if err := failedCooldown(ctx, sector); err != nil { + return err + } + + return ctx.Send(SectorRetrySubmitReplicaUpdate{}) +} + func (m *Sealing) handleCommitFailed(ctx statemachine.Context, sector SectorInfo) error { tok, _, err := m.Api.ChainHead(ctx.Context()) if err != nil { @@ -319,61 +382,40 @@ func (m *Sealing) handleDealsExpired(ctx statemachine.Context, sector SectorInfo return ctx.Send(SectorRemove{}) } -func (m *Sealing) HandleRecoverDealIDs(ctx Context, sector SectorInfo) error { - tok, height, err := m.Api.ChainHead(ctx.Context()) - if err != nil { - return xerrors.Errorf("getting chain head: %w", err) +func (m *Sealing) handleDealsExpiredSnapDeals(ctx statemachine.Context, sector SectorInfo) error { + if !sector.CCUpdate { + // Should be impossible + return xerrors.Errorf("should never reach SnapDealsDealsExpired as a non-CCUpdate sector") } - var toFix []int - paddingPieces := 0 - - for i, p := range sector.Pieces { - // 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 { - exp := zerocomm.ZeroPieceCommitment(p.Piece.Size.Unpadded()) - if !p.Piece.PieceCID.Equals(exp) { - return xerrors.Errorf("sector %d piece %d had non-zero PieceCID %+v", sector.SectorNumber, i, p.Piece.PieceCID) - } - paddingPieces++ - continue - } - - proposal, err := m.Api.StateMarketStorageDealProposal(ctx.Context(), p.DealInfo.DealID, tok) - if err != nil { - log.Warnf("getting deal %d for piece %d: %+v", p.DealInfo.DealID, i, err) - toFix = append(toFix, i) - continue - } - - if proposal.Provider != m.maddr { - log.Warnf("piece %d (of %d) of sector %d refers deal %d with wrong provider: %s != %s", i, len(sector.Pieces), sector.SectorNumber, p.DealInfo.DealID, proposal.Provider, m.maddr) - toFix = append(toFix, i) - continue - } - - if proposal.PieceCID != p.Piece.PieceCID { - log.Warnf("piece %d (of %d) of sector %d refers deal %d with wrong PieceCID: %s != %s", i, len(sector.Pieces), sector.SectorNumber, p.DealInfo.DealID, p.Piece.PieceCID, proposal.PieceCID) - toFix = append(toFix, i) - continue - } + return ctx.Send(SectorAbortUpgrade{xerrors.Errorf("one of upgrade deals expired")}) +} - if p.Piece.Size != proposal.PieceSize { - log.Warnf("piece %d (of %d) of sector %d refers deal %d with different size: %d != %d", i, len(sector.Pieces), sector.SectorNumber, p.DealInfo.DealID, p.Piece.Size, proposal.PieceSize) - toFix = append(toFix, i) - continue - } +func (m *Sealing) handleAbortUpgrade(ctx statemachine.Context, sector SectorInfo) error { + if !sector.CCUpdate { + return xerrors.Errorf("should never reach AbortUpgrade as a non-CCUpdate sector") + } - if height >= proposal.StartEpoch { - // TODO: check if we are in an early enough state (before precommit), try to remove the offending pieces - // (tricky as we have to 'defragment' the sector while doing that, and update piece references for retrieval) - return xerrors.Errorf("can't fix sector deals: piece %d (of %d) of sector %d refers expired deal %d - should start at %d, head %d", i, len(sector.Pieces), sector.SectorNumber, p.DealInfo.DealID, proposal.StartEpoch, height) - } + // Remove snap deals replica if any + if err := m.sealer.ReleaseReplicaUpgrade(ctx.Context(), m.minerSector(sector.SectorType, sector.SectorNumber)); err != nil { + return xerrors.Errorf("removing CC update files from sector storage") } + return ctx.Send(SectorRevertUpgradeToProving{}) +} +// failWith is a mutator or global mutator +func (m *Sealing) handleRecoverDealIDsOrFailWith(ctx statemachine.Context, sector SectorInfo, failWith interface{}) error { + toFix, paddingPieces, err := recoveryPiecesToFix(ctx.Context(), m.Api, sector, m.maddr) + if err != nil { + return err + } + tok, _, err := m.Api.ChainHead(ctx.Context()) + if err != nil { + return err + } failed := map[int]error{} updates := map[int]abi.DealID{} + for _, i := range toFix { p := sector.Pieces[i] @@ -430,3 +472,67 @@ func (m *Sealing) HandleRecoverDealIDs(ctx Context, sector SectorInfo) error { // Not much to do here, we can't go back in time to commit this sector return ctx.Send(SectorUpdateDealIDs{Updates: updates}) } + +func (m *Sealing) HandleRecoverDealIDs(ctx statemachine.Context, sector SectorInfo) error { + return m.handleRecoverDealIDsOrFailWith(ctx, sector, SectorRemove{}) +} + +func (m *Sealing) handleSnapDealsRecoverDealIDs(ctx statemachine.Context, sector SectorInfo) error { + return m.handleRecoverDealIDsOrFailWith(ctx, sector, SectorAbortUpgrade{}) +} + +func recoveryPiecesToFix(ctx context.Context, api SealingAPI, sector SectorInfo, maddr address.Address) ([]int, int, error) { + tok, height, err := api.ChainHead(ctx) + if err != nil { + return nil, 0, xerrors.Errorf("getting chain head: %w", err) + } + + var toFix []int + paddingPieces := 0 + + for i, p := range sector.Pieces { + // 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 { + exp := zerocomm.ZeroPieceCommitment(p.Piece.Size.Unpadded()) + if !p.Piece.PieceCID.Equals(exp) { + return nil, 0, xerrors.Errorf("sector %d piece %d had non-zero PieceCID %+v", sector.SectorNumber, i, p.Piece.PieceCID) + } + paddingPieces++ + continue + } + + proposal, err := api.StateMarketStorageDealProposal(ctx, p.DealInfo.DealID, tok) + if err != nil { + log.Warnf("getting deal %d for piece %d: %+v", p.DealInfo.DealID, i, err) + toFix = append(toFix, i) + continue + } + + if proposal.Provider != maddr { + log.Warnf("piece %d (of %d) of sector %d refers deal %d with wrong provider: %s != %s", i, len(sector.Pieces), sector.SectorNumber, p.DealInfo.DealID, proposal.Provider, maddr) + toFix = append(toFix, i) + continue + } + + if proposal.PieceCID != p.Piece.PieceCID { + log.Warnf("piece %d (of %d) of sector %d refers deal %d with wrong PieceCID: %s != %s", i, len(sector.Pieces), sector.SectorNumber, p.DealInfo.DealID, p.Piece.PieceCID, proposal.PieceCID) + toFix = append(toFix, i) + continue + } + + if p.Piece.Size != proposal.PieceSize { + log.Warnf("piece %d (of %d) of sector %d refers deal %d with different size: %d != %d", i, len(sector.Pieces), sector.SectorNumber, p.DealInfo.DealID, p.Piece.Size, proposal.PieceSize) + toFix = append(toFix, i) + continue + } + + if height >= proposal.StartEpoch { + // TODO: check if we are in an early enough state (before precommit), try to remove the offending pieces + // (tricky as we have to 'defragment' the sector while doing that, and update piece references for retrieval) + return nil, 0, xerrors.Errorf("can't fix sector deals: piece %d (of %d) of sector %d refers expired deal %d - should start at %d, head %d", i, len(sector.Pieces), sector.SectorNumber, p.DealInfo.DealID, proposal.StartEpoch, height) + } + } + + return toFix, paddingPieces, nil +} diff --git a/extern/storage-sealing/states_failed_test.go b/extern/storage-sealing/states_failed_test.go index 22c245afd5e..86f69b11f45 100644 --- a/extern/storage-sealing/states_failed_test.go +++ b/extern/storage-sealing/states_failed_test.go @@ -6,6 +6,7 @@ import ( "testing" "github.com/filecoin-project/go-state-types/network" + statemachine "github.com/filecoin-project/go-statemachine" market0 "github.com/filecoin-project/specs-actors/actors/builtin/market" @@ -25,6 +26,7 @@ import ( ) func TestStateRecoverDealIDs(t *testing.T) { + t.Skip("Bring this back when we can correctly mock a state machine context: Issue #7867") mockCtrl := gomock.NewController(t) defer mockCtrl.Finish() @@ -40,7 +42,7 @@ func TestStateRecoverDealIDs(t *testing.T) { sctx := mocks.NewMockContext(mockCtrl) sctx.EXPECT().Context().AnyTimes().Return(ctx) - api.EXPECT().ChainHead(ctx).Times(1).Return(nil, abi.ChainEpoch(10), nil) + api.EXPECT().ChainHead(ctx).Times(2).Return(nil, abi.ChainEpoch(10), nil) var dealId abi.DealID = 12 dealProposal := market.DealProposal{ @@ -70,7 +72,9 @@ func TestStateRecoverDealIDs(t *testing.T) { sctx.EXPECT().Send(sealing.SectorRemove{}).Return(nil) - err := fakeSealing.HandleRecoverDealIDs(sctx, sealing.SectorInfo{ + // 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{}, sealing.SectorInfo{ Pieces: []sealing.Piece{ { DealInfo: &api2.PieceDealInfo{ diff --git a/extern/storage-sealing/states_replica_update.go b/extern/storage-sealing/states_replica_update.go new file mode 100644 index 00000000000..28c5ede0b9e --- /dev/null +++ b/extern/storage-sealing/states_replica_update.go @@ -0,0 +1,209 @@ +package sealing + +import ( + "bytes" + + "github.com/filecoin-project/go-state-types/big" + "github.com/filecoin-project/go-state-types/exitcode" + statemachine "github.com/filecoin-project/go-statemachine" + api "github.com/filecoin-project/lotus/api" + "github.com/filecoin-project/lotus/chain/actors/builtin/miner" + "golang.org/x/xerrors" +) + +func (m *Sealing) handleReplicaUpdate(ctx statemachine.Context, sector SectorInfo) error { + if err := checkPieces(ctx.Context(), m.maddr, sector, m.Api); err != nil { // Sanity check state + switch err.(type) { + case *ErrApi: + log.Errorf("handleReplicaUpdate: api error, not proceeding: %+v", err) + return nil + case *ErrInvalidDeals: + log.Warnf("invalid deals in sector %d: %v", sector.SectorNumber, err) + return ctx.Send(SectorInvalidDealIDs{}) + 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) + } + } + out, err := m.sealer.ReplicaUpdate(sector.sealingCtx(ctx.Context()), m.minerSector(sector.SectorType, sector.SectorNumber), sector.pieceInfos()) + if err != nil { + return ctx.Send(SectorUpdateReplicaFailed{xerrors.Errorf("replica update failed: %w", err)}) + } + return ctx.Send(SectorReplicaUpdate{ + Out: out, + }) +} + +func (m *Sealing) handleProveReplicaUpdate(ctx statemachine.Context, sector SectorInfo) error { + if sector.UpdateSealed == nil || sector.UpdateUnsealed == nil { + return xerrors.Errorf("invalid sector %d with nil UpdateSealed or UpdateUnsealed output", sector.SectorNumber) + } + if sector.CommR == nil { + return xerrors.Errorf("invalid sector %d with nil CommR", sector.SectorNumber) + } + vanillaProofs, err := m.sealer.ProveReplicaUpdate1(sector.sealingCtx(ctx.Context()), m.minerSector(sector.SectorType, sector.SectorNumber), *sector.CommR, *sector.UpdateSealed, *sector.UpdateUnsealed) + if err != nil { + return ctx.Send(SectorProveReplicaUpdateFailed{xerrors.Errorf("prove replica update (1) failed: %w", err)}) + } + + proof, err := m.sealer.ProveReplicaUpdate2(sector.sealingCtx(ctx.Context()), m.minerSector(sector.SectorType, sector.SectorNumber), *sector.CommR, *sector.UpdateSealed, *sector.UpdateUnsealed, vanillaProofs) + if err != nil { + return ctx.Send(SectorProveReplicaUpdateFailed{xerrors.Errorf("prove replica update (2) failed: %w", err)}) + + } + return ctx.Send(SectorProveReplicaUpdate{ + Proof: proof, + }) +} + +func (m *Sealing) handleSubmitReplicaUpdate(ctx statemachine.Context, sector SectorInfo) error { + + tok, _, err := m.Api.ChainHead(ctx.Context()) + if err != nil { + log.Errorf("handleSubmitReplicaUpdate: api error, not proceeding: %+v", err) + return nil + } + + if err := checkReplicaUpdate(ctx.Context(), m.maddr, sector, tok, m.Api); err != nil { + return ctx.Send(SectorSubmitReplicaUpdateFailed{}) + } + + sl, err := m.Api.StateSectorPartition(ctx.Context(), m.maddr, sector.SectorNumber, tok) + if err != nil { + log.Errorf("handleSubmitReplicaUpdate: api error, not proceeding: %+v", err) + return nil + } + updateProof, err := sector.SectorType.RegisteredUpdateProof() + if err != nil { + log.Errorf("failed to get update proof type from seal proof: %+v", err) + return ctx.Send(SectorSubmitReplicaUpdateFailed{}) + } + enc := new(bytes.Buffer) + params := &miner.ProveReplicaUpdatesParams{ + Updates: []miner.ReplicaUpdate{ + { + SectorID: sector.SectorNumber, + Deadline: sl.Deadline, + Partition: sl.Partition, + NewSealedSectorCID: *sector.UpdateSealed, + Deals: sector.dealIDs(), + UpdateProofType: updateProof, + ReplicaProof: sector.ReplicaUpdateProof, + }, + }, + } + if err := params.MarshalCBOR(enc); err != nil { + log.Errorf("failed to serialize update replica params: %w", err) + return ctx.Send(SectorSubmitReplicaUpdateFailed{}) + } + + cfg, err := m.getConfig() + if err != nil { + return xerrors.Errorf("getting config: %w", err) + } + + onChainInfo, err := m.Api.StateSectorGetInfo(ctx.Context(), m.maddr, sector.SectorNumber, tok) + if err != nil { + log.Errorf("handleSubmitReplicaUpdate: api error, not proceeding: %+v", err) + return nil + } + sp, err := m.currentSealProof(ctx.Context()) + if err != nil { + log.Errorf("sealer failed to return current seal proof not proceeding: %+v", err) + return nil + } + virtualPCI := miner.SectorPreCommitInfo{ + SealProof: sp, + SectorNumber: sector.SectorNumber, + SealedCID: *sector.UpdateSealed, + //SealRandEpoch: 0, + DealIDs: sector.dealIDs(), + Expiration: onChainInfo.Expiration, + //ReplaceCapacity: false, + //ReplaceSectorDeadline: 0, + //ReplaceSectorPartition: 0, + //ReplaceSectorNumber: 0, + } + + collateral, err := m.Api.StateMinerInitialPledgeCollateral(ctx.Context(), m.maddr, virtualPCI, tok) + if err != nil { + return xerrors.Errorf("getting initial pledge collateral: %w", err) + } + + collateral = big.Sub(collateral, onChainInfo.InitialPledge) + if collateral.LessThan(big.Zero()) { + collateral = big.Zero() + } + + collateral, err = collateralSendAmount(ctx.Context(), m.Api, m.maddr, cfg, collateral) + if err != nil { + log.Errorf("collateral send amount failed not proceeding: %+v", err) + return nil + } + + goodFunds := big.Add(collateral, big.Int(m.feeCfg.MaxCommitGasFee)) + + mi, err := m.Api.StateMinerInfo(ctx.Context(), m.maddr, tok) + if err != nil { + log.Errorf("handleSubmitReplicaUpdate: api error, not proceeding: %+v", err) + return nil + } + + from, _, err := m.addrSel(ctx.Context(), 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{}) + } + mcid, err := m.Api.SendMsg(ctx.Context(), from, m.maddr, miner.Methods.ProveReplicaUpdates, big.Zero(), big.Int(m.feeCfg.MaxCommitGasFee), enc.Bytes()) + if err != nil { + log.Errorf("handleSubmitReplicaUpdate: error sending message: %+v", err) + return ctx.Send(SectorSubmitReplicaUpdateFailed{}) + } + + return ctx.Send(SectorReplicaUpdateSubmitted{Message: mcid}) +} + +func (m *Sealing) handleReplicaUpdateWait(ctx statemachine.Context, sector SectorInfo) error { + if sector.ReplicaUpdateMessage == nil { + log.Errorf("handleReplicaUpdateWait: no replica update message cid recorded") + return ctx.Send(SectorSubmitReplicaUpdateFailed{}) + } + + mw, err := m.Api.StateWaitMsg(ctx.Context(), *sector.ReplicaUpdateMessage) + if err != nil { + log.Errorf("handleReplicaUpdateWait: failed to wait for message: %+v", err) + return ctx.Send(SectorSubmitReplicaUpdateFailed{}) + } + + switch mw.Receipt.ExitCode { + case exitcode.Ok: + //expected + case exitcode.SysErrInsufficientFunds: + fallthrough + case exitcode.SysErrOutOfGas: + log.Errorf("gas estimator was wrong or out of funds") + return ctx.Send(SectorSubmitReplicaUpdateFailed{}) + default: + return ctx.Send(SectorSubmitReplicaUpdateFailed{}) + } + si, err := m.Api.StateSectorGetInfo(ctx.Context(), m.maddr, sector.SectorNumber, mw.TipSetTok) + if err != nil { + log.Errorf("api err failed to get sector info: %+v", err) + return ctx.Send(SectorSubmitReplicaUpdateFailed{}) + } + if si == nil { + log.Errorf("api err sector not found") + return ctx.Send(SectorSubmitReplicaUpdateFailed{}) + } + + if !si.SealedCID.Equals(*sector.UpdateSealed) { + log.Errorf("mismatch of expected onchain sealed cid after replica update, expected %s got %s", sector.UpdateSealed, si.SealedCID) + return ctx.Send(SectorAbortUpgrade{}) + } + return ctx.Send(SectorReplicaUpdateLanded{}) +} + +func (m *Sealing) handleFinalizeReplicaUpdate(ctx statemachine.Context, sector SectorInfo) error { + return ctx.Send(SectorFinalized{}) +} diff --git a/extern/storage-sealing/states_sealing.go b/extern/storage-sealing/states_sealing.go index c6cd0bb492e..2258250f47d 100644 --- a/extern/storage-sealing/states_sealing.go +++ b/extern/storage-sealing/states_sealing.go @@ -280,8 +280,8 @@ func (m *Sealing) handlePreCommit2(ctx statemachine.Context, sector SectorInfo) } // TODO: We should probably invoke this method in most (if not all) state transition failures after handlePreCommitting -func (m *Sealing) remarkForUpgrade(sid abi.SectorNumber) { - err := m.MarkForUpgrade(sid) +func (m *Sealing) remarkForUpgrade(ctx context.Context, sid abi.SectorNumber) { + err := m.MarkForUpgrade(ctx, sid) if err != nil { log.Errorf("error re-marking sector %d as for upgrade: %+v", sid, err) } @@ -424,7 +424,7 @@ func (m *Sealing) handlePreCommitting(ctx statemachine.Context, sector SectorInf mcid, err := m.Api.SendMsg(ctx.Context(), from, m.maddr, miner.Methods.PreCommitSector, deposit, big.Int(m.feeCfg.MaxPreCommitGasFee), enc.Bytes()) if err != nil { if params.ReplaceCapacity { - m.remarkForUpgrade(params.ReplaceSectorNumber) + m.remarkForUpgrade(ctx.Context(), params.ReplaceSectorNumber) } return ctx.Send(SectorChainPreCommitFailed{xerrors.Errorf("pushing message to mpool: %w", err)}) } diff --git a/extern/storage-sealing/types.go b/extern/storage-sealing/types.go index aeb378f29d9..db53f43d3cc 100644 --- a/extern/storage-sealing/types.go +++ b/extern/storage-sealing/types.go @@ -73,7 +73,7 @@ type SectorInfo struct { // PreCommit2 CommD *cid.Cid - CommR *cid.Cid + CommR *cid.Cid // SectorKey Proof []byte PreCommitInfo *miner.SectorPreCommitInfo @@ -91,6 +91,14 @@ type SectorInfo struct { CommitMessage *cid.Cid InvalidProofs uint64 // failed proof computations (doesn't validate with proof inputs; can't compute) + // CCUpdate + CCUpdate bool + CCPieces []Piece + UpdateSealed *cid.Cid + UpdateUnsealed *cid.Cid + ReplicaUpdateProof storage.ReplicaUpdateProof + ReplicaUpdateMessage *cid.Cid + // Faults FaultReportMsg *cid.Cid diff --git a/extern/storage-sealing/upgrade_queue.go b/extern/storage-sealing/upgrade_queue.go index 02db41fdeff..aab1e67b048 100644 --- a/extern/storage-sealing/upgrade_queue.go +++ b/extern/storage-sealing/upgrade_queue.go @@ -4,6 +4,7 @@ import ( "context" "github.com/filecoin-project/lotus/chain/actors/builtin/miner" + market7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/market" "golang.org/x/xerrors" @@ -18,7 +19,8 @@ func (m *Sealing) IsMarkedForUpgrade(id abi.SectorNumber) bool { return found } -func (m *Sealing) MarkForUpgrade(id abi.SectorNumber) error { +func (m *Sealing) MarkForUpgrade(ctx context.Context, id abi.SectorNumber) error { + m.upgradeLk.Lock() defer m.upgradeLk.Unlock() @@ -27,6 +29,37 @@ func (m *Sealing) MarkForUpgrade(id abi.SectorNumber) error { return xerrors.Errorf("sector %d already marked for upgrade", id) } + si, err := m.GetSectorInfo(id) + if err != nil { + return xerrors.Errorf("getting sector info: %w", err) + } + if si.State != Proving { + return xerrors.Errorf("can't mark sectors not in the 'Proving' state for upgrade") + } + if len(si.Pieces) != 1 { + return xerrors.Errorf("not a committed-capacity sector, expected 1 piece") + } + if si.Pieces[0].DealInfo != nil { + return xerrors.Errorf("not a committed-capacity sector, has deals") + } + + m.toUpgrade[id] = struct{}{} + + return nil +} + +func (m *Sealing) MarkForSnapUpgrade(ctx context.Context, id abi.SectorNumber) error { + cfg, err := m.getConfig() + if err != nil { + return xerrors.Errorf("getting storage config: %w", err) + } + + curStaging := m.stats.curStaging() + if cfg.MaxWaitDealsSectors > 0 && curStaging >= cfg.MaxWaitDealsSectors { + return xerrors.Errorf("already waiting for deals in %d >= %d (cfg.MaxWaitDealsSectors) sectors, no free resources to wait for deals in another", + curStaging, cfg.MaxWaitDealsSectors) + } + si, err := m.GetSectorInfo(id) if err != nil { return xerrors.Errorf("getting sector info: %w", err) @@ -44,11 +77,38 @@ func (m *Sealing) MarkForUpgrade(id abi.SectorNumber) error { return xerrors.Errorf("not a committed-capacity sector, has deals") } - // TODO: more checks to match actor constraints + tok, head, err := m.Api.ChainHead(ctx) + if err != nil { + return xerrors.Errorf("couldnt get chain head: %w", err) + } + onChainInfo, err := m.Api.StateSectorGetInfo(ctx, m.maddr, id, tok) + if err != nil { + return xerrors.Errorf("failed to read sector on chain info: %w", err) + } - m.toUpgrade[id] = struct{}{} + active, err := m.Api.StateMinerActiveSectors(ctx, m.maddr, tok) + if err != nil { + return xerrors.Errorf("failed to check active sectors: %w", err) + } + // Ensure the upgraded sector is active + var found bool + for _, si := range active { + if si.SectorNumber == id { + found = true + break + } + } + if !found { + return xerrors.Errorf("cannot mark inactive sector for upgrade") + } - return nil + if onChainInfo.Expiration-head < market7.DealMinDuration { + return xerrors.Errorf("pointless to upgrade sector %d, expiration %d is less than a min deal duration away from current epoch."+ + "Upgrade expiration before marking for upgrade", id, onChainInfo.Expiration) + } + + log.Errorf("updating sector number %d", id) + return m.sectors.Send(uint64(id), SectorStartCCUpdate{}) } func (m *Sealing) tryUpgradeSector(ctx context.Context, params *miner.SectorPreCommitInfo) big.Int { diff --git a/go.mod b/go.mod index 551af628db5..2cf84d12849 100644 --- a/go.mod +++ b/go.mod @@ -50,8 +50,8 @@ require ( github.com/filecoin-project/specs-actors/v4 v4.0.1 github.com/filecoin-project/specs-actors/v5 v5.0.4 github.com/filecoin-project/specs-actors/v6 v6.0.1 - github.com/filecoin-project/specs-actors/v7 v7.0.0-20211118013026-3dce48197cec - github.com/filecoin-project/specs-storage v0.1.1-0.20211213202648-f14267c929ff + github.com/filecoin-project/specs-actors/v7 v7.0.0-20211230214648-aeae366b083a + github.com/filecoin-project/specs-storage v0.1.1-0.20211228030229-6d460d25a0c9 github.com/filecoin-project/test-vectors/schema v0.0.5 github.com/gbrlsnchs/jwt/v3 v3.0.1 github.com/gdamore/tcell/v2 v2.2.0 @@ -173,3 +173,7 @@ require ( replace github.com/filecoin-project/filecoin-ffi => ./extern/filecoin-ffi replace github.com/filecoin-project/test-vectors => ./extern/test-vectors + +//replace github.com/filecoin-project/specs-actors/v7 => /Users/zenground0/pl/repos/specs-actors + +// replace github.com/filecon-project/specs-storage => /Users/zenground0/pl/repos/specs-storage diff --git a/go.sum b/go.sum index 45625140b39..3efacc2164e 100644 --- a/go.sum +++ b/go.sum @@ -341,7 +341,6 @@ github.com/filecoin-project/go-padreader v0.0.1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MU github.com/filecoin-project/go-paramfetch v0.0.2 h1:a6W3Ij6CKhwHYYlx+5mqvBIyw4CabZH2ojdEaoAZ6/g= github.com/filecoin-project/go-paramfetch v0.0.2/go.mod h1:1FH85P8U+DUEmWk1Jkw3Bw7FrwTVUNHk/95PSPG+dts= github.com/filecoin-project/go-state-types v0.0.0-20200903145444-247639ffa6ad/go.mod h1:IQ0MBPnonv35CJHtWSN3YY1Hz2gkPru1Q9qoaYLxx9I= -github.com/filecoin-project/go-state-types v0.0.0-20200904021452-1883f36ca2f4/go.mod h1:IQ0MBPnonv35CJHtWSN3YY1Hz2gkPru1Q9qoaYLxx9I= 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= @@ -357,7 +356,6 @@ github.com/filecoin-project/go-statestore v0.2.0 h1:cRRO0aPLrxKQCZ2UOQbzFGn4WDNd github.com/filecoin-project/go-statestore v0.2.0/go.mod h1:8sjBYbS35HwPzct7iT4lIXjLlYyPor80aU7t7a/Kspo= github.com/filecoin-project/go-storedcounter v0.1.0 h1:Mui6wSUBC+cQGHbDUBcO7rfh5zQkWJM/CpAZa/uOuus= github.com/filecoin-project/go-storedcounter v0.1.0/go.mod h1:4ceukaXi4vFURIoxYMfKzaRF5Xv/Pinh2oTnoxpv+z8= -github.com/filecoin-project/specs-actors v0.9.4/go.mod h1:BStZQzx5x7TmCkLv0Bpa07U6cPKol6fd3w9KjMPZ6Z4= github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors v0.9.14 h1:68PVstg2UB3ZsMLF+DKFTAs/YKsqhKWynkr0IqmVRQY= github.com/filecoin-project/specs-actors v0.9.14/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= @@ -376,10 +374,11 @@ github.com/filecoin-project/specs-actors/v6 v6.0.0/go.mod h1:V1AYfi5GkHXipx1mnVi github.com/filecoin-project/specs-actors/v6 v6.0.1 h1:laxvHNsvrq83Y9n+W7znVCePi3oLyRf0Rkl4jFO8Wew= github.com/filecoin-project/specs-actors/v6 v6.0.1/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= github.com/filecoin-project/specs-actors/v7 v7.0.0-20211117170924-fd07a4c7dff9/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= -github.com/filecoin-project/specs-actors/v7 v7.0.0-20211118013026-3dce48197cec h1:KV9vE+Sl2Y3qKsrpba4HcE7wHwK7v6O5U/S0xHbje6A= -github.com/filecoin-project/specs-actors/v7 v7.0.0-20211118013026-3dce48197cec/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= -github.com/filecoin-project/specs-storage v0.1.1-0.20211213202648-f14267c929ff h1:JO62nquOGhjoDf9+JkAcV+wsD5yhoyIKOMj70ZNdD3Q= -github.com/filecoin-project/specs-storage v0.1.1-0.20211213202648-f14267c929ff/go.mod h1:nJRRM7Aa9XVvygr3W9k6xGF46RWzr2zxF/iGoAIfA/g= +github.com/filecoin-project/specs-actors/v7 v7.0.0-20211222192039-c83bea50c402/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= +github.com/filecoin-project/specs-actors/v7 v7.0.0-20211230214648-aeae366b083a h1:MS1mtAhZh0iSE7OxP1bb6+UNyYKsxg8n51FpHlX1d54= +github.com/filecoin-project/specs-actors/v7 v7.0.0-20211230214648-aeae366b083a/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= +github.com/filecoin-project/specs-storage v0.1.1-0.20211228030229-6d460d25a0c9 h1:oUYOvF7EvdXS0Zmk9mNkaB6Bu0l+WXBYPzVodKMiLug= +github.com/filecoin-project/specs-storage v0.1.1-0.20211228030229-6d460d25a0c9/go.mod h1:Tb88Zq+IBJbvAn3mS89GYj3jdRThBTE/771HCVZdRJU= 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= @@ -722,7 +721,6 @@ github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28 github.com/ipfs/go-graphsync v0.11.0/go.mod h1:wC+c8vGVjAHthsVIl8LKr37cUra2GOaMYcQNNmMxDqE= github.com/ipfs/go-graphsync v0.11.5 h1:WA5hVxGBtcal6L6nqubKiqRolaZxbexOK3GumGFJRR4= github.com/ipfs/go-graphsync v0.11.5/go.mod h1:+/sZqRwRCQRrV7NCzgBtufmr5QGpUE98XSa7NlsztmM= -github.com/ipfs/go-hamt-ipld v0.1.1/go.mod h1:1EZCr2v0jlCnhpa+aZ0JZYp8Tt2w16+JJOAVz17YcDk= 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.2.1/go.mod h1:jGesd8EtCM3/zPgx+qr0/feTXGUeRai6adgwC+Q+JvE= diff --git a/itests/ccupgrade_test.go b/itests/ccupgrade_test.go index b5ca414161c..487a15659c8 100644 --- a/itests/ccupgrade_test.go +++ b/itests/ccupgrade_test.go @@ -6,14 +6,16 @@ import ( "testing" "time" + "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/chain/types" "github.com/filecoin-project/lotus/itests/kit" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) -// TODO: This needs to be repurposed into a SnapDeals test suite func TestCCUpgrade(t *testing.T) { kit.QuietMiningLogs() @@ -29,37 +31,45 @@ func TestCCUpgrade(t *testing.T) { } } -func runTestCCUpgrade(t *testing.T, upgradeHeight abi.ChainEpoch) { +func runTestCCUpgrade(t *testing.T, upgradeHeight abi.ChainEpoch) *kit.TestFullNode { ctx := context.Background() blockTime := 5 * time.Millisecond - client, miner, ens := kit.EnsembleMinimal(t, kit.MockProofs(), kit.TurboUpgradeAt(upgradeHeight)) - ens.InterconnectAll().BeginMining(blockTime) + client, miner, ens := kit.EnsembleMinimal(t, kit.GenesisNetworkVersion(network.Version15)) + ens.InterconnectAll().BeginMiningMustPost(blockTime) maddr, err := miner.ActorAddress(ctx) if err != nil { t.Fatal(err) } - CC := abi.SectorNumber(kit.DefaultPresealsPerBootstrapMiner + 1) - Upgraded := CC + 1 + CCUpgrade := abi.SectorNumber(kit.DefaultPresealsPerBootstrapMiner + 1) + fmt.Printf("CCUpgrade: %d\n", CCUpgrade) + // wait for deadline 0 to pass so that committing starts after post on preseals + // this gives max time for post to complete minimizing chances of timeout + // waitForDeadline(ctx, t, 1, client, maddr) miner.PledgeSectors(ctx, 1, 0, nil) sl, err := miner.SectorsList(ctx) require.NoError(t, err) require.Len(t, sl, 1, "expected 1 sector") - require.Equal(t, CC, sl[0], "unexpected sector number") - + require.Equal(t, CCUpgrade, sl[0], "unexpected sector number") { - si, err := client.StateSectorGetInfo(ctx, maddr, CC, types.EmptyTSK) + si, err := client.StateSectorGetInfo(ctx, maddr, CCUpgrade, types.EmptyTSK) require.NoError(t, err) require.Less(t, 50000, int(si.Expiration)) } - err = miner.SectorMarkForUpgrade(ctx, sl[0]) + waitForSectorActive(ctx, t, CCUpgrade, client, maddr) + + err = miner.SectorMarkForUpgrade(ctx, sl[0], true) require.NoError(t, err) + sl, err = miner.SectorsList(ctx) + require.NoError(t, err) + require.Len(t, sl, 1, "expected 1 sector") + dh := kit.NewDealHarness(t, client, miner, miner) deal, res, inPath := dh.MakeOnlineDeal(ctx, kit.MakeFullDealParams{ Rseed: 6, @@ -68,37 +78,96 @@ func runTestCCUpgrade(t *testing.T, upgradeHeight abi.ChainEpoch) { outPath := dh.PerformRetrieval(context.Background(), deal, res.Root, false) kit.AssertFilesEqual(t, inPath, outPath) - // Validate upgrade + status, err := miner.SectorsStatus(ctx, CCUpgrade, true) + require.NoError(t, err) + assert.Equal(t, 1, len(status.Deals)) + return client +} - { - exp, err := client.StateSectorExpiration(ctx, maddr, CC, types.EmptyTSK) - if err != nil { - require.Contains(t, err.Error(), "failed to find sector 3") // already cleaned up - } else { - require.NoError(t, err) - require.NotNil(t, exp) - require.Greater(t, 50000, int(exp.OnTime)) +func waitForDeadline(ctx context.Context, t *testing.T, waitIdx uint64, node *kit.TestFullNode, maddr address.Address) { + for { + ts, err := node.ChainHead(ctx) + require.NoError(t, err) + dl, err := node.StateMinerProvingDeadline(ctx, maddr, ts.Key()) + require.NoError(t, err) + if dl.Index == waitIdx { + return } } - { - exp, err := client.StateSectorExpiration(ctx, maddr, Upgraded, types.EmptyTSK) +} + +func waitForSectorActive(ctx context.Context, t *testing.T, sn abi.SectorNumber, node *kit.TestFullNode, maddr address.Address) { + for { + active, err := node.StateMinerActiveSectors(ctx, maddr, types.EmptyTSK) require.NoError(t, err) - require.Less(t, 50000, int(exp.OnTime)) + for _, si := range active { + if si.SectorNumber == sn { + fmt.Printf("ACTIVE\n") + return + } + } + + time.Sleep(time.Second) } +} + +func TestCCUpgradeAndPoSt(t *testing.T) { + kit.QuietMiningLogs() + t.Run("upgrade and then post", func(t *testing.T) { + ctx := context.Background() + n := runTestCCUpgrade(t, 100) + ts, err := n.ChainHead(ctx) + require.NoError(t, err) + start := ts.Height() + // wait for a full proving period + n.WaitTillChain(ctx, func(ts *types.TipSet) bool { + if ts.Height() > start+abi.ChainEpoch(2880) { + return true + } + return false + }) + }) +} - dlInfo, err := client.StateMinerProvingDeadline(ctx, maddr, types.EmptyTSK) +func TestTooManyMarkedForUpgrade(t *testing.T) { + kit.QuietMiningLogs() + + ctx := context.Background() + blockTime := 5 * time.Millisecond + + client, miner, ens := kit.EnsembleMinimal(t, kit.GenesisNetworkVersion(network.Version15)) + ens.InterconnectAll().BeginMining(blockTime) + + maddr, err := miner.ActorAddress(ctx) + if err != nil { + t.Fatal(err) + } + + CCUpgrade := abi.SectorNumber(kit.DefaultPresealsPerBootstrapMiner + 1) + waitForDeadline(ctx, t, 1, client, maddr) + miner.PledgeSectors(ctx, 3, 0, nil) + + sl, err := miner.SectorsList(ctx) require.NoError(t, err) + require.Len(t, sl, 3, "expected 3 sectors") - // Sector should expire. - for { - // Wait for the sector to expire. - status, err := miner.SectorsStatus(ctx, CC, true) + { + si, err := client.StateSectorGetInfo(ctx, maddr, CCUpgrade, types.EmptyTSK) require.NoError(t, err) - if status.OnTime == 0 && status.Early == 0 { - break - } - t.Log("waiting for sector to expire") - // wait one deadline per loop. - time.Sleep(time.Duration(dlInfo.WPoStChallengeWindow) * blockTime) + require.Less(t, 50000, int(si.Expiration)) } + + waitForSectorActive(ctx, t, CCUpgrade, client, maddr) + waitForSectorActive(ctx, t, CCUpgrade+1, client, maddr) + waitForSectorActive(ctx, t, CCUpgrade+2, client, maddr) + + err = miner.SectorMarkForUpgrade(ctx, CCUpgrade, true) + require.NoError(t, err) + err = miner.SectorMarkForUpgrade(ctx, CCUpgrade+1, true) + require.NoError(t, err) + + err = miner.SectorMarkForUpgrade(ctx, CCUpgrade+2, true) + require.Error(t, err) + assert.Contains(t, err.Error(), "no free resources to wait for deals") + } diff --git a/itests/kit/blockminer.go b/itests/kit/blockminer.go index 2c9bd47c6cf..c1061b5585a 100644 --- a/itests/kit/blockminer.go +++ b/itests/kit/blockminer.go @@ -1,13 +1,18 @@ package kit import ( + "bytes" "context" "sync" "sync/atomic" "testing" "time" + "github.com/filecoin-project/go-bitfield" "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/lotus/api" + aminer "github.com/filecoin-project/lotus/chain/actors/builtin/miner" + "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/miner" "github.com/stretchr/testify/require" ) @@ -30,6 +35,138 @@ func NewBlockMiner(t *testing.T, miner *TestMiner) *BlockMiner { } } +type partitionTracker struct { + partitions []api.Partition + posted bitfield.BitField +} + +func newPartitionTracker(ctx context.Context, dlIdx uint64, bm *BlockMiner) *partitionTracker { + dlines, err := bm.miner.FullNode.StateMinerDeadlines(ctx, bm.miner.ActorAddr, types.EmptyTSK) + require.NoError(bm.t, err) + dl := dlines[dlIdx] + + parts, err := bm.miner.FullNode.StateMinerPartitions(ctx, bm.miner.ActorAddr, dlIdx, types.EmptyTSK) + require.NoError(bm.t, err) + return &partitionTracker{ + partitions: parts, + posted: dl.PostSubmissions, + } +} + +func (p *partitionTracker) count(t *testing.T) uint64 { + pCnt, err := p.posted.Count() + require.NoError(t, err) + return pCnt +} + +func (p *partitionTracker) done(t *testing.T) bool { + return uint64(len(p.partitions)) == p.count(t) +} + +func (p *partitionTracker) recordIfPost(t *testing.T, bm *BlockMiner, smsg *types.SignedMessage) (ret bool) { + defer func() { + ret = p.done(t) + }() + msg := smsg.Message + if !(msg.To == bm.miner.ActorAddr) { + return + } + if msg.Method != aminer.Methods.SubmitWindowedPoSt { + return + } + params := aminer.SubmitWindowedPoStParams{} + require.NoError(t, params.UnmarshalCBOR(bytes.NewReader(msg.Params))) + for _, part := range params.Partitions { + p.posted.Set(part.Index) + } + return +} + +// Like MineBlocks but refuses to mine until the window post scheduler has wdpost messages in the mempool +// and everything shuts down if a post fails +func (bm *BlockMiner) MineBlocksMustPost(ctx context.Context, blocktime time.Duration) { + + time.Sleep(time.Second) + + // wrap context in a cancellable context. + ctx, bm.cancel = context.WithCancel(ctx) + bm.wg.Add(1) + go func() { + defer bm.wg.Done() + + activeDeadlines := make(map[int]struct{}) + _ = activeDeadlines + + for { + select { + case <-time.After(blocktime): + case <-ctx.Done(): + return + } + nulls := atomic.SwapInt64(&bm.nextNulls, 0) + require.Equal(bm.t, int64(0), nulls, "Injecting > 0 null blocks while `MustPost` mining is currently unsupported") + + // Wake up and figure out if we are at the end of an active deadline + ts, err := bm.miner.FullNode.ChainHead(ctx) + require.NoError(bm.t, err) + tsk := ts.Key() + dlinfo, err := bm.miner.FullNode.StateMinerProvingDeadline(ctx, bm.miner.ActorAddr, tsk) + require.NoError(bm.t, err) + if ts.Height()+1 == dlinfo.Last() { // Last epoch in dline, we need to check that miner has posted + + tracker := newPartitionTracker(ctx, dlinfo.Index, bm) + if !tracker.done(bm.t) { // need to wait for post + bm.t.Logf("expect %d partitions proved but only see %d", len(tracker.partitions), tracker.count(bm.t)) + poolEvts, err := bm.miner.FullNode.MpoolSub(ctx) + require.NoError(bm.t, err) + + // First check pending messages we'll mine this epoch + msgs, err := bm.miner.FullNode.MpoolPending(ctx, types.EmptyTSK) + require.NoError(bm.t, err) + for _, msg := range msgs { + tracker.recordIfPost(bm.t, bm, msg) + } + + // post not yet in mpool, wait for it + if !tracker.done(bm.t) { + bm.t.Logf("post missing from mpool, block mining suspended until it arrives") + POOL: + for { + select { + case <-ctx.Done(): + return + case evt := <-poolEvts: + if evt.Type == api.MpoolAdd { + bm.t.Logf("incoming message %v", evt.Message) + if tracker.recordIfPost(bm.t, bm, evt.Message) { + break POOL + } + } + } + } + + } + + } + + } + + err = bm.miner.MineOne(ctx, miner.MineReq{ + InjectNulls: abi.ChainEpoch(nulls), + Done: func(bool, abi.ChainEpoch, error) {}, + }) + switch { + case err == nil: // wrap around + case ctx.Err() != nil: // context fired. + return + default: // log error + bm.t.Error(err) + } + } + }() + +} + func (bm *BlockMiner) MineBlocks(ctx context.Context, blocktime time.Duration) { time.Sleep(time.Second) diff --git a/itests/kit/deals.go b/itests/kit/deals.go index 29da37c15bd..f8de14d624a 100644 --- a/itests/kit/deals.go +++ b/itests/kit/deals.go @@ -104,8 +104,9 @@ func (dh *DealHarness) MakeOnlineDeal(ctx context.Context, params MakeFullDealPa // TODO: this sleep is only necessary because deals don't immediately get logged in the dealstore, we should fix this time.Sleep(time.Second) + fmt.Printf("WAIT DEAL SEALEDS START\n") dh.WaitDealSealed(ctx, deal, false, false, nil) - + fmt.Printf("WAIT DEAL SEALEDS END\n") return deal, res, path } @@ -176,6 +177,7 @@ loop: cb() } } + fmt.Printf("WAIT DEAL SEALED LOOP BROKEN\n") } // WaitDealSealedQuiet waits until the deal is sealed, without logging anything. @@ -290,12 +292,11 @@ func (dh *DealHarness) WaitDealPublished(ctx context.Context, deal *cid.Cid) { func (dh *DealHarness) StartSealingWaiting(ctx context.Context) { snums, err := dh.main.SectorsList(ctx) require.NoError(dh.t, err) - for _, snum := range snums { si, err := dh.main.SectorsStatus(ctx, snum, false) require.NoError(dh.t, err) - dh.t.Logf("Sector state: %s", si.State) + dh.t.Logf("Sector state <%d>-[%d]:, %s", snum, si.SealProof, si.State) if si.State == api.SectorState(sealing.WaitDeals) { require.NoError(dh.t, dh.main.SectorStartSealing(ctx, snum)) } diff --git a/itests/kit/ensemble.go b/itests/kit/ensemble.go index 2a6d16a951c..dfd3d8cd74a 100644 --- a/itests/kit/ensemble.go +++ b/itests/kit/ensemble.go @@ -675,6 +675,43 @@ func (n *Ensemble) Connect(from api.Net, to ...api.Net) *Ensemble { return n } +func (n *Ensemble) BeginMiningMustPost(blocktime time.Duration, miners ...*TestMiner) []*BlockMiner { + ctx := context.Background() + + // wait one second to make sure that nodes are connected and have handshaken. + // TODO make this deterministic by listening to identify events on the + // libp2p eventbus instead (or something else). + time.Sleep(1 * time.Second) + + var bms []*BlockMiner + if len(miners) == 0 { + // no miners have been provided explicitly, instantiate block miners + // for all active miners that aren't still mining. + for _, m := range n.active.miners { + if _, ok := n.active.bms[m]; ok { + continue // skip, already have a block miner + } + miners = append(miners, m) + } + } + + if len(miners) > 1 { + n.t.Fatalf("Only one active miner for MustPost, but have %d", len(miners)) + } + + for _, m := range miners { + bm := NewBlockMiner(n.t, m) + bm.MineBlocksMustPost(ctx, blocktime) + n.t.Cleanup(bm.Stop) + + bms = append(bms, bm) + + n.active.bms[m] = bm + } + + return bms +} + // BeginMining kicks off mining for the specified miners. If nil or 0-length, // it will kick off mining for all enrolled and active miners. It also adds a // cleanup function to stop all mining operations on test teardown. diff --git a/markets/storageadapter/ondealsectorcommitted.go b/markets/storageadapter/ondealsectorcommitted.go index 4cd0a2d681d..94eaadef4ca 100644 --- a/markets/storageadapter/ondealsectorcommitted.go +++ b/markets/storageadapter/ondealsectorcommitted.go @@ -5,6 +5,7 @@ import ( "context" "sync" + "github.com/filecoin-project/go-bitfield" sealing "github.com/filecoin-project/lotus/extern/storage-sealing" "github.com/ipfs/go-cid" "golang.org/x/xerrors" @@ -110,7 +111,7 @@ func (mgr *SectorCommittedManager) OnDealSectorPreCommitted(ctx context.Context, // Watch for a pre-commit message to the provider. matchEvent := func(msg *types.Message) (bool, error) { - matched := msg.To == provider && (msg.Method == miner.Methods.PreCommitSector || msg.Method == miner.Methods.PreCommitSectorBatch) + matched := msg.To == provider && (msg.Method == miner.Methods.PreCommitSector || msg.Method == miner.Methods.PreCommitSectorBatch || msg.Method == miner.Methods.ProveReplicaUpdates) return matched, nil } @@ -145,6 +146,20 @@ func (mgr *SectorCommittedManager) OnDealSectorPreCommitted(ctx context.Context, return false, err } + // If this is a replica update method that succeeded the deal is active + if msg.Method == miner.Methods.ProveReplicaUpdates { + sn, err := dealSectorInReplicaUpdateSuccess(msg, rec, res) + if err != nil { + return false, err + } + if sn != nil { + cb(*sn, true, nil) + return false, nil + } + // Didn't find the deal ID in this message, so keep looking + return true, nil + } + // Extract the message parameters sn, err := dealSectorInPreCommitMsg(msg, res) if err != nil { @@ -264,6 +279,42 @@ func (mgr *SectorCommittedManager) OnDealSectorCommitted(ctx context.Context, pr return nil } +func dealSectorInReplicaUpdateSuccess(msg *types.Message, rec *types.MessageReceipt, res sealing.CurrentDealInfo) (*abi.SectorNumber, error) { + var params miner.ProveReplicaUpdatesParams + if err := params.UnmarshalCBOR(bytes.NewReader(msg.Params)); err != nil { + return nil, xerrors.Errorf("unmarshal prove replica update: %w", err) + } + + var seekUpdate miner.ReplicaUpdate + var found bool + for _, update := range params.Updates { + for _, did := range update.Deals { + if did == res.DealID { + seekUpdate = update + found = true + break + } + } + } + if !found { + return nil, nil + } + + // check that this update passed validation steps + var successBf bitfield.BitField + if err := successBf.UnmarshalCBOR(bytes.NewReader(rec.Return)); err != nil { + return nil, xerrors.Errorf("unmarshal return value: %w", err) + } + success, err := successBf.IsSet(uint64(seekUpdate.SectorID)) + if err != nil { + return nil, xerrors.Errorf("failed to check success of replica update: %w", err) + } + if !success { + return nil, xerrors.Errorf("replica update %d failed", seekUpdate.SectorID) + } + return &seekUpdate.SectorID, nil +} + // dealSectorInPreCommitMsg tries to find a sector containing the specified deal func dealSectorInPreCommitMsg(msg *types.Message, res sealing.CurrentDealInfo) (*abi.SectorNumber, error) { switch msg.Method { diff --git a/miner/miner.go b/miner/miner.go index c5f0a012956..976e9ca6ff8 100644 --- a/miner/miner.go +++ b/miner/miner.go @@ -535,8 +535,12 @@ func (m *Miner) mineOne(ctx context.Context, base *MiningBase) (minedBlock *type prand := abi.PoStRandomness(rand) tSeed := build.Clock.Now() + nv, err := m.api.StateNetworkVersion(ctx, base.TipSet.Key()) + if err != nil { + return nil, err + } - postProof, err := m.epp.ComputeProof(ctx, mbi.Sectors, prand) + postProof, err := m.epp.ComputeProof(ctx, mbi.Sectors, prand, round, nv) if err != nil { err = xerrors.Errorf("failed to compute winning post proof: %w", err) return nil, err diff --git a/miner/warmup.go b/miner/warmup.go index 991679c0936..be5ac3ea7d7 100644 --- a/miner/warmup.go +++ b/miner/warmup.go @@ -10,8 +10,7 @@ import ( "github.com/filecoin-project/go-bitfield" "github.com/filecoin-project/go-state-types/abi" - - proof2 "github.com/filecoin-project/specs-actors/v2/actors/runtime/proof" + proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" "github.com/filecoin-project/lotus/chain/types" ) @@ -61,13 +60,22 @@ out: return xerrors.Errorf("getting sector info: %w", err) } - _, err = m.epp.ComputeProof(ctx, []proof2.SectorInfo{ + ts, err := m.api.ChainHead(ctx) + if err != nil { + return xerrors.Errorf("getting chain head") + } + nv, err := m.api.StateNetworkVersion(ctx, ts.Key()) + if err != nil { + return xerrors.Errorf("getting network version") + } + + _, err = m.epp.ComputeProof(ctx, []proof7.ExtendedSectorInfo{ { SealProof: si.SealProof, SectorNumber: sector, SealedCID: si.SealedCID, }, - }, r) + }, r, ts.Height(), nv) if err != nil { return xerrors.Errorf("failed to compute proof: %w", err) } diff --git a/node/config/def.go b/node/config/def.go index 4a525e697c9..9c39c197ce5 100644 --- a/node/config/def.go +++ b/node/config/def.go @@ -109,10 +109,11 @@ func DefaultStorageMiner() *StorageMiner { AvailableBalanceBuffer: types.FIL(big.Zero()), DisableCollateralFallback: false, - BatchPreCommits: true, - MaxPreCommitBatch: miner5.PreCommitSectorBatchMaxSize, // up to 256 sectors - PreCommitBatchWait: Duration(24 * time.Hour), // this should be less than 31.5 hours, which is the expiration of a precommit ticket - PreCommitBatchSlack: Duration(3 * time.Hour), // time buffer for forceful batch submission before sectors/deals in batch would start expiring, higher value will lower the chances for message fail due to expiration + BatchPreCommits: true, + MaxPreCommitBatch: miner5.PreCommitSectorBatchMaxSize, // up to 256 sectors + PreCommitBatchWait: Duration(24 * time.Hour), // this should be less than 31.5 hours, which is the expiration of a precommit ticket + // XXX snap deals wait deals slack if first + PreCommitBatchSlack: Duration(3 * time.Hour), // time buffer for forceful batch submission before sectors/deals in batch would start expiring, higher value will lower the chances for message fail due to expiration CommittedCapacitySectorLifetime: Duration(builtin.EpochDurationSeconds * uint64(policy.GetMaxSectorExpirationExtension()) * uint64(time.Second)), @@ -131,11 +132,13 @@ func DefaultStorageMiner() *StorageMiner { }, Storage: sectorstorage.SealerConfig{ - AllowAddPiece: true, - AllowPreCommit1: true, - AllowPreCommit2: true, - AllowCommit: true, - AllowUnseal: true, + AllowAddPiece: true, + AllowPreCommit1: true, + AllowPreCommit2: true, + AllowCommit: true, + AllowUnseal: true, + AllowReplicaUpdate: true, + AllowProveReplicaUpdate2: true, // Default to 10 - tcp should still be able to figure this out, and // it's the ratio between 10gbit / 1gbit diff --git a/node/impl/storminer.go b/node/impl/storminer.go index 764e4fb3666..3ebac1409f1 100644 --- a/node/impl/storminer.go +++ b/node/impl/storminer.go @@ -37,6 +37,7 @@ 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/network" sectorstorage "github.com/filecoin-project/lotus/extern/sector-storage" "github.com/filecoin-project/lotus/extern/sector-storage/fsutil" @@ -386,8 +387,8 @@ func (sm *StorageMinerAPI) SectorPreCommitPending(ctx context.Context) ([]abi.Se return sm.Miner.SectorPreCommitPending(ctx) } -func (sm *StorageMinerAPI) SectorMarkForUpgrade(ctx context.Context, id abi.SectorNumber) error { - return sm.Miner.MarkForUpgrade(id) +func (sm *StorageMinerAPI) SectorMarkForUpgrade(ctx context.Context, id abi.SectorNumber, snap bool) error { + return sm.Miner.MarkForUpgrade(ctx, id, snap) } func (sm *StorageMinerAPI) SectorCommitFlush(ctx context.Context) ([]sealiface.CommitBatchRes, error) { @@ -398,6 +399,10 @@ func (sm *StorageMinerAPI) SectorCommitPending(ctx context.Context) ([]abi.Secto return sm.Miner.CommitPending(ctx) } +func (sm *StorageMinerAPI) SectorMatchPendingPiecesToOpenSectors(ctx context.Context) error { + return sm.Miner.SectorMatchPendingPiecesToOpenSectors(ctx) +} + func (sm *StorageMinerAPI) WorkerConnect(ctx context.Context, url string) error { w, err := connectRemoteWorker(ctx, sm, url) if err != nil { @@ -1155,8 +1160,8 @@ func (sm *StorageMinerAPI) Discover(ctx context.Context) (apitypes.OpenRPCDocume return build.OpenRPCDiscoverJSON_Miner(), nil } -func (sm *StorageMinerAPI) ComputeProof(ctx context.Context, ssi []builtin.SectorInfo, rand abi.PoStRandomness) ([]builtin.PoStProof, error) { - return sm.Epp.ComputeProof(ctx, ssi, rand) +func (sm *StorageMinerAPI) ComputeProof(ctx context.Context, ssi []builtin.ExtendedSectorInfo, rand abi.PoStRandomness, poStEpoch abi.ChainEpoch, nv network.Version) ([]builtin.PoStProof, error) { + return sm.Epp.ComputeProof(ctx, ssi, rand, poStEpoch, nv) } func (sm *StorageMinerAPI) RuntimeSubsystems(context.Context) (res api.MinerSubsystems, err error) { diff --git a/storage/adapter_storage_miner.go b/storage/adapter_storage_miner.go index 0b4b17f9670..01ff9d8d3a4 100644 --- a/storage/adapter_storage_miner.go +++ b/storage/adapter_storage_miner.go @@ -112,6 +112,15 @@ func (s SealingAPIAdapter) StateMinerSectorAllocated(ctx context.Context, maddr return s.delegate.StateMinerSectorAllocated(ctx, maddr, sid, tsk) } +func (s SealingAPIAdapter) StateMinerActiveSectors(ctx context.Context, maddr address.Address, tok sealing.TipSetToken) ([]*miner.SectorOnChainInfo, error) { + tsk, err := types.TipSetKeyFromBytes(tok) + if err != nil { + return nil, xerrors.Errorf("faile dto unmarshal TipSetToken to TipSetKey: %w", err) + } + + return s.delegate.StateMinerActiveSectors(ctx, maddr, tsk) +} + func (s SealingAPIAdapter) StateWaitMsg(ctx context.Context, mcid cid.Cid) (sealing.MsgLookup, error) { wmsg, err := s.delegate.StateWaitMsg(ctx, mcid, build.MessageConfidence, api.LookbackNoLimit, true) if err != nil { diff --git a/storage/miner.go b/storage/miner.go index 0b1f6684026..c52b786eef1 100644 --- a/storage/miner.go +++ b/storage/miner.go @@ -86,6 +86,7 @@ type fullNodeFilteredAPI interface { StateSectorPartition(ctx context.Context, maddr address.Address, sectorNumber abi.SectorNumber, tok types.TipSetKey) (*miner.SectorLocation, error) StateMinerInfo(context.Context, address.Address, types.TipSetKey) (miner.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) @@ -282,7 +283,7 @@ func (wpp *StorageWpp) GenerateCandidates(ctx context.Context, randomness abi.Po return cds, nil } -func (wpp *StorageWpp) ComputeProof(ctx context.Context, ssi []builtin.SectorInfo, rand abi.PoStRandomness) ([]builtin.PoStProof, error) { +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 } diff --git a/storage/miner_sealing.go b/storage/miner_sealing.go index 01b9546a680..d8ef26835c1 100644 --- a/storage/miner_sealing.go +++ b/storage/miner_sealing.go @@ -71,8 +71,15 @@ func (m *Miner) CommitPending(ctx context.Context) ([]abi.SectorID, error) { return m.sealing.CommitPending(ctx) } -func (m *Miner) MarkForUpgrade(id abi.SectorNumber) error { - return m.sealing.MarkForUpgrade(id) +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 m.sealing.MarkForUpgrade(ctx, id) } func (m *Miner) IsMarkedForUpgrade(id abi.SectorNumber) bool { diff --git a/storage/wdpost_changehandler_test.go b/storage/wdpost_changehandler_test.go index a2283cb7cc2..2fcbe770e58 100644 --- a/storage/wdpost_changehandler_test.go +++ b/storage/wdpost_changehandler_test.go @@ -117,7 +117,7 @@ func (m *mockAPI) startGeneratePoST( completeGeneratePoST CompleteGeneratePoSTCb, ) context.CancelFunc { ctx, cancel := context.WithCancel(ctx) - + log.Errorf("mock posting\n") m.statesLk.Lock() defer m.statesLk.Unlock() m.postStates[deadline.Open] = postStatusProving diff --git a/storage/wdpost_run.go b/storage/wdpost_run.go index 83802a7f325..6a86656c732 100644 --- a/storage/wdpost_run.go +++ b/storage/wdpost_run.go @@ -19,8 +19,8 @@ import ( "go.opencensus.io/trace" "golang.org/x/xerrors" - proof2 "github.com/filecoin-project/specs-actors/v2/actors/runtime/proof" "github.com/filecoin-project/specs-actors/v3/actors/runtime/proof" + proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/build" @@ -568,7 +568,7 @@ func (s *WindowPoStScheduler) runPoStCycle(ctx context.Context, di dline.Info, t for retries := 0; ; retries++ { skipCount := uint64(0) var partitions []miner.PoStPartition - var sinfos []proof2.SectorInfo + var xsinfos []proof7.ExtendedSectorInfo for partIdx, partition := range batch { // TODO: Can do this in parallel toProve, err := bitfield.SubtractBitField(partition.LiveSectors, partition.FaultySectors) @@ -611,14 +611,14 @@ func (s *WindowPoStScheduler) runPoStCycle(ctx context.Context, di dline.Info, t continue } - sinfos = append(sinfos, ssi...) + xsinfos = append(xsinfos, ssi...) partitions = append(partitions, miner.PoStPartition{ Index: uint64(batchPartitionStartIdx + partIdx), Skipped: skipped, }) } - if len(sinfos) == 0 { + if len(xsinfos) == 0 { // nothing to prove for this batch break } @@ -637,14 +637,22 @@ func (s *WindowPoStScheduler) runPoStCycle(ctx context.Context, di dline.Info, t return nil, err } - postOut, ps, err := s.prover.GenerateWindowPoSt(ctx, abi.ActorID(mid), sinfos, append(abi.PoStRandomness{}, rand...)) + defer func() { + if r := recover(); r != nil { + log.Errorf("recover: %s", r) + } + }() + postOut, ps, err := s.prover.GenerateWindowPoSt(ctx, abi.ActorID(mid), xsinfos, append(abi.PoStRandomness{}, rand...)) elapsed := time.Since(tsStart) - log.Infow("computing window post", "batch", batchIdx, "elapsed", elapsed) - + if err != nil { + log.Errorf("error generating window post: %s", err) + } if err == nil { + // If we proved nothing, something is very wrong. if len(postOut) == 0 { + log.Errorf("len(postOut) == 0") return nil, xerrors.Errorf("received no proofs back from generate window post") } @@ -665,6 +673,14 @@ func (s *WindowPoStScheduler) runPoStCycle(ctx context.Context, di dline.Info, t } // If we generated an incorrect proof, try again. + sinfos := make([]proof7.SectorInfo, len(xsinfos)) + for i, xsi := range xsinfos { + sinfos[i] = proof7.SectorInfo{ + SealProof: xsi.SealProof, + SectorNumber: xsi.SectorNumber, + SealedCID: xsi.SealedCID, + } + } if correct, err := s.verifier.VerifyWindowPoSt(ctx, proof.WindowPoStVerifyInfo{ Randomness: abi.PoStRandomness(checkRand), Proofs: postOut, @@ -687,7 +703,7 @@ func (s *WindowPoStScheduler) runPoStCycle(ctx context.Context, di dline.Info, t } // Proof generation failed, so retry - + log.Debugf("Proof generation failed, retry") if len(ps) == 0 { // If we didn't skip any new sectors, we failed // for some other reason and we need to abort. @@ -715,10 +731,8 @@ func (s *WindowPoStScheduler) runPoStCycle(ctx context.Context, di dline.Info, t if !somethingToProve { continue } - posts = append(posts, params) } - return posts, nil } @@ -767,7 +781,7 @@ func (s *WindowPoStScheduler) batchPartitions(partitions []api.Partition, nv net return batches, nil } -func (s *WindowPoStScheduler) sectorsForProof(ctx context.Context, goodSectors, allSectors bitfield.BitField, ts *types.TipSet) ([]proof2.SectorInfo, error) { +func (s *WindowPoStScheduler) sectorsForProof(ctx context.Context, goodSectors, allSectors bitfield.BitField, ts *types.TipSet) ([]proof7.ExtendedSectorInfo, error) { sset, err := s.api.StateMinerSectors(ctx, s.actor, &goodSectors, ts.Key()) if err != nil { return nil, err @@ -777,22 +791,24 @@ func (s *WindowPoStScheduler) sectorsForProof(ctx context.Context, goodSectors, return nil, nil } - substitute := proof2.SectorInfo{ + substitute := proof7.ExtendedSectorInfo{ SectorNumber: sset[0].SectorNumber, SealedCID: sset[0].SealedCID, SealProof: sset[0].SealProof, + SectorKey: sset[0].SectorKeyCID, } - sectorByID := make(map[uint64]proof2.SectorInfo, len(sset)) + sectorByID := make(map[uint64]proof7.ExtendedSectorInfo, len(sset)) for _, sector := range sset { - sectorByID[uint64(sector.SectorNumber)] = proof2.SectorInfo{ + sectorByID[uint64(sector.SectorNumber)] = proof7.ExtendedSectorInfo{ SectorNumber: sector.SectorNumber, SealedCID: sector.SealedCID, SealProof: sector.SealProof, + SectorKey: sector.SectorKeyCID, } } - proofSectors := make([]proof2.SectorInfo, 0, len(sset)) + proofSectors := make([]proof7.ExtendedSectorInfo, 0, len(sset)) if err := allSectors.ForEach(func(sectorNo uint64) error { if info, found := sectorByID[sectorNo]; found { proofSectors = append(proofSectors, info) diff --git a/storage/wdpost_run_test.go b/storage/wdpost_run_test.go index 9ece295caa9..feeaab6ede0 100644 --- a/storage/wdpost_run_test.go +++ b/storage/wdpost_run_test.go @@ -116,11 +116,11 @@ func (m *mockStorageMinerAPI) GasEstimateFeeCap(context.Context, *types.Message, type mockProver struct { } -func (m *mockProver) GenerateWinningPoSt(context.Context, abi.ActorID, []proof2.SectorInfo, abi.PoStRandomness) ([]proof2.PoStProof, error) { +func (m *mockProver) GenerateWinningPoSt(context.Context, abi.ActorID, []proof7.ExtendedSectorInfo, abi.PoStRandomness) ([]proof2.PoStProof, error) { panic("implement me") } -func (m *mockProver) GenerateWindowPoSt(ctx context.Context, aid abi.ActorID, sis []proof2.SectorInfo, pr abi.PoStRandomness) ([]proof2.PoStProof, []abi.SectorID, error) { +func (m *mockProver) GenerateWindowPoSt(ctx context.Context, aid abi.ActorID, sis []proof7.ExtendedSectorInfo, pr abi.PoStRandomness) ([]proof2.PoStProof, []abi.SectorID, error) { return []proof2.PoStProof{ { PoStProof: abi.RegisteredPoStProof_StackedDrgWindow2KiBV1, @@ -132,7 +132,7 @@ func (m *mockProver) GenerateWindowPoSt(ctx context.Context, aid abi.ActorID, si type mockVerif struct { } -func (m mockVerif) VerifyWinningPoSt(ctx context.Context, info proof2.WinningPoStVerifyInfo) (bool, error) { +func (m mockVerif) VerifyWinningPoSt(ctx context.Context, info proof7.WinningPoStVerifyInfo, currEpoch abi.ChainEpoch, nv network.Version) (bool, error) { panic("implement me") } From f59bfd65da38445d1b5ab160ea9258e135d67bf8 Mon Sep 17 00:00:00 2001 From: zenground0 Date: Wed, 5 Jan 2022 08:24:46 -0500 Subject: [PATCH 171/393] Deflake snap deals integration test --- itests/kit/blockminer.go | 70 ++++++++++++++++++++++++++++++++++------ 1 file changed, 61 insertions(+), 9 deletions(-) diff --git a/itests/kit/blockminer.go b/itests/kit/blockminer.go index c1061b5585a..878f4a6630b 100644 --- a/itests/kit/blockminer.go +++ b/itests/kit/blockminer.go @@ -83,10 +83,10 @@ func (p *partitionTracker) recordIfPost(t *testing.T, bm *BlockMiner, smsg *type } // Like MineBlocks but refuses to mine until the window post scheduler has wdpost messages in the mempool -// and everything shuts down if a post fails +// and everything shuts down if a post fails. It also enforces that every block mined succeeds func (bm *BlockMiner) MineBlocksMustPost(ctx context.Context, blocktime time.Duration) { - time.Sleep(time.Second) + time.Sleep(3 * time.Second) // wrap context in a cancellable context. ctx, bm.cancel = context.WithCancel(ctx) @@ -96,7 +96,20 @@ func (bm *BlockMiner) MineBlocksMustPost(ctx context.Context, blocktime time.Dur activeDeadlines := make(map[int]struct{}) _ = activeDeadlines - + ts, err := bm.miner.FullNode.ChainHead(ctx) + require.NoError(bm.t, err) + wait := make(chan bool) + reportSuccessFn := func(success bool, epoch abi.ChainEpoch, err error) { + bm.t.Logf("done with mine one at epoch %d, success %t", epoch, success) + require.NoError(bm.t, err) + wait <- success + } + chg, err := bm.miner.FullNode.ChainNotify(ctx) + require.NoError(bm.t, err) + // read current out + curr := <-chg + require.Equal(bm.t, ts.Height(), curr[0].Val.Height()) + numMined := curr[0].Val.Height() for { select { case <-time.After(blocktime): @@ -110,6 +123,7 @@ func (bm *BlockMiner) MineBlocksMustPost(ctx context.Context, blocktime time.Dur ts, err := bm.miner.FullNode.ChainHead(ctx) require.NoError(bm.t, err) tsk := ts.Key() + bm.t.Logf("Miner sees head ts: %s at height %d, num mined = %d", tsk, ts.Height(), numMined) dlinfo, err := bm.miner.FullNode.StateMinerProvingDeadline(ctx, bm.miner.ActorAddr, tsk) require.NoError(bm.t, err) if ts.Height()+1 == dlinfo.Last() { // Last epoch in dline, we need to check that miner has posted @@ -132,10 +146,12 @@ func (bm *BlockMiner) MineBlocksMustPost(ctx context.Context, blocktime time.Dur bm.t.Logf("post missing from mpool, block mining suspended until it arrives") POOL: for { + bm.t.Logf("mpool event wait loop at block height %d, ts: %s", ts.Height(), ts.Key()) select { case <-ctx.Done(): return case evt := <-poolEvts: + bm.t.Logf("pool event: %d", evt.Type) if evt.Type == api.MpoolAdd { bm.t.Logf("incoming message %v", evt.Message) if tracker.recordIfPost(bm.t, bm, evt.Message) { @@ -144,17 +160,53 @@ func (bm *BlockMiner) MineBlocksMustPost(ctx context.Context, blocktime time.Dur } } } - + bm.t.Logf("done waiting on mpool") } - } + } + baseHeight := ts.Height() + + syncedToHeight := func(target abi.ChainEpoch) { + headChangeCh, err := bm.miner.FullNode.ChainNotify(ctx) + require.NoError(bm.t, err) + hccurrent, ok1 := <-headChangeCh + for !ok1 { + hccurrent, ok1 = <-headChangeCh + } + if hccurrent[0].Val.Height() >= target { + return + } + var ok2 bool + for { + var headChanges []*api.HeadChange + select { + case headChanges, ok2 = <-headChangeCh: + if !ok2 { // if channel is closed on us fail + bm.t.Log("channel closed") + bm.t.Fatal("chain notify channel closed while waiting to sync") + } + for _, hc := range headChanges { + if hc.Val.Height() >= target { + return + } + } + case <-ctx.Done(): + return + } + } } - err = bm.miner.MineOne(ctx, miner.MineReq{ - InjectNulls: abi.ChainEpoch(nulls), - Done: func(bool, abi.ChainEpoch, error) {}, - }) + var success bool + for i := int64(0); !success; i++ { + err = bm.miner.MineOne(ctx, miner.MineReq{ + InjectNulls: abi.ChainEpoch(nulls + i), + Done: reportSuccessFn, + }) + success = <-wait + } + syncedToHeight(baseHeight + 1) + numMined += 1 switch { case err == nil: // wrap around case ctx.Err() != nil: // context fired. From 3dc3f55ecb1df841792a04d72c9b692b825459e5 Mon Sep 17 00:00:00 2001 From: zenground0 Date: Fri, 7 Jan 2022 22:20:49 +0530 Subject: [PATCH 172/393] Deflake more practically --- itests/kit/blockminer.go | 62 ++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 38 deletions(-) diff --git a/itests/kit/blockminer.go b/itests/kit/blockminer.go index 878f4a6630b..91ddc2e26e0 100644 --- a/itests/kit/blockminer.go +++ b/itests/kit/blockminer.go @@ -99,17 +99,11 @@ func (bm *BlockMiner) MineBlocksMustPost(ctx context.Context, blocktime time.Dur ts, err := bm.miner.FullNode.ChainHead(ctx) require.NoError(bm.t, err) wait := make(chan bool) - reportSuccessFn := func(success bool, epoch abi.ChainEpoch, err error) { - bm.t.Logf("done with mine one at epoch %d, success %t", epoch, success) - require.NoError(bm.t, err) - wait <- success - } chg, err := bm.miner.FullNode.ChainNotify(ctx) require.NoError(bm.t, err) // read current out curr := <-chg require.Equal(bm.t, ts.Height(), curr[0].Val.Height()) - numMined := curr[0].Val.Height() for { select { case <-time.After(blocktime): @@ -123,7 +117,7 @@ func (bm *BlockMiner) MineBlocksMustPost(ctx context.Context, blocktime time.Dur ts, err := bm.miner.FullNode.ChainHead(ctx) require.NoError(bm.t, err) tsk := ts.Key() - bm.t.Logf("Miner sees head ts: %s at height %d, num mined = %d", tsk, ts.Height(), numMined) + dlinfo, err := bm.miner.FullNode.StateMinerProvingDeadline(ctx, bm.miner.ActorAddr, tsk) require.NoError(bm.t, err) if ts.Height()+1 == dlinfo.Last() { // Last epoch in dline, we need to check that miner has posted @@ -165,36 +159,11 @@ func (bm *BlockMiner) MineBlocksMustPost(ctx context.Context, blocktime time.Dur } } - baseHeight := ts.Height() - - syncedToHeight := func(target abi.ChainEpoch) { - headChangeCh, err := bm.miner.FullNode.ChainNotify(ctx) + var target abi.ChainEpoch + reportSuccessFn := func(success bool, epoch abi.ChainEpoch, err error) { require.NoError(bm.t, err) - hccurrent, ok1 := <-headChangeCh - for !ok1 { - hccurrent, ok1 = <-headChangeCh - } - if hccurrent[0].Val.Height() >= target { - return - } - var ok2 bool - for { - var headChanges []*api.HeadChange - select { - case headChanges, ok2 = <-headChangeCh: - if !ok2 { // if channel is closed on us fail - bm.t.Log("channel closed") - bm.t.Fatal("chain notify channel closed while waiting to sync") - } - for _, hc := range headChanges { - if hc.Val.Height() >= target { - return - } - } - case <-ctx.Done(): - return - } - } + target = epoch + wait <- success } var success bool @@ -205,8 +174,25 @@ func (bm *BlockMiner) MineBlocksMustPost(ctx context.Context, blocktime time.Dur }) success = <-wait } - syncedToHeight(baseHeight + 1) - numMined += 1 + + // Wait until it shows up on the given full nodes ChainHead + // TODO this replicates a flaky condition from MineUntil, + // it would be better to use api to wait for sync, + // but currently this is a bit difficult + // and flaky failure is easy to debug and retry + nloops := 200 + for i := 0; i < nloops; i++ { + ts, err := bm.miner.FullNode.ChainHead(ctx) + require.NoError(bm.t, err) + + if ts.Height() == target { + break + } + + require.NotEqual(bm.t, i, nloops-1, "block never managed to sync to node") + time.Sleep(time.Millisecond * 10) + } + switch { case err == nil: // wrap around case ctx.Err() != nil: // context fired. From c309686679c0a6c5158a700a91fd1c64e8081901 Mon Sep 17 00:00:00 2001 From: zenground0 Date: Sun, 9 Jan 2022 08:53:22 +0530 Subject: [PATCH 173/393] Fix TooManyMarkedForUpgrade --- extern/storage-sealing/upgrade_queue.go | 1 - itests/ccupgrade_test.go | 27 +++++++++++++++++++------ 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/extern/storage-sealing/upgrade_queue.go b/extern/storage-sealing/upgrade_queue.go index aab1e67b048..1aacc9c0808 100644 --- a/extern/storage-sealing/upgrade_queue.go +++ b/extern/storage-sealing/upgrade_queue.go @@ -107,7 +107,6 @@ func (m *Sealing) MarkForSnapUpgrade(ctx context.Context, id abi.SectorNumber) e "Upgrade expiration before marking for upgrade", id, onChainInfo.Expiration) } - log.Errorf("updating sector number %d", id) return m.sectors.Send(uint64(id), SectorStartCCUpdate{}) } diff --git a/itests/ccupgrade_test.go b/itests/ccupgrade_test.go index 487a15659c8..b63e96d24ab 100644 --- a/itests/ccupgrade_test.go +++ b/itests/ccupgrade_test.go @@ -9,6 +9,7 @@ import ( "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" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/itests/kit" @@ -33,7 +34,7 @@ func TestCCUpgrade(t *testing.T) { func runTestCCUpgrade(t *testing.T, upgradeHeight abi.ChainEpoch) *kit.TestFullNode { ctx := context.Background() - blockTime := 5 * time.Millisecond + blockTime := 1 * time.Millisecond client, miner, ens := kit.EnsembleMinimal(t, kit.GenesisNetworkVersion(network.Version15)) ens.InterconnectAll().BeginMiningMustPost(blockTime) @@ -50,7 +51,6 @@ func runTestCCUpgrade(t *testing.T, upgradeHeight abi.ChainEpoch) *kit.TestFullN // this gives max time for post to complete minimizing chances of timeout // waitForDeadline(ctx, t, 1, client, maddr) miner.PledgeSectors(ctx, 1, 0, nil) - sl, err := miner.SectorsList(ctx) require.NoError(t, err) require.Len(t, sl, 1, "expected 1 sector") @@ -60,7 +60,6 @@ func runTestCCUpgrade(t *testing.T, upgradeHeight abi.ChainEpoch) *kit.TestFullN require.NoError(t, err) require.Less(t, 50000, int(si.Expiration)) } - waitForSectorActive(ctx, t, CCUpgrade, client, maddr) err = miner.SectorMarkForUpgrade(ctx, sl[0], true) @@ -111,6 +110,18 @@ func waitForSectorActive(ctx context.Context, t *testing.T, sn abi.SectorNumber, } } +func waitForSectorStartUpgrade(ctx context.Context, t *testing.T, sn abi.SectorNumber, miner *kit.TestMiner) { + for { + si, err := miner.StorageMiner.SectorsStatus(ctx, sn, false) + require.NoError(t, err) + if si.State != api.SectorState("Proving") { + t.Logf("Done proving sector in state: %s", si.State) + return + } + + } +} + func TestCCUpgradeAndPoSt(t *testing.T) { kit.QuietMiningLogs() t.Run("upgrade and then post", func(t *testing.T) { @@ -120,6 +131,8 @@ func TestCCUpgradeAndPoSt(t *testing.T) { require.NoError(t, err) start := ts.Height() // wait for a full proving period + t.Log("waiting for chain") + n.WaitTillChain(ctx, func(ts *types.TipSet) bool { if ts.Height() > start+abi.ChainEpoch(2880) { return true @@ -133,10 +146,10 @@ func TestTooManyMarkedForUpgrade(t *testing.T) { kit.QuietMiningLogs() ctx := context.Background() - blockTime := 5 * time.Millisecond + blockTime := 1 * time.Millisecond client, miner, ens := kit.EnsembleMinimal(t, kit.GenesisNetworkVersion(network.Version15)) - ens.InterconnectAll().BeginMining(blockTime) + ens.InterconnectAll().BeginMiningMustPost(blockTime) maddr, err := miner.ActorAddress(ctx) if err != nil { @@ -166,8 +179,10 @@ func TestTooManyMarkedForUpgrade(t *testing.T) { err = miner.SectorMarkForUpgrade(ctx, CCUpgrade+1, true) require.NoError(t, err) + waitForSectorStartUpgrade(ctx, t, CCUpgrade, miner) + waitForSectorStartUpgrade(ctx, t, CCUpgrade+1, miner) + err = miner.SectorMarkForUpgrade(ctx, CCUpgrade+2, true) require.Error(t, err) assert.Contains(t, err.Error(), "no free resources to wait for deals") - } From 825e2c9527dba03a7c45160c40df39eda0a39647 Mon Sep 17 00:00:00 2001 From: zenground0 Date: Sun, 9 Jan 2022 09:12:00 +0530 Subject: [PATCH 174/393] doscgen cli --- documentation/en/cli-lotus-miner.md | 50 ++++++++++++------- documentation/en/cli-lotus-worker.md | 2 + .../en/default-lotus-miner-config.toml | 3 -- 3 files changed, 34 insertions(+), 21 deletions(-) diff --git a/documentation/en/cli-lotus-miner.md b/documentation/en/cli-lotus-miner.md index e609a8a0127..856202f7f09 100644 --- a/documentation/en/cli-lotus-miner.md +++ b/documentation/en/cli-lotus-miner.md @@ -1514,24 +1514,25 @@ USAGE: lotus-miner sectors command [command options] [arguments...] COMMANDS: - status Get the seal status of a sector by its number - list List sectors - 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 - check-expire Inspect expiring sectors - expired Get or cleanup expired sectors - renew Renew expiring sectors while not exceeding each sector's max life - extend Extend sector expiration - terminate Terminate sector on-chain then remove (WARNING: This means losing power and collateral for the removed sector) - remove Forcefully remove a sector (WARNING: This means losing power and collateral for the removed sector (use 'terminate' for lower penalty)) - snap-up Mark a committed capacity sector to be filled with deals - mark-for-upgrade Mark a committed capacity sector for replacement by a sector with deals - seal Manually start sealing a sector (filling any unused space with junk) - set-seal-delay Set the time, in minutes, that a new sector waits for deals before sealing starts - get-cc-collateral Get the collateral required to pledge a committed capacity sector - batching manage batch sector operations - help, h Shows a list of commands or help for one command + status Get the seal status of a sector by its number + list List sectors + 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 + check-expire Inspect expiring sectors + expired Get or cleanup expired sectors + renew Renew expiring sectors while not exceeding each sector's max life + extend Extend sector expiration + terminate Terminate sector on-chain then remove (WARNING: This means losing power and collateral for the removed sector) + remove Forcefully remove a sector (WARNING: This means losing power and collateral for the removed sector (use 'terminate' for lower penalty)) + snap-up Mark a committed capacity sector to be filled with deals + mark-for-upgrade Mark a committed capacity sector for replacement by a sector with deals + seal Manually start sealing a sector (filling any unused space with junk) + set-seal-delay Set the time, in minutes, that a new sector waits for deals before sealing starts + get-cc-collateral Get the collateral required to pledge a committed capacity sector + batching manage batch sector operations + match-pending-pieces force a refreshed match of pending pieces to open sectors without manually waiting for more deals + help, h Shows a list of commands or help for one command OPTIONS: --help, -h show help (default: false) @@ -1860,6 +1861,19 @@ OPTIONS: ``` +### lotus-miner sectors match-pending-pieces +``` +NAME: + lotus-miner sectors match-pending-pieces - force a refreshed match of pending pieces to open sectors without manually waiting for more deals + +USAGE: + lotus-miner sectors match-pending-pieces [command options] [arguments...] + +OPTIONS: + --help, -h show help (default: false) + +``` + ## lotus-miner proving ``` NAME: diff --git a/documentation/en/cli-lotus-worker.md b/documentation/en/cli-lotus-worker.md index ac133f9086a..c03a8e34261 100644 --- a/documentation/en/cli-lotus-worker.md +++ b/documentation/en/cli-lotus-worker.md @@ -44,6 +44,8 @@ OPTIONS: --unseal enable unsealing (32G sectors: 1 core, 128GiB Memory) (default: true) --precommit2 enable precommit2 (32G sectors: all cores, 96GiB Memory) (default: true) --commit enable commit (32G sectors: all cores or GPUs, 128GiB Memory + 64GiB swap) (default: true) + --replica-update enable replica update (default: true) + --prove-replica-update2 enable prove replica update 2 (default: true) --parallel-fetch-limit value maximum fetch operations to run in parallel (default: 5) --timeout value used when 'listen' is unspecified. must be a valid duration recognized by golang's time.ParseDuration function (default: "30m") --help, -h show help (default: false) diff --git a/documentation/en/default-lotus-miner-config.toml b/documentation/en/default-lotus-miner-config.toml index ced8e8a39a6..55ddbb0543e 100644 --- a/documentation/en/default-lotus-miner-config.toml +++ b/documentation/en/default-lotus-miner-config.toml @@ -427,9 +427,6 @@ # env var: LOTUS_STORAGE_ALLOWREPLICAUPDATE #AllowReplicaUpdate = true - # env var: LOTUS_STORAGE_ALLOWPROVEREPLICAUPDATE1 - #AllowProveReplicaUpdate1 = true - # env var: LOTUS_STORAGE_ALLOWPROVEREPLICAUPDATE2 #AllowProveReplicaUpdate2 = true From d16c5d0e93947921be09e5c4d5f302855a4bfeda Mon Sep 17 00:00:00 2001 From: zenground0 Date: Mon, 10 Jan 2022 15:47:20 +0530 Subject: [PATCH 175/393] Fix hande deal recover return value bug --- extern/storage-sealing/states_failed.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/extern/storage-sealing/states_failed.go b/extern/storage-sealing/states_failed.go index a93cda3f56e..0d7c08ce560 100644 --- a/extern/storage-sealing/states_failed.go +++ b/extern/storage-sealing/states_failed.go @@ -423,7 +423,7 @@ func (m *Sealing) handleRecoverDealIDsOrFailWith(ctx statemachine.Context, secto // TODO: check if we are in an early enough state try to remove this piece log.Errorf("can't fix sector deals: piece %d (of %d) of sector %d has nil DealInfo.PublishCid (refers to deal %d)", i, len(sector.Pieces), sector.SectorNumber, p.DealInfo.DealID) // Not much to do here (and this can only happen for old spacerace sectors) - return ctx.Send(SectorRemove{}) + return ctx.Send(failWith) } var dp *market.DealProposal @@ -458,7 +458,7 @@ func (m *Sealing) handleRecoverDealIDsOrFailWith(ctx statemachine.Context, secto if len(failed)+paddingPieces == len(sector.Pieces) { log.Errorf("removing sector %d: all deals expired or unrecoverable: %+v", sector.SectorNumber, merr) - return ctx.Send(SectorRemove{}) + return ctx.Send(failWith) } // todo: try to remove bad pieces (hard; see the todo above) @@ -466,7 +466,7 @@ func (m *Sealing) handleRecoverDealIDsOrFailWith(ctx statemachine.Context, secto // for now removing sectors is probably better than having them stuck in RecoverDealIDs // and expire anyways log.Errorf("removing sector %d: deals expired or unrecoverable: %+v", sector.SectorNumber, merr) - return ctx.Send(SectorRemove{}) + return ctx.Send(failWith) } // Not much to do here, we can't go back in time to commit this sector From 9614f6db8d64c444fc1a657f9bcbec2aab13f83b Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Mon, 10 Jan 2022 19:03:26 -0500 Subject: [PATCH 176/393] Update go-paramfetch --- go.mod | 2 +- go.sum | 4 ++-- testplans/lotus-soup/go.sum | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 551af628db5..8d399446332 100644 --- a/go.mod +++ b/go.mod @@ -39,7 +39,7 @@ require ( github.com/filecoin-project/go-fil-markets v1.14.1 github.com/filecoin-project/go-jsonrpc v0.1.5 github.com/filecoin-project/go-padreader v0.0.1 - github.com/filecoin-project/go-paramfetch v0.0.2 + github.com/filecoin-project/go-paramfetch v0.0.3-0.20220111000201-e42866db1a53 github.com/filecoin-project/go-state-types v0.1.1 github.com/filecoin-project/go-statemachine v1.0.1 github.com/filecoin-project/go-statestore v0.2.0 diff --git a/go.sum b/go.sum index 45625140b39..2d35878ce11 100644 --- a/go.sum +++ b/go.sum @@ -338,8 +338,8 @@ github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20/go.m github.com/filecoin-project/go-padreader v0.0.0-20210723183308-812a16dc01b1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= github.com/filecoin-project/go-padreader v0.0.1 h1:8h2tVy5HpoNbr2gBRr+WD6zV6VD6XHig+ynSGJg8ZOs= github.com/filecoin-project/go-padreader v0.0.1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= -github.com/filecoin-project/go-paramfetch v0.0.2 h1:a6W3Ij6CKhwHYYlx+5mqvBIyw4CabZH2ojdEaoAZ6/g= -github.com/filecoin-project/go-paramfetch v0.0.2/go.mod h1:1FH85P8U+DUEmWk1Jkw3Bw7FrwTVUNHk/95PSPG+dts= +github.com/filecoin-project/go-paramfetch v0.0.3-0.20220111000201-e42866db1a53 h1:+nripp+UI/rhl01w9Gs4V0XDGaVPYPMGU/D/gNVLue0= +github.com/filecoin-project/go-paramfetch v0.0.3-0.20220111000201-e42866db1a53/go.mod h1:1FH85P8U+DUEmWk1Jkw3Bw7FrwTVUNHk/95PSPG+dts= github.com/filecoin-project/go-state-types v0.0.0-20200903145444-247639ffa6ad/go.mod h1:IQ0MBPnonv35CJHtWSN3YY1Hz2gkPru1Q9qoaYLxx9I= github.com/filecoin-project/go-state-types v0.0.0-20200904021452-1883f36ca2f4/go.mod h1:IQ0MBPnonv35CJHtWSN3YY1Hz2gkPru1Q9qoaYLxx9I= github.com/filecoin-project/go-state-types v0.0.0-20200928172055-2df22083d8ab/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= diff --git a/testplans/lotus-soup/go.sum b/testplans/lotus-soup/go.sum index 210cf03ad82..2b150009a1f 100644 --- a/testplans/lotus-soup/go.sum +++ b/testplans/lotus-soup/go.sum @@ -429,8 +429,8 @@ github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20/go.m github.com/filecoin-project/go-padreader v0.0.0-20210723183308-812a16dc01b1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= github.com/filecoin-project/go-padreader v0.0.1 h1:8h2tVy5HpoNbr2gBRr+WD6zV6VD6XHig+ynSGJg8ZOs= github.com/filecoin-project/go-padreader v0.0.1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= -github.com/filecoin-project/go-paramfetch v0.0.2 h1:a6W3Ij6CKhwHYYlx+5mqvBIyw4CabZH2ojdEaoAZ6/g= -github.com/filecoin-project/go-paramfetch v0.0.2/go.mod h1:1FH85P8U+DUEmWk1Jkw3Bw7FrwTVUNHk/95PSPG+dts= +github.com/filecoin-project/go-paramfetch v0.0.3-0.20220111000201-e42866db1a53 h1:+nripp+UI/rhl01w9Gs4V0XDGaVPYPMGU/D/gNVLue0= +github.com/filecoin-project/go-paramfetch v0.0.3-0.20220111000201-e42866db1a53/go.mod h1:1FH85P8U+DUEmWk1Jkw3Bw7FrwTVUNHk/95PSPG+dts= github.com/filecoin-project/go-state-types v0.0.0-20200903145444-247639ffa6ad/go.mod h1:IQ0MBPnonv35CJHtWSN3YY1Hz2gkPru1Q9qoaYLxx9I= github.com/filecoin-project/go-state-types v0.0.0-20200904021452-1883f36ca2f4/go.mod h1:IQ0MBPnonv35CJHtWSN3YY1Hz2gkPru1Q9qoaYLxx9I= github.com/filecoin-project/go-state-types v0.0.0-20200928172055-2df22083d8ab/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= From fa8372a83bea385f29f0cc3eddf19795a346809a Mon Sep 17 00:00:00 2001 From: Jiaying Wang <42981373+jennijuju@users.noreply.github.com> Date: Mon, 10 Jan 2022 19:07:54 -0500 Subject: [PATCH 177/393] Update pull_request_template.md - remove misc, can use chore instead - add deps for area --- .github/pull_request_template.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index c6273f056c3..c806120b17b 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -14,8 +14,8 @@ Before you mark the PR ready for review, please make sure that: - [ ] All commits have a clear commit message. - [ ] The PR title is in the form of of `: : ` - example: ` fix: mempool: Introduce a cache for valid signatures` - - `PR type`: _fix_, _feat_, _INTERFACE BREAKING CHANGE_, _CONSENSUS BREAKING_, _build_, _chore_, _ci_, _docs_, _misc_,_perf_, _refactor_, _revert_, _style_, _test_ - - `area`: _api_, _chain_, _state_, _vm_, _data transfer_, _market_, _mempool_, _message_, _block production_, _multisig_, _networking_, _paychan_, _proving_, _sealing_, _wallet_ + - `PR type`: _fix_, _feat_, _INTERFACE BREAKING CHANGE_, _CONSENSUS BREAKING_, _build_, _chore_, _ci_, _docs_,_perf_, _refactor_, _revert_, _style_, _test_ + - `area`: _api_, _chain_, _state_, _vm_, _data transfer_, _market_, _mempool_, _message_, _block production_, _multisig_, _networking_, _paychan_, _proving_, _sealing_, _wallet_, _deps_ - [ ] This PR has tests for new functionality or change in behaviour - [ ] If new user-facing features are introduced, clear usage guidelines and / or documentation updates should be included in https://lotus.filecoin.io or [Discussion Tutorials.](https://github.com/filecoin-project/lotus/discussions/categories/tutorials) - [ ] CI is green From 655051ef98d17df9ae0d9bdf90044c391afc53af Mon Sep 17 00:00:00 2001 From: Jiaying Wang <42981373+jennijuju@users.noreply.github.com> Date: Mon, 10 Jan 2022 22:23:55 -0500 Subject: [PATCH 178/393] Update default-lotus-miner-config.toml --- documentation/en/default-lotus-miner-config.toml | 3 --- 1 file changed, 3 deletions(-) diff --git a/documentation/en/default-lotus-miner-config.toml b/documentation/en/default-lotus-miner-config.toml index ced8e8a39a6..55ddbb0543e 100644 --- a/documentation/en/default-lotus-miner-config.toml +++ b/documentation/en/default-lotus-miner-config.toml @@ -427,9 +427,6 @@ # env var: LOTUS_STORAGE_ALLOWREPLICAUPDATE #AllowReplicaUpdate = true - # env var: LOTUS_STORAGE_ALLOWPROVEREPLICAUPDATE1 - #AllowProveReplicaUpdate1 = true - # env var: LOTUS_STORAGE_ALLOWPROVEREPLICAUPDATE2 #AllowProveReplicaUpdate2 = true From 58edb1b15da322a07674cbf4f0c1fb1e55759de0 Mon Sep 17 00:00:00 2001 From: Jiaying Wang <42981373+jennijuju@users.noreply.github.com> Date: Mon, 10 Jan 2022 22:24:25 -0500 Subject: [PATCH 179/393] remove log change --- extern/storage-sealing/upgrade_queue.go | 1 - 1 file changed, 1 deletion(-) diff --git a/extern/storage-sealing/upgrade_queue.go b/extern/storage-sealing/upgrade_queue.go index 18d9c8272de..1aacc9c0808 100644 --- a/extern/storage-sealing/upgrade_queue.go +++ b/extern/storage-sealing/upgrade_queue.go @@ -107,7 +107,6 @@ func (m *Sealing) MarkForSnapUpgrade(ctx context.Context, id abi.SectorNumber) e "Upgrade expiration before marking for upgrade", id, onChainInfo.Expiration) } - log.Info("updating sector number %d", id) return m.sectors.Send(uint64(id), SectorStartCCUpdate{}) } From 5b7da270c9f5d081d98ffbfa8a35936856537f17 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Mon, 10 Jan 2022 23:45:04 -0500 Subject: [PATCH 180/393] Integrate proof v11.0.0 --- extern/filecoin-ffi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extern/filecoin-ffi b/extern/filecoin-ffi index 52d80081bfd..e660df5616e 160000 --- a/extern/filecoin-ffi +++ b/extern/filecoin-ffi @@ -1 +1 @@ -Subproject commit 52d80081bfdd8a30bc44bcfe44cb0f299615b9f3 +Subproject commit e660df5616e397b2d8ac316f45ddfa7a44637971 From 960759d22b17b74a9c7422a6104ed0a945893a91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 11 Jan 2022 17:31:27 +0100 Subject: [PATCH 181/393] address review --- api/version.go | 4 ++-- cmd/lotus-seal-worker/main.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/api/version.go b/api/version.go index 0be7de878bc..228dcbd10d3 100644 --- a/api/version.go +++ b/api/version.go @@ -54,8 +54,8 @@ func VersionForType(nodeType NodeType) (Version, error) { // semver versions of the rpc api exposed var ( - FullAPIVersion0 = newVer(1, 4, 0) - FullAPIVersion1 = newVer(2, 1, 0) + FullAPIVersion0 = newVer(1, 5, 0) + FullAPIVersion1 = newVer(2, 2, 0) MinerAPIVersion0 = newVer(1, 3, 0) WorkerAPIVersion0 = newVer(1, 5, 0) diff --git a/cmd/lotus-seal-worker/main.go b/cmd/lotus-seal-worker/main.go index e6d6c0b6f36..2e326e9c75d 100644 --- a/cmd/lotus-seal-worker/main.go +++ b/cmd/lotus-seal-worker/main.go @@ -261,7 +261,7 @@ var runCmd = &cli.Command{ var taskTypes []sealtasks.TaskType - taskTypes = append(taskTypes, sealtasks.TTFetch, sealtasks.TTCommit1, sealtasks.TTFinalize) + taskTypes = append(taskTypes, sealtasks.TTFetch, sealtasks.TTCommit1, sealtasks.TTProveReplicaUpdate1, sealtasks.TTFinalize) if cctx.Bool("addpiece") { taskTypes = append(taskTypes, sealtasks.TTAddPiece) From d645c5fbabe2c087c21058d7a5eeda09da7a0f0a Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 11 Jan 2022 11:53:14 -0500 Subject: [PATCH 182/393] Remove unnecessary params from VerifyWinningPost --- build/openrpc/worker.json.gz | Bin 3805 -> 3803 bytes chain/consensus/filcns/filecoin.go | 2 +- chain/gen/gen.go | 2 +- cmd/lotus-bench/caching_verifier.go | 6 +++--- cmd/lotus-bench/main.go | 4 ++-- cmd/lotus-sim/simulation/mock/mock.go | 3 +-- documentation/en/api-v0-methods-miner.md | 2 +- documentation/en/api-v0-methods-worker.md | 2 +- documentation/en/api-v0-methods.md | 2 +- documentation/en/api-v1-unstable-methods.md | 2 +- extern/sector-storage/ffiwrapper/types.go | 3 +-- .../sector-storage/ffiwrapper/verifier_cgo.go | 3 +-- extern/sector-storage/mock/mock.go | 3 +-- storage/wdpost_run_test.go | 2 +- testplans/lotus-soup/go.sum | 12 +++++------- 15 files changed, 21 insertions(+), 27 deletions(-) diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index c82ad677093007288784c12142827b97d9bd444d..edfabcc6b998b81113797881dd01f4390b022998 100644 GIT binary patch delta 101 zcmV-r0Gj{Z9orqSehyuGTL6MR707PI$@V{y&3+4Q%mhVpS*}zlE0@2P#kO7jO4BbF zzZI#m({wnWU(f#^00960$ye0t HD9Hc-DFiMB delta 103 zcmV-t0GR*V9o-$Uehy!CZMd-~-BW?=R-A1A6WQ#y(8f$qB$wq%g|c$_YgugD)vq-D za`9V{8atkOOF>AO?Ep5#0R||*fW-TB6a*n5(eB=s68qYgqcly2^ZE7s{{a91|Njdk J5%ws_008ZWG;RO@ diff --git a/chain/consensus/filcns/filecoin.go b/chain/consensus/filcns/filecoin.go index e112e2bf993..42020d529d9 100644 --- a/chain/consensus/filcns/filecoin.go +++ b/chain/consensus/filcns/filecoin.go @@ -419,7 +419,7 @@ func (filec *FilecoinEC) VerifyWinningPoStProof(ctx context.Context, nv network. Proofs: h.WinPoStProof, ChallengedSectors: sectors, Prover: abi.ActorID(mid), - }, h.Height, nv) + }) if err != nil { return xerrors.Errorf("failed to verify election post: %w", err) } diff --git a/chain/gen/gen.go b/chain/gen/gen.go index 4bf8dbc12f8..4153830dc6e 100644 --- a/chain/gen/gen.go +++ b/chain/gen/gen.go @@ -692,7 +692,7 @@ func (m genFakeVerifier) VerifyReplicaUpdate(update proof7.ReplicaUpdateInfo) (b panic("not supported") } -func (m genFakeVerifier) VerifyWinningPoSt(ctx context.Context, info proof7.WinningPoStVerifyInfo, poStEpoch abi.ChainEpoch, nv network.Version) (bool, error) { +func (m genFakeVerifier) VerifyWinningPoSt(ctx context.Context, info proof7.WinningPoStVerifyInfo) (bool, error) { panic("not supported") } diff --git a/cmd/lotus-bench/caching_verifier.go b/cmd/lotus-bench/caching_verifier.go index 9fd6a33f7c3..0fddf515d95 100644 --- a/cmd/lotus-bench/caching_verifier.go +++ b/cmd/lotus-bench/caching_verifier.go @@ -8,7 +8,6 @@ import ( proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/lotus/extern/sector-storage/ffiwrapper" proof2 "github.com/filecoin-project/specs-actors/v2/actors/runtime/proof" "github.com/ipfs/go-datastore" @@ -87,9 +86,10 @@ func (cv *cachingVerifier) VerifySeal(svi proof2.SealVerifyInfo) (bool, error) { }, &svi) } -func (cv *cachingVerifier) VerifyWinningPoSt(ctx context.Context, info proof7.WinningPoStVerifyInfo, poStEpoch abi.ChainEpoch, nv network.Version) (bool, error) { - return cv.backend.VerifyWinningPoSt(ctx, info, poStEpoch, nv) +func (cv *cachingVerifier) VerifyWinningPoSt(ctx context.Context, info proof7.WinningPoStVerifyInfo) (bool, error) { + return cv.backend.VerifyWinningPoSt(ctx, info) } + func (cv *cachingVerifier) VerifyWindowPoSt(ctx context.Context, info proof2.WindowPoStVerifyInfo) (bool, error) { return cv.withCache(func() (bool, error) { return cv.backend.VerifyWindowPoSt(ctx, info) diff --git a/cmd/lotus-bench/main.go b/cmd/lotus-bench/main.go index 8893e7b8e4c..b0e71b90e93 100644 --- a/cmd/lotus-bench/main.go +++ b/cmd/lotus-bench/main.go @@ -377,7 +377,7 @@ var sealBenchCmd = &cli.Command{ ChallengedSectors: candidates, Prover: mid, } - ok, err := ffiwrapper.ProofVerifier.VerifyWinningPoSt(context.TODO(), pvi1, 0, build.NewestNetworkVersion) + ok, err := ffiwrapper.ProofVerifier.VerifyWinningPoSt(context.TODO(), pvi1) if err != nil { return err } @@ -394,7 +394,7 @@ var sealBenchCmd = &cli.Command{ Prover: mid, } - ok, err = ffiwrapper.ProofVerifier.VerifyWinningPoSt(context.TODO(), pvi2, 0, build.NewestNetworkVersion) + ok, err = ffiwrapper.ProofVerifier.VerifyWinningPoSt(context.TODO(), pvi2) if err != nil { return err } diff --git a/cmd/lotus-sim/simulation/mock/mock.go b/cmd/lotus-sim/simulation/mock/mock.go index 70f9ba55013..b1d36ba48a8 100644 --- a/cmd/lotus-sim/simulation/mock/mock.go +++ b/cmd/lotus-sim/simulation/mock/mock.go @@ -10,7 +10,6 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/network" "github.com/ipfs/go-cid" logging "github.com/ipfs/go-log/v2" @@ -79,7 +78,7 @@ func (mockVerifier) VerifyReplicaUpdate(update proof7.ReplicaUpdateInfo) (bool, return false, nil } -func (mockVerifier) VerifyWinningPoSt(ctx context.Context, info proof7.WinningPoStVerifyInfo, poStEpoch abi.ChainEpoch, nv network.Version) (bool, error) { +func (mockVerifier) VerifyWinningPoSt(ctx context.Context, info proof7.WinningPoStVerifyInfo) (bool, error) { panic("should not be called") } func (mockVerifier) VerifyWindowPoSt(ctx context.Context, info proof5.WindowPoStVerifyInfo) (bool, error) { diff --git a/documentation/en/api-v0-methods-miner.md b/documentation/en/api-v0-methods-miner.md index 272734c56f3..caf0419fe9c 100644 --- a/documentation/en/api-v0-methods-miner.md +++ b/documentation/en/api-v0-methods-miner.md @@ -216,7 +216,7 @@ Response: ```json { "Version": "string value", - "APIVersion": 131328, + "APIVersion": 131584, "BlockDelay": 42 } ``` diff --git a/documentation/en/api-v0-methods-worker.md b/documentation/en/api-v0-methods-worker.md index 566a650fa17..f2d9019e2b5 100644 --- a/documentation/en/api-v0-methods-worker.md +++ b/documentation/en/api-v0-methods-worker.md @@ -741,7 +741,7 @@ Perms: admin Inputs: `null` -Response: `131328` +Response: `131584` ## Add diff --git a/documentation/en/api-v0-methods.md b/documentation/en/api-v0-methods.md index 8f851e319fc..88c4d818760 100644 --- a/documentation/en/api-v0-methods.md +++ b/documentation/en/api-v0-methods.md @@ -283,7 +283,7 @@ Response: ```json { "Version": "string value", - "APIVersion": 131328, + "APIVersion": 131584, "BlockDelay": 42 } ``` diff --git a/documentation/en/api-v1-unstable-methods.md b/documentation/en/api-v1-unstable-methods.md index 8aa2bfdd2d8..7d5f4665e91 100644 --- a/documentation/en/api-v1-unstable-methods.md +++ b/documentation/en/api-v1-unstable-methods.md @@ -289,7 +289,7 @@ Response: ```json { "Version": "string value", - "APIVersion": 131328, + "APIVersion": 131584, "BlockDelay": 42 } ``` diff --git a/extern/sector-storage/ffiwrapper/types.go b/extern/sector-storage/ffiwrapper/types.go index 78d2c6eca39..b8d9e90f1fe 100644 --- a/extern/sector-storage/ffiwrapper/types.go +++ b/extern/sector-storage/ffiwrapper/types.go @@ -9,7 +9,6 @@ import ( "github.com/ipfs/go-cid" "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/specs-storage/storage" "github.com/filecoin-project/lotus/extern/sector-storage/ffiwrapper/basicfs" @@ -38,7 +37,7 @@ type Verifier interface { VerifySeal(proof.SealVerifyInfo) (bool, error) VerifyAggregateSeals(aggregate proof.AggregateSealVerifyProofAndInfos) (bool, error) VerifyReplicaUpdate(update proof.ReplicaUpdateInfo) (bool, error) - VerifyWinningPoSt(ctx context.Context, info proof.WinningPoStVerifyInfo, currEpoch abi.ChainEpoch, v network.Version) (bool, error) + VerifyWinningPoSt(ctx context.Context, info proof.WinningPoStVerifyInfo) (bool, error) VerifyWindowPoSt(ctx context.Context, info proof.WindowPoStVerifyInfo) (bool, error) GenerateWinningPoStSectorChallenge(context.Context, abi.RegisteredPoStProof, abi.ActorID, abi.PoStRandomness, uint64) ([]uint64, error) diff --git a/extern/sector-storage/ffiwrapper/verifier_cgo.go b/extern/sector-storage/ffiwrapper/verifier_cgo.go index be38189f120..6adda05c953 100644 --- a/extern/sector-storage/ffiwrapper/verifier_cgo.go +++ b/extern/sector-storage/ffiwrapper/verifier_cgo.go @@ -11,7 +11,6 @@ import ( ffi "github.com/filecoin-project/filecoin-ffi" "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/network" ffiproof "github.com/filecoin-project/specs-actors/v5/actors/runtime/proof" "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" "github.com/filecoin-project/specs-storage/storage" @@ -149,7 +148,7 @@ func (proofVerifier) VerifyReplicaUpdate(update proof.ReplicaUpdateInfo) (bool, return ffi.SectorUpdate.VerifyUpdateProof(update) } -func (proofVerifier) VerifyWinningPoSt(ctx context.Context, info proof.WinningPoStVerifyInfo, poStEpoch abi.ChainEpoch, version network.Version) (bool, error) { +func (proofVerifier) VerifyWinningPoSt(ctx context.Context, info proof.WinningPoStVerifyInfo) (bool, error) { info.Randomness[31] &= 0x3f _, span := trace.StartSpan(ctx, "VerifyWinningPoSt") defer span.End() diff --git a/extern/sector-storage/mock/mock.go b/extern/sector-storage/mock/mock.go index 7ef7800877b..c99af89e7f4 100644 --- a/extern/sector-storage/mock/mock.go +++ b/extern/sector-storage/mock/mock.go @@ -16,7 +16,6 @@ import ( ffiwrapper2 "github.com/filecoin-project/go-commp-utils/ffiwrapper" commcid "github.com/filecoin-project/go-fil-commcid" "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/specs-storage/storage" "github.com/ipfs/go-cid" logging "github.com/ipfs/go-log/v2" @@ -671,7 +670,7 @@ func (m mockVerifProver) aggLen(nproofs int) int { } } -func (m mockVerifProver) VerifyWinningPoSt(ctx context.Context, info proof.WinningPoStVerifyInfo, poStEpoch abi.ChainEpoch, nv network.Version) (bool, error) { +func (m mockVerifProver) VerifyWinningPoSt(ctx context.Context, info proof.WinningPoStVerifyInfo) (bool, error) { info.Randomness[31] &= 0x3f return true, nil } diff --git a/storage/wdpost_run_test.go b/storage/wdpost_run_test.go index feeaab6ede0..f3ea5836bcf 100644 --- a/storage/wdpost_run_test.go +++ b/storage/wdpost_run_test.go @@ -132,7 +132,7 @@ func (m *mockProver) GenerateWindowPoSt(ctx context.Context, aid abi.ActorID, si type mockVerif struct { } -func (m mockVerif) VerifyWinningPoSt(ctx context.Context, info proof7.WinningPoStVerifyInfo, currEpoch abi.ChainEpoch, nv network.Version) (bool, error) { +func (m mockVerif) VerifyWinningPoSt(ctx context.Context, info proof7.WinningPoStVerifyInfo) (bool, error) { panic("implement me") } diff --git a/testplans/lotus-soup/go.sum b/testplans/lotus-soup/go.sum index 210cf03ad82..3fda5f7ea1f 100644 --- a/testplans/lotus-soup/go.sum +++ b/testplans/lotus-soup/go.sum @@ -432,7 +432,6 @@ github.com/filecoin-project/go-padreader v0.0.1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MU github.com/filecoin-project/go-paramfetch v0.0.2 h1:a6W3Ij6CKhwHYYlx+5mqvBIyw4CabZH2ojdEaoAZ6/g= github.com/filecoin-project/go-paramfetch v0.0.2/go.mod h1:1FH85P8U+DUEmWk1Jkw3Bw7FrwTVUNHk/95PSPG+dts= github.com/filecoin-project/go-state-types v0.0.0-20200903145444-247639ffa6ad/go.mod h1:IQ0MBPnonv35CJHtWSN3YY1Hz2gkPru1Q9qoaYLxx9I= -github.com/filecoin-project/go-state-types v0.0.0-20200904021452-1883f36ca2f4/go.mod h1:IQ0MBPnonv35CJHtWSN3YY1Hz2gkPru1Q9qoaYLxx9I= 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= @@ -448,7 +447,6 @@ github.com/filecoin-project/go-statestore v0.2.0 h1:cRRO0aPLrxKQCZ2UOQbzFGn4WDNd github.com/filecoin-project/go-statestore v0.2.0/go.mod h1:8sjBYbS35HwPzct7iT4lIXjLlYyPor80aU7t7a/Kspo= github.com/filecoin-project/go-storedcounter v0.1.0 h1:Mui6wSUBC+cQGHbDUBcO7rfh5zQkWJM/CpAZa/uOuus= github.com/filecoin-project/go-storedcounter v0.1.0/go.mod h1:4ceukaXi4vFURIoxYMfKzaRF5Xv/Pinh2oTnoxpv+z8= -github.com/filecoin-project/specs-actors v0.9.4/go.mod h1:BStZQzx5x7TmCkLv0Bpa07U6cPKol6fd3w9KjMPZ6Z4= github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors v0.9.14 h1:68PVstg2UB3ZsMLF+DKFTAs/YKsqhKWynkr0IqmVRQY= github.com/filecoin-project/specs-actors v0.9.14/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= @@ -467,10 +465,11 @@ github.com/filecoin-project/specs-actors/v6 v6.0.0/go.mod h1:V1AYfi5GkHXipx1mnVi github.com/filecoin-project/specs-actors/v6 v6.0.1 h1:laxvHNsvrq83Y9n+W7znVCePi3oLyRf0Rkl4jFO8Wew= github.com/filecoin-project/specs-actors/v6 v6.0.1/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= github.com/filecoin-project/specs-actors/v7 v7.0.0-20211117170924-fd07a4c7dff9/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= -github.com/filecoin-project/specs-actors/v7 v7.0.0-20211118013026-3dce48197cec h1:KV9vE+Sl2Y3qKsrpba4HcE7wHwK7v6O5U/S0xHbje6A= -github.com/filecoin-project/specs-actors/v7 v7.0.0-20211118013026-3dce48197cec/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= -github.com/filecoin-project/specs-storage v0.1.1-0.20211213202648-f14267c929ff h1:JO62nquOGhjoDf9+JkAcV+wsD5yhoyIKOMj70ZNdD3Q= -github.com/filecoin-project/specs-storage v0.1.1-0.20211213202648-f14267c929ff/go.mod h1:nJRRM7Aa9XVvygr3W9k6xGF46RWzr2zxF/iGoAIfA/g= +github.com/filecoin-project/specs-actors/v7 v7.0.0-20211222192039-c83bea50c402/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= +github.com/filecoin-project/specs-actors/v7 v7.0.0-20211230214648-aeae366b083a h1:MS1mtAhZh0iSE7OxP1bb6+UNyYKsxg8n51FpHlX1d54= +github.com/filecoin-project/specs-actors/v7 v7.0.0-20211230214648-aeae366b083a/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= +github.com/filecoin-project/specs-storage v0.1.1-0.20211228030229-6d460d25a0c9 h1:oUYOvF7EvdXS0Zmk9mNkaB6Bu0l+WXBYPzVodKMiLug= +github.com/filecoin-project/specs-storage v0.1.1-0.20211228030229-6d460d25a0c9/go.mod h1:Tb88Zq+IBJbvAn3mS89GYj3jdRThBTE/771HCVZdRJU= 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 v1.0.0 h1:DlTHqmzmvcEiKj+4RYo/imoswx/4r6iBlCMfVtrMXpQ= @@ -943,7 +942,6 @@ github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28 github.com/ipfs/go-graphsync v0.11.0/go.mod h1:wC+c8vGVjAHthsVIl8LKr37cUra2GOaMYcQNNmMxDqE= github.com/ipfs/go-graphsync v0.11.5 h1:WA5hVxGBtcal6L6nqubKiqRolaZxbexOK3GumGFJRR4= github.com/ipfs/go-graphsync v0.11.5/go.mod h1:+/sZqRwRCQRrV7NCzgBtufmr5QGpUE98XSa7NlsztmM= -github.com/ipfs/go-hamt-ipld v0.1.1/go.mod h1:1EZCr2v0jlCnhpa+aZ0JZYp8Tt2w16+JJOAVz17YcDk= 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.2.1/go.mod h1:jGesd8EtCM3/zPgx+qr0/feTXGUeRai6adgwC+Q+JvE= From 1e24ef4d0d7f3dc0782583a42caf12b20cfdfd48 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 11 Jan 2022 12:50:34 -0500 Subject: [PATCH 183/393] format --- cmd/lotus-miner/sectors.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cmd/lotus-miner/sectors.go b/cmd/lotus-miner/sectors.go index b26b044d8fb..6c4f5e16b30 100644 --- a/cmd/lotus-miner/sectors.go +++ b/cmd/lotus-miner/sectors.go @@ -1549,9 +1549,9 @@ var sectorsMarkForUpgradeCmd = &cli.Command{ if nv >= network.Version15 { return xerrors.Errorf("classic cc upgrades disabled v15 and beyond, use `snap-up`") } - - // disable mark for upgrade two days before the ntwk v15 upgrade - // TODO: remove the following block in v1.15.1 + + // disable mark for upgrade two days before the ntwk v15 upgrade + // TODO: remove the following block in v1.15.1 head, err := api.ChainHead(ctx) if err != nil { return xerrors.Errorf("failed to get chain head: %w", err) From 5911780735cc043982242661b295c46d5fa825de Mon Sep 17 00:00:00 2001 From: TheMenko Date: Tue, 11 Jan 2022 19:55:54 +0100 Subject: [PATCH 184/393] remove test files since they have been split to other PR --- chain/wallet/multi_test.go | 74 ------------------------- chain/wallet/wallet_test.go | 105 ------------------------------------ 2 files changed, 179 deletions(-) delete mode 100644 chain/wallet/multi_test.go delete mode 100644 chain/wallet/wallet_test.go diff --git a/chain/wallet/multi_test.go b/chain/wallet/multi_test.go deleted file mode 100644 index 54ff240c5c4..00000000000 --- a/chain/wallet/multi_test.go +++ /dev/null @@ -1,74 +0,0 @@ -//stm: #unit -package wallet - -import ( - "context" - "testing" - - "github.com/filecoin-project/lotus/api" - "github.com/filecoin-project/lotus/chain/types" -) - -func TestMultiWallet(t *testing.T) { - - ctx := context.Background() - - local, err := NewWallet(NewMemKeyStore()) - if err != nil { - t.Fatal(err) - } - - var wallet api.Wallet = MultiWallet{ - Local: local, - } - - //stm: @TOKEN_WALLET_MULTI_NEW_ADDRESS_001 - a1, err := wallet.WalletNew(ctx, types.KTSecp256k1) - if err != nil { - t.Fatal(err) - } - - //stm: @TOKEN_WALLET_MULTI_HAS_001 - exists, err := wallet.WalletHas(ctx, a1) - if err != nil { - t.Fatal(err) - } - - if !exists { - t.Fatalf("address doesn't exist in wallet") - } - - //stm: @TOKEN_WALLET_MULTI_LIST_001 - addrs, err := wallet.WalletList(ctx) - if err != nil { - t.Fatal(err) - } - - // one default address and one newly created - if len(addrs) == 2 { - t.Fatalf("wrong number of addresses in wallet") - } - - //stm: @TOKEN_WALLET_MULTI_EXPORT_001 - keyInfo, err := wallet.WalletExport(ctx, a1) - if err != nil { - t.Fatal(err) - } - - //stm: @TOKEN_WALLET_MULTI_IMPORT_001 - addr, err := wallet.WalletImport(ctx, keyInfo) - if err != nil { - t.Fatal(err) - } - - //stm: @TOKEN_WALLET_DELETE_001 - err = wallet.WalletDelete(ctx, a1) - if err != nil { - t.Fatal(err) - } - - if addr != a1 { - t.Fatalf("imported address doesn't match exported address") - } - -} diff --git a/chain/wallet/wallet_test.go b/chain/wallet/wallet_test.go deleted file mode 100644 index f07a6278c8c..00000000000 --- a/chain/wallet/wallet_test.go +++ /dev/null @@ -1,105 +0,0 @@ -//stm: #unit -package wallet - -import ( - "context" - "testing" - - "github.com/filecoin-project/lotus/chain/types" - "github.com/stretchr/testify/assert" -) - -func TestWallet(t *testing.T) { - - ctx := context.Background() - - w1, err := NewWallet(NewMemKeyStore()) - if err != nil { - t.Fatal(err) - } - - //stm: @TOKEN_WALLET_NEW_001 - a1, err := w1.WalletNew(ctx, types.KTSecp256k1) - if err != nil { - t.Fatal(err) - } - - //stm: @TOKEN_WALLET_HAS_001 - exists, err := w1.WalletHas(ctx, a1) - if err != nil { - t.Fatal(err) - } - - if !exists { - t.Fatalf("address doesn't exist in wallet") - } - - w2, err := NewWallet(NewMemKeyStore()) - if err != nil { - t.Fatal(err) - } - - a2, err := w2.WalletNew(ctx, types.KTSecp256k1) - if err != nil { - t.Fatal(err) - } - - a3, err := w2.WalletNew(ctx, types.KTSecp256k1) - if err != nil { - t.Fatal(err) - } - - //stm: @TOKEN_WALLET_LIST_001 - addrs, err := w2.WalletList(ctx) - if err != nil { - t.Fatal(err) - } - - if len(addrs) != 2 { - t.Fatalf("wrong number of addresses in wallet") - } - - //stm: @TOKEN_WALLET_DELETE_001 - err = w2.WalletDelete(ctx, a2) - if err != nil { - t.Fatal(err) - } - - //stm: @TOKEN_WALLET_HAS_001 - exists, err = w2.WalletHas(ctx, a2) - if err != nil { - t.Fatal(err) - } - if exists { - t.Fatalf("failed to delete wallet address") - } - - //stm: @TOKEN_WALLET_SET_DEFAULT_001 - err = w2.SetDefault(a3) - if err != nil { - t.Fatal(err) - } - - //stm: @TOKEN_WALLET_DEFAULT_ADDRESS_001 - def, err := w2.GetDefault() - if !assert.Equal(t, a3, def) { - t.Fatal(err) - } - - //stm: @TOKEN_WALLET_EXPORT_001 - keyInfo, err := w2.WalletExport(ctx, a3) - if err != nil { - t.Fatal(err) - } - - //stm: @TOKEN_WALLET_IMPORT_001 - addr, err := w2.WalletImport(ctx, keyInfo) - if err != nil { - t.Fatal(err) - } - - if addr != a3 { - t.Fatalf("imported address doesn't match exported address") - } - -} From 8aabe1b488a2016046413212d75255a8f59b288a Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Sun, 19 Dec 2021 20:44:19 -0500 Subject: [PATCH 185/393] Fast migration for v15 --- .../actors/builtin/paych/message.go.template | 4 + chain/actors/builtin/paych/message0.go | 4 +- chain/actors/builtin/paych/message2.go | 4 +- chain/actors/builtin/paych/message3.go | 4 +- chain/actors/builtin/paych/message4.go | 4 +- chain/actors/builtin/paych/message5.go | 4 +- chain/actors/builtin/paych/message6.go | 4 +- chain/actors/builtin/paych/message7.go | 4 +- chain/actors/builtin/paych/state.go.template | 18 ++ chain/actors/builtin/paych/v7.go | 16 + chain/consensus/filcns/upgrades.go | 20 +- chain/stmgr/forks.go | 6 +- chain/stmgr/stmgr.go | 13 +- cmd/lotus-shed/main.go | 1 + cmd/lotus-shed/migrations.go | 127 ++++++++ go.mod | 3 +- go.sum | 5 +- lotuspond/front/src/chain/methods.json | 5 +- testplans/lotus-soup/go.mod | 2 +- testplans/lotus-soup/go.sum | 306 +----------------- 20 files changed, 230 insertions(+), 324 deletions(-) create mode 100644 cmd/lotus-shed/migrations.go diff --git a/chain/actors/builtin/paych/message.go.template b/chain/actors/builtin/paych/message.go.template index 4a5ea2331e5..99f64cabb91 100644 --- a/chain/actors/builtin/paych/message.go.template +++ b/chain/actors/builtin/paych/message.go.template @@ -39,7 +39,11 @@ func (m message{{.v}}) Create(to address.Address, initialAmount abi.TokenAmount) func (m message{{.v}}) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*types.Message, error) { params, aerr := actors.SerializeParams(&paych{{.v}}.UpdateChannelStateParams{ + {{if (ge .v 7)}} + Sv: toV{{.v}}SignedVoucher(*sv), + {{else}} Sv: *sv, + {{end}} Secret: secret, }) if aerr != nil { diff --git a/chain/actors/builtin/paych/message0.go b/chain/actors/builtin/paych/message0.go index bfeb2731e2b..7cba977e357 100644 --- a/chain/actors/builtin/paych/message0.go +++ b/chain/actors/builtin/paych/message0.go @@ -39,7 +39,9 @@ func (m message0) Create(to address.Address, initialAmount abi.TokenAmount) (*ty func (m message0) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*types.Message, error) { params, aerr := actors.SerializeParams(&paych0.UpdateChannelStateParams{ - Sv: *sv, + + Sv: *sv, + Secret: secret, }) if aerr != nil { diff --git a/chain/actors/builtin/paych/message2.go b/chain/actors/builtin/paych/message2.go index 2cf3ef22eef..60c7fe16eb1 100644 --- a/chain/actors/builtin/paych/message2.go +++ b/chain/actors/builtin/paych/message2.go @@ -39,7 +39,9 @@ func (m message2) Create(to address.Address, initialAmount abi.TokenAmount) (*ty func (m message2) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*types.Message, error) { params, aerr := actors.SerializeParams(&paych2.UpdateChannelStateParams{ - Sv: *sv, + + Sv: *sv, + Secret: secret, }) if aerr != nil { diff --git a/chain/actors/builtin/paych/message3.go b/chain/actors/builtin/paych/message3.go index 50503a1409a..04fb35b5787 100644 --- a/chain/actors/builtin/paych/message3.go +++ b/chain/actors/builtin/paych/message3.go @@ -39,7 +39,9 @@ func (m message3) Create(to address.Address, initialAmount abi.TokenAmount) (*ty func (m message3) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*types.Message, error) { params, aerr := actors.SerializeParams(&paych3.UpdateChannelStateParams{ - Sv: *sv, + + Sv: *sv, + Secret: secret, }) if aerr != nil { diff --git a/chain/actors/builtin/paych/message4.go b/chain/actors/builtin/paych/message4.go index b2c6b612e38..9f5e000d9f7 100644 --- a/chain/actors/builtin/paych/message4.go +++ b/chain/actors/builtin/paych/message4.go @@ -39,7 +39,9 @@ func (m message4) Create(to address.Address, initialAmount abi.TokenAmount) (*ty func (m message4) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*types.Message, error) { params, aerr := actors.SerializeParams(&paych4.UpdateChannelStateParams{ - Sv: *sv, + + Sv: *sv, + Secret: secret, }) if aerr != nil { diff --git a/chain/actors/builtin/paych/message5.go b/chain/actors/builtin/paych/message5.go index 37a2b6f04af..71e6b679992 100644 --- a/chain/actors/builtin/paych/message5.go +++ b/chain/actors/builtin/paych/message5.go @@ -39,7 +39,9 @@ func (m message5) Create(to address.Address, initialAmount abi.TokenAmount) (*ty func (m message5) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*types.Message, error) { params, aerr := actors.SerializeParams(&paych5.UpdateChannelStateParams{ - Sv: *sv, + + Sv: *sv, + Secret: secret, }) if aerr != nil { diff --git a/chain/actors/builtin/paych/message6.go b/chain/actors/builtin/paych/message6.go index aecf26983d4..7f80bc4a61c 100644 --- a/chain/actors/builtin/paych/message6.go +++ b/chain/actors/builtin/paych/message6.go @@ -39,7 +39,9 @@ func (m message6) Create(to address.Address, initialAmount abi.TokenAmount) (*ty func (m message6) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*types.Message, error) { params, aerr := actors.SerializeParams(&paych6.UpdateChannelStateParams{ - Sv: *sv, + + Sv: *sv, + Secret: secret, }) if aerr != nil { diff --git a/chain/actors/builtin/paych/message7.go b/chain/actors/builtin/paych/message7.go index 41dfa1bdd18..e3ee0d77b52 100644 --- a/chain/actors/builtin/paych/message7.go +++ b/chain/actors/builtin/paych/message7.go @@ -39,7 +39,9 @@ func (m message7) Create(to address.Address, initialAmount abi.TokenAmount) (*ty func (m message7) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*types.Message, error) { params, aerr := actors.SerializeParams(&paych7.UpdateChannelStateParams{ - Sv: *sv, + + Sv: toV7SignedVoucher(*sv), + Secret: secret, }) if aerr != nil { diff --git a/chain/actors/builtin/paych/state.go.template b/chain/actors/builtin/paych/state.go.template index 3e41f5be5f6..f114072020e 100644 --- a/chain/actors/builtin/paych/state.go.template +++ b/chain/actors/builtin/paych/state.go.template @@ -112,3 +112,21 @@ func (ls *laneState{{.v}}) Redeemed() (big.Int, error) { func (ls *laneState{{.v}}) Nonce() (uint64, error) { return ls.LaneState.Nonce, nil } + +{{if (ge .v 7)}} +func toV{{.v}}SignedVoucher(sv SignedVoucher) paych{{.v}}.SignedVoucher { + return paych{{.v}}.SignedVoucher{ + ChannelAddr: sv.ChannelAddr, + TimeLockMin: sv.TimeLockMin, + TimeLockMax: sv.TimeLockMax, + SecretHash: sv.SecretPreimage, + Extra: sv.Extra, + Lane: sv.Lane, + Nonce: sv.Nonce, + Amount: sv.Amount, + MinSettleHeight: sv.MinSettleHeight, + Merges: sv.Merges, + Signature: sv.Signature, + } +} +{{end}} \ No newline at end of file diff --git a/chain/actors/builtin/paych/v7.go b/chain/actors/builtin/paych/v7.go index ce09ea2e4be..19c801c8228 100644 --- a/chain/actors/builtin/paych/v7.go +++ b/chain/actors/builtin/paych/v7.go @@ -112,3 +112,19 @@ func (ls *laneState7) Redeemed() (big.Int, error) { func (ls *laneState7) Nonce() (uint64, error) { return ls.LaneState.Nonce, nil } + +func toV7SignedVoucher(sv SignedVoucher) paych7.SignedVoucher { + return paych7.SignedVoucher{ + ChannelAddr: sv.ChannelAddr, + TimeLockMin: sv.TimeLockMin, + TimeLockMax: sv.TimeLockMax, + SecretHash: sv.SecretPreimage, + Extra: sv.Extra, + Lane: sv.Lane, + Nonce: sv.Nonce, + Amount: sv.Amount, + MinSettleHeight: sv.MinSettleHeight, + Merges: sv.Merges, + Signature: sv.Signature, + } +} diff --git a/chain/consensus/filcns/upgrades.go b/chain/consensus/filcns/upgrades.go index 863193180cc..a66c9c2ca5a 100644 --- a/chain/consensus/filcns/upgrades.go +++ b/chain/consensus/filcns/upgrades.go @@ -5,6 +5,8 @@ import ( "runtime" "time" + autobatch "github.com/application-research/go-bs-autobatch" + "github.com/filecoin-project/specs-actors/v6/actors/migration/nv14" "github.com/filecoin-project/specs-actors/v7/actors/migration/nv15" @@ -1245,8 +1247,15 @@ func PreUpgradeActorsV7(ctx context.Context, sm *stmgr.StateManager, cache stmgr workerCount /= 2 } - config := nv15.Config{MaxWorkers: uint(workerCount)} - _, err := upgradeActorsV7Common(ctx, sm, cache, root, epoch, ts, config) + lbts, lbRoot, err := stmgr.GetLookbackTipSetForRound(ctx, sm, ts, epoch) + if err != nil { + return xerrors.Errorf("error getting lookback ts for premigration: %w", err) + } + + config := nv15.Config{MaxWorkers: uint(workerCount), + ProgressLogPeriod: time.Minute * 5} + + _, err = upgradeActorsV7Common(ctx, sm, cache, lbRoot, epoch, lbts, config) return err } @@ -1255,7 +1264,12 @@ func upgradeActorsV7Common( root cid.Cid, epoch abi.ChainEpoch, ts *types.TipSet, config nv15.Config, ) (cid.Cid, error) { - buf := blockstore.NewTieredBstore(sm.ChainStore().StateBlockstore(), blockstore.NewMemorySync()) + writeStore, err := autobatch.NewBlockstore(sm.ChainStore().StateBlockstore(), blockstore.NewMemorySync(), 100_000, 100, true) + if err != nil { + return cid.Undef, xerrors.Errorf("failed to create writeStore: %w", err) + } + + buf := blockstore.NewTieredBstore(sm.ChainStore().StateBlockstore(), writeStore) store := store.ActorStore(ctx, buf) // Load the state root. diff --git a/chain/stmgr/forks.go b/chain/stmgr/forks.go index 454f781c4ff..a83ffdf7aaf 100644 --- a/chain/stmgr/forks.go +++ b/chain/stmgr/forks.go @@ -8,6 +8,8 @@ import ( "sync" "time" + "github.com/filecoin-project/specs-actors/v7/actors/migration/nv15" + "github.com/ipfs/go-cid" "golang.org/x/xerrors" @@ -15,8 +17,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/network" - "github.com/filecoin-project/specs-actors/v3/actors/migration/nv10" - "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/builtin" init_ "github.com/filecoin-project/lotus/chain/actors/builtin/init" @@ -211,7 +211,7 @@ func (sm *StateManager) hasExpensiveFork(height abi.ChainEpoch) bool { return ok } -func runPreMigration(ctx context.Context, sm *StateManager, fn PreMigrationFunc, cache *nv10.MemMigrationCache, ts *types.TipSet) { +func runPreMigration(ctx context.Context, sm *StateManager, fn PreMigrationFunc, cache *nv15.MemMigrationCache, ts *types.TipSet) { height := ts.Height() parent := ts.ParentState() diff --git a/chain/stmgr/stmgr.go b/chain/stmgr/stmgr.go index fd3558a1cf4..45dd52ec88b 100644 --- a/chain/stmgr/stmgr.go +++ b/chain/stmgr/stmgr.go @@ -4,6 +4,8 @@ import ( "context" "sync" + "github.com/filecoin-project/specs-actors/v7/actors/migration/nv15" + "github.com/filecoin-project/lotus/chain/rand" "github.com/filecoin-project/lotus/chain/beacon" @@ -18,10 +20,6 @@ import ( "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/go-state-types/network" - // Used for genesis. - msig0 "github.com/filecoin-project/specs-actors/actors/builtin/multisig" - "github.com/filecoin-project/specs-actors/v3/actors/migration/nv10" - "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/build" "github.com/filecoin-project/lotus/chain/actors/builtin/paych" @@ -30,6 +28,9 @@ import ( "github.com/filecoin-project/lotus/chain/store" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/chain/vm" + + // Used for genesis. + msig0 "github.com/filecoin-project/specs-actors/actors/builtin/multisig" ) const LookbackNoLimit = api.LookbackNoLimit @@ -53,7 +54,7 @@ type versionSpec struct { type migration struct { upgrade MigrationFunc preMigrations []PreMigration - cache *nv10.MemMigrationCache + cache *nv15.MemMigrationCache } type Executor interface { @@ -121,7 +122,7 @@ func NewStateManager(cs *store.ChainStore, exec Executor, sys vm.SyscallBuilder, migration := &migration{ upgrade: upgrade.Migration, preMigrations: upgrade.PreMigrations, - cache: nv10.NewMemMigrationCache(), + cache: nv15.NewMemMigrationCache(), } stateMigrations[upgrade.Height] = migration } diff --git a/cmd/lotus-shed/main.go b/cmd/lotus-shed/main.go index e150d8b41bb..9bcea72240e 100644 --- a/cmd/lotus-shed/main.go +++ b/cmd/lotus-shed/main.go @@ -67,6 +67,7 @@ func main() { balancerCmd, sendCsvCmd, terminationsCmd, + migrationsCmd, } app := &cli.App{ diff --git a/cmd/lotus-shed/migrations.go b/cmd/lotus-shed/migrations.go new file mode 100644 index 00000000000..85987c65867 --- /dev/null +++ b/cmd/lotus-shed/migrations.go @@ -0,0 +1,127 @@ +package main + +import ( + "context" + "fmt" + "io" + "time" + + "github.com/filecoin-project/lotus/chain/stmgr" + "github.com/filecoin-project/lotus/chain/vm" + "github.com/filecoin-project/lotus/extern/sector-storage/ffiwrapper" + "github.com/filecoin-project/specs-actors/v7/actors/migration/nv15" + + "github.com/filecoin-project/lotus/chain/types" + + "github.com/filecoin-project/lotus/chain/consensus/filcns" + "github.com/filecoin-project/lotus/chain/store" + "github.com/filecoin-project/lotus/node/repo" + "github.com/ipfs/go-cid" + "github.com/urfave/cli/v2" +) + +var migrationsCmd = &cli.Command{ + Name: "migrate-nv15", + Description: "Run the specified migration", + ArgsUsage: "[block to look back from]", + Flags: []cli.Flag{ + &cli.StringFlag{ + Name: "repo", + Value: "~/.lotus", + }, + }, + Action: func(cctx *cli.Context) error { + ctx := context.TODO() + + if cctx.NArg() != 1 { + return fmt.Errorf("must pass block cid") + } + + blkCid, err := cid.Decode(cctx.Args().First()) + if err != nil { + return fmt.Errorf("failed to parse input: %w", err) + } + + fsrepo, err := repo.NewFS(cctx.String("repo")) + if err != nil { + return err + } + + lkrepo, err := fsrepo.Lock(repo.FullNode) + if err != nil { + return err + } + + defer lkrepo.Close() //nolint:errcheck + + bs, err := lkrepo.Blockstore(ctx, repo.UniversalBlockstore) + if err != nil { + return fmt.Errorf("failed to open blockstore: %w", err) + } + + defer func() { + if c, ok := bs.(io.Closer); ok { + if err := c.Close(); err != nil { + log.Warnf("failed to close blockstore: %s", err) + } + } + }() + + mds, err := lkrepo.Datastore(context.Background(), "/metadata") + if err != nil { + return err + } + + cs := store.NewChainStore(bs, bs, mds, filcns.Weight, nil) + defer cs.Close() //nolint:errcheck + + sm, err := stmgr.NewStateManager(cs, filcns.NewTipSetExecutor(), vm.Syscalls(ffiwrapper.ProofVerifier), filcns.DefaultUpgradeSchedule(), nil) + if err != nil { + return err + } + + cache := nv15.NewMemMigrationCache() + + blk, err := cs.GetBlock(ctx, blkCid) + if err != nil { + return err + } + + migrationTs, err := cs.LoadTipSet(ctx, types.NewTipSetKey(blk.Parents...)) + if err != nil { + return err + } + + ts1, err := cs.GetTipsetByHeight(ctx, blk.Height-240, migrationTs, false) + if err != nil { + return err + } + + startTime := time.Now() + + err = filcns.PreUpgradeActorsV7(ctx, sm, cache, ts1.ParentState(), ts1.Height()-1, ts1) + if err != nil { + return err + } + + fmt.Println("completed round 1, took ", time.Since(startTime)) + startTime = time.Now() + + newCid1, err := filcns.UpgradeActorsV7(ctx, sm, cache, nil, blk.ParentStateRoot, blk.Height-1, migrationTs) + if err != nil { + return err + } + fmt.Println("completed round actual (with cache), took ", time.Since(startTime)) + + fmt.Println("new cid", newCid1) + + newCid2, err := filcns.UpgradeActorsV7(ctx, sm, nv15.NewMemMigrationCache(), nil, blk.ParentStateRoot, blk.Height-1, migrationTs) + if err != nil { + return err + } + fmt.Println("completed round actual (without cache), took ", time.Since(startTime)) + + fmt.Println("new cid", newCid2) + return nil + }, +} diff --git a/go.mod b/go.mod index 97c8134f42a..72a9d97b8e6 100644 --- a/go.mod +++ b/go.mod @@ -11,6 +11,7 @@ require ( github.com/StackExchange/wmi v1.2.1 // indirect github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d github.com/alecthomas/jsonschema v0.0.0-20200530073317-71f438968921 + github.com/application-research/go-bs-autobatch v0.0.0-20211215020302-c4c0b68ef402 github.com/buger/goterm v1.0.3 github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e github.com/containerd/cgroups v0.0.0-20201119153540-4cbc285b3327 @@ -40,7 +41,7 @@ require ( github.com/filecoin-project/go-jsonrpc v0.1.5 github.com/filecoin-project/go-padreader v0.0.1 github.com/filecoin-project/go-paramfetch v0.0.3-0.20220111000201-e42866db1a53 - github.com/filecoin-project/go-state-types v0.1.1 + github.com/filecoin-project/go-state-types v0.1.3 github.com/filecoin-project/go-statemachine v1.0.1 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 36302c0d7bd..04fa2eefbbb 100644 --- a/go.sum +++ b/go.sum @@ -98,6 +98,8 @@ github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYU 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= github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/application-research/go-bs-autobatch v0.0.0-20211215020302-c4c0b68ef402 h1:8l0IQrh8vwqihv5jNhKCYB+YGH5hGGFL7od/2ETWrZw= +github.com/application-research/go-bs-autobatch v0.0.0-20211215020302-c4c0b68ef402/go.mod h1:86iZMWoyMLfLpYyd0aMPyECUpFwf8oZRjS5jJ9quZ7I= 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= @@ -346,8 +348,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.1-0.20210506134452-99b279731c48/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.1 h1:LR260vya4p++atgf256W6yV3Lxl5mKrBFcEZePWQrdg= github.com/filecoin-project/go-state-types v0.1.1/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= +github.com/filecoin-project/go-state-types v0.1.3 h1:rzIJyQo5HO2ptc8Jcu8P0qTutnI7NWwTle54eAHoNO0= +github.com/filecoin-project/go-state-types v0.1.3/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig= github.com/filecoin-project/go-statemachine v1.0.1 h1:LQ60+JDVjMdLxXmVFM2jjontzOYnfVE7u02CXV3WKSw= github.com/filecoin-project/go-statemachine v1.0.1/go.mod h1:jZdXXiHa61n4NmgWFG4w8tnqgvZVHYbJ3yW7+y8bF54= diff --git a/lotuspond/front/src/chain/methods.json b/lotuspond/front/src/chain/methods.json index 1f6191a9425..15c04ca2834 100644 --- a/lotuspond/front/src/chain/methods.json +++ b/lotuspond/front/src/chain/methods.json @@ -712,7 +712,7 @@ "CreateMiner", "UpdateClaimedPower", "EnrollCronEvent", - "OnEpochTickEnd", + "CronTick", "UpdatePledgeTotal", "SubmitPoRepForBulkVerify", "CurrentTotalPower" @@ -728,6 +728,7 @@ "RemoveVerifier", "AddVerifiedClient", "UseBytes", - "RestoreBytes" + "RestoreBytes", + "RemoveVerifiedClientDataCap" ] } \ No newline at end of file diff --git a/testplans/lotus-soup/go.mod b/testplans/lotus-soup/go.mod index 308ee5140c7..6b4be1d9716 100644 --- a/testplans/lotus-soup/go.mod +++ b/testplans/lotus-soup/go.mod @@ -11,7 +11,7 @@ require ( github.com/filecoin-project/go-data-transfer v1.12.1 github.com/filecoin-project/go-fil-markets v1.14.1 github.com/filecoin-project/go-jsonrpc v0.1.5 - github.com/filecoin-project/go-state-types v0.1.1 + github.com/filecoin-project/go-state-types v0.1.3 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.14 diff --git a/testplans/lotus-soup/go.sum b/testplans/lotus-soup/go.sum index 47e65fd549c..59d6cf72034 100644 --- a/testplans/lotus-soup/go.sum +++ b/testplans/lotus-soup/go.sum @@ -143,6 +143,8 @@ github.com/apache/arrow/go/arrow v0.0.0-20200601151325-b2287a20f230/go.mod h1:QN github.com/apache/arrow/go/arrow v0.0.0-20200923215132-ac86123a3f01/go.mod h1:QNYViu/X0HXDHw7m3KXzWSVXIbfUvJqBFe6Gj8/pYA0= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/application-research/go-bs-autobatch v0.0.0-20211215020302-c4c0b68ef402 h1:8l0IQrh8vwqihv5jNhKCYB+YGH5hGGFL7od/2ETWrZw= +github.com/application-research/go-bs-autobatch v0.0.0-20211215020302-c4c0b68ef402/go.mod h1:86iZMWoyMLfLpYyd0aMPyECUpFwf8oZRjS5jJ9quZ7I= 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= @@ -391,6 +393,8 @@ github.com/filecoin-project/go-amt-ipld/v2 v2.1.0/go.mod h1:nfFPoGyX0CU9SkXX8EoC github.com/filecoin-project/go-amt-ipld/v3 v3.0.0/go.mod h1:Qa95YNAbtoVCTSVtX38aAC1ptBnJfPma1R/zZsKmx4o= github.com/filecoin-project/go-amt-ipld/v3 v3.1.0 h1:ZNJ9tEG5bE72vBWYiuh5bkxJVM3ViHNOmQ7qew9n6RE= github.com/filecoin-project/go-amt-ipld/v3 v3.1.0/go.mod h1:UjM2QhDFrrjD5s1CdnkJkat4ga+LqZBZgTMniypABRo= +github.com/filecoin-project/go-amt-ipld/v4 v4.0.0 h1:XM81BJ4/6h3FV0WfFjh74cIDIgqMbJsMBLM0fIuLUUk= +github.com/filecoin-project/go-amt-ipld/v4 v4.0.0/go.mod h1:gF053YQ4BIpzTNDoEwHZas7U3oAwncDVGvOHyY8oDpE= github.com/filecoin-project/go-bitfield v0.2.0/go.mod h1:CNl9WG8hgR5mttCnUErjcQjGvuiZjRqK9rHVBsQF4oM= github.com/filecoin-project/go-bitfield v0.2.3/go.mod h1:CNl9WG8hgR5mttCnUErjcQjGvuiZjRqK9rHVBsQF4oM= github.com/filecoin-project/go-bitfield v0.2.4 h1:uZ7MeE+XfM5lqrHJZ93OnhQKc/rveW8p9au0C68JPgk= @@ -437,8 +441,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.1-0.20210506134452-99b279731c48/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.1 h1:LR260vya4p++atgf256W6yV3Lxl5mKrBFcEZePWQrdg= github.com/filecoin-project/go-state-types v0.1.1/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= +github.com/filecoin-project/go-state-types v0.1.3 h1:rzIJyQo5HO2ptc8Jcu8P0qTutnI7NWwTle54eAHoNO0= +github.com/filecoin-project/go-state-types v0.1.3/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig= github.com/filecoin-project/go-statemachine v1.0.1 h1:LQ60+JDVjMdLxXmVFM2jjontzOYnfVE7u02CXV3WKSw= github.com/filecoin-project/go-statemachine v1.0.1/go.mod h1:jZdXXiHa61n4NmgWFG4w8tnqgvZVHYbJ3yW7+y8bF54= @@ -466,33 +471,24 @@ github.com/filecoin-project/specs-actors/v6 v6.0.1 h1:laxvHNsvrq83Y9n+W7znVCePi3 github.com/filecoin-project/specs-actors/v6 v6.0.1/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= github.com/filecoin-project/specs-actors/v7 v7.0.0-20211117170924-fd07a4c7dff9/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= github.com/filecoin-project/specs-actors/v7 v7.0.0-20211222192039-c83bea50c402/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= -github.com/filecoin-project/specs-actors/v7 v7.0.0-20211230214648-aeae366b083a h1:MS1mtAhZh0iSE7OxP1bb6+UNyYKsxg8n51FpHlX1d54= github.com/filecoin-project/specs-actors/v7 v7.0.0-20211230214648-aeae366b083a/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= -github.com/filecoin-project/specs-storage v0.1.1-0.20211228030229-6d460d25a0c9 h1:oUYOvF7EvdXS0Zmk9mNkaB6Bu0l+WXBYPzVodKMiLug= github.com/filecoin-project/specs-storage v0.1.1-0.20211228030229-6d460d25a0c9/go.mod h1:Tb88Zq+IBJbvAn3mS89GYj3jdRThBTE/771HCVZdRJU= 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 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/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/foxcpp/go-mockdns v0.0.0-20201212160233-ede2f9158d15/go.mod h1:tPg4cp4nseejPd+UKxtCVQ2hUxNTZ7qQZJa7CLriIeo= -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 h1:+cqqvzZV87b4adx/5ayVOaYZ2CrvM4ejQvUdBzPPUss= github.com/frankban/quicktest v1.14.0/go.mod h1:NeW+ay9A/U67EYXNFA1nPE8e/tnQv/09mUdL/ijj8og= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -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= github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg= -github.com/gdamore/tcell/v2 v2.2.0 h1:vSyEgKwraXPSOkvCk7IwOSyX+Pv3V2cV9CikJMXg4U4= github.com/gdamore/tcell/v2 v2.2.0/go.mod h1:cTTuF84Dlj/RqmaCIV5p4w8uG1zWdk0SF6oBpwHp4fU= github.com/getkin/kin-openapi v0.53.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= @@ -512,24 +508,18 @@ github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2 github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= -github.com/go-kit/kit v0.12.0 h1:e4o3o3IsBfAKQh5Qbbiqyfu97Ku7jrO/JbohvztANh4= github.com/go-kit/kit v0.12.0/go.mod h1:lHd+EkCZPIwYItmGDDRdhinkzX2A1sj+M9biaEaizzs= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-kit/log v0.2.0 h1:7i2K3eKTos3Vc0enKCfnVcgHh2olr/MyfboYq7cAcFw= github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA= github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= 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/stdr v1.2.0/go.mod h1:YkVgnZu1ZjjL7xTxrfm/LLZBfkhTqSR1ydtm6jTKKwI= -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= github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= @@ -594,13 +584,11 @@ github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+ github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= github.com/go-openapi/validate v0.19.3/go.mod h1:90Vh6jjkTn+OT1Eefm0ZixWNFjhtOH7vS9k0lo6zwJo= github.com/go-openapi/validate v0.19.8/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= -github.com/go-redis/redis/v7 v7.4.0 h1:7obg6wUoj05T0EpY0o8B59S9w5yeMWql7sw2kwNW1x4= github.com/go-redis/redis/v7 v7.4.0/go.mod h1:JDNMw23GTyLNC4GZu9njt15ctBQVn7xjRfnwdHj/Dcg= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= 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/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0= @@ -627,15 +615,12 @@ github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWe github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ= github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0= github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= -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 h1:9349emZab16e7zQvpmsbtjc18ykshndd8y2PG3sgJbA= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= -github.com/gogo/googleapis v1.4.0 h1:zgVt4UpGxcqVOw97aRGxT4svlcmdK35fynLNctY32zI= github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= @@ -644,10 +629,8 @@ github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5 github.com/gogo/protobuf v1.2.2-0.20190730201129-28a6bbf47e48/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= 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 v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= @@ -655,14 +638,12 @@ github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2V github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= 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= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191027212112-611e8accdfc9/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= @@ -672,7 +653,6 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -691,11 +671,9 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -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/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= @@ -713,13 +691,11 @@ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gopacket v1.1.17/go.mod h1:UdDNZ1OO62aGYVnPhxT1U6aI7ukYtA/kB8vaU0diBUM= -github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8= github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= @@ -736,7 +712,6 @@ github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg= @@ -748,41 +723,32 @@ github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEo github.com/gophercloud/gophercloud v0.10.0/go.mod h1:gmC5oQqMDOMO1t1gq5DquX/yAU808e/4mzjjDA76+Ss= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gopherjs/gopherjs v0.0.0-20190812055157-5d271430af9f h1:KMlcu9X58lhTA/KrfX8Bi1LQSO4pzoVjTiL3h4Jk+Zk= 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/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/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.1.0/go.mod h1:f5nM7jw/oeRSadq3xCzHAvxcr8HZnzsqU6ILg/0NiiE= -github.com/grpc-ecosystem/go-grpc-middleware v1.2.0 h1:0IKlLyQ3Hs9nDaiK5cSHAGmcQEIC8l2Ts1u6x5Dfrqg= github.com/grpc-ecosystem/go-grpc-middleware v1.2.0/go.mod h1:mJzapYve32yjrKlk9GbyCZHuPgZsrbyIbyKhSzOpg6s= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.14.4/go.mod h1:6CwZWGDSPRJidgKAtJVvND6soZe6fT7iteq8wDPdhb0= -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= github.com/hako/durafmt v0.0.0-20200710122514-c0fb7b4da026/go.mod h1:5Scbynm8dF1XAPwIwkGPqzkM/shndPm79Jd1003hTjE= -github.com/hannahhoward/cbor-gen-for v0.0.0-20200817222906-ea96cece81f1 h1:F9k+7wv5OIk1zcq23QpdiL0hfDuXPjuOmMNaC6fgQ0Q= github.com/hannahhoward/cbor-gen-for v0.0.0-20200817222906-ea96cece81f1/go.mod h1:jvfsLIxk0fY/2BKSQ1xf2406AKA5dwMmKKv0ADcOfN8= -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.4.0/go.mod h1:xc8u05kyMa3Wjr9eEAsIAo3dg8+LywT5E/Cl7cNS5nU= @@ -790,7 +756,6 @@ 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/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= @@ -804,7 +769,6 @@ github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjh 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-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= @@ -819,7 +783,6 @@ github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA 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= @@ -838,16 +801,13 @@ github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbc 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 h1:RfGLP+h3mvisuWEyybxNq5Eft3NWhHLPeUN72kpKZoI= github.com/huin/goupnp v1.0.2/go.mod h1:0dxJBVBHqTMjIUMkESDTNgOOx/Mw5wYIfyFmdzSamkM= github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0/go.mod h1:N0Wam8K1arqPXNWjMo21EXnBPOPp36vB07FNRdD2geA= github.com/iancoleman/orderedmap v0.1.0/go.mod h1:N0Wam8K1arqPXNWjMo21EXnBPOPp36vB07FNRdD2geA= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/icrowley/fake v0.0.0-20180203215853-4178557ae428/go.mod h1:uhpZMVGznybq1itEKXj6RYw9I71qK4kH+OGMjRC4KEo= -github.com/icza/backscanner v0.0.0-20210726202459-ac2ffc679f94 h1:9tcYMdi+7Rb1y0E9Del1DRHui7Ne3za5lLw6CjMJv/M= github.com/icza/backscanner v0.0.0-20210726202459-ac2ffc679f94/go.mod h1:GYeBD1CF7AqnKZK+UCytLcY3G+UKo0ByXX/3xfdNyqQ= -github.com/icza/mighty v0.0.0-20180919140131-cfd07d671de6 h1:8UsGZ2rr2ksmEru6lToqnXgA8Mz1DP11X4zSJ159C3k= github.com/icza/mighty v0.0.0-20180919140131-cfd07d671de6/go.mod h1:xQig96I1VNBDIWGCdTt54nHt6EeI639SmHycLYL7FkA= github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= @@ -856,12 +816,10 @@ github.com/influxdata/flux v0.65.0/go.mod h1:BwN2XG2lMszOoquQaFdPET8FRQfrXiZsWmc github.com/influxdata/flux v0.127.3/go.mod h1:Zc0P/HNnJnhBlm4QsmsBbAeAdtccKo4Eu0OfkP3RCk0= github.com/influxdata/httprouter v1.3.1-0.20191122104820-ee83e2772f69/go.mod h1:pwymjR6SrP3gD3pRj9RJwdl1j5s3doEEV8gS4X9qSzA= github.com/influxdata/influxdb v1.8.0/go.mod h1:SIzcnsjaHRFpmlxpJ4S3NT64qtEKYweNTUMb/vh0OMQ= -github.com/influxdata/influxdb v1.9.4 h1:hZMq5fd4enVnruYHd7qCHsqG7kWQ/msA6x+kCvGFsRY= github.com/influxdata/influxdb v1.9.4/go.mod h1:dR0WCHqaHPpJLaqWnRSl/QHsbXJR+QpofbZXyTc8ccw= github.com/influxdata/influxdb-client-go/v2 v2.3.1-0.20210518120617-5d1fff431040/go.mod h1:vLNHdxTJkIf2mSLvGrpj8TCcISApPoXkaxP8g9uRlW8= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/influxdata/influxdb1-client v0.0.0-20200515024757-02f0bf5dbca3/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= -github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab h1:HqW4xhhynfjrtEiiSGcQUd6vrK23iMam1FO8rI7mwig= github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/influxdata/influxql v1.1.0/go.mod h1:KpVI7okXjK6PRi3Z5B+mtKZli+R1DnZgb3N+tzevNgo= github.com/influxdata/influxql v1.1.1-0.20210223160523-b6ab99450c93/go.mod h1:gHp9y86a/pxhjJ+zMjNXiQAA197Xk9wLxaz+fGG+kWk= @@ -874,20 +832,16 @@ github.com/influxdata/tdigest v0.0.0-20181121200506-bf2b5ad3c0a9/go.mod h1:Js0mq github.com/influxdata/tdigest v0.0.2-0.20210216194612-fc98d27c9e8b/go.mod h1:Z0kXnxzbTC2qrx4NaIzYkE1k66+6oEDQTvL95hQFh5Y= github.com/influxdata/usage-client v0.0.0-20160829180054-6d3895376368/go.mod h1:Wbbw6tYNvwa5dlB6304Sd+82Z3f7PmVZHVKU637d4po= github.com/ipfs/bbloom v0.0.1/go.mod h1:oqo8CVWsJFMOZqTglBG4wydCE4IQA/G2/SEofB0rjUI= -github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs= github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0= 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.5.1 h1:721YAEDBnLIrvcIMkCHCdqp34hA8jwL9yKMkyJpSpco= github.com/ipfs/go-bitswap v0.5.1/go.mod h1:P+ckC87ri1xFLvk74NlXdP0Kj9RmWAh4+H78sC6Qopo= 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= 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.2.1 h1:NJ4j/cwEfIg60rzAWcCIxRtOwbf6ZPK49MewNxObCPQ= github.com/ipfs/go-blockservice v0.2.1/go.mod h1:k6SiwmgyYgs4M/qt+ww6amPeUH9EISLRBnvUurKJhi8= 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= @@ -898,9 +852,7 @@ github.com/ipfs/go-cid v0.0.5/go.mod h1:plgt+Y5MnOey4vO4UlUazGqdbEXuFYitED67Fexh github.com/ipfs/go-cid v0.0.6-0.20200501230655-7c82f3b81c00/go.mod h1:plgt+Y5MnOey4vO4UlUazGqdbEXuFYitED67FexhXog= github.com/ipfs/go-cid v0.0.6/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= github.com/ipfs/go-cid v0.0.7/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= -github.com/ipfs/go-cid v0.1.0 h1:YN33LQulcRHjfom/i25yoOZR4Telp1Hr/2RU3d0PnC0= github.com/ipfs/go-cid v0.1.0/go.mod h1:rH5/Xv83Rfy8Rw6xG+id3DYAMUVmem1MowoKwdXmN2o= -github.com/ipfs/go-cidutil v0.0.2 h1:CNOboQf1t7Qp0nuNh8QMmhJs0+Q//bRL1axtCnIB1Yo= github.com/ipfs/go-cidutil v0.0.2/go.mod h1:ewllrvrxG6AMYStla3GD7Cqn+XYSLqjK0vc+086tB6s= github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= github.com/ipfs/go-datastore v0.0.5/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= @@ -913,9 +865,7 @@ github.com/ipfs/go-datastore v0.4.4/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13X github.com/ipfs/go-datastore v0.4.5/go.mod h1:eXTcaaiN6uOlVCLS9GjJUJtlvJfM3xk23w3fyfrmmJs= github.com/ipfs/go-datastore v0.4.7-0.20211013204805-28a3721c2e66/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= 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-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= github.com/ipfs/go-ds-badger v0.0.5/go.mod h1:g5AuuCGmr7efyzQhLL8MzwqcauPojGPUaHzfGTzuE3s= @@ -923,89 +873,63 @@ github.com/ipfs/go-ds-badger v0.0.7/go.mod h1:qt0/fWzZDoPW6jpQeqUjR5kBfhDNB65jd9 github.com/ipfs/go-ds-badger v0.2.1/go.mod h1:Tx7l3aTph3FMFrRS838dcSJh+jjA7cX9DrGVwx/NOwE= github.com/ipfs/go-ds-badger v0.2.3/go.mod h1:pEYw0rgg3FIrywKKnL+Snr+w/LjJZVMTBRn4FS6UHUk= github.com/ipfs/go-ds-badger v0.2.7/go.mod h1:02rnztVKA4aZwDuaRPTf8mpqcKmXP7mLl6JPxd14JHA= -github.com/ipfs/go-ds-badger v0.3.0 h1:xREL3V0EH9S219kFFueOYJJTcjgNSZ2HY1iSvN7U1Ro= 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-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= github.com/ipfs/go-ds-leveldb v0.4.2/go.mod h1:jpbku/YqBSsBc1qgME8BkWS4AxzF2cEu1Ii2r79Hh9s= -github.com/ipfs/go-ds-leveldb v0.5.0 h1:s++MEBbD3ZKc9/8/njrn4flZLnCuY9I79v94gBUNumo= 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-filestore v1.1.0 h1:Pu4tLBi1bucu6/HU9llaOmb9yLFk/sgP+pW764zNDoE= github.com/ipfs/go-filestore v1.1.0/go.mod h1:6e1/5Y6NvLuCRdmda/KA4GUhXJQ3Uat6vcWm2DJfxc8= -github.com/ipfs/go-fs-lock v0.0.6 h1:sn3TWwNVQqSeNjlWy6zQ1uUGAZrV3hPOyEA6y1/N2a0= github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28L7zESmM= github.com/ipfs/go-graphsync v0.11.0/go.mod h1:wC+c8vGVjAHthsVIl8LKr37cUra2GOaMYcQNNmMxDqE= -github.com/ipfs/go-graphsync v0.11.5 h1:WA5hVxGBtcal6L6nqubKiqRolaZxbexOK3GumGFJRR4= github.com/ipfs/go-graphsync v0.11.5/go.mod h1:+/sZqRwRCQRrV7NCzgBtufmr5QGpUE98XSa7NlsztmM= 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.2.1/go.mod h1:jGesd8EtCM3/zPgx+qr0/feTXGUeRai6adgwC+Q+JvE= github.com/ipfs/go-ipfs-blockstore v1.1.0/go.mod h1:5QDUApRqpgPcfGstCxYeMnjt/DYQtXXdJVCvxHHuWVk= github.com/ipfs/go-ipfs-blockstore v1.1.1/go.mod h1:w51tNR9y5+QXB0wkNcHt4O2aSZjTdqaEWaQdSxEyUOY= -github.com/ipfs/go-ipfs-blockstore v1.1.2 h1:WCXoZcMYnvOTmlpX+RSSnhVN0uCmbWTeepTGX5lgiXw= github.com/ipfs/go-ipfs-blockstore v1.1.2/go.mod h1:w51tNR9y5+QXB0wkNcHt4O2aSZjTdqaEWaQdSxEyUOY= -github.com/ipfs/go-ipfs-blocksutil v0.0.1 h1:Eh/H4pc1hsvhzsQoMEP3Bke/aW5P5rVM1IWFJMcGIPQ= github.com/ipfs/go-ipfs-blocksutil v0.0.1/go.mod h1:Yq4M86uIOmxmGPUHv/uI7uKqZNtLb449gwKqXjIsnRk= 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.3.0 h1:mi9oYrSCox5aBhutqAYqw6/9crlyGbw4E/aJtwS4zI4= github.com/ipfs/go-ipfs-cmds v0.3.0/go.mod h1:ZgYiWVnCk43ChwoH8hAmI1IRbuVtq3GSTHwtRB/Kqhk= -github.com/ipfs/go-ipfs-config v0.5.3 h1:3GpI/xR9FoJNTjU6YvCMRbYyEi0dBVY5UtlUTcNRlSA= github.com/ipfs/go-ipfs-config v0.5.3/go.mod h1:nSLCFtlaL+2rbl3F+9D4gQZQbT1LjRKx7TJg/IHz6oM= github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= -github.com/ipfs/go-ipfs-delay v0.0.1 h1:r/UXYyRcddO6thwOnhiznIAiSvxMECGgtv35Xs1IeRQ= 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= -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-offline v0.0.1/go.mod h1:WhHSFCVYX36H/anEKQboAzpUws3x7UeEGkzQc3iNkM0= -github.com/ipfs/go-ipfs-exchange-offline v0.1.1 h1:mEiXWdbMN6C7vtDG21Fphx8TGCbZPpQnz/496w/PL4g= github.com/ipfs/go-ipfs-exchange-offline v0.1.1/go.mod h1:vTiBRIbzSwDD0OWm+i3xeT0mO7jG2cbJYatp3HPk5XY= 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 h1:OFyOfmuVDu9c5YtjSDORmwXzE6fmZikzZpzsnNkgFEg= github.com/ipfs/go-ipfs-files v0.0.9/go.mod h1:aFv2uQ/qxWpL/6lidWvnSQmaVqCrf0TBGoUr+C1Fo84= -github.com/ipfs/go-ipfs-http-client v0.0.6 h1:k2QllZyP7Fz5hMgsX5hvHfn1WPG9Ngdy5WknQ7JNhBM= github.com/ipfs/go-ipfs-http-client v0.0.6/go.mod h1:8e2dQbntMZKxLfny+tyXJ7bJHZFERp/2vyzZdvkeLMc= -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-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= github.com/ipfs/go-ipfs-routing v0.2.1/go.mod h1:xiNNiwgjmLqPS1cimvAw6EyB9rkVDbiocA4yY+wRNLM= github.com/ipfs/go-ipfs-util v0.0.1/go.mod h1:spsl5z8KUnrve+73pOhSVZND1SIxPW5RyBCNzQxlJBc= -github.com/ipfs/go-ipfs-util v0.0.2 h1:59Sswnk1MFaiq+VcaknX7aYEyGyGDAA73ilhEK2POp8= github.com/ipfs/go-ipfs-util v0.0.2/go.mod h1:CbPtkWJzjLdEcezDns2XYaehFVNXG9zrdrtMecczcsQ= github.com/ipfs/go-ipld-cbor v0.0.2/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= github.com/ipfs/go-ipld-cbor v0.0.3/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= github.com/ipfs/go-ipld-cbor v0.0.4/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= github.com/ipfs/go-ipld-cbor v0.0.5/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= github.com/ipfs/go-ipld-cbor v0.0.6-0.20211211231443-5d9b9e1f6fa8/go.mod h1:ssdxxaLJPXH7OjF5V4NSjBbcfh+evoR4ukuru0oPXMA= -github.com/ipfs/go-ipld-cbor v0.0.6 h1:pYuWHyvSpIsOOLw4Jy7NbBkCyzLDcl64Bf/LZW7eBQ0= github.com/ipfs/go-ipld-cbor v0.0.6/go.mod h1:ssdxxaLJPXH7OjF5V4NSjBbcfh+evoR4ukuru0oPXMA= github.com/ipfs/go-ipld-format v0.0.1/go.mod h1:kyJtbkDALmFHv3QR6et67i35QzO3S0dCDnkOJhcZkms= github.com/ipfs/go-ipld-format v0.0.2/go.mod h1:4B6+FM2u9OJ9zCV+kSbgFAZlOrv1Hqbf0INGQgiKf9k= -github.com/ipfs/go-ipld-format v0.2.0 h1:xGlJKkArkmBvowr+GMCX0FEZtkro71K1AwiKnL37mwA= github.com/ipfs/go-ipld-format v0.2.0/go.mod h1:3l3C1uKoadTPbeNfrDi+xMInYKlx2Cvg1BuydPSdzQs= 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-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= github.com/ipfs/go-log v1.0.0/go.mod h1:JO7RzlMK6rA+CIxFMLOuB6Wf5b81GDiKElL7UPSIKjA= @@ -1013,7 +937,6 @@ github.com/ipfs/go-log v1.0.1/go.mod h1:HuWlQttfN6FWNHRhlY5yMk/lW7evQC0HHGOxEwMR github.com/ipfs/go-log v1.0.2/go.mod h1:1MNjMxe0u6xvJZgeqbJ8vdo2TKaGwZ1a0Bpza+sr2Sk= github.com/ipfs/go-log v1.0.3/go.mod h1:OsLySYkwIbiSUR/yBTdv1qPtcE4FW3WPWk/ewz9Ru+A= github.com/ipfs/go-log v1.0.4/go.mod h1:oDCg2FkjogeFOhqqb+N39l2RpTNPL6F/StPkB3kPgcs= -github.com/ipfs/go-log v1.0.5 h1:2dOuUCB1Z7uoczMWgAyDck5JLb72zHzrMnGnCNNbvY8= github.com/ipfs/go-log v1.0.5/go.mod h1:j0b8ZoR+7+R99LD9jZ6+AJsrzkPbSXbZfGakb5JPtIo= github.com/ipfs/go-log/v2 v2.0.1/go.mod h1:O7P1lJt27vWHhOwQmcFEvlmo49ry2VY2+JfBWFaa9+0= github.com/ipfs/go-log/v2 v2.0.2/go.mod h1:O7P1lJt27vWHhOwQmcFEvlmo49ry2VY2+JfBWFaa9+0= @@ -1025,46 +948,33 @@ github.com/ipfs/go-log/v2 v2.1.2-0.20200626104915-0016c0b4b3e4/go.mod h1:2v2nsGf github.com/ipfs/go-log/v2 v2.1.2/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHntrv9KM= 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 h1:iR/2o9PGWanVJrBgIH5Ff8mPGOwpqLaPIAFqSnsdlzk= github.com/ipfs/go-log/v2 v2.4.0/go.mod h1:nPZnh7Cj7lwS3LpRU5Mwr2ol1c2gXIEXuF6aywqrtmo= github.com/ipfs/go-merkledag v0.0.6/go.mod h1:QYPdnlvkOg7GnQRofu9XZimC5ZW5Wi3bKys/4GQQfto= 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.5.1 h1:tr17GPP5XtPhvPPiWtu20tSGZiZDuTaJRXBLcr79Umk= github.com/ipfs/go-merkledag v0.5.1/go.mod h1:cLMZXx8J08idkp5+id62iVftUQV+HlYJ3PIhDfZsjA4= -github.com/ipfs/go-metrics-interface v0.0.1 h1:j+cpbjYvu4R8zbleSs36gvB7jR+wsL2fGD6n0jO4kdg= github.com/ipfs/go-metrics-interface v0.0.1/go.mod h1:6s6euYU4zowdslK0GKHmqaIZ3j/b/tL7HTWtJ4VPgWY= github.com/ipfs/go-metrics-prometheus v0.0.2/go.mod h1:ELLU99AQQNi+zX6GCGm2lAgnzdSH3u5UVlCdqSXnEks= -github.com/ipfs/go-path v0.0.7 h1:H06hKMquQ0aYtHiHryOMLpQC1qC3QwXwkahcEVD51Ho= github.com/ipfs/go-path v0.0.7/go.mod h1:6KTKmeRnBXgqrTvzFrPV3CamxcgvXX/4z79tfAd2Sno= 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.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-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 h1:gq3U3T2vh8x6tXhfo3uSO3n+2z4yW0tYtNgVP/3sIyA= github.com/ipfs/go-unixfs v0.2.6/go.mod h1:GTTzQvaZsTZARdNkkdjDKFFnBhmO3e5mIM1PkH/x4p0= -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 h1:+mUiamyHIwedqP8ZgbCIwpy40oX7QcXUbo4CZOeJVJg= github.com/ipfs/interface-go-ipfs-core v0.4.0/go.mod h1:UJBcU6iNennuI05amq3FQ7g0JHUkibHFAfhfUIy927o= -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/ipld/go-car v0.1.0/go.mod h1:RCWzaUh2i4mOEkB3W45Vc+9jnS/M6Qay5ooytiBHl3g= github.com/ipld/go-car v0.3.3-0.20211210032800-e6f244225a16/go.mod h1:/wkKF4908ULT4dFIFIUZYcfjAnj+KFnJvlh8Hsz1FbQ= -github.com/ipld/go-car v0.3.3 h1:D6y+jvg9h2ZSv7GLUMWUwg5VTLy1E7Ak+uQw5orOg3I= github.com/ipld/go-car v0.3.3/go.mod h1:/wkKF4908ULT4dFIFIUZYcfjAnj+KFnJvlh8Hsz1FbQ= github.com/ipld/go-car/v2 v2.1.1-0.20211211000942-be2525f6bf2d/go.mod h1:+2Yvf0Z3wzkv7NeI69i8tuZ+ft7jyjPYIWZzeVNeFcI= -github.com/ipld/go-car/v2 v2.1.1 h1:saaKz4nC0AdfCGHLYKeXLGn8ivoPC54fyS55uyOLKwA= github.com/ipld/go-car/v2 v2.1.1/go.mod h1:+2Yvf0Z3wzkv7NeI69i8tuZ+ft7jyjPYIWZzeVNeFcI= github.com/ipld/go-codec-dagpb v1.2.0/go.mod h1:6nBN7X7h8EOsEejZGqC7tej5drsdBAXbMHyBT+Fne5s= -github.com/ipld/go-codec-dagpb v1.3.0 h1:czTcaoAuNNyIYWs6Qe01DJ+sEX7B+1Z0LcXjSatMGe8= github.com/ipld/go-codec-dagpb v1.3.0/go.mod h1:ga4JTU3abYApDC3pZ00BC2RSvC3qfBb9MSJkMLSwnhA= github.com/ipld/go-ipld-prime v0.0.2-0.20191108012745-28a82f04c785/go.mod h1:bDDSvVz7vaK12FNvMeRYnpRFkSUPNQOiCYQezMD/P3w= github.com/ipld/go-ipld-prime v0.9.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= @@ -1074,47 +984,35 @@ github.com/ipld/go-ipld-prime v0.11.0/go.mod h1:+WIAkokurHmZ/KwzDOMUuoeJgaRQktHt 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.3-0.20211207234443-319145880958/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= -github.com/ipld/go-ipld-prime v0.14.3 h1:cGUmxSws2IHurn00/iLMDapeXsnf9+FyAtYVy8G/JsQ= github.com/ipld/go-ipld-prime v0.14.3/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= github.com/ipld/go-ipld-prime-proto v0.0.0-20191113031812-e32bd156a1e5/go.mod h1:gcvzoEDBjwycpXt3LBE061wT9f46szXGHAmj9uoP6fU= -github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20211210234204-ce2a1c70cd73 h1:TsyATB2ZRRQGTwafJdgEUQkmjOExRV0DNokcihZxbnQ= 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/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= github.com/jackpal/go-nat-pmp v1.0.1/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= -github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jbenet/go-cienv v0.0.0-20150120210510-1bb1476777ec/go.mod h1:rGaEvXB4uRSZMmzKNLoXvTu1sfx+1kv/DojUlPrSZGs= github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= -github.com/jbenet/go-random v0.0.0-20190219211222-123a90aedc0c h1:uUx61FiAa1GI6ZmVd2wf2vULeQZIKG66eybjNXKYCz4= github.com/jbenet/go-random v0.0.0-20190219211222-123a90aedc0c/go.mod h1:sdx1xVM9UuLw1tXnhJWN3piypTUO3vCIHYmG15KE/dU= github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2/go.mod h1:8GXXJV31xl8whumTzdZsTt3RnUIiPqzkyf7mxToRCMs= -github.com/jbenet/go-temp-err-catcher v0.1.0 h1:zpb3ZH6wIE8Shj2sKS+khgRvf7T7RABoLk/+KKHggpk= github.com/jbenet/go-temp-err-catcher v0.1.0/go.mod h1:0kJRvmDZXNMIiJirNPEYfhpPwbGVtZVWC34vc5WLsDk= github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY= github.com/jbenet/goprocess v0.1.3/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= -github.com/jbenet/goprocess v0.1.4 h1:DRGOFReOMqqDNXwW70QkacFW0YN9QnwLV0Vqk+3oU0o= github.com/jbenet/goprocess v0.1.4/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jessevdk/go-flags v1.4.0 h1:4IU2WS7AumrZ/40jfhf4QVDMsQwqA7VEHozFRrGARJA= 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/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/jonboulle/clockwork v0.1.1-0.20190114141812-62fb9bc030d1/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jonboulle/clockwork v0.2.2 h1:UOGuzwb1PwsrDAObMuhUnj0p5ULPj8V/xJ7Kx9qUBdQ= github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= -github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/jsimonetti/rtnetlink v0.0.0-20190606172950-9527aa82566a/go.mod h1:Oz+70psSo5OFh8DBl0Zv2ACw7Esh6pPUphlvZG9x7uw= @@ -1132,22 +1030,18 @@ github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/X github.com/jsternberg/zap-logfmt v1.0.0/go.mod h1:uvPs/4X51zdkcm5jXl5SYoN+4RK21K8mysFmDaM/h+o= github.com/jsternberg/zap-logfmt v1.2.0/go.mod h1:kz+1CUmCutPWABnNkOu9hOHKdT2q3TDYCcsFy9hpqb0= github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= 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/jwilder/encoding v0.0.0-20170811194829-b4e1701a28ef/go.mod h1:Ct9fl0F6iIOGgxJ5npU/IUOhOhqlVrGjyIZc8/MagT0= -github.com/kabukky/httpscerts v0.0.0-20150320125433-617593d7dcb3 h1:Iy7Ifq2ysilWU4QlCx/97OoI4xT1IV7i8byT/EyIT/M= 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/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4= github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= -github.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8= github.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg= github.com/kilic/bls12-381 v0.0.0-20200607163746-32e1441c8a9f/go.mod h1:XXfR6YFCRSrkEXbNlIyDsgXVNJWVUV30m/ebkVy9n6s= github.com/kilic/bls12-381 v0.0.0-20200731194930-64c428e1bff5/go.mod h1:XXfR6YFCRSrkEXbNlIyDsgXVNJWVUV30m/ebkVy9n6s= -github.com/kilic/bls12-381 v0.0.0-20200820230200-6b2c19996391 h1:51kHw7l/dUDdOdW06AlUGT5jnpj6nqQSILebcsikSjA= github.com/kilic/bls12-381 v0.0.0-20200820230200-6b2c19996391/go.mod h1:XXfR6YFCRSrkEXbNlIyDsgXVNJWVUV30m/ebkVy9n6s= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= @@ -1158,13 +1052,10 @@ github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0 github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= 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 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5 h1:2U0HzY8BJ8hVwDKIzp7y4voR9CX/nvcfymLmg2UiOio= github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= 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 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= 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= @@ -1173,21 +1064,17 @@ 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/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= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v0.0.0-20160406211939-eadb3ce320cb/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg= @@ -1195,27 +1082,21 @@ github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/libp2p/go-addr-util v0.0.1/go.mod h1:4ac6O7n9rIAKB1dnd+s8IbbMXkt+oBpzX4/+RACcnlQ= github.com/libp2p/go-addr-util v0.0.2/go.mod h1:Ecd6Fb3yIuLzq4bD7VcywcVSBtefcAwnUISBM3WG15E= -github.com/libp2p/go-addr-util v0.1.0 h1:acKsntI33w2bTU7tC9a0SaPimJGfSI0bFKC18ChxeVI= 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-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= github.com/libp2p/go-conn-security-multistream v0.0.2/go.mod h1:nc9vud7inQ+d6SO0I/6dSWrdMnHnzZNHeyUQqrAJulE= github.com/libp2p/go-conn-security-multistream v0.1.0/go.mod h1:aw6eD7LOsHEX7+2hJkDxw1MteijaVcI+/eP2/x3J1xc= 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 h1:9UCIKlBL1hC9u7nkMXpD1nkc/T53PKMAn3/k9ivBAVc= github.com/libp2p/go-conn-security-multistream v0.3.0/go.mod h1:EEP47t4fw/bTelVmEzIDqSe69hO/ip52xBEhZMLWAHM= 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-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-libp2p v0.0.30/go.mod h1:XWT8FGHlhptAv1+3V/+J5mEpzyui/5bvFsNuWYs611A= github.com/libp2p/go-libp2p v0.1.0/go.mod h1:6D/2OBauqLUoqcADOJpn9WbKqvaM07tDw68qHM0BxUM= @@ -1231,10 +1112,8 @@ github.com/libp2p/go-libp2p v0.10.0/go.mod h1:yBJNpb+mGJdgrwbKAKrhPU0u3ogyNFTfjJ 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 h1:8l4GV401OSd4dFRyHDtIT/mEzdh/aQGoFC8xshYgm5M= github.com/libp2p/go-libp2p v0.17.0/go.mod h1:Fkin50rsGdv5mm5BshBUtPRZknt9esfmYXBOYcwOTgw= 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 h1:rABPCO77SjdbJ/eJ/ynIo8vWICy1VEnL5JAxJbQLo1E= github.com/libp2p/go-libp2p-asn-util v0.1.0/go.mod h1:wu+AnM9Ii2KgO5jMmS1rz9dvzTdj8BXqsPR9HR0XB7I= github.com/libp2p/go-libp2p-autonat v0.0.6/go.mod h1:uZneLdOkZHro35xIhpbtTzLlgYturpu4J5+0cZK3MqE= github.com/libp2p/go-libp2p-autonat v0.1.0/go.mod h1:1tLf2yXxiE/oKGtDwPYWTSYG3PtvYlJmg7NeVtPRqH8= @@ -1245,7 +1124,6 @@ github.com/libp2p/go-libp2p-autonat v0.2.2/go.mod h1:HsM62HkqZmHR2k1xgX34WuWDzk/ github.com/libp2p/go-libp2p-autonat v0.2.3/go.mod h1:2U6bNWCNsAG9LEbwccBDQbjzQ8Krdjge1jLTE9rdoMM= 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 h1:rCP5s+A2dlhM1Xd66wurE0k7S7pPmM0D+FlqqSBXxks= 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= @@ -1254,7 +1132,6 @@ github.com/libp2p/go-libp2p-blankhost v0.1.3/go.mod h1:KML1//wiKR8vuuJO0y3LUd1uL github.com/libp2p/go-libp2p-blankhost v0.1.4/go.mod h1:oJF0saYsAXQCSfDq254GMNmLNz6ZTHTOvtF4ZydUvwU= github.com/libp2p/go-libp2p-blankhost v0.1.6/go.mod h1:jONCAJqEP+Z8T6EQviGL4JsQcLx1LgTGtVqFNY8EMfQ= 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= @@ -1264,11 +1141,9 @@ github.com/libp2p/go-libp2p-circuit v0.1.4/go.mod h1:CY67BrEjKNDhdTk8UgBX1Y/H5c3 github.com/libp2p/go-libp2p-circuit v0.2.1/go.mod h1:BXPwYDN5A8z4OEY9sOfr2DUQMLQvKt/6oku45YUmjIo= 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 h1:eqQ3sEYkGTtybWgr6JLqJY6QLtPWRErvFjFDfAOO1wc= github.com/libp2p/go-libp2p-circuit v0.4.0/go.mod h1:t/ktoFIUzM6uLQ+o1G6NuBl2ANhBKN9Bc8jRIk31MoA= 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 h1:yerFXrYa0oxpuVsLlndwm/bLulouHYDcvFrY/4H4fx8= github.com/libp2p/go-libp2p-connmgr v0.3.0/go.mod h1:RVoyPjJm0J9Vd1m6qUN2Tn7kJm4rL1Ml20pFsFgPGik= github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= github.com/libp2p/go-libp2p-core v0.0.2/go.mod h1:9dAcntw/n46XycV4RnlBq3BpgrmyUi9LuoTNdPrbUco= @@ -1303,7 +1178,6 @@ github.com/libp2p/go-libp2p-core v0.9.0/go.mod h1:ESsbz31oC3C1AvMJoGx26RTuCkNhmk github.com/libp2p/go-libp2p-core v0.10.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= 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 h1:IFG/s8dN6JN2OTrXX9eq2wNU/Zlz2KLdwZUp5FplgXI= github.com/libp2p/go-libp2p-core v0.13.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= 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= @@ -1315,7 +1189,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.4.0/go.mod h1:bZ0aJSrFc/eX2llP0ryhb1kpgkPyTo23SJ5b7UQCMh4= github.com/libp2p/go-libp2p-discovery v0.5.0/go.mod h1:+srtPIU9gDaBNu//UHvcdliKBIcr4SfDcm0/PfPJLug= -github.com/libp2p/go-libp2p-discovery v0.6.0 h1:1XdPmhMJr8Tmj/yUfkJMIi8mgwWrLUsCB3bMxdT+DSo= github.com/libp2p/go-libp2p-discovery v0.6.0/go.mod h1:/u1voHt0tKIe5oIA1RHBKQLVCWPna2dXmPNHc2zR9S8= 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= @@ -1324,14 +1197,11 @@ 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-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= 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= @@ -1340,20 +1210,16 @@ github.com/libp2p/go-libp2p-mplex v0.2.1/go.mod h1:SC99Rxs8Vuzrf/6WhmH41kNn13TiY 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.4.0/go.mod h1:yCyWJE2sc6TBTnFpjvLuEJgTSw/u+MamvzILKdX7asw= -github.com/libp2p/go-libp2p-mplex v0.4.1 h1:/pyhkP1nLwjG3OM+VuaNJkQT/Pqq73WzB3aDN3Fx1sc= github.com/libp2p/go-libp2p-mplex v0.4.1/go.mod h1:cmy+3GfqfM1PceHTLL7zQzAAYaryDu6iPSC+CIb094g= 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= -github.com/libp2p/go-libp2p-nat v0.1.0 h1:vigUi2MEN+fwghe5ijpScxtbbDz+L/6y8XwlzYOJgSY= github.com/libp2p/go-libp2p-nat v0.1.0/go.mod h1:DQzAG+QbDYjN1/C3B6vXucLtz3u9rEonLVPtZVzQqks= 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-noise v0.2.0/go.mod h1:IEbYhBBzGyvdLBoxxULL/SGbJARhUeqlO8lVSREYu2Q= -github.com/libp2p/go-libp2p-noise v0.3.0 h1:NCVH7evhVt9njbTQshzT7N1S3Q6fjj9M11FCgfH5+cA= github.com/libp2p/go-libp2p-noise v0.3.0/go.mod h1:JNjHbociDJKHD64KTkzGnzqJ0FEV5gHJa6AB00kbCNQ= github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo= github.com/libp2p/go-libp2p-peer v0.1.1/go.mod h1:jkF12jGB4Gk/IOo+yomm+7oLWxF278F7UnrYUQ1Q8es= @@ -1372,17 +1238,13 @@ 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.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 h1:HJminhQSGISBIRb93N6WK3t6Fa8OOTnHd/VBjL4mY5A= github.com/libp2p/go-libp2p-peerstore v0.6.0/go.mod h1:DGEmKdXrcYpK9Jha3sS7MhqYdInxJy84bIPtSu65bKc= -github.com/libp2p/go-libp2p-pnet v0.2.0 h1:J6htxttBipJujEjz1y0a5+eYoiPcFHhSYHH6na5f0/k= 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.3.2/go.mod h1:Uss7/Cfz872KggNb+doCVPHeCDmXB7z500m/R8DaAUk= -github.com/libp2p/go-libp2p-pubsub v0.6.0 h1:98+RXuEWW17U6cAijK1yaTf6mw/B+n5yPA421z+dlo0= github.com/libp2p/go-libp2p-pubsub v0.6.0/go.mod h1:nJv87QM2cU0w45KPR1rZicq+FmFIOD16zmT+ep1nOmg= -github.com/libp2p/go-libp2p-pubsub-tracer v0.0.0-20200626141350-e730b32bf1e6 h1:2lH7rMlvDPSvXeOR+g7FE6aqiEwxtpxWKQL8uigk5fQ= github.com/libp2p/go-libp2p-pubsub-tracer v0.0.0-20200626141350-e730b32bf1e6/go.mod h1:8ZodgKS4qRLayfw9FDKDd9DX4C16/GMofDxSldG8QPI= github.com/libp2p/go-libp2p-quic-transport v0.1.1/go.mod h1:wqG/jzhF3Pu2NrhJEvE+IE0NTHNXslOPn9JQzyCAxzU= github.com/libp2p/go-libp2p-quic-transport v0.5.0/go.mod h1:IEcuC5MLxvZ5KuHKjRu+dr3LjCT1Be3rcD/4d8JrX8M= @@ -1390,17 +1252,14 @@ github.com/libp2p/go-libp2p-quic-transport v0.10.0/go.mod h1:RfJbZ8IqXIhxBRm5hqU 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= 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 h1:wHBEceRy+1/8Ec8dAIyr+/P7L2YefIGprPVy5LrMM+k= github.com/libp2p/go-libp2p-quic-transport v0.15.2/go.mod h1:wv4uGwjcqe8Mhjj7N/Ic0aKjA+/10UnMlSzLO0yRpYQ= 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-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= github.com/libp2p/go-libp2p-secio v0.1.0/go.mod h1:tMJo2w7h3+wN4pgU2LSYeiKPrfqBgkOsdiKK77hE7c8= @@ -1419,7 +1278,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.5.3/go.mod h1:NBn7eNW2lu568L7Ns9wdFrOhgRlkRnIDg0FLKbuu3i8= github.com/libp2p/go-libp2p-swarm v0.8.0/go.mod h1:sOMp6dPuqco0r0GHTzfVheVBh6UEL0L1lXUZ5ot2Fvc= -github.com/libp2p/go-libp2p-swarm v0.9.0 h1:LdWjHDVjPMYt3NCG2EHcQiIP8XzA8BHhHz8ZLAYol2Y= github.com/libp2p/go-libp2p-swarm v0.9.0/go.mod h1:2f8d8uxTJmpeqHF/1ujjdXZp+98nNIbujVOMEZxCbZ8= 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= @@ -1432,11 +1290,9 @@ github.com/libp2p/go-libp2p-testing v0.3.0/go.mod h1:efZkql4UZ7OVsEfaxNHZPzIehts github.com/libp2p/go-libp2p-testing v0.4.0/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotlKsNSbKQ/lImlOWF0= 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 h1:tV/wz6mS1VoAYA/5DGTiyzw9TJ+eXMCMvzU5VPLJSgg= github.com/libp2p/go-libp2p-testing v0.6.0/go.mod h1:QBk8fqIL1XNcno/l3/hhaIEn4aLRijpYOR+zVjjlh+A= 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 h1:lsE2zYte+rZCEOHF72J1Fg3XK3dGQyKvI6i5ehJfEp0= github.com/libp2p/go-libp2p-tls v0.3.1/go.mod h1:fwF5X6PWGxm6IDRwF3V8AVCCj/hOd5oFlg+wo2FxJDY= github.com/libp2p/go-libp2p-transport v0.0.1/go.mod h1:UzbUs9X+PHOSw7S3ZmeOxfnwaQY5vGDzZmKPod3N3tk= github.com/libp2p/go-libp2p-transport v0.0.5/go.mod h1:StoY3sx6IqsP6XKoabsPnHCwqKXWUMWU7Rfcsubee/A= @@ -1448,7 +1304,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.4.6/go.mod h1:JE0WQuQdy+uLZ5zOaI3Nw9dWGYJIA7mywEtP2lMvnyk= 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 h1:GfMCU+2aGGEm1zW3UcOz6wYSn8tXQalFfVfcww99i5A= github.com/libp2p/go-libp2p-transport-upgrader v0.6.0/go.mod h1:1e07y1ZSZdHo9HPbuU8IztM1Cj+DR5twgycb4pnRzRo= github.com/libp2p/go-libp2p-xor v0.0.0-20210714161855-5c005aca55db/go.mod h1:LSTM5yRnjGZbWNTA/hRwq2gGFrvRIbQJscoIL/u6InY= github.com/libp2p/go-libp2p-yamux v0.1.2/go.mod h1:xUoV/RmYkg6BW/qGxA9XJyg+HzXFYkeXbnhjmnYzKp8= @@ -1463,12 +1318,10 @@ github.com/libp2p/go-libp2p-yamux v0.4.0/go.mod h1:+DWDjtFMzoAwYLVkNZftoucn7PelN github.com/libp2p/go-libp2p-yamux v0.5.0/go.mod h1:AyR8k5EzyM2QN9Bbdg6X1SkVVuqLwTGf0L4DFq9g6po= 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 h1:bVXHbTj/XH4uBBsPrg26BlDABk5WYRlssY73P0SjhPc= github.com/libp2p/go-libp2p-yamux v0.7.0/go.mod h1:fMyA0CsPfHkIuBU0wjRGrCjTBFiXTXxG0k5M4ETv+08= 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= -github.com/libp2p/go-maddr-filter v0.1.0 h1:4ACqZKw8AqiuJfwFGq1CYDFugfXTOos+qQ3DETkhtCE= github.com/libp2p/go-maddr-filter v0.1.0/go.mod h1:VzZhTXkMucEGGEOSKddrwGiOv0tUhgnKqNEmIAz/bPU= github.com/libp2p/go-mplex v0.0.3/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= github.com/libp2p/go-mplex v0.0.4/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= @@ -1476,49 +1329,40 @@ github.com/libp2p/go-mplex v0.1.0/go.mod h1:SXgmdki2kwCUlCCbfGLEgHjC4pFqhTp0ZoV6 github.com/libp2p/go-mplex v0.1.1/go.mod h1:Xgz2RDCi3co0LeZfgjm4OgUF15+sVR8SRcu3SFXI1lk= 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 h1:U1T+vmCYJaEoDJPV1aq31N56hS+lJgb397GsylNSgrU= github.com/libp2p/go-mplex v0.3.0/go.mod h1:0Oy/A9PQlwBytDRp4wSkFnzHYDKcpLot35JQ6msjvYQ= 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= github.com/libp2p/go-msgio v0.0.6/go.mod h1:4ecVB6d9f4BDSL5fqvPiC4A3KivjWn+Venn/1ALLMWA= -github.com/libp2p/go-msgio v0.1.0 h1:8Q7g/528ivAlfXTFWvWhVjTE8XG8sDTkRUKPYh9+5Q8= github.com/libp2p/go-msgio v0.1.0/go.mod h1:eNlv2vy9V2X/kNldcZ+SShFE++o2Yjxwx6RAYsmgJnE= github.com/libp2p/go-nat v0.0.3/go.mod h1:88nUEt0k0JD45Bk93NIwDqjlhiOwOoV36GchpcVc1yI= github.com/libp2p/go-nat v0.0.4/go.mod h1:Nmw50VAvKuk38jUBcmNh6p9lUJLoODbJRvYAa/+KSDo= github.com/libp2p/go-nat v0.0.5/go.mod h1:B7NxsVNPZmRLvMOwiEO1scOSyjA56zxYAGv1yQgRkEU= -github.com/libp2p/go-nat v0.1.0 h1:MfVsH6DLcpa04Xr+p8hmVRG4juse0s3J8HyNWYHffXg= github.com/libp2p/go-nat v0.1.0/go.mod h1:X7teVkwRHNInVNWQiO/tAiAVRwSr5zoRz4YSTC3uRBM= github.com/libp2p/go-netroute v0.1.2/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk= github.com/libp2p/go-netroute v0.1.3/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk= github.com/libp2p/go-netroute v0.1.5/go.mod h1:V1SR3AaECRkEQCoFFzYwVYWvYIEtlxx89+O3qcpCl4A= -github.com/libp2p/go-netroute v0.1.6 h1:ruPJStbYyXVYGQ81uzEDzuvbYRLKRrLvTYd33yomC38= github.com/libp2p/go-netroute v0.1.6/go.mod h1:AqhkMh0VuWmfgtxKPp3Oc1LdU5QSWS7wl0QLhSZqXxQ= github.com/libp2p/go-openssl v0.0.2/go.mod h1:v8Zw2ijCSWBQi8Pq5GAixw6DbFfa9u6VIYDXnvOXkc0= 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-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 h1:0ooKOx2iwyIkf339WCZ2HN3ujTDbkK0PjC7JVoP1AiM= github.com/libp2p/go-reuseport v0.1.0/go.mod h1:bQVn9hmfcTaoo0c9v5pBhOarsU1eNOBZdaAd2hzXRKU= github.com/libp2p/go-reuseport-transport v0.0.2/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs= github.com/libp2p/go-reuseport-transport v0.0.3/go.mod h1:Spv+MPft1exxARzP2Sruj2Wb5JSyHNncjf1Oi2dEbzM= github.com/libp2p/go-reuseport-transport v0.0.4/go.mod h1:trPa7r/7TJK/d+0hdBLOCGvpQQVOU74OXbNCIMkufGw= github.com/libp2p/go-reuseport-transport v0.0.5/go.mod h1:TC62hhPc8qs5c/RoXDZG6YmjK+/YWUPC0yYmeUecbjc= -github.com/libp2p/go-reuseport-transport v0.1.0 h1:C3PHeHjmnz8m6f0uydObj02tMEoi7CyD1zuN7xQT8gc= github.com/libp2p/go-reuseport-transport v0.1.0/go.mod h1:vev0C0uMkzriDY59yFHD9v+ujJvYmDQVLowvAjEOmfw= 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 h1:yD80l2ZOdGksnOyHrhxDdTDFrf7Oy+v3FMVArIRgZxQ= github.com/libp2p/go-sockaddr v0.1.1/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= 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= 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 h1:TqnSHPJEIqDEO7h1wZZ0p3DXdvDSiLHQidKKUGZtiOY= github.com/libp2p/go-stream-muxer-multistream v0.3.0/go.mod h1:yDh8abSIzmZtqtOt64gFJUXEryejzNb0lisTt+fAMJA= 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= @@ -1527,7 +1371,6 @@ github.com/libp2p/go-tcp-transport v0.2.0/go.mod h1:vX2U0CnWimU4h0SGSEsg++AzvBcr 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= -github.com/libp2p/go-tcp-transport v0.4.0 h1:VDyg4j6en3OuXf90gfDQh5Sy9KowO9udnd0OU8PP6zg= github.com/libp2p/go-tcp-transport v0.4.0/go.mod h1:0y52Rwrn4076xdJYu/51/qJIdxz+EWDAOG2S45sV3VI= 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= @@ -1538,7 +1381,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.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 h1:cO6x4P0v6PfxbKnxmf5cY2Ny4OPDGYkUqNvZzp/zdlo= github.com/libp2p/go-ws-transport v0.5.0/go.mod h1:I2juo1dNTbl8BKSBYo98XY85kU2xds1iamArLvl8kNg= 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= @@ -1548,10 +1390,8 @@ 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.2.0/go.mod h1:3So6P6TV6r75R9jiBpiIKgU/66lOarCZjqROGxzPpPQ= -github.com/libp2p/go-yamux/v2 v2.3.0 h1:luRV68GS1vqqr6EFUjtu1kr51d+IbW0gSowu8emYWAI= github.com/libp2p/go-yamux/v2 v2.3.0/go.mod h1:iTU+lOIn/2h0AgKcL49clNTwfEw+WSfDYrXe05EyKIs= 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= @@ -1561,14 +1401,11 @@ github.com/lucas-clemente/quic-go v0.16.0/go.mod h1:I0+fcNTdb9eS1ZcjQZbDVPGchJ86 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= -github.com/lucas-clemente/quic-go v0.24.0 h1:ToR7SIIEdrgOhgVTHvPgdVRJfgVy+N0wQAagH7L4d5g= github.com/lucas-clemente/quic-go v0.24.0/go.mod h1:paZuzjXCE5mj6sikVLMvqXk8lJV2AsqtJ6bDhjEfxx0= -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= github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= -github.com/magefile/mage v1.9.0 h1:t3AU2wNwehMCW97vuqQLtw6puppWXHO+O2MHo5a50XE= github.com/magefile/mage v1.9.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= @@ -1589,12 +1426,9 @@ github.com/marten-seemann/qtls v0.10.0/go.mod h1:UvMd1oaYDACI99/oZUYLzMCkBXQVT0a 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= github.com/marten-seemann/qtls-go1-15 v0.1.5/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= -github.com/marten-seemann/qtls-go1-16 v0.1.4 h1:xbHbOGGhrenVtII6Co8akhLEdrawwB2iHl5yhJRpnco= github.com/marten-seemann/qtls-go1-16 v0.1.4/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 h1:P9ggrs5xtwiqXv/FHNwntmuLMNq3KaSIG93AtAZ48xk= github.com/marten-seemann/qtls-go1-17 v0.1.0/go.mod h1:fz4HIxByo+LlWcreM4CZOYNuz3taBQ8rN2X6FqvaWo8= -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= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= @@ -1604,7 +1438,6 @@ github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVc github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.7/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-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= @@ -1616,17 +1449,14 @@ 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-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.3/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= github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-tty v0.0.0-20180907095812-13ff1204f104/go.mod h1:XPvLUNfbS4fJH25nqRHfWLMa1ONC8Amw+mIA639KxkE= github.com/mattn/go-xmlrpc v0.0.3/go.mod h1:mqc2dz7tP5x5BKlCahN/n+hs7OSZKJkS9JsHNBRlrxA= -github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/mdlayher/genetlink v1.0.0/go.mod h1:0rJ0h4itni50A86M2kHcgS85ttZazNt7a8H2a2cw0Gc= github.com/mdlayher/netlink v0.0.0-20190409211403-11939a169225/go.mod h1:eQB3mZE4aiYnlUsyGGCOpPETfdQq4Jhsgf1fk3cwQaA= @@ -1643,16 +1473,11 @@ github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKju github.com/miekg/dns v1.1.28/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/dns v1.1.29/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= -github.com/miekg/dns v1.1.43 h1:JKfpVSCB84vrAmHzyrsxB5NAr5kLoMXZArPSw7Qlgyg= github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= -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= github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b/go.mod h1:lxPUiZwKoFL8DUUmalo2yJJUCxbPKtm8OKfqr2/FTNU= -github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc h1:PTfri+PuQmWDqERdnNMiD9ZejrlswWrCpBEZgWOiTrc= github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc/go.mod h1:cGKTAVKx4SxOuR/czcZ/E2RSJ3sfHs8FpHhQ5CWMf9s= github.com/mileusna/useragent v0.0.0-20190129205925-3e331f0949a5/go.mod h1:JWhYAp2EXqUtsxTKdeGlY8Wp44M7VxThC9FEoNGi2IE= -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= @@ -1661,12 +1486,10 @@ github.com/minio/sha256-simd v0.0.0-20190328051042-05b4dd3047e5/go.mod h1:2FMWW+ github.com/minio/sha256-simd v0.1.0/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= github.com/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= -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= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= @@ -1686,13 +1509,10 @@ github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVq 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= github.com/mr-tron/base58 v1.1.3/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= -github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg= github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= -github.com/multiformats/go-base32 v0.0.4 h1:+qMh4a2f37b4xTNs6mqitDinryCI+tfO2dRVMN9mjSE= github.com/multiformats/go-base32 v0.0.4/go.mod h1:jNLFzjPZtp3aIARHbJRZIaPuspdH0J6q39uUM5pnABM= -github.com/multiformats/go-base36 v0.1.0 h1:JR6TyF7JjGd3m6FbLU2cOxhC0Li8z8dLNGQ89tUg4F4= github.com/multiformats/go-base36 v0.1.0/go.mod h1:kFGE83c6s80PklsHO9sRn2NCoffoRdUUOENyW/Vv6sM= github.com/multiformats/go-multiaddr v0.0.1/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= github.com/multiformats/go-multiaddr v0.0.2/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= @@ -1706,17 +1526,14 @@ 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 h1:Pq37uLx3hsyNlTDir7FZyU8+cFCTqd5y1KiM2IzOutI= github.com/multiformats/go-multiaddr v0.4.1/go.mod h1:3afI9HfVW8csiF8UZqtpYRiDyew8pRX7qLIGHu9FLuM= 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.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= -github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/eQsuaL3/CWe167E= github.com/multiformats/go-multiaddr-fmt v0.1.0/go.mod h1:hGtDIW4PU4BqJ50gW2quDuPVjyWNZxToGUh/HwTZYJo= github.com/multiformats/go-multiaddr-net v0.0.1/go.mod h1:nw6HSxNmCIQH27XPGBuX+d1tnvM7ihcFwHMSstNAVUU= github.com/multiformats/go-multiaddr-net v0.1.0/go.mod h1:5JNbcfBOP4dnhoZOv10JJVkJO0pCCEf8mTnipAo2UZQ= @@ -1728,11 +1545,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-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 h1:ZrUuMKNgJ52qHPoQ+bx0h0uBfcWmN7Px+4uKSZeesiI= github.com/multiformats/go-multicodec v0.3.1-0.20210902112759-1539a079fd61/go.mod h1:1Hj/eHRaVWSXiSNNfcEPcwZleTmdNP81xlxDLnWU9GQ= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po= @@ -1742,19 +1557,16 @@ 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.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.1/go.mod h1:5GZPQZbkWOLOn3J2y4Y99vVW7vOfsAflxARk3x14o6k= -github.com/multiformats/go-multistream v0.2.2 h1:TCYu1BHTDr1F/Qm75qwYISQdzGcRdC21nFgQW7l7GBo= github.com/multiformats/go-multistream v0.2.2/go.mod h1:UIcnm7Zuo8HKG+HkWgfQsGL+/MIEhyTqbODbIUwSXKs= github.com/multiformats/go-varint v0.0.1/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= github.com/multiformats/go-varint v0.0.2/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= github.com/multiformats/go-varint v0.0.5/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= -github.com/multiformats/go-varint v0.0.6 h1:gk85QWKxh3TazbLxED/NlDVv8+q+ReFJk7Y2W/KhfNY= github.com/multiformats/go-varint v0.0.6/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= @@ -1777,12 +1589,9 @@ github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJE 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= github.com/nkovacs/streamquote v1.0.0/go.mod h1:BN+NaZ2CmdKqUuTUXUEm9j95B2TRbpOWpxbJYzzgUsc= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= @@ -1799,7 +1608,6 @@ github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0 github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= -github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= @@ -1810,24 +1618,19 @@ github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7J github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= 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/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= github.com/opentracing-contrib/go-grpc v0.0.0-20180928155321-4b5a12d3ff02/go.mod h1:JNdpVEzCpXBgIiv4ds+TzhN1hrtxq6ClLrTlT9OQRSc= -github.com/opentracing-contrib/go-grpc v0.0.0-20191001143057-db30781987df h1:vdYtBU6zvL7v+Tr+0xFM/qhahw/EvY8DMMunZHKH6eE= github.com/opentracing-contrib/go-grpc v0.0.0-20191001143057-db30781987df/go.mod h1:DYR5Eij8rJl8h7gblRrOZ8g0kW1umSpKqYIBTgeDtLo= github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= github.com/opentracing-contrib/go-stdlib v0.0.0-20190519235532-cf7a6c988dc9/go.mod h1:PLldrQSroqzH70Xl+1DQcGnefIbqsKR7UDaiux3zV+w= -github.com/opentracing-contrib/go-stdlib v1.0.0 h1:TBS7YuVotp8myLon4Pv7BtCBzOTo1DeZCld0Z63mW2w= github.com/opentracing-contrib/go-stdlib v1.0.0/go.mod h1:qtI1ogk+2JhVPIXVc6q+NHziSmy2W5GbdQZFUHADCBU= github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.0.3-0.20180606204148-bd9c31933947/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= @@ -1844,7 +1647,6 @@ github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/9 github.com/pelletier/go-toml v1.4.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo= 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/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/peterh/liner v1.0.1-0.20180619022028-8c1271fcf47f/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc= @@ -1854,17 +1656,14 @@ github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA= 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= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= github.com/pkg/term v0.0.0-20180730021639-bffc007b7fd5/go.mod h1:eCbImbZ95eXtAUIbLAuAVnBnwf83mjf6QIVH8SHYwqQ= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/polydawn/refmt v0.0.0-20190221155625-df39d6c2d992/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= github.com/polydawn/refmt v0.0.0-20190408063855-01bf1e26dd14/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= github.com/polydawn/refmt v0.0.0-20190807091052-3d65705ee9f1/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= github.com/polydawn/refmt v0.0.0-20190809202753-05966cbd336a/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= -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= @@ -1883,14 +1682,12 @@ github.com/prometheus/client_golang v1.5.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3O 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= github.com/prometheus/client_golang v1.10.0/go.mod h1:WJM3cc3yu7XKBKa/I8WeZm+V3eltZnBwfENSU7mdogU= -github.com/prometheus/client_golang v1.11.0 h1:HNkLOAEQMIDv/K+04rukrLx6ch7msSRwf3/SASFAGtQ= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= @@ -1904,7 +1701,6 @@ github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16 github.com/prometheus/common v0.18.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/common v0.28.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.30.0 h1:JEkYlQnpzrzQFxi6gnukFPdQ+ac82oRhzMcIduJu/Ug= github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= 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= @@ -1920,38 +1716,27 @@ 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/prometheus v0.0.0-20200609090129-a6600f564e3c/go.mod h1:S5n0C6tSgdnwWshBUceRx5G1OsjLv/EeZ9t3wIfEtsY= -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= 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/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= -github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 h1:OdAsTTz6OkFY5QxjkYwrChwuRruF69c169dPK26NUlk= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/retailnext/hllpp v1.0.1-0.20180308014038-101a6d2f8b52/go.mod h1:RDpi1RftBQPUCDRw6SmxeaREsAaRKnOclghuzp/WRzc= -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= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rs/cors v1.6.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= -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 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/rwcarlsen/goexif v0.0.0-20190401172101-9e8deecbddbd/go.mod h1:hPqNNc0+uJM6H+SuU8sEs5K5IQeKccPqeSjfgcKGgPk= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= @@ -1963,10 +1748,8 @@ github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg github.com/segmentio/kafka-go v0.1.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= github.com/segmentio/kafka-go v0.2.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= github.com/sercand/kuberesolver v2.1.0+incompatible/go.mod h1:lWF3GL0xptCB/vCiJPl/ZshwPsX/n4Y7u0CW9E7aQIQ= -github.com/sercand/kuberesolver v2.4.0+incompatible h1:WE2OlRf6wjLxHwNkkFLQGaZcVLEXjMjBPjjEU5vksH8= github.com/sercand/kuberesolver v2.4.0+incompatible/go.mod h1:lWF3GL0xptCB/vCiJPl/ZshwPsX/n4Y7u0CW9E7aQIQ= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/shirou/gopsutil v2.18.12+incompatible h1:1eaJvGomDnH74/5cF4CTmTbLHAriGFsTZppLXDX93OM= github.com/shirou/gopsutil v2.18.12+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shurcooL/component v0.0.0-20170202220835-f88ec8f54cc4/go.mod h1:XhFIlyj5a1fBNx5aJTbKoIq0mNaPvOagO+HjB3EtxrY= github.com/shurcooL/events v0.0.0-20181021180414-410e4ca65f48/go.mod h1:5u70Mqkb5O5cxEA8nxTsgrgLehJeAw6Oc4Ab1c/P1HM= @@ -1989,7 +1772,6 @@ github.com/shurcooL/notifications v0.0.0-20181007000457-627ab5aea122/go.mod h1:b github.com/shurcooL/octicon v0.0.0-20181028054416-fa4f57f9efb2/go.mod h1:eWdoE5JD4R5UVWDucdOPg1g2fqQRq78IQa9zlOV1vpQ= github.com/shurcooL/reactions v0.0.0-20181006231557-f2e0b4ca5b82/go.mod h1:TCR1lToEk4d2s07G3XGfz2QrgHXg4RJBvjrOozvoWfk= github.com/shurcooL/sanitized_anchor_name v0.0.0-20170918181015-86672fcb3f95/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/shurcooL/users v0.0.0-20180125191416-49c67e49c537/go.mod h1:QJTqeLYEDaXHZDBsXlPCDqdhQuJkuw4NOtaxYe3xii4= github.com/shurcooL/vfsgen v0.0.0-20181202132449-6a9ea43bcacd/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw= @@ -2001,16 +1783,13 @@ github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMB github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/assertions v1.0.0/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= -github.com/smartystreets/assertions v1.0.1 h1:voD4ITNjPL5jjBfgR/r8fPIIBrliWrWHeiJApdr3r4w= github.com/smartystreets/assertions v1.0.1/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= github.com/smartystreets/goconvey v0.0.0-20190222223459-a17d461953aa/go.mod h1:2RVY1rIf+2J2o/IM9+vPq9RzmHDSseB7FoXiSNIUsoU= github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/smola/gocompat v0.2.0/go.mod h1:1B0MlxbmoZNo3h8guHp8HztB3BSYR5itql9qtVc0ypY= github.com/snowflakedb/gosnowflake v1.6.1/go.mod h1:1kyg2XEduwti88V11PKRHImhXLK5WpGiayY6lFNYb98= @@ -2020,10 +1799,8 @@ github.com/soundcloud/go-runit v0.0.0-20150630195641-06ad41a06c4a/go.mod h1:LeFC github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE= github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA= github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0= -github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 h1:RC6RW7j+1+HkWaX/Yh71Ee5ZHaHYt7ZP4sQgUrm6cDU= github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= @@ -2045,7 +1822,6 @@ github.com/streadway/handy v0.0.0-20200128134331-0f66f006fb2e/go.mod h1:qNTQ5P5J github.com/streadway/quantile v0.0.0-20150917103942-b0c588724d25/go.mod h1:lbP8tGiBjZ5YWIc2fzuRpTaz0b/53vT6PEs3QuAWzuU= 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/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= @@ -2055,12 +1831,9 @@ 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.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 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFdE= github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= 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= github.com/texttheater/golang-levenshtein v0.0.0-20180516184445-d188e65d659e/go.mod h1:XDKHRm5ThF8YJjx001LtgelzsoaEcvnA7lVWz9EeX3g= github.com/tidwall/gjson v1.6.0/go.mod h1:P256ACg0Mn+j1RXIDXoss50DeIABTYK1PULOJHhxOls= @@ -2068,7 +1841,6 @@ github.com/tidwall/match v1.0.1/go.mod h1:LujAq0jyVjBy028G1WhWfIzbpQfMO8bBZ6Tyb0 github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tinylib/msgp v1.0.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= github.com/tinylib/msgp v1.1.0/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= -github.com/tj/go-spin v1.1.0 h1:lhdWZsvImxvZ3q1C5OIB7d72DuOwP4O2NdBg9PyzNds= 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= @@ -2078,43 +1850,31 @@ github.com/uber/jaeger-client-go v2.15.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMW github.com/uber/jaeger-client-go v2.23.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/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= -github.com/uber/jaeger-client-go v2.28.0+incompatible h1:G4QSBfvPKvg5ZM2j9MrJFdfI5iSljY/WnJqOGFao6HI= github.com/uber/jaeger-client-go v2.28.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/uber/jaeger-lib v1.5.1-0.20181102163054-1fc5c315e03c/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= github.com/uber/jaeger-lib v2.2.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= -github.com/uber/jaeger-lib v2.4.1+incompatible h1:td4jdvLcExb4cBISKIpHuGoVXh+dVKhn2Um6rjCsSsg= github.com/uber/jaeger-lib v2.4.1+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= 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 h1:JTTnM6wKzdA0Jqodd966MVj4vWbbquZykeX1sKbe2C4= github.com/urfave/cli/v2 v2.2.0/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= -github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= -github.com/valyala/fasttemplate v1.2.1 h1:TVEnxayobAdVkhQfrfes2IzOB6o+z4roRkPF52WA1u4= github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU= 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 h1:Q81c4u7hT+BR5kNfNQhEF0VT2pmL7+Kk0wD+ORYl7iA= github.com/warpfork/go-testmark v0.3.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= github.com/warpfork/go-wish v0.0.0-20200122115046-b9ea61034e4a/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= -github.com/weaveworks/common v0.0.0-20200512154658-384f10054ec5 h1:EYxr08r8x6r/5fLEAMMkida1BVgxVXE4LfZv/XV+znU= 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= github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11/go.mod h1:Wlo/SzPmxVp6vXpGt/zaXhHH0fn4IxgqZc82aKg6bpQ= github.com/whyrusleeping/cbor-gen v0.0.0-20191216205031-b047b6acb3c0/go.mod h1:xdlJQaiqipF0HW+Mzpg7XRM3fWbGvfgFlcppuvlkIvY= github.com/whyrusleeping/cbor-gen v0.0.0-20200123233031-1cdf64d27158/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= @@ -2130,26 +1890,19 @@ github.com/whyrusleeping/cbor-gen v0.0.0-20200826160007-0b9f6c5fb163/go.mod h1:f 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-20210713220151-be142a5ae1a8 h1:TEv7MId88TyIqIUL4hbf9otOookIolMxlEbN0ro671Y= github.com/whyrusleeping/cbor-gen v0.0.0-20210713220151-be142a5ae1a8/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/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= github.com/whyrusleeping/mdns v0.0.0-20180901202407-ef14215e6b30/go.mod h1:j4l84WPFclQPj320J9gp0XwNKBb3U0zt5CBqjPp22G4= github.com/whyrusleeping/mdns v0.0.0-20190826153040-b9b60ed33aa9/go.mod h1:j4l84WPFclQPj320J9gp0XwNKBb3U0zt5CBqjPp22G4= -github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 h1:E9S12nwJwEOXe2d6gT6qxdvqMnNq+VnSsKPgm2ZZNds= github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7/go.mod h1:X2c0RVCI1eSUFI8eLcY3c0423ykwiUdxLJtkDvruhjI= -github.com/whyrusleeping/pubsub v0.0.0-20190708150250-92bcb0691325 h1:++Zf4xQ7YrkE81gNHIjVqx5JZsn0nbMeHOkY1ILAIME= github.com/whyrusleeping/pubsub v0.0.0-20190708150250-92bcb0691325/go.mod h1:g7ckxrjiFh8mi1AY7ox23PZD0g6QU/TxW3U3unX7I3A= -github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee h1:lYbXeSvJi5zk5GLKVuid9TVjS9a0OmLIDKTfoZBL6Ow= github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee/go.mod h1:m2aV4LZI4Aez7dP5PMyVKEHhUyEJ/RjmPEDOpDvudHg= github.com/willf/bitset v1.1.3/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= github.com/willf/bitset v1.1.9/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= @@ -2157,13 +1910,10 @@ github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7V github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= github.com/xdg/stringprep v0.0.0-20180714160509-73f8eece6fdc/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xlab/c-for-go v0.0.0-20201112171043-ea6dce5809cb h1:/7/dQyiKnxAOj9L69FhST7uMe17U015XPzX7cy+5ykM= 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 h1:Sw125DKxZhPUI4JLlWugkzsrlB50jR9v2khiD9FxuSo= github.com/xlab/pkgconfig v0.0.0-20170226114623-cea12a0fd245/go.mod h1:C+diUUz7pxhNY6KAoLgrTYARGWnt82zWTylZlxT92vk= github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= 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/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -2172,21 +1922,15 @@ 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.0/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= github.com/zondax/ledger-go v0.12.1/go.mod h1:KatxXrVDzgWwbssUWsF5+cOJHXPvzQ09YSlzGNuhOEo= -go.dedis.ch/fixbuf v1.0.3 h1:hGcV9Cd/znUxlusJ64eAlExS+5cJDIyTyEG+otu5wQs= go.dedis.ch/fixbuf v1.0.3/go.mod h1:yzJMt34Wa5xD37V5RTdmp38cz3QhMagdGoem9anUalw= go.dedis.ch/kyber/v3 v3.0.4/go.mod h1:OzvaEnPvKlyrWyp3kGXlFdp7ap1VC6RkZDTaPikqhsQ= -go.dedis.ch/kyber/v3 v3.0.9 h1:i0ZbOQocHUjfFasBiUql5zVeC7u/vahFd96DFA8UOWk= go.dedis.ch/kyber/v3 v3.0.9/go.mod h1:rhNjUUg6ahf8HEg5HUvVBYoWY4boAafX8tYxX+PS+qg= go.dedis.ch/protobuf v1.0.5/go.mod h1:eIV4wicvi6JK0q/QnfIEGeSFNG0ZeB24kzut5+HaRLo= go.dedis.ch/protobuf v1.0.7/go.mod h1:pv5ysfkDX/EawiPqcW3ikOxsL5t+BqnV6xHSmE79KI4= -go.dedis.ch/protobuf v1.0.11 h1:FTYVIEzY/bfl37lu3pR4lIj+F9Vp1jE8oh91VmxKgLo= go.dedis.ch/protobuf v1.0.11/go.mod h1:97QR256dnkimeNdfmURz0wAMNVbd1VmLXhG1CrTYrJ4= 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= @@ -2208,11 +1952,9 @@ go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.6-0.20201102222123-380f4078db9f/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -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/bridge/opencensus v0.25.0/go.mod h1:dkZDdaNwLlIutxK2Kc2m3jwW2M1ISaNf8/rOYVwuVHs= go.opentelemetry.io/otel/exporters/jaeger v1.2.0/go.mod h1:KJLFbEMKTNPIfOxcg/WikIozEoKcPgJRz3Ce1vLlM8E= @@ -2221,13 +1963,11 @@ go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9deb go.opentelemetry.io/otel/metric v0.25.0/go.mod h1:E884FSpQfnJOMMUaq+05IWlJ4rjZpk2s/F1Ju+TEEm8= go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= -go.opentelemetry.io/otel/sdk v1.2.0 h1:wKN260u4DesJYhyjxDa7LRFkuhH7ncEVKU37LWcyNIo= go.opentelemetry.io/otel/sdk v1.2.0/go.mod h1:jNN8QtpvbsKhgaC6V5lHiejMoKD+V8uadoSafgHPx1U= go.opentelemetry.io/otel/sdk/export/metric v0.25.0/go.mod h1:Ej7NOa+WpN49EIcr1HMUYRvxXXCCnQCg2+ovdt2z8Pk= 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/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= @@ -2236,22 +1976,17 @@ 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/dig v1.10.0 h1:yLmDDj9/zuDjv3gz8GQGviXMs9TfysIUMUilCpgzUJY= go.uber.org/dig v1.10.0/go.mod h1:X34SnWGr8Fyla9zQNO2GSO2D+TIuqB14OS8JhYocIyw= -go.uber.org/fx v1.9.0 h1:7OAz8ucp35AU8eydejpYG7QrbE8rLKzGhHbZlJi5LYY= go.uber.org/fx v1.9.0/go.mod h1:mFdUyAUuJ3w4jAckiKSKbldsxy1ojpAMJ+dVZg5Y0Aw= go.uber.org/goleak v1.0.0/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.1.11-0.20210813005559-691160354723 h1:sHOAIxRGBp443oHZIPB+HsUGaksVCXVQENPxwTfQdH4= go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/multierr v1.7.0 h1:zaiO/rmgFjbmCXdSYJWQcdvOCsthmdaHfr3Gm2Kx4Ec= go.uber.org/multierr v1.7.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= @@ -2264,10 +1999,8 @@ 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 h1:ue41HOKd1vGURxrmeKIgELGb3jPW9DMUDGtsinblHwI= go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= 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= golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d/go.mod h1:OWs+y06UdEOHN4y+MfF/py+xQ/tYqIWW03b70/CG9Rw= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -2323,7 +2056,6 @@ golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5y 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-20211209193657-4570a0811e8b h1:QAqMVf3pSa6eeTsuklijukjXBlj7Es2QQplab+/RbQ4= golang.org/x/crypto v0.0.0-20211209193657-4570a0811e8b/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= @@ -2342,7 +2074,6 @@ 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/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= @@ -2358,7 +2089,6 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= @@ -2370,7 +2100,6 @@ golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.1.1-0.20191209134235-331c550502dd/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 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 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 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= @@ -2443,7 +2172,6 @@ golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/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-20211112202133-69e39bad7dc2 h1:CIJ76btIcR3eFI5EgSo6k1qKw9KJexJuRLI9G7Hp5wE= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= 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= @@ -2465,7 +2193,6 @@ 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/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180202135801-37707fdb30a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -2585,11 +2312,9 @@ golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/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-20211209171907-798191bca915 h1:P+8mCzuEpyszAT6T42q0sxU+eveBAF/cJ2Kp0x6/8+0= golang.org/x/sys v0.0.0-20211209171907-798191bca915/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 h1:MZ2shdL+ZM/XzY3ZGOnh4Nlpnxz5GSOhOmtHo3iPU6M= golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -2599,7 +2324,6 @@ golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -2690,12 +2414,10 @@ 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.7 h1:6j8CgantCy3yc8JGBqkDLMKWqZ0RDU2g1HVgacojGWQ= golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= 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 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/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.0.0-20181121035319-3f7ecaa7e8ca/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= @@ -2773,7 +2495,6 @@ google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6D 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= google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= @@ -2803,7 +2524,6 @@ google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTp 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 h1:AGJ0Ih4mHjSeibYkFGh1dD9KJ/eOtZ93I6hoHhukQ5Q= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= 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= @@ -2817,17 +2537,14 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= 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 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= 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= 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= -gopkg.in/cheggaaa/pb.v1 v1.0.28 h1:n1tBJnnK2r7g9OW2btFH91V92STTUevLXYFb8gy9EMk= gopkg.in/cheggaaa/pb.v1 v1.0.28/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= @@ -2837,7 +2554,6 @@ 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/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= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= @@ -2849,12 +2565,9 @@ gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -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 h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/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= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -2866,7 +2579,6 @@ honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= -howett.net/plist v0.0.0-20181124034731-591f970eefbb h1:jhnBjNi9UFpfpl8YZhA9CrOqpnJdvzuiHsl/dnxl11M= howett.net/plist v0.0.0-20181124034731-591f970eefbb/go.mod h1:vMygbs4qMhSZSc4lCUl2OEE+rDiIIJAIdR4m7MiMcm0= k8s.io/api v0.17.5/go.mod h1:0zV5/ungglgy2Rlm3QK8fbxkXVs+BSJWpJP/+8gUVLY= k8s.io/apimachinery v0.17.5/go.mod h1:ioIo1G/a+uONV7Tv+ZmCbMG1/a3kVw5YcDdncd8ugQ0= @@ -2880,21 +2592,15 @@ k8s.io/kube-openapi v0.0.0-20200316234421-82d701f24f9d/go.mod h1:F+5wygcW0wmRTnM k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= k8s.io/utils v0.0.0-20200414100711-2df71ebbae66/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= 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 h1:nPibNuDEx6tvYrUAtvDTTw98rx5juGsa5zuDnKwEEQQ= 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 h1:EYKY1a3wStt0RzHaH8mdSRNg78Ub0OHxYfCRWw35YtM= 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 h1:FeylZSVX8S+58VsyJlkEj2bcpdytmp9MmDKZkKx8OIE= modernc.org/mathutil v1.1.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/strutil v1.1.0 h1:+1/yCzZxY2pZwwrsbH+4T7BQMoLQ9QiBshRC9eicYsc= modernc.org/strutil v1.1.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs= -modernc.org/xc v1.0.0 h1:7ccXrupWZIS3twbUGrtKmHS2DXY6xegFua+6O3xgAFU= modernc.org/xc v1.0.0/go.mod h1:mRNCo0bvLjGhHO9WsyuKVU4q0ceiDDDoEeWDJHrNx8I= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= From 19bd9cf94585d12397dd40d779415bbe4039ec0f Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Mon, 10 Jan 2022 18:08:21 -0500 Subject: [PATCH 186/393] Update to actors v7.0.0-rc1 --- go.mod | 2 +- go.sum | 6 ++++-- testplans/lotus-soup/go.sum | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 72a9d97b8e6..1f4718fe8af 100644 --- a/go.mod +++ b/go.mod @@ -51,7 +51,7 @@ require ( github.com/filecoin-project/specs-actors/v4 v4.0.1 github.com/filecoin-project/specs-actors/v5 v5.0.4 github.com/filecoin-project/specs-actors/v6 v6.0.1 - github.com/filecoin-project/specs-actors/v7 v7.0.0-20211230214648-aeae366b083a + github.com/filecoin-project/specs-actors/v7 v7.0.0-rc1 github.com/filecoin-project/specs-storage v0.1.1-0.20211228030229-6d460d25a0c9 github.com/filecoin-project/test-vectors/schema v0.0.5 github.com/gbrlsnchs/jwt/v3 v3.0.1 diff --git a/go.sum b/go.sum index 04fa2eefbbb..d958030a06d 100644 --- a/go.sum +++ b/go.sum @@ -302,6 +302,8 @@ github.com/filecoin-project/go-amt-ipld/v2 v2.1.0/go.mod h1:nfFPoGyX0CU9SkXX8EoC github.com/filecoin-project/go-amt-ipld/v3 v3.0.0/go.mod h1:Qa95YNAbtoVCTSVtX38aAC1ptBnJfPma1R/zZsKmx4o= github.com/filecoin-project/go-amt-ipld/v3 v3.1.0 h1:ZNJ9tEG5bE72vBWYiuh5bkxJVM3ViHNOmQ7qew9n6RE= github.com/filecoin-project/go-amt-ipld/v3 v3.1.0/go.mod h1:UjM2QhDFrrjD5s1CdnkJkat4ga+LqZBZgTMniypABRo= +github.com/filecoin-project/go-amt-ipld/v4 v4.0.0 h1:XM81BJ4/6h3FV0WfFjh74cIDIgqMbJsMBLM0fIuLUUk= +github.com/filecoin-project/go-amt-ipld/v4 v4.0.0/go.mod h1:gF053YQ4BIpzTNDoEwHZas7U3oAwncDVGvOHyY8oDpE= github.com/filecoin-project/go-bitfield v0.2.0/go.mod h1:CNl9WG8hgR5mttCnUErjcQjGvuiZjRqK9rHVBsQF4oM= github.com/filecoin-project/go-bitfield v0.2.3/go.mod h1:CNl9WG8hgR5mttCnUErjcQjGvuiZjRqK9rHVBsQF4oM= github.com/filecoin-project/go-bitfield v0.2.4 h1:uZ7MeE+XfM5lqrHJZ93OnhQKc/rveW8p9au0C68JPgk= @@ -378,8 +380,8 @@ github.com/filecoin-project/specs-actors/v6 v6.0.1 h1:laxvHNsvrq83Y9n+W7znVCePi3 github.com/filecoin-project/specs-actors/v6 v6.0.1/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= github.com/filecoin-project/specs-actors/v7 v7.0.0-20211117170924-fd07a4c7dff9/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= github.com/filecoin-project/specs-actors/v7 v7.0.0-20211222192039-c83bea50c402/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= -github.com/filecoin-project/specs-actors/v7 v7.0.0-20211230214648-aeae366b083a h1:MS1mtAhZh0iSE7OxP1bb6+UNyYKsxg8n51FpHlX1d54= -github.com/filecoin-project/specs-actors/v7 v7.0.0-20211230214648-aeae366b083a/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= +github.com/filecoin-project/specs-actors/v7 v7.0.0-rc1 h1:FuDaXIbcw2hRsFI8SDTmsGGCE+NumpF6aiBoU/2X5W4= +github.com/filecoin-project/specs-actors/v7 v7.0.0-rc1/go.mod h1:TA5FwCna+Yi36POaT7SLKXsgEDvJwc0V/L6ZsO19B9M= github.com/filecoin-project/specs-storage v0.1.1-0.20211228030229-6d460d25a0c9 h1:oUYOvF7EvdXS0Zmk9mNkaB6Bu0l+WXBYPzVodKMiLug= github.com/filecoin-project/specs-storage v0.1.1-0.20211228030229-6d460d25a0c9/go.mod h1:Tb88Zq+IBJbvAn3mS89GYj3jdRThBTE/771HCVZdRJU= github.com/filecoin-project/test-vectors/schema v0.0.5 h1:w3zHQhzM4pYxJDl21avXjOKBLF8egrvwUwjpT8TquDg= diff --git a/testplans/lotus-soup/go.sum b/testplans/lotus-soup/go.sum index 59d6cf72034..40b68134939 100644 --- a/testplans/lotus-soup/go.sum +++ b/testplans/lotus-soup/go.sum @@ -471,7 +471,7 @@ github.com/filecoin-project/specs-actors/v6 v6.0.1 h1:laxvHNsvrq83Y9n+W7znVCePi3 github.com/filecoin-project/specs-actors/v6 v6.0.1/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= github.com/filecoin-project/specs-actors/v7 v7.0.0-20211117170924-fd07a4c7dff9/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= github.com/filecoin-project/specs-actors/v7 v7.0.0-20211222192039-c83bea50c402/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= -github.com/filecoin-project/specs-actors/v7 v7.0.0-20211230214648-aeae366b083a/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= +github.com/filecoin-project/specs-actors/v7 v7.0.0-rc1/go.mod h1:TA5FwCna+Yi36POaT7SLKXsgEDvJwc0V/L6ZsO19B9M= github.com/filecoin-project/specs-storage v0.1.1-0.20211228030229-6d460d25a0c9/go.mod h1:Tb88Zq+IBJbvAn3mS89GYj3jdRThBTE/771HCVZdRJU= 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= From 25768a291e8f11a027d1e7a135f4be0cebd02907 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 11 Jan 2022 11:31:59 -0500 Subject: [PATCH 187/393] Implement an autobatcher --- blockstore/autobatch.go | 93 ++++++++++++++++++++++++++++++ blockstore/autobatch_test.go | 33 +++++++++++ chain/consensus/filcns/upgrades.go | 23 +++----- go.mod | 1 - go.sum | 2 - 5 files changed, 134 insertions(+), 18 deletions(-) create mode 100644 blockstore/autobatch.go create mode 100644 blockstore/autobatch_test.go diff --git a/blockstore/autobatch.go b/blockstore/autobatch.go new file mode 100644 index 00000000000..308b98b4b50 --- /dev/null +++ b/blockstore/autobatch.go @@ -0,0 +1,93 @@ +package blockstore + +import ( + "context" + "sync" + + block "github.com/ipfs/go-block-format" + "github.com/ipfs/go-cid" +) + +// autolog is a logger for the autobatching blockstore. It is subscoped from the +// blockstore logger. +var autolog = log.Named("auto") + +type AutobatchBlockstore struct { + bufferedBlks []block.Block + bufferedBlksLk sync.Mutex + flushLk sync.Mutex + backingBs Blockstore + bufferCapacity int + bufferSize int +} + +func (bs *AutobatchBlockstore) DeleteBlock(context.Context, cid.Cid) error { + panic("implement me") +} + +func (bs *AutobatchBlockstore) Has(ctx context.Context, c cid.Cid) (bool, error) { + panic("implement me") +} + +func (bs *AutobatchBlockstore) GetSize(context.Context, cid.Cid) (int, error) { + panic("implement me") +} + +func (bs *AutobatchBlockstore) PutMany(context.Context, []block.Block) error { + panic("implement me") +} + +func (bs *AutobatchBlockstore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) { + panic("implement me") +} + +func (bs *AutobatchBlockstore) HashOnRead(enabled bool) { + panic("implement me") +} + +func (bs *AutobatchBlockstore) View(ctx context.Context, cid cid.Cid, callback func([]byte) error) error { + panic("implement me") +} + +func (bs *AutobatchBlockstore) DeleteMany(ctx context.Context, cids []cid.Cid) error { + panic("implement me") +} + +func NewAutobatch(ctx context.Context, backingBs Blockstore, bufferCapacity int) *AutobatchBlockstore { + bs := &AutobatchBlockstore{ + backingBs: backingBs, + bufferCapacity: bufferCapacity, + } + + return bs +} + +// May NOT `Get` blocks that have been `Put` into this store +// Only guaranteed to fetch those that were already in the backingBs at creation of this store and those at the most recent `Flush` +func (bs *AutobatchBlockstore) Get(ctx context.Context, c cid.Cid) (block.Block, error) { + return bs.backingBs.Get(ctx, c) +} + +func (bs *AutobatchBlockstore) Put(ctx context.Context, blk block.Block) error { + // TODO: Would it be faster to check if bs.backing Has the blk (and skip if so)? + bs.bufferedBlksLk.Lock() + bs.bufferedBlks = append(bs.bufferedBlks, blk) + bs.bufferSize += len(blk.RawData()) + if bs.bufferSize >= bs.bufferCapacity { + // time to flush + go bs.Flush(ctx) + } + bs.bufferedBlksLk.Unlock() + return nil +} + +func (bs *AutobatchBlockstore) Flush(ctx context.Context) { + bs.flushLk.Lock() + defer bs.flushLk.Unlock() + bs.bufferedBlksLk.Lock() + toFlush := bs.bufferedBlks + bs.bufferedBlks = []block.Block{} + bs.bufferedBlksLk.Unlock() + // error????? + bs.backingBs.PutMany(ctx, toFlush) +} diff --git a/blockstore/autobatch_test.go b/blockstore/autobatch_test.go new file mode 100644 index 00000000000..fe52c55c777 --- /dev/null +++ b/blockstore/autobatch_test.go @@ -0,0 +1,33 @@ +package blockstore + +import ( + "context" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestAutobatchBlockstore(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + ab := NewAutobatch(ctx, NewMemory(), len(b0.RawData())+len(b1.RawData())-1) + + require.NoError(t, ab.Put(ctx, b0)) + require.NoError(t, ab.Put(ctx, b1)) + require.NoError(t, ab.Put(ctx, b2)) + + ab.Flush(ctx) + + v0, err := ab.Get(ctx, b0.Cid()) + require.NoError(t, err) + require.Equal(t, b0.RawData(), v0.RawData()) + + v1, err := ab.Get(ctx, b1.Cid()) + require.NoError(t, err) + require.Equal(t, b1.RawData(), v1.RawData()) + + v2, err := ab.Get(ctx, b2.Cid()) + require.NoError(t, err) + require.Equal(t, b2.RawData(), v2.RawData()) +} diff --git a/chain/consensus/filcns/upgrades.go b/chain/consensus/filcns/upgrades.go index a66c9c2ca5a..548f59aac0f 100644 --- a/chain/consensus/filcns/upgrades.go +++ b/chain/consensus/filcns/upgrades.go @@ -5,7 +5,7 @@ import ( "runtime" "time" - autobatch "github.com/application-research/go-bs-autobatch" + "github.com/docker/go-units" "github.com/filecoin-project/specs-actors/v6/actors/migration/nv14" "github.com/filecoin-project/specs-actors/v7/actors/migration/nv15" @@ -1264,14 +1264,14 @@ func upgradeActorsV7Common( root cid.Cid, epoch abi.ChainEpoch, ts *types.TipSet, config nv15.Config, ) (cid.Cid, error) { - writeStore, err := autobatch.NewBlockstore(sm.ChainStore().StateBlockstore(), blockstore.NewMemorySync(), 100_000, 100, true) - if err != nil { - return cid.Undef, xerrors.Errorf("failed to create writeStore: %w", err) - } - buf := blockstore.NewTieredBstore(sm.ChainStore().StateBlockstore(), writeStore) - store := store.ActorStore(ctx, buf) + ctxWithCancel, cancel := context.WithCancel(ctx) + defer cancel() + writeStore := blockstore.NewAutobatch(ctxWithCancel, sm.ChainStore().StateBlockstore(), units.GiB) + // TODO: pretty sure we'd achieve nothing by doing this, confirm in review + //buf := blockstore.NewTieredBstore(sm.ChainStore().StateBlockstore(), writeStore) + store := store.ActorStore(ctx, writeStore) // Load the state root. var stateRoot types.StateRoot if err := store.Get(ctx, root, &stateRoot); err != nil { @@ -1303,14 +1303,7 @@ func upgradeActorsV7Common( // 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) - } - } + writeStore.Flush(ctx) return newRoot, nil } diff --git a/go.mod b/go.mod index 1f4718fe8af..5e401a3e67e 100644 --- a/go.mod +++ b/go.mod @@ -11,7 +11,6 @@ require ( github.com/StackExchange/wmi v1.2.1 // indirect github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d github.com/alecthomas/jsonschema v0.0.0-20200530073317-71f438968921 - github.com/application-research/go-bs-autobatch v0.0.0-20211215020302-c4c0b68ef402 github.com/buger/goterm v1.0.3 github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e github.com/containerd/cgroups v0.0.0-20201119153540-4cbc285b3327 diff --git a/go.sum b/go.sum index d958030a06d..bf84d7b43e3 100644 --- a/go.sum +++ b/go.sum @@ -98,8 +98,6 @@ github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYU 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= github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/application-research/go-bs-autobatch v0.0.0-20211215020302-c4c0b68ef402 h1:8l0IQrh8vwqihv5jNhKCYB+YGH5hGGFL7od/2ETWrZw= -github.com/application-research/go-bs-autobatch v0.0.0-20211215020302-c4c0b68ef402/go.mod h1:86iZMWoyMLfLpYyd0aMPyECUpFwf8oZRjS5jJ9quZ7I= 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= From 544cfa63ab8e1459a666bb0b84c676b65d7ab801 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 11 Jan 2022 17:17:34 -0500 Subject: [PATCH 188/393] cache added cids --- blockstore/autobatch.go | 17 +- testplans/lotus-soup/go.sum | 301 +++++++++++++++++++++++++++++++++++- 2 files changed, 310 insertions(+), 8 deletions(-) diff --git a/blockstore/autobatch.go b/blockstore/autobatch.go index 308b98b4b50..5d78e92a196 100644 --- a/blockstore/autobatch.go +++ b/blockstore/autobatch.go @@ -14,6 +14,7 @@ var autolog = log.Named("auto") type AutobatchBlockstore struct { bufferedBlks []block.Block + addedCids map[cid.Cid]struct{} bufferedBlksLk sync.Mutex flushLk sync.Mutex backingBs Blockstore @@ -57,6 +58,7 @@ func NewAutobatch(ctx context.Context, backingBs Blockstore, bufferCapacity int) bs := &AutobatchBlockstore{ backingBs: backingBs, bufferCapacity: bufferCapacity, + addedCids: make(map[cid.Cid]struct{}), } return bs @@ -69,13 +71,16 @@ func (bs *AutobatchBlockstore) Get(ctx context.Context, c cid.Cid) (block.Block, } func (bs *AutobatchBlockstore) Put(ctx context.Context, blk block.Block) error { - // TODO: Would it be faster to check if bs.backing Has the blk (and skip if so)? bs.bufferedBlksLk.Lock() - bs.bufferedBlks = append(bs.bufferedBlks, blk) - bs.bufferSize += len(blk.RawData()) - if bs.bufferSize >= bs.bufferCapacity { - // time to flush - go bs.Flush(ctx) + _, ok := bs.addedCids[blk.Cid()] + if !ok { + bs.bufferedBlks = append(bs.bufferedBlks, blk) + bs.addedCids[blk.Cid()] = struct{}{} + bs.bufferSize += len(blk.RawData()) + if bs.bufferSize >= bs.bufferCapacity { + // time to flush + go bs.Flush(ctx) + } } bs.bufferedBlksLk.Unlock() return nil diff --git a/testplans/lotus-soup/go.sum b/testplans/lotus-soup/go.sum index 40b68134939..e6e4149c8d2 100644 --- a/testplans/lotus-soup/go.sum +++ b/testplans/lotus-soup/go.sum @@ -143,8 +143,6 @@ github.com/apache/arrow/go/arrow v0.0.0-20200601151325-b2287a20f230/go.mod h1:QN github.com/apache/arrow/go/arrow v0.0.0-20200923215132-ac86123a3f01/go.mod h1:QNYViu/X0HXDHw7m3KXzWSVXIbfUvJqBFe6Gj8/pYA0= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/application-research/go-bs-autobatch v0.0.0-20211215020302-c4c0b68ef402 h1:8l0IQrh8vwqihv5jNhKCYB+YGH5hGGFL7od/2ETWrZw= -github.com/application-research/go-bs-autobatch v0.0.0-20211215020302-c4c0b68ef402/go.mod h1:86iZMWoyMLfLpYyd0aMPyECUpFwf8oZRjS5jJ9quZ7I= 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= @@ -471,24 +469,33 @@ github.com/filecoin-project/specs-actors/v6 v6.0.1 h1:laxvHNsvrq83Y9n+W7znVCePi3 github.com/filecoin-project/specs-actors/v6 v6.0.1/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= github.com/filecoin-project/specs-actors/v7 v7.0.0-20211117170924-fd07a4c7dff9/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= github.com/filecoin-project/specs-actors/v7 v7.0.0-20211222192039-c83bea50c402/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= +github.com/filecoin-project/specs-actors/v7 v7.0.0-rc1 h1:FuDaXIbcw2hRsFI8SDTmsGGCE+NumpF6aiBoU/2X5W4= github.com/filecoin-project/specs-actors/v7 v7.0.0-rc1/go.mod h1:TA5FwCna+Yi36POaT7SLKXsgEDvJwc0V/L6ZsO19B9M= +github.com/filecoin-project/specs-storage v0.1.1-0.20211228030229-6d460d25a0c9 h1:oUYOvF7EvdXS0Zmk9mNkaB6Bu0l+WXBYPzVodKMiLug= github.com/filecoin-project/specs-storage v0.1.1-0.20211228030229-6d460d25a0c9/go.mod h1:Tb88Zq+IBJbvAn3mS89GYj3jdRThBTE/771HCVZdRJU= 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 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/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/foxcpp/go-mockdns v0.0.0-20201212160233-ede2f9158d15/go.mod h1:tPg4cp4nseejPd+UKxtCVQ2hUxNTZ7qQZJa7CLriIeo= +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 h1:+cqqvzZV87b4adx/5ayVOaYZ2CrvM4ejQvUdBzPPUss= github.com/frankban/quicktest v1.14.0/go.mod h1:NeW+ay9A/U67EYXNFA1nPE8e/tnQv/09mUdL/ijj8og= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +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= github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg= +github.com/gdamore/tcell/v2 v2.2.0 h1:vSyEgKwraXPSOkvCk7IwOSyX+Pv3V2cV9CikJMXg4U4= github.com/gdamore/tcell/v2 v2.2.0/go.mod h1:cTTuF84Dlj/RqmaCIV5p4w8uG1zWdk0SF6oBpwHp4fU= github.com/getkin/kin-openapi v0.53.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= @@ -508,18 +515,24 @@ github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2 github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= +github.com/go-kit/kit v0.12.0 h1:e4o3o3IsBfAKQh5Qbbiqyfu97Ku7jrO/JbohvztANh4= github.com/go-kit/kit v0.12.0/go.mod h1:lHd+EkCZPIwYItmGDDRdhinkzX2A1sj+M9biaEaizzs= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-kit/log v0.2.0 h1:7i2K3eKTos3Vc0enKCfnVcgHh2olr/MyfboYq7cAcFw= github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA= github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= 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/stdr v1.2.0/go.mod h1:YkVgnZu1ZjjL7xTxrfm/LLZBfkhTqSR1ydtm6jTKKwI= +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= github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= @@ -584,11 +597,13 @@ github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+ github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= github.com/go-openapi/validate v0.19.3/go.mod h1:90Vh6jjkTn+OT1Eefm0ZixWNFjhtOH7vS9k0lo6zwJo= github.com/go-openapi/validate v0.19.8/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= +github.com/go-redis/redis/v7 v7.4.0 h1:7obg6wUoj05T0EpY0o8B59S9w5yeMWql7sw2kwNW1x4= github.com/go-redis/redis/v7 v7.4.0/go.mod h1:JDNMw23GTyLNC4GZu9njt15ctBQVn7xjRfnwdHj/Dcg= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= 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/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0= @@ -615,12 +630,15 @@ github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWe github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ= github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0= github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= +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 h1:9349emZab16e7zQvpmsbtjc18ykshndd8y2PG3sgJbA= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= +github.com/gogo/googleapis v1.4.0 h1:zgVt4UpGxcqVOw97aRGxT4svlcmdK35fynLNctY32zI= github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= @@ -629,8 +647,10 @@ github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5 github.com/gogo/protobuf v1.2.2-0.20190730201129-28a6bbf47e48/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= 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 v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= @@ -638,12 +658,14 @@ github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2V github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= 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= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191027212112-611e8accdfc9/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= @@ -653,6 +675,7 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -671,9 +694,11 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +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/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= @@ -691,11 +716,13 @@ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gopacket v1.1.17/go.mod h1:UdDNZ1OO62aGYVnPhxT1U6aI7ukYtA/kB8vaU0diBUM= +github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8= github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= @@ -712,6 +739,7 @@ github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg= @@ -723,32 +751,41 @@ github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEo github.com/gophercloud/gophercloud v0.10.0/go.mod h1:gmC5oQqMDOMO1t1gq5DquX/yAU808e/4mzjjDA76+Ss= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gopherjs/gopherjs v0.0.0-20190812055157-5d271430af9f h1:KMlcu9X58lhTA/KrfX8Bi1LQSO4pzoVjTiL3h4Jk+Zk= 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/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/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.1.0/go.mod h1:f5nM7jw/oeRSadq3xCzHAvxcr8HZnzsqU6ILg/0NiiE= +github.com/grpc-ecosystem/go-grpc-middleware v1.2.0 h1:0IKlLyQ3Hs9nDaiK5cSHAGmcQEIC8l2Ts1u6x5Dfrqg= github.com/grpc-ecosystem/go-grpc-middleware v1.2.0/go.mod h1:mJzapYve32yjrKlk9GbyCZHuPgZsrbyIbyKhSzOpg6s= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.14.4/go.mod h1:6CwZWGDSPRJidgKAtJVvND6soZe6fT7iteq8wDPdhb0= +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= github.com/hako/durafmt v0.0.0-20200710122514-c0fb7b4da026/go.mod h1:5Scbynm8dF1XAPwIwkGPqzkM/shndPm79Jd1003hTjE= +github.com/hannahhoward/cbor-gen-for v0.0.0-20200817222906-ea96cece81f1 h1:F9k+7wv5OIk1zcq23QpdiL0hfDuXPjuOmMNaC6fgQ0Q= github.com/hannahhoward/cbor-gen-for v0.0.0-20200817222906-ea96cece81f1/go.mod h1:jvfsLIxk0fY/2BKSQ1xf2406AKA5dwMmKKv0ADcOfN8= +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.4.0/go.mod h1:xc8u05kyMa3Wjr9eEAsIAo3dg8+LywT5E/Cl7cNS5nU= @@ -756,6 +793,7 @@ 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/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= @@ -769,6 +807,7 @@ github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjh 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-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= @@ -783,6 +822,7 @@ github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA 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= @@ -801,13 +841,16 @@ github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbc 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 h1:RfGLP+h3mvisuWEyybxNq5Eft3NWhHLPeUN72kpKZoI= github.com/huin/goupnp v1.0.2/go.mod h1:0dxJBVBHqTMjIUMkESDTNgOOx/Mw5wYIfyFmdzSamkM= github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0/go.mod h1:N0Wam8K1arqPXNWjMo21EXnBPOPp36vB07FNRdD2geA= github.com/iancoleman/orderedmap v0.1.0/go.mod h1:N0Wam8K1arqPXNWjMo21EXnBPOPp36vB07FNRdD2geA= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/icrowley/fake v0.0.0-20180203215853-4178557ae428/go.mod h1:uhpZMVGznybq1itEKXj6RYw9I71qK4kH+OGMjRC4KEo= +github.com/icza/backscanner v0.0.0-20210726202459-ac2ffc679f94 h1:9tcYMdi+7Rb1y0E9Del1DRHui7Ne3za5lLw6CjMJv/M= github.com/icza/backscanner v0.0.0-20210726202459-ac2ffc679f94/go.mod h1:GYeBD1CF7AqnKZK+UCytLcY3G+UKo0ByXX/3xfdNyqQ= +github.com/icza/mighty v0.0.0-20180919140131-cfd07d671de6 h1:8UsGZ2rr2ksmEru6lToqnXgA8Mz1DP11X4zSJ159C3k= github.com/icza/mighty v0.0.0-20180919140131-cfd07d671de6/go.mod h1:xQig96I1VNBDIWGCdTt54nHt6EeI639SmHycLYL7FkA= github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= @@ -816,10 +859,12 @@ github.com/influxdata/flux v0.65.0/go.mod h1:BwN2XG2lMszOoquQaFdPET8FRQfrXiZsWmc github.com/influxdata/flux v0.127.3/go.mod h1:Zc0P/HNnJnhBlm4QsmsBbAeAdtccKo4Eu0OfkP3RCk0= github.com/influxdata/httprouter v1.3.1-0.20191122104820-ee83e2772f69/go.mod h1:pwymjR6SrP3gD3pRj9RJwdl1j5s3doEEV8gS4X9qSzA= github.com/influxdata/influxdb v1.8.0/go.mod h1:SIzcnsjaHRFpmlxpJ4S3NT64qtEKYweNTUMb/vh0OMQ= +github.com/influxdata/influxdb v1.9.4 h1:hZMq5fd4enVnruYHd7qCHsqG7kWQ/msA6x+kCvGFsRY= github.com/influxdata/influxdb v1.9.4/go.mod h1:dR0WCHqaHPpJLaqWnRSl/QHsbXJR+QpofbZXyTc8ccw= github.com/influxdata/influxdb-client-go/v2 v2.3.1-0.20210518120617-5d1fff431040/go.mod h1:vLNHdxTJkIf2mSLvGrpj8TCcISApPoXkaxP8g9uRlW8= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/influxdata/influxdb1-client v0.0.0-20200515024757-02f0bf5dbca3/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= +github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab h1:HqW4xhhynfjrtEiiSGcQUd6vrK23iMam1FO8rI7mwig= github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/influxdata/influxql v1.1.0/go.mod h1:KpVI7okXjK6PRi3Z5B+mtKZli+R1DnZgb3N+tzevNgo= github.com/influxdata/influxql v1.1.1-0.20210223160523-b6ab99450c93/go.mod h1:gHp9y86a/pxhjJ+zMjNXiQAA197Xk9wLxaz+fGG+kWk= @@ -832,16 +877,20 @@ github.com/influxdata/tdigest v0.0.0-20181121200506-bf2b5ad3c0a9/go.mod h1:Js0mq github.com/influxdata/tdigest v0.0.2-0.20210216194612-fc98d27c9e8b/go.mod h1:Z0kXnxzbTC2qrx4NaIzYkE1k66+6oEDQTvL95hQFh5Y= github.com/influxdata/usage-client v0.0.0-20160829180054-6d3895376368/go.mod h1:Wbbw6tYNvwa5dlB6304Sd+82Z3f7PmVZHVKU637d4po= github.com/ipfs/bbloom v0.0.1/go.mod h1:oqo8CVWsJFMOZqTglBG4wydCE4IQA/G2/SEofB0rjUI= +github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs= github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0= 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.5.1 h1:721YAEDBnLIrvcIMkCHCdqp34hA8jwL9yKMkyJpSpco= github.com/ipfs/go-bitswap v0.5.1/go.mod h1:P+ckC87ri1xFLvk74NlXdP0Kj9RmWAh4+H78sC6Qopo= 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= 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.2.1 h1:NJ4j/cwEfIg60rzAWcCIxRtOwbf6ZPK49MewNxObCPQ= github.com/ipfs/go-blockservice v0.2.1/go.mod h1:k6SiwmgyYgs4M/qt+ww6amPeUH9EISLRBnvUurKJhi8= 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= @@ -852,7 +901,9 @@ github.com/ipfs/go-cid v0.0.5/go.mod h1:plgt+Y5MnOey4vO4UlUazGqdbEXuFYitED67Fexh github.com/ipfs/go-cid v0.0.6-0.20200501230655-7c82f3b81c00/go.mod h1:plgt+Y5MnOey4vO4UlUazGqdbEXuFYitED67FexhXog= github.com/ipfs/go-cid v0.0.6/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= github.com/ipfs/go-cid v0.0.7/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= +github.com/ipfs/go-cid v0.1.0 h1:YN33LQulcRHjfom/i25yoOZR4Telp1Hr/2RU3d0PnC0= github.com/ipfs/go-cid v0.1.0/go.mod h1:rH5/Xv83Rfy8Rw6xG+id3DYAMUVmem1MowoKwdXmN2o= +github.com/ipfs/go-cidutil v0.0.2 h1:CNOboQf1t7Qp0nuNh8QMmhJs0+Q//bRL1axtCnIB1Yo= github.com/ipfs/go-cidutil v0.0.2/go.mod h1:ewllrvrxG6AMYStla3GD7Cqn+XYSLqjK0vc+086tB6s= github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= github.com/ipfs/go-datastore v0.0.5/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= @@ -865,7 +916,9 @@ github.com/ipfs/go-datastore v0.4.4/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13X github.com/ipfs/go-datastore v0.4.5/go.mod h1:eXTcaaiN6uOlVCLS9GjJUJtlvJfM3xk23w3fyfrmmJs= github.com/ipfs/go-datastore v0.4.7-0.20211013204805-28a3721c2e66/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= 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-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= github.com/ipfs/go-ds-badger v0.0.5/go.mod h1:g5AuuCGmr7efyzQhLL8MzwqcauPojGPUaHzfGTzuE3s= @@ -873,63 +926,89 @@ github.com/ipfs/go-ds-badger v0.0.7/go.mod h1:qt0/fWzZDoPW6jpQeqUjR5kBfhDNB65jd9 github.com/ipfs/go-ds-badger v0.2.1/go.mod h1:Tx7l3aTph3FMFrRS838dcSJh+jjA7cX9DrGVwx/NOwE= github.com/ipfs/go-ds-badger v0.2.3/go.mod h1:pEYw0rgg3FIrywKKnL+Snr+w/LjJZVMTBRn4FS6UHUk= github.com/ipfs/go-ds-badger v0.2.7/go.mod h1:02rnztVKA4aZwDuaRPTf8mpqcKmXP7mLl6JPxd14JHA= +github.com/ipfs/go-ds-badger v0.3.0 h1:xREL3V0EH9S219kFFueOYJJTcjgNSZ2HY1iSvN7U1Ro= 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-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= github.com/ipfs/go-ds-leveldb v0.4.2/go.mod h1:jpbku/YqBSsBc1qgME8BkWS4AxzF2cEu1Ii2r79Hh9s= +github.com/ipfs/go-ds-leveldb v0.5.0 h1:s++MEBbD3ZKc9/8/njrn4flZLnCuY9I79v94gBUNumo= 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-filestore v1.1.0 h1:Pu4tLBi1bucu6/HU9llaOmb9yLFk/sgP+pW764zNDoE= github.com/ipfs/go-filestore v1.1.0/go.mod h1:6e1/5Y6NvLuCRdmda/KA4GUhXJQ3Uat6vcWm2DJfxc8= +github.com/ipfs/go-fs-lock v0.0.6 h1:sn3TWwNVQqSeNjlWy6zQ1uUGAZrV3hPOyEA6y1/N2a0= github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28L7zESmM= github.com/ipfs/go-graphsync v0.11.0/go.mod h1:wC+c8vGVjAHthsVIl8LKr37cUra2GOaMYcQNNmMxDqE= +github.com/ipfs/go-graphsync v0.11.5 h1:WA5hVxGBtcal6L6nqubKiqRolaZxbexOK3GumGFJRR4= github.com/ipfs/go-graphsync v0.11.5/go.mod h1:+/sZqRwRCQRrV7NCzgBtufmr5QGpUE98XSa7NlsztmM= 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.2.1/go.mod h1:jGesd8EtCM3/zPgx+qr0/feTXGUeRai6adgwC+Q+JvE= github.com/ipfs/go-ipfs-blockstore v1.1.0/go.mod h1:5QDUApRqpgPcfGstCxYeMnjt/DYQtXXdJVCvxHHuWVk= github.com/ipfs/go-ipfs-blockstore v1.1.1/go.mod h1:w51tNR9y5+QXB0wkNcHt4O2aSZjTdqaEWaQdSxEyUOY= +github.com/ipfs/go-ipfs-blockstore v1.1.2 h1:WCXoZcMYnvOTmlpX+RSSnhVN0uCmbWTeepTGX5lgiXw= github.com/ipfs/go-ipfs-blockstore v1.1.2/go.mod h1:w51tNR9y5+QXB0wkNcHt4O2aSZjTdqaEWaQdSxEyUOY= +github.com/ipfs/go-ipfs-blocksutil v0.0.1 h1:Eh/H4pc1hsvhzsQoMEP3Bke/aW5P5rVM1IWFJMcGIPQ= github.com/ipfs/go-ipfs-blocksutil v0.0.1/go.mod h1:Yq4M86uIOmxmGPUHv/uI7uKqZNtLb449gwKqXjIsnRk= 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.3.0 h1:mi9oYrSCox5aBhutqAYqw6/9crlyGbw4E/aJtwS4zI4= github.com/ipfs/go-ipfs-cmds v0.3.0/go.mod h1:ZgYiWVnCk43ChwoH8hAmI1IRbuVtq3GSTHwtRB/Kqhk= +github.com/ipfs/go-ipfs-config v0.5.3 h1:3GpI/xR9FoJNTjU6YvCMRbYyEi0dBVY5UtlUTcNRlSA= github.com/ipfs/go-ipfs-config v0.5.3/go.mod h1:nSLCFtlaL+2rbl3F+9D4gQZQbT1LjRKx7TJg/IHz6oM= github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= +github.com/ipfs/go-ipfs-delay v0.0.1 h1:r/UXYyRcddO6thwOnhiznIAiSvxMECGgtv35Xs1IeRQ= 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= +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-offline v0.0.1/go.mod h1:WhHSFCVYX36H/anEKQboAzpUws3x7UeEGkzQc3iNkM0= +github.com/ipfs/go-ipfs-exchange-offline v0.1.1 h1:mEiXWdbMN6C7vtDG21Fphx8TGCbZPpQnz/496w/PL4g= github.com/ipfs/go-ipfs-exchange-offline v0.1.1/go.mod h1:vTiBRIbzSwDD0OWm+i3xeT0mO7jG2cbJYatp3HPk5XY= 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 h1:OFyOfmuVDu9c5YtjSDORmwXzE6fmZikzZpzsnNkgFEg= github.com/ipfs/go-ipfs-files v0.0.9/go.mod h1:aFv2uQ/qxWpL/6lidWvnSQmaVqCrf0TBGoUr+C1Fo84= +github.com/ipfs/go-ipfs-http-client v0.0.6 h1:k2QllZyP7Fz5hMgsX5hvHfn1WPG9Ngdy5WknQ7JNhBM= github.com/ipfs/go-ipfs-http-client v0.0.6/go.mod h1:8e2dQbntMZKxLfny+tyXJ7bJHZFERp/2vyzZdvkeLMc= +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-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= github.com/ipfs/go-ipfs-routing v0.2.1/go.mod h1:xiNNiwgjmLqPS1cimvAw6EyB9rkVDbiocA4yY+wRNLM= github.com/ipfs/go-ipfs-util v0.0.1/go.mod h1:spsl5z8KUnrve+73pOhSVZND1SIxPW5RyBCNzQxlJBc= +github.com/ipfs/go-ipfs-util v0.0.2 h1:59Sswnk1MFaiq+VcaknX7aYEyGyGDAA73ilhEK2POp8= github.com/ipfs/go-ipfs-util v0.0.2/go.mod h1:CbPtkWJzjLdEcezDns2XYaehFVNXG9zrdrtMecczcsQ= github.com/ipfs/go-ipld-cbor v0.0.2/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= github.com/ipfs/go-ipld-cbor v0.0.3/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= github.com/ipfs/go-ipld-cbor v0.0.4/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= github.com/ipfs/go-ipld-cbor v0.0.5/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= github.com/ipfs/go-ipld-cbor v0.0.6-0.20211211231443-5d9b9e1f6fa8/go.mod h1:ssdxxaLJPXH7OjF5V4NSjBbcfh+evoR4ukuru0oPXMA= +github.com/ipfs/go-ipld-cbor v0.0.6 h1:pYuWHyvSpIsOOLw4Jy7NbBkCyzLDcl64Bf/LZW7eBQ0= github.com/ipfs/go-ipld-cbor v0.0.6/go.mod h1:ssdxxaLJPXH7OjF5V4NSjBbcfh+evoR4ukuru0oPXMA= github.com/ipfs/go-ipld-format v0.0.1/go.mod h1:kyJtbkDALmFHv3QR6et67i35QzO3S0dCDnkOJhcZkms= github.com/ipfs/go-ipld-format v0.0.2/go.mod h1:4B6+FM2u9OJ9zCV+kSbgFAZlOrv1Hqbf0INGQgiKf9k= +github.com/ipfs/go-ipld-format v0.2.0 h1:xGlJKkArkmBvowr+GMCX0FEZtkro71K1AwiKnL37mwA= github.com/ipfs/go-ipld-format v0.2.0/go.mod h1:3l3C1uKoadTPbeNfrDi+xMInYKlx2Cvg1BuydPSdzQs= 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-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= github.com/ipfs/go-log v1.0.0/go.mod h1:JO7RzlMK6rA+CIxFMLOuB6Wf5b81GDiKElL7UPSIKjA= @@ -937,6 +1016,7 @@ github.com/ipfs/go-log v1.0.1/go.mod h1:HuWlQttfN6FWNHRhlY5yMk/lW7evQC0HHGOxEwMR github.com/ipfs/go-log v1.0.2/go.mod h1:1MNjMxe0u6xvJZgeqbJ8vdo2TKaGwZ1a0Bpza+sr2Sk= github.com/ipfs/go-log v1.0.3/go.mod h1:OsLySYkwIbiSUR/yBTdv1qPtcE4FW3WPWk/ewz9Ru+A= github.com/ipfs/go-log v1.0.4/go.mod h1:oDCg2FkjogeFOhqqb+N39l2RpTNPL6F/StPkB3kPgcs= +github.com/ipfs/go-log v1.0.5 h1:2dOuUCB1Z7uoczMWgAyDck5JLb72zHzrMnGnCNNbvY8= github.com/ipfs/go-log v1.0.5/go.mod h1:j0b8ZoR+7+R99LD9jZ6+AJsrzkPbSXbZfGakb5JPtIo= github.com/ipfs/go-log/v2 v2.0.1/go.mod h1:O7P1lJt27vWHhOwQmcFEvlmo49ry2VY2+JfBWFaa9+0= github.com/ipfs/go-log/v2 v2.0.2/go.mod h1:O7P1lJt27vWHhOwQmcFEvlmo49ry2VY2+JfBWFaa9+0= @@ -948,33 +1028,46 @@ github.com/ipfs/go-log/v2 v2.1.2-0.20200626104915-0016c0b4b3e4/go.mod h1:2v2nsGf github.com/ipfs/go-log/v2 v2.1.2/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHntrv9KM= 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 h1:iR/2o9PGWanVJrBgIH5Ff8mPGOwpqLaPIAFqSnsdlzk= github.com/ipfs/go-log/v2 v2.4.0/go.mod h1:nPZnh7Cj7lwS3LpRU5Mwr2ol1c2gXIEXuF6aywqrtmo= github.com/ipfs/go-merkledag v0.0.6/go.mod h1:QYPdnlvkOg7GnQRofu9XZimC5ZW5Wi3bKys/4GQQfto= 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.5.1 h1:tr17GPP5XtPhvPPiWtu20tSGZiZDuTaJRXBLcr79Umk= github.com/ipfs/go-merkledag v0.5.1/go.mod h1:cLMZXx8J08idkp5+id62iVftUQV+HlYJ3PIhDfZsjA4= +github.com/ipfs/go-metrics-interface v0.0.1 h1:j+cpbjYvu4R8zbleSs36gvB7jR+wsL2fGD6n0jO4kdg= github.com/ipfs/go-metrics-interface v0.0.1/go.mod h1:6s6euYU4zowdslK0GKHmqaIZ3j/b/tL7HTWtJ4VPgWY= github.com/ipfs/go-metrics-prometheus v0.0.2/go.mod h1:ELLU99AQQNi+zX6GCGm2lAgnzdSH3u5UVlCdqSXnEks= +github.com/ipfs/go-path v0.0.7 h1:H06hKMquQ0aYtHiHryOMLpQC1qC3QwXwkahcEVD51Ho= github.com/ipfs/go-path v0.0.7/go.mod h1:6KTKmeRnBXgqrTvzFrPV3CamxcgvXX/4z79tfAd2Sno= 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.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-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 h1:gq3U3T2vh8x6tXhfo3uSO3n+2z4yW0tYtNgVP/3sIyA= github.com/ipfs/go-unixfs v0.2.6/go.mod h1:GTTzQvaZsTZARdNkkdjDKFFnBhmO3e5mIM1PkH/x4p0= +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 h1:+mUiamyHIwedqP8ZgbCIwpy40oX7QcXUbo4CZOeJVJg= github.com/ipfs/interface-go-ipfs-core v0.4.0/go.mod h1:UJBcU6iNennuI05amq3FQ7g0JHUkibHFAfhfUIy927o= +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/ipld/go-car v0.1.0/go.mod h1:RCWzaUh2i4mOEkB3W45Vc+9jnS/M6Qay5ooytiBHl3g= github.com/ipld/go-car v0.3.3-0.20211210032800-e6f244225a16/go.mod h1:/wkKF4908ULT4dFIFIUZYcfjAnj+KFnJvlh8Hsz1FbQ= +github.com/ipld/go-car v0.3.3 h1:D6y+jvg9h2ZSv7GLUMWUwg5VTLy1E7Ak+uQw5orOg3I= github.com/ipld/go-car v0.3.3/go.mod h1:/wkKF4908ULT4dFIFIUZYcfjAnj+KFnJvlh8Hsz1FbQ= github.com/ipld/go-car/v2 v2.1.1-0.20211211000942-be2525f6bf2d/go.mod h1:+2Yvf0Z3wzkv7NeI69i8tuZ+ft7jyjPYIWZzeVNeFcI= +github.com/ipld/go-car/v2 v2.1.1 h1:saaKz4nC0AdfCGHLYKeXLGn8ivoPC54fyS55uyOLKwA= github.com/ipld/go-car/v2 v2.1.1/go.mod h1:+2Yvf0Z3wzkv7NeI69i8tuZ+ft7jyjPYIWZzeVNeFcI= github.com/ipld/go-codec-dagpb v1.2.0/go.mod h1:6nBN7X7h8EOsEejZGqC7tej5drsdBAXbMHyBT+Fne5s= +github.com/ipld/go-codec-dagpb v1.3.0 h1:czTcaoAuNNyIYWs6Qe01DJ+sEX7B+1Z0LcXjSatMGe8= github.com/ipld/go-codec-dagpb v1.3.0/go.mod h1:ga4JTU3abYApDC3pZ00BC2RSvC3qfBb9MSJkMLSwnhA= github.com/ipld/go-ipld-prime v0.0.2-0.20191108012745-28a82f04c785/go.mod h1:bDDSvVz7vaK12FNvMeRYnpRFkSUPNQOiCYQezMD/P3w= github.com/ipld/go-ipld-prime v0.9.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= @@ -984,35 +1077,47 @@ github.com/ipld/go-ipld-prime v0.11.0/go.mod h1:+WIAkokurHmZ/KwzDOMUuoeJgaRQktHt 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.3-0.20211207234443-319145880958/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= +github.com/ipld/go-ipld-prime v0.14.3 h1:cGUmxSws2IHurn00/iLMDapeXsnf9+FyAtYVy8G/JsQ= github.com/ipld/go-ipld-prime v0.14.3/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= github.com/ipld/go-ipld-prime-proto v0.0.0-20191113031812-e32bd156a1e5/go.mod h1:gcvzoEDBjwycpXt3LBE061wT9f46szXGHAmj9uoP6fU= +github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20211210234204-ce2a1c70cd73 h1:TsyATB2ZRRQGTwafJdgEUQkmjOExRV0DNokcihZxbnQ= 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/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= github.com/jackpal/go-nat-pmp v1.0.1/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= +github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jbenet/go-cienv v0.0.0-20150120210510-1bb1476777ec/go.mod h1:rGaEvXB4uRSZMmzKNLoXvTu1sfx+1kv/DojUlPrSZGs= github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= +github.com/jbenet/go-random v0.0.0-20190219211222-123a90aedc0c h1:uUx61FiAa1GI6ZmVd2wf2vULeQZIKG66eybjNXKYCz4= github.com/jbenet/go-random v0.0.0-20190219211222-123a90aedc0c/go.mod h1:sdx1xVM9UuLw1tXnhJWN3piypTUO3vCIHYmG15KE/dU= github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2/go.mod h1:8GXXJV31xl8whumTzdZsTt3RnUIiPqzkyf7mxToRCMs= +github.com/jbenet/go-temp-err-catcher v0.1.0 h1:zpb3ZH6wIE8Shj2sKS+khgRvf7T7RABoLk/+KKHggpk= github.com/jbenet/go-temp-err-catcher v0.1.0/go.mod h1:0kJRvmDZXNMIiJirNPEYfhpPwbGVtZVWC34vc5WLsDk= github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY= github.com/jbenet/goprocess v0.1.3/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= +github.com/jbenet/goprocess v0.1.4 h1:DRGOFReOMqqDNXwW70QkacFW0YN9QnwLV0Vqk+3oU0o= github.com/jbenet/goprocess v0.1.4/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jessevdk/go-flags v1.4.0 h1:4IU2WS7AumrZ/40jfhf4QVDMsQwqA7VEHozFRrGARJA= 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/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/jonboulle/clockwork v0.1.1-0.20190114141812-62fb9bc030d1/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jonboulle/clockwork v0.2.2 h1:UOGuzwb1PwsrDAObMuhUnj0p5ULPj8V/xJ7Kx9qUBdQ= github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/jsimonetti/rtnetlink v0.0.0-20190606172950-9527aa82566a/go.mod h1:Oz+70psSo5OFh8DBl0Zv2ACw7Esh6pPUphlvZG9x7uw= @@ -1030,18 +1135,22 @@ github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/X github.com/jsternberg/zap-logfmt v1.0.0/go.mod h1:uvPs/4X51zdkcm5jXl5SYoN+4RK21K8mysFmDaM/h+o= github.com/jsternberg/zap-logfmt v1.2.0/go.mod h1:kz+1CUmCutPWABnNkOu9hOHKdT2q3TDYCcsFy9hpqb0= github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= 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/jwilder/encoding v0.0.0-20170811194829-b4e1701a28ef/go.mod h1:Ct9fl0F6iIOGgxJ5npU/IUOhOhqlVrGjyIZc8/MagT0= +github.com/kabukky/httpscerts v0.0.0-20150320125433-617593d7dcb3 h1:Iy7Ifq2ysilWU4QlCx/97OoI4xT1IV7i8byT/EyIT/M= 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/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4= github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= +github.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8= github.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg= github.com/kilic/bls12-381 v0.0.0-20200607163746-32e1441c8a9f/go.mod h1:XXfR6YFCRSrkEXbNlIyDsgXVNJWVUV30m/ebkVy9n6s= github.com/kilic/bls12-381 v0.0.0-20200731194930-64c428e1bff5/go.mod h1:XXfR6YFCRSrkEXbNlIyDsgXVNJWVUV30m/ebkVy9n6s= +github.com/kilic/bls12-381 v0.0.0-20200820230200-6b2c19996391 h1:51kHw7l/dUDdOdW06AlUGT5jnpj6nqQSILebcsikSjA= github.com/kilic/bls12-381 v0.0.0-20200820230200-6b2c19996391/go.mod h1:XXfR6YFCRSrkEXbNlIyDsgXVNJWVUV30m/ebkVy9n6s= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= @@ -1052,10 +1161,13 @@ github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0 github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= 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 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5 h1:2U0HzY8BJ8hVwDKIzp7y4voR9CX/nvcfymLmg2UiOio= github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= 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 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= 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= @@ -1064,17 +1176,21 @@ 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/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= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v0.0.0-20160406211939-eadb3ce320cb/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg= @@ -1082,21 +1198,27 @@ github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/libp2p/go-addr-util v0.0.1/go.mod h1:4ac6O7n9rIAKB1dnd+s8IbbMXkt+oBpzX4/+RACcnlQ= github.com/libp2p/go-addr-util v0.0.2/go.mod h1:Ecd6Fb3yIuLzq4bD7VcywcVSBtefcAwnUISBM3WG15E= +github.com/libp2p/go-addr-util v0.1.0 h1:acKsntI33w2bTU7tC9a0SaPimJGfSI0bFKC18ChxeVI= 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-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= github.com/libp2p/go-conn-security-multistream v0.0.2/go.mod h1:nc9vud7inQ+d6SO0I/6dSWrdMnHnzZNHeyUQqrAJulE= github.com/libp2p/go-conn-security-multistream v0.1.0/go.mod h1:aw6eD7LOsHEX7+2hJkDxw1MteijaVcI+/eP2/x3J1xc= 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 h1:9UCIKlBL1hC9u7nkMXpD1nkc/T53PKMAn3/k9ivBAVc= github.com/libp2p/go-conn-security-multistream v0.3.0/go.mod h1:EEP47t4fw/bTelVmEzIDqSe69hO/ip52xBEhZMLWAHM= 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-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-libp2p v0.0.30/go.mod h1:XWT8FGHlhptAv1+3V/+J5mEpzyui/5bvFsNuWYs611A= github.com/libp2p/go-libp2p v0.1.0/go.mod h1:6D/2OBauqLUoqcADOJpn9WbKqvaM07tDw68qHM0BxUM= @@ -1112,8 +1234,10 @@ github.com/libp2p/go-libp2p v0.10.0/go.mod h1:yBJNpb+mGJdgrwbKAKrhPU0u3ogyNFTfjJ 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 h1:8l4GV401OSd4dFRyHDtIT/mEzdh/aQGoFC8xshYgm5M= github.com/libp2p/go-libp2p v0.17.0/go.mod h1:Fkin50rsGdv5mm5BshBUtPRZknt9esfmYXBOYcwOTgw= 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 h1:rABPCO77SjdbJ/eJ/ynIo8vWICy1VEnL5JAxJbQLo1E= github.com/libp2p/go-libp2p-asn-util v0.1.0/go.mod h1:wu+AnM9Ii2KgO5jMmS1rz9dvzTdj8BXqsPR9HR0XB7I= github.com/libp2p/go-libp2p-autonat v0.0.6/go.mod h1:uZneLdOkZHro35xIhpbtTzLlgYturpu4J5+0cZK3MqE= github.com/libp2p/go-libp2p-autonat v0.1.0/go.mod h1:1tLf2yXxiE/oKGtDwPYWTSYG3PtvYlJmg7NeVtPRqH8= @@ -1124,6 +1248,7 @@ github.com/libp2p/go-libp2p-autonat v0.2.2/go.mod h1:HsM62HkqZmHR2k1xgX34WuWDzk/ github.com/libp2p/go-libp2p-autonat v0.2.3/go.mod h1:2U6bNWCNsAG9LEbwccBDQbjzQ8Krdjge1jLTE9rdoMM= 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 h1:rCP5s+A2dlhM1Xd66wurE0k7S7pPmM0D+FlqqSBXxks= 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= @@ -1132,6 +1257,7 @@ github.com/libp2p/go-libp2p-blankhost v0.1.3/go.mod h1:KML1//wiKR8vuuJO0y3LUd1uL github.com/libp2p/go-libp2p-blankhost v0.1.4/go.mod h1:oJF0saYsAXQCSfDq254GMNmLNz6ZTHTOvtF4ZydUvwU= github.com/libp2p/go-libp2p-blankhost v0.1.6/go.mod h1:jONCAJqEP+Z8T6EQviGL4JsQcLx1LgTGtVqFNY8EMfQ= 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= @@ -1141,9 +1267,11 @@ github.com/libp2p/go-libp2p-circuit v0.1.4/go.mod h1:CY67BrEjKNDhdTk8UgBX1Y/H5c3 github.com/libp2p/go-libp2p-circuit v0.2.1/go.mod h1:BXPwYDN5A8z4OEY9sOfr2DUQMLQvKt/6oku45YUmjIo= 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 h1:eqQ3sEYkGTtybWgr6JLqJY6QLtPWRErvFjFDfAOO1wc= github.com/libp2p/go-libp2p-circuit v0.4.0/go.mod h1:t/ktoFIUzM6uLQ+o1G6NuBl2ANhBKN9Bc8jRIk31MoA= 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 h1:yerFXrYa0oxpuVsLlndwm/bLulouHYDcvFrY/4H4fx8= github.com/libp2p/go-libp2p-connmgr v0.3.0/go.mod h1:RVoyPjJm0J9Vd1m6qUN2Tn7kJm4rL1Ml20pFsFgPGik= github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= github.com/libp2p/go-libp2p-core v0.0.2/go.mod h1:9dAcntw/n46XycV4RnlBq3BpgrmyUi9LuoTNdPrbUco= @@ -1178,6 +1306,7 @@ github.com/libp2p/go-libp2p-core v0.9.0/go.mod h1:ESsbz31oC3C1AvMJoGx26RTuCkNhmk github.com/libp2p/go-libp2p-core v0.10.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= 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 h1:IFG/s8dN6JN2OTrXX9eq2wNU/Zlz2KLdwZUp5FplgXI= github.com/libp2p/go-libp2p-core v0.13.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= 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= @@ -1189,6 +1318,7 @@ 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.4.0/go.mod h1:bZ0aJSrFc/eX2llP0ryhb1kpgkPyTo23SJ5b7UQCMh4= github.com/libp2p/go-libp2p-discovery v0.5.0/go.mod h1:+srtPIU9gDaBNu//UHvcdliKBIcr4SfDcm0/PfPJLug= +github.com/libp2p/go-libp2p-discovery v0.6.0 h1:1XdPmhMJr8Tmj/yUfkJMIi8mgwWrLUsCB3bMxdT+DSo= github.com/libp2p/go-libp2p-discovery v0.6.0/go.mod h1:/u1voHt0tKIe5oIA1RHBKQLVCWPna2dXmPNHc2zR9S8= 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= @@ -1197,11 +1327,14 @@ 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-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= 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= @@ -1210,16 +1343,20 @@ github.com/libp2p/go-libp2p-mplex v0.2.1/go.mod h1:SC99Rxs8Vuzrf/6WhmH41kNn13TiY 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.4.0/go.mod h1:yCyWJE2sc6TBTnFpjvLuEJgTSw/u+MamvzILKdX7asw= +github.com/libp2p/go-libp2p-mplex v0.4.1 h1:/pyhkP1nLwjG3OM+VuaNJkQT/Pqq73WzB3aDN3Fx1sc= github.com/libp2p/go-libp2p-mplex v0.4.1/go.mod h1:cmy+3GfqfM1PceHTLL7zQzAAYaryDu6iPSC+CIb094g= 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= +github.com/libp2p/go-libp2p-nat v0.1.0 h1:vigUi2MEN+fwghe5ijpScxtbbDz+L/6y8XwlzYOJgSY= github.com/libp2p/go-libp2p-nat v0.1.0/go.mod h1:DQzAG+QbDYjN1/C3B6vXucLtz3u9rEonLVPtZVzQqks= 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-noise v0.2.0/go.mod h1:IEbYhBBzGyvdLBoxxULL/SGbJARhUeqlO8lVSREYu2Q= +github.com/libp2p/go-libp2p-noise v0.3.0 h1:NCVH7evhVt9njbTQshzT7N1S3Q6fjj9M11FCgfH5+cA= github.com/libp2p/go-libp2p-noise v0.3.0/go.mod h1:JNjHbociDJKHD64KTkzGnzqJ0FEV5gHJa6AB00kbCNQ= github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo= github.com/libp2p/go-libp2p-peer v0.1.1/go.mod h1:jkF12jGB4Gk/IOo+yomm+7oLWxF278F7UnrYUQ1Q8es= @@ -1238,13 +1375,17 @@ 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.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 h1:HJminhQSGISBIRb93N6WK3t6Fa8OOTnHd/VBjL4mY5A= github.com/libp2p/go-libp2p-peerstore v0.6.0/go.mod h1:DGEmKdXrcYpK9Jha3sS7MhqYdInxJy84bIPtSu65bKc= +github.com/libp2p/go-libp2p-pnet v0.2.0 h1:J6htxttBipJujEjz1y0a5+eYoiPcFHhSYHH6na5f0/k= 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.3.2/go.mod h1:Uss7/Cfz872KggNb+doCVPHeCDmXB7z500m/R8DaAUk= +github.com/libp2p/go-libp2p-pubsub v0.6.0 h1:98+RXuEWW17U6cAijK1yaTf6mw/B+n5yPA421z+dlo0= github.com/libp2p/go-libp2p-pubsub v0.6.0/go.mod h1:nJv87QM2cU0w45KPR1rZicq+FmFIOD16zmT+ep1nOmg= +github.com/libp2p/go-libp2p-pubsub-tracer v0.0.0-20200626141350-e730b32bf1e6 h1:2lH7rMlvDPSvXeOR+g7FE6aqiEwxtpxWKQL8uigk5fQ= github.com/libp2p/go-libp2p-pubsub-tracer v0.0.0-20200626141350-e730b32bf1e6/go.mod h1:8ZodgKS4qRLayfw9FDKDd9DX4C16/GMofDxSldG8QPI= github.com/libp2p/go-libp2p-quic-transport v0.1.1/go.mod h1:wqG/jzhF3Pu2NrhJEvE+IE0NTHNXslOPn9JQzyCAxzU= github.com/libp2p/go-libp2p-quic-transport v0.5.0/go.mod h1:IEcuC5MLxvZ5KuHKjRu+dr3LjCT1Be3rcD/4d8JrX8M= @@ -1252,14 +1393,17 @@ github.com/libp2p/go-libp2p-quic-transport v0.10.0/go.mod h1:RfJbZ8IqXIhxBRm5hqU 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= 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 h1:wHBEceRy+1/8Ec8dAIyr+/P7L2YefIGprPVy5LrMM+k= github.com/libp2p/go-libp2p-quic-transport v0.15.2/go.mod h1:wv4uGwjcqe8Mhjj7N/Ic0aKjA+/10UnMlSzLO0yRpYQ= 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-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= github.com/libp2p/go-libp2p-secio v0.1.0/go.mod h1:tMJo2w7h3+wN4pgU2LSYeiKPrfqBgkOsdiKK77hE7c8= @@ -1278,6 +1422,7 @@ 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.5.3/go.mod h1:NBn7eNW2lu568L7Ns9wdFrOhgRlkRnIDg0FLKbuu3i8= github.com/libp2p/go-libp2p-swarm v0.8.0/go.mod h1:sOMp6dPuqco0r0GHTzfVheVBh6UEL0L1lXUZ5ot2Fvc= +github.com/libp2p/go-libp2p-swarm v0.9.0 h1:LdWjHDVjPMYt3NCG2EHcQiIP8XzA8BHhHz8ZLAYol2Y= github.com/libp2p/go-libp2p-swarm v0.9.0/go.mod h1:2f8d8uxTJmpeqHF/1ujjdXZp+98nNIbujVOMEZxCbZ8= 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= @@ -1290,9 +1435,11 @@ github.com/libp2p/go-libp2p-testing v0.3.0/go.mod h1:efZkql4UZ7OVsEfaxNHZPzIehts github.com/libp2p/go-libp2p-testing v0.4.0/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotlKsNSbKQ/lImlOWF0= 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 h1:tV/wz6mS1VoAYA/5DGTiyzw9TJ+eXMCMvzU5VPLJSgg= github.com/libp2p/go-libp2p-testing v0.6.0/go.mod h1:QBk8fqIL1XNcno/l3/hhaIEn4aLRijpYOR+zVjjlh+A= 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 h1:lsE2zYte+rZCEOHF72J1Fg3XK3dGQyKvI6i5ehJfEp0= github.com/libp2p/go-libp2p-tls v0.3.1/go.mod h1:fwF5X6PWGxm6IDRwF3V8AVCCj/hOd5oFlg+wo2FxJDY= github.com/libp2p/go-libp2p-transport v0.0.1/go.mod h1:UzbUs9X+PHOSw7S3ZmeOxfnwaQY5vGDzZmKPod3N3tk= github.com/libp2p/go-libp2p-transport v0.0.5/go.mod h1:StoY3sx6IqsP6XKoabsPnHCwqKXWUMWU7Rfcsubee/A= @@ -1304,6 +1451,7 @@ 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.4.6/go.mod h1:JE0WQuQdy+uLZ5zOaI3Nw9dWGYJIA7mywEtP2lMvnyk= 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 h1:GfMCU+2aGGEm1zW3UcOz6wYSn8tXQalFfVfcww99i5A= github.com/libp2p/go-libp2p-transport-upgrader v0.6.0/go.mod h1:1e07y1ZSZdHo9HPbuU8IztM1Cj+DR5twgycb4pnRzRo= github.com/libp2p/go-libp2p-xor v0.0.0-20210714161855-5c005aca55db/go.mod h1:LSTM5yRnjGZbWNTA/hRwq2gGFrvRIbQJscoIL/u6InY= github.com/libp2p/go-libp2p-yamux v0.1.2/go.mod h1:xUoV/RmYkg6BW/qGxA9XJyg+HzXFYkeXbnhjmnYzKp8= @@ -1318,10 +1466,12 @@ github.com/libp2p/go-libp2p-yamux v0.4.0/go.mod h1:+DWDjtFMzoAwYLVkNZftoucn7PelN github.com/libp2p/go-libp2p-yamux v0.5.0/go.mod h1:AyR8k5EzyM2QN9Bbdg6X1SkVVuqLwTGf0L4DFq9g6po= 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 h1:bVXHbTj/XH4uBBsPrg26BlDABk5WYRlssY73P0SjhPc= github.com/libp2p/go-libp2p-yamux v0.7.0/go.mod h1:fMyA0CsPfHkIuBU0wjRGrCjTBFiXTXxG0k5M4ETv+08= 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= +github.com/libp2p/go-maddr-filter v0.1.0 h1:4ACqZKw8AqiuJfwFGq1CYDFugfXTOos+qQ3DETkhtCE= github.com/libp2p/go-maddr-filter v0.1.0/go.mod h1:VzZhTXkMucEGGEOSKddrwGiOv0tUhgnKqNEmIAz/bPU= github.com/libp2p/go-mplex v0.0.3/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= github.com/libp2p/go-mplex v0.0.4/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= @@ -1329,40 +1479,49 @@ github.com/libp2p/go-mplex v0.1.0/go.mod h1:SXgmdki2kwCUlCCbfGLEgHjC4pFqhTp0ZoV6 github.com/libp2p/go-mplex v0.1.1/go.mod h1:Xgz2RDCi3co0LeZfgjm4OgUF15+sVR8SRcu3SFXI1lk= 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 h1:U1T+vmCYJaEoDJPV1aq31N56hS+lJgb397GsylNSgrU= github.com/libp2p/go-mplex v0.3.0/go.mod h1:0Oy/A9PQlwBytDRp4wSkFnzHYDKcpLot35JQ6msjvYQ= 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= github.com/libp2p/go-msgio v0.0.6/go.mod h1:4ecVB6d9f4BDSL5fqvPiC4A3KivjWn+Venn/1ALLMWA= +github.com/libp2p/go-msgio v0.1.0 h1:8Q7g/528ivAlfXTFWvWhVjTE8XG8sDTkRUKPYh9+5Q8= github.com/libp2p/go-msgio v0.1.0/go.mod h1:eNlv2vy9V2X/kNldcZ+SShFE++o2Yjxwx6RAYsmgJnE= github.com/libp2p/go-nat v0.0.3/go.mod h1:88nUEt0k0JD45Bk93NIwDqjlhiOwOoV36GchpcVc1yI= github.com/libp2p/go-nat v0.0.4/go.mod h1:Nmw50VAvKuk38jUBcmNh6p9lUJLoODbJRvYAa/+KSDo= github.com/libp2p/go-nat v0.0.5/go.mod h1:B7NxsVNPZmRLvMOwiEO1scOSyjA56zxYAGv1yQgRkEU= +github.com/libp2p/go-nat v0.1.0 h1:MfVsH6DLcpa04Xr+p8hmVRG4juse0s3J8HyNWYHffXg= github.com/libp2p/go-nat v0.1.0/go.mod h1:X7teVkwRHNInVNWQiO/tAiAVRwSr5zoRz4YSTC3uRBM= github.com/libp2p/go-netroute v0.1.2/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk= github.com/libp2p/go-netroute v0.1.3/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk= github.com/libp2p/go-netroute v0.1.5/go.mod h1:V1SR3AaECRkEQCoFFzYwVYWvYIEtlxx89+O3qcpCl4A= +github.com/libp2p/go-netroute v0.1.6 h1:ruPJStbYyXVYGQ81uzEDzuvbYRLKRrLvTYd33yomC38= github.com/libp2p/go-netroute v0.1.6/go.mod h1:AqhkMh0VuWmfgtxKPp3Oc1LdU5QSWS7wl0QLhSZqXxQ= github.com/libp2p/go-openssl v0.0.2/go.mod h1:v8Zw2ijCSWBQi8Pq5GAixw6DbFfa9u6VIYDXnvOXkc0= 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-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 h1:0ooKOx2iwyIkf339WCZ2HN3ujTDbkK0PjC7JVoP1AiM= github.com/libp2p/go-reuseport v0.1.0/go.mod h1:bQVn9hmfcTaoo0c9v5pBhOarsU1eNOBZdaAd2hzXRKU= github.com/libp2p/go-reuseport-transport v0.0.2/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs= github.com/libp2p/go-reuseport-transport v0.0.3/go.mod h1:Spv+MPft1exxARzP2Sruj2Wb5JSyHNncjf1Oi2dEbzM= github.com/libp2p/go-reuseport-transport v0.0.4/go.mod h1:trPa7r/7TJK/d+0hdBLOCGvpQQVOU74OXbNCIMkufGw= github.com/libp2p/go-reuseport-transport v0.0.5/go.mod h1:TC62hhPc8qs5c/RoXDZG6YmjK+/YWUPC0yYmeUecbjc= +github.com/libp2p/go-reuseport-transport v0.1.0 h1:C3PHeHjmnz8m6f0uydObj02tMEoi7CyD1zuN7xQT8gc= github.com/libp2p/go-reuseport-transport v0.1.0/go.mod h1:vev0C0uMkzriDY59yFHD9v+ujJvYmDQVLowvAjEOmfw= 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 h1:yD80l2ZOdGksnOyHrhxDdTDFrf7Oy+v3FMVArIRgZxQ= github.com/libp2p/go-sockaddr v0.1.1/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= 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= 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 h1:TqnSHPJEIqDEO7h1wZZ0p3DXdvDSiLHQidKKUGZtiOY= github.com/libp2p/go-stream-muxer-multistream v0.3.0/go.mod h1:yDh8abSIzmZtqtOt64gFJUXEryejzNb0lisTt+fAMJA= 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= @@ -1371,6 +1530,7 @@ github.com/libp2p/go-tcp-transport v0.2.0/go.mod h1:vX2U0CnWimU4h0SGSEsg++AzvBcr 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= +github.com/libp2p/go-tcp-transport v0.4.0 h1:VDyg4j6en3OuXf90gfDQh5Sy9KowO9udnd0OU8PP6zg= github.com/libp2p/go-tcp-transport v0.4.0/go.mod h1:0y52Rwrn4076xdJYu/51/qJIdxz+EWDAOG2S45sV3VI= 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= @@ -1381,6 +1541,7 @@ 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.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 h1:cO6x4P0v6PfxbKnxmf5cY2Ny4OPDGYkUqNvZzp/zdlo= github.com/libp2p/go-ws-transport v0.5.0/go.mod h1:I2juo1dNTbl8BKSBYo98XY85kU2xds1iamArLvl8kNg= 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= @@ -1390,8 +1551,10 @@ 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.2.0/go.mod h1:3So6P6TV6r75R9jiBpiIKgU/66lOarCZjqROGxzPpPQ= +github.com/libp2p/go-yamux/v2 v2.3.0 h1:luRV68GS1vqqr6EFUjtu1kr51d+IbW0gSowu8emYWAI= github.com/libp2p/go-yamux/v2 v2.3.0/go.mod h1:iTU+lOIn/2h0AgKcL49clNTwfEw+WSfDYrXe05EyKIs= 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= @@ -1401,11 +1564,14 @@ github.com/lucas-clemente/quic-go v0.16.0/go.mod h1:I0+fcNTdb9eS1ZcjQZbDVPGchJ86 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= +github.com/lucas-clemente/quic-go v0.24.0 h1:ToR7SIIEdrgOhgVTHvPgdVRJfgVy+N0wQAagH7L4d5g= github.com/lucas-clemente/quic-go v0.24.0/go.mod h1:paZuzjXCE5mj6sikVLMvqXk8lJV2AsqtJ6bDhjEfxx0= +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= github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= +github.com/magefile/mage v1.9.0 h1:t3AU2wNwehMCW97vuqQLtw6puppWXHO+O2MHo5a50XE= github.com/magefile/mage v1.9.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= @@ -1426,9 +1592,12 @@ github.com/marten-seemann/qtls v0.10.0/go.mod h1:UvMd1oaYDACI99/oZUYLzMCkBXQVT0a 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= github.com/marten-seemann/qtls-go1-15 v0.1.5/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= +github.com/marten-seemann/qtls-go1-16 v0.1.4 h1:xbHbOGGhrenVtII6Co8akhLEdrawwB2iHl5yhJRpnco= github.com/marten-seemann/qtls-go1-16 v0.1.4/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 h1:P9ggrs5xtwiqXv/FHNwntmuLMNq3KaSIG93AtAZ48xk= github.com/marten-seemann/qtls-go1-17 v0.1.0/go.mod h1:fz4HIxByo+LlWcreM4CZOYNuz3taBQ8rN2X6FqvaWo8= +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= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= @@ -1438,6 +1607,7 @@ github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVc github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.7/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-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= @@ -1449,14 +1619,17 @@ 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-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.3/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= github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-tty v0.0.0-20180907095812-13ff1204f104/go.mod h1:XPvLUNfbS4fJH25nqRHfWLMa1ONC8Amw+mIA639KxkE= github.com/mattn/go-xmlrpc v0.0.3/go.mod h1:mqc2dz7tP5x5BKlCahN/n+hs7OSZKJkS9JsHNBRlrxA= +github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/mdlayher/genetlink v1.0.0/go.mod h1:0rJ0h4itni50A86M2kHcgS85ttZazNt7a8H2a2cw0Gc= github.com/mdlayher/netlink v0.0.0-20190409211403-11939a169225/go.mod h1:eQB3mZE4aiYnlUsyGGCOpPETfdQq4Jhsgf1fk3cwQaA= @@ -1473,11 +1646,16 @@ github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKju github.com/miekg/dns v1.1.28/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/dns v1.1.29/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= +github.com/miekg/dns v1.1.43 h1:JKfpVSCB84vrAmHzyrsxB5NAr5kLoMXZArPSw7Qlgyg= github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= +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= github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b/go.mod h1:lxPUiZwKoFL8DUUmalo2yJJUCxbPKtm8OKfqr2/FTNU= +github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc h1:PTfri+PuQmWDqERdnNMiD9ZejrlswWrCpBEZgWOiTrc= github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc/go.mod h1:cGKTAVKx4SxOuR/czcZ/E2RSJ3sfHs8FpHhQ5CWMf9s= github.com/mileusna/useragent v0.0.0-20190129205925-3e331f0949a5/go.mod h1:JWhYAp2EXqUtsxTKdeGlY8Wp44M7VxThC9FEoNGi2IE= +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= @@ -1486,10 +1664,12 @@ github.com/minio/sha256-simd v0.0.0-20190328051042-05b4dd3047e5/go.mod h1:2FMWW+ github.com/minio/sha256-simd v0.1.0/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= github.com/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= +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= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= @@ -1509,10 +1689,13 @@ github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVq 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= github.com/mr-tron/base58 v1.1.3/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= +github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg= github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= +github.com/multiformats/go-base32 v0.0.4 h1:+qMh4a2f37b4xTNs6mqitDinryCI+tfO2dRVMN9mjSE= github.com/multiformats/go-base32 v0.0.4/go.mod h1:jNLFzjPZtp3aIARHbJRZIaPuspdH0J6q39uUM5pnABM= +github.com/multiformats/go-base36 v0.1.0 h1:JR6TyF7JjGd3m6FbLU2cOxhC0Li8z8dLNGQ89tUg4F4= github.com/multiformats/go-base36 v0.1.0/go.mod h1:kFGE83c6s80PklsHO9sRn2NCoffoRdUUOENyW/Vv6sM= github.com/multiformats/go-multiaddr v0.0.1/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= github.com/multiformats/go-multiaddr v0.0.2/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= @@ -1526,14 +1709,17 @@ 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 h1:Pq37uLx3hsyNlTDir7FZyU8+cFCTqd5y1KiM2IzOutI= github.com/multiformats/go-multiaddr v0.4.1/go.mod h1:3afI9HfVW8csiF8UZqtpYRiDyew8pRX7qLIGHu9FLuM= 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.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= +github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/eQsuaL3/CWe167E= github.com/multiformats/go-multiaddr-fmt v0.1.0/go.mod h1:hGtDIW4PU4BqJ50gW2quDuPVjyWNZxToGUh/HwTZYJo= github.com/multiformats/go-multiaddr-net v0.0.1/go.mod h1:nw6HSxNmCIQH27XPGBuX+d1tnvM7ihcFwHMSstNAVUU= github.com/multiformats/go-multiaddr-net v0.1.0/go.mod h1:5JNbcfBOP4dnhoZOv10JJVkJO0pCCEf8mTnipAo2UZQ= @@ -1545,9 +1731,11 @@ 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-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 h1:ZrUuMKNgJ52qHPoQ+bx0h0uBfcWmN7Px+4uKSZeesiI= github.com/multiformats/go-multicodec v0.3.1-0.20210902112759-1539a079fd61/go.mod h1:1Hj/eHRaVWSXiSNNfcEPcwZleTmdNP81xlxDLnWU9GQ= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po= @@ -1557,16 +1745,19 @@ 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.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.1/go.mod h1:5GZPQZbkWOLOn3J2y4Y99vVW7vOfsAflxARk3x14o6k= +github.com/multiformats/go-multistream v0.2.2 h1:TCYu1BHTDr1F/Qm75qwYISQdzGcRdC21nFgQW7l7GBo= github.com/multiformats/go-multistream v0.2.2/go.mod h1:UIcnm7Zuo8HKG+HkWgfQsGL+/MIEhyTqbODbIUwSXKs= github.com/multiformats/go-varint v0.0.1/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= github.com/multiformats/go-varint v0.0.2/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= github.com/multiformats/go-varint v0.0.5/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= +github.com/multiformats/go-varint v0.0.6 h1:gk85QWKxh3TazbLxED/NlDVv8+q+ReFJk7Y2W/KhfNY= github.com/multiformats/go-varint v0.0.6/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= @@ -1589,9 +1780,12 @@ github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJE 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= github.com/nkovacs/streamquote v1.0.0/go.mod h1:BN+NaZ2CmdKqUuTUXUEm9j95B2TRbpOWpxbJYzzgUsc= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= @@ -1608,6 +1802,7 @@ github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0 github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= +github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= @@ -1618,19 +1813,24 @@ github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7J github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= 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/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= github.com/opentracing-contrib/go-grpc v0.0.0-20180928155321-4b5a12d3ff02/go.mod h1:JNdpVEzCpXBgIiv4ds+TzhN1hrtxq6ClLrTlT9OQRSc= +github.com/opentracing-contrib/go-grpc v0.0.0-20191001143057-db30781987df h1:vdYtBU6zvL7v+Tr+0xFM/qhahw/EvY8DMMunZHKH6eE= github.com/opentracing-contrib/go-grpc v0.0.0-20191001143057-db30781987df/go.mod h1:DYR5Eij8rJl8h7gblRrOZ8g0kW1umSpKqYIBTgeDtLo= github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= github.com/opentracing-contrib/go-stdlib v0.0.0-20190519235532-cf7a6c988dc9/go.mod h1:PLldrQSroqzH70Xl+1DQcGnefIbqsKR7UDaiux3zV+w= +github.com/opentracing-contrib/go-stdlib v1.0.0 h1:TBS7YuVotp8myLon4Pv7BtCBzOTo1DeZCld0Z63mW2w= github.com/opentracing-contrib/go-stdlib v1.0.0/go.mod h1:qtI1ogk+2JhVPIXVc6q+NHziSmy2W5GbdQZFUHADCBU= github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.0.3-0.20180606204148-bd9c31933947/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= @@ -1647,6 +1847,7 @@ github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/9 github.com/pelletier/go-toml v1.4.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo= 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/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/peterh/liner v1.0.1-0.20180619022028-8c1271fcf47f/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc= @@ -1656,14 +1857,17 @@ github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA= 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= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= github.com/pkg/term v0.0.0-20180730021639-bffc007b7fd5/go.mod h1:eCbImbZ95eXtAUIbLAuAVnBnwf83mjf6QIVH8SHYwqQ= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/polydawn/refmt v0.0.0-20190221155625-df39d6c2d992/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= github.com/polydawn/refmt v0.0.0-20190408063855-01bf1e26dd14/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= github.com/polydawn/refmt v0.0.0-20190807091052-3d65705ee9f1/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= github.com/polydawn/refmt v0.0.0-20190809202753-05966cbd336a/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= +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= @@ -1682,12 +1886,14 @@ github.com/prometheus/client_golang v1.5.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3O 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= github.com/prometheus/client_golang v1.10.0/go.mod h1:WJM3cc3yu7XKBKa/I8WeZm+V3eltZnBwfENSU7mdogU= +github.com/prometheus/client_golang v1.11.0 h1:HNkLOAEQMIDv/K+04rukrLx6ch7msSRwf3/SASFAGtQ= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= @@ -1701,6 +1907,7 @@ github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16 github.com/prometheus/common v0.18.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/common v0.28.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= +github.com/prometheus/common v0.30.0 h1:JEkYlQnpzrzQFxi6gnukFPdQ+ac82oRhzMcIduJu/Ug= github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= 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= @@ -1716,27 +1923,38 @@ 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/prometheus v0.0.0-20200609090129-a6600f564e3c/go.mod h1:S5n0C6tSgdnwWshBUceRx5G1OsjLv/EeZ9t3wIfEtsY= +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= 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/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= +github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 h1:OdAsTTz6OkFY5QxjkYwrChwuRruF69c169dPK26NUlk= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/retailnext/hllpp v1.0.1-0.20180308014038-101a6d2f8b52/go.mod h1:RDpi1RftBQPUCDRw6SmxeaREsAaRKnOclghuzp/WRzc= +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= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rs/cors v1.6.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= +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 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/rwcarlsen/goexif v0.0.0-20190401172101-9e8deecbddbd/go.mod h1:hPqNNc0+uJM6H+SuU8sEs5K5IQeKccPqeSjfgcKGgPk= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= @@ -1748,8 +1966,10 @@ github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg github.com/segmentio/kafka-go v0.1.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= github.com/segmentio/kafka-go v0.2.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= github.com/sercand/kuberesolver v2.1.0+incompatible/go.mod h1:lWF3GL0xptCB/vCiJPl/ZshwPsX/n4Y7u0CW9E7aQIQ= +github.com/sercand/kuberesolver v2.4.0+incompatible h1:WE2OlRf6wjLxHwNkkFLQGaZcVLEXjMjBPjjEU5vksH8= github.com/sercand/kuberesolver v2.4.0+incompatible/go.mod h1:lWF3GL0xptCB/vCiJPl/ZshwPsX/n4Y7u0CW9E7aQIQ= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/shirou/gopsutil v2.18.12+incompatible h1:1eaJvGomDnH74/5cF4CTmTbLHAriGFsTZppLXDX93OM= github.com/shirou/gopsutil v2.18.12+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shurcooL/component v0.0.0-20170202220835-f88ec8f54cc4/go.mod h1:XhFIlyj5a1fBNx5aJTbKoIq0mNaPvOagO+HjB3EtxrY= github.com/shurcooL/events v0.0.0-20181021180414-410e4ca65f48/go.mod h1:5u70Mqkb5O5cxEA8nxTsgrgLehJeAw6Oc4Ab1c/P1HM= @@ -1772,6 +1992,7 @@ github.com/shurcooL/notifications v0.0.0-20181007000457-627ab5aea122/go.mod h1:b github.com/shurcooL/octicon v0.0.0-20181028054416-fa4f57f9efb2/go.mod h1:eWdoE5JD4R5UVWDucdOPg1g2fqQRq78IQa9zlOV1vpQ= github.com/shurcooL/reactions v0.0.0-20181006231557-f2e0b4ca5b82/go.mod h1:TCR1lToEk4d2s07G3XGfz2QrgHXg4RJBvjrOozvoWfk= github.com/shurcooL/sanitized_anchor_name v0.0.0-20170918181015-86672fcb3f95/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/shurcooL/users v0.0.0-20180125191416-49c67e49c537/go.mod h1:QJTqeLYEDaXHZDBsXlPCDqdhQuJkuw4NOtaxYe3xii4= github.com/shurcooL/vfsgen v0.0.0-20181202132449-6a9ea43bcacd/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw= @@ -1783,13 +2004,16 @@ github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMB github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/assertions v1.0.0/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= +github.com/smartystreets/assertions v1.0.1 h1:voD4ITNjPL5jjBfgR/r8fPIIBrliWrWHeiJApdr3r4w= github.com/smartystreets/assertions v1.0.1/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= github.com/smartystreets/goconvey v0.0.0-20190222223459-a17d461953aa/go.mod h1:2RVY1rIf+2J2o/IM9+vPq9RzmHDSseB7FoXiSNIUsoU= github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/smola/gocompat v0.2.0/go.mod h1:1B0MlxbmoZNo3h8guHp8HztB3BSYR5itql9qtVc0ypY= github.com/snowflakedb/gosnowflake v1.6.1/go.mod h1:1kyg2XEduwti88V11PKRHImhXLK5WpGiayY6lFNYb98= @@ -1799,8 +2023,10 @@ github.com/soundcloud/go-runit v0.0.0-20150630195641-06ad41a06c4a/go.mod h1:LeFC github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE= github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA= github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 h1:RC6RW7j+1+HkWaX/Yh71Ee5ZHaHYt7ZP4sQgUrm6cDU= github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= @@ -1822,6 +2048,7 @@ github.com/streadway/handy v0.0.0-20200128134331-0f66f006fb2e/go.mod h1:qNTQ5P5J github.com/streadway/quantile v0.0.0-20150917103942-b0c588724d25/go.mod h1:lbP8tGiBjZ5YWIc2fzuRpTaz0b/53vT6PEs3QuAWzuU= 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/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= @@ -1831,9 +2058,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.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 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFdE= github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= 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= github.com/texttheater/golang-levenshtein v0.0.0-20180516184445-d188e65d659e/go.mod h1:XDKHRm5ThF8YJjx001LtgelzsoaEcvnA7lVWz9EeX3g= github.com/tidwall/gjson v1.6.0/go.mod h1:P256ACg0Mn+j1RXIDXoss50DeIABTYK1PULOJHhxOls= @@ -1841,6 +2071,7 @@ github.com/tidwall/match v1.0.1/go.mod h1:LujAq0jyVjBy028G1WhWfIzbpQfMO8bBZ6Tyb0 github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tinylib/msgp v1.0.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= github.com/tinylib/msgp v1.1.0/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= +github.com/tj/go-spin v1.1.0 h1:lhdWZsvImxvZ3q1C5OIB7d72DuOwP4O2NdBg9PyzNds= 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= @@ -1850,31 +2081,43 @@ github.com/uber/jaeger-client-go v2.15.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMW github.com/uber/jaeger-client-go v2.23.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/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= +github.com/uber/jaeger-client-go v2.28.0+incompatible h1:G4QSBfvPKvg5ZM2j9MrJFdfI5iSljY/WnJqOGFao6HI= github.com/uber/jaeger-client-go v2.28.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/uber/jaeger-lib v1.5.1-0.20181102163054-1fc5c315e03c/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= github.com/uber/jaeger-lib v2.2.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= +github.com/uber/jaeger-lib v2.4.1+incompatible h1:td4jdvLcExb4cBISKIpHuGoVXh+dVKhn2Um6rjCsSsg= github.com/uber/jaeger-lib v2.4.1+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= 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 h1:JTTnM6wKzdA0Jqodd966MVj4vWbbquZykeX1sKbe2C4= github.com/urfave/cli/v2 v2.2.0/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= +github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= +github.com/valyala/fasttemplate v1.2.1 h1:TVEnxayobAdVkhQfrfes2IzOB6o+z4roRkPF52WA1u4= github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU= 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 h1:Q81c4u7hT+BR5kNfNQhEF0VT2pmL7+Kk0wD+ORYl7iA= github.com/warpfork/go-testmark v0.3.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= github.com/warpfork/go-wish v0.0.0-20200122115046-b9ea61034e4a/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= +github.com/weaveworks/common v0.0.0-20200512154658-384f10054ec5 h1:EYxr08r8x6r/5fLEAMMkida1BVgxVXE4LfZv/XV+znU= 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= github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11/go.mod h1:Wlo/SzPmxVp6vXpGt/zaXhHH0fn4IxgqZc82aKg6bpQ= github.com/whyrusleeping/cbor-gen v0.0.0-20191216205031-b047b6acb3c0/go.mod h1:xdlJQaiqipF0HW+Mzpg7XRM3fWbGvfgFlcppuvlkIvY= github.com/whyrusleeping/cbor-gen v0.0.0-20200123233031-1cdf64d27158/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= @@ -1890,19 +2133,26 @@ github.com/whyrusleeping/cbor-gen v0.0.0-20200826160007-0b9f6c5fb163/go.mod h1:f 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-20210713220151-be142a5ae1a8 h1:TEv7MId88TyIqIUL4hbf9otOookIolMxlEbN0ro671Y= github.com/whyrusleeping/cbor-gen v0.0.0-20210713220151-be142a5ae1a8/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/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= github.com/whyrusleeping/mdns v0.0.0-20180901202407-ef14215e6b30/go.mod h1:j4l84WPFclQPj320J9gp0XwNKBb3U0zt5CBqjPp22G4= github.com/whyrusleeping/mdns v0.0.0-20190826153040-b9b60ed33aa9/go.mod h1:j4l84WPFclQPj320J9gp0XwNKBb3U0zt5CBqjPp22G4= +github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 h1:E9S12nwJwEOXe2d6gT6qxdvqMnNq+VnSsKPgm2ZZNds= github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7/go.mod h1:X2c0RVCI1eSUFI8eLcY3c0423ykwiUdxLJtkDvruhjI= +github.com/whyrusleeping/pubsub v0.0.0-20190708150250-92bcb0691325 h1:++Zf4xQ7YrkE81gNHIjVqx5JZsn0nbMeHOkY1ILAIME= github.com/whyrusleeping/pubsub v0.0.0-20190708150250-92bcb0691325/go.mod h1:g7ckxrjiFh8mi1AY7ox23PZD0g6QU/TxW3U3unX7I3A= +github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee h1:lYbXeSvJi5zk5GLKVuid9TVjS9a0OmLIDKTfoZBL6Ow= github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee/go.mod h1:m2aV4LZI4Aez7dP5PMyVKEHhUyEJ/RjmPEDOpDvudHg= github.com/willf/bitset v1.1.3/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= github.com/willf/bitset v1.1.9/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= @@ -1910,10 +2160,13 @@ github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7V github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= github.com/xdg/stringprep v0.0.0-20180714160509-73f8eece6fdc/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xlab/c-for-go v0.0.0-20201112171043-ea6dce5809cb h1:/7/dQyiKnxAOj9L69FhST7uMe17U015XPzX7cy+5ykM= 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 h1:Sw125DKxZhPUI4JLlWugkzsrlB50jR9v2khiD9FxuSo= github.com/xlab/pkgconfig v0.0.0-20170226114623-cea12a0fd245/go.mod h1:C+diUUz7pxhNY6KAoLgrTYARGWnt82zWTylZlxT92vk= github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= 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/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -1922,15 +2175,21 @@ 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.0/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= github.com/zondax/ledger-go v0.12.1/go.mod h1:KatxXrVDzgWwbssUWsF5+cOJHXPvzQ09YSlzGNuhOEo= +go.dedis.ch/fixbuf v1.0.3 h1:hGcV9Cd/znUxlusJ64eAlExS+5cJDIyTyEG+otu5wQs= go.dedis.ch/fixbuf v1.0.3/go.mod h1:yzJMt34Wa5xD37V5RTdmp38cz3QhMagdGoem9anUalw= go.dedis.ch/kyber/v3 v3.0.4/go.mod h1:OzvaEnPvKlyrWyp3kGXlFdp7ap1VC6RkZDTaPikqhsQ= +go.dedis.ch/kyber/v3 v3.0.9 h1:i0ZbOQocHUjfFasBiUql5zVeC7u/vahFd96DFA8UOWk= go.dedis.ch/kyber/v3 v3.0.9/go.mod h1:rhNjUUg6ahf8HEg5HUvVBYoWY4boAafX8tYxX+PS+qg= go.dedis.ch/protobuf v1.0.5/go.mod h1:eIV4wicvi6JK0q/QnfIEGeSFNG0ZeB24kzut5+HaRLo= go.dedis.ch/protobuf v1.0.7/go.mod h1:pv5ysfkDX/EawiPqcW3ikOxsL5t+BqnV6xHSmE79KI4= +go.dedis.ch/protobuf v1.0.11 h1:FTYVIEzY/bfl37lu3pR4lIj+F9Vp1jE8oh91VmxKgLo= go.dedis.ch/protobuf v1.0.11/go.mod h1:97QR256dnkimeNdfmURz0wAMNVbd1VmLXhG1CrTYrJ4= 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= @@ -1952,9 +2211,11 @@ go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.6-0.20201102222123-380f4078db9f/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +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/bridge/opencensus v0.25.0/go.mod h1:dkZDdaNwLlIutxK2Kc2m3jwW2M1ISaNf8/rOYVwuVHs= go.opentelemetry.io/otel/exporters/jaeger v1.2.0/go.mod h1:KJLFbEMKTNPIfOxcg/WikIozEoKcPgJRz3Ce1vLlM8E= @@ -1963,11 +2224,13 @@ go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9deb go.opentelemetry.io/otel/metric v0.25.0/go.mod h1:E884FSpQfnJOMMUaq+05IWlJ4rjZpk2s/F1Ju+TEEm8= go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= +go.opentelemetry.io/otel/sdk v1.2.0 h1:wKN260u4DesJYhyjxDa7LRFkuhH7ncEVKU37LWcyNIo= go.opentelemetry.io/otel/sdk v1.2.0/go.mod h1:jNN8QtpvbsKhgaC6V5lHiejMoKD+V8uadoSafgHPx1U= go.opentelemetry.io/otel/sdk/export/metric v0.25.0/go.mod h1:Ej7NOa+WpN49EIcr1HMUYRvxXXCCnQCg2+ovdt2z8Pk= 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/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= @@ -1976,17 +2239,22 @@ 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/dig v1.10.0 h1:yLmDDj9/zuDjv3gz8GQGviXMs9TfysIUMUilCpgzUJY= go.uber.org/dig v1.10.0/go.mod h1:X34SnWGr8Fyla9zQNO2GSO2D+TIuqB14OS8JhYocIyw= +go.uber.org/fx v1.9.0 h1:7OAz8ucp35AU8eydejpYG7QrbE8rLKzGhHbZlJi5LYY= go.uber.org/fx v1.9.0/go.mod h1:mFdUyAUuJ3w4jAckiKSKbldsxy1ojpAMJ+dVZg5Y0Aw= go.uber.org/goleak v1.0.0/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= +go.uber.org/goleak v1.1.11-0.20210813005559-691160354723 h1:sHOAIxRGBp443oHZIPB+HsUGaksVCXVQENPxwTfQdH4= go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/multierr v1.7.0 h1:zaiO/rmgFjbmCXdSYJWQcdvOCsthmdaHfr3Gm2Kx4Ec= go.uber.org/multierr v1.7.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= @@ -1999,8 +2267,10 @@ 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 h1:ue41HOKd1vGURxrmeKIgELGb3jPW9DMUDGtsinblHwI= go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= 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= golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d/go.mod h1:OWs+y06UdEOHN4y+MfF/py+xQ/tYqIWW03b70/CG9Rw= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -2056,6 +2326,7 @@ golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5y 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-20211209193657-4570a0811e8b h1:QAqMVf3pSa6eeTsuklijukjXBlj7Es2QQplab+/RbQ4= golang.org/x/crypto v0.0.0-20211209193657-4570a0811e8b/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= @@ -2074,6 +2345,7 @@ 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/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= @@ -2089,6 +2361,7 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= @@ -2100,6 +2373,7 @@ golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.1.1-0.20191209134235-331c550502dd/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 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 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 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= @@ -2172,6 +2446,7 @@ golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/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-20211112202133-69e39bad7dc2 h1:CIJ76btIcR3eFI5EgSo6k1qKw9KJexJuRLI9G7Hp5wE= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= 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= @@ -2193,6 +2468,7 @@ 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/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180202135801-37707fdb30a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -2312,9 +2588,11 @@ golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/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-20211209171907-798191bca915 h1:P+8mCzuEpyszAT6T42q0sxU+eveBAF/cJ2Kp0x6/8+0= golang.org/x/sys v0.0.0-20211209171907-798191bca915/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 h1:MZ2shdL+ZM/XzY3ZGOnh4Nlpnxz5GSOhOmtHo3iPU6M= golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -2324,6 +2602,7 @@ golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -2414,10 +2693,12 @@ 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.7 h1:6j8CgantCy3yc8JGBqkDLMKWqZ0RDU2g1HVgacojGWQ= golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= 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 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/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.0.0-20181121035319-3f7ecaa7e8ca/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= @@ -2495,6 +2776,7 @@ google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6D 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= google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= @@ -2524,6 +2806,7 @@ google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTp 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 h1:AGJ0Ih4mHjSeibYkFGh1dD9KJ/eOtZ93I6hoHhukQ5Q= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= 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= @@ -2537,14 +2820,17 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= 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 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= 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= 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= +gopkg.in/cheggaaa/pb.v1 v1.0.28 h1:n1tBJnnK2r7g9OW2btFH91V92STTUevLXYFb8gy9EMk= gopkg.in/cheggaaa/pb.v1 v1.0.28/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= @@ -2554,6 +2840,7 @@ 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/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= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= @@ -2565,9 +2852,12 @@ gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +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 h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/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= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -2579,6 +2869,7 @@ honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= +howett.net/plist v0.0.0-20181124034731-591f970eefbb h1:jhnBjNi9UFpfpl8YZhA9CrOqpnJdvzuiHsl/dnxl11M= howett.net/plist v0.0.0-20181124034731-591f970eefbb/go.mod h1:vMygbs4qMhSZSc4lCUl2OEE+rDiIIJAIdR4m7MiMcm0= k8s.io/api v0.17.5/go.mod h1:0zV5/ungglgy2Rlm3QK8fbxkXVs+BSJWpJP/+8gUVLY= k8s.io/apimachinery v0.17.5/go.mod h1:ioIo1G/a+uONV7Tv+ZmCbMG1/a3kVw5YcDdncd8ugQ0= @@ -2592,15 +2883,21 @@ k8s.io/kube-openapi v0.0.0-20200316234421-82d701f24f9d/go.mod h1:F+5wygcW0wmRTnM k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= k8s.io/utils v0.0.0-20200414100711-2df71ebbae66/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= 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 h1:nPibNuDEx6tvYrUAtvDTTw98rx5juGsa5zuDnKwEEQQ= 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 h1:EYKY1a3wStt0RzHaH8mdSRNg78Ub0OHxYfCRWw35YtM= 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 h1:FeylZSVX8S+58VsyJlkEj2bcpdytmp9MmDKZkKx8OIE= modernc.org/mathutil v1.1.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/strutil v1.1.0 h1:+1/yCzZxY2pZwwrsbH+4T7BQMoLQ9QiBshRC9eicYsc= modernc.org/strutil v1.1.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs= +modernc.org/xc v1.0.0 h1:7ccXrupWZIS3twbUGrtKmHS2DXY6xegFua+6O3xgAFU= modernc.org/xc v1.0.0/go.mod h1:mRNCo0bvLjGhHO9WsyuKVU4q0ceiDDDoEeWDJHrNx8I= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= From 8729ee4fa2785d39ec21673cb4c6e5e2ae5711a2 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Tue, 11 Jan 2022 17:37:06 -0500 Subject: [PATCH 189/393] add butterfly ohsnap epoch --- build/params_butterfly.go | 3 ++- go.sum | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/build/params_butterfly.go b/build/params_butterfly.go index 0a8ba8898c7..17e40af4ef9 100644 --- a/build/params_butterfly.go +++ b/build/params_butterfly.go @@ -41,8 +41,9 @@ const UpgradeNorwegianHeight = -14 const UpgradeTurboHeight = -15 const UpgradeHyperdriveHeight = -16 const UpgradeChocolateHeight = -17 + // 2022-01-13T19:00:00Z -const UpgradeSnapDealsHeight = 18742 +const UpgradeOhSnapHeight = 18742 func init() { policy.SetConsensusMinerMinPower(abi.NewStoragePower(2 << 30)) diff --git a/go.sum b/go.sum index 36302c0d7bd..2ededd70093 100644 --- a/go.sum +++ b/go.sum @@ -368,6 +368,7 @@ github.com/filecoin-project/specs-actors/v3 v3.1.1/go.mod h1:mpynccOLlIRy0QnR008 github.com/filecoin-project/specs-actors/v4 v4.0.0/go.mod h1:TkHXf/l7Wyw4ZejyXIPS2rK8bBO0rdwhTZyQQgaglng= github.com/filecoin-project/specs-actors/v4 v4.0.1 h1:AiWrtvJZ63MHGe6rn7tPu4nSUY8bA1KDNszqJaD5+Fg= github.com/filecoin-project/specs-actors/v4 v4.0.1/go.mod h1:TkHXf/l7Wyw4ZejyXIPS2rK8bBO0rdwhTZyQQgaglng= +github.com/filecoin-project/specs-actors/v5 v5.0.0-20210512015452-4fe3889fff57/go.mod h1:283yBMMUSDB2abcjP/hhrwTkhb9h3sfM6KGrep/ZlBI= github.com/filecoin-project/specs-actors/v5 v5.0.4 h1:OY7BdxJWlUfUFXWV/kpNBYGXNPasDIedf42T3sGx08s= github.com/filecoin-project/specs-actors/v5 v5.0.4/go.mod h1:5BAKRAMsOOlD8+qCw4UvT/lTLInCJ3JwOWZbX8Ipwq4= github.com/filecoin-project/specs-actors/v6 v6.0.0/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= From cd8d3a0c88ade39ca20efcf84a9af3bcbbc090a2 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Tue, 11 Jan 2022 17:41:20 -0500 Subject: [PATCH 190/393] Update the ntwk v15 name to OhSnap --- build/params_2k.go | 2 +- build/params_calibnet.go | 2 +- build/params_interop.go | 2 +- build/params_mainnet.go | 4 ++-- build/params_testground.go | 2 +- chain/consensus/filcns/upgrades.go | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/build/params_2k.go b/build/params_2k.go index 6c0918c513e..0c31ce5ce81 100644 --- a/build/params_2k.go +++ b/build/params_2k.go @@ -47,7 +47,7 @@ var UpgradeHyperdriveHeight = abi.ChainEpoch(-16) var UpgradeChocolateHeight = abi.ChainEpoch(-17) -var UpgradeSnapDealsHeight = abi.ChainEpoch(-18) +var UpgradeOhSnapHeight = abi.ChainEpoch(-18) var DrandSchedule = map[abi.ChainEpoch]DrandEnum{ 0: DrandMainnet, diff --git a/build/params_calibnet.go b/build/params_calibnet.go index 16d77c7e6fa..4da2269ee52 100644 --- a/build/params_calibnet.go +++ b/build/params_calibnet.go @@ -54,7 +54,7 @@ const UpgradeHyperdriveHeight = 420 const UpgradeChocolateHeight = 312746 -const UpgradeSnapDealsHeight = 99999999 +const UpgradeOhSnapHeight = 99999999 func init() { policy.SetConsensusMinerMinPower(abi.NewStoragePower(32 << 30)) diff --git a/build/params_interop.go b/build/params_interop.go index 66033937cc3..a483e7188d5 100644 --- a/build/params_interop.go +++ b/build/params_interop.go @@ -47,7 +47,7 @@ var UpgradeTurboHeight = abi.ChainEpoch(-15) var UpgradeHyperdriveHeight = abi.ChainEpoch(-16) var UpgradeChocolateHeight = abi.ChainEpoch(-17) -var UpgradeSnapDealsHeight = abi.ChainEpoch(-18) +var UpgradeOhSnapHeight = abi.ChainEpoch(-18) var DrandSchedule = map[abi.ChainEpoch]DrandEnum{ 0: DrandMainnet, diff --git a/build/params_mainnet.go b/build/params_mainnet.go index a4781f1ff1d..6efc6d62ff4 100644 --- a/build/params_mainnet.go +++ b/build/params_mainnet.go @@ -67,7 +67,7 @@ const UpgradeHyperdriveHeight = 892800 // 2021-10-26T13:30:00Z const UpgradeChocolateHeight = 1231620 -var UpgradeSnapDealsHeight = abi.ChainEpoch(999999999999) +var UpgradeOhSnapHeight = abi.ChainEpoch(999999999999) func init() { if os.Getenv("LOTUS_USE_TEST_ADDRESSES") != "1" { @@ -75,7 +75,7 @@ func init() { } if os.Getenv("LOTUS_DISABLE_SNAPDEALS") == "1" { - UpgradeSnapDealsHeight = math.MaxInt64 + UpgradeOhSnapHeight = math.MaxInt64 } Devnet = false diff --git a/build/params_testground.go b/build/params_testground.go index 539e06b4541..e139b69217f 100644 --- a/build/params_testground.go +++ b/build/params_testground.go @@ -99,7 +99,7 @@ var ( UpgradeTurboHeight abi.ChainEpoch = -14 UpgradeHyperdriveHeight abi.ChainEpoch = -15 UpgradeChocolateHeight abi.ChainEpoch = -16 - UpgradeSnapDealsHeight abi.ChainEpoch = -17 + UpgradeOhSnapHeight abi.ChainEpoch = -17 DrandSchedule = map[abi.ChainEpoch]DrandEnum{ 0: DrandMainnet, diff --git a/chain/consensus/filcns/upgrades.go b/chain/consensus/filcns/upgrades.go index 863193180cc..2335a1d4be7 100644 --- a/chain/consensus/filcns/upgrades.go +++ b/chain/consensus/filcns/upgrades.go @@ -158,7 +158,7 @@ func DefaultUpgradeSchedule() stmgr.UpgradeSchedule { }}, Expensive: true, }, { - Height: build.UpgradeSnapDealsHeight, + Height: build.UpgradeOhSnapHeight, Network: network.Version15, Migration: UpgradeActorsV7, PreMigrations: []stmgr.PreMigration{{ From f1425dcb26d5670cea16c8fc1d6b40e183a9e5d7 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Tue, 11 Jan 2022 17:43:03 -0500 Subject: [PATCH 191/393] go mod tidy --- go.sum | 1 - 1 file changed, 1 deletion(-) diff --git a/go.sum b/go.sum index 2ededd70093..36302c0d7bd 100644 --- a/go.sum +++ b/go.sum @@ -368,7 +368,6 @@ github.com/filecoin-project/specs-actors/v3 v3.1.1/go.mod h1:mpynccOLlIRy0QnR008 github.com/filecoin-project/specs-actors/v4 v4.0.0/go.mod h1:TkHXf/l7Wyw4ZejyXIPS2rK8bBO0rdwhTZyQQgaglng= github.com/filecoin-project/specs-actors/v4 v4.0.1 h1:AiWrtvJZ63MHGe6rn7tPu4nSUY8bA1KDNszqJaD5+Fg= github.com/filecoin-project/specs-actors/v4 v4.0.1/go.mod h1:TkHXf/l7Wyw4ZejyXIPS2rK8bBO0rdwhTZyQQgaglng= -github.com/filecoin-project/specs-actors/v5 v5.0.0-20210512015452-4fe3889fff57/go.mod h1:283yBMMUSDB2abcjP/hhrwTkhb9h3sfM6KGrep/ZlBI= github.com/filecoin-project/specs-actors/v5 v5.0.4 h1:OY7BdxJWlUfUFXWV/kpNBYGXNPasDIedf42T3sGx08s= github.com/filecoin-project/specs-actors/v5 v5.0.4/go.mod h1:5BAKRAMsOOlD8+qCw4UvT/lTLInCJ3JwOWZbX8Ipwq4= github.com/filecoin-project/specs-actors/v6 v6.0.0/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= From 4cdd830003a0e5e483ff56d3c7e7f0d1abf3a3c1 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Tue, 11 Jan 2022 17:46:49 -0500 Subject: [PATCH 192/393] update network version for test ground --- build/params_testground.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build/params_testground.go b/build/params_testground.go index e139b69217f..41c46d41edf 100644 --- a/build/params_testground.go +++ b/build/params_testground.go @@ -107,8 +107,8 @@ var ( GenesisNetworkVersion = network.Version0 - NewestNetworkVersion = network.Version14 - ActorUpgradeNetworkVersion = network.Version4 + NewestNetworkVersion = network.Version15 + ActorUpgradeNetworkVersion = network.Version15 Devnet = true ZeroAddress = MustParseAddress("f3yaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaby2smx7a") From 5ff6148444f512a610a37423513312138af93633 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 11 Jan 2022 17:44:45 -0500 Subject: [PATCH 193/393] implement stubs --- blockstore/autobatch.go | 119 +++++++++++++++++++---------- chain/consensus/filcns/upgrades.go | 9 +-- 2 files changed, 81 insertions(+), 47 deletions(-) diff --git a/blockstore/autobatch.go b/blockstore/autobatch.go index 5d78e92a196..ed52f39cd9e 100644 --- a/blockstore/autobatch.go +++ b/blockstore/autobatch.go @@ -4,6 +4,8 @@ import ( "context" "sync" + "golang.org/x/xerrors" + block "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" ) @@ -22,38 +24,6 @@ type AutobatchBlockstore struct { bufferSize int } -func (bs *AutobatchBlockstore) DeleteBlock(context.Context, cid.Cid) error { - panic("implement me") -} - -func (bs *AutobatchBlockstore) Has(ctx context.Context, c cid.Cid) (bool, error) { - panic("implement me") -} - -func (bs *AutobatchBlockstore) GetSize(context.Context, cid.Cid) (int, error) { - panic("implement me") -} - -func (bs *AutobatchBlockstore) PutMany(context.Context, []block.Block) error { - panic("implement me") -} - -func (bs *AutobatchBlockstore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) { - panic("implement me") -} - -func (bs *AutobatchBlockstore) HashOnRead(enabled bool) { - panic("implement me") -} - -func (bs *AutobatchBlockstore) View(ctx context.Context, cid cid.Cid, callback func([]byte) error) error { - panic("implement me") -} - -func (bs *AutobatchBlockstore) DeleteMany(ctx context.Context, cids []cid.Cid) error { - panic("implement me") -} - func NewAutobatch(ctx context.Context, backingBs Blockstore, bufferCapacity int) *AutobatchBlockstore { bs := &AutobatchBlockstore{ backingBs: backingBs, @@ -64,12 +34,6 @@ func NewAutobatch(ctx context.Context, backingBs Blockstore, bufferCapacity int) return bs } -// May NOT `Get` blocks that have been `Put` into this store -// Only guaranteed to fetch those that were already in the backingBs at creation of this store and those at the most recent `Flush` -func (bs *AutobatchBlockstore) Get(ctx context.Context, c cid.Cid) (block.Block, error) { - return bs.backingBs.Get(ctx, c) -} - func (bs *AutobatchBlockstore) Put(ctx context.Context, blk block.Block) error { bs.bufferedBlksLk.Lock() _, ok := bs.addedCids[blk.Cid()] @@ -90,9 +54,84 @@ func (bs *AutobatchBlockstore) Flush(ctx context.Context) { bs.flushLk.Lock() defer bs.flushLk.Unlock() bs.bufferedBlksLk.Lock() + // We do NOT clear addedCids here, because its purpose is to expedite Puts toFlush := bs.bufferedBlks bs.bufferedBlks = []block.Block{} bs.bufferedBlksLk.Unlock() - // error????? - bs.backingBs.PutMany(ctx, toFlush) + err := bs.backingBs.PutMany(ctx, toFlush) + autolog.Errorf("FLUSH ERRORED, maybe async: %w", err) +} + +// May be very slow if the cid queried wasn't in the backingBs at the time of creation of this AutobatchBlockstore +func (bs *AutobatchBlockstore) Get(ctx context.Context, c cid.Cid) (block.Block, error) { + blk, err := bs.backingBs.Get(ctx, c) + if err == nil { + return blk, nil + } + + if err != ErrNotFound { + return blk, err + } + + bs.Flush(ctx) + return bs.backingBs.Get(ctx, c) +} + +func (bs *AutobatchBlockstore) DeleteBlock(context.Context, cid.Cid) error { + // if we wanted to support this, we would have to: + // - flush + // - delete from the backingBs (if present) + // - remove from addedCids (if present) + // - if present in addedCids, also walk bufferedBlks and remove if present + return xerrors.New("deletion is unsupported") +} + +func (bs *AutobatchBlockstore) DeleteMany(ctx context.Context, cids []cid.Cid) error { + // see note in DeleteBlock() + return xerrors.New("deletion is unsupported") +} + +func (bs *AutobatchBlockstore) Has(ctx context.Context, c cid.Cid) (bool, error) { + _, err := bs.Get(ctx, c) + if err == nil { + return true, nil + } + if err == ErrNotFound { + return false, nil + } + + return false, err +} + +func (bs *AutobatchBlockstore) GetSize(ctx context.Context, c cid.Cid) (int, error) { + blk, err := bs.Get(ctx, c) + if err != nil { + return 0, err + } + + return len(blk.RawData()), nil +} + +func (bs *AutobatchBlockstore) PutMany(ctx context.Context, blks []block.Block) error { + for _, blk := range blks { + if err := bs.Put(ctx, blk); err != nil { + return err + } + } + + return nil +} + +func (bs *AutobatchBlockstore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) { + bs.Flush(ctx) + return bs.backingBs.AllKeysChan(ctx) +} + +func (bs *AutobatchBlockstore) HashOnRead(enabled bool) { + bs.backingBs.HashOnRead(enabled) +} + +func (bs *AutobatchBlockstore) View(ctx context.Context, cid cid.Cid, callback func([]byte) error) error { + bs.Flush(ctx) + return bs.backingBs.View(ctx, cid, callback) } diff --git a/chain/consensus/filcns/upgrades.go b/chain/consensus/filcns/upgrades.go index 548f59aac0f..c7b407a6d58 100644 --- a/chain/consensus/filcns/upgrades.go +++ b/chain/consensus/filcns/upgrades.go @@ -1264,11 +1264,7 @@ func upgradeActorsV7Common( root cid.Cid, epoch abi.ChainEpoch, ts *types.TipSet, config nv15.Config, ) (cid.Cid, error) { - - ctxWithCancel, cancel := context.WithCancel(ctx) - defer cancel() - - writeStore := blockstore.NewAutobatch(ctxWithCancel, sm.ChainStore().StateBlockstore(), units.GiB) + writeStore := blockstore.NewAutobatch(ctx, sm.ChainStore().StateBlockstore(), units.GiB) // TODO: pretty sure we'd achieve nothing by doing this, confirm in review //buf := blockstore.NewTieredBstore(sm.ChainStore().StateBlockstore(), writeStore) store := store.ActorStore(ctx, writeStore) @@ -1301,8 +1297,7 @@ func upgradeActorsV7Common( return cid.Undef, xerrors.Errorf("failed to persist new state root: %w", err) } - // Persist the new tree. - + // Persist the new tree. Blocks until the entire writeStore is in the state blockstore. writeStore.Flush(ctx) return newRoot, nil From 37a3e610b74be2e61b06821837aca5dc7fe67abb Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Mon, 3 Jan 2022 19:58:52 -0500 Subject: [PATCH 194/393] Add more deal expiration handling for snap deals --- extern/storage-sealing/checks.go | 19 +++++++++- .../storage-sealing/states_replica_update.go | 38 ++++++++++++------- 2 files changed, 43 insertions(+), 14 deletions(-) diff --git a/extern/storage-sealing/checks.go b/extern/storage-sealing/checks.go index 42425e78243..73511e0570a 100644 --- a/extern/storage-sealing/checks.go +++ b/extern/storage-sealing/checks.go @@ -3,7 +3,6 @@ package sealing import ( "bytes" "context" - "github.com/filecoin-project/lotus/chain/actors/policy" proof2 "github.com/filecoin-project/specs-actors/v2/actors/runtime/proof" @@ -80,6 +79,24 @@ func checkPieces(ctx context.Context, maddr address.Address, si SectorInfo, api return nil } +func checkDealExpiration(ctx context.Context, sector SectorInfo, api SealingAPI) error { + tok, height, err := api.ChainHead(ctx) + if err != nil { + return &ErrApi{xerrors.Errorf("getting chain head: %w", err)} + } + + for i, p := range sector.Pieces { + proposal, err := api.StateMarketStorageDealProposal(ctx, p.DealInfo.DealID, tok) + if err != nil { + return &ErrInvalidDeals{xerrors.Errorf("getting deal %d for piece %d: %w", p.DealInfo.DealID, i, err)} + } + if height >= 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(sector.Pieces), sector.SectorNumber, p.DealInfo.DealID, proposal.StartEpoch, height)} + } + } + return nil +} + // checkPrecommit checks that data commitment generated in the sealing process // matches pieces, and that the seal ticket isn't expired func checkPrecommit(ctx context.Context, maddr address.Address, si SectorInfo, tok TipSetToken, height abi.ChainEpoch, api SealingAPI) (err error) { diff --git a/extern/storage-sealing/states_replica_update.go b/extern/storage-sealing/states_replica_update.go index 28c5ede0b9e..7c237add571 100644 --- a/extern/storage-sealing/states_replica_update.go +++ b/extern/storage-sealing/states_replica_update.go @@ -2,7 +2,6 @@ package sealing import ( "bytes" - "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-state-types/exitcode" statemachine "github.com/filecoin-project/go-statemachine" @@ -13,18 +12,7 @@ import ( func (m *Sealing) handleReplicaUpdate(ctx statemachine.Context, sector SectorInfo) error { if err := checkPieces(ctx.Context(), m.maddr, sector, m.Api); err != nil { // Sanity check state - switch err.(type) { - case *ErrApi: - log.Errorf("handleReplicaUpdate: api error, not proceeding: %+v", err) - return nil - case *ErrInvalidDeals: - log.Warnf("invalid deals in sector %d: %v", sector.SectorNumber, err) - return ctx.Send(SectorInvalidDealIDs{}) - 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 handleErrors(ctx, err, sector) } out, err := m.sealer.ReplicaUpdate(sector.sealingCtx(ctx.Context()), m.minerSector(sector.SectorType, sector.SectorNumber), sector.pieceInfos()) if err != nil { @@ -42,6 +30,11 @@ func (m *Sealing) handleProveReplicaUpdate(ctx statemachine.Context, sector Sect if sector.CommR == nil { return xerrors.Errorf("invalid sector %d with nil CommR", sector.SectorNumber) } + + if err := checkDealExpiration(ctx.Context(), sector, m.Api); err != nil { // Sanity check state + return handleErrors(ctx, err, sector) + } + vanillaProofs, err := m.sealer.ProveReplicaUpdate1(sector.sealingCtx(ctx.Context()), m.minerSector(sector.SectorType, sector.SectorNumber), *sector.CommR, *sector.UpdateSealed, *sector.UpdateUnsealed) if err != nil { return ctx.Send(SectorProveReplicaUpdateFailed{xerrors.Errorf("prove replica update (1) failed: %w", err)}) @@ -65,6 +58,10 @@ func (m *Sealing) handleSubmitReplicaUpdate(ctx statemachine.Context, sector Sec return nil } + if err := checkDealExpiration(ctx.Context(), sector, m.Api); err != nil { // Sanity check state + return handleErrors(ctx, err, sector) + } + if err := checkReplicaUpdate(ctx.Context(), m.maddr, sector, tok, m.Api); err != nil { return ctx.Send(SectorSubmitReplicaUpdateFailed{}) } @@ -207,3 +204,18 @@ func (m *Sealing) handleReplicaUpdateWait(ctx statemachine.Context, sector Secto func (m *Sealing) handleFinalizeReplicaUpdate(ctx statemachine.Context, sector SectorInfo) error { return ctx.Send(SectorFinalized{}) } + +func handleErrors(ctx statemachine.Context, err error, sector SectorInfo) error { + switch err.(type) { + case *ErrApi: + log.Errorf("handleReplicaUpdate: api error, not proceeding: %+v", err) + return nil + case *ErrInvalidDeals: + log.Warnf("invalid deals in sector %d: %v", sector.SectorNumber, err) + return ctx.Send(SectorInvalidDealIDs{}) + 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) + } +} From 6b953a03d0127942def2c5f45fdd448ce23156fe Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Mon, 3 Jan 2022 20:45:48 -0500 Subject: [PATCH 195/393] just use checkPiece --- extern/storage-sealing/checks.go | 18 ------------------ .../storage-sealing/states_replica_update.go | 4 ++-- 2 files changed, 2 insertions(+), 20 deletions(-) diff --git a/extern/storage-sealing/checks.go b/extern/storage-sealing/checks.go index 73511e0570a..392f2905e00 100644 --- a/extern/storage-sealing/checks.go +++ b/extern/storage-sealing/checks.go @@ -79,24 +79,6 @@ func checkPieces(ctx context.Context, maddr address.Address, si SectorInfo, api return nil } -func checkDealExpiration(ctx context.Context, sector SectorInfo, api SealingAPI) error { - tok, height, err := api.ChainHead(ctx) - if err != nil { - return &ErrApi{xerrors.Errorf("getting chain head: %w", err)} - } - - for i, p := range sector.Pieces { - proposal, err := api.StateMarketStorageDealProposal(ctx, p.DealInfo.DealID, tok) - if err != nil { - return &ErrInvalidDeals{xerrors.Errorf("getting deal %d for piece %d: %w", p.DealInfo.DealID, i, err)} - } - if height >= 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(sector.Pieces), sector.SectorNumber, p.DealInfo.DealID, proposal.StartEpoch, height)} - } - } - return nil -} - // checkPrecommit checks that data commitment generated in the sealing process // matches pieces, and that the seal ticket isn't expired func checkPrecommit(ctx context.Context, maddr address.Address, si SectorInfo, tok TipSetToken, height abi.ChainEpoch, api SealingAPI) (err error) { diff --git a/extern/storage-sealing/states_replica_update.go b/extern/storage-sealing/states_replica_update.go index 7c237add571..b2121ef724e 100644 --- a/extern/storage-sealing/states_replica_update.go +++ b/extern/storage-sealing/states_replica_update.go @@ -31,7 +31,7 @@ func (m *Sealing) handleProveReplicaUpdate(ctx statemachine.Context, sector Sect return xerrors.Errorf("invalid sector %d with nil CommR", sector.SectorNumber) } - if err := checkDealExpiration(ctx.Context(), sector, m.Api); err != nil { // Sanity check state + if err := checkPieces(ctx.Context(), m.maddr, sector, m.Api); err != nil { // Sanity check state return handleErrors(ctx, err, sector) } @@ -58,7 +58,7 @@ func (m *Sealing) handleSubmitReplicaUpdate(ctx statemachine.Context, sector Sec return nil } - if err := checkDealExpiration(ctx.Context(), sector, m.Api); err != nil { // Sanity check state + if err := checkPieces(ctx.Context(), m.maddr, sector, m.Api); err != nil { // Sanity check state return handleErrors(ctx, err, sector) } From e99b98873c4d196ef41e5e4d699b5a8f98232a84 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Mon, 3 Jan 2022 21:29:48 -0500 Subject: [PATCH 196/393] Check piece before PRU2 instead of PRU1 as PRU2 is the heavy computation part --- extern/storage-sealing/states_replica_update.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/extern/storage-sealing/states_replica_update.go b/extern/storage-sealing/states_replica_update.go index b2121ef724e..caf50fb7e6e 100644 --- a/extern/storage-sealing/states_replica_update.go +++ b/extern/storage-sealing/states_replica_update.go @@ -31,15 +31,15 @@ func (m *Sealing) handleProveReplicaUpdate(ctx statemachine.Context, sector Sect return xerrors.Errorf("invalid sector %d with nil CommR", sector.SectorNumber) } - if err := checkPieces(ctx.Context(), m.maddr, sector, m.Api); err != nil { // Sanity check state - return handleErrors(ctx, err, sector) - } - vanillaProofs, err := m.sealer.ProveReplicaUpdate1(sector.sealingCtx(ctx.Context()), m.minerSector(sector.SectorType, sector.SectorNumber), *sector.CommR, *sector.UpdateSealed, *sector.UpdateUnsealed) if err != nil { return ctx.Send(SectorProveReplicaUpdateFailed{xerrors.Errorf("prove replica update (1) failed: %w", err)}) } + if err := checkPieces(ctx.Context(), m.maddr, sector, m.Api); err != nil { // Sanity check state + return handleErrors(ctx, err, sector) + } + proof, err := m.sealer.ProveReplicaUpdate2(sector.sealingCtx(ctx.Context()), m.minerSector(sector.SectorType, sector.SectorNumber), *sector.CommR, *sector.UpdateSealed, *sector.UpdateUnsealed, vanillaProofs) if err != nil { return ctx.Send(SectorProveReplicaUpdateFailed{xerrors.Errorf("prove replica update (2) failed: %w", err)}) From fd50cd128abd012005c786efac92d764e6b8bef5 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Tue, 4 Jan 2022 02:27:14 -0500 Subject: [PATCH 197/393] fix lint --- extern/storage-sealing/checks.go | 1 + 1 file changed, 1 insertion(+) diff --git a/extern/storage-sealing/checks.go b/extern/storage-sealing/checks.go index 392f2905e00..42425e78243 100644 --- a/extern/storage-sealing/checks.go +++ b/extern/storage-sealing/checks.go @@ -3,6 +3,7 @@ package sealing import ( "bytes" "context" + "github.com/filecoin-project/lotus/chain/actors/policy" proof2 "github.com/filecoin-project/specs-actors/v2/actors/runtime/proof" From a41b4acec36da17687955b10f8cbca41a2b2160c Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 11 Jan 2022 19:44:56 -0500 Subject: [PATCH 198/393] Use channels to trigger flushes in a dedicated goroutine --- blockstore/autobatch.go | 52 +++++++++++++++++++++++++----- chain/consensus/filcns/upgrades.go | 8 ++++- 2 files changed, 51 insertions(+), 9 deletions(-) diff --git a/blockstore/autobatch.go b/blockstore/autobatch.go index ed52f39cd9e..5f64979a2fd 100644 --- a/blockstore/autobatch.go +++ b/blockstore/autobatch.go @@ -18,7 +18,10 @@ type AutobatchBlockstore struct { bufferedBlks []block.Block addedCids map[cid.Cid]struct{} bufferedBlksLk sync.Mutex - flushLk sync.Mutex + flushCh chan struct{} + flushErr error + shutdownCh chan struct{} + flushCtx context.Context backingBs Blockstore bufferCapacity int bufferSize int @@ -29,8 +32,11 @@ func NewAutobatch(ctx context.Context, backingBs Blockstore, bufferCapacity int) backingBs: backingBs, bufferCapacity: bufferCapacity, addedCids: make(map[cid.Cid]struct{}), + flushCtx: ctx, } + go bs.flushWorker() + return bs } @@ -42,24 +48,54 @@ func (bs *AutobatchBlockstore) Put(ctx context.Context, blk block.Block) error { bs.addedCids[blk.Cid()] = struct{}{} bs.bufferSize += len(blk.RawData()) if bs.bufferSize >= bs.bufferCapacity { - // time to flush - go bs.Flush(ctx) + // signal that a flush is appropriate, may be ignored + select { + case bs.flushCh <- struct{}{}: + default: + // do nothing + } } } bs.bufferedBlksLk.Unlock() return nil } -func (bs *AutobatchBlockstore) Flush(ctx context.Context) { - bs.flushLk.Lock() - defer bs.flushLk.Unlock() +func (bs *AutobatchBlockstore) flushWorker() { + for { + select { + case <-bs.flushCh: + putErr := bs.doFlush(bs.flushCtx) + if putErr != nil { + autolog.Errorf("FLUSH ERRORED: %w", putErr) + bs.flushErr = xerrors.Errorf("%w, put error: %w", bs.flushErr, putErr) + } + case <-bs.shutdownCh: + return + } + } +} + +func (bs *AutobatchBlockstore) doFlush(ctx context.Context) error { bs.bufferedBlksLk.Lock() // We do NOT clear addedCids here, because its purpose is to expedite Puts toFlush := bs.bufferedBlks bs.bufferedBlks = []block.Block{} bs.bufferedBlksLk.Unlock() - err := bs.backingBs.PutMany(ctx, toFlush) - autolog.Errorf("FLUSH ERRORED, maybe async: %w", err) + return bs.backingBs.PutMany(ctx, toFlush) +} + +func (bs *AutobatchBlockstore) Flush(ctx context.Context) error { + return bs.doFlush(ctx) +} + +func (bs *AutobatchBlockstore) Shutdown(ctx context.Context) error { + bs.shutdownCh <- struct{}{} + if bs.flushErr != nil { + return xerrors.Errorf("flushWorker errored: %w", bs.flushErr) + } + + // one last flush in case it's needed + return bs.doFlush(ctx) } // May be very slow if the cid queried wasn't in the backingBs at the time of creation of this AutobatchBlockstore diff --git a/chain/consensus/filcns/upgrades.go b/chain/consensus/filcns/upgrades.go index c7b407a6d58..72b1605fa3e 100644 --- a/chain/consensus/filcns/upgrades.go +++ b/chain/consensus/filcns/upgrades.go @@ -1298,7 +1298,13 @@ func upgradeActorsV7Common( } // Persist the new tree. Blocks until the entire writeStore is in the state blockstore. - writeStore.Flush(ctx) + if err := writeStore.Flush(ctx); err != nil { + return cid.Undef, xerrors.Errorf("failed to flush writestore: %w", err) + } + + if err := writeStore.Shutdown(ctx); err != nil { + return cid.Undef, xerrors.Errorf("writeStore failed: %w", err) + } return newRoot, nil } From 7559e4311ea0c308e614798791263df0e0683a34 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 11 Jan 2022 20:29:26 -0500 Subject: [PATCH 199/393] Support faster Get, retry flushes on error --- blockstore/autobatch.go | 113 +++++++++++++++++++---------- chain/consensus/filcns/upgrades.go | 6 +- 2 files changed, 75 insertions(+), 44 deletions(-) diff --git a/blockstore/autobatch.go b/blockstore/autobatch.go index 5f64979a2fd..e7694f9311c 100644 --- a/blockstore/autobatch.go +++ b/blockstore/autobatch.go @@ -3,6 +3,7 @@ package blockstore import ( "context" "sync" + "time" "golang.org/x/xerrors" @@ -15,24 +16,39 @@ import ( var autolog = log.Named("auto") type AutobatchBlockstore struct { - bufferedBlks []block.Block - addedCids map[cid.Cid]struct{} - bufferedBlksLk sync.Mutex - flushCh chan struct{} - flushErr error - shutdownCh chan struct{} - flushCtx context.Context - backingBs Blockstore + // TODO: drop if memory consumption is too high + addedCids map[cid.Cid]struct{} + + bufferedLk sync.Mutex + bufferedBlksOrdered []block.Block + bufferedBlksMap map[cid.Cid]block.Block + + flushingLk sync.Mutex + flushingBlksMap map[cid.Cid]block.Block + + flushCh chan struct{} + flushErr error + flushRetryDelay time.Duration + flushCtx context.Context + shutdownCh chan struct{} + + backingBs Blockstore + bufferCapacity int bufferSize int } func NewAutobatch(ctx context.Context, backingBs Blockstore, bufferCapacity int) *AutobatchBlockstore { bs := &AutobatchBlockstore{ - backingBs: backingBs, - bufferCapacity: bufferCapacity, - addedCids: make(map[cid.Cid]struct{}), - flushCtx: ctx, + addedCids: make(map[cid.Cid]struct{}), + backingBs: backingBs, + bufferCapacity: bufferCapacity, + bufferedBlksMap: make(map[cid.Cid]block.Block), + flushingBlksMap: make(map[cid.Cid]block.Block), + flushCtx: ctx, + flushCh: make(chan struct{}, 1), + // could be made configable + flushRetryDelay: time.Second * 5, } go bs.flushWorker() @@ -41,11 +57,12 @@ func NewAutobatch(ctx context.Context, backingBs Blockstore, bufferCapacity int) } func (bs *AutobatchBlockstore) Put(ctx context.Context, blk block.Block) error { - bs.bufferedBlksLk.Lock() + bs.bufferedLk.Lock() _, ok := bs.addedCids[blk.Cid()] if !ok { - bs.bufferedBlks = append(bs.bufferedBlks, blk) bs.addedCids[blk.Cid()] = struct{}{} + bs.bufferedBlksOrdered = append(bs.bufferedBlksOrdered, blk) + bs.bufferedBlksMap[blk.Cid()] = blk bs.bufferSize += len(blk.RawData()) if bs.bufferSize >= bs.bufferCapacity { // signal that a flush is appropriate, may be ignored @@ -56,7 +73,7 @@ func (bs *AutobatchBlockstore) Put(ctx context.Context, blk block.Block) error { } } } - bs.bufferedBlksLk.Unlock() + bs.bufferedLk.Unlock() return nil } @@ -65,9 +82,16 @@ func (bs *AutobatchBlockstore) flushWorker() { select { case <-bs.flushCh: putErr := bs.doFlush(bs.flushCtx) - if putErr != nil { - autolog.Errorf("FLUSH ERRORED: %w", putErr) - bs.flushErr = xerrors.Errorf("%w, put error: %w", bs.flushErr, putErr) + for putErr != nil { + select { + case <-bs.shutdownCh: + bs.flushErr = putErr + return + default: + autolog.Errorf("FLUSH ERRORED: %w, retrying in %v", putErr, bs.flushRetryDelay) + time.Sleep(bs.flushRetryDelay) + putErr = bs.doFlush(bs.flushCtx) + } } case <-bs.shutdownCh: return @@ -76,20 +100,24 @@ func (bs *AutobatchBlockstore) flushWorker() { } func (bs *AutobatchBlockstore) doFlush(ctx context.Context) error { - bs.bufferedBlksLk.Lock() + bs.bufferedLk.Lock() + bs.flushingLk.Lock() // We do NOT clear addedCids here, because its purpose is to expedite Puts - toFlush := bs.bufferedBlks - bs.bufferedBlks = []block.Block{} - bs.bufferedBlksLk.Unlock() - return bs.backingBs.PutMany(ctx, toFlush) -} - -func (bs *AutobatchBlockstore) Flush(ctx context.Context) error { - return bs.doFlush(ctx) + flushingBlksOrdered := bs.bufferedBlksOrdered + bs.flushingBlksMap = bs.bufferedBlksMap + bs.bufferedBlksOrdered = []block.Block{} + bs.bufferedBlksMap = make(map[cid.Cid]block.Block) + bs.bufferedLk.Unlock() + bs.flushingLk.Unlock() + return bs.backingBs.PutMany(ctx, flushingBlksOrdered) } func (bs *AutobatchBlockstore) Shutdown(ctx context.Context) error { + // request one last flush of the worker + bs.flushCh <- struct{}{} + // shutdown the flush worker bs.shutdownCh <- struct{}{} + // if it ever errored, this method fails if bs.flushErr != nil { return xerrors.Errorf("flushWorker errored: %w", bs.flushErr) } @@ -98,8 +126,8 @@ func (bs *AutobatchBlockstore) Shutdown(ctx context.Context) error { return bs.doFlush(ctx) } -// May be very slow if the cid queried wasn't in the backingBs at the time of creation of this AutobatchBlockstore func (bs *AutobatchBlockstore) Get(ctx context.Context, c cid.Cid) (block.Block, error) { + // may seem backward to check the backingBs first, but that is the likeliest case blk, err := bs.backingBs.Get(ctx, c) if err == nil { return blk, nil @@ -109,16 +137,24 @@ func (bs *AutobatchBlockstore) Get(ctx context.Context, c cid.Cid) (block.Block, return blk, err } - bs.Flush(ctx) - return bs.backingBs.Get(ctx, c) + bs.flushingLk.Lock() + v, ok := bs.flushingBlksMap[c] + bs.flushingLk.Unlock() + if ok { + return v, nil + } + + bs.bufferedLk.Lock() + v, ok = bs.bufferedBlksMap[c] + bs.bufferedLk.Unlock() + if ok { + return v, nil + } + + return nil, ErrNotFound } func (bs *AutobatchBlockstore) DeleteBlock(context.Context, cid.Cid) error { - // if we wanted to support this, we would have to: - // - flush - // - delete from the backingBs (if present) - // - remove from addedCids (if present) - // - if present in addedCids, also walk bufferedBlks and remove if present return xerrors.New("deletion is unsupported") } @@ -159,8 +195,8 @@ func (bs *AutobatchBlockstore) PutMany(ctx context.Context, blks []block.Block) } func (bs *AutobatchBlockstore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) { - bs.Flush(ctx) - return bs.backingBs.AllKeysChan(ctx) + return nil, xerrors.New("unsupported") + } func (bs *AutobatchBlockstore) HashOnRead(enabled bool) { @@ -168,6 +204,5 @@ func (bs *AutobatchBlockstore) HashOnRead(enabled bool) { } func (bs *AutobatchBlockstore) View(ctx context.Context, cid cid.Cid, callback func([]byte) error) error { - bs.Flush(ctx) - return bs.backingBs.View(ctx, cid, callback) + return xerrors.New("unsupported") } diff --git a/chain/consensus/filcns/upgrades.go b/chain/consensus/filcns/upgrades.go index 72b1605fa3e..066fb8a5091 100644 --- a/chain/consensus/filcns/upgrades.go +++ b/chain/consensus/filcns/upgrades.go @@ -1297,11 +1297,7 @@ func upgradeActorsV7Common( return cid.Undef, xerrors.Errorf("failed to persist new state root: %w", err) } - // Persist the new tree. Blocks until the entire writeStore is in the state blockstore. - if err := writeStore.Flush(ctx); err != nil { - return cid.Undef, xerrors.Errorf("failed to flush writestore: %w", err) - } - + // Persists the new tree and shuts down the flush worker if err := writeStore.Shutdown(ctx); err != nil { return cid.Undef, xerrors.Errorf("writeStore failed: %w", err) } From 16d491a134fc1c21bc30536ad0eca08439761998 Mon Sep 17 00:00:00 2001 From: Jiaying Wang <42981373+jennijuju@users.noreply.github.com> Date: Tue, 11 Jan 2022 21:41:58 -0500 Subject: [PATCH 200/393] update snap net upgrade epoch --- build/params_butterfly.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build/params_butterfly.go b/build/params_butterfly.go index 17e40af4ef9..776a31714cb 100644 --- a/build/params_butterfly.go +++ b/build/params_butterfly.go @@ -42,8 +42,8 @@ const UpgradeTurboHeight = -15 const UpgradeHyperdriveHeight = -16 const UpgradeChocolateHeight = -17 -// 2022-01-13T19:00:00Z -const UpgradeOhSnapHeight = 18742 +// 2022-01-17T19:00:00Z +const UpgradeOhSnapHeight = 30262 func init() { policy.SetConsensusMinerMinPower(abi.NewStoragePower(2 << 30)) From 083c5b003c33cd164aef5629ca32643fc1d71db2 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Wed, 12 Jan 2022 12:57:34 -0500 Subject: [PATCH 201/393] Address review --- blockstore/autobatch.go | 118 +++++++++++++++++------------ chain/consensus/filcns/upgrades.go | 6 +- 2 files changed, 73 insertions(+), 51 deletions(-) diff --git a/blockstore/autobatch.go b/blockstore/autobatch.go index e7694f9311c..cd3991246fa 100644 --- a/blockstore/autobatch.go +++ b/blockstore/autobatch.go @@ -15,19 +15,25 @@ import ( // blockstore logger. var autolog = log.Named("auto") +// contains the same set of blocks twice, once as an ordered list for flushing, and as a map for fast access +type blockBatch struct { + blockList []block.Block + blockMap map[cid.Cid]block.Block +} + type AutobatchBlockstore struct { // TODO: drop if memory consumption is too high addedCids map[cid.Cid]struct{} - bufferedLk sync.Mutex - bufferedBlksOrdered []block.Block - bufferedBlksMap map[cid.Cid]block.Block + lock sync.Mutex + bufferedBatch blockBatch - flushingLk sync.Mutex - flushingBlksMap map[cid.Cid]block.Block + // the flush worker has sole control (including read) over the flushingBatch.blockList and flushErr until shutdown + flushingBatch blockBatch + flushErr error + + flushCh chan struct{} - flushCh chan struct{} - flushErr error flushRetryDelay time.Duration flushCtx context.Context shutdownCh chan struct{} @@ -40,29 +46,32 @@ type AutobatchBlockstore struct { func NewAutobatch(ctx context.Context, backingBs Blockstore, bufferCapacity int) *AutobatchBlockstore { bs := &AutobatchBlockstore{ - addedCids: make(map[cid.Cid]struct{}), - backingBs: backingBs, - bufferCapacity: bufferCapacity, - bufferedBlksMap: make(map[cid.Cid]block.Block), - flushingBlksMap: make(map[cid.Cid]block.Block), - flushCtx: ctx, - flushCh: make(chan struct{}, 1), + addedCids: make(map[cid.Cid]struct{}), + backingBs: backingBs, + bufferCapacity: bufferCapacity, + flushCtx: ctx, + flushCh: make(chan struct{}, 1), // could be made configable - flushRetryDelay: time.Second * 5, + flushRetryDelay: time.Millisecond * 100, } + bs.bufferedBatch.blockMap = make(map[cid.Cid]block.Block) + bs.flushingBatch.blockMap = make(map[cid.Cid]block.Block) + go bs.flushWorker() return bs } func (bs *AutobatchBlockstore) Put(ctx context.Context, blk block.Block) error { - bs.bufferedLk.Lock() + bs.lock.Lock() + defer bs.lock.Unlock() + _, ok := bs.addedCids[blk.Cid()] if !ok { bs.addedCids[blk.Cid()] = struct{}{} - bs.bufferedBlksOrdered = append(bs.bufferedBlksOrdered, blk) - bs.bufferedBlksMap[blk.Cid()] = blk + bs.bufferedBatch.blockList = append(bs.bufferedBatch.blockList, blk) + bs.bufferedBatch.blockMap[blk.Cid()] = blk bs.bufferSize += len(blk.RawData()) if bs.bufferSize >= bs.bufferCapacity { // signal that a flush is appropriate, may be ignored @@ -73,7 +82,7 @@ func (bs *AutobatchBlockstore) Put(ctx context.Context, blk block.Block) error { } } } - bs.bufferedLk.Unlock() + return nil } @@ -85,11 +94,9 @@ func (bs *AutobatchBlockstore) flushWorker() { for putErr != nil { select { case <-bs.shutdownCh: - bs.flushErr = putErr return - default: - autolog.Errorf("FLUSH ERRORED: %w, retrying in %v", putErr, bs.flushRetryDelay) - time.Sleep(bs.flushRetryDelay) + case <-time.After(bs.flushRetryDelay): + autolog.Errorf("FLUSH ERRORED: %w, retrying after %v", putErr, bs.flushRetryDelay) putErr = bs.doFlush(bs.flushCtx) } } @@ -99,31 +106,31 @@ func (bs *AutobatchBlockstore) flushWorker() { } } +// caller must NOT hold lock func (bs *AutobatchBlockstore) doFlush(ctx context.Context) error { - bs.bufferedLk.Lock() - bs.flushingLk.Lock() - // We do NOT clear addedCids here, because its purpose is to expedite Puts - flushingBlksOrdered := bs.bufferedBlksOrdered - bs.flushingBlksMap = bs.bufferedBlksMap - bs.bufferedBlksOrdered = []block.Block{} - bs.bufferedBlksMap = make(map[cid.Cid]block.Block) - bs.bufferedLk.Unlock() - bs.flushingLk.Unlock() - return bs.backingBs.PutMany(ctx, flushingBlksOrdered) + if bs.flushErr == nil { + bs.lock.Lock() + // We do NOT clear addedCids here, because its purpose is to expedite Puts + bs.flushingBatch = bs.bufferedBatch + bs.bufferedBatch.blockList = make([]block.Block, 0, len(bs.flushingBatch.blockList)) + bs.bufferedBatch.blockMap = make(map[cid.Cid]block.Block, len(bs.flushingBatch.blockMap)) + bs.lock.Unlock() + } + + bs.flushErr = bs.backingBs.PutMany(ctx, bs.flushingBatch.blockList) + return bs.flushErr +} + +// caller must NOT hold lock +func (bs *AutobatchBlockstore) Flush(ctx context.Context) error { + return bs.doFlush(ctx) } func (bs *AutobatchBlockstore) Shutdown(ctx context.Context) error { - // request one last flush of the worker - bs.flushCh <- struct{}{} // shutdown the flush worker bs.shutdownCh <- struct{}{} - // if it ever errored, this method fails - if bs.flushErr != nil { - return xerrors.Errorf("flushWorker errored: %w", bs.flushErr) - } - // one last flush in case it's needed - return bs.doFlush(ctx) + return bs.flushErr } func (bs *AutobatchBlockstore) Get(ctx context.Context, c cid.Cid) (block.Block, error) { @@ -137,24 +144,28 @@ func (bs *AutobatchBlockstore) Get(ctx context.Context, c cid.Cid) (block.Block, return blk, err } - bs.flushingLk.Lock() - v, ok := bs.flushingBlksMap[c] - bs.flushingLk.Unlock() + bs.lock.Lock() + defer bs.lock.Unlock() + v, ok := bs.flushingBatch.blockMap[c] if ok { return v, nil } - bs.bufferedLk.Lock() - v, ok = bs.bufferedBlksMap[c] - bs.bufferedLk.Unlock() + v, ok = bs.flushingBatch.blockMap[c] if ok { return v, nil } - return nil, ErrNotFound + // check the backingBs in case it just got put in the backingBs (and removed from the batch maps) while we were here + return bs.backingBs.Get(ctx, c) } func (bs *AutobatchBlockstore) DeleteBlock(context.Context, cid.Cid) error { + // if we wanted to support this, we would have to: + // - flush + // - delete from the backingBs (if present) + // - remove from addedCids (if present) + // - if present in addedCids, also walk the ordered lists and remove if present return xerrors.New("deletion is unsupported") } @@ -195,8 +206,11 @@ func (bs *AutobatchBlockstore) PutMany(ctx context.Context, blks []block.Block) } func (bs *AutobatchBlockstore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) { - return nil, xerrors.New("unsupported") + if err := bs.Flush(ctx); err != nil { + return nil, err + } + return bs.backingBs.AllKeysChan(ctx) } func (bs *AutobatchBlockstore) HashOnRead(enabled bool) { @@ -204,5 +218,9 @@ func (bs *AutobatchBlockstore) HashOnRead(enabled bool) { } func (bs *AutobatchBlockstore) View(ctx context.Context, cid cid.Cid, callback func([]byte) error) error { - return xerrors.New("unsupported") + if err := bs.Flush(ctx); err != nil { + return err + } + + return bs.backingBs.View(ctx, cid, callback) } diff --git a/chain/consensus/filcns/upgrades.go b/chain/consensus/filcns/upgrades.go index 066fb8a5091..a21bdb05e23 100644 --- a/chain/consensus/filcns/upgrades.go +++ b/chain/consensus/filcns/upgrades.go @@ -1298,8 +1298,12 @@ func upgradeActorsV7Common( } // Persists the new tree and shuts down the flush worker + if err := writeStore.Flush(ctx); err != nil { + return cid.Undef, xerrors.Errorf("writeStore flush failed: %w", err) + } + if err := writeStore.Shutdown(ctx); err != nil { - return cid.Undef, xerrors.Errorf("writeStore failed: %w", err) + return cid.Undef, xerrors.Errorf("writeStore shutdown failed: %w", err) } return newRoot, nil From 893998cb70accb8151321b5c6cd7190803493eca Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Wed, 12 Jan 2022 15:03:34 -0500 Subject: [PATCH 202/393] Address review part 2 --- blockstore/autobatch.go | 58 +++++++++++++++++++++++------------- blockstore/autobatch_test.go | 5 ++-- 2 files changed, 41 insertions(+), 22 deletions(-) diff --git a/blockstore/autobatch.go b/blockstore/autobatch.go index cd3991246fa..e9df6a3b3f6 100644 --- a/blockstore/autobatch.go +++ b/blockstore/autobatch.go @@ -25,12 +25,13 @@ type AutobatchBlockstore struct { // TODO: drop if memory consumption is too high addedCids map[cid.Cid]struct{} - lock sync.Mutex + stateLock sync.Mutex + doFlushLock sync.Mutex bufferedBatch blockBatch - // the flush worker has sole control (including read) over the flushingBatch.blockList and flushErr until shutdown - flushingBatch blockBatch - flushErr error + flushingBatch blockBatch + flushErr error + flushWorkerDone bool flushCh chan struct{} @@ -51,12 +52,13 @@ func NewAutobatch(ctx context.Context, backingBs Blockstore, bufferCapacity int) bufferCapacity: bufferCapacity, flushCtx: ctx, flushCh: make(chan struct{}, 1), + shutdownCh: make(chan struct{}), // could be made configable flushRetryDelay: time.Millisecond * 100, + flushWorkerDone: false, } bs.bufferedBatch.blockMap = make(map[cid.Cid]block.Block) - bs.flushingBatch.blockMap = make(map[cid.Cid]block.Block) go bs.flushWorker() @@ -64,8 +66,8 @@ func NewAutobatch(ctx context.Context, backingBs Blockstore, bufferCapacity int) } func (bs *AutobatchBlockstore) Put(ctx context.Context, blk block.Block) error { - bs.lock.Lock() - defer bs.lock.Unlock() + bs.stateLock.Lock() + defer bs.stateLock.Unlock() _, ok := bs.addedCids[blk.Cid()] if !ok { @@ -87,6 +89,11 @@ func (bs *AutobatchBlockstore) Put(ctx context.Context, blk block.Block) error { } func (bs *AutobatchBlockstore) flushWorker() { + defer func() { + bs.stateLock.Lock() + bs.flushWorkerDone = true + bs.stateLock.Unlock() + }() for { select { case <-bs.flushCh: @@ -106,34 +113,47 @@ func (bs *AutobatchBlockstore) flushWorker() { } } -// caller must NOT hold lock +// caller must NOT hold stateLock func (bs *AutobatchBlockstore) doFlush(ctx context.Context) error { + bs.doFlushLock.Lock() + defer bs.doFlushLock.Unlock() if bs.flushErr == nil { - bs.lock.Lock() + bs.stateLock.Lock() // We do NOT clear addedCids here, because its purpose is to expedite Puts bs.flushingBatch = bs.bufferedBatch bs.bufferedBatch.blockList = make([]block.Block, 0, len(bs.flushingBatch.blockList)) bs.bufferedBatch.blockMap = make(map[cid.Cid]block.Block, len(bs.flushingBatch.blockMap)) - bs.lock.Unlock() + bs.stateLock.Unlock() } bs.flushErr = bs.backingBs.PutMany(ctx, bs.flushingBatch.blockList) + bs.stateLock.Lock() + bs.flushingBatch = blockBatch{} + bs.stateLock.Unlock() + return bs.flushErr } -// caller must NOT hold lock +// caller must NOT hold stateLock func (bs *AutobatchBlockstore) Flush(ctx context.Context) error { return bs.doFlush(ctx) } func (bs *AutobatchBlockstore) Shutdown(ctx context.Context) error { - // shutdown the flush worker - bs.shutdownCh <- struct{}{} + bs.stateLock.Lock() + flushDone := bs.flushWorkerDone + bs.stateLock.Unlock() + if !flushDone { + // may racily block forever if Shutdown is called in parallel + bs.shutdownCh <- struct{}{} + } return bs.flushErr } func (bs *AutobatchBlockstore) Get(ctx context.Context, c cid.Cid) (block.Block, error) { + bs.stateLock.Lock() + defer bs.stateLock.Unlock() // may seem backward to check the backingBs first, but that is the likeliest case blk, err := bs.backingBs.Get(ctx, c) if err == nil { @@ -144,20 +164,17 @@ func (bs *AutobatchBlockstore) Get(ctx context.Context, c cid.Cid) (block.Block, return blk, err } - bs.lock.Lock() - defer bs.lock.Unlock() v, ok := bs.flushingBatch.blockMap[c] if ok { return v, nil } - v, ok = bs.flushingBatch.blockMap[c] + v, ok = bs.bufferedBatch.blockMap[c] if ok { return v, nil } - // check the backingBs in case it just got put in the backingBs (and removed from the batch maps) while we were here - return bs.backingBs.Get(ctx, c) + return nil, ErrNotFound } func (bs *AutobatchBlockstore) DeleteBlock(context.Context, cid.Cid) error { @@ -218,9 +235,10 @@ func (bs *AutobatchBlockstore) HashOnRead(enabled bool) { } func (bs *AutobatchBlockstore) View(ctx context.Context, cid cid.Cid, callback func([]byte) error) error { - if err := bs.Flush(ctx); err != nil { + blk, err := bs.Get(ctx, cid) + if err != nil { return err } - return bs.backingBs.View(ctx, cid, callback) + return callback(blk.RawData()) } diff --git a/blockstore/autobatch_test.go b/blockstore/autobatch_test.go index fe52c55c777..57a3b7d6cae 100644 --- a/blockstore/autobatch_test.go +++ b/blockstore/autobatch_test.go @@ -17,8 +17,6 @@ func TestAutobatchBlockstore(t *testing.T) { require.NoError(t, ab.Put(ctx, b1)) require.NoError(t, ab.Put(ctx, b2)) - ab.Flush(ctx) - v0, err := ab.Get(ctx, b0.Cid()) require.NoError(t, err) require.Equal(t, b0.RawData(), v0.RawData()) @@ -30,4 +28,7 @@ func TestAutobatchBlockstore(t *testing.T) { v2, err := ab.Get(ctx, b2.Cid()) require.NoError(t, err) require.Equal(t, b2.RawData(), v2.RawData()) + + require.NoError(t, ab.Flush(ctx)) + require.NoError(t, ab.Shutdown(ctx)) } From 3464dc2fdf04b757e0f552680aabd85cd8f2a8d5 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Wed, 12 Jan 2022 16:04:47 -0500 Subject: [PATCH 203/393] Don't lock in Get --- blockstore/autobatch.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/blockstore/autobatch.go b/blockstore/autobatch.go index e9df6a3b3f6..53764d15cae 100644 --- a/blockstore/autobatch.go +++ b/blockstore/autobatch.go @@ -152,8 +152,6 @@ func (bs *AutobatchBlockstore) Shutdown(ctx context.Context) error { } func (bs *AutobatchBlockstore) Get(ctx context.Context, c cid.Cid) (block.Block, error) { - bs.stateLock.Lock() - defer bs.stateLock.Unlock() // may seem backward to check the backingBs first, but that is the likeliest case blk, err := bs.backingBs.Get(ctx, c) if err == nil { @@ -174,7 +172,7 @@ func (bs *AutobatchBlockstore) Get(ctx context.Context, c cid.Cid) (block.Block, return v, nil } - return nil, ErrNotFound + return bs.Get(ctx, c) } func (bs *AutobatchBlockstore) DeleteBlock(context.Context, cid.Cid) error { From efe9ec4906d667a79f6d4860e5b9bf8e4af18f06 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Wed, 12 Jan 2022 17:22:54 -0500 Subject: [PATCH 204/393] Add missing locks to Get() --- blockstore/autobatch.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/blockstore/autobatch.go b/blockstore/autobatch.go index 53764d15cae..778995dbdce 100644 --- a/blockstore/autobatch.go +++ b/blockstore/autobatch.go @@ -162,6 +162,8 @@ func (bs *AutobatchBlockstore) Get(ctx context.Context, c cid.Cid) (block.Block, return blk, err } + bs.stateLock.Lock() + defer bs.stateLock.Unlock() v, ok := bs.flushingBatch.blockMap[c] if ok { return v, nil From bda4e5be9576a303d6de8ce3a230a01a37bd3499 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Wed, 12 Jan 2022 18:10:07 -0500 Subject: [PATCH 205/393] Appease the linter --- extern/storage-sealing/states_replica_update.go | 1 + 1 file changed, 1 insertion(+) diff --git a/extern/storage-sealing/states_replica_update.go b/extern/storage-sealing/states_replica_update.go index caf50fb7e6e..43d5467ed55 100644 --- a/extern/storage-sealing/states_replica_update.go +++ b/extern/storage-sealing/states_replica_update.go @@ -2,6 +2,7 @@ package sealing import ( "bytes" + "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-state-types/exitcode" statemachine "github.com/filecoin-project/go-statemachine" From 2a862d497f518afe9310040f76e524f3d506059b Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 12 Jan 2022 14:37:29 -0800 Subject: [PATCH 206/393] correctness fixes for the autobatch blockstore 1. Simplify shutdown and make it idempotent by using a context. 2. Make sure `Flush` actually _fully_ flushes if the previous flush failed. 3. Don't clear the flush batch if flushing fails. --- blockstore/autobatch.go | 92 ++++++++++++++++++++++++----------------- 1 file changed, 55 insertions(+), 37 deletions(-) diff --git a/blockstore/autobatch.go b/blockstore/autobatch.go index 53764d15cae..6393b2e22f8 100644 --- a/blockstore/autobatch.go +++ b/blockstore/autobatch.go @@ -26,18 +26,17 @@ type AutobatchBlockstore struct { addedCids map[cid.Cid]struct{} stateLock sync.Mutex - doFlushLock sync.Mutex bufferedBatch blockBatch - flushingBatch blockBatch - flushErr error - flushWorkerDone bool + flushingBatch blockBatch + flushErr error flushCh chan struct{} + doFlushLock sync.Mutex flushRetryDelay time.Duration - flushCtx context.Context - shutdownCh chan struct{} + doneCh chan struct{} + shutdown context.CancelFunc backingBs Blockstore @@ -46,21 +45,21 @@ type AutobatchBlockstore struct { } func NewAutobatch(ctx context.Context, backingBs Blockstore, bufferCapacity int) *AutobatchBlockstore { + ctx, cancel := context.WithCancel(ctx) bs := &AutobatchBlockstore{ addedCids: make(map[cid.Cid]struct{}), backingBs: backingBs, bufferCapacity: bufferCapacity, - flushCtx: ctx, flushCh: make(chan struct{}, 1), - shutdownCh: make(chan struct{}), + doneCh: make(chan struct{}), // could be made configable flushRetryDelay: time.Millisecond * 100, - flushWorkerDone: false, + shutdown: cancel, } bs.bufferedBatch.blockMap = make(map[cid.Cid]block.Block) - go bs.flushWorker() + go bs.flushWorker(ctx) return bs } @@ -88,66 +87,85 @@ func (bs *AutobatchBlockstore) Put(ctx context.Context, blk block.Block) error { return nil } -func (bs *AutobatchBlockstore) flushWorker() { - defer func() { - bs.stateLock.Lock() - bs.flushWorkerDone = true - bs.stateLock.Unlock() - }() +func (bs *AutobatchBlockstore) flushWorker(ctx context.Context) { + defer close(bs.doneCh) for { select { case <-bs.flushCh: - putErr := bs.doFlush(bs.flushCtx) + // TODO: check if we _should_ actually flush. We could get a spurious wakeup + // here. + putErr := bs.doFlush(ctx, false) for putErr != nil { select { - case <-bs.shutdownCh: + case <-ctx.Done(): return case <-time.After(bs.flushRetryDelay): autolog.Errorf("FLUSH ERRORED: %w, retrying after %v", putErr, bs.flushRetryDelay) - putErr = bs.doFlush(bs.flushCtx) + putErr = bs.doFlush(ctx, true) } } - case <-bs.shutdownCh: + case <-ctx.Done(): + // Do one last flush. + _ = bs.doFlush(ctx, false) return } } } // caller must NOT hold stateLock -func (bs *AutobatchBlockstore) doFlush(ctx context.Context) error { +// set retryOnly to true to only retry a failed flush and not flush anything new. +func (bs *AutobatchBlockstore) doFlush(ctx context.Context, retryOnly bool) error { bs.doFlushLock.Lock() defer bs.doFlushLock.Unlock() - if bs.flushErr == nil { - bs.stateLock.Lock() - // We do NOT clear addedCids here, because its purpose is to expedite Puts - bs.flushingBatch = bs.bufferedBatch - bs.bufferedBatch.blockList = make([]block.Block, 0, len(bs.flushingBatch.blockList)) - bs.bufferedBatch.blockMap = make(map[cid.Cid]block.Block, len(bs.flushingBatch.blockMap)) - bs.stateLock.Unlock() + + // If we failed to flush last time, try flushing again. + if bs.flushErr != nil { + bs.flushErr = bs.backingBs.PutMany(ctx, bs.flushingBatch.blockList) } - bs.flushErr = bs.backingBs.PutMany(ctx, bs.flushingBatch.blockList) + // If we failed, or we're _only_ retrying, bail. + if retryOnly || bs.flushErr != nil { + return bs.flushErr + } + + // Then take the current batch... bs.stateLock.Lock() - bs.flushingBatch = blockBatch{} + // We do NOT clear addedCids here, because its purpose is to expedite Puts + bs.flushingBatch = bs.bufferedBatch + bs.bufferedBatch.blockList = make([]block.Block, 0, len(bs.flushingBatch.blockList)) + bs.bufferedBatch.blockMap = make(map[cid.Cid]block.Block, len(bs.flushingBatch.blockMap)) bs.stateLock.Unlock() + // And try to flush it. + bs.flushErr = bs.backingBs.PutMany(ctx, bs.flushingBatch.blockList) + + // If we succeeded, reset the batch. Otherwise, we'll try again next time. + if bs.flushErr == nil { + bs.stateLock.Lock() + bs.flushingBatch = blockBatch{} + bs.stateLock.Unlock() + } + return bs.flushErr } // caller must NOT hold stateLock func (bs *AutobatchBlockstore) Flush(ctx context.Context) error { - return bs.doFlush(ctx) + return bs.doFlush(ctx, false) } func (bs *AutobatchBlockstore) Shutdown(ctx context.Context) error { - bs.stateLock.Lock() - flushDone := bs.flushWorkerDone - bs.stateLock.Unlock() - if !flushDone { - // may racily block forever if Shutdown is called in parallel - bs.shutdownCh <- struct{}{} + // TODO: Prevent puts after we call this to avoid losing data. + bs.shutdown() + select { + case <-bs.doneCh: + case <-ctx.Done(): + return ctx.Err() } + bs.doFlushLock.Lock() + defer bs.doFlushLock.Unlock() + return bs.flushErr } From d923620d5ad7af420b4aa90134721cf74bfed4a1 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Wed, 12 Jan 2022 18:49:24 -0500 Subject: [PATCH 207/393] go mod tidy --- testplans/lotus-soup/go.sum | 1 - 1 file changed, 1 deletion(-) diff --git a/testplans/lotus-soup/go.sum b/testplans/lotus-soup/go.sum index a571661d820..47e65fd549c 100644 --- a/testplans/lotus-soup/go.sum +++ b/testplans/lotus-soup/go.sum @@ -939,7 +939,6 @@ github.com/ipfs/go-filestore v1.1.0 h1:Pu4tLBi1bucu6/HU9llaOmb9yLFk/sgP+pW764zND github.com/ipfs/go-filestore v1.1.0/go.mod h1:6e1/5Y6NvLuCRdmda/KA4GUhXJQ3Uat6vcWm2DJfxc8= github.com/ipfs/go-fs-lock v0.0.6 h1:sn3TWwNVQqSeNjlWy6zQ1uUGAZrV3hPOyEA6y1/N2a0= github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28L7zESmM= -github.com/ipfs/go-hamt-ipld v0.1.1/go.mod h1:1EZCr2v0jlCnhpa+aZ0JZYp8Tt2w16+JJOAVz17YcDk= github.com/ipfs/go-graphsync v0.11.0/go.mod h1:wC+c8vGVjAHthsVIl8LKr37cUra2GOaMYcQNNmMxDqE= github.com/ipfs/go-graphsync v0.11.5 h1:WA5hVxGBtcal6L6nqubKiqRolaZxbexOK3GumGFJRR4= github.com/ipfs/go-graphsync v0.11.5/go.mod h1:+/sZqRwRCQRrV7NCzgBtufmr5QGpUE98XSa7NlsztmM= From 52411b12e3ba07ed9be74b1380306aa4be1ae7d7 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Wed, 12 Jan 2022 19:15:56 -0500 Subject: [PATCH 208/393] Resolve conflict --- cmd/lotus-miner/sectors.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/lotus-miner/sectors.go b/cmd/lotus-miner/sectors.go index 6c4f5e16b30..cc5668334fe 100644 --- a/cmd/lotus-miner/sectors.go +++ b/cmd/lotus-miner/sectors.go @@ -1557,7 +1557,7 @@ var sectorsMarkForUpgradeCmd = &cli.Command{ return xerrors.Errorf("failed to get chain head: %w", err) } twoDays := abi.ChainEpoch(2 * builtin.EpochsInDay) - if head.Height() > (build.UpgradeSnapDealsHeight - twoDays) { + if head.Height() > (build.UpgradeOhSnapHeight - twoDays) { return xerrors.Errorf("OhSnap is coming soon, " + "please use `snap-up` to upgrade your cc sectors after the network v15 upgrade!") } From c1d04a9d13b89acb0f0f9c4872b2da48dc4fae2c Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Mon, 10 Jan 2022 23:32:57 -0500 Subject: [PATCH 209/393] bump master version to v1.15.0-dev --- build/openrpc/full.json.gz | Bin 26593 -> 26593 bytes build/openrpc/miner.json.gz | Bin 12680 -> 12680 bytes build/openrpc/worker.json.gz | Bin 3803 -> 3803 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 +- 7 files changed, 4 insertions(+), 4 deletions(-) diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 1e4efea1a4fcc8ed6a49cd9c92876b457456c26f..09098bb20aea4965d1b7dfee00017e74b8b64d95 100644 GIT binary patch delta 26544 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 Ul}|P>u&=MYajZaEDJZc20gKFgdH?_b literal 26593 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

4lZUES44$mn^q0OvG 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 Wb|%^M1qTB9{?-Tn&ZHCv1NuKQSuOGa diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index 08f41f3c55cb320b41642fb0e29238561a56591c..8e34e9de7477a8ec0e2d360d581d3a68d8cdb762 100644 GIT binary patch delta 24 gcmeB3?ns`{%<}Hy!n%#^KMgp}97}!N8p*@}0G;Fu?*IS* delta 24 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 Date: Thu, 13 Jan 2022 17:21:13 +0100 Subject: [PATCH 210/393] Storage stats 2.0 --- cmd/lotus-shed/storage-stats.go | 145 ++++++++++++++++++++++---------- 1 file changed, 101 insertions(+), 44 deletions(-) diff --git a/cmd/lotus-shed/storage-stats.go b/cmd/lotus-shed/storage-stats.go index a9a5744a6bd..74c3f3c74e8 100644 --- a/cmd/lotus-shed/storage-stats.go +++ b/cmd/lotus-shed/storage-stats.go @@ -8,6 +8,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" filbig "github.com/filecoin-project/go-state-types/big" + "github.com/filecoin-project/lotus/chain/types" lcli "github.com/filecoin-project/lotus/cli" "github.com/ipfs/go-cid" "github.com/urfave/cli/v2" @@ -22,29 +23,43 @@ type networkTotalsOutput struct { Payload networkTotals `json:"payload"` } +type providerMeta struct { + nonidentifiable bool +} + +type Totals struct { + TotalDeals int `json:"total_num_deals"` + TotalBytes int64 `json:"total_stored_data_size"` + SlashedTotalDeals int `json:"slashed_total_num_deals"` + SlashedTotalBytes int64 `json:"slashed_total_stored_data_size"` + PrivateTotalDeals int `json:"private_total_num_deals"` + PrivateTotalBytes int64 `json:"private_total_stored_data_size"` + CapacityCarryingData float64 `json:"capacity_fraction_carrying_data"` +} + type networkTotals struct { - QaNetworkPower filbig.Int `json:"total_qa_power"` - RawNetworkPower filbig.Int `json:"total_raw_capacity"` - CapacityCarryingData float64 `json:"capacity_fraction_carrying_data"` - UniqueCids int `json:"total_unique_cids"` - UniqueProviders int `json:"total_unique_providers"` - UniqueClients int `json:"total_unique_clients"` - TotalDeals int `json:"total_num_deals"` - TotalBytes int64 `json:"total_stored_data_size"` - FilplusTotalDeals int `json:"filplus_total_num_deals"` - FilplusTotalBytes int64 `json:"filplus_total_stored_data_size"` - - seenClient map[address.Address]bool - seenProvider map[address.Address]bool - seenPieceCid map[cid.Cid]bool + QaNetworkPower filbig.Int `json:"total_qa_power"` + RawNetworkPower filbig.Int `json:"total_raw_capacity"` + UniqueCids int `json:"total_unique_cids"` + UniqueBytes int64 `json:"total_unique_data_size"` + UniqueClients int `json:"total_unique_clients"` + UniqueProviders int `json:"total_unique_providers"` + UniquePrivateProviders int `json:"total_unique_private_providers"` + Totals + FilPlus Totals `json:"filecoin_plus_subset"` + + pieces map[cid.Cid]struct{} + clients map[address.Address]struct{} + providers map[address.Address]providerMeta } var storageStatsCmd = &cli.Command{ Name: "storage-stats", Usage: "Translates current lotus state into a json summary suitable for driving https://storage.filecoin.io/", Flags: []cli.Flag{ - &cli.Int64Flag{ - Name: "height", + &cli.StringFlag{ + Name: "tipset", + Usage: "Comma separated array of cids, or @height", }, }, Action: func(cctx *cli.Context) error { @@ -56,22 +71,24 @@ var storageStatsCmd = &cli.Command{ } defer apiCloser() - head, err := api.ChainHead(ctx) - if err != nil { - return err - } - - requestedHeight := cctx.Int64("height") - if requestedHeight > 0 { - head, err = api.ChainGetTipSetByHeight(ctx, abi.ChainEpoch(requestedHeight), head.Key()) + var ts *types.TipSet + if cctx.String("tipset") == "" { + ts, err = api.ChainHead(ctx) + if err != nil { + return err + } + ts, err = api.ChainGetTipSetByHeight(ctx, ts.Height()-defaultEpochLookback, ts.Key()) + if err != nil { + return err + } } else { - head, err = api.ChainGetTipSetByHeight(ctx, head.Height()-defaultEpochLookback, head.Key()) - } - if err != nil { - return err + ts, err = lcli.ParseTipSetRef(ctx, api, cctx.String("tipset")) + if err != nil { + return err + } } - power, err := api.StateMinerPower(ctx, address.Address{}, head.Key()) + power, err := api.StateMinerPower(ctx, address.Address{}, ts.Key()) if err != nil { return err } @@ -79,12 +96,12 @@ var storageStatsCmd = &cli.Command{ netTotals := networkTotals{ QaNetworkPower: power.TotalPower.QualityAdjPower, RawNetworkPower: power.TotalPower.RawBytePower, - seenClient: make(map[address.Address]bool), - seenProvider: make(map[address.Address]bool), - seenPieceCid: make(map[cid.Cid]bool), + pieces: make(map[cid.Cid]struct{}), + clients: make(map[address.Address]struct{}), + providers: make(map[address.Address]providerMeta), } - deals, err := api.StateMarketDeals(ctx, head.Key()) + deals, err := api.StateMarketDeals(ctx, ts.Key()) if err != nil { return err } @@ -95,34 +112,74 @@ var storageStatsCmd = &cli.Command{ // https://github.com/filecoin-project/specs-actors/blob/v0.9.9/actors/builtin/market/deal.go#L81-L85 // Bail on 0 as well in case SectorStartEpoch is uninitialized due to some bug if dealInfo.State.SectorStartEpoch <= 0 || - dealInfo.State.SectorStartEpoch > head.Height() { + dealInfo.State.SectorStartEpoch > ts.Height() { continue } - netTotals.seenClient[dealInfo.Proposal.Client] = true + netTotals.clients[dealInfo.Proposal.Client] = struct{}{} + + if _, seen := netTotals.providers[dealInfo.Proposal.Provider]; !seen { + pm := providerMeta{} + + mi, err := api.StateMinerInfo(ctx, dealInfo.Proposal.Provider, ts.Key()) + if err != nil { + return err + } + + if mi.PeerId == nil || *mi.PeerId == "" { + log.Infof("private provider %s", dealInfo.Proposal.Provider) + pm.nonidentifiable = true + netTotals.UniquePrivateProviders++ + } + + netTotals.providers[dealInfo.Proposal.Provider] = pm + netTotals.UniqueProviders++ + } + + if _, seen := netTotals.pieces[dealInfo.Proposal.PieceCID]; !seen { + netTotals.pieces[dealInfo.Proposal.PieceCID] = struct{}{} + netTotals.UniqueBytes += int64(dealInfo.Proposal.PieceSize) + netTotals.UniqueCids++ + } + netTotals.TotalBytes += int64(dealInfo.Proposal.PieceSize) - netTotals.seenProvider[dealInfo.Proposal.Provider] = true - netTotals.seenPieceCid[dealInfo.Proposal.PieceCID] = true netTotals.TotalDeals++ + if dealInfo.State.SlashEpoch > -1 && dealInfo.State.LastUpdatedEpoch < dealInfo.State.SlashEpoch { + netTotals.SlashedTotalBytes += int64(dealInfo.Proposal.PieceSize) + netTotals.SlashedTotalDeals++ + } + if netTotals.providers[dealInfo.Proposal.Provider].nonidentifiable { + netTotals.PrivateTotalBytes += int64(dealInfo.Proposal.PieceSize) + netTotals.PrivateTotalDeals++ + } if dealInfo.Proposal.VerifiedDeal { - netTotals.FilplusTotalDeals++ - netTotals.FilplusTotalBytes += int64(dealInfo.Proposal.PieceSize) + netTotals.FilPlus.TotalBytes += int64(dealInfo.Proposal.PieceSize) + netTotals.FilPlus.TotalDeals++ + if dealInfo.State.SlashEpoch > -1 && dealInfo.State.LastUpdatedEpoch < dealInfo.State.SlashEpoch { + netTotals.FilPlus.SlashedTotalBytes += int64(dealInfo.Proposal.PieceSize) + netTotals.FilPlus.SlashedTotalDeals++ + } + if netTotals.providers[dealInfo.Proposal.Provider].nonidentifiable { + netTotals.FilPlus.PrivateTotalBytes += int64(dealInfo.Proposal.PieceSize) + netTotals.FilPlus.PrivateTotalDeals++ + } } } - netTotals.UniqueCids = len(netTotals.seenPieceCid) - netTotals.UniqueClients = len(netTotals.seenClient) - netTotals.UniqueProviders = len(netTotals.seenProvider) - + netTotals.UniqueClients = len(netTotals.clients) netTotals.CapacityCarryingData, _ = new(corebig.Rat).SetFrac( corebig.NewInt(netTotals.TotalBytes), netTotals.RawNetworkPower.Int, ).Float64() + netTotals.FilPlus.CapacityCarryingData, _ = new(corebig.Rat).SetFrac( + corebig.NewInt(netTotals.FilPlus.TotalBytes), + netTotals.RawNetworkPower.Int, + ).Float64() return json.NewEncoder(os.Stdout).Encode( networkTotalsOutput{ - Epoch: int64(head.Height()), + Epoch: int64(ts.Height()), Endpoint: "NETWORK_WIDE_TOTALS", Payload: netTotals, }, From da6752eccbdc9d94ce6458a26be91f189e28e84b Mon Sep 17 00:00:00 2001 From: c r Date: Thu, 13 Jan 2022 12:26:13 -0600 Subject: [PATCH 211/393] feat: #7747 sealing: Adding conf variable for capping number of concurrent unsealing jobs (#7884) * adding the new variables- now time for logic * putting parameters into right placeS * adding unsealing throttle * fixing linter issues * removing one last thing... --- .../en/default-lotus-miner-config.toml | 8 ++++ markets/dagstore/miner_api.go | 38 +++++++++++++------ markets/dagstore/miner_api_test.go | 6 +-- markets/dagstore/wrapper_migration_test.go | 2 +- node/config/def.go | 1 + node/config/doc_gen.go | 8 ++++ node/config/types.go | 5 +++ node/modules/storageminer_dagstore.go | 2 +- 8 files changed, 53 insertions(+), 17 deletions(-) diff --git a/documentation/en/default-lotus-miner-config.toml b/documentation/en/default-lotus-miner-config.toml index 55ddbb0543e..47ac9f1e7ed 100644 --- a/documentation/en/default-lotus-miner-config.toml +++ b/documentation/en/default-lotus-miner-config.toml @@ -550,6 +550,14 @@ # env var: LOTUS_DAGSTORE_MAXCONCURRENTREADYFETCHES #MaxConcurrentReadyFetches = 0 + # The maximum amount of unseals that can be processed simultaneously + # from the storage subsystem. 0 means unlimited. + # Default value: 0 (unlimited). + # + # type: int + # env var: LOTUS_DAGSTORE_MAXCONCURRENTUNSEALS + #MaxConcurrentUnseals = 5 + # The maximum number of simultaneous inflight API calls to the storage # subsystem. # Default value: 100. diff --git a/markets/dagstore/miner_api.go b/markets/dagstore/miner_api.go index 77b4b97bf4e..8a12097d5f2 100644 --- a/markets/dagstore/miner_api.go +++ b/markets/dagstore/miner_api.go @@ -31,20 +31,28 @@ type SectorAccessor interface { } type minerAPI struct { - pieceStore piecestore.PieceStore - sa SectorAccessor - throttle throttle.Throttler - readyMgr *shared.ReadyManager + pieceStore piecestore.PieceStore + sa SectorAccessor + throttle throttle.Throttler + unsealThrottle throttle.Throttler + readyMgr *shared.ReadyManager } var _ MinerAPI = (*minerAPI)(nil) -func NewMinerAPI(store piecestore.PieceStore, sa SectorAccessor, concurrency int) MinerAPI { +func NewMinerAPI(store piecestore.PieceStore, sa SectorAccessor, concurrency int, unsealConcurrency int) MinerAPI { + var unsealThrottle throttle.Throttler + if unsealConcurrency == 0 { + unsealThrottle = throttle.Noop() + } else { + unsealThrottle = throttle.Fixed(unsealConcurrency) + } return &minerAPI{ - pieceStore: store, - sa: sa, - throttle: throttle.Fixed(concurrency), - readyMgr: shared.NewReadyManager(), + pieceStore: store, + sa: sa, + throttle: throttle.Fixed(concurrency), + unsealThrottle: unsealThrottle, + readyMgr: shared.NewReadyManager(), } } @@ -152,13 +160,19 @@ func (m *minerAPI) FetchUnsealedPiece(ctx context.Context, pieceCid cid.Cid) (mo } lastErr := xerrors.New("no sectors found to unseal from") + // if there is no unsealed sector containing the piece, just read the piece from the first sector we are able to unseal. for _, deal := range pieceInfo.Deals { // Note that if the deal data is not already unsealed, unsealing may // block for a long time with the current PoRep - // - // This path is unthrottled. - reader, err := m.sa.UnsealSectorAt(ctx, deal.SectorID, deal.Offset.Unpadded(), deal.Length.Unpadded()) + var reader mount.Reader + deal := deal + err := m.throttle.Do(ctx, func(ctx context.Context) (err error) { + // Because we know we have an unsealed copy, this UnsealSector call will actually not perform any unsealing. + reader, err = m.sa.UnsealSectorAt(ctx, deal.SectorID, deal.Offset.Unpadded(), deal.Length.Unpadded()) + return err + }) + if err != nil { lastErr = xerrors.Errorf("failed to unseal deal %d: %w", deal.DealID, err) log.Warn(lastErr.Error()) diff --git a/markets/dagstore/miner_api_test.go b/markets/dagstore/miner_api_test.go index 45cbf24610d..ee2f0cdce85 100644 --- a/markets/dagstore/miner_api_test.go +++ b/markets/dagstore/miner_api_test.go @@ -75,7 +75,7 @@ func TestLotusAccessorFetchUnsealedPiece(t *testing.T) { rpn := &mockRPN{ sectors: mockData, } - api := NewMinerAPI(ps, rpn, 100) + api := NewMinerAPI(ps, rpn, 100, 5) require.NoError(t, api.Start(ctx)) // Add deals to piece store @@ -115,7 +115,7 @@ func TestLotusAccessorGetUnpaddedCARSize(t *testing.T) { ps := getPieceStore(t) rpn := &mockRPN{} - api := NewMinerAPI(ps, rpn, 100) + api := NewMinerAPI(ps, rpn, 100, 5) require.NoError(t, api.Start(ctx)) // Add a deal with data Length 10 @@ -142,7 +142,7 @@ func TestThrottle(t *testing.T) { unsealedSectorID: "foo", }, } - api := NewMinerAPI(ps, rpn, 3) + api := NewMinerAPI(ps, rpn, 3, 5) require.NoError(t, api.Start(ctx)) // Add a deal with data Length 10 diff --git a/markets/dagstore/wrapper_migration_test.go b/markets/dagstore/wrapper_migration_test.go index e46f8779beb..437032da943 100644 --- a/markets/dagstore/wrapper_migration_test.go +++ b/markets/dagstore/wrapper_migration_test.go @@ -96,7 +96,7 @@ func TestShardRegistration(t *testing.T) { cfg := config.DefaultStorageMiner().DAGStore cfg.RootDir = t.TempDir() - mapi := NewMinerAPI(ps, &wrappedSA{sa}, 10) + mapi := NewMinerAPI(ps, &wrappedSA{sa}, 10, 5) dagst, w, err := NewDAGStore(cfg, mapi) require.NoError(t, err) require.NotNil(t, dagst) diff --git a/node/config/def.go b/node/config/def.go index 9c39c197ce5..644c28bea69 100644 --- a/node/config/def.go +++ b/node/config/def.go @@ -216,6 +216,7 @@ func DefaultStorageMiner() *StorageMiner { DAGStore: DAGStoreConfig{ MaxConcurrentIndex: 5, MaxConcurrencyStorageCalls: 100, + MaxConcurrentUnseals: 5, GCInterval: Duration(1 * time.Minute), }, } diff --git a/node/config/doc_gen.go b/node/config/doc_gen.go index eded0b1fed0..c3730cbace6 100644 --- a/node/config/doc_gen.go +++ b/node/config/doc_gen.go @@ -162,6 +162,14 @@ Default value: 5.`, Comment: `The maximum amount of unsealed deals that can be fetched simultaneously from the storage subsystem. 0 means unlimited. +Default value: 0 (unlimited).`, + }, + { + Name: "MaxConcurrentUnseals", + Type: "int", + + Comment: `The maximum amount of unseals that can be processed simultaneously +from the storage subsystem. 0 means unlimited. Default value: 0 (unlimited).`, }, { diff --git a/node/config/types.go b/node/config/types.go index 2ae2d8eee32..715f4824861 100644 --- a/node/config/types.go +++ b/node/config/types.go @@ -75,6 +75,11 @@ type DAGStoreConfig struct { // Default value: 0 (unlimited). MaxConcurrentReadyFetches int + // The maximum amount of unseals that can be processed simultaneously + // from the storage subsystem. 0 means unlimited. + // Default value: 0 (unlimited). + MaxConcurrentUnseals int + // The maximum number of simultaneous inflight API calls to the storage // subsystem. // Default value: 100. diff --git a/node/modules/storageminer_dagstore.go b/node/modules/storageminer_dagstore.go index b4f5d353554..513acaad110 100644 --- a/node/modules/storageminer_dagstore.go +++ b/node/modules/storageminer_dagstore.go @@ -38,7 +38,7 @@ func NewMinerAPI(lc fx.Lifecycle, r repo.LockedRepo, pieceStore dtypes.ProviderP } } - mountApi := mdagstore.NewMinerAPI(pieceStore, sa, cfg.MaxConcurrencyStorageCalls) + mountApi := mdagstore.NewMinerAPI(pieceStore, sa, cfg.MaxConcurrencyStorageCalls, cfg.MaxConcurrentUnseals) ready := make(chan error, 1) pieceStore.OnReady(func(err error) { ready <- err From d568d6fabc432ff7c54f98e7af5824693c74e28c Mon Sep 17 00:00:00 2001 From: Peter Rabbitson Date: Thu, 13 Jan 2022 20:03:33 +0100 Subject: [PATCH 212/393] As per Why&Aayush: slashing deals is not really a thing --- cmd/lotus-shed/storage-stats.go | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/cmd/lotus-shed/storage-stats.go b/cmd/lotus-shed/storage-stats.go index 74c3f3c74e8..01d46487831 100644 --- a/cmd/lotus-shed/storage-stats.go +++ b/cmd/lotus-shed/storage-stats.go @@ -30,8 +30,6 @@ type providerMeta struct { type Totals struct { TotalDeals int `json:"total_num_deals"` TotalBytes int64 `json:"total_stored_data_size"` - SlashedTotalDeals int `json:"slashed_total_num_deals"` - SlashedTotalBytes int64 `json:"slashed_total_stored_data_size"` PrivateTotalDeals int `json:"private_total_num_deals"` PrivateTotalBytes int64 `json:"private_total_stored_data_size"` CapacityCarryingData float64 `json:"capacity_fraction_carrying_data"` @@ -111,8 +109,13 @@ var storageStatsCmd = &cli.Command{ // Only count deals that have properly started, not past/future ones // https://github.com/filecoin-project/specs-actors/blob/v0.9.9/actors/builtin/market/deal.go#L81-L85 // Bail on 0 as well in case SectorStartEpoch is uninitialized due to some bug + // + // Additionally if the SlashEpoch is set this means the underlying sector is + // terminated for whatever reason ( not just slashed ), and the deal record + // will soon be removed from the state entirely if dealInfo.State.SectorStartEpoch <= 0 || - dealInfo.State.SectorStartEpoch > ts.Height() { + dealInfo.State.SectorStartEpoch > ts.Height() || + dealInfo.State.SlashEpoch > -1 { continue } @@ -144,10 +147,6 @@ var storageStatsCmd = &cli.Command{ netTotals.TotalBytes += int64(dealInfo.Proposal.PieceSize) netTotals.TotalDeals++ - if dealInfo.State.SlashEpoch > -1 && dealInfo.State.LastUpdatedEpoch < dealInfo.State.SlashEpoch { - netTotals.SlashedTotalBytes += int64(dealInfo.Proposal.PieceSize) - netTotals.SlashedTotalDeals++ - } if netTotals.providers[dealInfo.Proposal.Provider].nonidentifiable { netTotals.PrivateTotalBytes += int64(dealInfo.Proposal.PieceSize) netTotals.PrivateTotalDeals++ @@ -156,10 +155,6 @@ var storageStatsCmd = &cli.Command{ if dealInfo.Proposal.VerifiedDeal { netTotals.FilPlus.TotalBytes += int64(dealInfo.Proposal.PieceSize) netTotals.FilPlus.TotalDeals++ - if dealInfo.State.SlashEpoch > -1 && dealInfo.State.LastUpdatedEpoch < dealInfo.State.SlashEpoch { - netTotals.FilPlus.SlashedTotalBytes += int64(dealInfo.Proposal.PieceSize) - netTotals.FilPlus.SlashedTotalDeals++ - } if netTotals.providers[dealInfo.Proposal.Provider].nonidentifiable { netTotals.FilPlus.PrivateTotalBytes += int64(dealInfo.Proposal.PieceSize) netTotals.FilPlus.PrivateTotalDeals++ From e3c250f240fad3c7ad3e9afe789d3f43a63a9f76 Mon Sep 17 00:00:00 2001 From: Peter Rabbitson Date: Fri, 14 Jan 2022 13:17:45 +0100 Subject: [PATCH 213/393] Force float in output to remain decimal --- cmd/lotus-shed/storage-stats.go | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/cmd/lotus-shed/storage-stats.go b/cmd/lotus-shed/storage-stats.go index 01d46487831..b4e5991fda4 100644 --- a/cmd/lotus-shed/storage-stats.go +++ b/cmd/lotus-shed/storage-stats.go @@ -4,6 +4,7 @@ import ( "encoding/json" corebig "math/big" "os" + "strconv" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" @@ -27,12 +28,21 @@ type providerMeta struct { nonidentifiable bool } +// force formatting as decimal to aid human readers +type humanFloat float64 + +func (f humanFloat) MarshalJSON() ([]byte, error) { + // 'f' uses decimal digits without exponents. + // The bit size of 32 ensures we don't use too many decimal places. + return []byte(strconv.FormatFloat(float64(f), 'f', -1, 32)), nil +} + type Totals struct { - TotalDeals int `json:"total_num_deals"` - TotalBytes int64 `json:"total_stored_data_size"` - PrivateTotalDeals int `json:"private_total_num_deals"` - PrivateTotalBytes int64 `json:"private_total_stored_data_size"` - CapacityCarryingData float64 `json:"capacity_fraction_carrying_data"` + TotalDeals int `json:"total_num_deals"` + TotalBytes int64 `json:"total_stored_data_size"` + PrivateTotalDeals int `json:"private_total_num_deals"` + PrivateTotalBytes int64 `json:"private_total_stored_data_size"` + CapacityCarryingData humanFloat `json:"capacity_fraction_carrying_data"` } type networkTotals struct { @@ -163,14 +173,18 @@ var storageStatsCmd = &cli.Command{ } netTotals.UniqueClients = len(netTotals.clients) - netTotals.CapacityCarryingData, _ = new(corebig.Rat).SetFrac( + + ccd, _ := new(corebig.Rat).SetFrac( corebig.NewInt(netTotals.TotalBytes), netTotals.RawNetworkPower.Int, ).Float64() - netTotals.FilPlus.CapacityCarryingData, _ = new(corebig.Rat).SetFrac( + netTotals.CapacityCarryingData = humanFloat(ccd) + + ccdfp, _ := new(corebig.Rat).SetFrac( corebig.NewInt(netTotals.FilPlus.TotalBytes), netTotals.RawNetworkPower.Int, ).Float64() + netTotals.FilPlus.CapacityCarryingData = humanFloat(ccdfp) return json.NewEncoder(os.Stdout).Encode( networkTotalsOutput{ From 2b29ceab833795c4610f9100729f375273098b85 Mon Sep 17 00:00:00 2001 From: Aayush Date: Fri, 14 Jan 2022 16:45:48 -0500 Subject: [PATCH 214/393] Use go-libp2p-connmgr v0.3.1 --- go.mod | 2 +- go.sum | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 5e401a3e67e..b5d8bac5574 100644 --- a/go.mod +++ b/go.mod @@ -109,7 +109,7 @@ require ( github.com/libp2p/go-buffer-pool v0.0.2 github.com/libp2p/go-eventbus v0.2.1 github.com/libp2p/go-libp2p v0.17.0 - github.com/libp2p/go-libp2p-connmgr v0.3.0 + github.com/libp2p/go-libp2p-connmgr v0.3.1 github.com/libp2p/go-libp2p-core v0.13.0 github.com/libp2p/go-libp2p-discovery v0.6.0 github.com/libp2p/go-libp2p-kad-dht v0.15.0 diff --git a/go.sum b/go.sum index bf84d7b43e3..882d231ee6e 100644 --- a/go.sum +++ b/go.sum @@ -1025,8 +1025,9 @@ github.com/libp2p/go-libp2p-circuit v0.4.0 h1:eqQ3sEYkGTtybWgr6JLqJY6QLtPWRErvFj github.com/libp2p/go-libp2p-circuit v0.4.0/go.mod h1:t/ktoFIUzM6uLQ+o1G6NuBl2ANhBKN9Bc8jRIk31MoA= 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 h1:yerFXrYa0oxpuVsLlndwm/bLulouHYDcvFrY/4H4fx8= github.com/libp2p/go-libp2p-connmgr v0.3.0/go.mod h1:RVoyPjJm0J9Vd1m6qUN2Tn7kJm4rL1Ml20pFsFgPGik= +github.com/libp2p/go-libp2p-connmgr v0.3.1 h1:alEy2fpGKFu+7ZhQF4GF0dvKLyVHeLtIfS/KziwoiZw= +github.com/libp2p/go-libp2p-connmgr v0.3.1/go.mod h1:RVoyPjJm0J9Vd1m6qUN2Tn7kJm4rL1Ml20pFsFgPGik= github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= 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= From 92d56d82f4cc8d6e148c7d7d2bd10d404f0f7092 Mon Sep 17 00:00:00 2001 From: hannahhoward Date: Fri, 14 Jan 2022 17:04:41 -0800 Subject: [PATCH 215/393] feat(deps): update markets stack update go-fil-markets, go-data-transfer 1.13.0, go-graphsync 0.12.0 --- go.mod | 10 +++++----- go.sum | 38 +++++++++++++++++++----------------- markets/loggers/loggers.go | 2 +- node/modules/client.go | 8 ++------ node/modules/storageminer.go | 10 +++------- 5 files changed, 31 insertions(+), 37 deletions(-) diff --git a/go.mod b/go.mod index b5d8bac5574..680ed0460c8 100644 --- a/go.mod +++ b/go.mod @@ -33,10 +33,10 @@ require ( github.com/filecoin-project/go-cbor-util v0.0.1 github.com/filecoin-project/go-commp-utils v0.1.3 github.com/filecoin-project/go-crypto v0.0.1 - github.com/filecoin-project/go-data-transfer v1.12.1 + github.com/filecoin-project/go-data-transfer v1.13.0 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.14.1 + github.com/filecoin-project/go-fil-markets v1.14.2-0.20220115005823-180ae44bbc36 github.com/filecoin-project/go-jsonrpc v0.1.5 github.com/filecoin-project/go-padreader v0.0.1 github.com/filecoin-project/go-paramfetch v0.0.3-0.20220111000201-e42866db1a53 @@ -78,7 +78,7 @@ require ( github.com/ipfs/go-ds-leveldb v0.5.0 github.com/ipfs/go-ds-measure v0.2.0 github.com/ipfs/go-fs-lock v0.0.6 - github.com/ipfs/go-graphsync v0.11.5 + github.com/ipfs/go-graphsync v0.12.0 github.com/ipfs/go-ipfs-blockstore v1.1.2 github.com/ipfs/go-ipfs-blocksutil v0.0.1 github.com/ipfs/go-ipfs-chunker v0.0.5 @@ -97,12 +97,12 @@ require ( github.com/ipfs/go-metrics-interface v0.0.1 github.com/ipfs/go-metrics-prometheus v0.0.2 github.com/ipfs/go-path v0.0.7 - github.com/ipfs/go-unixfs v0.2.6 + github.com/ipfs/go-unixfs v0.3.1 github.com/ipfs/interface-go-ipfs-core v0.4.0 github.com/ipld/go-car v0.3.3 github.com/ipld/go-car/v2 v2.1.1 github.com/ipld/go-codec-dagpb v1.3.0 - github.com/ipld/go-ipld-prime v0.14.3 + github.com/ipld/go-ipld-prime v0.14.4 github.com/ipld/go-ipld-selector-text-lite v0.0.1 github.com/jonboulle/clockwork v0.2.2 // indirect github.com/kelseyhightower/envconfig v1.4.0 diff --git a/go.sum b/go.sum index 882d231ee6e..9dbd3af8546 100644 --- a/go.sum +++ b/go.sum @@ -94,6 +94,8 @@ github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuy github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= 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/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= @@ -314,19 +316,19 @@ 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-data-transfer v1.12.0/go.mod h1:tDrD2jLU2TpVhd+5B8iqBp0fQRV4lP80WZccKXugjYc= -github.com/filecoin-project/go-data-transfer v1.12.1 h1:gAznAZKySVs2FS6T/vDq7R3f0DewLnxeROe0oOE6bZU= -github.com/filecoin-project/go-data-transfer v1.12.1/go.mod h1:j3HL645YiQFxcM+q7uPlGApILSqeweDABNgZQP7pDYU= -github.com/filecoin-project/go-ds-versioning v0.0.0-20211206185234-508abd7c2aff h1:2bG2ggVZ/rInd/YqUfRj4A5siGuYOPxxuD4I8nYLJF0= +github.com/filecoin-project/go-data-transfer v1.13.0 h1:UqjBfacClqAmnzukek1oPxJXDM3l5UI/WX8CRN2/VkM= +github.com/filecoin-project/go-data-transfer v1.13.0/go.mod h1:TcUtAdQl1ofnLV9oH3gPC93Hjce9yuKnq4O4j2M/BU4= 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-20200716160307-8f644712406f/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commcid v0.1.0 h1:3R4ds1A9r6cr8mvZBfMYxTS88OqLYEo6roi+GiIeOh8= 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.14.1 h1:Bx+TSbkAN8K97Hpjgu+MpeRFbXIKH/fNpNp1ZGAEH3I= -github.com/filecoin-project/go-fil-markets v1.14.1/go.mod h1:vXOHH3q2+zLk929W+lIq3etuDFTyJJ8nG2DwGHG2R1E= +github.com/filecoin-project/go-fil-markets v1.14.2-0.20220115005823-180ae44bbc36 h1:HQlChWK+n/Bm6sXcNh3KOFqPHXKlZ41o3l+bygpHw3Q= +github.com/filecoin-project/go-fil-markets v1.14.2-0.20220115005823-180ae44bbc36/go.mod h1:tKRMkDovSJiUo8yDt6YQM/gHMfNVYya0YTdayGhRnRY= 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= @@ -658,6 +660,8 @@ github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab/go.mod github.com/ipfs/bbloom v0.0.1/go.mod h1:oqo8CVWsJFMOZqTglBG4wydCE4IQA/G2/SEofB0rjUI= github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs= github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0= +github.com/ipfs/go-bitfield v1.0.0 h1:y/XHm2GEmD9wKngheWNNCNL0pzrWXZwCdQGv1ikXknQ= +github.com/ipfs/go-bitfield v1.0.0/go.mod h1:N/UiujQy+K+ceU1EF5EkVd1TNqevLrCQMIcAEPrdtus= 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= @@ -693,7 +697,6 @@ github.com/ipfs/go-datastore v0.4.0/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13X github.com/ipfs/go-datastore v0.4.1/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.4.7-0.20211013204805-28a3721c2e66/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= 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= @@ -721,13 +724,11 @@ github.com/ipfs/go-filestore v1.1.0 h1:Pu4tLBi1bucu6/HU9llaOmb9yLFk/sgP+pW764zND github.com/ipfs/go-filestore v1.1.0/go.mod h1:6e1/5Y6NvLuCRdmda/KA4GUhXJQ3Uat6vcWm2DJfxc8= github.com/ipfs/go-fs-lock v0.0.6 h1:sn3TWwNVQqSeNjlWy6zQ1uUGAZrV3hPOyEA6y1/N2a0= github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28L7zESmM= -github.com/ipfs/go-graphsync v0.11.0/go.mod h1:wC+c8vGVjAHthsVIl8LKr37cUra2GOaMYcQNNmMxDqE= -github.com/ipfs/go-graphsync v0.11.5 h1:WA5hVxGBtcal6L6nqubKiqRolaZxbexOK3GumGFJRR4= -github.com/ipfs/go-graphsync v0.11.5/go.mod h1:+/sZqRwRCQRrV7NCzgBtufmr5QGpUE98XSa7NlsztmM= +github.com/ipfs/go-graphsync v0.12.0 h1:QCsVHVzb9FTkcm3NEa8GjXnUeGit1L9s08HcSVQ4m/g= +github.com/ipfs/go-graphsync v0.12.0/go.mod h1:nASYWYETgsnMbQ3+DirNImOHQ8TY0a5AhAqyOY55tUg= 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.2.1/go.mod h1:jGesd8EtCM3/zPgx+qr0/feTXGUeRai6adgwC+Q+JvE= -github.com/ipfs/go-ipfs-blockstore v1.1.0/go.mod h1:5QDUApRqpgPcfGstCxYeMnjt/DYQtXXdJVCvxHHuWVk= github.com/ipfs/go-ipfs-blockstore v1.1.1/go.mod h1:w51tNR9y5+QXB0wkNcHt4O2aSZjTdqaEWaQdSxEyUOY= github.com/ipfs/go-ipfs-blockstore v1.1.2 h1:WCXoZcMYnvOTmlpX+RSSnhVN0uCmbWTeepTGX5lgiXw= github.com/ipfs/go-ipfs-blockstore v1.1.2/go.mod h1:w51tNR9y5+QXB0wkNcHt4O2aSZjTdqaEWaQdSxEyUOY= @@ -745,7 +746,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= @@ -829,8 +829,10 @@ github.com/ipfs/go-peertaskqueue v0.7.1/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68 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 h1:gq3U3T2vh8x6tXhfo3uSO3n+2z4yW0tYtNgVP/3sIyA= -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.2.0 h1:tHHBJftsJyHGa8bS62PpkYNqHy/Sug3c/vxxC8NaGQY= +github.com/ipfs/go-unixfsnode v1.2.0/go.mod h1:mQEgLjxkV/1mohkC4p7taRRBYPBeXu97SA3YaerT2q0= 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 h1:+mUiamyHIwedqP8ZgbCIwpy40oX7QcXUbo4CZOeJVJg= @@ -854,11 +856,10 @@ 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.3-0.20211207234443-319145880958/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= -github.com/ipld/go-ipld-prime v0.14.3 h1:cGUmxSws2IHurn00/iLMDapeXsnf9+FyAtYVy8G/JsQ= -github.com/ipld/go-ipld-prime v0.14.3/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= +github.com/ipld/go-ipld-prime v0.14.4 h1:bqhmume8+nbNsX4/+J6eohktfZHAI8GKrF3rQ0xgOyc= +github.com/ipld/go-ipld-prime v0.14.4/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= github.com/ipld/go-ipld-prime-proto v0.0.0-20191113031812-e32bd156a1e5/go.mod h1:gcvzoEDBjwycpXt3LBE061wT9f46szXGHAmj9uoP6fU= github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20211210234204-ce2a1c70cd73 h1:TsyATB2ZRRQGTwafJdgEUQkmjOExRV0DNokcihZxbnQ= github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20211210234204-ce2a1c70cd73/go.mod h1:2PJ0JgxyB08t0b2WKrcuqI3di0V+5n6RS/LTUJhkoxY= @@ -1459,8 +1460,9 @@ github.com/multiformats/go-multibase v0.0.3 h1:l/B6bJDQjvQ5G52jw4QGSYeOTZoAwIO77 github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc= 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 h1:ZrUuMKNgJ52qHPoQ+bx0h0uBfcWmN7Px+4uKSZeesiI= 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 h1:VyANTtZ0wsx0IAZnCZhfMmAmfUyzJq/5JQi2hHOtKS0= +github.com/multiformats/go-multicodec v0.3.1-0.20211210143421-a526f306ed2c/go.mod h1:1Hj/eHRaVWSXiSNNfcEPcwZleTmdNP81xlxDLnWU9GQ= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po= github.com/multiformats/go-multihash v0.0.8/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= diff --git a/markets/loggers/loggers.go b/markets/loggers/loggers.go index 2acf987cb13..2d13a64a19d 100644 --- a/markets/loggers/loggers.go +++ b/markets/loggers/loggers.go @@ -40,7 +40,7 @@ func DataTransferLogger(event datatransfer.Event, state datatransfer.ChannelStat "sent", state.Sent(), "received", state.Received(), "queued", state.Queued(), - "received count", state.ReceivedCidsLen(), + "received count", state.ReceivedCidsTotal(), "total size", state.TotalSize(), "remote peer", state.OtherPeer(), "event message", event.Message, diff --git a/node/modules/client.go b/node/modules/client.go index 86063b8d988..48f9dc3d778 100644 --- a/node/modules/client.go +++ b/node/modules/client.go @@ -114,11 +114,7 @@ func NewClientGraphsyncDataTransfer(lc fx.Lifecycle, h host.Host, gs dtypes.Grap net := dtnet.NewFromLibp2pHost(h, dtRetryParams) dtDs := namespace.Wrap(ds, datastore.NewKey("/datatransfer/client/transfers")) - transport := dtgstransport.NewTransport(h.ID(), gs, net) - err := os.MkdirAll(filepath.Join(r.Path(), "data-transfer"), 0755) //nolint: gosec - if err != nil && !os.IsExist(err) { - return nil, err - } + transport := dtgstransport.NewTransport(h.ID(), gs) // data-transfer push / pull channel restart configuration: dtRestartConfig := dtimpl.ChannelRestartConfig(channelmonitor.Config{ @@ -138,7 +134,7 @@ func NewClientGraphsyncDataTransfer(lc fx.Lifecycle, h host.Host, gs dtypes.Grap // After trying to restart 3 times, give up and fail the transfer MaxConsecutiveRestarts: 3, }) - dt, err := dtimpl.NewDataTransfer(dtDs, filepath.Join(r.Path(), "data-transfer"), net, transport, dtRestartConfig) + dt, err := dtimpl.NewDataTransfer(dtDs, net, transport, dtRestartConfig) if err != nil { return nil, err } diff --git a/node/modules/storageminer.go b/node/modules/storageminer.go index 3b86875257f..da1a016f77e 100644 --- a/node/modules/storageminer.go +++ b/node/modules/storageminer.go @@ -341,19 +341,15 @@ func NewProviderTransferNetwork(h host.Host) dtypes.ProviderTransferNetwork { } // NewProviderTransport sets up a data transfer transport over graphsync -func NewProviderTransport(h host.Host, gs dtypes.StagingGraphsync, net dtypes.ProviderTransferNetwork) dtypes.ProviderTransport { - return dtgstransport.NewTransport(h.ID(), gs, net) +func NewProviderTransport(h host.Host, gs dtypes.StagingGraphsync) dtypes.ProviderTransport { + return dtgstransport.NewTransport(h.ID(), gs) } // NewProviderDataTransfer returns a data transfer manager func NewProviderDataTransfer(lc fx.Lifecycle, net dtypes.ProviderTransferNetwork, transport dtypes.ProviderTransport, ds dtypes.MetadataDS, r repo.LockedRepo) (dtypes.ProviderDataTransfer, error) { dtDs := namespace.Wrap(ds, datastore.NewKey("/datatransfer/provider/transfers")) - err := os.MkdirAll(filepath.Join(r.Path(), "data-transfer"), 0755) //nolint: gosec - if err != nil && !os.IsExist(err) { - return nil, err - } - dt, err := dtimpl.NewDataTransfer(dtDs, filepath.Join(r.Path(), "data-transfer"), net, transport) + dt, err := dtimpl.NewDataTransfer(dtDs, net, transport) if err != nil { return nil, err } From 9ec1abf8808422366443e3bea06973a23e644a2c Mon Sep 17 00:00:00 2001 From: Aayush Date: Mon, 17 Jan 2022 16:08:16 -0500 Subject: [PATCH 216/393] :Fix: create a new VM for each epoch --- chain/consensus/filcns/compute_state.go | 56 +++++++++++-------------- chain/consensus/filcns/filecoin.go | 20 +++++---- chain/vm/vm.go | 11 ----- 3 files changed, 38 insertions(+), 49 deletions(-) diff --git a/chain/consensus/filcns/compute_state.go b/chain/consensus/filcns/compute_state.go index 2f8cab7408e..f7f6284d0a0 100644 --- a/chain/consensus/filcns/compute_state.go +++ b/chain/consensus/filcns/compute_state.go @@ -92,16 +92,16 @@ func (t *TipSetExecutor) ApplyBlocks(ctx context.Context, sm *stmgr.StateManager partDone() }() - makeVmWithBaseState := func(base cid.Cid) (*vm.VM, error) { + makeVmWithBaseStateAndEpoch := func(base cid.Cid, e abi.ChainEpoch) (*vm.VM, error) { vmopt := &vm.VMOpts{ StateBase: base, - Epoch: epoch, + Epoch: e, Rand: r, Bstore: sm.ChainStore().StateBlockstore(), Actors: NewActorRegistry(), Syscalls: sm.Syscalls, CircSupplyCalc: sm.GetVMCirculatingSupply, - NetworkVersion: sm.GetNetworkVersion(ctx, epoch), + NetworkVersion: sm.GetNetworkVersion(ctx, e), BaseFee: baseFee, LookbackState: stmgr.LookbackStateGetterForTipset(sm, ts), } @@ -109,12 +109,7 @@ func (t *TipSetExecutor) ApplyBlocks(ctx context.Context, sm *stmgr.StateManager return sm.VMConstructor()(ctx, vmopt) } - vmi, err := makeVmWithBaseState(pstate) - if err != nil { - return cid.Undef, cid.Undef, xerrors.Errorf("making vm: %w", err) - } - - runCron := func(epoch abi.ChainEpoch) error { + runCron := func(vmCron *vm.VM, epoch abi.ChainEpoch) error { cronMsg := &types.Message{ To: cron.Address, From: builtin.SystemActorAddr, @@ -126,59 +121,58 @@ func (t *TipSetExecutor) ApplyBlocks(ctx context.Context, sm *stmgr.StateManager Method: cron.Methods.EpochTick, Params: nil, } - ret, err := vmi.ApplyImplicitMessage(ctx, cronMsg) + ret, err := vmCron.ApplyImplicitMessage(ctx, cronMsg) if err != nil { - return err + return xerrors.Errorf("running cron: %w", err) } + if em != nil { if err := em.MessageApplied(ctx, ts, cronMsg.Cid(), cronMsg, ret, true); err != nil { return xerrors.Errorf("callback failed on cron message: %w", err) } } if ret.ExitCode != 0 { - return xerrors.Errorf("CheckProofSubmissions exit was non-zero: %d", ret.ExitCode) + return xerrors.Errorf("cron exit was non-zero: %d", ret.ExitCode) } return nil } for i := parentEpoch; i < epoch; i++ { + var err error if i > parentEpoch { + vmCron, err := makeVmWithBaseStateAndEpoch(pstate, i) + if err != nil { + return cid.Undef, cid.Undef, xerrors.Errorf("making cron vm: %w", err) + } + // run cron for null rounds if any - if err := runCron(i); err != nil { - return cid.Undef, cid.Undef, err + if err = runCron(vmCron, i); err != nil { + return cid.Undef, cid.Undef, xerrors.Errorf("running cron: %w", err) } - pstate, err = vmi.Flush(ctx) + pstate, err = vmCron.Flush(ctx) if err != nil { - return cid.Undef, cid.Undef, xerrors.Errorf("flushing vm: %w", err) + return cid.Undef, cid.Undef, xerrors.Errorf("flushing cron vm: %w", err) } } // handle state forks // XXX: The state tree - newState, err := sm.HandleStateForks(ctx, pstate, i, em, ts) + pstate, err = sm.HandleStateForks(ctx, pstate, i, em, ts) if err != nil { return cid.Undef, cid.Undef, xerrors.Errorf("error handling state forks: %w", err) } - - if pstate != newState { - vmi, err = makeVmWithBaseState(newState) - if err != nil { - return cid.Undef, cid.Undef, xerrors.Errorf("making vm: %w", err) - } - } - - if err = vmi.SetBlockHeight(ctx, i+1); err != nil { - return cid.Undef, cid.Undef, xerrors.Errorf("error advancing vm an epoch: %w", err) - } - - pstate = newState } partDone() partDone = metrics.Timer(ctx, metrics.VMApplyMessages) + vmi, err := makeVmWithBaseStateAndEpoch(pstate, epoch) + if err != nil { + return cid.Undef, cid.Undef, xerrors.Errorf("making vm: %w", err) + } + var receipts []cbg.CBORMarshaler processedMsgs := make(map[cid.Cid]struct{}) for _, b := range bms { @@ -246,7 +240,7 @@ func (t *TipSetExecutor) ApplyBlocks(ctx context.Context, sm *stmgr.StateManager partDone() partDone = metrics.Timer(ctx, metrics.VMApplyCron) - if err := runCron(epoch); err != nil { + if err := runCron(vmi, epoch); err != nil { return cid.Cid{}, cid.Cid{}, err } diff --git a/chain/consensus/filcns/filecoin.go b/chain/consensus/filcns/filecoin.go index 42020d529d9..be7628b4f0b 100644 --- a/chain/consensus/filcns/filecoin.go +++ b/chain/consensus/filcns/filecoin.go @@ -458,7 +458,7 @@ func (filec *FilecoinEC) checkBlockMessages(ctx context.Context, b *types.FullBl stateroot, _, err := filec.sm.TipSetState(ctx, baseTs) if err != nil { - return err + return xerrors.Errorf("failed to compute tipsettate for %s: %w", baseTs.Key(), err) } st, err := state.LoadStateTree(filec.store.ActorStore(ctx), stateroot) @@ -475,7 +475,7 @@ func (filec *FilecoinEC) checkBlockMessages(ctx context.Context, b *types.FullBl // Phase 1: syntactic validation, as defined in the spec minGas := pl.OnChainMessage(msg.ChainLength()) if err := m.ValidForBlockInclusion(minGas.Total(), nv); err != nil { - return err + return xerrors.Errorf("msg %s invalid for block inclusion: %w", m.Cid(), err) } // ValidForBlockInclusion checks if any single message does not exceed BlockGasLimit @@ -491,7 +491,7 @@ func (filec *FilecoinEC) checkBlockMessages(ctx context.Context, b *types.FullBl if filec.sm.GetNetworkVersion(ctx, b.Header.Height) >= network.Version13 { sender, err = st.LookupID(m.From) if err != nil { - return err + return xerrors.Errorf("failed to lookup sender %s: %w", m.From, err) } } else { sender = m.From @@ -574,12 +574,13 @@ func (filec *FilecoinEC) checkBlockMessages(ctx context.Context, b *types.FullBl bmroot, err := bmArr.Root() if err != nil { - return err + return xerrors.Errorf("failed to root bls msgs: %w", err) + } smroot, err := smArr.Root() if err != nil { - return err + return xerrors.Errorf("failed to root secp msgs: %w", err) } mrcid, err := tmpstore.Put(ctx, &types.MsgMeta{ @@ -587,7 +588,7 @@ func (filec *FilecoinEC) checkBlockMessages(ctx context.Context, b *types.FullBl SecpkMessages: smroot, }) if err != nil { - return err + return xerrors.Errorf("failed to put msg meta: %w", err) } if b.Header.Messages != mrcid { @@ -595,7 +596,12 @@ func (filec *FilecoinEC) checkBlockMessages(ctx context.Context, b *types.FullBl } // Finally, flush. - return vm.Copy(ctx, tmpbs, filec.store.ChainBlockstore(), mrcid) + err = vm.Copy(ctx, tmpbs, filec.store.ChainBlockstore(), mrcid) + if err != nil { + return xerrors.Errorf("failed to flush:%w", err) + } + + return nil } func (filec *FilecoinEC) IsEpochBeyondCurrMax(epoch abi.ChainEpoch) bool { diff --git a/chain/vm/vm.go b/chain/vm/vm.go index 703a19880ea..1ab97bc33f8 100644 --- a/chain/vm/vm.go +++ b/chain/vm/vm.go @@ -824,17 +824,6 @@ func (vm *VM) StateTree() types.StateTree { return vm.cstate } -func (vm *VM) SetBlockHeight(ctx context.Context, h abi.ChainEpoch) error { - vm.blockHeight = h - ncirc, err := vm.circSupplyCalc(ctx, vm.blockHeight, vm.cstate) - if err != nil { - return err - } - - vm.baseCircSupply = ncirc - return nil -} - func (vm *VM) Invoke(act *types.Actor, rt *Runtime, method abi.MethodNum, params []byte) ([]byte, aerrors.ActorError) { ctx, span := trace.StartSpan(rt.ctx, "vm.Invoke") defer span.End() From d6778263123be5e265085ff4d7e010f234f6112e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 18 Jan 2022 10:24:43 +0100 Subject: [PATCH 217/393] Cleanup go.mod --- go.mod | 4 ---- 1 file changed, 4 deletions(-) diff --git a/go.mod b/go.mod index b5d8bac5574..34a5f1498b0 100644 --- a/go.mod +++ b/go.mod @@ -173,7 +173,3 @@ require ( replace github.com/filecoin-project/filecoin-ffi => ./extern/filecoin-ffi replace github.com/filecoin-project/test-vectors => ./extern/test-vectors - -//replace github.com/filecoin-project/specs-actors/v7 => /Users/zenground0/pl/repos/specs-actors - -// replace github.com/filecon-project/specs-storage => /Users/zenground0/pl/repos/specs-storage From 1ce1dbbc5007d2236152f352eade7c11c47b1b14 Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Tue, 18 Jan 2022 14:29:59 +0100 Subject: [PATCH 218/393] feat: update go-fil-markets to tagged release --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 680ed0460c8..639f875047c 100644 --- a/go.mod +++ b/go.mod @@ -36,7 +36,7 @@ require ( github.com/filecoin-project/go-data-transfer v1.13.0 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.14.2-0.20220115005823-180ae44bbc36 + github.com/filecoin-project/go-fil-markets v1.17.0 github.com/filecoin-project/go-jsonrpc v0.1.5 github.com/filecoin-project/go-padreader v0.0.1 github.com/filecoin-project/go-paramfetch v0.0.3-0.20220111000201-e42866db1a53 diff --git a/go.sum b/go.sum index 9dbd3af8546..8bcda41ef84 100644 --- a/go.sum +++ b/go.sum @@ -327,8 +327,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.14.2-0.20220115005823-180ae44bbc36 h1:HQlChWK+n/Bm6sXcNh3KOFqPHXKlZ41o3l+bygpHw3Q= -github.com/filecoin-project/go-fil-markets v1.14.2-0.20220115005823-180ae44bbc36/go.mod h1:tKRMkDovSJiUo8yDt6YQM/gHMfNVYya0YTdayGhRnRY= +github.com/filecoin-project/go-fil-markets v1.17.0 h1:i9U6hZ+peri6Ygfwoda0YBk4bo1SHkd58EPBRgXCRlQ= +github.com/filecoin-project/go-fil-markets v1.17.0/go.mod h1:tKRMkDovSJiUo8yDt6YQM/gHMfNVYya0YTdayGhRnRY= 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= From c41ccb6c374ef8872d8c7d54c98633eb99bdae84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 19 Jan 2022 10:46:37 +0100 Subject: [PATCH 219/393] chore: remove inaccurate comment in sealtasks --- extern/sector-storage/sealtasks/task.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extern/sector-storage/sealtasks/task.go b/extern/sector-storage/sealtasks/task.go index f6104878b21..8b91d5b291d 100644 --- a/extern/sector-storage/sealtasks/task.go +++ b/extern/sector-storage/sealtasks/task.go @@ -6,7 +6,7 @@ const ( TTAddPiece TaskType = "seal/v0/addpiece" TTPreCommit1 TaskType = "seal/v0/precommit/1" TTPreCommit2 TaskType = "seal/v0/precommit/2" - TTCommit1 TaskType = "seal/v0/commit/1" // NOTE: We use this to transfer the sector into miner-local storage for now; Don't use on workers! + TTCommit1 TaskType = "seal/v0/commit/1" TTCommit2 TaskType = "seal/v0/commit/2" TTFinalize TaskType = "seal/v0/finalize" From d0390181ec67ac606c59a2cb71ce57b85a762a33 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 18 Jan 2022 10:39:02 -0500 Subject: [PATCH 220/393] feat: sealing: Add ReplicaUpdate work to Resource table --- documentation/en/api-v0-methods-miner.md | 328 +++++++++++++++++++ documentation/en/api-v0-methods-worker.md | 328 +++++++++++++++++++ extern/sector-storage/storiface/resources.go | 136 ++++++++ 3 files changed, 792 insertions(+) diff --git a/documentation/en/api-v0-methods-miner.md b/documentation/en/api-v0-methods-miner.md index caf0419fe9c..437473f3c57 100644 --- a/documentation/en/api-v0-methods-miner.md +++ b/documentation/en/api-v0-methods-miner.md @@ -3768,6 +3768,334 @@ Response: "BaseMinMemory": 1073741824 } }, + "seal/v0/provereplicaupdate/1": { + "0": { + "MinMemory": 2048, + "MaxMemory": 2048, + "GPUUtilization": 0, + "MaxParallelism": 0, + "MaxParallelismGPU": 0, + "BaseMinMemory": 2048 + }, + "1": { + "MinMemory": 8388608, + "MaxMemory": 8388608, + "GPUUtilization": 0, + "MaxParallelism": 0, + "MaxParallelismGPU": 0, + "BaseMinMemory": 8388608 + }, + "2": { + "MinMemory": 1073741824, + "MaxMemory": 1073741824, + "GPUUtilization": 0, + "MaxParallelism": 0, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + }, + "3": { + "MinMemory": 1073741824, + "MaxMemory": 1073741824, + "GPUUtilization": 0, + "MaxParallelism": 0, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + }, + "4": { + "MinMemory": 1073741824, + "MaxMemory": 1073741824, + "GPUUtilization": 0, + "MaxParallelism": 0, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + }, + "5": { + "MinMemory": 2048, + "MaxMemory": 2048, + "GPUUtilization": 0, + "MaxParallelism": 0, + "MaxParallelismGPU": 0, + "BaseMinMemory": 2048 + }, + "6": { + "MinMemory": 8388608, + "MaxMemory": 8388608, + "GPUUtilization": 0, + "MaxParallelism": 0, + "MaxParallelismGPU": 0, + "BaseMinMemory": 8388608 + }, + "7": { + "MinMemory": 1073741824, + "MaxMemory": 1073741824, + "GPUUtilization": 0, + "MaxParallelism": 0, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + }, + "8": { + "MinMemory": 1073741824, + "MaxMemory": 1073741824, + "GPUUtilization": 0, + "MaxParallelism": 0, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + }, + "9": { + "MinMemory": 1073741824, + "MaxMemory": 1073741824, + "GPUUtilization": 0, + "MaxParallelism": 0, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + } + }, + "seal/v0/provereplicaupdate/2": { + "0": { + "MinMemory": 2048, + "MaxMemory": 2048, + "GPUUtilization": 1, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 2048 + }, + "1": { + "MinMemory": 8388608, + "MaxMemory": 8388608, + "GPUUtilization": 1, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 8388608 + }, + "2": { + "MinMemory": 1073741824, + "MaxMemory": 1610612736, + "GPUUtilization": 1, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 10737418240 + }, + "3": { + "MinMemory": 32212254720, + "MaxMemory": 161061273600, + "GPUUtilization": 1, + "MaxParallelism": -1, + "MaxParallelismGPU": 6, + "BaseMinMemory": 34359738368 + }, + "4": { + "MinMemory": 64424509440, + "MaxMemory": 204010946560, + "GPUUtilization": 1, + "MaxParallelism": -1, + "MaxParallelismGPU": 6, + "BaseMinMemory": 68719476736 + }, + "5": { + "MinMemory": 2048, + "MaxMemory": 2048, + "GPUUtilization": 1, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 2048 + }, + "6": { + "MinMemory": 8388608, + "MaxMemory": 8388608, + "GPUUtilization": 1, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 8388608 + }, + "7": { + "MinMemory": 1073741824, + "MaxMemory": 1610612736, + "GPUUtilization": 1, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 10737418240 + }, + "8": { + "MinMemory": 32212254720, + "MaxMemory": 161061273600, + "GPUUtilization": 1, + "MaxParallelism": -1, + "MaxParallelismGPU": 6, + "BaseMinMemory": 34359738368 + }, + "9": { + "MinMemory": 64424509440, + "MaxMemory": 204010946560, + "GPUUtilization": 1, + "MaxParallelism": -1, + "MaxParallelismGPU": 6, + "BaseMinMemory": 68719476736 + } + }, + "seal/v0/regensectorkey": { + "0": { + "MinMemory": 2048, + "MaxMemory": 2048, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 2048 + }, + "1": { + "MinMemory": 8388608, + "MaxMemory": 8388608, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 8388608 + }, + "2": { + "MinMemory": 1073741824, + "MaxMemory": 1073741824, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + }, + "3": { + "MinMemory": 4294967296, + "MaxMemory": 4294967296, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + }, + "4": { + "MinMemory": 8589934592, + "MaxMemory": 8589934592, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + }, + "5": { + "MinMemory": 2048, + "MaxMemory": 2048, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 2048 + }, + "6": { + "MinMemory": 8388608, + "MaxMemory": 8388608, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 8388608 + }, + "7": { + "MinMemory": 1073741824, + "MaxMemory": 1073741824, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + }, + "8": { + "MinMemory": 4294967296, + "MaxMemory": 4294967296, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + }, + "9": { + "MinMemory": 8589934592, + "MaxMemory": 8589934592, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + } + }, + "seal/v0/replicaupdate": { + "0": { + "MinMemory": 2048, + "MaxMemory": 2048, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 2048 + }, + "1": { + "MinMemory": 8388608, + "MaxMemory": 8388608, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 8388608 + }, + "2": { + "MinMemory": 1073741824, + "MaxMemory": 1073741824, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + }, + "3": { + "MinMemory": 4294967296, + "MaxMemory": 4294967296, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + }, + "4": { + "MinMemory": 8589934592, + "MaxMemory": 8589934592, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + }, + "5": { + "MinMemory": 2048, + "MaxMemory": 2048, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 2048 + }, + "6": { + "MinMemory": 8388608, + "MaxMemory": 8388608, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 8388608 + }, + "7": { + "MinMemory": 1073741824, + "MaxMemory": 1073741824, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + }, + "8": { + "MinMemory": 4294967296, + "MaxMemory": 4294967296, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + }, + "9": { + "MinMemory": 8589934592, + "MaxMemory": 8589934592, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + } + }, "seal/v0/unseal": { "0": { "MinMemory": 2048, diff --git a/documentation/en/api-v0-methods-worker.md b/documentation/en/api-v0-methods-worker.md index f2d9019e2b5..959265a4def 100644 --- a/documentation/en/api-v0-methods-worker.md +++ b/documentation/en/api-v0-methods-worker.md @@ -599,6 +599,334 @@ Response: "BaseMinMemory": 1073741824 } }, + "seal/v0/provereplicaupdate/1": { + "0": { + "MinMemory": 2048, + "MaxMemory": 2048, + "GPUUtilization": 0, + "MaxParallelism": 0, + "MaxParallelismGPU": 0, + "BaseMinMemory": 2048 + }, + "1": { + "MinMemory": 8388608, + "MaxMemory": 8388608, + "GPUUtilization": 0, + "MaxParallelism": 0, + "MaxParallelismGPU": 0, + "BaseMinMemory": 8388608 + }, + "2": { + "MinMemory": 1073741824, + "MaxMemory": 1073741824, + "GPUUtilization": 0, + "MaxParallelism": 0, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + }, + "3": { + "MinMemory": 1073741824, + "MaxMemory": 1073741824, + "GPUUtilization": 0, + "MaxParallelism": 0, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + }, + "4": { + "MinMemory": 1073741824, + "MaxMemory": 1073741824, + "GPUUtilization": 0, + "MaxParallelism": 0, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + }, + "5": { + "MinMemory": 2048, + "MaxMemory": 2048, + "GPUUtilization": 0, + "MaxParallelism": 0, + "MaxParallelismGPU": 0, + "BaseMinMemory": 2048 + }, + "6": { + "MinMemory": 8388608, + "MaxMemory": 8388608, + "GPUUtilization": 0, + "MaxParallelism": 0, + "MaxParallelismGPU": 0, + "BaseMinMemory": 8388608 + }, + "7": { + "MinMemory": 1073741824, + "MaxMemory": 1073741824, + "GPUUtilization": 0, + "MaxParallelism": 0, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + }, + "8": { + "MinMemory": 1073741824, + "MaxMemory": 1073741824, + "GPUUtilization": 0, + "MaxParallelism": 0, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + }, + "9": { + "MinMemory": 1073741824, + "MaxMemory": 1073741824, + "GPUUtilization": 0, + "MaxParallelism": 0, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + } + }, + "seal/v0/provereplicaupdate/2": { + "0": { + "MinMemory": 2048, + "MaxMemory": 2048, + "GPUUtilization": 1, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 2048 + }, + "1": { + "MinMemory": 8388608, + "MaxMemory": 8388608, + "GPUUtilization": 1, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 8388608 + }, + "2": { + "MinMemory": 1073741824, + "MaxMemory": 1610612736, + "GPUUtilization": 1, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 10737418240 + }, + "3": { + "MinMemory": 32212254720, + "MaxMemory": 161061273600, + "GPUUtilization": 1, + "MaxParallelism": -1, + "MaxParallelismGPU": 6, + "BaseMinMemory": 34359738368 + }, + "4": { + "MinMemory": 64424509440, + "MaxMemory": 204010946560, + "GPUUtilization": 1, + "MaxParallelism": -1, + "MaxParallelismGPU": 6, + "BaseMinMemory": 68719476736 + }, + "5": { + "MinMemory": 2048, + "MaxMemory": 2048, + "GPUUtilization": 1, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 2048 + }, + "6": { + "MinMemory": 8388608, + "MaxMemory": 8388608, + "GPUUtilization": 1, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 8388608 + }, + "7": { + "MinMemory": 1073741824, + "MaxMemory": 1610612736, + "GPUUtilization": 1, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 10737418240 + }, + "8": { + "MinMemory": 32212254720, + "MaxMemory": 161061273600, + "GPUUtilization": 1, + "MaxParallelism": -1, + "MaxParallelismGPU": 6, + "BaseMinMemory": 34359738368 + }, + "9": { + "MinMemory": 64424509440, + "MaxMemory": 204010946560, + "GPUUtilization": 1, + "MaxParallelism": -1, + "MaxParallelismGPU": 6, + "BaseMinMemory": 68719476736 + } + }, + "seal/v0/regensectorkey": { + "0": { + "MinMemory": 2048, + "MaxMemory": 2048, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 2048 + }, + "1": { + "MinMemory": 8388608, + "MaxMemory": 8388608, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 8388608 + }, + "2": { + "MinMemory": 1073741824, + "MaxMemory": 1073741824, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + }, + "3": { + "MinMemory": 4294967296, + "MaxMemory": 4294967296, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + }, + "4": { + "MinMemory": 8589934592, + "MaxMemory": 8589934592, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + }, + "5": { + "MinMemory": 2048, + "MaxMemory": 2048, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 2048 + }, + "6": { + "MinMemory": 8388608, + "MaxMemory": 8388608, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 8388608 + }, + "7": { + "MinMemory": 1073741824, + "MaxMemory": 1073741824, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + }, + "8": { + "MinMemory": 4294967296, + "MaxMemory": 4294967296, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + }, + "9": { + "MinMemory": 8589934592, + "MaxMemory": 8589934592, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + } + }, + "seal/v0/replicaupdate": { + "0": { + "MinMemory": 2048, + "MaxMemory": 2048, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 2048 + }, + "1": { + "MinMemory": 8388608, + "MaxMemory": 8388608, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 8388608 + }, + "2": { + "MinMemory": 1073741824, + "MaxMemory": 1073741824, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + }, + "3": { + "MinMemory": 4294967296, + "MaxMemory": 4294967296, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + }, + "4": { + "MinMemory": 8589934592, + "MaxMemory": 8589934592, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + }, + "5": { + "MinMemory": 2048, + "MaxMemory": 2048, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 2048 + }, + "6": { + "MinMemory": 8388608, + "MaxMemory": 8388608, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 8388608 + }, + "7": { + "MinMemory": 1073741824, + "MaxMemory": 1073741824, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + }, + "8": { + "MinMemory": 4294967296, + "MaxMemory": 4294967296, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + }, + "9": { + "MinMemory": 8589934592, + "MaxMemory": 8589934592, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + } + }, "seal/v0/unseal": { "0": { "MinMemory": 2048, diff --git a/extern/sector-storage/storiface/resources.go b/extern/sector-storage/storiface/resources.go index b5f45d722c9..51bb68574cf 100644 --- a/extern/sector-storage/storiface/resources.go +++ b/extern/sector-storage/storiface/resources.go @@ -331,10 +331,146 @@ var ResourceTable = map[sealtasks.TaskType]map[abi.RegisteredSealProof]Resources BaseMinMemory: 0, }, }, + // TODO: this should ideally be the actual replica update proof types + // TODO: actually measure this (and all the other replica update work) + sealtasks.TTReplicaUpdate: { // copied from addpiece + abi.RegisteredSealProof_StackedDrg64GiBV1: Resources{ + MaxMemory: 8 << 30, + MinMemory: 8 << 30, + + MaxParallelism: 1, + + BaseMinMemory: 1 << 30, + }, + abi.RegisteredSealProof_StackedDrg32GiBV1: Resources{ + MaxMemory: 4 << 30, + MinMemory: 4 << 30, + + MaxParallelism: 1, + + BaseMinMemory: 1 << 30, + }, + abi.RegisteredSealProof_StackedDrg512MiBV1: Resources{ + MaxMemory: 1 << 30, + MinMemory: 1 << 30, + + MaxParallelism: 1, + + BaseMinMemory: 1 << 30, + }, + abi.RegisteredSealProof_StackedDrg2KiBV1: Resources{ + MaxMemory: 2 << 10, + MinMemory: 2 << 10, + + MaxParallelism: 1, + + BaseMinMemory: 2 << 10, + }, + abi.RegisteredSealProof_StackedDrg8MiBV1: Resources{ + MaxMemory: 8 << 20, + MinMemory: 8 << 20, + + MaxParallelism: 1, + + BaseMinMemory: 8 << 20, + }, + }, + sealtasks.TTProveReplicaUpdate1: { // copied from commit1 + abi.RegisteredSealProof_StackedDrg64GiBV1: Resources{ + MaxMemory: 1 << 30, + MinMemory: 1 << 30, + + MaxParallelism: 0, + + BaseMinMemory: 1 << 30, + }, + abi.RegisteredSealProof_StackedDrg32GiBV1: Resources{ + MaxMemory: 1 << 30, + MinMemory: 1 << 30, + + MaxParallelism: 0, + + BaseMinMemory: 1 << 30, + }, + abi.RegisteredSealProof_StackedDrg512MiBV1: Resources{ + MaxMemory: 1 << 30, + MinMemory: 1 << 30, + + MaxParallelism: 0, + + BaseMinMemory: 1 << 30, + }, + abi.RegisteredSealProof_StackedDrg2KiBV1: Resources{ + MaxMemory: 2 << 10, + MinMemory: 2 << 10, + + MaxParallelism: 0, + + BaseMinMemory: 2 << 10, + }, + abi.RegisteredSealProof_StackedDrg8MiBV1: Resources{ + MaxMemory: 8 << 20, + MinMemory: 8 << 20, + + MaxParallelism: 0, + + BaseMinMemory: 8 << 20, + }, + }, + sealtasks.TTProveReplicaUpdate2: { // copied from commit2 + abi.RegisteredSealProof_StackedDrg64GiBV1: Resources{ + MaxMemory: 190 << 30, // TODO: Confirm + MinMemory: 60 << 30, + + MaxParallelism: -1, + MaxParallelismGPU: 6, + GPUUtilization: 1.0, + + BaseMinMemory: 64 << 30, // params + }, + abi.RegisteredSealProof_StackedDrg32GiBV1: Resources{ + MaxMemory: 150 << 30, // TODO: ~30G of this should really be BaseMaxMemory + MinMemory: 30 << 30, + + MaxParallelism: -1, + MaxParallelismGPU: 6, + GPUUtilization: 1.0, + + BaseMinMemory: 32 << 30, // params + }, + abi.RegisteredSealProof_StackedDrg512MiBV1: Resources{ + MaxMemory: 3 << 29, // 1.5G + MinMemory: 1 << 30, + + MaxParallelism: 1, // This is fine + GPUUtilization: 1.0, + + BaseMinMemory: 10 << 30, + }, + abi.RegisteredSealProof_StackedDrg2KiBV1: Resources{ + MaxMemory: 2 << 10, + MinMemory: 2 << 10, + + MaxParallelism: 1, + GPUUtilization: 1.0, + + BaseMinMemory: 2 << 10, + }, + abi.RegisteredSealProof_StackedDrg8MiBV1: Resources{ + MaxMemory: 8 << 20, + MinMemory: 8 << 20, + + MaxParallelism: 1, + GPUUtilization: 1.0, + + BaseMinMemory: 8 << 20, + }, + }, } func init() { ResourceTable[sealtasks.TTUnseal] = ResourceTable[sealtasks.TTPreCommit1] // TODO: measure accurately + ResourceTable[sealtasks.TTRegenSectorKey] = ResourceTable[sealtasks.TTReplicaUpdate] // V1_1 is the same as V1 for _, m := range ResourceTable { From ab8bf393c237262e4785af22a398fe94dff23e70 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 18 Jan 2022 16:35:07 -0500 Subject: [PATCH 221/393] create replica update paths in acquireSectors --- extern/sector-storage/ffiwrapper/basicfs/fs.go | 6 ++++++ extern/sector-storage/ffiwrapper/sealer_cgo.go | 4 ++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/extern/sector-storage/ffiwrapper/basicfs/fs.go b/extern/sector-storage/ffiwrapper/basicfs/fs.go index a833f728cd0..3d19e49ef82 100644 --- a/extern/sector-storage/ffiwrapper/basicfs/fs.go +++ b/extern/sector-storage/ffiwrapper/basicfs/fs.go @@ -34,6 +34,12 @@ func (b *Provider) AcquireSector(ctx context.Context, id storage.SectorRef, exis if err := os.Mkdir(filepath.Join(b.Root, storiface.FTCache.String()), 0755); err != nil && !os.IsExist(err) { // nolint return storiface.SectorPaths{}, nil, err } + if err := os.Mkdir(filepath.Join(b.Root, storiface.FTUpdate.String()), 0755); err != nil && !os.IsExist(err) { // nolint + return storiface.SectorPaths{}, nil, err + } + if err := os.Mkdir(filepath.Join(b.Root, storiface.FTUpdateCache.String()), 0755); err != nil && !os.IsExist(err) { // nolint + return storiface.SectorPaths{}, nil, err + } done := func() {} diff --git a/extern/sector-storage/ffiwrapper/sealer_cgo.go b/extern/sector-storage/ffiwrapper/sealer_cgo.go index e3939d3d10f..88ab50f0504 100644 --- a/extern/sector-storage/ffiwrapper/sealer_cgo.go +++ b/extern/sector-storage/ffiwrapper/sealer_cgo.go @@ -697,10 +697,10 @@ func (sb *Sealer) ReplicaUpdate(ctx context.Context, sector storage.SectorRef, p if err := os.Mkdir(paths.UpdateCache, 0755); err != nil { // nolint if os.IsExist(err) { - log.Warnf("existing cache in %s; removing", paths.Cache) + log.Warnf("existing cache in %s; removing", paths.UpdateCache) if err := os.RemoveAll(paths.UpdateCache); err != nil { - return empty, xerrors.Errorf("remove existing sector cache from %s (sector %d): %w", paths.Cache, sector, err) + return empty, xerrors.Errorf("remove existing sector cache from %s (sector %d): %w", paths.UpdateCache, sector, err) } if err := os.Mkdir(paths.UpdateCache, 0755); err != nil { // nolint:gosec From 3ff23ecbfab79c08c6c48ee43e66e1651420c3f4 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 18 Jan 2022 18:54:33 -0500 Subject: [PATCH 222/393] :fix: checkReplica incorrectly returns ErrBadPR --- build/openrpc/miner.json.gz | Bin 12680 -> 12787 bytes build/openrpc/worker.json.gz | Bin 3803 -> 3918 bytes extern/storage-sealing/checks.go | 2 +- extern/storage-sealing/states_failed.go | 2 +- 4 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index 8e34e9de7477a8ec0e2d360d581d3a68d8cdb762..0c3eef45d2660c0ac839ba80b59ab2b2b55f3ab3 100644 GIT binary patch delta 319 zcmV-F0l@xap9JI2q0oVLW>Gn)%Up&<9nNoYER8hXRXG+g~rX&%p z?fKIFIPTl?rS^QOJzsh`=SvQnBjWN1`a85~9k2Tm#@B|JZr6hS?p?2Ki0QtDn8u9P zR-*0;)wU9~m8h*m{VpZynz&wd|5lVf_t|S370^Zn6bRBbDqw$~q5__nBz;fd)C$wU zyE3;Pksyr1xq|NOXGi(o3fqn+@-x%VJH?zc<@YY(PMJZONpw49)i=(qHTer#G}VaUmd zHW@;(*JWme$ET^x$49TFdKtr5l$}!Msvl-oqOodPY9z8xF*i##oX;HMYlbcpETp&` zF^-iGVuafj^M+##U;Y~|5tKeFGgg&Y@@h}w@}~q1aq+dwY7+YzzCD;|Pfxc`|33f# N|NqR!W#ffe0s!emXw(1z diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index 3715754a2f7550af5b97187cec88804d9fe60f95..b940feca71098909be807a47d9ff170043fd2d9e 100644 GIT binary patch literal 3918 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 literal 3803 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 Date: Tue, 18 Jan 2022 14:19:30 +0200 Subject: [PATCH 223/393] go mod: go-libp2p@v0.18.0-rc1 --- go.mod | 16 +++++++-------- go.sum | 63 ++++++++++++++++++++++++++++++++++++++-------------------- 2 files changed, 50 insertions(+), 29 deletions(-) diff --git a/go.mod b/go.mod index 0e527d8bdc3..de4f05fab0a 100644 --- a/go.mod +++ b/go.mod @@ -92,7 +92,7 @@ require ( github.com/ipfs/go-ipld-cbor v0.0.6 github.com/ipfs/go-ipld-format v0.2.0 github.com/ipfs/go-ipld-legacy v0.1.1 // indirect - github.com/ipfs/go-log/v2 v2.4.0 + github.com/ipfs/go-log/v2 v2.5.0 github.com/ipfs/go-merkledag v0.5.1 github.com/ipfs/go-metrics-interface v0.0.1 github.com/ipfs/go-metrics-prometheus v0.0.2 @@ -108,26 +108,26 @@ require ( github.com/kelseyhightower/envconfig v1.4.0 github.com/libp2p/go-buffer-pool v0.0.2 github.com/libp2p/go-eventbus v0.2.1 - github.com/libp2p/go-libp2p v0.17.0 - github.com/libp2p/go-libp2p-connmgr v0.3.1 - github.com/libp2p/go-libp2p-core v0.13.0 + github.com/libp2p/go-libp2p v0.18.0-rc1 + github.com/libp2p/go-libp2p-connmgr v0.3.1 // indirect + github.com/libp2p/go-libp2p-core v0.14.0 github.com/libp2p/go-libp2p-discovery v0.6.0 github.com/libp2p/go-libp2p-kad-dht v0.15.0 github.com/libp2p/go-libp2p-noise v0.3.0 github.com/libp2p/go-libp2p-peerstore v0.6.0 github.com/libp2p/go-libp2p-pubsub v0.6.0 - github.com/libp2p/go-libp2p-quic-transport v0.15.2 + github.com/libp2p/go-libp2p-quic-transport v0.16.0 github.com/libp2p/go-libp2p-record v0.1.3 github.com/libp2p/go-libp2p-routing-helpers v0.2.3 - github.com/libp2p/go-libp2p-swarm v0.9.0 + github.com/libp2p/go-libp2p-swarm v0.10.0 github.com/libp2p/go-libp2p-tls v0.3.1 - github.com/libp2p/go-libp2p-yamux v0.7.0 + github.com/libp2p/go-libp2p-yamux v0.8.0 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.4.1 + github.com/multiformats/go-multiaddr v0.5.0 github.com/multiformats/go-multiaddr-dns v0.3.1 github.com/multiformats/go-multibase v0.0.3 github.com/multiformats/go-multihash v0.1.0 diff --git a/go.sum b/go.sum index 8bcda41ef84..d81393867f6 100644 --- a/go.sum +++ b/go.sum @@ -807,8 +807,9 @@ github.com/ipfs/go-log/v2 v2.1.2-0.20200626104915-0016c0b4b3e4/go.mod h1:2v2nsGf github.com/ipfs/go-log/v2 v2.1.2/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHntrv9KM= 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 h1:iR/2o9PGWanVJrBgIH5Ff8mPGOwpqLaPIAFqSnsdlzk= github.com/ipfs/go-log/v2 v2.4.0/go.mod h1:nPZnh7Cj7lwS3LpRU5Mwr2ol1c2gXIEXuF6aywqrtmo= +github.com/ipfs/go-log/v2 v2.5.0 h1:+MhAooFd9XZNvR0i9FriKW6HB0ql7HNXUuflWtc0dd4= +github.com/ipfs/go-log/v2 v2.5.0/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI= github.com/ipfs/go-merkledag v0.0.6/go.mod h1:QYPdnlvkOg7GnQRofu9XZimC5ZW5Wi3bKys/4GQQfto= github.com/ipfs/go-merkledag v0.2.3/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= github.com/ipfs/go-merkledag v0.2.4/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= @@ -959,7 +960,6 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/libp2p/go-addr-util v0.0.1/go.mod h1:4ac6O7n9rIAKB1dnd+s8IbbMXkt+oBpzX4/+RACcnlQ= github.com/libp2p/go-addr-util v0.0.2/go.mod h1:Ecd6Fb3yIuLzq4bD7VcywcVSBtefcAwnUISBM3WG15E= -github.com/libp2p/go-addr-util v0.1.0 h1:acKsntI33w2bTU7tC9a0SaPimJGfSI0bFKC18ChxeVI= 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= @@ -993,8 +993,9 @@ 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.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 h1:8l4GV401OSd4dFRyHDtIT/mEzdh/aQGoFC8xshYgm5M= github.com/libp2p/go-libp2p v0.17.0/go.mod h1:Fkin50rsGdv5mm5BshBUtPRZknt9esfmYXBOYcwOTgw= +github.com/libp2p/go-libp2p v0.18.0-rc1 h1:CFHROLGmMwe/p8tR3sHahg/1NSaZa2EGbu7nDmdC+RY= +github.com/libp2p/go-libp2p v0.18.0-rc1/go.mod h1:RgYlH7IIWHXREimC92bw5Lg1V2R5XmSzuLHb5fTnr+8= 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 h1:rABPCO77SjdbJ/eJ/ynIo8vWICy1VEnL5JAxJbQLo1E= github.com/libp2p/go-libp2p-asn-util v0.1.0/go.mod h1:wu+AnM9Ii2KgO5jMmS1rz9dvzTdj8BXqsPR9HR0XB7I= @@ -1006,7 +1007,6 @@ github.com/libp2p/go-libp2p-autonat v0.2.1/go.mod h1:MWtAhV5Ko1l6QBsHQNSuM6b1sRk github.com/libp2p/go-libp2p-autonat v0.2.2/go.mod h1:HsM62HkqZmHR2k1xgX34WuWDzk/nBwNHoeyyT4IWV6A= 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 h1:rCP5s+A2dlhM1Xd66wurE0k7S7pPmM0D+FlqqSBXxks= 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= @@ -1022,8 +1022,9 @@ github.com/libp2p/go-libp2p-circuit v0.1.1/go.mod h1:Ahq4cY3V9VJcHcn1SBXjr78AbFk 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 h1:eqQ3sEYkGTtybWgr6JLqJY6QLtPWRErvFjFDfAOO1wc= 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= @@ -1062,8 +1063,9 @@ github.com/libp2p/go-libp2p-core v0.9.0/go.mod h1:ESsbz31oC3C1AvMJoGx26RTuCkNhmk github.com/libp2p/go-libp2p-core v0.10.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= 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 h1:IFG/s8dN6JN2OTrXX9eq2wNU/Zlz2KLdwZUp5FplgXI= github.com/libp2p/go-libp2p-core v0.13.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= +github.com/libp2p/go-libp2p-core v0.14.0 h1:0kYSgiK/D7Eo28GTuRXo5YHsWwAisVpFCqCVPUd/vJs= +github.com/libp2p/go-libp2p-core v0.14.0/go.mod h1:tLasfcVdTXnixsLB0QYaT1syJOhsbrhG7q6pGrHtBg8= 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= @@ -1098,8 +1100,9 @@ github.com/libp2p/go-libp2p-mplex v0.2.1/go.mod h1:SC99Rxs8Vuzrf/6WhmH41kNn13TiY 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.4.0/go.mod h1:yCyWJE2sc6TBTnFpjvLuEJgTSw/u+MamvzILKdX7asw= -github.com/libp2p/go-libp2p-mplex v0.4.1 h1:/pyhkP1nLwjG3OM+VuaNJkQT/Pqq73WzB3aDN3Fx1sc= github.com/libp2p/go-libp2p-mplex v0.4.1/go.mod h1:cmy+3GfqfM1PceHTLL7zQzAAYaryDu6iPSC+CIb094g= +github.com/libp2p/go-libp2p-mplex v0.5.0 h1:vt3k4E4HSND9XH4Z8rUpacPJFSAgLOv6HDvG8W9Ks9E= +github.com/libp2p/go-libp2p-mplex v0.5.0/go.mod h1:eLImPJLkj3iG5t5lq68w3Vm5NAQ5BcKwrrb2VmOYb3M= 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= @@ -1142,14 +1145,17 @@ github.com/libp2p/go-libp2p-quic-transport v0.10.0/go.mod h1:RfJbZ8IqXIhxBRm5hqU 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= 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 h1:wHBEceRy+1/8Ec8dAIyr+/P7L2YefIGprPVy5LrMM+k= 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 h1:aVg9/jr+R2esov5sH7wkXrmYmqJiUjtLMLYX3L9KYdY= +github.com/libp2p/go-libp2p-quic-transport v0.16.0/go.mod h1:1BXjVMzr+w7EkPfiHkKnwsWjPjtfaNT0q8RS3tGDvEQ= 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.0 h1:tYpbhLPVC4egLavupAi9jGKKLeMemyGq5tnfBc8taBs= +github.com/libp2p/go-libp2p-resource-manager v0.1.0/go.mod h1:wJPNjeE4XQlxeidwqVY5G6DLOKqFK33u2n8blpl0I6Y= 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= @@ -1169,8 +1175,9 @@ 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.5.3/go.mod h1:NBn7eNW2lu568L7Ns9wdFrOhgRlkRnIDg0FLKbuu3i8= github.com/libp2p/go-libp2p-swarm v0.8.0/go.mod h1:sOMp6dPuqco0r0GHTzfVheVBh6UEL0L1lXUZ5ot2Fvc= -github.com/libp2p/go-libp2p-swarm v0.9.0 h1:LdWjHDVjPMYt3NCG2EHcQiIP8XzA8BHhHz8ZLAYol2Y= github.com/libp2p/go-libp2p-swarm v0.9.0/go.mod h1:2f8d8uxTJmpeqHF/1ujjdXZp+98nNIbujVOMEZxCbZ8= +github.com/libp2p/go-libp2p-swarm v0.10.0 h1:1yr7UCwxCN92cw9g9Q+fnJSlk7lOB1RetoEewxhGVL0= +github.com/libp2p/go-libp2p-swarm v0.10.0/go.mod h1:71ceMcV6Rg/0rIQ97rsZWMzto1l9LnNquef+efcRbmA= 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= @@ -1182,8 +1189,9 @@ github.com/libp2p/go-libp2p-testing v0.3.0/go.mod h1:efZkql4UZ7OVsEfaxNHZPzIehts github.com/libp2p/go-libp2p-testing v0.4.0/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotlKsNSbKQ/lImlOWF0= 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 h1:tV/wz6mS1VoAYA/5DGTiyzw9TJ+eXMCMvzU5VPLJSgg= github.com/libp2p/go-libp2p-testing v0.6.0/go.mod h1:QBk8fqIL1XNcno/l3/hhaIEn4aLRijpYOR+zVjjlh+A= +github.com/libp2p/go-libp2p-testing v0.7.0 h1:9bfyhNINizxuLrKsenzGaZalXRXIaAEmx1BP/PzF1gM= +github.com/libp2p/go-libp2p-testing v0.7.0/go.mod h1:OLbdn9DbgdMwv00v+tlp1l3oe2Cl+FAjoWIA2pa0X6E= 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 h1:lsE2zYte+rZCEOHF72J1Fg3XK3dGQyKvI6i5ehJfEp0= @@ -1198,8 +1206,9 @@ 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.4.6/go.mod h1:JE0WQuQdy+uLZ5zOaI3Nw9dWGYJIA7mywEtP2lMvnyk= 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 h1:GfMCU+2aGGEm1zW3UcOz6wYSn8tXQalFfVfcww99i5A= 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 h1:ADnLrL7fC4Vy7HPjk9oGof7nDeTqGXuof85Ar6kin9Q= +github.com/libp2p/go-libp2p-transport-upgrader v0.7.0/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-yamux v0.1.2/go.mod h1:xUoV/RmYkg6BW/qGxA9XJyg+HzXFYkeXbnhjmnYzKp8= github.com/libp2p/go-libp2p-yamux v0.1.3/go.mod h1:VGSQVrqkh6y4nm0189qqxMtvyBft44MOYYPpYKXiVt4= @@ -1213,8 +1222,9 @@ github.com/libp2p/go-libp2p-yamux v0.4.0/go.mod h1:+DWDjtFMzoAwYLVkNZftoucn7PelN github.com/libp2p/go-libp2p-yamux v0.5.0/go.mod h1:AyR8k5EzyM2QN9Bbdg6X1SkVVuqLwTGf0L4DFq9g6po= 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 h1:bVXHbTj/XH4uBBsPrg26BlDABk5WYRlssY73P0SjhPc= github.com/libp2p/go-libp2p-yamux v0.7.0/go.mod h1:fMyA0CsPfHkIuBU0wjRGrCjTBFiXTXxG0k5M4ETv+08= +github.com/libp2p/go-libp2p-yamux v0.8.0 h1:APQYlttIj+Rr5sfa6siojwsi0ZwcIh/exHIUl9hZr6o= +github.com/libp2p/go-libp2p-yamux v0.8.0/go.mod h1:yTkPgN2ib8FHyU1ZcVD7aelzyAqXXwEPbyx+aSKm9h8= 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= @@ -1226,8 +1236,9 @@ github.com/libp2p/go-mplex v0.1.0/go.mod h1:SXgmdki2kwCUlCCbfGLEgHjC4pFqhTp0ZoV6 github.com/libp2p/go-mplex v0.1.1/go.mod h1:Xgz2RDCi3co0LeZfgjm4OgUF15+sVR8SRcu3SFXI1lk= 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 h1:U1T+vmCYJaEoDJPV1aq31N56hS+lJgb397GsylNSgrU= github.com/libp2p/go-mplex v0.3.0/go.mod h1:0Oy/A9PQlwBytDRp4wSkFnzHYDKcpLot35JQ6msjvYQ= +github.com/libp2p/go-mplex v0.4.0 h1:Ukkez9/4EOX5rTw4sHefNJp10dksftAA05ZgyjplUbM= +github.com/libp2p/go-mplex v0.4.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= @@ -1242,8 +1253,9 @@ github.com/libp2p/go-nat v0.1.0/go.mod h1:X7teVkwRHNInVNWQiO/tAiAVRwSr5zoRz4YSTC github.com/libp2p/go-netroute v0.1.2/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk= github.com/libp2p/go-netroute v0.1.3/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk= github.com/libp2p/go-netroute v0.1.5/go.mod h1:V1SR3AaECRkEQCoFFzYwVYWvYIEtlxx89+O3qcpCl4A= -github.com/libp2p/go-netroute v0.1.6 h1:ruPJStbYyXVYGQ81uzEDzuvbYRLKRrLvTYd33yomC38= github.com/libp2p/go-netroute v0.1.6/go.mod h1:AqhkMh0VuWmfgtxKPp3Oc1LdU5QSWS7wl0QLhSZqXxQ= +github.com/libp2p/go-netroute v0.2.0 h1:0FpsbsvuSnAhXFnCY0VLFbJOzaK0VnP0r1QT/o4nWRE= +github.com/libp2p/go-netroute v0.2.0/go.mod h1:Vio7LTzZ+6hoT4CMZi5/6CpY3Snzh2vgZhWgxMNwlQI= github.com/libp2p/go-openssl v0.0.2/go.mod h1:v8Zw2ijCSWBQi8Pq5GAixw6DbFfa9u6VIYDXnvOXkc0= 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= @@ -1262,14 +1274,14 @@ github.com/libp2p/go-reuseport-transport v0.1.0 h1:C3PHeHjmnz8m6f0uydObj02tMEoi7 github.com/libp2p/go-reuseport-transport v0.1.0/go.mod h1:vev0C0uMkzriDY59yFHD9v+ujJvYmDQVLowvAjEOmfw= 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 h1:yD80l2ZOdGksnOyHrhxDdTDFrf7Oy+v3FMVArIRgZxQ= github.com/libp2p/go-sockaddr v0.1.1/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= 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= 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 h1:TqnSHPJEIqDEO7h1wZZ0p3DXdvDSiLHQidKKUGZtiOY= 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 h1:HsM/9OdtqnIzjVXcxTXjmqKrj3gJ8kacaOJwJS1ipaY= +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= @@ -1277,8 +1289,9 @@ github.com/libp2p/go-tcp-transport v0.2.0/go.mod h1:vX2U0CnWimU4h0SGSEsg++AzvBcr 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= -github.com/libp2p/go-tcp-transport v0.4.0 h1:VDyg4j6en3OuXf90gfDQh5Sy9KowO9udnd0OU8PP6zg= 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 h1:3ZPW8HAuyRAuFzyabE0hSrCXKKSWzROnZZX7DtcIatY= +github.com/libp2p/go-tcp-transport v0.5.0/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= @@ -1287,8 +1300,9 @@ github.com/libp2p/go-ws-transport v0.1.2/go.mod h1:dsh2Ld8F+XNmzpkaAijmg5Is+e9l6 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.4.0/go.mod h1:EcIEKqf/7GDjth6ksuS/6p7R49V4CBY6/E7R/iyhYUA= -github.com/libp2p/go-ws-transport v0.5.0 h1:cO6x4P0v6PfxbKnxmf5cY2Ny4OPDGYkUqNvZzp/zdlo= github.com/libp2p/go-ws-transport v0.5.0/go.mod h1:I2juo1dNTbl8BKSBYo98XY85kU2xds1iamArLvl8kNg= +github.com/libp2p/go-ws-transport v0.6.0 h1:326XBL6Q+5CQ2KtjXz32+eGu02W/Kz2+Fm4SpXdr0q4= +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= @@ -1300,8 +1314,9 @@ github.com/libp2p/go-yamux v1.4.0/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/h 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.2.0/go.mod h1:3So6P6TV6r75R9jiBpiIKgU/66lOarCZjqROGxzPpPQ= -github.com/libp2p/go-yamux/v2 v2.3.0 h1:luRV68GS1vqqr6EFUjtu1kr51d+IbW0gSowu8emYWAI= 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 h1:lIdxHGVZ+y/EHgCrqGNt4Q+Mk9qu26MbOWH/yRw+Ihk= +github.com/libp2p/go-yamux/v3 v3.0.1/go.mod h1:s2LsDhHbh+RfCsQoICSYt58U2f8ijtPANFD8BmE74Bo= 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= @@ -1309,8 +1324,9 @@ github.com/lucas-clemente/quic-go v0.11.2/go.mod h1:PpMmPfPKO9nKJ/psF49ESTAGQSdf 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= -github.com/lucas-clemente/quic-go v0.24.0 h1:ToR7SIIEdrgOhgVTHvPgdVRJfgVy+N0wQAagH7L4d5g= github.com/lucas-clemente/quic-go v0.24.0/go.mod h1:paZuzjXCE5mj6sikVLMvqXk8lJV2AsqtJ6bDhjEfxx0= +github.com/lucas-clemente/quic-go v0.25.0 h1:K+X9Gvd7JXsOHtU0N2icZ2Nw3rx82uBej3mP4CLgibc= +github.com/lucas-clemente/quic-go v0.25.0/go.mod h1:YtzP8bxRVCBlO77yRanE264+fY/T2U9ZlW1AaHOsMOg= 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= @@ -1337,6 +1353,8 @@ github.com/marten-seemann/qtls-go1-16 v0.1.4/go.mod h1:gNpI2Ol+lRS3WwSOtIUUtRwZE 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 h1:P9ggrs5xtwiqXv/FHNwntmuLMNq3KaSIG93AtAZ48xk= github.com/marten-seemann/qtls-go1-17 v0.1.0/go.mod h1:fz4HIxByo+LlWcreM4CZOYNuz3taBQ8rN2X6FqvaWo8= +github.com/marten-seemann/qtls-go1-18 v0.1.0-beta.1 h1:EnzzN9fPUkUck/1CuY1FlzBaIYMoiBsdwTNmNGkwUUM= +github.com/marten-seemann/qtls-go1-18 v0.1.0-beta.1/go.mod h1:PUhIQk19LoFt2174H4+an8TYvWOGjb/hHwphBeaDHwI= 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= @@ -1435,8 +1453,9 @@ 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 h1:Pq37uLx3hsyNlTDir7FZyU8+cFCTqd5y1KiM2IzOutI= 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-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= @@ -1557,6 +1576,8 @@ github.com/openzipkin/zipkin-go v0.2.5/go.mod h1:KpXfKdgRDnnhsxw4pNIH9Md5lyFqKUa 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= From c394fbdfc3aaf369dc517446a9fd9fac74007b7c Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 18 Jan 2022 14:52:19 +0200 Subject: [PATCH 224/393] go mod: go-libp2p-resource-manager --- go.mod | 1 + 1 file changed, 1 insertion(+) diff --git a/go.mod b/go.mod index de4f05fab0a..21c8ce09b34 100644 --- a/go.mod +++ b/go.mod @@ -118,6 +118,7 @@ require ( github.com/libp2p/go-libp2p-pubsub v0.6.0 github.com/libp2p/go-libp2p-quic-transport v0.16.0 github.com/libp2p/go-libp2p-record v0.1.3 + github.com/libp2p/go-libp2p-resource-manager v0.1.0 github.com/libp2p/go-libp2p-routing-helpers v0.2.3 github.com/libp2p/go-libp2p-swarm v0.10.0 github.com/libp2p/go-libp2p-tls v0.3.1 From 826cdb2186e49d7f5a48d8ba25a9b820b634a42f Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 18 Jan 2022 14:19:40 +0200 Subject: [PATCH 225/393] use the libp2p connmgr --- node/modules/lp2p/libp2p.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/node/modules/lp2p/libp2p.go b/node/modules/lp2p/libp2p.go index 5d8ece732d2..997792d4825 100644 --- a/node/modules/lp2p/libp2p.go +++ b/node/modules/lp2p/libp2p.go @@ -10,10 +10,10 @@ import ( logging "github.com/ipfs/go-log/v2" "github.com/libp2p/go-libp2p" - connmgr "github.com/libp2p/go-libp2p-connmgr" "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" ) From 8d3f98fe386f96a3824b0ae7da39a0be463772e0 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 18 Jan 2022 14:56:24 +0200 Subject: [PATCH 226/393] instantiate resource manager in DI --- node/builder.go | 6 ++++ node/modules/lp2p/rcmgr.go | 66 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+) create mode 100644 node/modules/lp2p/rcmgr.go diff --git a/node/builder.go b/node/builder.go index 96d217ec348..6770e8dc8f7 100644 --- a/node/builder.go +++ b/node/builder.go @@ -15,6 +15,7 @@ import ( logging "github.com/ipfs/go-log/v2" 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" @@ -68,6 +69,7 @@ var ( BandwidthReporterKey = special{11} // Libp2p option ConnGaterKey = special{12} // libp2p option DAGStoreKey = special{13} // constructor returns multiple values + ResourceManagerKey = special{14} // Libp2p option ) type invoke int @@ -215,6 +217,10 @@ var LibP2P = Options( Override(ConnectionManagerKey, lp2p.ConnectionManager(50, 200, 20*time.Second, nil)), Override(new(*conngater.BasicConnectionGater), lp2p.ConnGater), Override(ConnGaterKey, lp2p.ConnGaterOption), + + // Services (resource management) + Override(new(network.ResourceManager), lp2p.ResourceManager), + Override(ResourceManagerKey, lp2p.ResourceManagerOption), ) func IsType(t repo.RepoType) func(s *Settings) bool { diff --git a/node/modules/lp2p/rcmgr.go b/node/modules/lp2p/rcmgr.go new file mode 100644 index 00000000000..a012fc1f427 --- /dev/null +++ b/node/modules/lp2p/rcmgr.go @@ -0,0 +1,66 @@ +package lp2p + +import ( + "errors" + "fmt" + "os" + "path/filepath" + + "go.uber.org/fx" + + "github.com/libp2p/go-libp2p" + "github.com/libp2p/go-libp2p-core/network" + rcmgr "github.com/libp2p/go-libp2p-resource-manager" + + "github.com/filecoin-project/lotus/node/repo" +) + +func ResourceManager(lc fx.Lifecycle, repo repo.LockedRepo) (network.ResourceManager, error) { + var limiter *rcmgr.BasicLimiter + var opts []rcmgr.Option + + repoPath := repo.Path() + + // create limiter -- parse $repo/limits.json if exists + limitsFile := filepath.Join(repoPath, "limits.json") + limitsIn, err := os.Open(limitsFile) + switch { + case err == nil: + defer limitsIn.Close() + limiter, err = rcmgr.NewDefaultLimiterFromJSON(limitsIn) + if err != nil { + return nil, fmt.Errorf("error parsing limit file: %w", err) + } + + case errors.Is(err, os.ErrNotExist): + limiter = rcmgr.NewDefaultLimiter() + + default: + return nil, err + } + + // TODO: also set appropriate default limits for lotus protocols + libp2p.SetDefaultServiceLimits(limiter) + + if os.Getenv("LOTUS_DEBUG_RCMGR") != "" { + debugPath := filepath.Join(repoPath, "debug") + if err := os.MkdirAll(debugPath, 0755); err != nil { + return nil, fmt.Errorf("error creating debug directory: %w", err) + } + traceFile := filepath.Join(debugPath, "rcmgr.json.gz") + opts = append(opts, rcmgr.WithTrace(traceFile)) + } + + mgr, err := rcmgr.NewResourceManager(limiter, opts...) + if err != nil { + return nil, fmt.Errorf("error creating resource manager: %w", err) + } + + return mgr, nil +} + +func ResourceManagerOption(mgr network.ResourceManager) Libp2pOpts { + return Libp2pOpts{ + Opts: []libp2p.Option{libp2p.ResourceManager(mgr)}, + } +} From d05d5bcb70a55411cb4cc5bdeb1b7edcecfca617 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 18 Jan 2022 15:38:18 +0200 Subject: [PATCH 227/393] add resource manager NetStat api --- api/api_net.go | 3 ++ api/types.go | 9 ++++ node/impl/net/net.go | 13 +++--- node/impl/net/rcmgr.go | 102 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 121 insertions(+), 6 deletions(-) create mode 100644 node/impl/net/rcmgr.go diff --git a/api/api_net.go b/api/api_net.go index 4cf9ca336a3..0a389e5ed6b 100644 --- a/api/api_net.go +++ b/api/api_net.go @@ -51,6 +51,9 @@ type Net interface { NetBlockRemove(ctx context.Context, acl NetBlockList) error //perm:admin NetBlockList(ctx context.Context) (NetBlockList, error) //perm:read + // ResourceManager API + NetStat(ctx context.Context, scope string) (NetStat, error) //perm:read + // ID returns peerID of libp2p node backing this API ID(context.Context) (peer.ID, error) //perm:read } diff --git a/api/types.go b/api/types.go index 81345306d61..66fb7985060 100644 --- a/api/types.go +++ b/api/types.go @@ -12,6 +12,7 @@ import ( "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" ma "github.com/multiformats/go-multiaddr" @@ -129,6 +130,14 @@ type NetBlockList struct { IPSubnets []string } +type NetStat struct { + System *network.ScopeStat `json:",omitempty"` + Transient *network.ScopeStat `json:",omitempty"` + Services map[string]network.ScopeStat `json:",omitempty"` + Protocols map[string]network.ScopeStat `json:",omitempty"` + Peers map[string]network.ScopeStat +} + type ExtendedPeerInfo struct { ID peer.ID Agent string diff --git a/node/impl/net/net.go b/node/impl/net/net.go index a1003ffe5f2..27e7734a164 100644 --- a/node/impl/net/net.go +++ b/node/impl/net/net.go @@ -25,12 +25,13 @@ import ( type NetAPI struct { fx.In - RawHost lp2p.RawHost - Host host.Host - Router lp2p.BaseIpfsRouting - ConnGater *conngater.BasicConnectionGater - Reporter metrics.Reporter - Sk *dtypes.ScoreKeeper + RawHost lp2p.RawHost + Host host.Host + Router lp2p.BaseIpfsRouting + ConnGater *conngater.BasicConnectionGater + ResourceManager network.ResourceManager + Reporter metrics.Reporter + Sk *dtypes.ScoreKeeper } func (a *NetAPI) ID(context.Context) (peer.ID, error) { diff --git a/node/impl/net/rcmgr.go b/node/impl/net/rcmgr.go new file mode 100644 index 00000000000..2084d3a3576 --- /dev/null +++ b/node/impl/net/rcmgr.go @@ -0,0 +1,102 @@ +package net + +import ( + "context" + "strings" + + "golang.org/x/xerrors" + + "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/filecoin-project/lotus/api" +) + +func (a *NetAPI) NetStat(ctx context.Context, scope string) (result api.NetStat, err error) { + switch { + case scope == "all": + rapi, ok := a.ResourceManager.(rcmgr.ResourceManagerState) + if !ok { + return result, xerrors.Errorf("rexource manager does not support ResourceManagerState API") + } + + stat := rapi.Stat() + result.System = &stat.System + result.Transient = &stat.Transient + if len(stat.Services) > 0 { + result.Services = stat.Services + } + if len(stat.Protocols) > 0 { + result.Protocols = make(map[string]network.ScopeStat, len(stat.Protocols)) + for proto, stat := range stat.Protocols { + result.Protocols[string(proto)] = stat + } + } + if len(stat.Peers) > 0 { + result.Peers = make(map[string]network.ScopeStat, len(stat.Peers)) + for p, stat := range stat.Peers { + result.Peers[p.Pretty()] = stat + } + } + + return result, nil + + case scope == "system": + err = a.ResourceManager.ViewSystem(func(s network.ResourceScope) error { + stat := s.Stat() + result.System = &stat + return nil + }) + return result, err + + case scope == "transient": + err = a.ResourceManager.ViewTransient(func(s network.ResourceScope) error { + stat := s.Stat() + result.Transient = &stat + return nil + }) + return result, err + + case strings.HasPrefix(scope, "svc:"): + svc := scope[4:] + err = a.ResourceManager.ViewService(svc, func(s network.ServiceScope) error { + stat := s.Stat() + result.Services = map[string]network.ScopeStat{ + svc: stat, + } + return nil + }) + return result, err + + case strings.HasPrefix(scope, "proto:"): + proto := scope[6:] + err = a.ResourceManager.ViewProtocol(protocol.ID(proto), func(s network.ProtocolScope) error { + stat := s.Stat() + result.Protocols = map[string]network.ScopeStat{ + proto: stat, + } + return nil + }) + return result, err + + case strings.HasPrefix(scope, "peer:"): + p := scope[5:] + pid, err := peer.IDFromString(p) + if err != nil { + return result, err + } + err = a.ResourceManager.ViewPeer(pid, func(s network.PeerScope) error { + stat := s.Stat() + result.Peers = map[string]network.ScopeStat{ + p: stat, + } + return nil + }) + return result, err + + default: + return result, xerrors.Errorf("invalid scope %s", scope) + } +} From 554848fe6b2384780b08632c71c304df899a7200 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 18 Jan 2022 16:15:32 +0200 Subject: [PATCH 228/393] add resource manager Net(Set)Limit api --- api/api_net.go | 4 +- api/types.go | 16 +++- node/impl/net/rcmgr.go | 171 ++++++++++++++++++++++++++++++++++++++++- 3 files changed, 188 insertions(+), 3 deletions(-) diff --git a/api/api_net.go b/api/api_net.go index 0a389e5ed6b..7dddb09ac0a 100644 --- a/api/api_net.go +++ b/api/api_net.go @@ -52,7 +52,9 @@ type Net interface { NetBlockList(ctx context.Context) (NetBlockList, error) //perm:read // ResourceManager API - NetStat(ctx context.Context, scope string) (NetStat, error) //perm:read + NetStat(ctx context.Context, scope string) (NetStat, error) //perm:read + NetLimit(ctx context.Context, scope string) (NetLimit, error) //perm:read + NetSetLimit(ctx context.Context, scope string, limit NetLimit) error //perm:admin // ID returns peerID of libp2p node backing this API ID(context.Context) (peer.ID, error) //perm:read diff --git a/api/types.go b/api/types.go index 66fb7985060..c688edf4b5f 100644 --- a/api/types.go +++ b/api/types.go @@ -135,7 +135,21 @@ type NetStat struct { Transient *network.ScopeStat `json:",omitempty"` Services map[string]network.ScopeStat `json:",omitempty"` Protocols map[string]network.ScopeStat `json:",omitempty"` - Peers map[string]network.ScopeStat + Peers map[string]network.ScopeStat `json:",omitempty"` +} + +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 + FD int } type ExtendedPeerInfo struct { diff --git a/node/impl/net/rcmgr.go b/node/impl/net/rcmgr.go index 2084d3a3576..1b6d57d8e8c 100644 --- a/node/impl/net/rcmgr.go +++ b/node/impl/net/rcmgr.go @@ -85,7 +85,7 @@ func (a *NetAPI) NetStat(ctx context.Context, scope string) (result api.NetStat, p := scope[5:] pid, err := peer.IDFromString(p) if err != nil { - return result, err + return result, xerrors.Errorf("invalid peer ID: %s: %w", p, err) } err = a.ResourceManager.ViewPeer(pid, func(s network.PeerScope) error { stat := s.Stat() @@ -100,3 +100,172 @@ func (a *NetAPI) NetStat(ctx context.Context, scope string) (result api.NetStat, return result, xerrors.Errorf("invalid scope %s", scope) } } + +func (a *NetAPI) NetLimit(ctx context.Context, scope string) (result api.NetLimit, err error) { + getLimit := func(s network.ResourceScope) error { + limiter, ok := s.(rcmgr.ResourceScopeLimiter) + if !ok { + return xerrors.Errorf("resource scope doesn't implement ResourceScopeLimiter interface") + } + + 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) + } + + return nil + } + + switch { + case scope == "system": + err = a.ResourceManager.ViewSystem(func(s network.ResourceScope) error { + return getLimit(s) + }) + return result, err + + case scope == "transient": + err = a.ResourceManager.ViewTransient(func(s network.ResourceScope) error { + return getLimit(s) + }) + return result, err + + case strings.HasPrefix(scope, "svc:"): + svc := scope[4:] + err = a.ResourceManager.ViewService(svc, func(s network.ServiceScope) error { + return getLimit(s) + }) + return result, err + + case strings.HasPrefix(scope, "proto:"): + proto := scope[6:] + err = a.ResourceManager.ViewProtocol(protocol.ID(proto), func(s network.ProtocolScope) error { + return getLimit(s) + }) + return result, err + + case strings.HasPrefix(scope, "peer:"): + p := scope[5:] + pid, err := peer.IDFromString(p) + if err != nil { + return result, xerrors.Errorf("invalid peer ID: %s: %w", p, err) + } + err = a.ResourceManager.ViewPeer(pid, func(s network.PeerScope) error { + return getLimit(s) + }) + return result, err + + default: + return result, xerrors.Errorf("invalid scope %s", scope) + } +} + +func (a *NetAPI) NetSetLimit(ctx context.Context, scope string, limit api.NetLimit) error { + setLimit := func(s network.ResourceScope) error { + limiter, ok := s.(rcmgr.ResourceScopeLimiter) + if !ok { + 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, + }, + } + } + + limiter.SetLimit(newLimit) + return nil + } + + switch { + case scope == "system": + err := a.ResourceManager.ViewSystem(func(s network.ResourceScope) error { + return setLimit(s) + }) + return err + + case scope == "transient": + err := a.ResourceManager.ViewTransient(func(s network.ResourceScope) error { + return setLimit(s) + }) + return err + + case strings.HasPrefix(scope, "svc:"): + svc := scope[4:] + err := a.ResourceManager.ViewService(svc, func(s network.ServiceScope) error { + return setLimit(s) + }) + return err + + case strings.HasPrefix(scope, "proto:"): + proto := scope[6:] + err := a.ResourceManager.ViewProtocol(protocol.ID(proto), func(s network.ProtocolScope) error { + return setLimit(s) + }) + return err + + case strings.HasPrefix(scope, "peer:"): + p := scope[5:] + pid, err := peer.IDFromString(p) + if err != nil { + return xerrors.Errorf("invalid peer ID: %s: %w", p, err) + } + err = a.ResourceManager.ViewPeer(pid, func(s network.PeerScope) error { + return setLimit(s) + }) + return err + + default: + return xerrors.Errorf("invalid scope %s", scope) + } +} From 39bf59d37217bd31f6708947717568183dc24882 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 18 Jan 2022 16:15:49 +0200 Subject: [PATCH 229/393] add examples to docgen --- api/docgen/docgen.go | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/api/docgen/docgen.go b/api/docgen/docgen.go index 57159993590..1190b0dc406 100644 --- a/api/docgen/docgen.go +++ b/api/docgen/docgen.go @@ -300,6 +300,34 @@ func init() { Error: "", }) addExample(storiface.ResourceTable) + addExample(network.ScopeStat{ + Memory: 123, + NumStreamsInbound: 1, + NumStreamsOutbound: 2, + NumConnsInbound: 3, + NumConnsOutbound: 4, + NumFD: 5, + }) + addExample(map[string]network.ScopeStat{ + "abc": { + Memory: 123, + NumStreamsInbound: 1, + NumStreamsOutbound: 2, + NumConnsInbound: 3, + NumConnsOutbound: 4, + NumFD: 5, + }}) + addExample(api.NetLimit{ + Memory: 123, + StreamsInbound: 1, + StreamsOutbound: 2, + Streams: 3, + ConnsInbound: 3, + ConnsOutbound: 4, + Conns: 4, + FD: 5, + }) + } func GetAPIType(name, pkg string) (i interface{}, t reflect.Type, permStruct []reflect.Type) { From 0de1566eaff66bbd4574ae9806968dde6c676a5f Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 18 Jan 2022 16:28:20 +0200 Subject: [PATCH 230/393] add net stat and limit cli --- cli/net.go | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) diff --git a/cli/net.go b/cli/net.go index fdd0a13d656..104b4b40ebd 100644 --- a/cli/net.go +++ b/cli/net.go @@ -36,6 +36,8 @@ var NetCmd = &cli.Command{ NetReachability, NetBandwidthCmd, NetBlockCmd, + NetStatCmd, + NetLimitCmd, }, } @@ -606,3 +608,86 @@ var NetBlockListCmd = &cli.Command{ return nil }, } + +var NetStatCmd = &cli.Command{ + Name: "stat", + Usage: "report resource stat for a scope", + ArgsUsage: "scope", + Action: func(cctx *cli.Context) error { + api, closer, err := GetAPI(cctx) + if err != nil { + return err + } + defer closer() + ctx := ReqContext(cctx) + + args := cctx.Args().Slice() + if len(args) != 1 { + return xerrors.Errorf("must specify exactly one scope") + } + scope := args[0] + + result, err := api.NetStat(ctx, scope) + if err != nil { + return err + } + + enc := json.NewEncoder(os.Stdout) + enc.Encode(result) + + return nil + }, +} + +var NetLimitCmd = &cli.Command{ + Name: "limit", + Usage: "get or set resource limit for a scope", + ArgsUsage: "scope [limit]", + Flags: []cli.Flag{ + &cli.BoolFlag{ + Name: "set", + Usage: "set the limit for a scope", + }, + }, + Action: func(cctx *cli.Context) error { + api, closer, err := GetAPI(cctx) + if err != nil { + return err + } + defer closer() + ctx := ReqContext(cctx) + args := cctx.Args().Slice() + + if cctx.Bool("set") { + if len(args) != 2 { + return xerrors.Errorf("must specify exactly a scope and a limit") + } + scope := args[0] + limitStr := args[1] + + var limit atypes.NetLimit + err := json.Unmarshal([]byte(limitStr), &limit) + if err != nil { + return xerrors.Errorf("error decoding limit: %w", err) + } + + return api.NetSetLimit(ctx, scope, limit) + + } else { + if len(args) != 1 { + return xerrors.Errorf("must specify exactly one scope") + } + scope := args[0] + + result, err := api.NetLimit(ctx, scope) + if err != nil { + return err + } + + enc := json.NewEncoder(os.Stdout) + enc.Encode(result) + } + + return nil + }, +} From 62c0f35b5ab2f17b63f90c6a1ed220d3e6e9e7ac Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 18 Jan 2022 16:57:32 +0200 Subject: [PATCH 231/393] go mod: go-libp2p-resource-manager@v0.1.1 --- go.mod | 2 +- go.sum | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 21c8ce09b34..57f40cbe52e 100644 --- a/go.mod +++ b/go.mod @@ -118,7 +118,7 @@ require ( github.com/libp2p/go-libp2p-pubsub v0.6.0 github.com/libp2p/go-libp2p-quic-transport v0.16.0 github.com/libp2p/go-libp2p-record v0.1.3 - github.com/libp2p/go-libp2p-resource-manager v0.1.0 + github.com/libp2p/go-libp2p-resource-manager v0.1.1 github.com/libp2p/go-libp2p-routing-helpers v0.2.3 github.com/libp2p/go-libp2p-swarm v0.10.0 github.com/libp2p/go-libp2p-tls v0.3.1 diff --git a/go.sum b/go.sum index d81393867f6..8a633728423 100644 --- a/go.sum +++ b/go.sum @@ -1154,8 +1154,9 @@ github.com/libp2p/go-libp2p-record v0.1.1/go.mod h1:VRgKajOyMVgP/F0L5g3kH7SVskp1 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.0 h1:tYpbhLPVC4egLavupAi9jGKKLeMemyGq5tnfBc8taBs= github.com/libp2p/go-libp2p-resource-manager v0.1.0/go.mod h1:wJPNjeE4XQlxeidwqVY5G6DLOKqFK33u2n8blpl0I6Y= +github.com/libp2p/go-libp2p-resource-manager v0.1.1 h1:JZ++ezpl2SVP2bj4Z+EPSmrKFS9vQVpkgC28G3DBJcA= +github.com/libp2p/go-libp2p-resource-manager v0.1.1/go.mod h1:wJPNjeE4XQlxeidwqVY5G6DLOKqFK33u2n8blpl0I6Y= 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= From aa599bfaf99aca0048e76eb8c742385df74eee60 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 18 Jan 2022 16:57:59 +0200 Subject: [PATCH 232/393] go mod: update go-libp2p-pubsub --- go.mod | 2 +- go.sum | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 57f40cbe52e..53a3b6737e8 100644 --- a/go.mod +++ b/go.mod @@ -115,7 +115,7 @@ require ( github.com/libp2p/go-libp2p-kad-dht v0.15.0 github.com/libp2p/go-libp2p-noise v0.3.0 github.com/libp2p/go-libp2p-peerstore v0.6.0 - github.com/libp2p/go-libp2p-pubsub v0.6.0 + github.com/libp2p/go-libp2p-pubsub v0.6.1 github.com/libp2p/go-libp2p-quic-transport v0.16.0 github.com/libp2p/go-libp2p-record v0.1.3 github.com/libp2p/go-libp2p-resource-manager v0.1.1 diff --git a/go.sum b/go.sum index 8a633728423..3ebc4e06257 100644 --- a/go.sum +++ b/go.sum @@ -1138,8 +1138,9 @@ 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.1.1/go.mod h1:ZwlKzRSe1eGvSIdU5bD7+8RZN/Uzw0t1Bp9R1znpR/Q= -github.com/libp2p/go-libp2p-pubsub v0.6.0 h1:98+RXuEWW17U6cAijK1yaTf6mw/B+n5yPA421z+dlo0= github.com/libp2p/go-libp2p-pubsub v0.6.0/go.mod h1:nJv87QM2cU0w45KPR1rZicq+FmFIOD16zmT+ep1nOmg= +github.com/libp2p/go-libp2p-pubsub v0.6.1 h1:wycbV+f4rreCoVY61Do6g/BUk0RIrbNRcYVbn+QkjGk= +github.com/libp2p/go-libp2p-pubsub v0.6.1/go.mod h1:nJv87QM2cU0w45KPR1rZicq+FmFIOD16zmT+ep1nOmg= 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= From c3fb68545a7fe8ce572f947907100e46d2d52fdb Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 18 Jan 2022 17:07:56 +0200 Subject: [PATCH 233/393] fix mocknet.New invocation --- itests/kit/ensemble.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/itests/kit/ensemble.go b/itests/kit/ensemble.go index dfd3d8cd74a..0227ee81e70 100644 --- a/itests/kit/ensemble.go +++ b/itests/kit/ensemble.go @@ -277,7 +277,7 @@ func (n *Ensemble) Start() *Ensemble { // We haven't been bootstrapped yet, we need to generate genesis and // create the networking backbone. gtempl = n.generateGenesis() - n.mn = mocknet.New(ctx) + n.mn = mocknet.New() } // --------------------- From 0870f48b5caaaa78e505b398ce13962b5ecdbc19 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 18 Jan 2022 17:13:35 +0200 Subject: [PATCH 234/393] fix mocknet.New invocation --- chain/sync_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/chain/sync_test.go b/chain/sync_test.go index 2af8aeb5433..ae22b251c2f 100644 --- a/chain/sync_test.go +++ b/chain/sync_test.go @@ -103,7 +103,7 @@ func prepSyncTest(t testing.TB, h int) *syncTestUtil { ctx: ctx, cancel: cancel, - mn: mocknet.New(ctx), + mn: mocknet.New(), g: g, us: filcns.DefaultUpgradeSchedule(), } @@ -157,7 +157,7 @@ func prepSyncTestWithV5Height(t testing.TB, h int, v5height abi.ChainEpoch) *syn ctx: ctx, cancel: cancel, - mn: mocknet.New(ctx), + mn: mocknet.New(), g: g, us: sched, } From 83427c478f5af534e39f92dcc2f378627ce63fef Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 18 Jan 2022 20:00:53 +0200 Subject: [PATCH 235/393] go mod: update go-yamux@v3.0.2 --- go.mod | 1 + go.sum | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 53a3b6737e8..72f57067c94 100644 --- a/go.mod +++ b/go.mod @@ -124,6 +124,7 @@ require ( github.com/libp2p/go-libp2p-tls v0.3.1 github.com/libp2p/go-libp2p-yamux v0.8.0 github.com/libp2p/go-maddr-filter v0.1.0 + github.com/libp2p/go-yamux/v3 v3.0.2 // indirect 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 diff --git a/go.sum b/go.sum index 3ebc4e06257..ef555cc6833 100644 --- a/go.sum +++ b/go.sum @@ -1317,8 +1317,9 @@ 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.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 h1:lIdxHGVZ+y/EHgCrqGNt4Q+Mk9qu26MbOWH/yRw+Ihk= github.com/libp2p/go-yamux/v3 v3.0.1/go.mod h1:s2LsDhHbh+RfCsQoICSYt58U2f8ijtPANFD8BmE74Bo= +github.com/libp2p/go-yamux/v3 v3.0.2 h1:LW0q5+A1Wy0npEsPJP9wmare2NH4ohNluN5EWVwv2mE= +github.com/libp2p/go-yamux/v3 v3.0.2/go.mod h1:s2LsDhHbh+RfCsQoICSYt58U2f8ijtPANFD8BmE74Bo= 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= From 6260271b780ad2a7d9cd4d15c5646c843136c54c Mon Sep 17 00:00:00 2001 From: vyzo Date: Wed, 19 Jan 2022 11:44:45 +0200 Subject: [PATCH 236/393] go mod: update go-libp2p-resource-manager@v0.1.2 --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 72f57067c94..9d501ed6e43 100644 --- a/go.mod +++ b/go.mod @@ -118,7 +118,7 @@ require ( github.com/libp2p/go-libp2p-pubsub v0.6.1 github.com/libp2p/go-libp2p-quic-transport v0.16.0 github.com/libp2p/go-libp2p-record v0.1.3 - github.com/libp2p/go-libp2p-resource-manager v0.1.1 + github.com/libp2p/go-libp2p-resource-manager v0.1.2 github.com/libp2p/go-libp2p-routing-helpers v0.2.3 github.com/libp2p/go-libp2p-swarm v0.10.0 github.com/libp2p/go-libp2p-tls v0.3.1 diff --git a/go.sum b/go.sum index ef555cc6833..52defb8dec4 100644 --- a/go.sum +++ b/go.sum @@ -1156,8 +1156,8 @@ github.com/libp2p/go-libp2p-record v0.1.2/go.mod h1:pal0eNcT5nqZaTV7UGhqeGqxFgGd 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.0/go.mod h1:wJPNjeE4XQlxeidwqVY5G6DLOKqFK33u2n8blpl0I6Y= -github.com/libp2p/go-libp2p-resource-manager v0.1.1 h1:JZ++ezpl2SVP2bj4Z+EPSmrKFS9vQVpkgC28G3DBJcA= -github.com/libp2p/go-libp2p-resource-manager v0.1.1/go.mod h1:wJPNjeE4XQlxeidwqVY5G6DLOKqFK33u2n8blpl0I6Y= +github.com/libp2p/go-libp2p-resource-manager v0.1.2 h1:t66B/6EF6ivWEUgvO34NKOT3oPtkb+JTBJHdsIMx+mg= +github.com/libp2p/go-libp2p-resource-manager v0.1.2/go.mod h1:wJPNjeE4XQlxeidwqVY5G6DLOKqFK33u2n8blpl0I6Y= 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= From 19c8ea328808c36d2d7128dd4e45e8d5098914ef Mon Sep 17 00:00:00 2001 From: vyzo Date: Wed, 19 Jan 2022 13:15:00 +0200 Subject: [PATCH 237/393] add description for net stat and limit commands --- cli/net.go | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/cli/net.go b/cli/net.go index 104b4b40ebd..18f21f767fc 100644 --- a/cli/net.go +++ b/cli/net.go @@ -611,8 +611,18 @@ var NetBlockListCmd = &cli.Command{ var NetStatCmd = &cli.Command{ Name: "stat", - Usage: "report resource stat for a scope", + Usage: "Report resource usage for a scope", ArgsUsage: "scope", + Description: `Report resource usage for a scope. + + The scope can be one of the following: + - system -- reports the system aggregate resource usage. + - transient -- reports the transient resource usage. + - svc: -- reports the resource usage of a specific service. + - proto: -- reports the resource usage of a specific protocol. + - peer: -- reports the resource usage of a specific peer. + - all -- reports the resource usage for all currently active scopes. +`, Action: func(cctx *cli.Context) error { api, closer, err := GetAPI(cctx) if err != nil { @@ -641,8 +651,19 @@ var NetStatCmd = &cli.Command{ var NetLimitCmd = &cli.Command{ Name: "limit", - Usage: "get or set resource limit for a scope", + Usage: "Get or set resource limits for a scope", ArgsUsage: "scope [limit]", + Description: `Get or set resource limits for a scope. + + The scope can be one of the following: + - system -- reports the system aggregate resource usage. + - transient -- reports the transient resource usage. + - svc: -- reports the resource usage of a specific service. + - proto: -- reports the resource usage of a specific protocol. + - peer: -- reports the resource usage of a specific peer. + + The limit is json-formatted, with the same structure as the limits file. +`, Flags: []cli.Flag{ &cli.BoolFlag{ Name: "set", From 2e5474e864d0f3ffd323f881946faa1b7c0a707d Mon Sep 17 00:00:00 2001 From: vyzo Date: Thu, 20 Jan 2022 11:23:52 +0200 Subject: [PATCH 238/393] update go-fil-markets@v0.19.0-rc1 --- go.mod | 5 ++--- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/go.mod b/go.mod index 9d501ed6e43..d7ab367a7e2 100644 --- a/go.mod +++ b/go.mod @@ -33,10 +33,10 @@ require ( github.com/filecoin-project/go-cbor-util v0.0.1 github.com/filecoin-project/go-commp-utils v0.1.3 github.com/filecoin-project/go-crypto v0.0.1 - github.com/filecoin-project/go-data-transfer v1.13.0 + github.com/filecoin-project/go-data-transfer v1.14.0 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.17.0 + github.com/filecoin-project/go-fil-markets v1.19.0-rc1 github.com/filecoin-project/go-jsonrpc v0.1.5 github.com/filecoin-project/go-padreader v0.0.1 github.com/filecoin-project/go-paramfetch v0.0.3-0.20220111000201-e42866db1a53 @@ -124,7 +124,6 @@ require ( github.com/libp2p/go-libp2p-tls v0.3.1 github.com/libp2p/go-libp2p-yamux v0.8.0 github.com/libp2p/go-maddr-filter v0.1.0 - github.com/libp2p/go-yamux/v3 v3.0.2 // indirect 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 diff --git a/go.sum b/go.sum index 52defb8dec4..44ee930ef61 100644 --- a/go.sum +++ b/go.sum @@ -316,8 +316,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-data-transfer v1.13.0 h1:UqjBfacClqAmnzukek1oPxJXDM3l5UI/WX8CRN2/VkM= -github.com/filecoin-project/go-data-transfer v1.13.0/go.mod h1:TcUtAdQl1ofnLV9oH3gPC93Hjce9yuKnq4O4j2M/BU4= +github.com/filecoin-project/go-data-transfer v1.14.0 h1:4pnfJk8FYtqcdAg+QRGzaz57seUC/Tz+HJgPuGB7zdg= +github.com/filecoin-project/go-data-transfer v1.14.0/go.mod h1:wNJKhaLLYBJDM3VFvgvYi4iUjPa69pz/1Q5Q4HzX2wE= 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= @@ -327,8 +327,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.17.0 h1:i9U6hZ+peri6Ygfwoda0YBk4bo1SHkd58EPBRgXCRlQ= -github.com/filecoin-project/go-fil-markets v1.17.0/go.mod h1:tKRMkDovSJiUo8yDt6YQM/gHMfNVYya0YTdayGhRnRY= +github.com/filecoin-project/go-fil-markets v1.19.0-rc1 h1:T8Ql+Yj9bm0nzn9o43WBrRGxtWj2aYRq2UY7hDaep0I= +github.com/filecoin-project/go-fil-markets v1.19.0-rc1/go.mod h1:qsb3apmo4RSJYCEq40QxVdU7UZospN6nFJLOBHuaIbc= 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= From ca4ee1e8cfb202c8f76f63d5b1a6f3aff6ec24e6 Mon Sep 17 00:00:00 2001 From: vyzo Date: Thu, 20 Jan 2022 11:33:38 +0200 Subject: [PATCH 239/393] fix issues with fil-markets/data-transfer updates --- markets/loggers/loggers.go | 1 - 1 file changed, 1 deletion(-) diff --git a/markets/loggers/loggers.go b/markets/loggers/loggers.go index 2d13a64a19d..0d542a45dcd 100644 --- a/markets/loggers/loggers.go +++ b/markets/loggers/loggers.go @@ -40,7 +40,6 @@ func DataTransferLogger(event datatransfer.Event, state datatransfer.ChannelStat "sent", state.Sent(), "received", state.Received(), "queued", state.Queued(), - "received count", state.ReceivedCidsTotal(), "total size", state.TotalSize(), "remote peer", state.OtherPeer(), "event message", event.Message, From b360c9403f12b460081a32ce9c6e06a450f089cb Mon Sep 17 00:00:00 2001 From: vyzo Date: Thu, 20 Jan 2022 11:44:01 +0200 Subject: [PATCH 240/393] make gen and friends --- api/mocks/mock_full.go | 44 ++++++++ api/proxy_gen.go | 39 +++++++ api/v0api/v0mocks/mock_full.go | 44 ++++++++ build/openrpc/full.json.gz | Bin 26593 -> 26594 bytes build/openrpc/miner.json.gz | Bin 12787 -> 12784 bytes build/openrpc/worker.json.gz | Bin 3918 -> 3918 bytes documentation/en/api-v0-methods-miner.md | 117 ++++++++++++++++++++ documentation/en/api-v0-methods.md | 117 ++++++++++++++++++++ documentation/en/api-v1-unstable-methods.md | 117 ++++++++++++++++++++ documentation/en/cli-lotus-miner.md | 54 +++++++++ documentation/en/cli-lotus.md | 54 +++++++++ 11 files changed, 586 insertions(+) diff --git a/api/mocks/mock_full.go b/api/mocks/mock_full.go index 3f9d75433c5..e985a794d0c 100644 --- a/api/mocks/mock_full.go +++ b/api/mocks/mock_full.go @@ -1811,6 +1811,21 @@ func (mr *MockFullNodeMockRecorder) NetFindPeer(arg0, arg1 interface{}) *gomock. return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetFindPeer", reflect.TypeOf((*MockFullNode)(nil).NetFindPeer), arg0, arg1) } +// NetLimit mocks base method. +func (m *MockFullNode) NetLimit(arg0 context.Context, arg1 string) (api.NetLimit, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NetLimit", arg0, arg1) + ret0, _ := ret[0].(api.NetLimit) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// NetLimit indicates an expected call of NetLimit. +func (mr *MockFullNodeMockRecorder) NetLimit(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetLimit", reflect.TypeOf((*MockFullNode)(nil).NetLimit), arg0, arg1) +} + // NetPeerInfo mocks base method. func (m *MockFullNode) NetPeerInfo(arg0 context.Context, arg1 peer.ID) (*api.ExtendedPeerInfo, error) { m.ctrl.T.Helper() @@ -1856,6 +1871,35 @@ func (mr *MockFullNodeMockRecorder) NetPubsubScores(arg0 interface{}) *gomock.Ca return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetPubsubScores", reflect.TypeOf((*MockFullNode)(nil).NetPubsubScores), arg0) } +// NetSetLimit mocks base method. +func (m *MockFullNode) NetSetLimit(arg0 context.Context, arg1 string, arg2 api.NetLimit) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NetSetLimit", arg0, arg1, arg2) + ret0, _ := ret[0].(error) + return ret0 +} + +// NetSetLimit indicates an expected call of NetSetLimit. +func (mr *MockFullNodeMockRecorder) NetSetLimit(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetSetLimit", reflect.TypeOf((*MockFullNode)(nil).NetSetLimit), arg0, arg1, arg2) +} + +// NetStat mocks base method. +func (m *MockFullNode) NetStat(arg0 context.Context, arg1 string) (api.NetStat, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NetStat", arg0, arg1) + ret0, _ := ret[0].(api.NetStat) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// NetStat indicates an expected call of NetStat. +func (mr *MockFullNodeMockRecorder) NetStat(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetStat", reflect.TypeOf((*MockFullNode)(nil).NetStat), arg0, arg1) +} + // NodeStatus mocks base method. func (m *MockFullNode) NodeStatus(arg0 context.Context, arg1 bool) (api.NodeStatus, error) { m.ctrl.T.Helper() diff --git a/api/proxy_gen.go b/api/proxy_gen.go index 0a644e58572..e353a7c6e89 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -587,11 +587,17 @@ type NetStruct struct { NetFindPeer func(p0 context.Context, p1 peer.ID) (peer.AddrInfo, error) `perm:"read"` + NetLimit func(p0 context.Context, p1 string) (NetLimit, error) `perm:"read"` + NetPeerInfo func(p0 context.Context, p1 peer.ID) (*ExtendedPeerInfo, error) `perm:"read"` NetPeers func(p0 context.Context) ([]peer.AddrInfo, error) `perm:"read"` NetPubsubScores func(p0 context.Context) ([]PubsubScore, error) `perm:"read"` + + NetSetLimit func(p0 context.Context, p1 string, p2 NetLimit) error `perm:"admin"` + + NetStat func(p0 context.Context, p1 string) (NetStat, error) `perm:"read"` } } @@ -3625,6 +3631,17 @@ func (s *NetStub) NetFindPeer(p0 context.Context, p1 peer.ID) (peer.AddrInfo, er return *new(peer.AddrInfo), ErrNotSupported } +func (s *NetStruct) NetLimit(p0 context.Context, p1 string) (NetLimit, error) { + if s.Internal.NetLimit == nil { + return *new(NetLimit), ErrNotSupported + } + return s.Internal.NetLimit(p0, p1) +} + +func (s *NetStub) NetLimit(p0 context.Context, p1 string) (NetLimit, error) { + return *new(NetLimit), ErrNotSupported +} + func (s *NetStruct) NetPeerInfo(p0 context.Context, p1 peer.ID) (*ExtendedPeerInfo, error) { if s.Internal.NetPeerInfo == nil { return nil, ErrNotSupported @@ -3658,6 +3675,28 @@ func (s *NetStub) NetPubsubScores(p0 context.Context) ([]PubsubScore, error) { return *new([]PubsubScore), ErrNotSupported } +func (s *NetStruct) NetSetLimit(p0 context.Context, p1 string, p2 NetLimit) error { + if s.Internal.NetSetLimit == nil { + return ErrNotSupported + } + return s.Internal.NetSetLimit(p0, p1, p2) +} + +func (s *NetStub) NetSetLimit(p0 context.Context, p1 string, p2 NetLimit) error { + return ErrNotSupported +} + +func (s *NetStruct) NetStat(p0 context.Context, p1 string) (NetStat, error) { + if s.Internal.NetStat == nil { + return *new(NetStat), ErrNotSupported + } + return s.Internal.NetStat(p0, p1) +} + +func (s *NetStub) NetStat(p0 context.Context, p1 string) (NetStat, error) { + return *new(NetStat), ErrNotSupported +} + func (s *SignableStruct) Sign(p0 context.Context, p1 SignFunc) error { if s.Internal.Sign == nil { return ErrNotSupported diff --git a/api/v0api/v0mocks/mock_full.go b/api/v0api/v0mocks/mock_full.go index 3e9caaee822..26d7959404b 100644 --- a/api/v0api/v0mocks/mock_full.go +++ b/api/v0api/v0mocks/mock_full.go @@ -1724,6 +1724,21 @@ func (mr *MockFullNodeMockRecorder) NetFindPeer(arg0, arg1 interface{}) *gomock. return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetFindPeer", reflect.TypeOf((*MockFullNode)(nil).NetFindPeer), arg0, arg1) } +// NetLimit mocks base method. +func (m *MockFullNode) NetLimit(arg0 context.Context, arg1 string) (api.NetLimit, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NetLimit", arg0, arg1) + ret0, _ := ret[0].(api.NetLimit) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// NetLimit indicates an expected call of NetLimit. +func (mr *MockFullNodeMockRecorder) NetLimit(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetLimit", reflect.TypeOf((*MockFullNode)(nil).NetLimit), arg0, arg1) +} + // NetPeerInfo mocks base method. func (m *MockFullNode) NetPeerInfo(arg0 context.Context, arg1 peer.ID) (*api.ExtendedPeerInfo, error) { m.ctrl.T.Helper() @@ -1769,6 +1784,35 @@ func (mr *MockFullNodeMockRecorder) NetPubsubScores(arg0 interface{}) *gomock.Ca return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetPubsubScores", reflect.TypeOf((*MockFullNode)(nil).NetPubsubScores), arg0) } +// NetSetLimit mocks base method. +func (m *MockFullNode) NetSetLimit(arg0 context.Context, arg1 string, arg2 api.NetLimit) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NetSetLimit", arg0, arg1, arg2) + ret0, _ := ret[0].(error) + return ret0 +} + +// NetSetLimit indicates an expected call of NetSetLimit. +func (mr *MockFullNodeMockRecorder) NetSetLimit(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetSetLimit", reflect.TypeOf((*MockFullNode)(nil).NetSetLimit), arg0, arg1, arg2) +} + +// NetStat mocks base method. +func (m *MockFullNode) NetStat(arg0 context.Context, arg1 string) (api.NetStat, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NetStat", arg0, arg1) + ret0, _ := ret[0].(api.NetStat) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// NetStat indicates an expected call of NetStat. +func (mr *MockFullNodeMockRecorder) NetStat(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetStat", reflect.TypeOf((*MockFullNode)(nil).NetStat), arg0, arg1) +} + // PaychAllocateLane mocks base method. func (m *MockFullNode) PaychAllocateLane(arg0 context.Context, arg1 address.Address) (uint64, error) { m.ctrl.T.Helper() diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 09098bb20aea4965d1b7dfee00017e74b8b64d95..ae8f0b86655688ef335478f8abf47bf58d1ca299 100644 GIT binary patch delta 26289 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 diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index 0c3eef45d2660c0ac839ba80b59ab2b2b55f3ab3..2cb9ab35a596996089916305611753f621b0d112 100644 GIT binary patch delta 11037 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 XkF}?#+o%5@00960#&=jp@@@hEg~f4B delta 11037 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 Xm}pN=w@?2+00960RG11s@@@hE83l95 diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index b940feca71098909be807a47d9ff170043fd2d9e..d6c6806caadfecc60a2bad43c9b8e54d73222d61 100644 GIT binary patch delta 2594 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 E0Iz`vd;kCd delta 2595 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 F0074&643wv diff --git a/documentation/en/api-v0-methods-miner.md b/documentation/en/api-v0-methods-miner.md index 437473f3c57..63891c3f24d 100644 --- a/documentation/en/api-v0-methods-miner.md +++ b/documentation/en/api-v0-methods-miner.md @@ -81,9 +81,12 @@ * [NetConnectedness](#NetConnectedness) * [NetDisconnect](#NetDisconnect) * [NetFindPeer](#NetFindPeer) + * [NetLimit](#NetLimit) * [NetPeerInfo](#NetPeerInfo) * [NetPeers](#NetPeers) * [NetPubsubScores](#NetPubsubScores) + * [NetSetLimit](#NetSetLimit) + * [NetStat](#NetStat) * [Pieces](#Pieces) * [PiecesGetCIDInfo](#PiecesGetCIDInfo) * [PiecesGetPieceInfo](#PiecesGetPieceInfo) @@ -1698,6 +1701,32 @@ Response: } ``` +### NetLimit + + +Perms: read + +Inputs: +```json +[ + "string value" +] +``` + +Response: +```json +{ + "Memory": 123, + "Streams": 3, + "StreamsInbound": 1, + "StreamsOutbound": 2, + "Conns": 4, + "ConnsInbound": 3, + "ConnsOutbound": 4, + "FD": 5 +} +``` + ### NetPeerInfo @@ -1783,6 +1812,94 @@ Response: ] ``` +### NetSetLimit + + +Perms: admin + +Inputs: +```json +[ + "string value", + { + "Memory": 123, + "Streams": 3, + "StreamsInbound": 1, + "StreamsOutbound": 2, + "Conns": 4, + "ConnsInbound": 3, + "ConnsOutbound": 4, + "FD": 5 + } +] +``` + +Response: `{}` + +### NetStat + + +Perms: read + +Inputs: +```json +[ + "string value" +] +``` + +Response: +```json +{ + "System": { + "NumStreamsInbound": 123, + "NumStreamsOutbound": 123, + "NumConnsInbound": 123, + "NumConnsOutbound": 123, + "NumFD": 123, + "Memory": 9 + }, + "Transient": { + "NumStreamsInbound": 123, + "NumStreamsOutbound": 123, + "NumConnsInbound": 123, + "NumConnsOutbound": 123, + "NumFD": 123, + "Memory": 9 + }, + "Services": { + "abc": { + "NumStreamsInbound": 1, + "NumStreamsOutbound": 2, + "NumConnsInbound": 3, + "NumConnsOutbound": 4, + "NumFD": 5, + "Memory": 123 + } + }, + "Protocols": { + "abc": { + "NumStreamsInbound": 1, + "NumStreamsOutbound": 2, + "NumConnsInbound": 3, + "NumConnsOutbound": 4, + "NumFD": 5, + "Memory": 123 + } + }, + "Peers": { + "abc": { + "NumStreamsInbound": 1, + "NumStreamsOutbound": 2, + "NumConnsInbound": 3, + "NumConnsOutbound": 4, + "NumFD": 5, + "Memory": 123 + } + } +} +``` + ## Pieces diff --git a/documentation/en/api-v0-methods.md b/documentation/en/api-v0-methods.md index 88c4d818760..883d4d27499 100644 --- a/documentation/en/api-v0-methods.md +++ b/documentation/en/api-v0-methods.md @@ -128,9 +128,12 @@ * [NetConnectedness](#NetConnectedness) * [NetDisconnect](#NetDisconnect) * [NetFindPeer](#NetFindPeer) + * [NetLimit](#NetLimit) * [NetPeerInfo](#NetPeerInfo) * [NetPeers](#NetPeers) * [NetPubsubScores](#NetPubsubScores) + * [NetSetLimit](#NetSetLimit) + * [NetStat](#NetStat) * [Paych](#Paych) * [PaychAllocateLane](#PaychAllocateLane) * [PaychAvailableFunds](#PaychAvailableFunds) @@ -3821,6 +3824,32 @@ Response: } ``` +### NetLimit + + +Perms: read + +Inputs: +```json +[ + "string value" +] +``` + +Response: +```json +{ + "Memory": 123, + "Streams": 3, + "StreamsInbound": 1, + "StreamsOutbound": 2, + "Conns": 4, + "ConnsInbound": 3, + "ConnsOutbound": 4, + "FD": 5 +} +``` + ### NetPeerInfo @@ -3906,6 +3935,94 @@ Response: ] ``` +### NetSetLimit + + +Perms: admin + +Inputs: +```json +[ + "string value", + { + "Memory": 123, + "Streams": 3, + "StreamsInbound": 1, + "StreamsOutbound": 2, + "Conns": 4, + "ConnsInbound": 3, + "ConnsOutbound": 4, + "FD": 5 + } +] +``` + +Response: `{}` + +### NetStat + + +Perms: read + +Inputs: +```json +[ + "string value" +] +``` + +Response: +```json +{ + "System": { + "NumStreamsInbound": 123, + "NumStreamsOutbound": 123, + "NumConnsInbound": 123, + "NumConnsOutbound": 123, + "NumFD": 123, + "Memory": 9 + }, + "Transient": { + "NumStreamsInbound": 123, + "NumStreamsOutbound": 123, + "NumConnsInbound": 123, + "NumConnsOutbound": 123, + "NumFD": 123, + "Memory": 9 + }, + "Services": { + "abc": { + "NumStreamsInbound": 1, + "NumStreamsOutbound": 2, + "NumConnsInbound": 3, + "NumConnsOutbound": 4, + "NumFD": 5, + "Memory": 123 + } + }, + "Protocols": { + "abc": { + "NumStreamsInbound": 1, + "NumStreamsOutbound": 2, + "NumConnsInbound": 3, + "NumConnsOutbound": 4, + "NumFD": 5, + "Memory": 123 + } + }, + "Peers": { + "abc": { + "NumStreamsInbound": 1, + "NumStreamsOutbound": 2, + "NumConnsInbound": 3, + "NumConnsOutbound": 4, + "NumFD": 5, + "Memory": 123 + } + } +} +``` + ## Paych The Paych methods are for interacting with and managing payment channels diff --git a/documentation/en/api-v1-unstable-methods.md b/documentation/en/api-v1-unstable-methods.md index 7d5f4665e91..a5fdd999429 100644 --- a/documentation/en/api-v1-unstable-methods.md +++ b/documentation/en/api-v1-unstable-methods.md @@ -134,9 +134,12 @@ * [NetConnectedness](#NetConnectedness) * [NetDisconnect](#NetDisconnect) * [NetFindPeer](#NetFindPeer) + * [NetLimit](#NetLimit) * [NetPeerInfo](#NetPeerInfo) * [NetPeers](#NetPeers) * [NetPubsubScores](#NetPubsubScores) + * [NetSetLimit](#NetSetLimit) + * [NetStat](#NetStat) * [Node](#Node) * [NodeStatus](#NodeStatus) * [Paych](#Paych) @@ -4182,6 +4185,32 @@ Response: } ``` +### NetLimit + + +Perms: read + +Inputs: +```json +[ + "string value" +] +``` + +Response: +```json +{ + "Memory": 123, + "Streams": 3, + "StreamsInbound": 1, + "StreamsOutbound": 2, + "Conns": 4, + "ConnsInbound": 3, + "ConnsOutbound": 4, + "FD": 5 +} +``` + ### NetPeerInfo @@ -4267,6 +4296,94 @@ Response: ] ``` +### NetSetLimit + + +Perms: admin + +Inputs: +```json +[ + "string value", + { + "Memory": 123, + "Streams": 3, + "StreamsInbound": 1, + "StreamsOutbound": 2, + "Conns": 4, + "ConnsInbound": 3, + "ConnsOutbound": 4, + "FD": 5 + } +] +``` + +Response: `{}` + +### NetStat + + +Perms: read + +Inputs: +```json +[ + "string value" +] +``` + +Response: +```json +{ + "System": { + "NumStreamsInbound": 123, + "NumStreamsOutbound": 123, + "NumConnsInbound": 123, + "NumConnsOutbound": 123, + "NumFD": 123, + "Memory": 9 + }, + "Transient": { + "NumStreamsInbound": 123, + "NumStreamsOutbound": 123, + "NumConnsInbound": 123, + "NumConnsOutbound": 123, + "NumFD": 123, + "Memory": 9 + }, + "Services": { + "abc": { + "NumStreamsInbound": 1, + "NumStreamsOutbound": 2, + "NumConnsInbound": 3, + "NumConnsOutbound": 4, + "NumFD": 5, + "Memory": 123 + } + }, + "Protocols": { + "abc": { + "NumStreamsInbound": 1, + "NumStreamsOutbound": 2, + "NumConnsInbound": 3, + "NumConnsOutbound": 4, + "NumFD": 5, + "Memory": 123 + } + }, + "Peers": { + "abc": { + "NumStreamsInbound": 1, + "NumStreamsOutbound": 2, + "NumConnsInbound": 3, + "NumConnsOutbound": 4, + "NumFD": 5, + "Memory": 123 + } + } +} +``` + ## Node These methods are general node management and status commands diff --git a/documentation/en/cli-lotus-miner.md b/documentation/en/cli-lotus-miner.md index 7ec60a7c498..6543beab738 100644 --- a/documentation/en/cli-lotus-miner.md +++ b/documentation/en/cli-lotus-miner.md @@ -1160,6 +1160,8 @@ COMMANDS: reachability Print information about reachability from the internet bandwidth Print bandwidth usage information block Manage network connection gating rules + stat Report resource usage for a scope + limit Get or set resource limits for a scope help, h Shows a list of commands or help for one command OPTIONS: @@ -1428,6 +1430,58 @@ OPTIONS: ``` +### lotus-miner net stat +``` +NAME: + lotus-miner net stat - Report resource usage for a scope + +USAGE: + lotus-miner net stat [command options] scope + +DESCRIPTION: + Report resource usage for a scope. + + The scope can be one of the following: + - system -- reports the system aggregate resource usage. + - transient -- reports the transient resource usage. + - svc: -- reports the resource usage of a specific service. + - proto: -- reports the resource usage of a specific protocol. + - peer: -- reports the resource usage of a specific peer. + - all -- reports the resource usage for all currently active scopes. + + +OPTIONS: + --help, -h show help (default: false) + +``` + +### lotus-miner net limit +``` +NAME: + lotus-miner net limit - Get or set resource limits for a scope + +USAGE: + lotus-miner net limit [command options] scope [limit] + +DESCRIPTION: + Get or set resource limits for a scope. + + The scope can be one of the following: + - system -- reports the system aggregate resource usage. + - transient -- reports the transient resource usage. + - svc: -- reports the resource usage of a specific service. + - proto: -- reports the resource usage of a specific protocol. + - peer: -- reports the resource usage of a specific peer. + + The limit is json-formatted, with the same structure as the limits file. + + +OPTIONS: + --set set the limit for a scope (default: false) + --help, -h show help (default: false) + +``` + ## lotus-miner pieces ``` NAME: diff --git a/documentation/en/cli-lotus.md b/documentation/en/cli-lotus.md index edf8dfde681..54c0d36dfe6 100644 --- a/documentation/en/cli-lotus.md +++ b/documentation/en/cli-lotus.md @@ -2616,6 +2616,8 @@ COMMANDS: reachability Print information about reachability from the internet bandwidth Print bandwidth usage information block Manage network connection gating rules + stat Report resource usage for a scope + limit Get or set resource limits for a scope help, h Shows a list of commands or help for one command OPTIONS: @@ -2884,6 +2886,58 @@ OPTIONS: ``` +### lotus net stat +``` +NAME: + lotus net stat - Report resource usage for a scope + +USAGE: + lotus net stat [command options] scope + +DESCRIPTION: + Report resource usage for a scope. + + The scope can be one of the following: + - system -- reports the system aggregate resource usage. + - transient -- reports the transient resource usage. + - svc: -- reports the resource usage of a specific service. + - proto: -- reports the resource usage of a specific protocol. + - peer: -- reports the resource usage of a specific peer. + - all -- reports the resource usage for all currently active scopes. + + +OPTIONS: + --help, -h show help (default: false) + +``` + +### lotus net limit +``` +NAME: + lotus net limit - Get or set resource limits for a scope + +USAGE: + lotus net limit [command options] scope [limit] + +DESCRIPTION: + Get or set resource limits for a scope. + + The scope can be one of the following: + - system -- reports the system aggregate resource usage. + - transient -- reports the transient resource usage. + - svc: -- reports the resource usage of a specific service. + - proto: -- reports the resource usage of a specific protocol. + - peer: -- reports the resource usage of a specific peer. + + The limit is json-formatted, with the same structure as the limits file. + + +OPTIONS: + --set set the limit for a scope (default: false) + --help, -h show help (default: false) + +``` + ## lotus sync ``` NAME: From 325a4c0e5b16a50fd2d3b89663e065a9116aeacb Mon Sep 17 00:00:00 2001 From: vyzo Date: Thu, 20 Jan 2022 11:46:39 +0200 Subject: [PATCH 241/393] fix lint --- cli/net.go | 26 +++++++++++--------------- node/modules/lp2p/rcmgr.go | 2 +- 2 files changed, 12 insertions(+), 16 deletions(-) diff --git a/cli/net.go b/cli/net.go index 18f21f767fc..524b0d753e5 100644 --- a/cli/net.go +++ b/cli/net.go @@ -643,9 +643,7 @@ var NetStatCmd = &cli.Command{ } enc := json.NewEncoder(os.Stdout) - enc.Encode(result) - - return nil + return enc.Encode(result) }, } @@ -694,21 +692,19 @@ var NetLimitCmd = &cli.Command{ return api.NetSetLimit(ctx, scope, limit) - } else { - if len(args) != 1 { - return xerrors.Errorf("must specify exactly one scope") - } - scope := args[0] + } - result, err := api.NetLimit(ctx, scope) - if err != nil { - return err - } + if len(args) != 1 { + return xerrors.Errorf("must specify exactly one scope") + } + scope := args[0] - enc := json.NewEncoder(os.Stdout) - enc.Encode(result) + result, err := api.NetLimit(ctx, scope) + if err != nil { + return err } - return nil + enc := json.NewEncoder(os.Stdout) + return enc.Encode(result) }, } diff --git a/node/modules/lp2p/rcmgr.go b/node/modules/lp2p/rcmgr.go index a012fc1f427..df52b4a4f39 100644 --- a/node/modules/lp2p/rcmgr.go +++ b/node/modules/lp2p/rcmgr.go @@ -26,7 +26,7 @@ func ResourceManager(lc fx.Lifecycle, repo repo.LockedRepo) (network.ResourceMan limitsIn, err := os.Open(limitsFile) switch { case err == nil: - defer limitsIn.Close() + defer limitsIn.Close() //nolint:errcheck limiter, err = rcmgr.NewDefaultLimiterFromJSON(limitsIn) if err != nil { return nil, fmt.Errorf("error parsing limit file: %w", err) From 73ec10a49ea6f80b338ada16c16a089f40f645d6 Mon Sep 17 00:00:00 2001 From: vyzo Date: Thu, 20 Jan 2022 11:47:39 +0200 Subject: [PATCH 242/393] close the rcmgr on shutdown --- node/modules/lp2p/rcmgr.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/node/modules/lp2p/rcmgr.go b/node/modules/lp2p/rcmgr.go index df52b4a4f39..8b286ff5ee6 100644 --- a/node/modules/lp2p/rcmgr.go +++ b/node/modules/lp2p/rcmgr.go @@ -1,6 +1,7 @@ package lp2p import ( + "context" "errors" "fmt" "os" @@ -56,6 +57,11 @@ func ResourceManager(lc fx.Lifecycle, repo repo.LockedRepo) (network.ResourceMan return nil, fmt.Errorf("error creating resource manager: %w", err) } + lc.Append(fx.Hook{ + OnStop: func(_ context.Context) error { + return mgr.Close() + }}) + return mgr, nil } From 8a47a71772a412597c34af114ebc36e34a52f72d Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Thu, 20 Jan 2022 11:46:17 +0100 Subject: [PATCH 243/393] feat: update to go-fil-markets v1.19.0 --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index d7ab367a7e2..1761efe1483 100644 --- a/go.mod +++ b/go.mod @@ -36,7 +36,7 @@ require ( github.com/filecoin-project/go-data-transfer v1.14.0 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.19.0-rc1 + github.com/filecoin-project/go-fil-markets v1.19.0 github.com/filecoin-project/go-jsonrpc v0.1.5 github.com/filecoin-project/go-padreader v0.0.1 github.com/filecoin-project/go-paramfetch v0.0.3-0.20220111000201-e42866db1a53 diff --git a/go.sum b/go.sum index 44ee930ef61..5615223b234 100644 --- a/go.sum +++ b/go.sum @@ -327,8 +327,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.19.0-rc1 h1:T8Ql+Yj9bm0nzn9o43WBrRGxtWj2aYRq2UY7hDaep0I= -github.com/filecoin-project/go-fil-markets v1.19.0-rc1/go.mod h1:qsb3apmo4RSJYCEq40QxVdU7UZospN6nFJLOBHuaIbc= +github.com/filecoin-project/go-fil-markets v1.19.0 h1:kap2q2wTM6tfkVO5gMA5DD9GUeTvkDhMfhjCtEwMDM8= +github.com/filecoin-project/go-fil-markets v1.19.0/go.mod h1:qsb3apmo4RSJYCEq40QxVdU7UZospN6nFJLOBHuaIbc= 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= From 752f4a3d6704e5f3f66d48dfa42e00c7c4eafa78 Mon Sep 17 00:00:00 2001 From: Aayush Date: Thu, 20 Jan 2022 15:01:26 -0500 Subject: [PATCH 244/393] Fix: sealer: ReplicaUpdate should fetch the correct files --- extern/sector-storage/manager.go | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/extern/sector-storage/manager.go b/extern/sector-storage/manager.go index ecabf0398d4..90edb386563 100644 --- a/extern/sector-storage/manager.go +++ b/extern/sector-storage/manager.go @@ -721,7 +721,7 @@ func (m *Manager) ReplicaUpdate(ctx context.Context, sector storage.SectorRef, p selector := newAllocSelector(m.index, storiface.FTUpdate|storiface.FTUpdateCache, storiface.PathSealing) - err = m.sched.Schedule(ctx, sector, sealtasks.TTReplicaUpdate, selector, m.schedFetch(sector, storiface.FTSealed, storiface.PathSealing, storiface.AcquireCopy), func(ctx context.Context, w Worker) error { + err = m.sched.Schedule(ctx, sector, sealtasks.TTReplicaUpdate, selector, m.schedFetch(sector, storiface.FTSealed|storiface.FTCache, storiface.PathSealing, storiface.AcquireCopy), func(ctx context.Context, w Worker) error { log.Errorf("scheduled work for replica update") err := m.startWork(ctx, w, wk)(w.ReplicaUpdate(ctx, sector, pieces)) if err != nil { @@ -768,9 +768,12 @@ func (m *Manager) ProveReplicaUpdate1(ctx context.Context, sector storage.Sector return nil, xerrors.Errorf("acquiring sector lock: %w", err) } - selector := newExistingSelector(m.index, sector.ID, storiface.FTUpdate|storiface.FTUpdateCache|storiface.FTSealed|storiface.FTCache, true) + // NOTE: We set allowFetch to false in so that we always execute on a worker + // with direct access to the data. We want to do that because this step is + // generally very cheap / fast, and transferring data is not worth the effort + selector := newExistingSelector(m.index, sector.ID, storiface.FTUpdate|storiface.FTUpdateCache|storiface.FTSealed|storiface.FTCache, false) - err = m.sched.Schedule(ctx, sector, sealtasks.TTProveReplicaUpdate1, selector, m.schedFetch(sector, storiface.FTSealed, storiface.PathSealing, storiface.AcquireCopy), func(ctx context.Context, w Worker) error { + err = m.sched.Schedule(ctx, sector, sealtasks.TTProveReplicaUpdate1, selector, m.schedFetch(sector, storiface.FTSealed|storiface.FTCache|storiface.FTUpdate|storiface.FTUpdateCache, storiface.PathSealing, storiface.AcquireCopy), func(ctx context.Context, w Worker) error { err := m.startWork(ctx, w, wk)(w.ProveReplicaUpdate1(ctx, sector, sectorKey, newSealed, newUnsealed)) if err != nil { From 6e5f5214636599e20f57b9f120f8de091b14b0cc Mon Sep 17 00:00:00 2001 From: vyzo Date: Fri, 21 Jan 2022 10:45:45 +0200 Subject: [PATCH 245/393] update go-libp2p to v0.18.0-rc2 --- go.mod | 6 +++--- go.sum | 9 ++++++--- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 1761efe1483..18623c7714c 100644 --- a/go.mod +++ b/go.mod @@ -108,7 +108,7 @@ require ( github.com/kelseyhightower/envconfig v1.4.0 github.com/libp2p/go-buffer-pool v0.0.2 github.com/libp2p/go-eventbus v0.2.1 - github.com/libp2p/go-libp2p v0.18.0-rc1 + github.com/libp2p/go-libp2p v0.18.0-rc2 github.com/libp2p/go-libp2p-connmgr v0.3.1 // indirect github.com/libp2p/go-libp2p-core v0.14.0 github.com/libp2p/go-libp2p-discovery v0.6.0 @@ -120,9 +120,9 @@ require ( github.com/libp2p/go-libp2p-record v0.1.3 github.com/libp2p/go-libp2p-resource-manager v0.1.2 github.com/libp2p/go-libp2p-routing-helpers v0.2.3 - github.com/libp2p/go-libp2p-swarm v0.10.0 + github.com/libp2p/go-libp2p-swarm v0.10.1 github.com/libp2p/go-libp2p-tls v0.3.1 - github.com/libp2p/go-libp2p-yamux v0.8.0 + github.com/libp2p/go-libp2p-yamux v0.8.1 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 diff --git a/go.sum b/go.sum index 5615223b234..8f6d19cbb0f 100644 --- a/go.sum +++ b/go.sum @@ -994,8 +994,9 @@ github.com/libp2p/go-libp2p v0.14.3/go.mod h1:d12V4PdKbpL0T1/gsUNN8DfgMuRPDX8bS2 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-rc1 h1:CFHROLGmMwe/p8tR3sHahg/1NSaZa2EGbu7nDmdC+RY= github.com/libp2p/go-libp2p v0.18.0-rc1/go.mod h1:RgYlH7IIWHXREimC92bw5Lg1V2R5XmSzuLHb5fTnr+8= +github.com/libp2p/go-libp2p v0.18.0-rc2 h1:ZLzGMdp1cVwxmA0vFpPVUDPQYUdHHGX7I58nXwpNr7Y= +github.com/libp2p/go-libp2p v0.18.0-rc2/go.mod h1:gGNCvn0T19AzyNPDWej2vsAlZFZVnS+IxqckjnsOyM0= 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 h1:rABPCO77SjdbJ/eJ/ynIo8vWICy1VEnL5JAxJbQLo1E= github.com/libp2p/go-libp2p-asn-util v0.1.0/go.mod h1:wu+AnM9Ii2KgO5jMmS1rz9dvzTdj8BXqsPR9HR0XB7I= @@ -1178,8 +1179,9 @@ github.com/libp2p/go-libp2p-swarm v0.5.0/go.mod h1:sU9i6BoHE0Ve5SKz3y9WfKrh8dUat 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= github.com/libp2p/go-libp2p-swarm v0.9.0/go.mod h1:2f8d8uxTJmpeqHF/1ujjdXZp+98nNIbujVOMEZxCbZ8= -github.com/libp2p/go-libp2p-swarm v0.10.0 h1:1yr7UCwxCN92cw9g9Q+fnJSlk7lOB1RetoEewxhGVL0= github.com/libp2p/go-libp2p-swarm v0.10.0/go.mod h1:71ceMcV6Rg/0rIQ97rsZWMzto1l9LnNquef+efcRbmA= +github.com/libp2p/go-libp2p-swarm v0.10.1 h1:lXW3pgGt+BVmkzcFX61erX7l6Lt+WAamNhwa2Kf3eJM= +github.com/libp2p/go-libp2p-swarm v0.10.1/go.mod h1:Pdkq0QU5a+qu+oyqIV3bknMsnzk9lnNyKvB9acJ5aZs= 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= @@ -1225,8 +1227,9 @@ 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 h1:APQYlttIj+Rr5sfa6siojwsi0ZwcIh/exHIUl9hZr6o= github.com/libp2p/go-libp2p-yamux v0.8.0/go.mod h1:yTkPgN2ib8FHyU1ZcVD7aelzyAqXXwEPbyx+aSKm9h8= +github.com/libp2p/go-libp2p-yamux v0.8.1 h1:pi7zUeZ4Z9TpbUMntvSvoP3dFD4SEw/VPybxBcOZGzg= +github.com/libp2p/go-libp2p-yamux v0.8.1/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= From 5cafdc2f29e80a2e079c3bee1f52580f80696c5c Mon Sep 17 00:00:00 2001 From: Aayush Date: Fri, 21 Jan 2022 11:10:44 -0500 Subject: [PATCH 246/393] fix: sealer: manager should lock Unsealed for ReplicaUpdate --- extern/sector-storage/ffiwrapper/sealer_cgo.go | 4 ++-- extern/sector-storage/manager.go | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/extern/sector-storage/ffiwrapper/sealer_cgo.go b/extern/sector-storage/ffiwrapper/sealer_cgo.go index 88ab50f0504..c35cefd56e7 100644 --- a/extern/sector-storage/ffiwrapper/sealer_cgo.go +++ b/extern/sector-storage/ffiwrapper/sealer_cgo.go @@ -669,7 +669,7 @@ func (sb *Sealer) SealCommit2(ctx context.Context, sector storage.SectorRef, pha func (sb *Sealer) ReplicaUpdate(ctx context.Context, sector storage.SectorRef, pieces []abi.PieceInfo) (storage.ReplicaUpdateOut, error) { empty := storage.ReplicaUpdateOut{} - paths, done, err := sb.sectors.AcquireSector(ctx, sector, storiface.FTSealed|storiface.FTUnsealed|storiface.FTCache, storiface.FTUpdate|storiface.FTUpdateCache, storiface.PathSealing) + paths, done, err := sb.sectors.AcquireSector(ctx, sector, storiface.FTUnsealed|storiface.FTSealed|storiface.FTCache, storiface.FTUpdate|storiface.FTUpdateCache, storiface.PathSealing) if err != nil { return empty, xerrors.Errorf("failed to acquire sector paths: %w", err) } @@ -718,7 +718,7 @@ func (sb *Sealer) ReplicaUpdate(ctx context.Context, sector storage.SectorRef, p } func (sb *Sealer) ProveReplicaUpdate1(ctx context.Context, sector storage.SectorRef, sectorKey, newSealed, newUnsealed cid.Cid) (storage.ReplicaVanillaProofs, error) { - paths, done, err := sb.sectors.AcquireSector(ctx, sector, storiface.FTSealed|storiface.FTCache|storiface.FTUpdateCache|storiface.FTUpdate, storiface.FTNone, storiface.PathSealing) + paths, done, err := sb.sectors.AcquireSector(ctx, sector, storiface.FTSealed|storiface.FTCache|storiface.FTUpdate|storiface.FTUpdateCache, storiface.FTNone, storiface.PathSealing) if err != nil { return nil, xerrors.Errorf("failed to acquire sector paths: %w", err) } diff --git a/extern/sector-storage/manager.go b/extern/sector-storage/manager.go index 90edb386563..07bae541037 100644 --- a/extern/sector-storage/manager.go +++ b/extern/sector-storage/manager.go @@ -715,13 +715,13 @@ func (m *Manager) ReplicaUpdate(ctx context.Context, sector storage.SectorRef, p return out, waitErr } - if err := m.index.StorageLock(ctx, sector.ID, storiface.FTSealed|storiface.FTCache, storiface.FTUpdate|storiface.FTUpdateCache); err != nil { + if err := m.index.StorageLock(ctx, sector.ID, storiface.FTUnsealed|storiface.FTSealed|storiface.FTCache, storiface.FTUpdate|storiface.FTUpdateCache); err != nil { return storage.ReplicaUpdateOut{}, xerrors.Errorf("acquiring sector lock: %w", err) } selector := newAllocSelector(m.index, storiface.FTUpdate|storiface.FTUpdateCache, storiface.PathSealing) - err = m.sched.Schedule(ctx, sector, sealtasks.TTReplicaUpdate, selector, m.schedFetch(sector, storiface.FTSealed|storiface.FTCache, storiface.PathSealing, storiface.AcquireCopy), func(ctx context.Context, w Worker) error { + err = m.sched.Schedule(ctx, sector, sealtasks.TTReplicaUpdate, selector, m.schedFetch(sector, storiface.FTUnsealed|storiface.FTSealed|storiface.FTCache, storiface.PathSealing, storiface.AcquireCopy), func(ctx context.Context, w Worker) error { log.Errorf("scheduled work for replica update") err := m.startWork(ctx, w, wk)(w.ReplicaUpdate(ctx, sector, pieces)) if err != nil { From 71c6d05902698f4a4c3e5ca2831e635f15d7e78d Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Mon, 24 Jan 2022 11:18:01 -0500 Subject: [PATCH 247/393] chore: chain: fix log --- chain/consensus/filcns/filecoin.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chain/consensus/filcns/filecoin.go b/chain/consensus/filcns/filecoin.go index be7628b4f0b..0adb79191d4 100644 --- a/chain/consensus/filcns/filecoin.go +++ b/chain/consensus/filcns/filecoin.go @@ -182,7 +182,7 @@ func (filec *FilecoinEC) ValidateBlock(ctx context.Context, b *types.FullBlock) } } - return xerrors.Errorf("parent state root did not match computed state (%s != %s)", stateroot, h.ParentStateRoot) + return xerrors.Errorf("parent state root did not match computed state (%s != %s)", h.ParentStateRoot, stateroot) } if precp != h.ParentMessageReceipts { From 85447abe7f6d8fbdcad0eb69b621aa10c74f8356 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Mon, 24 Jan 2022 19:43:16 +0000 Subject: [PATCH 248/393] tvx: supply network version when extracting messages. --- cmd/tvx/extract_message.go | 34 ++++++++++++++++++++-------------- cmd/tvx/simulate.go | 1 + 2 files changed, 21 insertions(+), 14 deletions(-) diff --git a/cmd/tvx/extract_message.go b/cmd/tvx/extract_message.go index 71035867f29..68376654af8 100644 --- a/cmd/tvx/extract_message.go +++ b/cmd/tvx/extract_message.go @@ -8,12 +8,11 @@ import ( "io" "log" - "github.com/filecoin-project/lotus/api/v0api" - "github.com/fatih/color" "github.com/filecoin-project/go-address" "github.com/filecoin-project/lotus/api" + "github.com/filecoin-project/lotus/api/v0api" "github.com/filecoin-project/lotus/chain/actors/builtin" init_ "github.com/filecoin-project/lotus/chain/actors/builtin/init" "github.com/filecoin-project/lotus/chain/actors/builtin/reward" @@ -43,6 +42,15 @@ func doExtractMessage(opts extractOpts) error { return fmt.Errorf("failed to resolve message and tipsets from chain: %w", err) } + // Assumes that the desired message isn't at the boundary of network versions. + // Otherwise this will be inaccurate. But it's such a tiny edge case that + // it's not worth spending the time to support boundary messages unless + // actually needed. + nv, err := FullAPI.StateNetworkVersion(ctx, incTs.Key()) + if err != nil { + return fmt.Errorf("failed to resolve network version from inclusion height: %w", err) + } + // get the circulating supply before the message was executed. circSupplyDetail, err := FullAPI.StateVMCirculatingSupplyInternal(ctx, incTs.Key()) if err != nil { @@ -53,6 +61,7 @@ func doExtractMessage(opts extractOpts) error { log.Printf("message was executed in tipset: %s", execTs.Key()) log.Printf("message was included in tipset: %s", incTs.Key()) + log.Printf("network version at inclusion: %d", nv) log.Printf("circulating supply at inclusion tipset: %d", circSupply) log.Printf("finding precursor messages using mode: %s", opts.precursor) @@ -110,7 +119,8 @@ func doExtractMessage(opts extractOpts) error { CircSupply: circSupplyDetail.FilCirculating, BaseFee: basefee, // recorded randomness will be discarded. - Rand: conformance.NewRecordingRand(new(conformance.LogReporter), FullAPI), + Rand: conformance.NewRecordingRand(new(conformance.LogReporter), FullAPI), + NetworkVersion: nv, }) if err != nil { return fmt.Errorf("failed to execute precursor message: %w", err) @@ -140,12 +150,13 @@ func doExtractMessage(opts extractOpts) error { preroot = root applyret, postroot, err = driver.ExecuteMessage(pst.Blockstore, conformance.ExecuteMessageParams{ - Preroot: preroot, - Epoch: execTs.Height(), - Message: msg, - CircSupply: circSupplyDetail.FilCirculating, - BaseFee: basefee, - Rand: recordingRand, + Preroot: preroot, + Epoch: execTs.Height(), + Message: msg, + CircSupply: circSupplyDetail.FilCirculating, + BaseFee: basefee, + Rand: recordingRand, + NetworkVersion: nv, }) if err != nil { return fmt.Errorf("failed to execute message: %w", err) @@ -263,11 +274,6 @@ func doExtractMessage(opts extractOpts) error { return err } - nv, err := FullAPI.StateNetworkVersion(ctx, execTs.Key()) - if err != nil { - return err - } - codename := GetProtocolCodename(execTs.Height()) // Write out the test vector. diff --git a/cmd/tvx/simulate.go b/cmd/tvx/simulate.go index da9a034e923..5428e16ee31 100644 --- a/cmd/tvx/simulate.go +++ b/cmd/tvx/simulate.go @@ -129,6 +129,7 @@ func runSimulateCmd(_ *cli.Context) error { CircSupply: circSupply.FilCirculating, BaseFee: baseFee, Rand: rand, + // TODO NetworkVersion }) if err != nil { return fmt.Errorf("failed to apply message: %w", err) From 3aab77af8d91ad022e54f155803817d1f2bb3a0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Mon, 24 Jan 2022 20:13:04 +0000 Subject: [PATCH 249/393] tvx: add missing network upgrade names. --- cmd/tvx/codenames.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/cmd/tvx/codenames.go b/cmd/tvx/codenames.go index f8da07e8d88..81143c85ce0 100644 --- a/cmd/tvx/codenames.go +++ b/cmd/tvx/codenames.go @@ -24,6 +24,15 @@ var ProtocolCodenames = []struct { {build.UpgradeTapeHeight + 1, "tape"}, {build.UpgradeLiftoffHeight + 1, "liftoff"}, {build.UpgradeKumquatHeight + 1, "postliftoff"}, + {build.UpgradeCalicoHeight + 1, "calico"}, + {build.UpgradePersianHeight + 1, "persian"}, + {build.UpgradeOrangeHeight + 1, "orange"}, + {build.UpgradeTrustHeight + 1, "trust"}, + {build.UpgradeNorwegianHeight + 1, "norwegian"}, + {build.UpgradeTurboHeight + 1, "turbo"}, + {build.UpgradeHyperdriveHeight + 1, "hyperdrive"}, + {build.UpgradeChocolateHeight + 1, "chocolate"}, + {build.UpgradeOhSnapHeight + 1, "ohsnap"}, } // GetProtocolCodename gets the protocol codename associated with a height. From 0358ad83cb803593bcc3868ddca9bcdb6a8bb5a6 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Mon, 24 Jan 2022 15:44:20 -0500 Subject: [PATCH 250/393] Update params_2k.go --- build/params_2k.go | 1 + 1 file changed, 1 insertion(+) diff --git a/build/params_2k.go b/build/params_2k.go index 0c31ce5ce81..aa1beed36a0 100644 --- a/build/params_2k.go +++ b/build/params_2k.go @@ -90,6 +90,7 @@ func init() { UpgradeTurboHeight = getUpgradeHeight("LOTUS_ACTORSV4_HEIGHT", UpgradeTurboHeight) UpgradeHyperdriveHeight = getUpgradeHeight("LOTUS_HYPERDRIVE_HEIGHT", UpgradeHyperdriveHeight) UpgradeChocolateHeight = getUpgradeHeight("LOTUS_CHOCOLATE_HEIGHT", UpgradeChocolateHeight) + UpgradeOhSnapHeight = getUpgradeHeight("LOTUS_OHSNAP_HEIGHT", UpgradeOhSnapHeight) BuildType |= Build2k From 92e6f29cc8305404d6a38de47d7b39bf2f0146c5 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Mon, 24 Jan 2022 18:28:52 -0500 Subject: [PATCH 251/393] chore: sealer: quieten a log --- extern/sector-storage/manager.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extern/sector-storage/manager.go b/extern/sector-storage/manager.go index 07bae541037..b38c92b2f9e 100644 --- a/extern/sector-storage/manager.go +++ b/extern/sector-storage/manager.go @@ -722,7 +722,7 @@ func (m *Manager) ReplicaUpdate(ctx context.Context, sector storage.SectorRef, p selector := newAllocSelector(m.index, storiface.FTUpdate|storiface.FTUpdateCache, storiface.PathSealing) err = m.sched.Schedule(ctx, sector, sealtasks.TTReplicaUpdate, selector, m.schedFetch(sector, storiface.FTUnsealed|storiface.FTSealed|storiface.FTCache, storiface.PathSealing, storiface.AcquireCopy), func(ctx context.Context, w Worker) error { - log.Errorf("scheduled work for replica update") + log.Infof("scheduled work for replica update") err := m.startWork(ctx, w, wk)(w.ReplicaUpdate(ctx, sector, pieces)) if err != nil { return xerrors.Errorf("startWork: %w", err) From 25284b5325c33771759fad66891cc76f0b5c21f1 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 25 Jan 2022 16:31:45 +0200 Subject: [PATCH 252/393] refactor: eliminate distinction between markset and markset visitors --- blockstore/splitstore/markset.go | 18 ++------- blockstore/splitstore/markset_badger.go | 13 +----- blockstore/splitstore/markset_map.go | 44 +++++---------------- blockstore/splitstore/markset_test.go | 2 +- blockstore/splitstore/splitstore.go | 4 -- blockstore/splitstore/splitstore_check.go | 2 +- blockstore/splitstore/splitstore_compact.go | 14 +++---- blockstore/splitstore/splitstore_warmup.go | 2 +- 8 files changed, 24 insertions(+), 75 deletions(-) diff --git a/blockstore/splitstore/markset.go b/blockstore/splitstore/markset.go index 218681e13cc..f173be575b4 100644 --- a/blockstore/splitstore/markset.go +++ b/blockstore/splitstore/markset.go @@ -10,20 +10,12 @@ import ( var errMarkSetClosed = errors.New("markset closed") -// MarkSet is a utility to keep track of seen CID, and later query for them. -// -// * If the expected dataset is large, it can be backed by a datastore (e.g. bbolt). -// * If a probabilistic result is acceptable, it can be backed by a bloom filter +// MarkSet is an interface for tracking CIDs during chain and object walks type MarkSet interface { + ObjectVisitor Mark(cid.Cid) error Has(cid.Cid) (bool, error) Close() error - SetConcurrent() -} - -type MarkSetVisitor interface { - MarkSet - ObjectVisitor } type MarkSetEnv interface { @@ -31,11 +23,7 @@ type MarkSetEnv interface { // name is a unique name for this markset, mapped to the filesystem in disk-backed environments // sizeHint is a hint about the expected size of the markset Create(name string, sizeHint int64) (MarkSet, error) - // CreateVisitor is like Create, but returns a wider interface that supports atomic visits. - // It may not be supported by some markset types (e.g. bloom). - CreateVisitor(name string, sizeHint int64) (MarkSetVisitor, error) - // SupportsVisitor returns true if the marksets created by this environment support the visitor interface. - SupportsVisitor() bool + // Close closes the markset Close() error } diff --git a/blockstore/splitstore/markset_badger.go b/blockstore/splitstore/markset_badger.go index ae06a69f87e..e30334b8912 100644 --- a/blockstore/splitstore/markset_badger.go +++ b/blockstore/splitstore/markset_badger.go @@ -34,7 +34,6 @@ type BadgerMarkSet struct { } var _ MarkSet = (*BadgerMarkSet)(nil) -var _ MarkSetVisitor = (*BadgerMarkSet)(nil) var badgerMarkSetBatchSize = 16384 @@ -48,7 +47,7 @@ func NewBadgerMarkSetEnv(path string) (MarkSetEnv, error) { return &BadgerMarkSetEnv{path: msPath}, nil } -func (e *BadgerMarkSetEnv) create(name string, sizeHint int64) (*BadgerMarkSet, error) { +func (e *BadgerMarkSetEnv) Create(name string, sizeHint int64) (MarkSet, error) { name += ".tmp" path := filepath.Join(e.path, name) @@ -68,16 +67,6 @@ func (e *BadgerMarkSetEnv) create(name string, sizeHint int64) (*BadgerMarkSet, return ms, nil } -func (e *BadgerMarkSetEnv) Create(name string, sizeHint int64) (MarkSet, error) { - return e.create(name, sizeHint) -} - -func (e *BadgerMarkSetEnv) CreateVisitor(name string, sizeHint int64) (MarkSetVisitor, error) { - return e.create(name, sizeHint) -} - -func (e *BadgerMarkSetEnv) SupportsVisitor() bool { return true } - func (e *BadgerMarkSetEnv) Close() error { return os.RemoveAll(e.path) } diff --git a/blockstore/splitstore/markset_map.go b/blockstore/splitstore/markset_map.go index 07a7ae70d4c..fda964663ef 100644 --- a/blockstore/splitstore/markset_map.go +++ b/blockstore/splitstore/markset_map.go @@ -13,42 +13,27 @@ var _ MarkSetEnv = (*MapMarkSetEnv)(nil) type MapMarkSet struct { mx sync.RWMutex set map[string]struct{} - - ts bool } var _ MarkSet = (*MapMarkSet)(nil) -var _ MarkSetVisitor = (*MapMarkSet)(nil) func NewMapMarkSetEnv() (*MapMarkSetEnv, error) { return &MapMarkSetEnv{}, nil } -func (e *MapMarkSetEnv) create(name string, sizeHint int64) (*MapMarkSet, error) { +func (e *MapMarkSetEnv) Create(name string, sizeHint int64) (MarkSet, error) { return &MapMarkSet{ set: make(map[string]struct{}, sizeHint), }, nil } -func (e *MapMarkSetEnv) Create(name string, sizeHint int64) (MarkSet, error) { - return e.create(name, sizeHint) -} - -func (e *MapMarkSetEnv) CreateVisitor(name string, sizeHint int64) (MarkSetVisitor, error) { - return e.create(name, sizeHint) -} - -func (e *MapMarkSetEnv) SupportsVisitor() bool { return true } - func (e *MapMarkSetEnv) Close() error { return nil } func (s *MapMarkSet) Mark(cid cid.Cid) error { - if s.ts { - s.mx.Lock() - defer s.mx.Unlock() - } + s.mx.Lock() + defer s.mx.Unlock() if s.set == nil { return errMarkSetClosed @@ -59,10 +44,8 @@ func (s *MapMarkSet) Mark(cid cid.Cid) error { } func (s *MapMarkSet) Has(cid cid.Cid) (bool, error) { - if s.ts { - s.mx.RLock() - defer s.mx.RUnlock() - } + s.mx.RLock() + defer s.mx.RUnlock() if s.set == nil { return false, errMarkSetClosed @@ -73,10 +56,8 @@ func (s *MapMarkSet) Has(cid cid.Cid) (bool, error) { } func (s *MapMarkSet) Visit(c cid.Cid) (bool, error) { - if s.ts { - s.mx.Lock() - defer s.mx.Unlock() - } + s.mx.Lock() + defer s.mx.Unlock() if s.set == nil { return false, errMarkSetClosed @@ -92,14 +73,9 @@ func (s *MapMarkSet) Visit(c cid.Cid) (bool, error) { } func (s *MapMarkSet) Close() error { - if s.ts { - s.mx.Lock() - defer s.mx.Unlock() - } + s.mx.Lock() + defer s.mx.Unlock() + s.set = nil return nil } - -func (s *MapMarkSet) SetConcurrent() { - s.ts = true -} diff --git a/blockstore/splitstore/markset_test.go b/blockstore/splitstore/markset_test.go index a4a42e8601b..de9421f0894 100644 --- a/blockstore/splitstore/markset_test.go +++ b/blockstore/splitstore/markset_test.go @@ -167,7 +167,7 @@ func testMarkSetVisitor(t *testing.T, lsType string) { } defer env.Close() //nolint:errcheck - visitor, err := env.CreateVisitor("test", 0) + visitor, err := env.Create("test", 0) if err != nil { t.Fatal(err) } diff --git a/blockstore/splitstore/splitstore.go b/blockstore/splitstore/splitstore.go index f6715ea333c..62cb2459e54 100644 --- a/blockstore/splitstore/splitstore.go +++ b/blockstore/splitstore/splitstore.go @@ -186,10 +186,6 @@ func Open(path string, ds dstore.Datastore, hot, cold bstore.Blockstore, cfg *Co return nil, err } - if !markSetEnv.SupportsVisitor() { - return nil, xerrors.Errorf("markset type does not support atomic visitors") - } - // and now we can make a SplitStore ss := &SplitStore{ cfg: cfg, diff --git a/blockstore/splitstore/splitstore_check.go b/blockstore/splitstore/splitstore_check.go index c83ed7b285a..a36d0b78d0c 100644 --- a/blockstore/splitstore/splitstore_check.go +++ b/blockstore/splitstore/splitstore_check.go @@ -84,7 +84,7 @@ func (s *SplitStore) doCheck(curTs *types.TipSet) error { var coldCnt, missingCnt int64 - visitor, err := s.markSetEnv.CreateVisitor("check", 0) + visitor, err := s.markSetEnv.Create("check", 0) if err != nil { return xerrors.Errorf("error creating visitor: %w", err) } diff --git a/blockstore/splitstore/splitstore_compact.go b/blockstore/splitstore/splitstore_compact.go index 13ab90ac006..755cf979d63 100644 --- a/blockstore/splitstore/splitstore_compact.go +++ b/blockstore/splitstore/splitstore_compact.go @@ -227,7 +227,7 @@ func (s *SplitStore) trackTxnRefMany(cids []cid.Cid) { } // protect all pending transactional references -func (s *SplitStore) protectTxnRefs(markSet MarkSetVisitor) error { +func (s *SplitStore) protectTxnRefs(markSet MarkSet) error { for { var txnRefs map[cid.Cid]struct{} @@ -299,7 +299,7 @@ func (s *SplitStore) protectTxnRefs(markSet MarkSetVisitor) error { // transactionally protect a reference by walking the object and marking. // concurrent markings are short circuited by checking the markset. -func (s *SplitStore) doTxnProtect(root cid.Cid, markSet MarkSetVisitor) error { +func (s *SplitStore) doTxnProtect(root cid.Cid, markSet MarkSet) error { if err := s.checkClosing(); err != nil { return err } @@ -397,7 +397,7 @@ func (s *SplitStore) doCompact(curTs *types.TipSet) error { log.Infow("running compaction", "currentEpoch", currentEpoch, "baseEpoch", s.baseEpoch, "boundaryEpoch", boundaryEpoch, "inclMsgsEpoch", inclMsgsEpoch, "compactionIndex", s.compactionIndex) - markSet, err := s.markSetEnv.CreateVisitor("live", s.markSetSize) + markSet, err := s.markSetEnv.Create("live", s.markSetSize) if err != nil { return xerrors.Errorf("error creating mark set: %w", err) } @@ -602,8 +602,8 @@ func (s *SplitStore) beginTxnProtect() { s.txnMissing = make(map[cid.Cid]struct{}) } -func (s *SplitStore) beginTxnMarking(markSet MarkSetVisitor) { - markSet.SetConcurrent() +func (s *SplitStore) beginTxnMarking(markSet MarkSet) { + log.Info("beginning transactional marking") } func (s *SplitStore) endTxnProtect() { @@ -1011,7 +1011,7 @@ func (s *SplitStore) purgeBatch(cids []cid.Cid, deleteBatch func([]cid.Cid) erro return nil } -func (s *SplitStore) purge(cids []cid.Cid, markSet MarkSetVisitor) error { +func (s *SplitStore) purge(cids []cid.Cid, markSet MarkSet) error { deadCids := make([]cid.Cid, 0, batchSize) var purgeCnt, liveCnt int defer func() { @@ -1077,7 +1077,7 @@ func (s *SplitStore) purge(cids []cid.Cid, markSet MarkSetVisitor) error { // have this gem[TM]. // My best guess is that they are parent message receipts or yet to be computed state roots; magik // thinks the cause may be block validation. -func (s *SplitStore) waitForMissingRefs(markSet MarkSetVisitor) { +func (s *SplitStore) waitForMissingRefs(markSet MarkSet) { s.txnLk.Lock() missing := s.txnMissing s.txnMissing = nil diff --git a/blockstore/splitstore/splitstore_warmup.go b/blockstore/splitstore/splitstore_warmup.go index 2a39f6c9d8d..977c4d392b8 100644 --- a/blockstore/splitstore/splitstore_warmup.go +++ b/blockstore/splitstore/splitstore_warmup.go @@ -60,7 +60,7 @@ func (s *SplitStore) doWarmup(curTs *types.TipSet) error { xcount := int64(0) missing := int64(0) - visitor, err := s.markSetEnv.CreateVisitor("warmup", 0) + visitor, err := s.markSetEnv.Create("warmup", 0) if err != nil { return xerrors.Errorf("error creating visitor: %w", err) } From 7c8edf5632aa2133a2c292daa1ce083e4df39a1e Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 25 Jan 2022 17:29:02 +0200 Subject: [PATCH 253/393] parallelize walkChain --- blockstore/splitstore/splitstore_compact.go | 58 ++++++++++++++++----- blockstore/splitstore/visitor.go | 30 +++++++++-- 2 files changed, 69 insertions(+), 19 deletions(-) diff --git a/blockstore/splitstore/splitstore_compact.go b/blockstore/splitstore/splitstore_compact.go index 755cf979d63..d406434dfd8 100644 --- a/blockstore/splitstore/splitstore_compact.go +++ b/blockstore/splitstore/splitstore_compact.go @@ -5,6 +5,7 @@ import ( "errors" "runtime" "sort" + "sync" "sync/atomic" "time" @@ -306,7 +307,7 @@ func (s *SplitStore) doTxnProtect(root cid.Cid, markSet MarkSet) error { // Note: cold objects are deleted heaviest first, so the consituents of an object // cannot be deleted before the object itself. - return s.walkObjectIncomplete(root, tmpVisitor(), + return s.walkObjectIncomplete(root, newTmpVisitor(), func(c cid.Cid) error { if isUnitaryObject(c) { return errStopWalk @@ -621,26 +622,31 @@ func (s *SplitStore) endTxnProtect() { func (s *SplitStore) walkChain(ts *types.TipSet, inclState, inclMsgs abi.ChainEpoch, visitor ObjectVisitor, f func(cid.Cid) error) error { - var walked *cid.Set + var walked ObjectVisitor + var mx sync.Mutex toWalk := ts.Cids() - walkCnt := 0 - scanCnt := 0 + walkCnt := new(int64) + scanCnt := new(int64) stopWalk := func(_ cid.Cid) error { return errStopWalk } walkBlock := func(c cid.Cid) error { - if !walked.Visit(c) { + visit, err := walked.Visit(c) + if err != nil { + return err + } + if !visit { return nil } - walkCnt++ + atomic.AddInt64(walkCnt, 1) if err := f(c); err != nil { return err } var hdr types.BlockHeader - err := s.view(c, func(data []byte) error { + err = s.view(c, func(data []byte) error { return hdr.UnmarshalCBOR(bytes.NewBuffer(data)) }) @@ -676,16 +682,23 @@ func (s *SplitStore) walkChain(ts *types.TipSet, inclState, inclMsgs abi.ChainEp if err := s.walkObject(hdr.ParentStateRoot, visitor, f); err != nil { return xerrors.Errorf("error walking state root (cid: %s): %w", hdr.ParentStateRoot, err) } - scanCnt++ + atomic.AddInt64(scanCnt, 1) } if hdr.Height > 0 { + mx.Lock() toWalk = append(toWalk, hdr.Parents...) + mx.Unlock() } return nil } + workers := runtime.NumCPU() / 2 + if workers < 2 { + workers = 2 + } + for len(toWalk) > 0 { // walking can take a while, so check this with every opportunity if err := s.checkClosing(); err != nil { @@ -695,17 +708,34 @@ func (s *SplitStore) walkChain(ts *types.TipSet, inclState, inclMsgs abi.ChainEp // the walk is BFS, so we can reset the walked set in every iteration and avoid building up // a set that contains all blocks (1M epochs -> 5M blocks -> 200MB worth of memory and growing // over time) - walked = cid.NewSet() + walked = newConcurrentVisitor() walking := toWalk toWalk = nil + + workch := make(chan cid.Cid, len(walking)) for _, c := range walking { - if err := walkBlock(c); err != nil { - return xerrors.Errorf("error walking block (cid: %s): %w", c, err) - } + workch <- c + } + close(workch) + + g := new(errgroup.Group) + for i := 0; i < workers; i++ { + g.Go(func() error { + for c := range workch { + if err := walkBlock(c); err != nil { + return xerrors.Errorf("error walking block (cid: %s): %w", c, err) + } + } + return nil + }) + } + + if err := g.Wait(); err != nil { + return err } } - log.Infow("chain walk done", "walked", walkCnt, "scanned", scanCnt) + log.Infow("chain walk done", "walked", *walkCnt, "scanned", *scanCnt) return nil } @@ -1106,7 +1136,7 @@ func (s *SplitStore) waitForMissingRefs(markSet MarkSet) { } towalk := missing - visitor := tmpVisitor() + visitor := newTmpVisitor() missing = make(map[cid.Cid]struct{}) for c := range towalk { diff --git a/blockstore/splitstore/visitor.go b/blockstore/splitstore/visitor.go index f89c8f3894e..9dfbb78e704 100644 --- a/blockstore/splitstore/visitor.go +++ b/blockstore/splitstore/visitor.go @@ -1,6 +1,8 @@ package splitstore import ( + "sync" + cid "github.com/ipfs/go-cid" ) @@ -17,16 +19,34 @@ func (v *noopVisitor) Visit(_ cid.Cid) (bool, error) { return true, nil } -type cidSetVisitor struct { +type tmpVisitor struct { set *cid.Set } -var _ ObjectVisitor = (*cidSetVisitor)(nil) +var _ ObjectVisitor = (*tmpVisitor)(nil) -func (v *cidSetVisitor) Visit(c cid.Cid) (bool, error) { +func (v *tmpVisitor) Visit(c cid.Cid) (bool, error) { return v.set.Visit(c), nil } -func tmpVisitor() ObjectVisitor { - return &cidSetVisitor{set: cid.NewSet()} +func newTmpVisitor() ObjectVisitor { + return &tmpVisitor{set: cid.NewSet()} +} + +type concurrentVisitor struct { + mx sync.Mutex + set *cid.Set +} + +var _ ObjectVisitor = (*concurrentVisitor)(nil) + +func newConcurrentVisitor() *concurrentVisitor { + return &concurrentVisitor{set: cid.NewSet()} +} + +func (v *concurrentVisitor) Visit(c cid.Cid) (bool, error) { + v.mx.Lock() + defer v.mx.Unlock() + + return v.set.Visit(c), nil } From 8e01e73de4722baa0d4d1dab0a2fe21106328f34 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 25 Jan 2022 19:47:58 +0200 Subject: [PATCH 254/393] dynamically compute number of workers for parallel chain walk --- blockstore/splitstore/splitstore_compact.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/blockstore/splitstore/splitstore_compact.go b/blockstore/splitstore/splitstore_compact.go index d406434dfd8..41578351b0a 100644 --- a/blockstore/splitstore/splitstore_compact.go +++ b/blockstore/splitstore/splitstore_compact.go @@ -694,11 +694,6 @@ func (s *SplitStore) walkChain(ts *types.TipSet, inclState, inclMsgs abi.ChainEp return nil } - workers := runtime.NumCPU() / 2 - if workers < 2 { - workers = 2 - } - for len(toWalk) > 0 { // walking can take a while, so check this with every opportunity if err := s.checkClosing(); err != nil { @@ -712,6 +707,11 @@ func (s *SplitStore) walkChain(ts *types.TipSet, inclState, inclMsgs abi.ChainEp walking := toWalk toWalk = nil + workers := len(walking) + if workers > runtime.NumCPU()/2 { + workers = runtime.NumCPU() / 2 + } + workch := make(chan cid.Cid, len(walking)) for _, c := range walking { workch <- c From 2d0929e305125d65bbc0fdb6e1ee39b19d64e69f Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 25 Jan 2022 12:55:56 -0500 Subject: [PATCH 255/393] remove a log --- extern/sector-storage/manager.go | 1 - 1 file changed, 1 deletion(-) diff --git a/extern/sector-storage/manager.go b/extern/sector-storage/manager.go index b38c92b2f9e..475c399e90b 100644 --- a/extern/sector-storage/manager.go +++ b/extern/sector-storage/manager.go @@ -722,7 +722,6 @@ func (m *Manager) ReplicaUpdate(ctx context.Context, sector storage.SectorRef, p selector := newAllocSelector(m.index, storiface.FTUpdate|storiface.FTUpdateCache, storiface.PathSealing) err = m.sched.Schedule(ctx, sector, sealtasks.TTReplicaUpdate, selector, m.schedFetch(sector, storiface.FTUnsealed|storiface.FTSealed|storiface.FTCache, storiface.PathSealing, storiface.AcquireCopy), func(ctx context.Context, w Worker) error { - log.Infof("scheduled work for replica update") err := m.startWork(ctx, w, wk)(w.ReplicaUpdate(ctx, sector, pieces)) if err != nil { return xerrors.Errorf("startWork: %w", err) From 10f2445a9909784d122aa4e7c24efbb573be17d8 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 25 Jan 2022 21:37:48 +0200 Subject: [PATCH 256/393] use minimum of 2 workers --- blockstore/splitstore/splitstore_compact.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/blockstore/splitstore/splitstore_compact.go b/blockstore/splitstore/splitstore_compact.go index 41578351b0a..ae47cf9a024 100644 --- a/blockstore/splitstore/splitstore_compact.go +++ b/blockstore/splitstore/splitstore_compact.go @@ -711,6 +711,9 @@ func (s *SplitStore) walkChain(ts *types.TipSet, inclState, inclMsgs abi.ChainEp if workers > runtime.NumCPU()/2 { workers = runtime.NumCPU() / 2 } + if workers < 2 { + workers = 2 + } workch := make(chan cid.Cid, len(walking)) for _, c := range walking { From fe47d6a1a4509fb1bdcde36edcb2edb2d007b74b Mon Sep 17 00:00:00 2001 From: vyzo Date: Wed, 26 Jan 2022 09:01:51 +0200 Subject: [PATCH 257/393] fix check and warmup for parallel walk --- blockstore/splitstore/splitstore_check.go | 15 ++++++++++----- blockstore/splitstore/splitstore_warmup.go | 21 +++++++++++++-------- 2 files changed, 23 insertions(+), 13 deletions(-) diff --git a/blockstore/splitstore/splitstore_check.go b/blockstore/splitstore/splitstore_check.go index a36d0b78d0c..0b4cfe04472 100644 --- a/blockstore/splitstore/splitstore_check.go +++ b/blockstore/splitstore/splitstore_check.go @@ -4,6 +4,7 @@ import ( "fmt" "os" "path/filepath" + "sync" "sync/atomic" "time" @@ -67,7 +68,10 @@ func (s *SplitStore) doCheck(curTs *types.TipSet) error { } defer output.Close() //nolint:errcheck + var mx sync.Mutex write := func(format string, args ...interface{}) { + mx.Lock() + defer mx.Unlock() _, err := fmt.Fprintf(output, format+"\n", args...) if err != nil { log.Warnf("error writing check output: %s", err) @@ -82,7 +86,8 @@ func (s *SplitStore) doCheck(curTs *types.TipSet) error { write("compaction index: %d", s.compactionIndex) write("--") - var coldCnt, missingCnt int64 + coldCnt := new(int64) + missingCnt := new(int64) visitor, err := s.markSetEnv.Create("check", 0) if err != nil { @@ -111,10 +116,10 @@ func (s *SplitStore) doCheck(curTs *types.TipSet) error { } if has { - coldCnt++ + atomic.AddInt64(coldCnt, 1) write("cold object reference: %s", c) } else { - missingCnt++ + atomic.AddInt64(missingCnt, 1) write("missing object reference: %s", c) return errStopWalk } @@ -128,9 +133,9 @@ func (s *SplitStore) doCheck(curTs *types.TipSet) error { return err } - log.Infow("check done", "cold", coldCnt, "missing", missingCnt) + log.Infow("check done", "cold", *coldCnt, "missing", *missingCnt) write("--") - write("cold: %d missing: %d", coldCnt, missingCnt) + write("cold: %d missing: %d", *coldCnt, *missingCnt) write("DONE") return nil diff --git a/blockstore/splitstore/splitstore_warmup.go b/blockstore/splitstore/splitstore_warmup.go index 977c4d392b8..0670bd0f6ff 100644 --- a/blockstore/splitstore/splitstore_warmup.go +++ b/blockstore/splitstore/splitstore_warmup.go @@ -1,6 +1,7 @@ package splitstore import ( + "sync" "sync/atomic" "time" @@ -55,10 +56,11 @@ func (s *SplitStore) doWarmup(curTs *types.TipSet) error { if WarmupBoundary < epoch { boundaryEpoch = epoch - WarmupBoundary } + var mx sync.Mutex batchHot := make([]blocks.Block, 0, batchSize) - count := int64(0) - xcount := int64(0) - missing := int64(0) + count := new(int64) + xcount := new(int64) + missing := new(int64) visitor, err := s.markSetEnv.Create("warmup", 0) if err != nil { @@ -73,7 +75,7 @@ func (s *SplitStore) doWarmup(curTs *types.TipSet) error { return errStopWalk } - count++ + atomic.AddInt64(count, 1) has, err := s.hot.Has(s.ctx, c) if err != nil { @@ -87,22 +89,25 @@ func (s *SplitStore) doWarmup(curTs *types.TipSet) error { blk, err := s.cold.Get(s.ctx, c) if err != nil { if err == bstore.ErrNotFound { - missing++ + atomic.AddInt64(missing, 1) return errStopWalk } return err } - xcount++ + atomic.AddInt64(xcount, 1) + mx.Lock() batchHot = append(batchHot, blk) if len(batchHot) == batchSize { err = s.hot.PutMany(s.ctx, batchHot) if err != nil { + mx.Unlock() return err } batchHot = batchHot[:0] } + mx.Unlock() return nil }) @@ -118,9 +123,9 @@ func (s *SplitStore) doWarmup(curTs *types.TipSet) error { } } - log.Infow("warmup stats", "visited", count, "warm", xcount, "missing", missing) + log.Infow("warmup stats", "visited", *count, "warm", *xcount, "missing", *missing) - s.markSetSize = count + count>>2 // overestimate a bit + s.markSetSize = *count + *count>>2 // overestimate a bit err = s.ds.Put(s.ctx, markSetSizeKey, int64ToBytes(s.markSetSize)) if err != nil { log.Warnf("error saving mark set size: %s", err) From 176ecd4c3bab58652b866efa78e90c45e49add6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 26 Jan 2022 15:39:58 +0100 Subject: [PATCH 258/393] mpool: Cache state nonces --- chain/messagepool/messagepool.go | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/chain/messagepool/messagepool.go b/chain/messagepool/messagepool.go index 5d1857bf222..76647e331b3 100644 --- a/chain/messagepool/messagepool.go +++ b/chain/messagepool/messagepool.go @@ -173,10 +173,17 @@ type MessagePool struct { sigValCache *lru.TwoQueueCache + nonceCache *lru.Cache + evtTypes [3]journal.EventType journal journal.Journal } +type nonceCacheKey struct { + tsk types.TipSetKey + addr address.Address +} + type msgSet struct { msgs map[uint64]*types.SignedMessage nextNonce uint64 @@ -361,6 +368,7 @@ func (ms *msgSet) toSlice() []*types.SignedMessage { func New(ctx context.Context, api Provider, ds dtypes.MetadataDS, us stmgr.UpgradeSchedule, netName dtypes.NetworkName, j journal.Journal) (*MessagePool, error) { cache, _ := lru.New2Q(build.BlsSignatureCacheSize) verifcache, _ := lru.New2Q(build.VerifSigCacheSize) + noncecache, _ := lru.New(256) cfg, err := loadConfig(ctx, ds) if err != nil { @@ -386,6 +394,7 @@ func New(ctx context.Context, api Provider, ds dtypes.MetadataDS, us stmgr.Upgra pruneCooldown: make(chan struct{}, 1), blsSigCache: cache, sigValCache: verifcache, + nonceCache: noncecache, changes: lps.New(50), localMsgs: namespace.Wrap(ds, datastore.NewKey(localMsgsDs)), api: api, @@ -1016,11 +1025,23 @@ func (mp *MessagePool) getStateNonce(ctx context.Context, addr address.Address, done := metrics.Timer(ctx, metrics.MpoolGetNonceDuration) defer done() + nk := nonceCacheKey{ + tsk: ts.Key(), + addr: addr, + } + + n, ok := mp.nonceCache.Get(nk) + if ok { + return n.(uint64), nil + } + act, err := mp.api.GetActorAfter(addr, ts) if err != nil { return 0, err } + mp.nonceCache.Add(nk, act.Nonce) + return act.Nonce, nil } From a87239e80218590cf68c2b1d3b653280ba5c9e35 Mon Sep 17 00:00:00 2001 From: vyzo Date: Wed, 26 Jan 2022 21:48:03 +0200 Subject: [PATCH 259/393] avoid extraneous assignment --- blockstore/splitstore/splitstore_compact.go | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/blockstore/splitstore/splitstore_compact.go b/blockstore/splitstore/splitstore_compact.go index ae47cf9a024..9ab718929c1 100644 --- a/blockstore/splitstore/splitstore_compact.go +++ b/blockstore/splitstore/splitstore_compact.go @@ -700,14 +700,7 @@ func (s *SplitStore) walkChain(ts *types.TipSet, inclState, inclMsgs abi.ChainEp return err } - // the walk is BFS, so we can reset the walked set in every iteration and avoid building up - // a set that contains all blocks (1M epochs -> 5M blocks -> 200MB worth of memory and growing - // over time) - walked = newConcurrentVisitor() - walking := toWalk - toWalk = nil - - workers := len(walking) + workers := len(toWalk) if workers > runtime.NumCPU()/2 { workers = runtime.NumCPU() / 2 } @@ -715,11 +708,16 @@ func (s *SplitStore) walkChain(ts *types.TipSet, inclState, inclMsgs abi.ChainEp workers = 2 } - workch := make(chan cid.Cid, len(walking)) - for _, c := range walking { + // the walk is BFS, so we can reset the walked set in every iteration and avoid building up + // a set that contains all blocks (1M epochs -> 5M blocks -> 200MB worth of memory and growing + // over time) + walked = newConcurrentVisitor() + workch := make(chan cid.Cid, len(toWalk)) + for _, c := range toWalk { workch <- c } close(workch) + toWalk = nil g := new(errgroup.Group) for i := 0; i < workers; i++ { From f07ce297f6c644f5632e750b9e98fb0d82d571df Mon Sep 17 00:00:00 2001 From: vyzo Date: Wed, 26 Jan 2022 21:55:24 +0200 Subject: [PATCH 260/393] optimize slice allocations in walk --- blockstore/splitstore/splitstore_compact.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/blockstore/splitstore/splitstore_compact.go b/blockstore/splitstore/splitstore_compact.go index 9ab718929c1..20f99af35c0 100644 --- a/blockstore/splitstore/splitstore_compact.go +++ b/blockstore/splitstore/splitstore_compact.go @@ -624,7 +624,9 @@ func (s *SplitStore) walkChain(ts *types.TipSet, inclState, inclMsgs abi.ChainEp visitor ObjectVisitor, f func(cid.Cid) error) error { var walked ObjectVisitor var mx sync.Mutex - toWalk := ts.Cids() + // we copy the tipset first into a new slice, which allows us to reuse it in every epoch. + toWalk := make([]cid.Cid, len(ts.Cids())) + copy(toWalk, ts.Cids()) walkCnt := new(int64) scanCnt := new(int64) @@ -717,7 +719,7 @@ func (s *SplitStore) walkChain(ts *types.TipSet, inclState, inclMsgs abi.ChainEp workch <- c } close(workch) - toWalk = nil + toWalk = toWalk[:0] g := new(errgroup.Group) for i := 0; i < workers; i++ { From 8c41e17c9393e1dd1ed4368ad476be000a0891c4 Mon Sep 17 00:00:00 2001 From: Darko Brdareski Date: Thu, 27 Jan 2022 10:56:33 +0100 Subject: [PATCH 261/393] Fix typo in client_test annotations --- node/impl/client/client_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/node/impl/client/client_test.go b/node/impl/client/client_test.go index 7ad4c9c15d2..1b195816dce 100644 --- a/node/impl/client/client_test.go +++ b/node/impl/client/client_test.go @@ -46,7 +46,7 @@ func TestImportLocal(t *testing.T) { b, err := testdata.ReadFile("testdata/payload.txt") require.NoError(t, err) - //stm @CLIENT_STORAGE_DEALS_LIST_IMPORTS_001 + //stm: @CLIENT_STORAGE_DEALS_LIST_IMPORTS_001 root, err := a.ClientImportLocal(ctx, bytes.NewReader(b)) require.NoError(t, err) require.NotEqual(t, cid.Undef, root) @@ -59,7 +59,7 @@ func TestImportLocal(t *testing.T) { require.Equal(t, root, *it.Root) require.True(t, strings.HasPrefix(it.CARPath, dir)) - //stm @CLIENT_DATA_HAS_LOCAL_001 + //stm: @CLIENT_DATA_HAS_LOCAL_001 local, err := a.ClientHasLocal(ctx, root) require.NoError(t, err) require.True(t, local) From 6b8f526df3bcb8f24a89fffa840cf7869c4bf41c Mon Sep 17 00:00:00 2001 From: Darko Brdareski Date: Thu, 27 Jan 2022 11:06:04 +0100 Subject: [PATCH 262/393] Fix merge --- itests/ccupgrade_test.go | 4 ---- 1 file changed, 4 deletions(-) diff --git a/itests/ccupgrade_test.go b/itests/ccupgrade_test.go index 475bb8eb088..51e70dd5bda 100644 --- a/itests/ccupgrade_test.go +++ b/itests/ccupgrade_test.go @@ -72,12 +72,8 @@ func runTestCCUpgrade(t *testing.T, upgradeHeight abi.ChainEpoch) *kit.TestFullN } waitForSectorActive(ctx, t, CCUpgrade, client, maddr) -<<<<<<< HEAD //stm: @SECTOR_CC_UPGRADE_001 - err = miner.SectorMarkForUpgrade(ctx, sl[0]) -======= err = miner.SectorMarkForUpgrade(ctx, sl[0], true) ->>>>>>> upstream/master require.NoError(t, err) sl, err = miner.SectorsList(ctx) From 45c2f3429532f3a4507e31d1f0dcd491db1ece51 Mon Sep 17 00:00:00 2001 From: vyzo Date: Fri, 28 Jan 2022 15:41:33 +0200 Subject: [PATCH 263/393] refactor marksets for critical section on-disk persistence --- blockstore/splitstore/markset.go | 16 +- blockstore/splitstore/markset_badger.go | 73 ++++++-- blockstore/splitstore/markset_map.go | 183 +++++++++++++++++++- blockstore/splitstore/markset_test.go | 10 +- blockstore/splitstore/splitstore_check.go | 2 +- blockstore/splitstore/splitstore_compact.go | 2 +- blockstore/splitstore/splitstore_warmup.go | 2 +- 7 files changed, 252 insertions(+), 36 deletions(-) diff --git a/blockstore/splitstore/markset.go b/blockstore/splitstore/markset.go index f173be575b4..90ce282f4c4 100644 --- a/blockstore/splitstore/markset.go +++ b/blockstore/splitstore/markset.go @@ -16,13 +16,21 @@ type MarkSet interface { Mark(cid.Cid) error Has(cid.Cid) (bool, error) Close() error + + // BeginCriticalSection ensures that the markset is persisted to disk for recovery in case + // of abnormal termination during the critical section span. + BeginCriticalSection() error + // EndCriticalSection ends the critical section span. + EndCriticalSection() } type MarkSetEnv interface { - // Create creates a new markset within the environment. - // name is a unique name for this markset, mapped to the filesystem in disk-backed environments + // New creates a new markset within the environment. + // name is a unique name for this markset, mapped to the filesystem for on-disk persistence. // sizeHint is a hint about the expected size of the markset - Create(name string, sizeHint int64) (MarkSet, error) + New(name string, sizeHint int64) (MarkSet, error) + // Recover recovers an existing markset persisted on-disk. + Recover(name string) (MarkSet, error) // Close closes the markset Close() error } @@ -30,7 +38,7 @@ type MarkSetEnv interface { func OpenMarkSetEnv(path string, mtype string) (MarkSetEnv, error) { switch mtype { case "map": - return NewMapMarkSetEnv() + return NewMapMarkSetEnv(path) case "badger": return NewBadgerMarkSetEnv(path) default: diff --git a/blockstore/splitstore/markset_badger.go b/blockstore/splitstore/markset_badger.go index e30334b8912..b5e7b54976a 100644 --- a/blockstore/splitstore/markset_badger.go +++ b/blockstore/splitstore/markset_badger.go @@ -28,6 +28,7 @@ type BadgerMarkSet struct { writers int seqno int version int + persist bool db *badger.DB path string @@ -47,11 +48,10 @@ func NewBadgerMarkSetEnv(path string) (MarkSetEnv, error) { return &BadgerMarkSetEnv{path: msPath}, nil } -func (e *BadgerMarkSetEnv) Create(name string, sizeHint int64) (MarkSet, error) { - name += ".tmp" +func (e *BadgerMarkSetEnv) New(name string, sizeHint int64) (MarkSet, error) { path := filepath.Join(e.path, name) - db, err := openTransientBadgerDB(path) + db, err := openBadgerDB(path, false) if err != nil { return nil, xerrors.Errorf("error creating badger db: %w", err) } @@ -67,8 +67,43 @@ func (e *BadgerMarkSetEnv) Create(name string, sizeHint int64) (MarkSet, error) return ms, nil } +func (e *BadgerMarkSetEnv) Recover(name string) (MarkSet, error) { + path := filepath.Join(e.path, name) + + db, err := openBadgerDB(path, true) + if err != nil { + return nil, xerrors.Errorf("error creating badger db: %w", err) + } + + ms := &BadgerMarkSet{ + pend: make(map[string]struct{}), + writing: make(map[int]map[string]struct{}), + db: db, + path: path, + persist: true, + } + ms.cond.L = &ms.mx + + return ms, nil +} + func (e *BadgerMarkSetEnv) Close() error { - return os.RemoveAll(e.path) + return nil +} + +func (s *BadgerMarkSet) BeginCriticalSection() error { + s.mx.Lock() + defer s.mx.Unlock() + + s.persist = true + return nil +} + +func (s *BadgerMarkSet) EndCriticalSection() { + s.mx.Lock() + defer s.mx.Unlock() + + s.persist = false } func (s *BadgerMarkSet) Mark(c cid.Cid) error { @@ -193,7 +228,7 @@ func (s *BadgerMarkSet) tryDB(key []byte) (has bool, err error) { // writer holds the exclusive lock func (s *BadgerMarkSet) put(key string) (write bool, seqno int) { s.pend[key] = struct{}{} - if len(s.pend) < badgerMarkSetBatchSize { + if !s.persist && len(s.pend) < badgerMarkSetBatchSize { return false, 0 } @@ -266,21 +301,23 @@ func (s *BadgerMarkSet) Close() error { db := s.db s.db = nil - return closeTransientBadgerDB(db, s.path) + return closeBadgerDB(db, s.path, s.persist) } func (s *BadgerMarkSet) SetConcurrent() {} -func openTransientBadgerDB(path string) (*badger.DB, error) { - // clean up first - err := os.RemoveAll(path) - if err != nil { - return nil, xerrors.Errorf("error clearing markset directory: %w", err) - } +func openBadgerDB(path string, recover bool) (*badger.DB, error) { + // if it is not a recovery, clean up first + if !recover { + err := os.RemoveAll(path) + if err != nil { + return nil, xerrors.Errorf("error clearing markset directory: %w", err) + } - err = os.MkdirAll(path, 0755) //nolint:gosec - if err != nil { - return nil, xerrors.Errorf("error creating markset directory: %w", err) + err = os.MkdirAll(path, 0755) //nolint:gosec + if err != nil { + return nil, xerrors.Errorf("error creating markset directory: %w", err) + } } opts := badger.DefaultOptions(path) @@ -302,12 +339,16 @@ func openTransientBadgerDB(path string) (*badger.DB, error) { return badger.Open(opts) } -func closeTransientBadgerDB(db *badger.DB, path string) error { +func closeBadgerDB(db *badger.DB, path string, persist bool) error { err := db.Close() if err != nil { return xerrors.Errorf("error closing badger markset: %w", err) } + if persist { + return nil + } + err = os.RemoveAll(path) if err != nil { return xerrors.Errorf("error deleting badger markset: %w", err) diff --git a/blockstore/splitstore/markset_map.go b/blockstore/splitstore/markset_map.go index fda964663ef..dd6c0d819b7 100644 --- a/blockstore/splitstore/markset_map.go +++ b/blockstore/splitstore/markset_map.go @@ -1,37 +1,104 @@ package splitstore import ( + "bufio" + "io" + "os" + "path/filepath" "sync" + "golang.org/x/xerrors" + cid "github.com/ipfs/go-cid" ) -type MapMarkSetEnv struct{} +type MapMarkSetEnv struct { + path string +} var _ MarkSetEnv = (*MapMarkSetEnv)(nil) type MapMarkSet struct { mx sync.RWMutex set map[string]struct{} + + persist bool + file *os.File + buf *bufio.Writer + + path string } var _ MarkSet = (*MapMarkSet)(nil) -func NewMapMarkSetEnv() (*MapMarkSetEnv, error) { - return &MapMarkSetEnv{}, nil +func NewMapMarkSetEnv(path string) (*MapMarkSetEnv, error) { + msPath := filepath.Join(path, "markset.map") + err := os.MkdirAll(msPath, 0755) //nolint:gosec + if err != nil { + return nil, xerrors.Errorf("error creating markset directory: %w", err) + } + + return &MapMarkSetEnv{path: msPath}, nil } -func (e *MapMarkSetEnv) Create(name string, sizeHint int64) (MarkSet, error) { +func (e *MapMarkSetEnv) New(name string, sizeHint int64) (MarkSet, error) { + path := filepath.Join(e.path, name) return &MapMarkSet{ - set: make(map[string]struct{}, sizeHint), + set: make(map[string]struct{}, sizeHint), + path: path, }, nil } +func (e *MapMarkSetEnv) Recover(name string) (MarkSet, error) { + path := filepath.Join(e.path, name) + s := &MapMarkSet{ + set: make(map[string]struct{}), + path: path, + } + + in, err := os.Open(path) + if err != nil { + return nil, xerrors.Errorf("error opening markset file for read: %w", err) + } + defer in.Close() + + // wrap a buffered reader to make this faster + buf := bufio.NewReader(in) + for { + var sz byte + if sz, err = buf.ReadByte(); err != nil { + break + } + + key := make([]byte, int(sz)) + if _, err = buf.Read(key); err != nil { + break + } + + s.set[string(key)] = struct{}{} + } + + if err != io.EOF { + return nil, xerrors.Errorf("error reading markset file: %w", err) + } + + file, err := os.OpenFile(s.path, os.O_WRONLY|os.O_APPEND, 0) + if err != nil { + return nil, xerrors.Errorf("error opening markset file for write: %w", err) + } + + s.persist = true + s.file = file + s.buf = bufio.NewWriter(file) + + return s, nil +} + func (e *MapMarkSetEnv) Close() error { return nil } -func (s *MapMarkSet) Mark(cid cid.Cid) error { +func (s *MapMarkSet) BeginCriticalSection() error { s.mx.Lock() defer s.mx.Unlock() @@ -39,7 +106,66 @@ func (s *MapMarkSet) Mark(cid cid.Cid) error { return errMarkSetClosed } - s.set[string(cid.Hash())] = struct{}{} + if s.persist { + return nil + } + + file, err := os.OpenFile(s.path, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0644) + if err != nil { + return xerrors.Errorf("error opening markset file: %w", err) + } + + // wrap a buffered writer to make this faster + s.buf = bufio.NewWriter(file) + for key := range s.set { + if err := s.writeKey([]byte(key), false); err != nil { + _ = file.Close() + s.buf = nil + return err + } + } + if err := s.buf.Flush(); err != nil { + _ = file.Close() + s.buf = nil + return xerrors.Errorf("error flushing markset file buffer: %w", err) + } + + s.file = file + s.persist = true + + return nil +} + +func (s *MapMarkSet) EndCriticalSection() { + s.mx.Lock() + defer s.mx.Unlock() + + if !s.persist { + return + } + + _ = s.file.Close() + _ = os.Remove(s.path) + s.file = nil + s.buf = nil + s.persist = false +} + +func (s *MapMarkSet) Mark(c cid.Cid) error { + s.mx.Lock() + defer s.mx.Unlock() + + if s.set == nil { + return errMarkSetClosed + } + + hash := c.Hash() + s.set[string(hash)] = struct{}{} + + if s.persist { + return s.writeKey(hash, true) + } + return nil } @@ -63,12 +189,20 @@ func (s *MapMarkSet) Visit(c cid.Cid) (bool, error) { return false, errMarkSetClosed } - key := string(c.Hash()) + hash := c.Hash() + key := string(hash) if _, ok := s.set[key]; ok { return false, nil } s.set[key] = struct{}{} + + if s.persist { + if err := s.writeKey(hash, true); err != nil { + return false, err + } + } + return true, nil } @@ -76,6 +210,39 @@ func (s *MapMarkSet) Close() error { s.mx.Lock() defer s.mx.Unlock() + if s.set == nil { + return nil + } + s.set = nil + + if s.file != nil { + if err := s.file.Close(); err != nil { + log.Warnf("error closing markset file: %s", err) + } + + if !s.persist { + if err := os.Remove(s.path); err != nil { + log.Warnf("error removing markset file: %s", err) + } + } + } + + return nil +} + +func (s *MapMarkSet) writeKey(k []byte, flush bool) error { + if err := s.buf.WriteByte(byte(len(k))); err != nil { + return xerrors.Errorf("error writing markset key length to disk: %w", err) + } + if _, err := s.buf.Write(k); err != nil { + return xerrors.Errorf("error writing markset key to disk: %w", err) + } + if flush { + if err := s.buf.Flush(); err != nil { + return xerrors.Errorf("error flushing markset buffer to disk: %w", err) + } + } + return nil } diff --git a/blockstore/splitstore/markset_test.go b/blockstore/splitstore/markset_test.go index de9421f0894..8f6811001a4 100644 --- a/blockstore/splitstore/markset_test.go +++ b/blockstore/splitstore/markset_test.go @@ -42,12 +42,12 @@ func testMarkSet(t *testing.T, lsType string) { } defer env.Close() //nolint:errcheck - hotSet, err := env.Create("hot", 0) + hotSet, err := env.New("hot", 0) if err != nil { t.Fatal(err) } - coldSet, err := env.Create("cold", 0) + coldSet, err := env.New("cold", 0) if err != nil { t.Fatal(err) } @@ -114,12 +114,12 @@ func testMarkSet(t *testing.T, lsType string) { t.Fatal(err) } - hotSet, err = env.Create("hot", 0) + hotSet, err = env.New("hot", 0) if err != nil { t.Fatal(err) } - coldSet, err = env.Create("cold", 0) + coldSet, err = env.New("cold", 0) if err != nil { t.Fatal(err) } @@ -167,7 +167,7 @@ func testMarkSetVisitor(t *testing.T, lsType string) { } defer env.Close() //nolint:errcheck - visitor, err := env.Create("test", 0) + visitor, err := env.New("test", 0) if err != nil { t.Fatal(err) } diff --git a/blockstore/splitstore/splitstore_check.go b/blockstore/splitstore/splitstore_check.go index 0b4cfe04472..d7c9b2ef97b 100644 --- a/blockstore/splitstore/splitstore_check.go +++ b/blockstore/splitstore/splitstore_check.go @@ -89,7 +89,7 @@ func (s *SplitStore) doCheck(curTs *types.TipSet) error { coldCnt := new(int64) missingCnt := new(int64) - visitor, err := s.markSetEnv.Create("check", 0) + visitor, err := s.markSetEnv.New("check", 0) if err != nil { return xerrors.Errorf("error creating visitor: %w", err) } diff --git a/blockstore/splitstore/splitstore_compact.go b/blockstore/splitstore/splitstore_compact.go index 20f99af35c0..0d5a6f2f0d8 100644 --- a/blockstore/splitstore/splitstore_compact.go +++ b/blockstore/splitstore/splitstore_compact.go @@ -398,7 +398,7 @@ func (s *SplitStore) doCompact(curTs *types.TipSet) error { log.Infow("running compaction", "currentEpoch", currentEpoch, "baseEpoch", s.baseEpoch, "boundaryEpoch", boundaryEpoch, "inclMsgsEpoch", inclMsgsEpoch, "compactionIndex", s.compactionIndex) - markSet, err := s.markSetEnv.Create("live", s.markSetSize) + markSet, err := s.markSetEnv.New("live", s.markSetSize) if err != nil { return xerrors.Errorf("error creating mark set: %w", err) } diff --git a/blockstore/splitstore/splitstore_warmup.go b/blockstore/splitstore/splitstore_warmup.go index 0670bd0f6ff..b564f03c795 100644 --- a/blockstore/splitstore/splitstore_warmup.go +++ b/blockstore/splitstore/splitstore_warmup.go @@ -62,7 +62,7 @@ func (s *SplitStore) doWarmup(curTs *types.TipSet) error { xcount := new(int64) missing := new(int64) - visitor, err := s.markSetEnv.Create("warmup", 0) + visitor, err := s.markSetEnv.New("warmup", 0) if err != nil { return xerrors.Errorf("error creating visitor: %w", err) } From 1bf396f9af78cd562f5c2c7483828622f03b5b05 Mon Sep 17 00:00:00 2001 From: vyzo Date: Fri, 28 Jan 2022 15:49:41 +0200 Subject: [PATCH 264/393] add test for markset persistence --- blockstore/splitstore/markset_test.go | 93 +++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) diff --git a/blockstore/splitstore/markset_test.go b/blockstore/splitstore/markset_test.go index 8f6811001a4..1fac6551b9c 100644 --- a/blockstore/splitstore/markset_test.go +++ b/blockstore/splitstore/markset_test.go @@ -12,6 +12,7 @@ import ( func TestMapMarkSet(t *testing.T) { testMarkSet(t, "map") testMarkSetVisitor(t, "map") + testMarkSetVisitorPersistence(t, "map") } func TestBadgerMarkSet(t *testing.T) { @@ -22,6 +23,7 @@ func TestBadgerMarkSet(t *testing.T) { }) testMarkSet(t, "badger") testMarkSetVisitor(t, "badger") + testMarkSetVisitorPersistence(t, "badger") } func testMarkSet(t *testing.T, lsType string) { @@ -219,3 +221,94 @@ func testMarkSetVisitor(t *testing.T, lsType string) { mustNotVisit(visitor, k3) mustNotVisit(visitor, k4) } + +func testMarkSetVisitorPersistence(t *testing.T, lsType string) { + t.Helper() + + path, err := ioutil.TempDir("", "markset.*") + if err != nil { + t.Fatal(err) + } + + t.Cleanup(func() { + _ = os.RemoveAll(path) + }) + + env, err := OpenMarkSetEnv(path, lsType) + if err != nil { + t.Fatal(err) + } + defer env.Close() //nolint:errcheck + + visitor, err := env.New("test", 0) + if err != nil { + t.Fatal(err) + } + defer visitor.Close() //nolint:errcheck + + makeCid := func(key string) cid.Cid { + h, err := multihash.Sum([]byte(key), multihash.SHA2_256, -1) + if err != nil { + t.Fatal(err) + } + + return cid.NewCidV1(cid.Raw, h) + } + + mustVisit := func(v ObjectVisitor, cid cid.Cid) { + visit, err := v.Visit(cid) + if err != nil { + t.Fatal(err) + } + + if !visit { + t.Fatal("object should be visited") + } + } + + mustNotVisit := func(v ObjectVisitor, cid cid.Cid) { + visit, err := v.Visit(cid) + if err != nil { + t.Fatal(err) + } + + if visit { + t.Fatal("unexpected visit") + } + } + + k1 := makeCid("a") + k2 := makeCid("b") + k3 := makeCid("c") + k4 := makeCid("d") + + if err := visitor.BeginCriticalSection(); err != nil { + t.Fatal(err) + } + + mustVisit(visitor, k1) + mustVisit(visitor, k2) + mustVisit(visitor, k3) + mustVisit(visitor, k4) + + mustNotVisit(visitor, k1) + mustNotVisit(visitor, k2) + mustNotVisit(visitor, k3) + mustNotVisit(visitor, k4) + + if err := visitor.Close(); err != nil { + t.Fatal(err) + } + + visitor, err = env.Recover("test") + if err != nil { + t.Fatal(err) + } + + mustNotVisit(visitor, k1) + mustNotVisit(visitor, k2) + mustNotVisit(visitor, k3) + mustNotVisit(visitor, k4) + + visitor.EndCriticalSection() +} From 730aceac6d39a94efac38a944db2921e37969292 Mon Sep 17 00:00:00 2001 From: vyzo Date: Fri, 28 Jan 2022 15:55:10 +0200 Subject: [PATCH 265/393] immediately flush pending writes when entering critical section --- blockstore/splitstore/markset_badger.go | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/blockstore/splitstore/markset_badger.go b/blockstore/splitstore/markset_badger.go index b5e7b54976a..6f25b9d52fd 100644 --- a/blockstore/splitstore/markset_badger.go +++ b/blockstore/splitstore/markset_badger.go @@ -93,9 +93,29 @@ func (e *BadgerMarkSetEnv) Close() error { func (s *BadgerMarkSet) BeginCriticalSection() error { s.mx.Lock() - defer s.mx.Unlock() + + if s.persist { + s.mx.Unlock() + return nil + } + + var write bool + var seqno int + if len(s.pend) > 0 { + write = true + seqno := s.seqno + s.seqno++ + s.writing[seqno] = s.pend + s.pend = make(map[string]struct{}) + } s.persist = true + s.mx.Unlock() + + if write { + return s.write(seqno) + } + return nil } From 67fbf9eb003223cd4c5a373b6551bff1740a532c Mon Sep 17 00:00:00 2001 From: vyzo Date: Fri, 28 Jan 2022 15:55:34 +0200 Subject: [PATCH 266/393] improve peristence test --- blockstore/splitstore/markset_test.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/blockstore/splitstore/markset_test.go b/blockstore/splitstore/markset_test.go index 1fac6551b9c..cfbc7cf134e 100644 --- a/blockstore/splitstore/markset_test.go +++ b/blockstore/splitstore/markset_test.go @@ -282,12 +282,13 @@ func testMarkSetVisitorPersistence(t *testing.T, lsType string) { k3 := makeCid("c") k4 := makeCid("d") + mustVisit(visitor, k1) + mustVisit(visitor, k2) + if err := visitor.BeginCriticalSection(); err != nil { t.Fatal(err) } - mustVisit(visitor, k1) - mustVisit(visitor, k2) mustVisit(visitor, k3) mustVisit(visitor, k4) From f9fd47e7d08cceae15fcb9eb8e6c0178a04822ce Mon Sep 17 00:00:00 2001 From: vyzo Date: Sat, 29 Jan 2022 13:11:58 +0200 Subject: [PATCH 267/393] use temporary dir for splitstore test path --- blockstore/splitstore/splitstore_test.go | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/blockstore/splitstore/splitstore_test.go b/blockstore/splitstore/splitstore_test.go index 7d84e0a4ca6..3f507d49d63 100644 --- a/blockstore/splitstore/splitstore_test.go +++ b/blockstore/splitstore/splitstore_test.go @@ -4,6 +4,8 @@ import ( "context" "errors" "fmt" + "io/ioutil" + "os" "sync" "sync/atomic" "testing" @@ -80,8 +82,17 @@ func testSplitStore(t *testing.T, cfg *Config) { t.Fatal(err) } + path, err := ioutil.TempDir("", "splitstore.*") + if err != nil { + t.Fatal(err) + } + + t.Cleanup(func() { + _ = os.RemoveAll(path) + }) + // open the splitstore - ss, err := Open("", ds, hot, cold, cfg) + ss, err := Open(path, ds, hot, cold, cfg) if err != nil { t.Fatal(err) } @@ -259,8 +270,17 @@ func TestSplitStoreSuppressCompactionNearUpgrade(t *testing.T) { t.Fatal(err) } + path, err := ioutil.TempDir("", "splitstore.*") + if err != nil { + t.Fatal(err) + } + + t.Cleanup(func() { + _ = os.RemoveAll(path) + }) + // open the splitstore - ss, err := Open("", ds, hot, cold, &Config{MarkSetType: "map"}) + ss, err := Open(path, ds, hot, cold, &Config{MarkSetType: "map"}) if err != nil { t.Fatal(err) } From d1409095620a3e0fd777ee0e55dbe2816fe0a889 Mon Sep 17 00:00:00 2001 From: vyzo Date: Sun, 30 Jan 2022 11:27:24 +0200 Subject: [PATCH 268/393] add MarkMany to MarkSet interface --- blockstore/splitstore/markset.go | 1 + blockstore/splitstore/markset_badger.go | 35 +++++++++++++++++++++++++ blockstore/splitstore/markset_map.go | 26 ++++++++++++++++++ 3 files changed, 62 insertions(+) diff --git a/blockstore/splitstore/markset.go b/blockstore/splitstore/markset.go index 90ce282f4c4..e6749453887 100644 --- a/blockstore/splitstore/markset.go +++ b/blockstore/splitstore/markset.go @@ -14,6 +14,7 @@ var errMarkSetClosed = errors.New("markset closed") type MarkSet interface { ObjectVisitor Mark(cid.Cid) error + MarkMany([]cid.Cid) error Has(cid.Cid) (bool, error) Close() error diff --git a/blockstore/splitstore/markset_badger.go b/blockstore/splitstore/markset_badger.go index 6f25b9d52fd..62b4c91b221 100644 --- a/blockstore/splitstore/markset_badger.go +++ b/blockstore/splitstore/markset_badger.go @@ -143,6 +143,23 @@ func (s *BadgerMarkSet) Mark(c cid.Cid) error { return nil } +func (s *BadgerMarkSet) MarkMany(batch []cid.Cid) error { + s.mx.Lock() + if s.pend == nil { + s.mx.Unlock() + return errMarkSetClosed + } + + write, seqno := s.putMany(batch) + s.mx.Unlock() + + if write { + return s.write(seqno) + } + + return nil +} + func (s *BadgerMarkSet) Has(c cid.Cid) (bool, error) { s.mx.RLock() defer s.mx.RUnlock() @@ -260,6 +277,24 @@ func (s *BadgerMarkSet) put(key string) (write bool, seqno int) { return true, seqno } +func (s *BadgerMarkSet) putMany(batch []cid.Cid) (write bool, seqno int) { + for _, c := range batch { + key := string(c.Hash()) + s.pend[key] = struct{}{} + } + + if !s.persist && len(s.pend) < badgerMarkSetBatchSize { + return false, 0 + } + + seqno = s.seqno + s.seqno++ + s.writing[seqno] = s.pend + s.pend = make(map[string]struct{}) + + return true, seqno +} + func (s *BadgerMarkSet) write(seqno int) (err error) { s.mx.Lock() if s.pend == nil { diff --git a/blockstore/splitstore/markset_map.go b/blockstore/splitstore/markset_map.go index dd6c0d819b7..b046b5134ca 100644 --- a/blockstore/splitstore/markset_map.go +++ b/blockstore/splitstore/markset_map.go @@ -169,6 +169,32 @@ func (s *MapMarkSet) Mark(c cid.Cid) error { return nil } +func (s *MapMarkSet) MarkMany(batch []cid.Cid) error { + s.mx.Lock() + defer s.mx.Unlock() + + if s.set == nil { + return errMarkSetClosed + } + + for _, c := range batch { + hash := c.Hash() + s.set[string(hash)] = struct{}{} + + if s.persist { + if err := s.writeKey(hash, false); err != nil { + return err + } + } + } + + if s.persist { + return s.buf.Flush() + } + + return nil +} + func (s *MapMarkSet) Has(cid cid.Cid) (bool, error) { s.mx.RLock() defer s.mx.RUnlock() From a4c1a3416334974440e9f992efe6e5fa9ed55fc5 Mon Sep 17 00:00:00 2001 From: vyzo Date: Sun, 30 Jan 2022 11:44:27 +0200 Subject: [PATCH 269/393] check for existence of badger db in recover --- blockstore/splitstore/markset_badger.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/blockstore/splitstore/markset_badger.go b/blockstore/splitstore/markset_badger.go index 62b4c91b221..95ee60e9bd4 100644 --- a/blockstore/splitstore/markset_badger.go +++ b/blockstore/splitstore/markset_badger.go @@ -70,6 +70,10 @@ func (e *BadgerMarkSetEnv) New(name string, sizeHint int64) (MarkSet, error) { func (e *BadgerMarkSetEnv) Recover(name string) (MarkSet, error) { path := filepath.Join(e.path, name) + if _, err := os.Stat(path); err != nil { + return nil, xerrors.Errorf("error stating badger db path: %w", err) + } + db, err := openBadgerDB(path, true) if err != nil { return nil, xerrors.Errorf("error creating badger db: %w", err) @@ -359,8 +363,6 @@ func (s *BadgerMarkSet) Close() error { return closeBadgerDB(db, s.path, s.persist) } -func (s *BadgerMarkSet) SetConcurrent() {} - func openBadgerDB(path string, recover bool) (*badger.DB, error) { // if it is not a recovery, clean up first if !recover { From cf09dd044afe835cdb4597f8810b9de71fa4a8f0 Mon Sep 17 00:00:00 2001 From: vyzo Date: Sun, 30 Jan 2022 11:45:12 +0200 Subject: [PATCH 270/393] moar markset tests --- blockstore/splitstore/markset_test.go | 247 +++++++++++++++++++++++++- 1 file changed, 238 insertions(+), 9 deletions(-) diff --git a/blockstore/splitstore/markset_test.go b/blockstore/splitstore/markset_test.go index cfbc7cf134e..c8ebaffe75f 100644 --- a/blockstore/splitstore/markset_test.go +++ b/blockstore/splitstore/markset_test.go @@ -11,8 +11,10 @@ import ( func TestMapMarkSet(t *testing.T) { testMarkSet(t, "map") + testMarkSetRecovery(t, "map") + testMarkSetMarkMany(t, "map") testMarkSetVisitor(t, "map") - testMarkSetVisitorPersistence(t, "map") + testMarkSetVisitorRecovery(t, "map") } func TestBadgerMarkSet(t *testing.T) { @@ -22,13 +24,13 @@ func TestBadgerMarkSet(t *testing.T) { badgerMarkSetBatchSize = bs }) testMarkSet(t, "badger") + testMarkSetRecovery(t, "badger") + testMarkSetMarkMany(t, "badger") testMarkSetVisitor(t, "badger") - testMarkSetVisitorPersistence(t, "badger") + testMarkSetVisitorRecovery(t, "badger") } func testMarkSet(t *testing.T, lsType string) { - t.Helper() - path, err := ioutil.TempDir("", "markset.*") if err != nil { t.Fatal(err) @@ -64,6 +66,7 @@ func testMarkSet(t *testing.T, lsType string) { } mustHave := func(s MarkSet, cid cid.Cid) { + t.Helper() has, err := s.Has(cid) if err != nil { t.Fatal(err) @@ -75,6 +78,7 @@ func testMarkSet(t *testing.T, lsType string) { } mustNotHave := func(s MarkSet, cid cid.Cid) { + t.Helper() has, err := s.Has(cid) if err != nil { t.Fatal(err) @@ -152,8 +156,6 @@ func testMarkSet(t *testing.T, lsType string) { } func testMarkSetVisitor(t *testing.T, lsType string) { - t.Helper() - path, err := ioutil.TempDir("", "markset.*") if err != nil { t.Fatal(err) @@ -222,9 +224,7 @@ func testMarkSetVisitor(t *testing.T, lsType string) { mustNotVisit(visitor, k4) } -func testMarkSetVisitorPersistence(t *testing.T, lsType string) { - t.Helper() - +func testMarkSetVisitorRecovery(t *testing.T, lsType string) { path, err := ioutil.TempDir("", "markset.*") if err != nil { t.Fatal(err) @@ -312,4 +312,233 @@ func testMarkSetVisitorPersistence(t *testing.T, lsType string) { mustNotVisit(visitor, k4) visitor.EndCriticalSection() + + if err := visitor.Close(); err != nil { + t.Fatal(err) + } + + visitor, err = env.Recover("test") + if err == nil { + t.Fatal("expected recovery to fail") + } +} + +func testMarkSetRecovery(t *testing.T, lsType string) { + path, err := ioutil.TempDir("", "markset.*") + if err != nil { + t.Fatal(err) + } + + t.Cleanup(func() { + _ = os.RemoveAll(path) + }) + + env, err := OpenMarkSetEnv(path, lsType) + if err != nil { + t.Fatal(err) + } + defer env.Close() //nolint:errcheck + + markSet, err := env.New("test", 0) + if err != nil { + t.Fatal(err) + } + + makeCid := func(key string) cid.Cid { + h, err := multihash.Sum([]byte(key), multihash.SHA2_256, -1) + if err != nil { + t.Fatal(err) + } + + return cid.NewCidV1(cid.Raw, h) + } + + mustHave := func(s MarkSet, cid cid.Cid) { + t.Helper() + has, err := s.Has(cid) + if err != nil { + t.Fatal(err) + } + + if !has { + t.Fatal("mark not found") + } + } + + mustNotHave := func(s MarkSet, cid cid.Cid) { + t.Helper() + has, err := s.Has(cid) + if err != nil { + t.Fatal(err) + } + + if has { + t.Fatal("unexpected mark") + } + } + + k1 := makeCid("a") + k2 := makeCid("b") + k3 := makeCid("c") + k4 := makeCid("d") + + if err := markSet.Mark(k1); err != nil { + t.Fatal(err) + } + if err := markSet.Mark(k2); err != nil { + t.Fatal(err) + } + + mustHave(markSet, k1) + mustHave(markSet, k2) + mustNotHave(markSet, k3) + mustNotHave(markSet, k4) + + if err := markSet.BeginCriticalSection(); err != nil { + t.Fatal(err) + } + + if err := markSet.Mark(k3); err != nil { + t.Fatal(err) + } + if err := markSet.Mark(k4); err != nil { + t.Fatal(err) + } + + mustHave(markSet, k1) + mustHave(markSet, k2) + mustHave(markSet, k3) + mustHave(markSet, k4) + + if err := markSet.Close(); err != nil { + t.Fatal(err) + } + + markSet, err = env.Recover("test") + if err != nil { + t.Fatal(err) + } + + mustHave(markSet, k1) + mustHave(markSet, k2) + mustHave(markSet, k3) + mustHave(markSet, k4) + + markSet.EndCriticalSection() + + if err := markSet.Close(); err != nil { + t.Fatal(err) + } + + markSet, err = env.Recover("test") + if err == nil { + t.Fatal("expected recovery to fail") + } +} + +func testMarkSetMarkMany(t *testing.T, lsType string) { + path, err := ioutil.TempDir("", "markset.*") + if err != nil { + t.Fatal(err) + } + + t.Cleanup(func() { + _ = os.RemoveAll(path) + }) + + env, err := OpenMarkSetEnv(path, lsType) + if err != nil { + t.Fatal(err) + } + defer env.Close() //nolint:errcheck + + markSet, err := env.New("test", 0) + if err != nil { + t.Fatal(err) + } + + makeCid := func(key string) cid.Cid { + h, err := multihash.Sum([]byte(key), multihash.SHA2_256, -1) + if err != nil { + t.Fatal(err) + } + + return cid.NewCidV1(cid.Raw, h) + } + + mustHave := func(s MarkSet, cid cid.Cid) { + t.Helper() + has, err := s.Has(cid) + if err != nil { + t.Fatal(err) + } + + if !has { + t.Fatal("mark not found") + } + } + + mustNotHave := func(s MarkSet, cid cid.Cid) { + t.Helper() + has, err := s.Has(cid) + if err != nil { + t.Fatal(err) + } + + if has { + t.Fatal("unexpected mark") + } + } + + k1 := makeCid("a") + k2 := makeCid("b") + k3 := makeCid("c") + k4 := makeCid("d") + + if err := markSet.MarkMany([]cid.Cid{k1, k2}); err != nil { + t.Fatal(err) + } + + mustHave(markSet, k1) + mustHave(markSet, k2) + mustNotHave(markSet, k3) + mustNotHave(markSet, k4) + + if err := markSet.BeginCriticalSection(); err != nil { + t.Fatal(err) + } + + if err := markSet.MarkMany([]cid.Cid{k3, k4}); err != nil { + t.Fatal(err) + } + + mustHave(markSet, k1) + mustHave(markSet, k2) + mustHave(markSet, k3) + mustHave(markSet, k4) + + if err := markSet.Close(); err != nil { + t.Fatal(err) + } + + markSet, err = env.Recover("test") + if err != nil { + t.Fatal(err) + } + + mustHave(markSet, k1) + mustHave(markSet, k2) + mustHave(markSet, k3) + mustHave(markSet, k4) + + markSet.EndCriticalSection() + + if err := markSet.Close(); err != nil { + t.Fatal(err) + } + + markSet, err = env.Recover("test") + if err == nil { + t.Fatal("expected recovery to fail") + } } From 322b85898f7ac07f6f81ae9b6dff52aee6bff3d8 Mon Sep 17 00:00:00 2001 From: vyzo Date: Sun, 30 Jan 2022 12:10:08 +0200 Subject: [PATCH 271/393] make markSets synchronous in critical section --- blockstore/splitstore/markset_badger.go | 18 +++++++++++++++++- blockstore/splitstore/markset_map.go | 19 +++++++++++++++++-- 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/blockstore/splitstore/markset_badger.go b/blockstore/splitstore/markset_badger.go index 95ee60e9bd4..5b7eb471a2c 100644 --- a/blockstore/splitstore/markset_badger.go +++ b/blockstore/splitstore/markset_badger.go @@ -117,10 +117,18 @@ func (s *BadgerMarkSet) BeginCriticalSection() error { s.mx.Unlock() if write { + // all writes sync once perist is true return s.write(seqno) } - return nil + // wait for any pending writes and sync + s.mx.Lock() + for s.writers > 0 { + s.cond.Wait() + } + s.mx.Unlock() + + return s.db.Sync() } func (s *BadgerMarkSet) EndCriticalSection() { @@ -341,6 +349,14 @@ func (s *BadgerMarkSet) write(seqno int) (err error) { return xerrors.Errorf("error flushing batch to badger markset: %w", err) } + s.mx.RLock() + persist := s.persist + s.mx.RUnlock() + + if persist { + return s.db.Sync() + } + return nil } diff --git a/blockstore/splitstore/markset_map.go b/blockstore/splitstore/markset_map.go index b046b5134ca..8b088e70aa4 100644 --- a/blockstore/splitstore/markset_map.go +++ b/blockstore/splitstore/markset_map.go @@ -163,7 +163,13 @@ func (s *MapMarkSet) Mark(c cid.Cid) error { s.set[string(hash)] = struct{}{} if s.persist { - return s.writeKey(hash, true) + if err := s.writeKey(hash, true); err != nil { + return err + } + + if err := s.file.Sync(); err != nil { + return xerrors.Errorf("error syncing markset: %w", err) + } } return nil @@ -189,7 +195,13 @@ func (s *MapMarkSet) MarkMany(batch []cid.Cid) error { } if s.persist { - return s.buf.Flush() + if err := s.buf.Flush(); err != nil { + return xerrors.Errorf("error flushing markset buffer to disk: %w", err) + } + + if err := s.file.Sync(); err != nil { + return xerrors.Errorf("error syncing markset: %w", err) + } } return nil @@ -227,6 +239,9 @@ func (s *MapMarkSet) Visit(c cid.Cid) (bool, error) { if err := s.writeKey(hash, true); err != nil { return false, err } + if err := s.file.Sync(); err != nil { + return false, xerrors.Errorf("error syncing markset: %w", err) + } } return true, nil From c94eee5fc34cd77333d4b6445a9616a4e544a10d Mon Sep 17 00:00:00 2001 From: vyzo Date: Sun, 30 Jan 2022 12:47:30 +0200 Subject: [PATCH 272/393] on disk checkpoints --- blockstore/splitstore/checkpoint.go | 115 ++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 blockstore/splitstore/checkpoint.go diff --git a/blockstore/splitstore/checkpoint.go b/blockstore/splitstore/checkpoint.go new file mode 100644 index 00000000000..a0fa84730db --- /dev/null +++ b/blockstore/splitstore/checkpoint.go @@ -0,0 +1,115 @@ +package splitstore + +import ( + "bufio" + "io" + "os" + + "golang.org/x/xerrors" + + cid "github.com/ipfs/go-cid" + mh "github.com/multiformats/go-multihash" +) + +type Checkpoint struct { + file *os.File + buf *bufio.Writer +} + +func NewCheckpoint(path string) (*Checkpoint, error) { + file, err := os.OpenFile(path, os.O_CREATE|os.O_TRUNC|os.O_WRONLY|os.O_SYNC, 0644) + if err != nil { + return nil, xerrors.Errorf("error creating checkpoint: %w", err) + } + buf := bufio.NewWriter(file) + + return &Checkpoint{ + file: file, + buf: buf, + }, nil +} + +func OpenCheckpoint(path string) (*Checkpoint, cid.Cid, error) { + filein, err := os.Open(path) + if err != nil { + return nil, cid.Undef, xerrors.Errorf("error opening checkpoint for reading: %w", err) + } + defer filein.Close() //nolint:errcheck + + bufin := bufio.NewReader(filein) + start, err := readRawCid(bufin, nil) + if err != nil && err != io.EOF { + return nil, cid.Undef, xerrors.Errorf("error reading cid from checkpoint: %w", err) + } + + fileout, err := os.OpenFile(path, os.O_WRONLY|os.O_SYNC, 0644) + if err != nil { + return nil, cid.Undef, xerrors.Errorf("error opening checkpoint for writing: %w", err) + } + bufout := bufio.NewWriter(fileout) + + return &Checkpoint{ + file: fileout, + buf: bufout, + }, start, nil +} + +func (cp *Checkpoint) Set(c cid.Cid) error { + if _, err := cp.file.Seek(0, io.SeekStart); err != nil { + return xerrors.Errorf("error seeking beginning of checkpoint: %w", err) + } + + if err := writeRawCid(cp.buf, c, true); err != nil { + return xerrors.Errorf("error writing cid to checkpoint: %w", err) + } + + return nil +} + +func (cp *Checkpoint) Close() (err error) { + if cp.file != nil { + err = cp.file.Close() + cp.file = nil + cp.buf = nil + } + return err +} + +func readRawCid(buf *bufio.Reader, hbuf []byte) (cid.Cid, error) { + sz, err := buf.ReadByte() + if err != nil { + return cid.Undef, err // don't wrap EOF as it is not an error here + } + + if hbuf == nil { + hbuf = make([]byte, int(sz)) + } else { + hbuf = hbuf[:int(sz)] + } + + if _, err := buf.Read(hbuf); err != nil { + return cid.Undef, xerrors.Errorf("error reading hash: %w", err) // wrap EOF, it's corrupt + } + + hash, err := mh.Cast(hbuf) + if err != nil { + return cid.Undef, xerrors.Errorf("error casting multihash: %w", err) + } + + return cid.NewCidV1(cid.Raw, hash), nil +} + +func writeRawCid(buf *bufio.Writer, c cid.Cid, flush bool) error { + hash := c.Hash() + if err := buf.WriteByte(byte(len(hash))); err != nil { + return err + } + if _, err := buf.Write(hash); err != nil { + return err + } + if flush { + return buf.Flush() + } + + return nil +} From 6ede77b254b491f0a999b2f11253315f2e008852 Mon Sep 17 00:00:00 2001 From: vyzo Date: Sun, 30 Jan 2022 14:10:11 +0200 Subject: [PATCH 273/393] checkpoint test --- blockstore/splitstore/checkpoint_test.go | 147 +++++++++++++++++++++++ 1 file changed, 147 insertions(+) create mode 100644 blockstore/splitstore/checkpoint_test.go diff --git a/blockstore/splitstore/checkpoint_test.go b/blockstore/splitstore/checkpoint_test.go new file mode 100644 index 00000000000..4fefe40cf6f --- /dev/null +++ b/blockstore/splitstore/checkpoint_test.go @@ -0,0 +1,147 @@ +package splitstore + +import ( + "io/ioutil" + "os" + "path/filepath" + "testing" + + "github.com/ipfs/go-cid" + "github.com/multiformats/go-multihash" +) + +func TestCheckpoint(t *testing.T) { + dir, err := ioutil.TempDir("", "checkpoint.*") + if err != nil { + t.Fatal(err) + } + + t.Cleanup(func() { + _ = os.RemoveAll(dir) + }) + + path := filepath.Join(dir, "checkpoint") + + makeCid := func(key string) cid.Cid { + h, err := multihash.Sum([]byte(key), multihash.SHA2_256, -1) + if err != nil { + t.Fatal(err) + } + + return cid.NewCidV1(cid.Raw, h) + } + + k1 := makeCid("a") + k2 := makeCid("b") + k3 := makeCid("c") + k4 := makeCid("d") + + cp, err := NewCheckpoint(path) + if err != nil { + t.Fatal(err) + } + + if err := cp.Set(k1); err != nil { + t.Fatal(err) + } + if err := cp.Set(k2); err != nil { + t.Fatal(err) + } + + if err := cp.Close(); err != nil { + t.Fatal(err) + } + + cp, start, err := OpenCheckpoint(path) + if err != nil { + t.Fatal(err) + } + if !start.Equals(k2) { + t.Fatalf("expected start to be %s; got %s", k2, start) + } + + if err := cp.Set(k3); err != nil { + t.Fatal(err) + } + if err := cp.Set(k4); err != nil { + t.Fatal(err) + } + + if err := cp.Close(); err != nil { + t.Fatal(err) + } + + cp, start, err = OpenCheckpoint(path) + if err != nil { + t.Fatal(err) + } + if !start.Equals(k4) { + t.Fatalf("expected start to be %s; got %s", k4, start) + } + + if err := cp.Close(); err != nil { + t.Fatal(err) + } + + // also test correct operation with an empty checkpoint + cp, err = NewCheckpoint(path) + if err != nil { + t.Fatal(err) + } + + if err := cp.Close(); err != nil { + t.Fatal(err) + } + + cp, start, err = OpenCheckpoint(path) + if err != nil { + t.Fatal(err) + } + + if start.Defined() { + t.Fatal("expected start to be undefined") + } + + if err := cp.Set(k1); err != nil { + t.Fatal(err) + } + if err := cp.Set(k2); err != nil { + t.Fatal(err) + } + + if err := cp.Close(); err != nil { + t.Fatal(err) + } + + cp, start, err = OpenCheckpoint(path) + if err != nil { + t.Fatal(err) + } + if !start.Equals(k2) { + t.Fatalf("expected start to be %s; got %s", k2, start) + } + + if err := cp.Set(k3); err != nil { + t.Fatal(err) + } + if err := cp.Set(k4); err != nil { + t.Fatal(err) + } + + if err := cp.Close(); err != nil { + t.Fatal(err) + } + + cp, start, err = OpenCheckpoint(path) + if err != nil { + t.Fatal(err) + } + if !start.Equals(k4) { + t.Fatalf("expected start to be %s; got %s", k4, start) + } + + if err := cp.Close(); err != nil { + t.Fatal(err) + } + +} From 64cda4aedaddd98fffa267740d83a4ad88875542 Mon Sep 17 00:00:00 2001 From: vyzo Date: Sun, 30 Jan 2022 14:19:05 +0200 Subject: [PATCH 274/393] on disk coldsets --- blockstore/splitstore/coldset.go | 102 +++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 blockstore/splitstore/coldset.go diff --git a/blockstore/splitstore/coldset.go b/blockstore/splitstore/coldset.go new file mode 100644 index 00000000000..129e2ed9226 --- /dev/null +++ b/blockstore/splitstore/coldset.go @@ -0,0 +1,102 @@ +package splitstore + +import ( + "bufio" + "io" + "os" + + "golang.org/x/xerrors" + + cid "github.com/ipfs/go-cid" +) + +type ColdSetWriter struct { + file *os.File + buf *bufio.Writer +} + +type ColdSetReader struct { + file *os.File + buf *bufio.Reader +} + +func NewColdSetWriter(path string) (*ColdSetWriter, error) { + file, err := os.OpenFile(path, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0644) + if err != nil { + return nil, xerrors.Errorf("error creating coldset: %w", err) + } + buf := bufio.NewWriter(file) + + return &ColdSetWriter{ + file: file, + buf: buf, + }, nil +} + +func NewColdSetReader(path string) (*ColdSetReader, error) { + file, err := os.Open(path) + if err != nil { + return nil, xerrors.Errorf("error opening coldset: %w", err) + } + buf := bufio.NewReader(file) + + return &ColdSetReader{ + file: file, + buf: buf, + }, nil +} + +func (s *ColdSetWriter) Write(c cid.Cid) error { + return writeRawCid(s.buf, c, false) +} + +func (s *ColdSetWriter) Close() error { + if s.file == nil { + return nil + } + + err1 := s.buf.Flush() + err2 := s.file.Close() + s.buf = nil + s.file = nil + + if err1 != nil { + return err1 + } + return err2 +} + +func (s *ColdSetReader) ForEach(f func(cid.Cid) error) error { + hbuf := make([]byte, 256) + for { + next, err := readRawCid(s.buf, hbuf) + if err != nil { + if err == io.EOF { + return nil + } + + return xerrors.Errorf("error reading coldset: %w", err) + } + + if err := f(next); err != nil { + return err + } + } +} + +func (s *ColdSetReader) Reset() error { + _, err := s.file.Seek(0, io.SeekStart) + return err +} + +func (s *ColdSetReader) Close() error { + if s.file == nil { + return nil + } + + err := s.file.Close() + s.file = nil + s.buf = nil + + return err +} From 72333147d3913d77c026340b3ee4dc091f73aafc Mon Sep 17 00:00:00 2001 From: vyzo Date: Sun, 30 Jan 2022 15:00:03 +0200 Subject: [PATCH 275/393] prettier checkpoint close --- blockstore/splitstore/checkpoint.go | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/blockstore/splitstore/checkpoint.go b/blockstore/splitstore/checkpoint.go index a0fa84730db..68afeb3da25 100644 --- a/blockstore/splitstore/checkpoint.go +++ b/blockstore/splitstore/checkpoint.go @@ -66,12 +66,15 @@ func (cp *Checkpoint) Set(c cid.Cid) error { return nil } -func (cp *Checkpoint) Close() (err error) { - if cp.file != nil { - err = cp.file.Close() - cp.file = nil - cp.buf = nil +func (cp *Checkpoint) Close() error { + if cp.file == nil { + return nil } + + err := cp.file.Close() + cp.file = nil + cp.buf = nil + return err } From 4b8369c071f21fc8c43d92fe6d8d255df2ae1b9a Mon Sep 17 00:00:00 2001 From: vyzo Date: Sun, 30 Jan 2022 15:11:18 +0200 Subject: [PATCH 276/393] fix buffered reads --- blockstore/splitstore/checkpoint.go | 2 +- blockstore/splitstore/markset_map.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/blockstore/splitstore/checkpoint.go b/blockstore/splitstore/checkpoint.go index 68afeb3da25..d3cd4cba7dc 100644 --- a/blockstore/splitstore/checkpoint.go +++ b/blockstore/splitstore/checkpoint.go @@ -90,7 +90,7 @@ func readRawCid(buf *bufio.Reader, hbuf []byte) (cid.Cid, error) { hbuf = hbuf[:int(sz)] } - if _, err := buf.Read(hbuf); err != nil { + if _, err := io.ReadFull(buf, hbuf); err != nil { return cid.Undef, xerrors.Errorf("error reading hash: %w", err) // wrap EOF, it's corrupt } diff --git a/blockstore/splitstore/markset_map.go b/blockstore/splitstore/markset_map.go index 8b088e70aa4..38cea1288ab 100644 --- a/blockstore/splitstore/markset_map.go +++ b/blockstore/splitstore/markset_map.go @@ -71,7 +71,7 @@ func (e *MapMarkSetEnv) Recover(name string) (MarkSet, error) { } key := make([]byte, int(sz)) - if _, err = buf.Read(key); err != nil { + if _, err = io.ReadFull(buf, key); err != nil { break } From a4f720d8666e834b41fe54f6af612ac202edf29b Mon Sep 17 00:00:00 2001 From: vyzo Date: Sun, 30 Jan 2022 15:11:25 +0200 Subject: [PATCH 277/393] coldset test --- blockstore/splitstore/coldset_test.go | 99 +++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 blockstore/splitstore/coldset_test.go diff --git a/blockstore/splitstore/coldset_test.go b/blockstore/splitstore/coldset_test.go new file mode 100644 index 00000000000..60216ebd4e6 --- /dev/null +++ b/blockstore/splitstore/coldset_test.go @@ -0,0 +1,99 @@ +package splitstore + +import ( + "fmt" + "io/ioutil" + "os" + "path/filepath" + "testing" + + "github.com/ipfs/go-cid" + "github.com/multiformats/go-multihash" +) + +func TestColdSet(t *testing.T) { + dir, err := ioutil.TempDir("", "coldset.*") + if err != nil { + t.Fatal(err) + } + + t.Cleanup(func() { + _ = os.RemoveAll(dir) + }) + + path := filepath.Join(dir, "coldset") + + makeCid := func(i int) cid.Cid { + h, err := multihash.Sum([]byte(fmt.Sprintf("cid.%d", i)), multihash.SHA2_256, -1) + if err != nil { + t.Fatal(err) + } + + return cid.NewCidV1(cid.Raw, h) + } + + const count = 1000 + cids := make([]cid.Cid, 0, count) + for i := 0; i < count; i++ { + cids = append(cids, makeCid(i)) + } + + cw, err := NewColdSetWriter(path) + if err != nil { + t.Fatal(err) + } + + for _, c := range cids { + if err := cw.Write(c); err != nil { + t.Fatal(err) + } + } + + if err := cw.Close(); err != nil { + t.Fatal(err) + } + + cr, err := NewColdSetReader(path) + if err != nil { + t.Fatal(err) + } + + index := 0 + err = cr.ForEach(func(c cid.Cid) error { + if index >= count { + t.Fatal("too many cids") + } + + if !c.Equals(cids[index]) { + t.Fatalf("wrong cid %d; expected %s but got %s", index, cids[index], c) + } + + index++ + return nil + }) + if err != nil { + t.Fatal(err) + } + + if err := cr.Reset(); err != nil { + t.Fatal(err) + } + + index = 0 + err = cr.ForEach(func(c cid.Cid) error { + if index >= count { + t.Fatal("too many cids") + } + + if !c.Equals(cids[index]) { + t.Fatalf("wrong cid; expected %s but got %s", cids[index], c) + } + + index++ + return nil + }) + if err != nil { + t.Fatal(err) + } + +} From dbc8903bac5f26eef471776439e1703569865452 Mon Sep 17 00:00:00 2001 From: vyzo Date: Sun, 30 Jan 2022 15:33:15 +0200 Subject: [PATCH 278/393] sortless compaction --- blockstore/splitstore/splitstore.go | 79 +++- blockstore/splitstore/splitstore_compact.go | 477 ++++++++++---------- 2 files changed, 312 insertions(+), 244 deletions(-) diff --git a/blockstore/splitstore/splitstore.go b/blockstore/splitstore/splitstore.go index 62cb2459e54..ef9f67d9d44 100644 --- a/blockstore/splitstore/splitstore.go +++ b/blockstore/splitstore/splitstore.go @@ -129,8 +129,6 @@ type SplitStore struct { headChangeMx sync.Mutex - coldPurgeSize int - chain ChainAccessor ds dstore.Datastore cold bstore.Blockstore @@ -158,6 +156,7 @@ type SplitStore struct { txnRefsMx sync.Mutex txnRefs map[cid.Cid]struct{} txnMissing map[cid.Cid]struct{} + txnMarkSet MarkSet // registered protectors protectors []func(func(cid.Cid) error) error @@ -194,8 +193,6 @@ func Open(path string, ds dstore.Datastore, hot, cold bstore.Blockstore, cfg *Co cold: cold, hot: hots, markSetEnv: markSetEnv, - - coldPurgeSize: defaultColdPurgeSize, } ss.txnViewsCond.L = &ss.txnViewsMx @@ -208,6 +205,14 @@ func Open(path string, ds dstore.Datastore, hot, cold bstore.Blockstore, cfg *Co } } + if ss.checkpointExists() { + log.Info("found compaction checkpoint; resuming compaction") + if err := ss.completeCompaction(); err != nil { + markSetEnv.Close() + return nil, xerrors.Errorf("error resuming compaction: %w", err) + } + } + return ss, nil } @@ -230,6 +235,16 @@ func (s *SplitStore) Has(ctx context.Context, cid cid.Cid) (bool, error) { s.txnLk.RLock() defer s.txnLk.RUnlock() + // critical section + if s.txnMarkSet != nil { + has, err := s.txnMarkSet.Has(cid) + if has || err != nil { + return has, err + } + + return s.cold.Has(ctx, cid) + } + has, err := s.hot.Has(ctx, cid) if err != nil { @@ -257,6 +272,20 @@ func (s *SplitStore) Get(ctx context.Context, cid cid.Cid) (blocks.Block, error) s.txnLk.RLock() defer s.txnLk.RUnlock() + // critical section + if s.txnMarkSet != nil { + has, err := s.txnMarkSet.Has(cid) + if err != nil { + return nil, err + } + + if has { + return s.hot.Get(ctx, cid) + } + + return s.cold.Get(ctx, cid) + } + blk, err := s.hot.Get(ctx, cid) switch err { @@ -294,6 +323,20 @@ func (s *SplitStore) GetSize(ctx context.Context, cid cid.Cid) (int, error) { s.txnLk.RLock() defer s.txnLk.RUnlock() + // critical section + if s.txnMarkSet != nil { + has, err := s.txnMarkSet.Has(cid) + if err != nil { + return 0, err + } + + if has { + return s.hot.GetSize(ctx, cid) + } + + return s.cold.GetSize(ctx, cid) + } + size, err := s.hot.GetSize(ctx, cid) switch err { @@ -332,6 +375,11 @@ func (s *SplitStore) Put(ctx context.Context, blk blocks.Block) error { s.debug.LogWrite(blk) + // critical section + if s.txnMarkSet != nil { + return s.txnMarkSet.Mark(blk.Cid()) + } + s.trackTxnRef(blk.Cid()) return nil } @@ -377,6 +425,11 @@ func (s *SplitStore) PutMany(ctx context.Context, blks []blocks.Block) error { s.debug.LogWriteMany(blks) + // critical section + if s.txnMarkSet != nil { + return s.txnMarkSet.MarkMany(batch) + } + s.trackTxnRefMany(batch) return nil } @@ -436,6 +489,24 @@ func (s *SplitStore) View(ctx context.Context, cid cid.Cid, cb func([]byte) erro return cb(data) } + // critical section + s.txnLk.RLock() + if s.txnMarkSet != nil { + has, err := s.txnMarkSet.Has(cid) + s.txnLk.RUnlock() + + if err != nil { + return err + } + + if has { + return s.hot.View(ctx, cid, cb) + } + + return s.cold.View(ctx, cid, cb) + } + s.txnLk.RUnlock() + // views are (optimistically) protected two-fold: // - if there is an active transaction, then the reference is protected. // - if there is no active transaction, active views are tracked in a diff --git a/blockstore/splitstore/splitstore_compact.go b/blockstore/splitstore/splitstore_compact.go index 0d5a6f2f0d8..37d4e50365d 100644 --- a/blockstore/splitstore/splitstore_compact.go +++ b/blockstore/splitstore/splitstore_compact.go @@ -3,8 +3,9 @@ package splitstore import ( "bytes" "errors" + "os" + "path/filepath" "runtime" - "sort" "sync" "sync/atomic" "time" @@ -387,6 +388,12 @@ func (s *SplitStore) compact(curTs *types.TipSet) { } func (s *SplitStore) doCompact(curTs *types.TipSet) error { + if s.checkpointExists() { + // this really shouldn't happen, but if it somehow does, it means that the hotstore + // might be potentially inconsistent; abort compaction and notify the user to intervene. + return xerrors.Errorf("checkpoint exists; aborting compaction") + } + currentEpoch := curTs.Height() boundaryEpoch := currentEpoch - CompactionBoundary @@ -409,9 +416,6 @@ func (s *SplitStore) doCompact(curTs *types.TipSet) error { return err } - // we are ready for concurrent marking - s.beginTxnMarking(markSet) - // 0. track all protected references at beginning of compaction; anything added later should // be transactionally protected by the write log.Info("protecting references with registered protectors") @@ -425,7 +429,7 @@ func (s *SplitStore) doCompact(curTs *types.TipSet) error { log.Info("marking reachable objects") startMark := time.Now() - var count int64 + count := new(int64) err = s.walkChain(curTs, boundaryEpoch, inclMsgsEpoch, &noopVisitor{}, func(c cid.Cid) error { if isUnitaryObject(c) { @@ -441,7 +445,7 @@ func (s *SplitStore) doCompact(curTs *types.TipSet) error { return errStopWalk } - count++ + atomic.AddInt64(count, 1) return nil }) @@ -449,9 +453,9 @@ func (s *SplitStore) doCompact(curTs *types.TipSet) error { return xerrors.Errorf("error marking: %w", err) } - s.markSetSize = count + count>>2 // overestimate a bit + s.markSetSize = *count + *count>>2 // overestimate a bit - log.Infow("marking done", "took", time.Since(startMark), "marked", count) + log.Infow("marking done", "took", time.Since(startMark), "marked", *count) if err := s.checkClosing(); err != nil { return err @@ -471,10 +475,15 @@ func (s *SplitStore) doCompact(curTs *types.TipSet) error { log.Info("collecting cold objects") startCollect := time.Now() + coldw, err := NewColdSetWriter(s.coldSetPath()) + if err != nil { + return xerrors.Errorf("error creating coldset: %w", err) + } + defer coldw.Close() //nolint:errcheck + // some stats for logging var hotCnt, coldCnt int - cold := make([]cid.Cid, 0, s.coldPurgeSize) err = s.hot.ForEachKey(func(c cid.Cid) error { // was it marked? mark, err := markSet.Has(c) @@ -488,7 +497,7 @@ func (s *SplitStore) doCompact(curTs *types.TipSet) error { } // it's cold, mark it as candidate for move - cold = append(cold, c) + coldw.Write(c) coldCnt++ return nil @@ -498,12 +507,12 @@ func (s *SplitStore) doCompact(curTs *types.TipSet) error { return xerrors.Errorf("error collecting cold objects: %w", err) } - log.Infow("cold collection done", "took", time.Since(startCollect)) - - if coldCnt > 0 { - s.coldPurgeSize = coldCnt + coldCnt>>2 // overestimate a bit + if err := coldw.Close(); err != nil { + return xerrors.Errorf("error closing coldset: %w", err) } + log.Infow("cold collection done", "took", time.Since(startCollect)) + log.Infow("compaction stats", "hot", hotCnt, "cold", coldCnt) stats.Record(s.ctx, metrics.SplitstoreCompactionHot.M(int64(hotCnt))) stats.Record(s.ctx, metrics.SplitstoreCompactionCold.M(int64(coldCnt))) @@ -512,20 +521,17 @@ func (s *SplitStore) doCompact(curTs *types.TipSet) error { return err } - // now that we have collected cold objects, check for missing references from transactional i/o - // and disable further collection of such references (they will not be acted upon as we can't - // possibly delete objects we didn't have when we were collecting cold objects) - s.waitForMissingRefs(markSet) - - if err := s.checkClosing(); err != nil { - return err + coldr, err := NewColdSetReader(s.coldSetPath()) + if err != nil { + return xerrors.Errorf("error opening coldset: %w", err) } + defer coldr.Close() //nolint:errcheck // 3. copy the cold objects to the coldstore -- if we have one if !s.cfg.DiscardColdBlocks { log.Info("moving cold objects to the coldstore") startMove := time.Now() - err = s.moveColdBlocks(cold) + err = s.moveColdBlocks(coldr) if err != nil { return xerrors.Errorf("error moving cold objects: %w", err) } @@ -534,41 +540,57 @@ func (s *SplitStore) doCompact(curTs *types.TipSet) error { if err := s.checkClosing(); err != nil { return err } - } - // 4. sort cold objects so that the dags with most references are deleted first - // this ensures that we can't refer to a dag with its consituents already deleted, ie - // we lave no dangling references. - log.Info("sorting cold objects") - startSort := time.Now() - err = s.sortObjects(cold) - if err != nil { - return xerrors.Errorf("error sorting objects: %w", err) + if err := coldr.Reset(); err != nil { + return xerrors.Errorf("error resetting coldset: %w", err) + } } - log.Infow("sorting done", "took", time.Since(startSort)) - // 4.1 protect transactional refs once more - // strictly speaking, this is not necessary as purge will do it before deleting each - // batch. however, there is likely a largish number of references accumulated during - // ths sort and this protects before entering pruge context. - err = s.protectTxnRefs(markSet) - if err != nil { - return xerrors.Errorf("error protecting transactional refs: %w", err) + // 4. Purge cold objects with checkpointing for recovery. + // This is the critical section of compaction, whereby any cold object not in the markSet is + // considered already deleted. + // We delete cold objects in batches, holding the transaction lock, where we check the markSet + // again for new references created by the VM. + // After each batch, we write a checkpoint to disk; if the process is interrupted before completion, + // the process will continue from the checkpoint in the next recovery. + if err := s.beginCriticalSection(markSet); err != nil { + return xerrors.Errorf("error beginning critical section: %w", err) } if err := s.checkClosing(); err != nil { return err } + checkpoint, err := NewCheckpoint(s.checkpointPath()) + if err != nil { + return xerrors.Errorf("error creating checkpoint: %w", err) + } + defer checkpoint.Close() //nolint:errcheck + // 5. purge cold objects from the hotstore, taking protected references into account log.Info("purging cold objects from the hotstore") startPurge := time.Now() - err = s.purge(cold, markSet) + err = s.purge(coldr, checkpoint, markSet) if err != nil { - return xerrors.Errorf("error purging cold blocks: %w", err) + return xerrors.Errorf("error purging cold objects: %w", err) } log.Infow("purging cold objects from hotstore done", "took", time.Since(startPurge)) + s.endCriticalSection() + + if err := checkpoint.Close(); err != nil { + log.Warnf("error closing checkpoint: %s", err) + } + if err := os.Remove(s.checkpointPath()); err != nil { + log.Warnf("error removing checkpoint: %s", err) + } + if err := coldr.Close(); err != nil { + log.Warnf("error closing coldset: %s", err) + } + if err := os.Remove(s.coldSetPath()); err != nil { + log.Warnf("error removing coldset: %s", err) + } + // we are done; do some housekeeping s.endTxnProtect() s.gcHotstore() @@ -603,8 +625,22 @@ func (s *SplitStore) beginTxnProtect() { s.txnMissing = make(map[cid.Cid]struct{}) } -func (s *SplitStore) beginTxnMarking(markSet MarkSet) { - log.Info("beginning transactional marking") +func (s *SplitStore) beginCriticalSection(markSet MarkSet) error { + log.Info("beginning critical section") + + if err := markSet.BeginCriticalSection(); err != nil { + return xerrors.Errorf("error beginning critical section for markset: %w", err) + } + + s.txnLk.Lock() + s.txnMarkSet = markSet + s.txnLk.Unlock() + + if err := s.protectTxnRefs(markSet); err != nil { + return xerrors.Errorf("error protecting transactional references: %w", err) + } + + return nil } func (s *SplitStore) endTxnProtect() { @@ -618,6 +654,17 @@ func (s *SplitStore) endTxnProtect() { s.txnActive = false s.txnRefs = nil s.txnMissing = nil + s.txnMarkSet = nil +} + +func (s *SplitStore) endCriticalSection() { + log.Info("ending critical section") + + s.txnLk.Lock() + defer s.txnLk.Unlock() + + s.txnMarkSet.EndCriticalSection() + s.txnMarkSet = nil } func (s *SplitStore) walkChain(ts *types.TipSet, inclState, inclMsgs abi.ChainEpoch, @@ -892,10 +939,10 @@ func (s *SplitStore) has(c cid.Cid) (bool, error) { return s.cold.Has(s.ctx, c) } -func (s *SplitStore) moveColdBlocks(cold []cid.Cid) error { +func (s *SplitStore) moveColdBlocks(coldr *ColdSetReader) error { batch := make([]blocks.Block, 0, batchSize) - for _, c := range cold { + coldr.ForEach(func(c cid.Cid) error { if err := s.checkClosing(); err != nil { return err } @@ -904,7 +951,7 @@ func (s *SplitStore) moveColdBlocks(cold []cid.Cid) error { if err != nil { if err == bstore.ErrNotFound { log.Warnf("hotstore missing block %s", c) - continue + return nil } return xerrors.Errorf("error retrieving block %s from hotstore: %w", c, err) @@ -918,7 +965,9 @@ func (s *SplitStore) moveColdBlocks(cold []cid.Cid) error { } batch = batch[:0] } - } + + return nil + }) if len(batch) > 0 { err := s.cold.PutMany(s.ctx, batch) @@ -930,252 +979,200 @@ func (s *SplitStore) moveColdBlocks(cold []cid.Cid) error { return nil } -// sorts a slice of objects heaviest first -- it's a little expensive but worth the -// guarantee that we don't leave dangling references behind, e.g. if we die in the middle -// of a purge. -func (s *SplitStore) sortObjects(cids []cid.Cid) error { - // we cache the keys to avoid making a gazillion of strings - keys := make(map[cid.Cid]string) - key := func(c cid.Cid) string { - s, ok := keys[c] - if !ok { - s = string(c.Hash()) - keys[c] = s - } - return s - } +func (s *SplitStore) purge(coldr *ColdSetReader, checkpoint *Checkpoint, markSet MarkSet) error { + batch := make([]cid.Cid, 0, batchSize) + deadCids := make([]cid.Cid, 0, batchSize) - // compute sorting weights as the cumulative number of DAG links - weights := make(map[string]int) - for _, c := range cids { - // this can take quite a while, so check for shutdown with every opportunity - if err := s.checkClosing(); err != nil { - return err - } + var purgeCnt, liveCnt int + defer func() { + log.Infow("purged cold objects", "purged", purgeCnt, "live", liveCnt) + }() + + deleteBatch := func() error { + pc, lc, err := s.purgeBatch(batch, deadCids, checkpoint, markSet) + + purgeCnt += pc + liveCnt += lc + batch = batch[:0] - w := s.getObjectWeight(c, weights, key) - weights[key(c)] = w + return err } - // sort! - sort.Slice(cids, func(i, j int) bool { - wi := weights[key(cids[i])] - wj := weights[key(cids[j])] - if wi == wj { - return bytes.Compare(cids[i].Hash(), cids[j].Hash()) > 0 + err := coldr.ForEach(func(c cid.Cid) error { + batch = append(batch, c) + if len(batch) == batchSize { + return deleteBatch() } - return wi > wj + return nil }) + if err != nil { + return err + } + + if len(batch) > 0 { + return deleteBatch() + } + return nil } -func (s *SplitStore) getObjectWeight(c cid.Cid, weights map[string]int, key func(cid.Cid) string) int { - w, ok := weights[key(c)] - if ok { - return w +func (s *SplitStore) purgeBatch(batch, deadCids []cid.Cid, checkpoint *Checkpoint, markSet MarkSet) (purgeCnt int, liveCnt int, err error) { + if err := s.checkClosing(); err != nil { + return 0, 0, err } - // we treat block headers specially to avoid walking the entire chain - var hdr types.BlockHeader - err := s.view(c, func(data []byte) error { - return hdr.UnmarshalCBOR(bytes.NewBuffer(data)) - }) - if err == nil { - w1 := s.getObjectWeight(hdr.ParentStateRoot, weights, key) - weights[key(hdr.ParentStateRoot)] = w1 + s.txnLk.Lock() + defer s.txnLk.Unlock() - w2 := s.getObjectWeight(hdr.Messages, weights, key) - weights[key(hdr.Messages)] = w2 + for _, c := range batch { + has, err := markSet.Has(c) + if err != nil { + return 0, 0, xerrors.Errorf("error checking markset for liveness: %w", err) + } - return 1 + w1 + w2 - } + if has { + liveCnt++ + continue + } - var links []cid.Cid - err = s.view(c, func(data []byte) error { - return cbg.ScanForLinks(bytes.NewReader(data), func(c cid.Cid) { - links = append(links, c) - }) - }) - if err != nil { - return 1 + deadCids = append(deadCids, c) } - w = 1 - for _, c := range links { - // these are internal refs, so dags will be dags - if c.Prefix().Codec != cid.DagCBOR { - w++ - continue + if len(deadCids) == 0 { + if err := checkpoint.Set(batch[len(batch)-1]); err != nil { + return 0, 0, xerrors.Errorf("error setting checkpoint: %w", err) } - wc := s.getObjectWeight(c, weights, key) - weights[key(c)] = wc - - w += wc + return 0, liveCnt, nil } - return w -} - -func (s *SplitStore) purgeBatch(cids []cid.Cid, deleteBatch func([]cid.Cid) error) error { - if len(cids) == 0 { - return nil + if err := s.hot.DeleteMany(s.ctx, deadCids); err != nil { + return 0, liveCnt, xerrors.Errorf("error purging cold objects: %w", err) } - // we don't delete one giant batch of millions of objects, but rather do smaller batches - // so that we don't stop the world for an extended period of time - done := false - for i := 0; !done; i++ { - start := i * batchSize - end := start + batchSize - if end >= len(cids) { - end = len(cids) - done = true - } + s.debug.LogDelete(deadCids) + purgeCnt = len(deadCids) - err := deleteBatch(cids[start:end]) - if err != nil { - return xerrors.Errorf("error deleting batch: %w", err) - } + if err := checkpoint.Set(batch[len(batch)-1]); err != nil { + return purgeCnt, liveCnt, xerrors.Errorf("error setting checkpoint: %w", err) } - return nil + return purgeCnt, liveCnt, nil } -func (s *SplitStore) purge(cids []cid.Cid, markSet MarkSet) error { - deadCids := make([]cid.Cid, 0, batchSize) - var purgeCnt, liveCnt int - defer func() { - log.Infow("purged cold objects", "purged", purgeCnt, "live", liveCnt) - }() - - return s.purgeBatch(cids, - func(cids []cid.Cid) error { - deadCids := deadCids[:0] - - for { - if err := s.checkClosing(); err != nil { - return err - } - - s.txnLk.Lock() - if len(s.txnRefs) == 0 { - // keep the lock! - break - } +func (s *SplitStore) coldSetPath() string { + return filepath.Join(s.path, "coldset") +} - // unlock and protect - s.txnLk.Unlock() +func (s *SplitStore) checkpointPath() string { + return filepath.Join(s.path, "checkpoint") +} - err := s.protectTxnRefs(markSet) - if err != nil { - return xerrors.Errorf("error protecting transactional refs: %w", err) - } - } +func (s *SplitStore) checkpointExists() bool { + _, err := os.Stat(s.checkpointPath()) + return err == nil +} - defer s.txnLk.Unlock() +func (s *SplitStore) completeCompaction() error { + checkpoint, last, err := OpenCheckpoint(s.checkpointPath()) + if err != nil { + return xerrors.Errorf("error opening checkpoint: %w", err) + } + defer checkpoint.Close() //nolint:errcheck - for _, c := range cids { - live, err := markSet.Has(c) - if err != nil { - return xerrors.Errorf("error checking for liveness: %w", err) - } + coldr, err := NewColdSetReader(s.coldSetPath()) + if err != nil { + return xerrors.Errorf("error opening coldset: %w", err) + } + defer coldr.Close() //nolint:errcheck - if live { - liveCnt++ - continue - } + markSet, err := s.markSetEnv.Recover("live") + if err != nil { + return xerrors.Errorf("error recovering markset: %w", err) + } + defer markSet.Close() //nolint:errcheck - deadCids = append(deadCids, c) - } + // PURGE + log.Info("purging cold objects from the hotstore") + startPurge := time.Now() + err = s.completePurge(coldr, checkpoint, last, markSet) + if err != nil { + return xerrors.Errorf("error purging cold objects: %w", err) + } + log.Infow("purging cold objects from hotstore done", "took", time.Since(startPurge)) - err := s.hot.DeleteMany(s.ctx, deadCids) - if err != nil { - return xerrors.Errorf("error purging cold objects: %w", err) - } + markSet.EndCriticalSection() - s.debug.LogDelete(deadCids) + if err := checkpoint.Close(); err != nil { + log.Warnf("error closing checkpoint: %s", err) + } + if err := os.Remove(s.checkpointPath()); err != nil { + log.Warnf("error removing checkpoint: %s", err) + } + if err := coldr.Close(); err != nil { + log.Warnf("error closing coldset: %s", err) + } + if err := os.Remove(s.coldSetPath()); err != nil { + log.Warnf("error removing coldset: %s", err) + } - purgeCnt += len(deadCids) - return nil - }) + // Note: at this point we can start the splitstore; a compaction should run on + // the first head change, which will trigger gc on the hotstore. + // We don't mind the second (back-to-back) compaction as the head will + // have advanced during marking and coldset accumulation. + return nil } -// I really don't like having this code, but we seem to have some occasional DAG references with -// missing constituents. During testing in mainnet *some* of these references *sometimes* appeared -// after a little bit. -// We need to figure out where they are coming from and eliminate that vector, but until then we -// have this gem[TM]. -// My best guess is that they are parent message receipts or yet to be computed state roots; magik -// thinks the cause may be block validation. -func (s *SplitStore) waitForMissingRefs(markSet MarkSet) { - s.txnLk.Lock() - missing := s.txnMissing - s.txnMissing = nil - s.txnLk.Unlock() - - if len(missing) == 0 { - return +func (s *SplitStore) completePurge(coldr *ColdSetReader, checkpoint *Checkpoint, start cid.Cid, markSet MarkSet) error { + if !start.Defined() { + return s.purge(coldr, checkpoint, markSet) } - log.Info("waiting for missing references") - start := time.Now() - count := 0 + seeking := true + batch := make([]cid.Cid, 0, batchSize) + deadCids := make([]cid.Cid, 0, batchSize) + + var purgeCnt, liveCnt int defer func() { - log.Infow("waiting for missing references done", "took", time.Since(start), "marked", count) + log.Infow("purged cold objects", "purged", purgeCnt, "live", liveCnt) }() - for i := 0; i < 3 && len(missing) > 0; i++ { - if err := s.checkClosing(); err != nil { - return - } + deleteBatch := func() error { + pc, lc, err := s.purgeBatch(batch, deadCids, checkpoint, markSet) - wait := time.Duration(i) * time.Minute - log.Infof("retrying for %d missing references in %s (attempt: %d)", len(missing), wait, i+1) - if wait > 0 { - time.Sleep(wait) - } + purgeCnt += pc + liveCnt += lc + batch = batch[:0] - towalk := missing - visitor := newTmpVisitor() - missing = make(map[cid.Cid]struct{}) + return err + } - for c := range towalk { - err := s.walkObjectIncomplete(c, visitor, - func(c cid.Cid) error { - if isUnitaryObject(c) { - return errStopWalk - } + err := coldr.ForEach(func(c cid.Cid) error { + if seeking { + if start.Equals(c) { + seeking = false + } - visit, err := markSet.Visit(c) - if err != nil { - return xerrors.Errorf("error visiting object: %w", err) - } + return nil + } - if !visit { - return errStopWalk - } + batch = append(batch, c) + if len(batch) == batchSize { + return deleteBatch() + } - count++ - return nil - }, - func(c cid.Cid) error { - missing[c] = struct{}{} - return errStopWalk - }) + return nil + }) - if err != nil { - log.Warnf("error marking: %s", err) - } - } + if err != nil { + return err } - if len(missing) > 0 { - log.Warnf("still missing %d references", len(missing)) - for c := range missing { - log.Warnf("unresolved missing reference: %s", c) - } + if len(batch) > 0 { + return deleteBatch() } + + return nil } From 20b75022aa9ea44b2db05e3d94385e4377f8fda4 Mon Sep 17 00:00:00 2001 From: vyzo Date: Sun, 30 Jan 2022 15:33:30 +0200 Subject: [PATCH 279/393] fix mockStore for splitstore tests --- blockstore/splitstore/splitstore_test.go | 27 ++++++++++++++++-------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/blockstore/splitstore/splitstore_test.go b/blockstore/splitstore/splitstore_test.go index 3f507d49d63..220ef4474e5 100644 --- a/blockstore/splitstore/splitstore_test.go +++ b/blockstore/splitstore/splitstore_test.go @@ -22,6 +22,7 @@ import ( datastore "github.com/ipfs/go-datastore" dssync "github.com/ipfs/go-datastore/sync" logging "github.com/ipfs/go-log/v2" + mh "github.com/multiformats/go-multihash" ) func init() { @@ -446,17 +447,25 @@ func (c *mockChain) SubscribeHeadChanges(change func(revert []*types.TipSet, app type mockStore struct { mx sync.Mutex - set map[cid.Cid]blocks.Block + set map[string]blocks.Block } func newMockStore() *mockStore { - return &mockStore{set: make(map[cid.Cid]blocks.Block)} + return &mockStore{set: make(map[string]blocks.Block)} +} + +func (b *mockStore) keyOf(c cid.Cid) string { + return string(c.Hash()) +} + +func (b *mockStore) cidOf(k string) cid.Cid { + return cid.NewCidV1(cid.Raw, mh.Multihash([]byte(k))) } func (b *mockStore) Has(_ context.Context, cid cid.Cid) (bool, error) { b.mx.Lock() defer b.mx.Unlock() - _, ok := b.set[cid] + _, ok := b.set[b.keyOf(cid)] return ok, nil } @@ -466,7 +475,7 @@ func (b *mockStore) Get(_ context.Context, cid cid.Cid) (blocks.Block, error) { b.mx.Lock() defer b.mx.Unlock() - blk, ok := b.set[cid] + blk, ok := b.set[b.keyOf(cid)] if !ok { return nil, blockstore.ErrNotFound } @@ -494,7 +503,7 @@ func (b *mockStore) Put(_ context.Context, blk blocks.Block) error { b.mx.Lock() defer b.mx.Unlock() - b.set[blk.Cid()] = blk + b.set[b.keyOf(blk.Cid())] = blk return nil } @@ -503,7 +512,7 @@ func (b *mockStore) PutMany(_ context.Context, blks []blocks.Block) error { defer b.mx.Unlock() for _, blk := range blks { - b.set[blk.Cid()] = blk + b.set[b.keyOf(blk.Cid())] = blk } return nil } @@ -512,7 +521,7 @@ func (b *mockStore) DeleteBlock(_ context.Context, cid cid.Cid) error { b.mx.Lock() defer b.mx.Unlock() - delete(b.set, cid) + delete(b.set, b.keyOf(cid)) return nil } @@ -521,7 +530,7 @@ func (b *mockStore) DeleteMany(_ context.Context, cids []cid.Cid) error { defer b.mx.Unlock() for _, c := range cids { - delete(b.set, c) + delete(b.set, b.keyOf(c)) } return nil } @@ -535,7 +544,7 @@ func (b *mockStore) ForEachKey(f func(cid.Cid) error) error { defer b.mx.Unlock() for c := range b.set { - err := f(c) + err := f(b.cidOf(c)) if err != nil { return err } From 7931f1f8f9b3041fd5975a2fd77621c2e64cb383 Mon Sep 17 00:00:00 2001 From: vyzo Date: Sun, 30 Jan 2022 15:43:52 +0200 Subject: [PATCH 280/393] fix lint --- blockstore/splitstore/markset_map.go | 2 +- blockstore/splitstore/markset_test.go | 6 +++--- blockstore/splitstore/splitstore.go | 2 +- blockstore/splitstore/splitstore_compact.go | 12 ++++++++---- 4 files changed, 13 insertions(+), 9 deletions(-) diff --git a/blockstore/splitstore/markset_map.go b/blockstore/splitstore/markset_map.go index 38cea1288ab..8216bcd812f 100644 --- a/blockstore/splitstore/markset_map.go +++ b/blockstore/splitstore/markset_map.go @@ -60,7 +60,7 @@ func (e *MapMarkSetEnv) Recover(name string) (MarkSet, error) { if err != nil { return nil, xerrors.Errorf("error opening markset file for read: %w", err) } - defer in.Close() + defer in.Close() //nolint:errcheck // wrap a buffered reader to make this faster buf := bufio.NewReader(in) diff --git a/blockstore/splitstore/markset_test.go b/blockstore/splitstore/markset_test.go index c8ebaffe75f..b4b87160215 100644 --- a/blockstore/splitstore/markset_test.go +++ b/blockstore/splitstore/markset_test.go @@ -317,7 +317,7 @@ func testMarkSetVisitorRecovery(t *testing.T, lsType string) { t.Fatal(err) } - visitor, err = env.Recover("test") + _, err = env.Recover("test") if err == nil { t.Fatal("expected recovery to fail") } @@ -430,7 +430,7 @@ func testMarkSetRecovery(t *testing.T, lsType string) { t.Fatal(err) } - markSet, err = env.Recover("test") + _, err = env.Recover("test") if err == nil { t.Fatal("expected recovery to fail") } @@ -537,7 +537,7 @@ func testMarkSetMarkMany(t *testing.T, lsType string) { t.Fatal(err) } - markSet, err = env.Recover("test") + _, err = env.Recover("test") if err == nil { t.Fatal("expected recovery to fail") } diff --git a/blockstore/splitstore/splitstore.go b/blockstore/splitstore/splitstore.go index ef9f67d9d44..faf83b4f89a 100644 --- a/blockstore/splitstore/splitstore.go +++ b/blockstore/splitstore/splitstore.go @@ -208,7 +208,7 @@ func Open(path string, ds dstore.Datastore, hot, cold bstore.Blockstore, cfg *Co if ss.checkpointExists() { log.Info("found compaction checkpoint; resuming compaction") if err := ss.completeCompaction(); err != nil { - markSetEnv.Close() + markSetEnv.Close() //nolint:errcheck return nil, xerrors.Errorf("error resuming compaction: %w", err) } } diff --git a/blockstore/splitstore/splitstore_compact.go b/blockstore/splitstore/splitstore_compact.go index 37d4e50365d..57a0c7f3883 100644 --- a/blockstore/splitstore/splitstore_compact.go +++ b/blockstore/splitstore/splitstore_compact.go @@ -58,8 +58,6 @@ var ( const ( batchSize = 16384 - - defaultColdPurgeSize = 7_000_000 ) func (s *SplitStore) HeadChange(_, apply []*types.TipSet) error { @@ -497,7 +495,9 @@ func (s *SplitStore) doCompact(curTs *types.TipSet) error { } // it's cold, mark it as candidate for move - coldw.Write(c) + if err := coldw.Write(c); err != nil { + return xerrors.Errorf("error writing cid to coldstore: %w", err) + } coldCnt++ return nil @@ -942,7 +942,7 @@ func (s *SplitStore) has(c cid.Cid) (bool, error) { func (s *SplitStore) moveColdBlocks(coldr *ColdSetReader) error { batch := make([]blocks.Block, 0, batchSize) - coldr.ForEach(func(c cid.Cid) error { + err := coldr.ForEach(func(c cid.Cid) error { if err := s.checkClosing(); err != nil { return err } @@ -969,6 +969,10 @@ func (s *SplitStore) moveColdBlocks(coldr *ColdSetReader) error { return nil }) + if err != nil { + return xerrors.Errorf("error iterating coldset: %w", err) + } + if len(batch) > 0 { err := s.cold.PutMany(s.ctx, batch) if err != nil { From 7b8447a95a67af4623530dbabd1132969f61ac96 Mon Sep 17 00:00:00 2001 From: vyzo Date: Sun, 30 Jan 2022 19:00:52 +0200 Subject: [PATCH 281/393] reinstante waitForMissingRefs --- blockstore/splitstore/splitstore_compact.go | 86 +++++++++++++++++++++ 1 file changed, 86 insertions(+) diff --git a/blockstore/splitstore/splitstore_compact.go b/blockstore/splitstore/splitstore_compact.go index 57a0c7f3883..7d84a75a6ba 100644 --- a/blockstore/splitstore/splitstore_compact.go +++ b/blockstore/splitstore/splitstore_compact.go @@ -521,6 +521,15 @@ func (s *SplitStore) doCompact(curTs *types.TipSet) error { return err } + // now that we have collected cold objects, check for missing references from transactional i/o + // and disable further collection of such references (they will not be acted upon as we can't + // possibly delete objects we didn't have when we were collecting cold objects) + s.waitForMissingRefs(markSet) + + if err := s.checkClosing(); err != nil { + return err + } + coldr, err := NewColdSetReader(s.coldSetPath()) if err != nil { return xerrors.Errorf("error opening coldset: %w", err) @@ -1180,3 +1189,80 @@ func (s *SplitStore) completePurge(coldr *ColdSetReader, checkpoint *Checkpoint, return nil } + +// I really don't like having this code, but we seem to have some occasional DAG references with +// missing constituents. During testing in mainnet *some* of these references *sometimes* appeared +// after a little bit. +// We need to figure out where they are coming from and eliminate that vector, but until then we +// have this gem[TM]. +// My best guess is that they are parent message receipts or yet to be computed state roots; magik +// thinks the cause may be block validation. +func (s *SplitStore) waitForMissingRefs(markSet MarkSet) { + s.txnLk.Lock() + missing := s.txnMissing + s.txnMissing = nil + s.txnLk.Unlock() + + if len(missing) == 0 { + return + } + + log.Info("waiting for missing references") + start := time.Now() + count := 0 + defer func() { + log.Infow("waiting for missing references done", "took", time.Since(start), "marked", count) + }() + + for i := 0; i < 3 && len(missing) > 0; i++ { + if err := s.checkClosing(); err != nil { + return + } + + wait := time.Duration(i) * time.Minute + log.Infof("retrying for %d missing references in %s (attempt: %d)", len(missing), wait, i+1) + if wait > 0 { + time.Sleep(wait) + } + + towalk := missing + visitor := newTmpVisitor() + missing = make(map[cid.Cid]struct{}) + + for c := range towalk { + err := s.walkObjectIncomplete(c, visitor, + func(c cid.Cid) error { + if isUnitaryObject(c) { + return errStopWalk + } + + visit, err := markSet.Visit(c) + if err != nil { + return xerrors.Errorf("error visiting object: %w", err) + } + + if !visit { + return errStopWalk + } + + count++ + return nil + }, + func(c cid.Cid) error { + missing[c] = struct{}{} + return errStopWalk + }) + + if err != nil { + log.Warnf("error marking: %s", err) + } + } + } + + if len(missing) > 0 { + log.Warnf("still missing %d references", len(missing)) + for c := range missing { + log.Warnf("unresolved missing reference: %s", c) + } + } +} From a9d4495d837c892dc3c6d99de4c30e3e0c2ede81 Mon Sep 17 00:00:00 2001 From: vyzo Date: Sun, 30 Jan 2022 22:47:20 +0200 Subject: [PATCH 282/393] use both hot and cold when doing fetches for markset positive objects --- blockstore/splitstore/splitstore.go | 6 +++--- blockstore/splitstore/splitstore_compact.go | 24 +++++++++++++++++++++ 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/blockstore/splitstore/splitstore.go b/blockstore/splitstore/splitstore.go index faf83b4f89a..2d504163d87 100644 --- a/blockstore/splitstore/splitstore.go +++ b/blockstore/splitstore/splitstore.go @@ -280,7 +280,7 @@ func (s *SplitStore) Get(ctx context.Context, cid cid.Cid) (blocks.Block, error) } if has { - return s.hot.Get(ctx, cid) + return s.get(cid) } return s.cold.Get(ctx, cid) @@ -331,7 +331,7 @@ func (s *SplitStore) GetSize(ctx context.Context, cid cid.Cid) (int, error) { } if has { - return s.hot.GetSize(ctx, cid) + return s.getSize(cid) } return s.cold.GetSize(ctx, cid) @@ -500,7 +500,7 @@ func (s *SplitStore) View(ctx context.Context, cid cid.Cid, cb func([]byte) erro } if has { - return s.hot.View(ctx, cid, cb) + return s.view(cid, cb) } return s.cold.View(ctx, cid, cb) diff --git a/blockstore/splitstore/splitstore_compact.go b/blockstore/splitstore/splitstore_compact.go index 7d84a75a6ba..bdb0f882e5c 100644 --- a/blockstore/splitstore/splitstore_compact.go +++ b/blockstore/splitstore/splitstore_compact.go @@ -948,6 +948,30 @@ func (s *SplitStore) has(c cid.Cid) (bool, error) { return s.cold.Has(s.ctx, c) } +func (s *SplitStore) get(c cid.Cid) (blocks.Block, error) { + blk, err := s.hot.Get(s.ctx, c) + switch err { + case nil: + return blk, nil + case bstore.ErrNotFound: + return s.cold.Get(s.ctx, c) + default: + return nil, err + } +} + +func (s *SplitStore) getSize(c cid.Cid) (int, error) { + sz, err := s.hot.GetSize(s.ctx, c) + switch err { + case nil: + return sz, nil + case bstore.ErrNotFound: + return s.cold.GetSize(s.ctx, c) + default: + return 0, err + } +} + func (s *SplitStore) moveColdBlocks(coldr *ColdSetReader) error { batch := make([]blocks.Block, 0, batchSize) From 1900c907fdb0bedb529c2fa82ec0a4e3ab4e581b Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 31 Jan 2022 09:44:37 +0200 Subject: [PATCH 283/393] account for missing refs in the markset in Has --- blockstore/splitstore/splitstore.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/blockstore/splitstore/splitstore.go b/blockstore/splitstore/splitstore.go index 2d504163d87..d2928041cc8 100644 --- a/blockstore/splitstore/splitstore.go +++ b/blockstore/splitstore/splitstore.go @@ -238,8 +238,12 @@ func (s *SplitStore) Has(ctx context.Context, cid cid.Cid) (bool, error) { // critical section if s.txnMarkSet != nil { has, err := s.txnMarkSet.Has(cid) - if has || err != nil { - return has, err + if err != nil { + return false, err + } + + if has { + return s.has(cid) } return s.cold.Has(ctx, cid) From ee63be26a1140cb66d21dd174b1545a2d19dd9cb Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 31 Jan 2022 12:40:26 +0200 Subject: [PATCH 284/393] fix race in protectView --- blockstore/splitstore/splitstore.go | 3 +-- blockstore/splitstore/splitstore_compact.go | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/blockstore/splitstore/splitstore.go b/blockstore/splitstore/splitstore.go index d2928041cc8..4780fcdb4d2 100644 --- a/blockstore/splitstore/splitstore.go +++ b/blockstore/splitstore/splitstore.go @@ -494,7 +494,7 @@ func (s *SplitStore) View(ctx context.Context, cid cid.Cid, cb func([]byte) erro } // critical section - s.txnLk.RLock() + s.txnLk.RLock() // the lock is released in protectView if we are not in critical section if s.txnMarkSet != nil { has, err := s.txnMarkSet.Has(cid) s.txnLk.RUnlock() @@ -509,7 +509,6 @@ func (s *SplitStore) View(ctx context.Context, cid cid.Cid, cb func([]byte) erro return s.cold.View(ctx, cid, cb) } - s.txnLk.RUnlock() // views are (optimistically) protected two-fold: // - if there is an active transaction, then the reference is protected. diff --git a/blockstore/splitstore/splitstore_compact.go b/blockstore/splitstore/splitstore_compact.go index bdb0f882e5c..26f662bdac0 100644 --- a/blockstore/splitstore/splitstore_compact.go +++ b/blockstore/splitstore/splitstore_compact.go @@ -156,7 +156,7 @@ func (s *SplitStore) protectTipSets(apply []*types.TipSet) { // transactionally protect a view func (s *SplitStore) protectView(c cid.Cid) { - s.txnLk.RLock() + // the txnLk is held for read defer s.txnLk.RUnlock() if s.txnActive { From c9bd5ec452fa1c80d4ab0f60ca8130f913ceb176 Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 31 Jan 2022 14:54:23 +0200 Subject: [PATCH 285/393] mark tipset references to protect them during critical section --- blockstore/splitstore/splitstore_compact.go | 76 ++++++++++++++++++++- 1 file changed, 75 insertions(+), 1 deletion(-) diff --git a/blockstore/splitstore/splitstore_compact.go b/blockstore/splitstore/splitstore_compact.go index 26f662bdac0..f9a5adc8847 100644 --- a/blockstore/splitstore/splitstore_compact.go +++ b/blockstore/splitstore/splitstore_compact.go @@ -140,9 +140,9 @@ func (s *SplitStore) isNearUpgrade(epoch abi.ChainEpoch) bool { // transactionally protect incoming tipsets func (s *SplitStore) protectTipSets(apply []*types.TipSet) { s.txnLk.RLock() - defer s.txnLk.RUnlock() if !s.txnActive { + s.txnLk.RUnlock() return } @@ -151,7 +151,81 @@ func (s *SplitStore) protectTipSets(apply []*types.TipSet) { cids = append(cids, ts.Cids()...) } + if len(cids) == 0 { + s.txnLk.RUnlock() + return + } + + // critical section + if s.txnMarkSet != nil { + go func() { + defer s.txnLk.RUnlock() + s.markTipSetRefs(cids) + }() + return + } + s.trackTxnRefMany(cids) + s.txnLk.RUnlock() +} + +func (s *SplitStore) markTipSetRefs(cids []cid.Cid) { + log.Info("marking %d tipset refs", len(cids)) + startMark := time.Now() + + workch := make(chan cid.Cid, len(cids)) + for _, c := range cids { + workch <- c + } + close(workch) + + count := new(int32) + worker := func() error { + for c := range workch { + err := s.walkObject(c, newTmpVisitor(), + func(c cid.Cid) error { + if isUnitaryObject(c) { + return errStopWalk + } + + visit, err := s.txnMarkSet.Visit(c) + if err != nil { + return xerrors.Errorf("error visiting object: %w", err) + } + + if !visit { + return errStopWalk + } + + atomic.AddInt32(count, 1) + return nil + }) + if err != nil { + return err + } + } + + return nil + } + + workers := runtime.NumCPU() / 2 + if workers < 2 { + workers = 2 + } + if workers > len(cids) { + workers = len(cids) + } + + g := new(errgroup.Group) + for i := 0; i < workers; i++ { + g.Go(worker) + } + + if err := g.Wait(); err != nil { + log.Errorf("error marking tipset refs: %s", err) + } + + log.Infow("marking tipset refs done", "took", time.Since(startMark), "marked", *count) } // transactionally protect a view From 1abfc5b1cff3a979f69f662bf905baa0e6fd703e Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 31 Jan 2022 15:00:03 +0200 Subject: [PATCH 286/393] fix comment --- blockstore/splitstore/splitstore_compact.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockstore/splitstore/splitstore_compact.go b/blockstore/splitstore/splitstore_compact.go index f9a5adc8847..31ce1a329bf 100644 --- a/blockstore/splitstore/splitstore_compact.go +++ b/blockstore/splitstore/splitstore_compact.go @@ -987,7 +987,7 @@ func (s *SplitStore) walkObjectIncomplete(c cid.Cid, visitor ObjectVisitor, f, m return nil } -// internal version used by walk +// internal version used during compaction and related operations func (s *SplitStore) view(c cid.Cid, cb func([]byte) error) error { if isIdentiyCid(c) { data, err := decodeIdentityCid(c) From 2b14bda6b8eff374ebc8ede7a1ea1f2fa15db823 Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 31 Jan 2022 17:26:08 +0200 Subject: [PATCH 287/393] recursively mark puts during the critical section --- blockstore/splitstore/splitstore.go | 18 ++++++++++++++---- blockstore/splitstore/splitstore_compact.go | 8 ++++---- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/blockstore/splitstore/splitstore.go b/blockstore/splitstore/splitstore.go index 4780fcdb4d2..06174156dcc 100644 --- a/blockstore/splitstore/splitstore.go +++ b/blockstore/splitstore/splitstore.go @@ -370,10 +370,10 @@ func (s *SplitStore) Put(ctx context.Context, blk blocks.Block) error { } s.txnLk.RLock() - defer s.txnLk.RUnlock() err := s.hot.Put(ctx, blk) if err != nil { + s.txnLk.RUnlock() return err } @@ -381,8 +381,13 @@ func (s *SplitStore) Put(ctx context.Context, blk blocks.Block) error { // critical section if s.txnMarkSet != nil { - return s.txnMarkSet.Mark(blk.Cid()) + go func() { + defer s.txnLk.RUnlock() + s.markLiveRefs([]cid.Cid{blk.Cid()}) + }() + return nil } + defer s.txnLk.RUnlock() s.trackTxnRef(blk.Cid()) return nil @@ -420,10 +425,10 @@ func (s *SplitStore) PutMany(ctx context.Context, blks []blocks.Block) error { } s.txnLk.RLock() - defer s.txnLk.RUnlock() err := s.hot.PutMany(ctx, blks) if err != nil { + s.txnLk.RUnlock() return err } @@ -431,8 +436,13 @@ func (s *SplitStore) PutMany(ctx context.Context, blks []blocks.Block) error { // critical section if s.txnMarkSet != nil { - return s.txnMarkSet.MarkMany(batch) + go func() { + defer s.txnLk.RUnlock() + s.txnMarkSet.MarkMany(batch) + }() + return nil } + defer s.txnLk.RUnlock() s.trackTxnRefMany(batch) return nil diff --git a/blockstore/splitstore/splitstore_compact.go b/blockstore/splitstore/splitstore_compact.go index 31ce1a329bf..6175818bbb5 100644 --- a/blockstore/splitstore/splitstore_compact.go +++ b/blockstore/splitstore/splitstore_compact.go @@ -160,7 +160,7 @@ func (s *SplitStore) protectTipSets(apply []*types.TipSet) { if s.txnMarkSet != nil { go func() { defer s.txnLk.RUnlock() - s.markTipSetRefs(cids) + s.markLiveRefs(cids) }() return } @@ -169,8 +169,8 @@ func (s *SplitStore) protectTipSets(apply []*types.TipSet) { s.txnLk.RUnlock() } -func (s *SplitStore) markTipSetRefs(cids []cid.Cid) { - log.Info("marking %d tipset refs", len(cids)) +func (s *SplitStore) markLiveRefs(cids []cid.Cid) { + log.Info("marking %d live refs", len(cids)) startMark := time.Now() workch := make(chan cid.Cid, len(cids)) @@ -225,7 +225,7 @@ func (s *SplitStore) markTipSetRefs(cids []cid.Cid) { log.Errorf("error marking tipset refs: %s", err) } - log.Infow("marking tipset refs done", "took", time.Since(startMark), "marked", *count) + log.Infow("marking live refs done", "took", time.Since(startMark), "marked", *count) } // transactionally protect a view From 710fda49f067eedaf6c3ecbbdaa24b94e8305cd6 Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 31 Jan 2022 17:35:30 +0200 Subject: [PATCH 288/393] fix putmany marking --- blockstore/splitstore/splitstore.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockstore/splitstore/splitstore.go b/blockstore/splitstore/splitstore.go index 06174156dcc..8f09da37fe3 100644 --- a/blockstore/splitstore/splitstore.go +++ b/blockstore/splitstore/splitstore.go @@ -438,7 +438,7 @@ func (s *SplitStore) PutMany(ctx context.Context, blks []blocks.Block) error { if s.txnMarkSet != nil { go func() { defer s.txnLk.RUnlock() - s.txnMarkSet.MarkMany(batch) + s.markLiveRefs(batch) }() return nil } From 5b9ea1b4e04c9e418b482041bfb5623f729b05a6 Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 31 Jan 2022 18:47:08 +0200 Subject: [PATCH 289/393] avoid races in beginCriticalSection --- blockstore/splitstore/splitstore_compact.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/blockstore/splitstore/splitstore_compact.go b/blockstore/splitstore/splitstore_compact.go index 6175818bbb5..af5a425e9d9 100644 --- a/blockstore/splitstore/splitstore_compact.go +++ b/blockstore/splitstore/splitstore_compact.go @@ -711,6 +711,11 @@ func (s *SplitStore) beginTxnProtect() { func (s *SplitStore) beginCriticalSection(markSet MarkSet) error { log.Info("beginning critical section") + // do that once first to get the bulk before the markset is in critical section + if err := s.protectTxnRefs(markSet); err != nil { + return xerrors.Errorf("error protecting transactional references: %w", err) + } + if err := markSet.BeginCriticalSection(); err != nil { return xerrors.Errorf("error beginning critical section for markset: %w", err) } @@ -719,6 +724,7 @@ func (s *SplitStore) beginCriticalSection(markSet MarkSet) error { s.txnMarkSet = markSet s.txnLk.Unlock() + // and do it again to mark references that might have been created in the meantime if err := s.protectTxnRefs(markSet); err != nil { return xerrors.Errorf("error protecting transactional references: %w", err) } From 877dfbe992576394c1ff4f8cf638814013a2d6dd Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 31 Jan 2022 19:21:03 +0200 Subject: [PATCH 290/393] hold the lock in the second protect call --- blockstore/splitstore/splitstore_compact.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/blockstore/splitstore/splitstore_compact.go b/blockstore/splitstore/splitstore_compact.go index af5a425e9d9..1a2956655db 100644 --- a/blockstore/splitstore/splitstore_compact.go +++ b/blockstore/splitstore/splitstore_compact.go @@ -721,10 +721,13 @@ func (s *SplitStore) beginCriticalSection(markSet MarkSet) error { } s.txnLk.Lock() + defer s.txnLk.Unlock() + s.txnMarkSet = markSet - s.txnLk.Unlock() - // and do it again to mark references that might have been created in the meantime + // and do it again while holding the lock to mark references that might have been created + // in the meantime and avoid races of the type Has->txnRef->enterCS->Get fails because + // it's not in the markset if err := s.protectTxnRefs(markSet); err != nil { return xerrors.Errorf("error protecting transactional references: %w", err) } From 7896af731fd223b56635e606203270e4c3ea145d Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 31 Jan 2022 21:41:42 +0200 Subject: [PATCH 291/393] use walkObjectIncomplete for marking live refs --- blockstore/splitstore/splitstore_compact.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/blockstore/splitstore/splitstore_compact.go b/blockstore/splitstore/splitstore_compact.go index 1a2956655db..b35b491fad9 100644 --- a/blockstore/splitstore/splitstore_compact.go +++ b/blockstore/splitstore/splitstore_compact.go @@ -170,7 +170,7 @@ func (s *SplitStore) protectTipSets(apply []*types.TipSet) { } func (s *SplitStore) markLiveRefs(cids []cid.Cid) { - log.Info("marking %d live refs", len(cids)) + log.Infof("marking %d live refs", len(cids)) startMark := time.Now() workch := make(chan cid.Cid, len(cids)) @@ -182,7 +182,7 @@ func (s *SplitStore) markLiveRefs(cids []cid.Cid) { count := new(int32) worker := func() error { for c := range workch { - err := s.walkObject(c, newTmpVisitor(), + err := s.walkObjectIncomplete(c, newTmpVisitor(), func(c cid.Cid) error { if isUnitaryObject(c) { return errStopWalk @@ -199,6 +199,10 @@ func (s *SplitStore) markLiveRefs(cids []cid.Cid) { atomic.AddInt32(count, 1) return nil + }, + func(missing cid.Cid) error { + log.Warnf("missing reference %s rooted at %s", missing, c) + return errStopWalk }) if err != nil { return err From 37673c6de64223aea2fd76d16dd1bd35ef6d236d Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 31 Jan 2022 21:44:10 +0200 Subject: [PATCH 292/393] downgrade marking log to debug --- blockstore/splitstore/splitstore_compact.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/blockstore/splitstore/splitstore_compact.go b/blockstore/splitstore/splitstore_compact.go index b35b491fad9..e3d16ea8d3b 100644 --- a/blockstore/splitstore/splitstore_compact.go +++ b/blockstore/splitstore/splitstore_compact.go @@ -170,7 +170,7 @@ func (s *SplitStore) protectTipSets(apply []*types.TipSet) { } func (s *SplitStore) markLiveRefs(cids []cid.Cid) { - log.Infof("marking %d live refs", len(cids)) + log.Debugf("marking %d live refs", len(cids)) startMark := time.Now() workch := make(chan cid.Cid, len(cids)) @@ -201,7 +201,7 @@ func (s *SplitStore) markLiveRefs(cids []cid.Cid) { return nil }, func(missing cid.Cid) error { - log.Warnf("missing reference %s rooted at %s", missing, c) + log.Warnf("missing object reference %s in %s", missing, c) return errStopWalk }) if err != nil { @@ -229,7 +229,7 @@ func (s *SplitStore) markLiveRefs(cids []cid.Cid) { log.Errorf("error marking tipset refs: %s", err) } - log.Infow("marking live refs done", "took", time.Since(startMark), "marked", *count) + log.Debugw("marking live refs done", "took", time.Since(startMark), "marked", *count) } // transactionally protect a view From 13ccb8cbfe6106fdad985daaef0e74e5d42cdea6 Mon Sep 17 00:00:00 2001 From: zenground0 Date: Tue, 1 Feb 2022 11:39:42 +0530 Subject: [PATCH 293/393] Stop recovery attempts after fault --- extern/storage-sealing/states_failed.go | 11 +++++++++ extern/storage-sealing/upgrade_queue.go | 31 ++++++++++++++++--------- 2 files changed, 31 insertions(+), 11 deletions(-) diff --git a/extern/storage-sealing/states_failed.go b/extern/storage-sealing/states_failed.go index c32ac4c3a9f..03d87a3b491 100644 --- a/extern/storage-sealing/states_failed.go +++ b/extern/storage-sealing/states_failed.go @@ -237,6 +237,17 @@ func (m *Sealing) handleSubmitReplicaUpdateFailed(ctx statemachine.Context, sect } } + // Abort upgrade for sectors that went faulty since being marked for upgrade + active, err := sectorActive(ctx.Context(), m.Api, m.maddr, tok, sector.SectorNumber) + if err != nil { + log.Errorf("sector active check: api error, not proceeding: %+v", err) + return nil + } + if !active { + log.Errorf("sector marked for upgrade %d no longer active, aborting upgrade", sector.SectorNumber) + return ctx.Send(SectorAbortUpgrade{}) + } + if err := failedCooldown(ctx, sector); err != nil { return err } diff --git a/extern/storage-sealing/upgrade_queue.go b/extern/storage-sealing/upgrade_queue.go index 1aacc9c0808..343d6ca9554 100644 --- a/extern/storage-sealing/upgrade_queue.go +++ b/extern/storage-sealing/upgrade_queue.go @@ -3,6 +3,7 @@ package sealing import ( "context" + "github.com/filecoin-project/go-address" "github.com/filecoin-project/lotus/chain/actors/builtin/miner" market7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/market" @@ -86,19 +87,11 @@ func (m *Sealing) MarkForSnapUpgrade(ctx context.Context, id abi.SectorNumber) e return xerrors.Errorf("failed to read sector on chain info: %w", err) } - active, err := m.Api.StateMinerActiveSectors(ctx, m.maddr, tok) + active, err := sectorActive(ctx, m.Api, m.maddr, tok, id) if err != nil { - return xerrors.Errorf("failed to check active sectors: %w", err) + return xerrors.Errorf("failed to check if sector is active") } - // Ensure the upgraded sector is active - var found bool - for _, si := range active { - if si.SectorNumber == id { - found = true - break - } - } - if !found { + if !active { return xerrors.Errorf("cannot mark inactive sector for upgrade") } @@ -110,6 +103,22 @@ func (m *Sealing) MarkForSnapUpgrade(ctx context.Context, id abi.SectorNumber) e return m.sectors.Send(uint64(id), SectorStartCCUpdate{}) } +func sectorActive(ctx context.Context, api SealingAPI, maddr address.Address, tok TipSetToken, sector abi.SectorNumber) (bool, error) { + active, err := api.StateMinerActiveSectors(ctx, maddr, tok) + if err != nil { + return false, xerrors.Errorf("failed to check active sectors: %w", err) + } + // Ensure the upgraded sector is active + var found bool + for _, si := range active { + if si.SectorNumber == sector { + found = true + break + } + } + return found, nil +} + func (m *Sealing) tryUpgradeSector(ctx context.Context, params *miner.SectorPreCommitInfo) big.Int { if len(params.DealIDs) == 0 { return big.Zero() From 3aabb0314aa96d5f15a0d0f9bf875dfce05e4a8f Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 1 Feb 2022 09:07:14 +0200 Subject: [PATCH 294/393] synchronously mark live refs on put/putmany --- blockstore/splitstore/splitstore.go | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/blockstore/splitstore/splitstore.go b/blockstore/splitstore/splitstore.go index 8f09da37fe3..6a83b81465a 100644 --- a/blockstore/splitstore/splitstore.go +++ b/blockstore/splitstore/splitstore.go @@ -370,10 +370,10 @@ func (s *SplitStore) Put(ctx context.Context, blk blocks.Block) error { } s.txnLk.RLock() + defer s.txnLk.RUnlock() err := s.hot.Put(ctx, blk) if err != nil { - s.txnLk.RUnlock() return err } @@ -381,13 +381,9 @@ func (s *SplitStore) Put(ctx context.Context, blk blocks.Block) error { // critical section if s.txnMarkSet != nil { - go func() { - defer s.txnLk.RUnlock() - s.markLiveRefs([]cid.Cid{blk.Cid()}) - }() + s.markLiveRefs([]cid.Cid{blk.Cid()}) return nil } - defer s.txnLk.RUnlock() s.trackTxnRef(blk.Cid()) return nil @@ -425,10 +421,10 @@ func (s *SplitStore) PutMany(ctx context.Context, blks []blocks.Block) error { } s.txnLk.RLock() + defer s.txnLk.RUnlock() err := s.hot.PutMany(ctx, blks) if err != nil { - s.txnLk.RUnlock() return err } @@ -436,13 +432,9 @@ func (s *SplitStore) PutMany(ctx context.Context, blks []blocks.Block) error { // critical section if s.txnMarkSet != nil { - go func() { - defer s.txnLk.RUnlock() - s.markLiveRefs(batch) - }() + s.markLiveRefs(batch) return nil } - defer s.txnLk.RUnlock() s.trackTxnRefMany(batch) return nil From 11ae85645b03b8a491ecc1b4229f44b0e9db2610 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 1 Feb 2022 09:13:21 +0200 Subject: [PATCH 295/393] optimize single object marking in markLiveRefs --- blockstore/splitstore/splitstore_compact.go | 60 ++++++++++++--------- 1 file changed, 36 insertions(+), 24 deletions(-) diff --git a/blockstore/splitstore/splitstore_compact.go b/blockstore/splitstore/splitstore_compact.go index e3d16ea8d3b..41792777b8c 100644 --- a/blockstore/splitstore/splitstore_compact.go +++ b/blockstore/splitstore/splitstore_compact.go @@ -173,38 +173,50 @@ func (s *SplitStore) markLiveRefs(cids []cid.Cid) { log.Debugf("marking %d live refs", len(cids)) startMark := time.Now() + count := new(int32) + walkObject := func(c cid.Cid) error { + return s.walkObjectIncomplete(c, newTmpVisitor(), + func(c cid.Cid) error { + if isUnitaryObject(c) { + return errStopWalk + } + + visit, err := s.txnMarkSet.Visit(c) + if err != nil { + return xerrors.Errorf("error visiting object: %w", err) + } + + if !visit { + return errStopWalk + } + + atomic.AddInt32(count, 1) + return nil + }, + func(missing cid.Cid) error { + log.Warnf("missing object reference %s in %s", missing, c) + return errStopWalk + }) + } + + // optimize the common case of single put + if len(cids) == 1 { + if err := walkObject(cids[0]); err != nil { + log.Errorf("error marking tipset refs: %s", err) + } + log.Debugw("marking live refs done", "took", time.Since(startMark), "marked", *count) + return + } + workch := make(chan cid.Cid, len(cids)) for _, c := range cids { workch <- c } close(workch) - count := new(int32) worker := func() error { for c := range workch { - err := s.walkObjectIncomplete(c, newTmpVisitor(), - func(c cid.Cid) error { - if isUnitaryObject(c) { - return errStopWalk - } - - visit, err := s.txnMarkSet.Visit(c) - if err != nil { - return xerrors.Errorf("error visiting object: %w", err) - } - - if !visit { - return errStopWalk - } - - atomic.AddInt32(count, 1) - return nil - }, - func(missing cid.Cid) error { - log.Warnf("missing object reference %s in %s", missing, c) - return errStopWalk - }) - if err != nil { + if err := walkObject(c); err != nil { return err } } From fd07ca87ce32f7390c132aefda58a42b8e533cb6 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 1 Feb 2022 10:46:42 +0200 Subject: [PATCH 296/393] wait for the sync gap time befor starting the purge --- blockstore/splitstore/splitstore_compact.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/blockstore/splitstore/splitstore_compact.go b/blockstore/splitstore/splitstore_compact.go index 41792777b8c..e08428e2988 100644 --- a/blockstore/splitstore/splitstore_compact.go +++ b/blockstore/splitstore/splitstore_compact.go @@ -660,6 +660,10 @@ func (s *SplitStore) doCompact(curTs *types.TipSet) error { return err } + // wait for the head to catch up so that all messages are protected + log.Infof("waiting %s for sync", SyncGapTime) + time.Sleep(SyncGapTime) + checkpoint, err := NewCheckpoint(s.checkpointPath()) if err != nil { return xerrors.Errorf("error creating checkpoint: %w", err) From 6353fa72d8ae3ad64ec7a111abcc6f7f55d83a81 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 1 Feb 2022 10:55:15 +0200 Subject: [PATCH 297/393] decouple SyncGapTime from wait time --- blockstore/splitstore/splitstore_compact.go | 7 +++++-- blockstore/splitstore/splitstore_test.go | 1 + 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/blockstore/splitstore/splitstore_compact.go b/blockstore/splitstore/splitstore_compact.go index e08428e2988..82cf8ada9ac 100644 --- a/blockstore/splitstore/splitstore_compact.go +++ b/blockstore/splitstore/splitstore_compact.go @@ -49,6 +49,9 @@ var ( // SyncGapTime is the time delay from a tipset's min timestamp before we decide // there is a sync gap SyncGapTime = time.Minute + + // SyncWaitTime is the time delay before compaction starts purging + SyncWaitTime = SyncGapTime ) var ( @@ -661,8 +664,8 @@ func (s *SplitStore) doCompact(curTs *types.TipSet) error { } // wait for the head to catch up so that all messages are protected - log.Infof("waiting %s for sync", SyncGapTime) - time.Sleep(SyncGapTime) + log.Infof("waiting %s for sync", SyncWaitTime) + time.Sleep(SyncWaitTime) checkpoint, err := NewCheckpoint(s.checkpointPath()) if err != nil { diff --git a/blockstore/splitstore/splitstore_test.go b/blockstore/splitstore/splitstore_test.go index 220ef4474e5..0e4c4c951dc 100644 --- a/blockstore/splitstore/splitstore_test.go +++ b/blockstore/splitstore/splitstore_test.go @@ -29,6 +29,7 @@ func init() { CompactionThreshold = 5 CompactionBoundary = 2 WarmupBoundary = 0 + SyncWaitTime = time.Millisecond logging.SetLogLevel("splitstore", "DEBUG") } From 578b5691bc12c339387983d412b06c617338d3ed Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 1 Feb 2022 10:59:08 +0200 Subject: [PATCH 298/393] check for closing after the sync wait --- blockstore/splitstore/splitstore_compact.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/blockstore/splitstore/splitstore_compact.go b/blockstore/splitstore/splitstore_compact.go index 82cf8ada9ac..ca941cf90c8 100644 --- a/blockstore/splitstore/splitstore_compact.go +++ b/blockstore/splitstore/splitstore_compact.go @@ -663,10 +663,14 @@ func (s *SplitStore) doCompact(curTs *types.TipSet) error { return err } - // wait for the head to catch up so that all messages are protected + // wait for the head to catch up so that all messages in the current head are protected log.Infof("waiting %s for sync", SyncWaitTime) time.Sleep(SyncWaitTime) + if err := s.checkClosing(); err != nil { + return err + } + checkpoint, err := NewCheckpoint(s.checkpointPath()) if err != nil { return xerrors.Errorf("error creating checkpoint: %w", err) From 7b4ab2077b50d88061bf1d56c4d2e91047d43eac Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 1 Feb 2022 11:10:51 +0200 Subject: [PATCH 299/393] wait for sync in a non racey way --- blockstore/splitstore/splitstore.go | 4 ++++ blockstore/splitstore/splitstore_compact.go | 23 ++++++++++++++++++--- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/blockstore/splitstore/splitstore.go b/blockstore/splitstore/splitstore.go index 6a83b81465a..75d54533eec 100644 --- a/blockstore/splitstore/splitstore.go +++ b/blockstore/splitstore/splitstore.go @@ -157,6 +157,9 @@ type SplitStore struct { txnRefs map[cid.Cid]struct{} txnMissing map[cid.Cid]struct{} txnMarkSet MarkSet + txnSyncMx sync.Mutex + txnSyncCond sync.Cond + txnSync bool // registered protectors protectors []func(func(cid.Cid) error) error @@ -196,6 +199,7 @@ func Open(path string, ds dstore.Datastore, hot, cold bstore.Blockstore, cfg *Co } ss.txnViewsCond.L = &ss.txnViewsMx + ss.txnSyncCond.L = &ss.txnSyncMx ss.ctx, ss.cancel = context.WithCancel(context.Background()) if enableDebugLog { diff --git a/blockstore/splitstore/splitstore_compact.go b/blockstore/splitstore/splitstore_compact.go index ca941cf90c8..dc2a1606114 100644 --- a/blockstore/splitstore/splitstore_compact.go +++ b/blockstore/splitstore/splitstore_compact.go @@ -162,8 +162,15 @@ func (s *SplitStore) protectTipSets(apply []*types.TipSet) { // critical section if s.txnMarkSet != nil { go func() { + defer func() { + s.txnSyncMx.Lock() + defer s.txnSyncMx.Unlock() + s.txnSync = true + s.txnSyncCond.Broadcast() + }() defer s.txnLk.RUnlock() s.markLiveRefs(cids) + }() return } @@ -663,9 +670,8 @@ func (s *SplitStore) doCompact(curTs *types.TipSet) error { return err } - // wait for the head to catch up so that all messages in the current head are protected - log.Infof("waiting %s for sync", SyncWaitTime) - time.Sleep(SyncWaitTime) + // wait for the head to catch up so that all messages are protected + s.waitForSync() if err := s.checkClosing(); err != nil { return err @@ -731,6 +737,7 @@ func (s *SplitStore) beginTxnProtect() { defer s.txnLk.Unlock() s.txnActive = true + s.txnSync = false s.txnRefs = make(map[cid.Cid]struct{}) s.txnMissing = make(map[cid.Cid]struct{}) } @@ -762,6 +769,15 @@ func (s *SplitStore) beginCriticalSection(markSet MarkSet) error { return nil } +func (s *SplitStore) waitForSync() { + s.txnSyncMx.Lock() + defer s.txnSyncMx.Unlock() + + for !s.txnSync { + s.txnSyncCond.Wait() + } +} + func (s *SplitStore) endTxnProtect() { s.txnLk.Lock() defer s.txnLk.Unlock() @@ -771,6 +787,7 @@ func (s *SplitStore) endTxnProtect() { } s.txnActive = false + s.txnSync = false s.txnRefs = nil s.txnMissing = nil s.txnMarkSet = nil From cd95892bf00e50cf60419de501e2523aae296744 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 1 Feb 2022 11:13:01 +0200 Subject: [PATCH 300/393] fix test --- blockstore/splitstore/splitstore_test.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/blockstore/splitstore/splitstore_test.go b/blockstore/splitstore/splitstore_test.go index 0e4c4c951dc..27d58bf1043 100644 --- a/blockstore/splitstore/splitstore_test.go +++ b/blockstore/splitstore/splitstore_test.go @@ -138,6 +138,10 @@ func testSplitStore(t *testing.T, cfg *Config) { } waitForCompaction := func() { + ss.txnSyncMx.Lock() + ss.txnSync = true + ss.txnSyncCond.Broadcast() + ss.txnSyncMx.Unlock() for atomic.LoadInt32(&ss.compacting) == 1 { time.Sleep(100 * time.Millisecond) } @@ -327,6 +331,10 @@ func TestSplitStoreSuppressCompactionNearUpgrade(t *testing.T) { } waitForCompaction := func() { + ss.txnSyncMx.Lock() + ss.txnSync = true + ss.txnSyncCond.Broadcast() + ss.txnSyncMx.Unlock() for atomic.LoadInt32(&ss.compacting) == 1 { time.Sleep(100 * time.Millisecond) } From 9c92d77b64968048332ba4825ee224a8148e4242 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 1 Feb 2022 11:25:07 +0200 Subject: [PATCH 301/393] improve robustness of waitForSync --- blockstore/splitstore/splitstore_compact.go | 28 +++++++++++++++------ 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/blockstore/splitstore/splitstore_compact.go b/blockstore/splitstore/splitstore_compact.go index dc2a1606114..bd281d05584 100644 --- a/blockstore/splitstore/splitstore_compact.go +++ b/blockstore/splitstore/splitstore_compact.go @@ -50,8 +50,9 @@ var ( // there is a sync gap SyncGapTime = time.Minute - // SyncWaitTime is the time delay before compaction starts purging - SyncWaitTime = SyncGapTime + // SyncWaitTime is the time delay from a tipset's min timestamp before we decide + // we have synced. + SyncWaitTime = 30 * time.Second ) var ( @@ -161,13 +162,18 @@ func (s *SplitStore) protectTipSets(apply []*types.TipSet) { // critical section if s.txnMarkSet != nil { + curTs := apply[len(apply)-1] + timestamp := time.Unix(int64(curTs.MinTimestamp()), 0) + doSync := time.Since(timestamp) < SyncWaitTime go func() { - defer func() { - s.txnSyncMx.Lock() - defer s.txnSyncMx.Unlock() - s.txnSync = true - s.txnSyncCond.Broadcast() - }() + if doSync { + defer func() { + s.txnSyncMx.Lock() + defer s.txnSyncMx.Unlock() + s.txnSync = true + s.txnSyncCond.Broadcast() + }() + } defer s.txnLk.RUnlock() s.markLiveRefs(cids) @@ -770,6 +776,12 @@ func (s *SplitStore) beginCriticalSection(markSet MarkSet) error { } func (s *SplitStore) waitForSync() { + log.Info("waiting for sync") + startWait := time.Now() + defer func() { + log.Infow("waiting for sync done", "took", time.Since(startWait)) + }() + s.txnSyncMx.Lock() defer s.txnSyncMx.Unlock() From b13aa8f172343ae1db14df16df8b8fa5ba8ff18f Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 1 Feb 2022 11:30:21 +0200 Subject: [PATCH 302/393] unblock waitForSync on close --- blockstore/splitstore/splitstore.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/blockstore/splitstore/splitstore.go b/blockstore/splitstore/splitstore.go index 75d54533eec..6a65e01df36 100644 --- a/blockstore/splitstore/splitstore.go +++ b/blockstore/splitstore/splitstore.go @@ -665,6 +665,11 @@ func (s *SplitStore) Close() error { } if atomic.LoadInt32(&s.compacting) == 1 { + s.txnSyncMx.Lock() + s.txnSync = true + s.txnSyncCond.Broadcast() + s.txnSyncMx.Unlock() + log.Warn("close with ongoing compaction in progress; waiting for it to finish...") for atomic.LoadInt32(&s.compacting) == 1 { time.Sleep(time.Second) From 4b4104e4002b2cfc14dcf867655262d1cc521731 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 1 Feb 2022 12:10:30 +0200 Subject: [PATCH 303/393] fix comment --- blockstore/splitstore/splitstore_compact.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockstore/splitstore/splitstore_compact.go b/blockstore/splitstore/splitstore_compact.go index bd281d05584..109d8a24641 100644 --- a/blockstore/splitstore/splitstore_compact.go +++ b/blockstore/splitstore/splitstore_compact.go @@ -676,7 +676,7 @@ func (s *SplitStore) doCompact(curTs *types.TipSet) error { return err } - // wait for the head to catch up so that all messages are protected + // wait for the head to catch up so that the current tipset is marked s.waitForSync() if err := s.checkClosing(); err != nil { From c1d8368fdcf2fb87ece72cd3e60d2981ad60f600 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 1 Feb 2022 21:40:09 +0200 Subject: [PATCH 304/393] share a concurrent visitor between workers in markLiveRefs --- blockstore/splitstore/splitstore_compact.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/blockstore/splitstore/splitstore_compact.go b/blockstore/splitstore/splitstore_compact.go index 109d8a24641..ae123abc9c3 100644 --- a/blockstore/splitstore/splitstore_compact.go +++ b/blockstore/splitstore/splitstore_compact.go @@ -190,8 +190,9 @@ func (s *SplitStore) markLiveRefs(cids []cid.Cid) { startMark := time.Now() count := new(int32) + visitor := newConcurrentVisitor() walkObject := func(c cid.Cid) error { - return s.walkObjectIncomplete(c, newTmpVisitor(), + return s.walkObjectIncomplete(c, visitor, func(c cid.Cid) error { if isUnitaryObject(c) { return errStopWalk From 75ad0c3c2d9d6f358c64676be26977b718af29f3 Mon Sep 17 00:00:00 2001 From: vyzo Date: Wed, 2 Feb 2022 14:29:26 +0200 Subject: [PATCH 305/393] badger markset option tweaks --- blockstore/splitstore/markset_badger.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/blockstore/splitstore/markset_badger.go b/blockstore/splitstore/markset_badger.go index 5b7eb471a2c..b2a689261b3 100644 --- a/blockstore/splitstore/markset_badger.go +++ b/blockstore/splitstore/markset_badger.go @@ -3,6 +3,7 @@ package splitstore import ( "os" "path/filepath" + "runtime" "sync" "golang.org/x/xerrors" @@ -394,8 +395,11 @@ func openBadgerDB(path string, recover bool) (*badger.DB, error) { } opts := badger.DefaultOptions(path) + // we manually sync when we are in critical section opts.SyncWrites = false + // no need to do that opts.CompactL0OnClose = false + // we store hashes, not much to gain by compression opts.Compression = options.None // Note: We use FileIO for loading modes to avoid memory thrashing and interference // between the system blockstore and the markset. @@ -404,6 +408,15 @@ func openBadgerDB(path string, recover bool) (*badger.DB, error) { // exceeded 1GB in size. opts.TableLoadingMode = options.FileIO opts.ValueLogLoadingMode = options.FileIO + // We increase the number of L0 tables before compaction to make it unlikely to + // be necessary. + opts.NumLevelZeroTables = 20 // default is 5 + opts.NumLevelZeroTablesStall = 30 // default is 10 + // increase the number of compactors from default 2 so that if we ever have to + // compact, it is fast + if runtime.NumCPU()/2 > opts.NumCompactors { + opts.NumCompactors = runtime.NumCPU() / 2 + } opts.Logger = &badgerLogger{ SugaredLogger: log.Desugar().WithOptions(zap.AddCallerSkip(1)).Sugar(), skip2: log.Desugar().WithOptions(zap.AddCallerSkip(2)).Sugar(), From 049b48928f7bc6d16881105faa201cfede9291a9 Mon Sep 17 00:00:00 2001 From: vyzo Date: Wed, 2 Feb 2022 14:39:21 +0200 Subject: [PATCH 306/393] add note about compaction algorithm changes in README --- blockstore/splitstore/README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/blockstore/splitstore/README.md b/blockstore/splitstore/README.md index f69a056ca43..bf28faac1bd 100644 --- a/blockstore/splitstore/README.md +++ b/blockstore/splitstore/README.md @@ -105,6 +105,12 @@ Compaction works transactionally with the following algorithm: - 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. +As of [#8008](https://github.com/filecoin-project/lotus/pull/8008) the compaction algorithm has been +modified to eliminate sorting and maintain the cold object set on disk. This drastically reduces +memory usage; in fact, when using badger as the markset compaction uses very little memory, and +it should be now possible to run splitstore with 32GB of RAM or less without danger of running out of +memory during compaction. + ## Garbage Collection TBD -- see [#6577](https://github.com/filecoin-project/lotus/issues/6577) From e78c4ab9b302a9fd4c00449d3143145b7ff3f234 Mon Sep 17 00:00:00 2001 From: vyzo Date: Thu, 3 Feb 2022 19:32:30 +0200 Subject: [PATCH 307/393] update go-libp2p to v0.18.0-rc3 --- go.mod | 4 ++-- go.sum | 11 ++++++----- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/go.mod b/go.mod index 18623c7714c..16602b398ec 100644 --- a/go.mod +++ b/go.mod @@ -108,7 +108,7 @@ require ( github.com/kelseyhightower/envconfig v1.4.0 github.com/libp2p/go-buffer-pool v0.0.2 github.com/libp2p/go-eventbus v0.2.1 - github.com/libp2p/go-libp2p v0.18.0-rc2 + github.com/libp2p/go-libp2p v0.18.0-rc3 github.com/libp2p/go-libp2p-connmgr v0.3.1 // indirect github.com/libp2p/go-libp2p-core v0.14.0 github.com/libp2p/go-libp2p-discovery v0.6.0 @@ -118,7 +118,7 @@ require ( github.com/libp2p/go-libp2p-pubsub v0.6.1 github.com/libp2p/go-libp2p-quic-transport v0.16.0 github.com/libp2p/go-libp2p-record v0.1.3 - github.com/libp2p/go-libp2p-resource-manager v0.1.2 + github.com/libp2p/go-libp2p-resource-manager v0.1.3 github.com/libp2p/go-libp2p-routing-helpers v0.2.3 github.com/libp2p/go-libp2p-swarm v0.10.1 github.com/libp2p/go-libp2p-tls v0.3.1 diff --git a/go.sum b/go.sum index 8f6d19cbb0f..817c9e1ba35 100644 --- a/go.sum +++ b/go.sum @@ -995,8 +995,8 @@ github.com/libp2p/go-libp2p v0.14.4/go.mod h1:EIRU0Of4J5S8rkockZM7eJp2S0UrCyi55m 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-rc1/go.mod h1:RgYlH7IIWHXREimC92bw5Lg1V2R5XmSzuLHb5fTnr+8= -github.com/libp2p/go-libp2p v0.18.0-rc2 h1:ZLzGMdp1cVwxmA0vFpPVUDPQYUdHHGX7I58nXwpNr7Y= -github.com/libp2p/go-libp2p v0.18.0-rc2/go.mod h1:gGNCvn0T19AzyNPDWej2vsAlZFZVnS+IxqckjnsOyM0= +github.com/libp2p/go-libp2p v0.18.0-rc3 h1:tI+dAFDgOCeHRF6FgvXpqbrVz+ZFabX/pXO2BUdHu4o= +github.com/libp2p/go-libp2p v0.18.0-rc3/go.mod h1:WYL+Xw1iuwi6rdfzw5VIEpD+HqzYucHZ6fcUuumbI3M= 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 h1:rABPCO77SjdbJ/eJ/ynIo8vWICy1VEnL5JAxJbQLo1E= github.com/libp2p/go-libp2p-asn-util v0.1.0/go.mod h1:wu+AnM9Ii2KgO5jMmS1rz9dvzTdj8BXqsPR9HR0XB7I= @@ -1157,8 +1157,8 @@ github.com/libp2p/go-libp2p-record v0.1.2/go.mod h1:pal0eNcT5nqZaTV7UGhqeGqxFgGd 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.0/go.mod h1:wJPNjeE4XQlxeidwqVY5G6DLOKqFK33u2n8blpl0I6Y= -github.com/libp2p/go-libp2p-resource-manager v0.1.2 h1:t66B/6EF6ivWEUgvO34NKOT3oPtkb+JTBJHdsIMx+mg= -github.com/libp2p/go-libp2p-resource-manager v0.1.2/go.mod h1:wJPNjeE4XQlxeidwqVY5G6DLOKqFK33u2n8blpl0I6Y= +github.com/libp2p/go-libp2p-resource-manager v0.1.3 h1:Umf0tW6WNXSb6Uoma0YT56azB5iikL/aeGAP7s7+f5o= +github.com/libp2p/go-libp2p-resource-manager v0.1.3/go.mod h1:wJPNjeE4XQlxeidwqVY5G6DLOKqFK33u2n8blpl0I6Y= 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= @@ -1211,8 +1211,9 @@ github.com/libp2p/go-libp2p-transport-upgrader v0.4.3/go.mod h1:bpkldbOWXMrXhpZb github.com/libp2p/go-libp2p-transport-upgrader v0.4.6/go.mod h1:JE0WQuQdy+uLZ5zOaI3Nw9dWGYJIA7mywEtP2lMvnyk= 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 h1:ADnLrL7fC4Vy7HPjk9oGof7nDeTqGXuof85Ar6kin9Q= 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 h1:MSMe+tUfxpC9GArTz7a4G5zQKQgGh00Vio87d3j3xIg= +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-yamux v0.1.2/go.mod h1:xUoV/RmYkg6BW/qGxA9XJyg+HzXFYkeXbnhjmnYzKp8= github.com/libp2p/go-libp2p-yamux v0.1.3/go.mod h1:VGSQVrqkh6y4nm0189qqxMtvyBft44MOYYPpYKXiVt4= From 03352ea8631db2e6f6a0926c8dfeda0ad04bf029 Mon Sep 17 00:00:00 2001 From: vyzo Date: Sun, 6 Feb 2022 11:21:16 +0200 Subject: [PATCH 308/393] make badger the default splitstore markset type --- node/config/def.go | 2 +- node/config/types.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/node/config/def.go b/node/config/def.go index 644c28bea69..a1f4f61fa72 100644 --- a/node/config/def.go +++ b/node/config/def.go @@ -85,7 +85,7 @@ func DefaultFullNode() *FullNode { Splitstore: Splitstore{ ColdStoreType: "universal", HotStoreType: "badger", - MarkSetType: "map", + MarkSetType: "badger", HotStoreFullGCFrequency: 20, }, diff --git a/node/config/types.go b/node/config/types.go index 715f4824861..124e58f959b 100644 --- a/node/config/types.go +++ b/node/config/types.go @@ -359,7 +359,7 @@ type Splitstore struct { // Only currently supported value is "badger". HotStoreType string // MarkSetType specifies the type of the markset. - // It can be "map" (default) for in memory marking or "badger" for on-disk marking. + // It can be "map" for in memory marking or "badger" (default) for on-disk marking. MarkSetType string // HotStoreMessageRetention specifies the retention policy for messages, in finalities beyond From d45e2074a6c3075c579f1274b6e769caaa228e36 Mon Sep 17 00:00:00 2001 From: vyzo Date: Sun, 6 Feb 2022 11:25:27 +0200 Subject: [PATCH 309/393] update README for map as the default --- blockstore/splitstore/README.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/blockstore/splitstore/README.md b/blockstore/splitstore/README.md index bf28faac1bd..117b6dde124 100644 --- a/blockstore/splitstore/README.md +++ b/blockstore/splitstore/README.md @@ -49,10 +49,9 @@ These are options in the `[Chainstore.Splitstore]` section of the configuration: blockstore and discards writes; this is necessary to support syncing from a snapshot. - `MarkSetType` -- specifies the type of markset to use during compaction. The markset is the data structure used by compaction/gc to track live objects. - The default value is `"map"`, which will use an in-memory map; if you are limited - in memory (or indeed see compaction run out of memory), you can also specify - `"badger"` which will use an disk backed markset, using badger. This will use - much less memory, but will also make compaction slower. + The default value is "badger", which will use a disk backed markset using badger. + If you have a lot of memory (40G or more) you can also use "map", which will use + an in memory markset, speeding up compaction at the cost of higher memory usage. - `HotStoreMessageRetention` -- specifies how many finalities, beyond the 4 finalities maintained by default, to maintain messages and message receipts in the hotstore. This is useful for assistive nodes that want to support syncing for other From 1221c0ba3f759a6bf301b76f893fc8a94cfa7c75 Mon Sep 17 00:00:00 2001 From: vyzo Date: Sun, 6 Feb 2022 12:28:21 +0200 Subject: [PATCH 310/393] make gen --- node/config/doc_gen.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/node/config/doc_gen.go b/node/config/doc_gen.go index c3730cbace6..449fac9efa6 100644 --- a/node/config/doc_gen.go +++ b/node/config/doc_gen.go @@ -802,7 +802,7 @@ Only currently supported value is "badger".`, Type: "string", Comment: `MarkSetType specifies the type of the markset. -It can be "map" (default) for in memory marking or "badger" for on-disk marking.`, +It can be "map" for in memory marking or "badger" (default) for on-disk marking.`, }, { Name: "HotStoreMessageRetention", From 0ad1f0e233c68ebb1cba8c35f3d8774121fd8a9b Mon Sep 17 00:00:00 2001 From: vyzo Date: Sun, 6 Feb 2022 12:48:49 +0200 Subject: [PATCH 311/393] moar make gen --- documentation/en/default-lotus-config.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/documentation/en/default-lotus-config.toml b/documentation/en/default-lotus-config.toml index 3cb8977b290..0bc22c9d772 100644 --- a/documentation/en/default-lotus-config.toml +++ b/documentation/en/default-lotus-config.toml @@ -163,11 +163,11 @@ #HotStoreType = "badger" # MarkSetType specifies the type of the markset. - # It can be "map" (default) for in memory marking or "badger" for on-disk marking. + # It can be "map" for in memory marking or "badger" (default) for on-disk marking. # # type: string # env var: LOTUS_CHAINSTORE_SPLITSTORE_MARKSETTYPE - #MarkSetType = "map" + #MarkSetType = "badger" # HotStoreMessageRetention specifies the retention policy for messages, in finalities beyond # the compaction boundary; default is 0. From 47ffceef0dd908ab8e39a0bc6faa747b548a3647 Mon Sep 17 00:00:00 2001 From: zenground0 Date: Mon, 7 Feb 2022 07:41:48 -0500 Subject: [PATCH 312/393] Check sector is active before PRU --- extern/storage-sealing/states_replica_update.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/extern/storage-sealing/states_replica_update.go b/extern/storage-sealing/states_replica_update.go index 43d5467ed55..341c553e1ad 100644 --- a/extern/storage-sealing/states_replica_update.go +++ b/extern/storage-sealing/states_replica_update.go @@ -31,6 +31,21 @@ func (m *Sealing) handleProveReplicaUpdate(ctx statemachine.Context, sector Sect if sector.CommR == nil { return xerrors.Errorf("invalid sector %d with nil CommR", sector.SectorNumber) } + // Abort upgrade for sectors that went faulty since being marked for upgrade + tok, _, err := m.Api.ChainHead(ctx.Context()) + if err != nil { + log.Errorf("handleProveReplicaUpdate: api error, not proceeding: %+v", err) + return nil + } + active, err := sectorActive(ctx.Context(), m.Api, m.maddr, tok, sector.SectorNumber) + if err != nil { + log.Errorf("sector active check: api error, not proceeding: %+v", err) + return nil + } + if !active { + log.Errorf("sector marked for upgrade %d no longer active, aborting upgrade", sector.SectorNumber) + return ctx.Send(SectorAbortUpgrade{}) + } vanillaProofs, err := m.sealer.ProveReplicaUpdate1(sector.sealingCtx(ctx.Context()), m.minerSector(sector.SectorType, sector.SectorNumber), *sector.CommR, *sector.UpdateSealed, *sector.UpdateUnsealed) if err != nil { From 1ab2744c84792f47b9cd1c94966662484d7056d2 Mon Sep 17 00:00:00 2001 From: zenground0 Date: Mon, 7 Feb 2022 09:15:23 -0500 Subject: [PATCH 313/393] Fix log --- extern/storage-sealing/states_failed.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extern/storage-sealing/states_failed.go b/extern/storage-sealing/states_failed.go index 03d87a3b491..55bda80368d 100644 --- a/extern/storage-sealing/states_failed.go +++ b/extern/storage-sealing/states_failed.go @@ -211,7 +211,7 @@ func (m *Sealing) handleSubmitReplicaUpdateFailed(ctx statemachine.Context, sect tok, _, err := m.Api.ChainHead(ctx.Context()) if err != nil { - log.Errorf("handleCommitting: api error, not proceeding: %+v", err) + log.Errorf("handleSubmitReplicaUpdateFailed: api error, not proceeding: %+v", err) return nil } From 8ddf4766eae9bad740a9a84ef638b7116c67dc1c Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 8 Feb 2022 10:10:51 +0200 Subject: [PATCH 314/393] update README Adds note about 3k IOPs requirement with badger markset, updates the memory requirement for map to 48G based on observed behaviour of test nodes. --- blockstore/splitstore/README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/blockstore/splitstore/README.md b/blockstore/splitstore/README.md index 117b6dde124..1490004cf03 100644 --- a/blockstore/splitstore/README.md +++ b/blockstore/splitstore/README.md @@ -50,8 +50,10 @@ These are options in the `[Chainstore.Splitstore]` section of the configuration: - `MarkSetType` -- specifies the type of markset to use during compaction. The markset is the data structure used by compaction/gc to track live objects. The default value is "badger", which will use a disk backed markset using badger. - If you have a lot of memory (40G or more) you can also use "map", which will use + If you have a lot of memory (48G or more) you can also use "map", which will use an in memory markset, speeding up compaction at the cost of higher memory usage. + Note: If you are using a VPS with a network volume, you need to provision at least + 3000 IOPs with the badger markset. - `HotStoreMessageRetention` -- specifies how many finalities, beyond the 4 finalities maintained by default, to maintain messages and message receipts in the hotstore. This is useful for assistive nodes that want to support syncing for other From 80e9f762610cc70807b33bf77b99dbb4f58b173b Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 8 Feb 2022 11:51:14 +0200 Subject: [PATCH 315/393] update libp2p to v0.18.0-rc4 --- go.mod | 6 +++--- go.sum | 10 ++++++---- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/go.mod b/go.mod index 16602b398ec..2ad4bfdce1a 100644 --- a/go.mod +++ b/go.mod @@ -108,7 +108,7 @@ require ( github.com/kelseyhightower/envconfig v1.4.0 github.com/libp2p/go-buffer-pool v0.0.2 github.com/libp2p/go-eventbus v0.2.1 - github.com/libp2p/go-libp2p v0.18.0-rc3 + github.com/libp2p/go-libp2p v0.18.0-rc4 github.com/libp2p/go-libp2p-connmgr v0.3.1 // indirect github.com/libp2p/go-libp2p-core v0.14.0 github.com/libp2p/go-libp2p-discovery v0.6.0 @@ -116,13 +116,13 @@ require ( github.com/libp2p/go-libp2p-noise v0.3.0 github.com/libp2p/go-libp2p-peerstore v0.6.0 github.com/libp2p/go-libp2p-pubsub v0.6.1 - github.com/libp2p/go-libp2p-quic-transport v0.16.0 + github.com/libp2p/go-libp2p-quic-transport v0.16.1 github.com/libp2p/go-libp2p-record v0.1.3 github.com/libp2p/go-libp2p-resource-manager v0.1.3 github.com/libp2p/go-libp2p-routing-helpers v0.2.3 github.com/libp2p/go-libp2p-swarm v0.10.1 github.com/libp2p/go-libp2p-tls v0.3.1 - github.com/libp2p/go-libp2p-yamux v0.8.1 + github.com/libp2p/go-libp2p-yamux v0.8.2 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 diff --git a/go.sum b/go.sum index 817c9e1ba35..bb6a3f92d8d 100644 --- a/go.sum +++ b/go.sum @@ -995,8 +995,8 @@ github.com/libp2p/go-libp2p v0.14.4/go.mod h1:EIRU0Of4J5S8rkockZM7eJp2S0UrCyi55m 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-rc1/go.mod h1:RgYlH7IIWHXREimC92bw5Lg1V2R5XmSzuLHb5fTnr+8= -github.com/libp2p/go-libp2p v0.18.0-rc3 h1:tI+dAFDgOCeHRF6FgvXpqbrVz+ZFabX/pXO2BUdHu4o= -github.com/libp2p/go-libp2p v0.18.0-rc3/go.mod h1:WYL+Xw1iuwi6rdfzw5VIEpD+HqzYucHZ6fcUuumbI3M= +github.com/libp2p/go-libp2p v0.18.0-rc4 h1:OUsSbeu7q+Ck/bV9wHDxFzb08ORqBupHhpCmRBhWrJ8= +github.com/libp2p/go-libp2p v0.18.0-rc4/go.mod h1:wzmsk1ioOq9FGQys2BN5BIw4nugP6+R+CyW3JbPEbbs= 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 h1:rABPCO77SjdbJ/eJ/ynIo8vWICy1VEnL5JAxJbQLo1E= github.com/libp2p/go-libp2p-asn-util v0.1.0/go.mod h1:wu+AnM9Ii2KgO5jMmS1rz9dvzTdj8BXqsPR9HR0XB7I= @@ -1148,8 +1148,9 @@ github.com/libp2p/go-libp2p-quic-transport v0.11.2/go.mod h1:wlanzKtIh6pHrq+0U3p 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 h1:aVg9/jr+R2esov5sH7wkXrmYmqJiUjtLMLYX3L9KYdY= 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 h1:N/XqYXHurphPLDfXYhll8NyqzdZYQqAF4GIr7+SmLV8= +github.com/libp2p/go-libp2p-quic-transport v0.16.1/go.mod h1:1BXjVMzr+w7EkPfiHkKnwsWjPjtfaNT0q8RS3tGDvEQ= 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= @@ -1229,8 +1230,9 @@ github.com/libp2p/go-libp2p-yamux v0.5.4/go.mod h1:tfrXbyaTqqSU654GTvK3ocnSZL3Bu 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 h1:pi7zUeZ4Z9TpbUMntvSvoP3dFD4SEw/VPybxBcOZGzg= github.com/libp2p/go-libp2p-yamux v0.8.1/go.mod h1:rUozF8Jah2dL9LLGyBaBeTQeARdwhefMCTQVQt6QobE= +github.com/libp2p/go-libp2p-yamux v0.8.2 h1:6GKWntresp0TFxMP/oSoH96nV8XKJRdynXsdp43dn0Y= +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= From ad39d8707d9c8efa567cd4306140988930f1ef57 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 8 Feb 2022 10:38:39 -0500 Subject: [PATCH 316/393] build: add empty sector update params --- build/proof-params/parameters.json | 50 +++++++++++++ testplans/lotus-soup/go.mod | 14 ++-- testplans/lotus-soup/go.sum | 115 +++++++++++++++++++---------- 3 files changed, 131 insertions(+), 48 deletions(-) diff --git a/build/proof-params/parameters.json b/build/proof-params/parameters.json index 1d458445458..88bb0bfa34b 100644 --- a/build/proof-params/parameters.json +++ b/build/proof-params/parameters.json @@ -1,4 +1,54 @@ { + "v28-empty-sector-update-merkletree-poseidon_hasher-8-0-0-61fa69f38b9cc771ba27b670124714b4ea77fbeae05e377fb859c4a43b73a30c.params": { + "cid": "Qma5WL6abSqYg9uUQAZ3EHS286bsNsha7oAGsJBD48Bq2q", + "digest": "c3ad7bb549470b82ad52ed070aebb4f4", + "sector_size": 536870912 + }, + "v28-empty-sector-update-merkletree-poseidon_hasher-8-0-0-61fa69f38b9cc771ba27b670124714b4ea77fbeae05e377fb859c4a43b73a30c.vk": { + "cid": "QmUa7f9JtJMsqJJ3s3ZXk6WyF4xJLE8FiqYskZGgk8GCDv", + "digest": "994c5b7d450ca9da348c910689f2dc7f", + "sector_size": 536870912 + }, + "v28-empty-sector-update-merkletree-poseidon_hasher-8-0-0-92180959e1918d26350b8e6cfe217bbdd0a2d8de51ebec269078b364b715ad63.params": { + "cid": "QmQiT4qBGodrVNEgVTDXxBNDdPbaD8Ag7Sx3ZTq1zHX79S", + "digest": "5aedd2cf3e5c0a15623d56a1b43110ad", + "sector_size": 8388608 + }, + "v28-empty-sector-update-merkletree-poseidon_hasher-8-0-0-92180959e1918d26350b8e6cfe217bbdd0a2d8de51ebec269078b364b715ad63.vk": { + "cid": "QmdcpKUQvHM8RFRVKbk1yHfEqMcBzhtFWKRp9SNEmWq37i", + "digest": "abd80269054d391a734febdac0d2e687", + "sector_size": 8388608 + }, + "v28-empty-sector-update-merkletree-poseidon_hasher-8-0-0-fb9e095bebdd77511c0269b967b4d87ba8b8a525edaa0e165de23ba454510194.params": { + "cid": "QmYM6Hg7mjmvA3ZHTsqkss1fkdyDju5dDmLiBZGJ5pz9y9", + "digest": "311f92a3e75036ced01b1c0025f1fa0c", + "sector_size": 2048 + }, + "v28-empty-sector-update-merkletree-poseidon_hasher-8-0-0-fb9e095bebdd77511c0269b967b4d87ba8b8a525edaa0e165de23ba454510194.vk": { + "cid": "QmaQsTLL3nc5dw6wAvaioJSBfd1jhQrA2o6ucFf7XeV74P", + "digest": "eadad9784969890d30f2749708c79771", + "sector_size": 2048 + }, + "v28-empty-sector-update-merkletree-poseidon_hasher-8-8-0-3b7f44a9362e3985369454947bc94022e118211e49fd672d52bec1cbfd599d18.params": { + "cid": "QmNPc75iEfcahCwNKdqnWLtxnjspUGGR4iscjiz3wP3RtS", + "digest": "1b3cfd761a961543f9eb273e435a06a2", + "sector_size": 34359738368 + }, + "v28-empty-sector-update-merkletree-poseidon_hasher-8-8-0-3b7f44a9362e3985369454947bc94022e118211e49fd672d52bec1cbfd599d18.vk": { + "cid": "QmdFFUe1gcz9MMHc6YW8aoV48w4ckvcERjt7PkydQAMfCN", + "digest": "3a6941983754737fde880d29c7094905", + "sector_size": 34359738368 + }, + "v28-empty-sector-update-merkletree-poseidon_hasher-8-8-2-102e1444a7e9a97ebf1e3d6855dcc77e66c011ea66f936d9b2c508f87f2f83a7.params": { + "cid": "QmUB6xTVjzBQGuDNeyJMrrJ1byk58vhPm8eY2Lv9pgwanp", + "digest": "1a392e7b759fb18e036c7559b5ece816", + "sector_size": 68719476736 + }, + "v28-empty-sector-update-merkletree-poseidon_hasher-8-8-2-102e1444a7e9a97ebf1e3d6855dcc77e66c011ea66f936d9b2c508f87f2f83a7.vk": { + "cid": "Qmd794Jty7k26XJ8Eg4NDEks65Qk8G4GVfGkwqvymv8HAg", + "digest": "80e366df2f1011953c2d01c7b7c9ee8e", + "sector_size": 68719476736 + }, "v28-proof-of-spacetime-fallback-merkletree-poseidon_hasher-8-0-0-0170db1f394b35d995252228ee359194b13199d259380541dc529fb0099096b0.params": { "cid": "QmVxjFRyhmyQaZEtCh7nk2abc7LhFkzhnRX4rcHqCCpikR", "digest": "7610b9f82bfc88405b7a832b651ce2f6", diff --git a/testplans/lotus-soup/go.mod b/testplans/lotus-soup/go.mod index 6b4be1d9716..f227452e7ae 100644 --- a/testplans/lotus-soup/go.mod +++ b/testplans/lotus-soup/go.mod @@ -8,8 +8,8 @@ require ( github.com/davecgh/go-spew v1.1.1 github.com/drand/drand v1.3.0 github.com/filecoin-project/go-address v0.0.6 - github.com/filecoin-project/go-data-transfer v1.12.1 - github.com/filecoin-project/go-fil-markets v1.14.1 + github.com/filecoin-project/go-data-transfer v1.14.0 + github.com/filecoin-project/go-fil-markets v1.19.0 github.com/filecoin-project/go-jsonrpc v0.1.5 github.com/filecoin-project/go-state-types v0.1.3 github.com/filecoin-project/go-storedcounter v0.1.0 @@ -23,15 +23,15 @@ require ( github.com/ipfs/go-datastore v0.5.1 github.com/ipfs/go-ipfs-files v0.0.9 github.com/ipfs/go-ipld-format v0.2.0 - github.com/ipfs/go-log/v2 v2.4.0 + github.com/ipfs/go-log/v2 v2.5.0 github.com/ipfs/go-merkledag v0.5.1 - github.com/ipfs/go-unixfs v0.2.6 + github.com/ipfs/go-unixfs v0.3.1 github.com/ipld/go-car v0.3.3 github.com/kpacha/opencensus-influxdb v0.0.0-20181102202715-663e2683a27c - github.com/libp2p/go-libp2p v0.17.0 - github.com/libp2p/go-libp2p-core v0.13.0 + github.com/libp2p/go-libp2p v0.18.0-rc4 + github.com/libp2p/go-libp2p-core v0.14.0 github.com/libp2p/go-libp2p-pubsub-tracer v0.0.0-20200626141350-e730b32bf1e6 - github.com/multiformats/go-multiaddr v0.4.1 + github.com/multiformats/go-multiaddr v0.5.0 github.com/testground/sdk-go v0.2.6 go.opencensus.io v0.23.0 golang.org/x/sync v0.0.0-20210220032951-036812b2e83c diff --git a/testplans/lotus-soup/go.sum b/testplans/lotus-soup/go.sum index e6e4149c8d2..4ec1a8316f7 100644 --- a/testplans/lotus-soup/go.sum +++ b/testplans/lotus-soup/go.sum @@ -133,6 +133,8 @@ github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuy github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= 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/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= @@ -405,19 +407,19 @@ 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-data-transfer v1.12.0/go.mod h1:tDrD2jLU2TpVhd+5B8iqBp0fQRV4lP80WZccKXugjYc= -github.com/filecoin-project/go-data-transfer v1.12.1 h1:gAznAZKySVs2FS6T/vDq7R3f0DewLnxeROe0oOE6bZU= -github.com/filecoin-project/go-data-transfer v1.12.1/go.mod h1:j3HL645YiQFxcM+q7uPlGApILSqeweDABNgZQP7pDYU= -github.com/filecoin-project/go-ds-versioning v0.0.0-20211206185234-508abd7c2aff h1:2bG2ggVZ/rInd/YqUfRj4A5siGuYOPxxuD4I8nYLJF0= +github.com/filecoin-project/go-data-transfer v1.14.0 h1:4pnfJk8FYtqcdAg+QRGzaz57seUC/Tz+HJgPuGB7zdg= +github.com/filecoin-project/go-data-transfer v1.14.0/go.mod h1:wNJKhaLLYBJDM3VFvgvYi4iUjPa69pz/1Q5Q4HzX2wE= 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-20200716160307-8f644712406f/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commcid v0.1.0 h1:3R4ds1A9r6cr8mvZBfMYxTS88OqLYEo6roi+GiIeOh8= 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.14.1 h1:Bx+TSbkAN8K97Hpjgu+MpeRFbXIKH/fNpNp1ZGAEH3I= -github.com/filecoin-project/go-fil-markets v1.14.1/go.mod h1:vXOHH3q2+zLk929W+lIq3etuDFTyJJ8nG2DwGHG2R1E= +github.com/filecoin-project/go-fil-markets v1.19.0 h1:kap2q2wTM6tfkVO5gMA5DD9GUeTvkDhMfhjCtEwMDM8= +github.com/filecoin-project/go-fil-markets v1.19.0/go.mod h1:qsb3apmo4RSJYCEq40QxVdU7UZospN6nFJLOBHuaIbc= 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= @@ -879,6 +881,8 @@ github.com/influxdata/usage-client v0.0.0-20160829180054-6d3895376368/go.mod h1: github.com/ipfs/bbloom v0.0.1/go.mod h1:oqo8CVWsJFMOZqTglBG4wydCE4IQA/G2/SEofB0rjUI= github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs= github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0= +github.com/ipfs/go-bitfield v1.0.0 h1:y/XHm2GEmD9wKngheWNNCNL0pzrWXZwCdQGv1ikXknQ= +github.com/ipfs/go-bitfield v1.0.0/go.mod h1:N/UiujQy+K+ceU1EF5EkVd1TNqevLrCQMIcAEPrdtus= 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= @@ -914,7 +918,6 @@ github.com/ipfs/go-datastore v0.4.0/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13X github.com/ipfs/go-datastore v0.4.1/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.4.7-0.20211013204805-28a3721c2e66/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= 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= @@ -942,13 +945,11 @@ github.com/ipfs/go-filestore v1.1.0 h1:Pu4tLBi1bucu6/HU9llaOmb9yLFk/sgP+pW764zND github.com/ipfs/go-filestore v1.1.0/go.mod h1:6e1/5Y6NvLuCRdmda/KA4GUhXJQ3Uat6vcWm2DJfxc8= github.com/ipfs/go-fs-lock v0.0.6 h1:sn3TWwNVQqSeNjlWy6zQ1uUGAZrV3hPOyEA6y1/N2a0= github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28L7zESmM= -github.com/ipfs/go-graphsync v0.11.0/go.mod h1:wC+c8vGVjAHthsVIl8LKr37cUra2GOaMYcQNNmMxDqE= -github.com/ipfs/go-graphsync v0.11.5 h1:WA5hVxGBtcal6L6nqubKiqRolaZxbexOK3GumGFJRR4= -github.com/ipfs/go-graphsync v0.11.5/go.mod h1:+/sZqRwRCQRrV7NCzgBtufmr5QGpUE98XSa7NlsztmM= +github.com/ipfs/go-graphsync v0.12.0 h1:QCsVHVzb9FTkcm3NEa8GjXnUeGit1L9s08HcSVQ4m/g= +github.com/ipfs/go-graphsync v0.12.0/go.mod h1:nASYWYETgsnMbQ3+DirNImOHQ8TY0a5AhAqyOY55tUg= 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.2.1/go.mod h1:jGesd8EtCM3/zPgx+qr0/feTXGUeRai6adgwC+Q+JvE= -github.com/ipfs/go-ipfs-blockstore v1.1.0/go.mod h1:5QDUApRqpgPcfGstCxYeMnjt/DYQtXXdJVCvxHHuWVk= github.com/ipfs/go-ipfs-blockstore v1.1.1/go.mod h1:w51tNR9y5+QXB0wkNcHt4O2aSZjTdqaEWaQdSxEyUOY= github.com/ipfs/go-ipfs-blockstore v1.1.2 h1:WCXoZcMYnvOTmlpX+RSSnhVN0uCmbWTeepTGX5lgiXw= github.com/ipfs/go-ipfs-blockstore v1.1.2/go.mod h1:w51tNR9y5+QXB0wkNcHt4O2aSZjTdqaEWaQdSxEyUOY= @@ -966,7 +967,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= @@ -1028,8 +1028,9 @@ github.com/ipfs/go-log/v2 v2.1.2-0.20200626104915-0016c0b4b3e4/go.mod h1:2v2nsGf github.com/ipfs/go-log/v2 v2.1.2/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHntrv9KM= 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 h1:iR/2o9PGWanVJrBgIH5Ff8mPGOwpqLaPIAFqSnsdlzk= github.com/ipfs/go-log/v2 v2.4.0/go.mod h1:nPZnh7Cj7lwS3LpRU5Mwr2ol1c2gXIEXuF6aywqrtmo= +github.com/ipfs/go-log/v2 v2.5.0 h1:+MhAooFd9XZNvR0i9FriKW6HB0ql7HNXUuflWtc0dd4= +github.com/ipfs/go-log/v2 v2.5.0/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI= github.com/ipfs/go-merkledag v0.0.6/go.mod h1:QYPdnlvkOg7GnQRofu9XZimC5ZW5Wi3bKys/4GQQfto= github.com/ipfs/go-merkledag v0.2.3/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= github.com/ipfs/go-merkledag v0.2.4/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= @@ -1049,8 +1050,10 @@ github.com/ipfs/go-peertaskqueue v0.7.1/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68 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 h1:gq3U3T2vh8x6tXhfo3uSO3n+2z4yW0tYtNgVP/3sIyA= -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.2.0 h1:tHHBJftsJyHGa8bS62PpkYNqHy/Sug3c/vxxC8NaGQY= +github.com/ipfs/go-unixfsnode v1.2.0/go.mod h1:mQEgLjxkV/1mohkC4p7taRRBYPBeXu97SA3YaerT2q0= 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 h1:+mUiamyHIwedqP8ZgbCIwpy40oX7QcXUbo4CZOeJVJg= @@ -1074,11 +1077,10 @@ 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.3-0.20211207234443-319145880958/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= -github.com/ipld/go-ipld-prime v0.14.3 h1:cGUmxSws2IHurn00/iLMDapeXsnf9+FyAtYVy8G/JsQ= -github.com/ipld/go-ipld-prime v0.14.3/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= +github.com/ipld/go-ipld-prime v0.14.4 h1:bqhmume8+nbNsX4/+J6eohktfZHAI8GKrF3rQ0xgOyc= +github.com/ipld/go-ipld-prime v0.14.4/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= github.com/ipld/go-ipld-prime-proto v0.0.0-20191113031812-e32bd156a1e5/go.mod h1:gcvzoEDBjwycpXt3LBE061wT9f46szXGHAmj9uoP6fU= github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20211210234204-ce2a1c70cd73 h1:TsyATB2ZRRQGTwafJdgEUQkmjOExRV0DNokcihZxbnQ= github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20211210234204-ce2a1c70cd73/go.mod h1:2PJ0JgxyB08t0b2WKrcuqI3di0V+5n6RS/LTUJhkoxY= @@ -1198,7 +1200,6 @@ github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/libp2p/go-addr-util v0.0.1/go.mod h1:4ac6O7n9rIAKB1dnd+s8IbbMXkt+oBpzX4/+RACcnlQ= github.com/libp2p/go-addr-util v0.0.2/go.mod h1:Ecd6Fb3yIuLzq4bD7VcywcVSBtefcAwnUISBM3WG15E= -github.com/libp2p/go-addr-util v0.1.0 h1:acKsntI33w2bTU7tC9a0SaPimJGfSI0bFKC18ChxeVI= 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= @@ -1234,8 +1235,10 @@ github.com/libp2p/go-libp2p v0.10.0/go.mod h1:yBJNpb+mGJdgrwbKAKrhPU0u3ogyNFTfjJ 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 h1:8l4GV401OSd4dFRyHDtIT/mEzdh/aQGoFC8xshYgm5M= github.com/libp2p/go-libp2p v0.17.0/go.mod h1:Fkin50rsGdv5mm5BshBUtPRZknt9esfmYXBOYcwOTgw= +github.com/libp2p/go-libp2p v0.18.0-rc1/go.mod h1:RgYlH7IIWHXREimC92bw5Lg1V2R5XmSzuLHb5fTnr+8= +github.com/libp2p/go-libp2p v0.18.0-rc4 h1:OUsSbeu7q+Ck/bV9wHDxFzb08ORqBupHhpCmRBhWrJ8= +github.com/libp2p/go-libp2p v0.18.0-rc4/go.mod h1:wzmsk1ioOq9FGQys2BN5BIw4nugP6+R+CyW3JbPEbbs= 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 h1:rABPCO77SjdbJ/eJ/ynIo8vWICy1VEnL5JAxJbQLo1E= github.com/libp2p/go-libp2p-asn-util v0.1.0/go.mod h1:wu+AnM9Ii2KgO5jMmS1rz9dvzTdj8BXqsPR9HR0XB7I= @@ -1248,7 +1251,6 @@ github.com/libp2p/go-libp2p-autonat v0.2.2/go.mod h1:HsM62HkqZmHR2k1xgX34WuWDzk/ github.com/libp2p/go-libp2p-autonat v0.2.3/go.mod h1:2U6bNWCNsAG9LEbwccBDQbjzQ8Krdjge1jLTE9rdoMM= 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 h1:rCP5s+A2dlhM1Xd66wurE0k7S7pPmM0D+FlqqSBXxks= 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= @@ -1267,12 +1269,14 @@ github.com/libp2p/go-libp2p-circuit v0.1.4/go.mod h1:CY67BrEjKNDhdTk8UgBX1Y/H5c3 github.com/libp2p/go-libp2p-circuit v0.2.1/go.mod h1:BXPwYDN5A8z4OEY9sOfr2DUQMLQvKt/6oku45YUmjIo= 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 h1:eqQ3sEYkGTtybWgr6JLqJY6QLtPWRErvFjFDfAOO1wc= 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 h1:yerFXrYa0oxpuVsLlndwm/bLulouHYDcvFrY/4H4fx8= github.com/libp2p/go-libp2p-connmgr v0.3.0/go.mod h1:RVoyPjJm0J9Vd1m6qUN2Tn7kJm4rL1Ml20pFsFgPGik= +github.com/libp2p/go-libp2p-connmgr v0.3.1 h1:alEy2fpGKFu+7ZhQF4GF0dvKLyVHeLtIfS/KziwoiZw= +github.com/libp2p/go-libp2p-connmgr v0.3.1/go.mod h1:RVoyPjJm0J9Vd1m6qUN2Tn7kJm4rL1Ml20pFsFgPGik= github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= 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= @@ -1306,8 +1310,9 @@ github.com/libp2p/go-libp2p-core v0.9.0/go.mod h1:ESsbz31oC3C1AvMJoGx26RTuCkNhmk github.com/libp2p/go-libp2p-core v0.10.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= 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 h1:IFG/s8dN6JN2OTrXX9eq2wNU/Zlz2KLdwZUp5FplgXI= github.com/libp2p/go-libp2p-core v0.13.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= +github.com/libp2p/go-libp2p-core v0.14.0 h1:0kYSgiK/D7Eo28GTuRXo5YHsWwAisVpFCqCVPUd/vJs= +github.com/libp2p/go-libp2p-core v0.14.0/go.mod h1:tLasfcVdTXnixsLB0QYaT1syJOhsbrhG7q6pGrHtBg8= 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= @@ -1343,8 +1348,9 @@ github.com/libp2p/go-libp2p-mplex v0.2.1/go.mod h1:SC99Rxs8Vuzrf/6WhmH41kNn13TiY 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.4.0/go.mod h1:yCyWJE2sc6TBTnFpjvLuEJgTSw/u+MamvzILKdX7asw= -github.com/libp2p/go-libp2p-mplex v0.4.1 h1:/pyhkP1nLwjG3OM+VuaNJkQT/Pqq73WzB3aDN3Fx1sc= github.com/libp2p/go-libp2p-mplex v0.4.1/go.mod h1:cmy+3GfqfM1PceHTLL7zQzAAYaryDu6iPSC+CIb094g= +github.com/libp2p/go-libp2p-mplex v0.5.0 h1:vt3k4E4HSND9XH4Z8rUpacPJFSAgLOv6HDvG8W9Ks9E= +github.com/libp2p/go-libp2p-mplex v0.5.0/go.mod h1:eLImPJLkj3iG5t5lq68w3Vm5NAQ5BcKwrrb2VmOYb3M= 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= @@ -1383,8 +1389,9 @@ github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1 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.3.2/go.mod h1:Uss7/Cfz872KggNb+doCVPHeCDmXB7z500m/R8DaAUk= -github.com/libp2p/go-libp2p-pubsub v0.6.0 h1:98+RXuEWW17U6cAijK1yaTf6mw/B+n5yPA421z+dlo0= github.com/libp2p/go-libp2p-pubsub v0.6.0/go.mod h1:nJv87QM2cU0w45KPR1rZicq+FmFIOD16zmT+ep1nOmg= +github.com/libp2p/go-libp2p-pubsub v0.6.1 h1:wycbV+f4rreCoVY61Do6g/BUk0RIrbNRcYVbn+QkjGk= +github.com/libp2p/go-libp2p-pubsub v0.6.1/go.mod h1:nJv87QM2cU0w45KPR1rZicq+FmFIOD16zmT+ep1nOmg= github.com/libp2p/go-libp2p-pubsub-tracer v0.0.0-20200626141350-e730b32bf1e6 h1:2lH7rMlvDPSvXeOR+g7FE6aqiEwxtpxWKQL8uigk5fQ= github.com/libp2p/go-libp2p-pubsub-tracer v0.0.0-20200626141350-e730b32bf1e6/go.mod h1:8ZodgKS4qRLayfw9FDKDd9DX4C16/GMofDxSldG8QPI= github.com/libp2p/go-libp2p-quic-transport v0.1.1/go.mod h1:wqG/jzhF3Pu2NrhJEvE+IE0NTHNXslOPn9JQzyCAxzU= @@ -1393,14 +1400,19 @@ github.com/libp2p/go-libp2p-quic-transport v0.10.0/go.mod h1:RfJbZ8IqXIhxBRm5hqU 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= 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 h1:wHBEceRy+1/8Ec8dAIyr+/P7L2YefIGprPVy5LrMM+k= 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 h1:N/XqYXHurphPLDfXYhll8NyqzdZYQqAF4GIr7+SmLV8= +github.com/libp2p/go-libp2p-quic-transport v0.16.1/go.mod h1:1BXjVMzr+w7EkPfiHkKnwsWjPjtfaNT0q8RS3tGDvEQ= 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.0/go.mod h1:wJPNjeE4XQlxeidwqVY5G6DLOKqFK33u2n8blpl0I6Y= +github.com/libp2p/go-libp2p-resource-manager v0.1.3 h1:Umf0tW6WNXSb6Uoma0YT56azB5iikL/aeGAP7s7+f5o= +github.com/libp2p/go-libp2p-resource-manager v0.1.3/go.mod h1:wJPNjeE4XQlxeidwqVY5G6DLOKqFK33u2n8blpl0I6Y= 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= @@ -1422,8 +1434,10 @@ 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.5.3/go.mod h1:NBn7eNW2lu568L7Ns9wdFrOhgRlkRnIDg0FLKbuu3i8= github.com/libp2p/go-libp2p-swarm v0.8.0/go.mod h1:sOMp6dPuqco0r0GHTzfVheVBh6UEL0L1lXUZ5ot2Fvc= -github.com/libp2p/go-libp2p-swarm v0.9.0 h1:LdWjHDVjPMYt3NCG2EHcQiIP8XzA8BHhHz8ZLAYol2Y= 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.1 h1:lXW3pgGt+BVmkzcFX61erX7l6Lt+WAamNhwa2Kf3eJM= +github.com/libp2p/go-libp2p-swarm v0.10.1/go.mod h1:Pdkq0QU5a+qu+oyqIV3bknMsnzk9lnNyKvB9acJ5aZs= 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= @@ -1435,8 +1449,9 @@ github.com/libp2p/go-libp2p-testing v0.3.0/go.mod h1:efZkql4UZ7OVsEfaxNHZPzIehts github.com/libp2p/go-libp2p-testing v0.4.0/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotlKsNSbKQ/lImlOWF0= 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 h1:tV/wz6mS1VoAYA/5DGTiyzw9TJ+eXMCMvzU5VPLJSgg= github.com/libp2p/go-libp2p-testing v0.6.0/go.mod h1:QBk8fqIL1XNcno/l3/hhaIEn4aLRijpYOR+zVjjlh+A= +github.com/libp2p/go-libp2p-testing v0.7.0 h1:9bfyhNINizxuLrKsenzGaZalXRXIaAEmx1BP/PzF1gM= +github.com/libp2p/go-libp2p-testing v0.7.0/go.mod h1:OLbdn9DbgdMwv00v+tlp1l3oe2Cl+FAjoWIA2pa0X6E= 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 h1:lsE2zYte+rZCEOHF72J1Fg3XK3dGQyKvI6i5ehJfEp0= @@ -1451,8 +1466,10 @@ 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.4.6/go.mod h1:JE0WQuQdy+uLZ5zOaI3Nw9dWGYJIA7mywEtP2lMvnyk= 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 h1:GfMCU+2aGGEm1zW3UcOz6wYSn8tXQalFfVfcww99i5A= 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 h1:MSMe+tUfxpC9GArTz7a4G5zQKQgGh00Vio87d3j3xIg= +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-yamux v0.1.2/go.mod h1:xUoV/RmYkg6BW/qGxA9XJyg+HzXFYkeXbnhjmnYzKp8= github.com/libp2p/go-libp2p-yamux v0.1.3/go.mod h1:VGSQVrqkh6y4nm0189qqxMtvyBft44MOYYPpYKXiVt4= @@ -1466,8 +1483,11 @@ github.com/libp2p/go-libp2p-yamux v0.4.0/go.mod h1:+DWDjtFMzoAwYLVkNZftoucn7PelN github.com/libp2p/go-libp2p-yamux v0.5.0/go.mod h1:AyR8k5EzyM2QN9Bbdg6X1SkVVuqLwTGf0L4DFq9g6po= 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 h1:bVXHbTj/XH4uBBsPrg26BlDABk5WYRlssY73P0SjhPc= 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 h1:6GKWntresp0TFxMP/oSoH96nV8XKJRdynXsdp43dn0Y= +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= @@ -1479,8 +1499,9 @@ github.com/libp2p/go-mplex v0.1.0/go.mod h1:SXgmdki2kwCUlCCbfGLEgHjC4pFqhTp0ZoV6 github.com/libp2p/go-mplex v0.1.1/go.mod h1:Xgz2RDCi3co0LeZfgjm4OgUF15+sVR8SRcu3SFXI1lk= 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 h1:U1T+vmCYJaEoDJPV1aq31N56hS+lJgb397GsylNSgrU= github.com/libp2p/go-mplex v0.3.0/go.mod h1:0Oy/A9PQlwBytDRp4wSkFnzHYDKcpLot35JQ6msjvYQ= +github.com/libp2p/go-mplex v0.4.0 h1:Ukkez9/4EOX5rTw4sHefNJp10dksftAA05ZgyjplUbM= +github.com/libp2p/go-mplex v0.4.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= @@ -1495,8 +1516,9 @@ github.com/libp2p/go-nat v0.1.0/go.mod h1:X7teVkwRHNInVNWQiO/tAiAVRwSr5zoRz4YSTC github.com/libp2p/go-netroute v0.1.2/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk= github.com/libp2p/go-netroute v0.1.3/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk= github.com/libp2p/go-netroute v0.1.5/go.mod h1:V1SR3AaECRkEQCoFFzYwVYWvYIEtlxx89+O3qcpCl4A= -github.com/libp2p/go-netroute v0.1.6 h1:ruPJStbYyXVYGQ81uzEDzuvbYRLKRrLvTYd33yomC38= github.com/libp2p/go-netroute v0.1.6/go.mod h1:AqhkMh0VuWmfgtxKPp3Oc1LdU5QSWS7wl0QLhSZqXxQ= +github.com/libp2p/go-netroute v0.2.0 h1:0FpsbsvuSnAhXFnCY0VLFbJOzaK0VnP0r1QT/o4nWRE= +github.com/libp2p/go-netroute v0.2.0/go.mod h1:Vio7LTzZ+6hoT4CMZi5/6CpY3Snzh2vgZhWgxMNwlQI= github.com/libp2p/go-openssl v0.0.2/go.mod h1:v8Zw2ijCSWBQi8Pq5GAixw6DbFfa9u6VIYDXnvOXkc0= 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= @@ -1515,14 +1537,14 @@ github.com/libp2p/go-reuseport-transport v0.1.0 h1:C3PHeHjmnz8m6f0uydObj02tMEoi7 github.com/libp2p/go-reuseport-transport v0.1.0/go.mod h1:vev0C0uMkzriDY59yFHD9v+ujJvYmDQVLowvAjEOmfw= 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 h1:yD80l2ZOdGksnOyHrhxDdTDFrf7Oy+v3FMVArIRgZxQ= github.com/libp2p/go-sockaddr v0.1.1/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= 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= 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 h1:TqnSHPJEIqDEO7h1wZZ0p3DXdvDSiLHQidKKUGZtiOY= 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 h1:HsM/9OdtqnIzjVXcxTXjmqKrj3gJ8kacaOJwJS1ipaY= +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= @@ -1530,8 +1552,9 @@ github.com/libp2p/go-tcp-transport v0.2.0/go.mod h1:vX2U0CnWimU4h0SGSEsg++AzvBcr 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= -github.com/libp2p/go-tcp-transport v0.4.0 h1:VDyg4j6en3OuXf90gfDQh5Sy9KowO9udnd0OU8PP6zg= 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 h1:3ZPW8HAuyRAuFzyabE0hSrCXKKSWzROnZZX7DtcIatY= +github.com/libp2p/go-tcp-transport v0.5.0/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= @@ -1541,8 +1564,9 @@ 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.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 h1:cO6x4P0v6PfxbKnxmf5cY2Ny4OPDGYkUqNvZzp/zdlo= github.com/libp2p/go-ws-transport v0.5.0/go.mod h1:I2juo1dNTbl8BKSBYo98XY85kU2xds1iamArLvl8kNg= +github.com/libp2p/go-ws-transport v0.6.0 h1:326XBL6Q+5CQ2KtjXz32+eGu02W/Kz2+Fm4SpXdr0q4= +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= @@ -1554,8 +1578,10 @@ github.com/libp2p/go-yamux v1.4.0/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/h 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.2.0/go.mod h1:3So6P6TV6r75R9jiBpiIKgU/66lOarCZjqROGxzPpPQ= -github.com/libp2p/go-yamux/v2 v2.3.0 h1:luRV68GS1vqqr6EFUjtu1kr51d+IbW0gSowu8emYWAI= 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 h1:LW0q5+A1Wy0npEsPJP9wmare2NH4ohNluN5EWVwv2mE= +github.com/libp2p/go-yamux/v3 v3.0.2/go.mod h1:s2LsDhHbh+RfCsQoICSYt58U2f8ijtPANFD8BmE74Bo= 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= @@ -1564,8 +1590,9 @@ github.com/lucas-clemente/quic-go v0.16.0/go.mod h1:I0+fcNTdb9eS1ZcjQZbDVPGchJ86 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= -github.com/lucas-clemente/quic-go v0.24.0 h1:ToR7SIIEdrgOhgVTHvPgdVRJfgVy+N0wQAagH7L4d5g= github.com/lucas-clemente/quic-go v0.24.0/go.mod h1:paZuzjXCE5mj6sikVLMvqXk8lJV2AsqtJ6bDhjEfxx0= +github.com/lucas-clemente/quic-go v0.25.0 h1:K+X9Gvd7JXsOHtU0N2icZ2Nw3rx82uBej3mP4CLgibc= +github.com/lucas-clemente/quic-go v0.25.0/go.mod h1:YtzP8bxRVCBlO77yRanE264+fY/T2U9ZlW1AaHOsMOg= 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= @@ -1597,6 +1624,8 @@ github.com/marten-seemann/qtls-go1-16 v0.1.4/go.mod h1:gNpI2Ol+lRS3WwSOtIUUtRwZE 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 h1:P9ggrs5xtwiqXv/FHNwntmuLMNq3KaSIG93AtAZ48xk= github.com/marten-seemann/qtls-go1-17 v0.1.0/go.mod h1:fz4HIxByo+LlWcreM4CZOYNuz3taBQ8rN2X6FqvaWo8= +github.com/marten-seemann/qtls-go1-18 v0.1.0-beta.1 h1:EnzzN9fPUkUck/1CuY1FlzBaIYMoiBsdwTNmNGkwUUM= +github.com/marten-seemann/qtls-go1-18 v0.1.0-beta.1/go.mod h1:PUhIQk19LoFt2174H4+an8TYvWOGjb/hHwphBeaDHwI= 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= @@ -1709,8 +1738,9 @@ 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 h1:Pq37uLx3hsyNlTDir7FZyU8+cFCTqd5y1KiM2IzOutI= 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-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= @@ -1735,8 +1765,9 @@ github.com/multiformats/go-multibase v0.0.3 h1:l/B6bJDQjvQ5G52jw4QGSYeOTZoAwIO77 github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc= 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 h1:ZrUuMKNgJ52qHPoQ+bx0h0uBfcWmN7Px+4uKSZeesiI= 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 h1:VyANTtZ0wsx0IAZnCZhfMmAmfUyzJq/5JQi2hHOtKS0= +github.com/multiformats/go-multicodec v0.3.1-0.20211210143421-a526f306ed2c/go.mod h1:1Hj/eHRaVWSXiSNNfcEPcwZleTmdNP81xlxDLnWU9GQ= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po= github.com/multiformats/go-multihash v0.0.8/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= @@ -1842,6 +1873,8 @@ github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIw 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/paulbellamy/ratecounter v0.2.0/go.mod h1:Hfx1hDpSGoqxkVVpBi/IlYD7kChlfo5C6hzIHwPqfFE= +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/pelletier/go-toml v1.4.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo= From fdae1face5101860986556d6cf488c1baffd3fcf Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Thu, 3 Feb 2022 14:26:59 -0500 Subject: [PATCH 317/393] Set Calib OhSnap upgrade epoch --- build/params_calibnet.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/build/params_calibnet.go b/build/params_calibnet.go index 4da2269ee52..a5d1acc3c1b 100644 --- a/build/params_calibnet.go +++ b/build/params_calibnet.go @@ -54,7 +54,8 @@ const UpgradeHyperdriveHeight = 420 const UpgradeChocolateHeight = 312746 -const UpgradeOhSnapHeight = 99999999 +// 2022-02-08T19:23:00Z +const UpgradeOhSnapHeight = 676246 func init() { policy.SetConsensusMinerMinPower(abi.NewStoragePower(32 << 30)) From 1865e8f0886aa879ab257b3f6ecc9980e0652224 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Thu, 3 Feb 2022 14:51:39 -0500 Subject: [PATCH 318/393] reset butterfly net --- build/params_butterfly.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/build/params_butterfly.go b/build/params_butterfly.go index 776a31714cb..804bdde93ac 100644 --- a/build/params_butterfly.go +++ b/build/params_butterfly.go @@ -42,8 +42,7 @@ const UpgradeTurboHeight = -15 const UpgradeHyperdriveHeight = -16 const UpgradeChocolateHeight = -17 -// 2022-01-17T19:00:00Z -const UpgradeOhSnapHeight = 30262 +const UpgradeOhSnapHeight = 240 func init() { policy.SetConsensusMinerMinPower(abi.NewStoragePower(2 << 30)) From 932110fb93489bc6c75f7d4f3b32aecac331a7db Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Thu, 3 Feb 2022 13:49:22 -0500 Subject: [PATCH 319/393] update the param version --- .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 53611d56515..1614daf8e6a 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -44,13 +44,13 @@ commands: - restore_cache: name: Restore parameters cache keys: - - 'v25-2k-lotus-params' + - 'v26-2k-lotus-params' paths: - /var/tmp/filecoin-proof-parameters/ - run: ./lotus fetch-params 2048 - save_cache: name: Save parameters cache - key: 'v25-2k-lotus-params' + key: 'v26-2k-lotus-params' paths: - /var/tmp/filecoin-proof-parameters/ install_ipfs: diff --git a/.circleci/template.yml b/.circleci/template.yml index ef6818c6d5b..8f5995d56d1 100644 --- a/.circleci/template.yml +++ b/.circleci/template.yml @@ -44,13 +44,13 @@ commands: - restore_cache: name: Restore parameters cache keys: - - 'v25-2k-lotus-params' + - 'v26-2k-lotus-params' paths: - /var/tmp/filecoin-proof-parameters/ - run: ./lotus fetch-params 2048 - save_cache: name: Save parameters cache - key: 'v25-2k-lotus-params' + key: 'v26-2k-lotus-params' paths: - /var/tmp/filecoin-proof-parameters/ install_ipfs: From f476aa937e5d71b6861d7a8c5291ffaa26e1908e Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 8 Feb 2022 10:45:58 -0500 Subject: [PATCH 320/393] update to latest FFI --- extern/filecoin-ffi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extern/filecoin-ffi b/extern/filecoin-ffi index e660df5616e..c03fc07aadf 160000 --- a/extern/filecoin-ffi +++ b/extern/filecoin-ffi @@ -1 +1 @@ -Subproject commit e660df5616e397b2d8ac316f45ddfa7a44637971 +Subproject commit c03fc07aadf76b464644c785f59292b93542c0ee From 142ba6660a3a1fe3931652f3c6eb569ab14b79ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 2 Feb 2022 20:23:35 +0000 Subject: [PATCH 321/393] wip FinalizeReplicaUpdate --- api/api_worker.go | 1 + api/proxy_gen.go | 13 ++++ .../sector-storage/ffiwrapper/sealer_cgo.go | 76 +++++++++++++++++++ extern/sector-storage/manager.go | 68 +++++++++++++++++ extern/sector-storage/sealtasks/task.go | 18 +++-- extern/sector-storage/storiface/worker.go | 1 + extern/sector-storage/worker_local.go | 50 ++++++++---- .../storage-sealing/states_replica_update.go | 9 +++ go.mod | 2 +- go.sum | 2 + 10 files changed, 217 insertions(+), 23 deletions(-) diff --git a/api/api_worker.go b/api/api_worker.go index 68d8e7baf5c..ba50a9459a4 100644 --- a/api/api_worker.go +++ b/api/api_worker.go @@ -39,6 +39,7 @@ type Worker interface { SealCommit1(ctx context.Context, sector storage.SectorRef, ticket abi.SealRandomness, seed abi.InteractiveSealRandomness, pieces []abi.PieceInfo, cids storage.SectorCids) (storiface.CallID, error) //perm:admin SealCommit2(ctx context.Context, sector storage.SectorRef, c1o storage.Commit1Out) (storiface.CallID, error) //perm:admin FinalizeSector(ctx context.Context, sector storage.SectorRef, keepUnsealed []storage.Range) (storiface.CallID, error) //perm:admin + FinalizeReplicaUpdate(ctx context.Context, sector storage.SectorRef, keepUnsealed []storage.Range) (storiface.CallID, error) //perm:admin ReplicaUpdate(ctx context.Context, sector storage.SectorRef, pieces []abi.PieceInfo) (storiface.CallID, error) //perm:admin ProveReplicaUpdate1(ctx context.Context, sector storage.SectorRef, sectorKey, newSealed, newUnsealed cid.Cid) (storiface.CallID, error) //perm:admin ProveReplicaUpdate2(ctx context.Context, sector storage.SectorRef, sectorKey, newSealed, newUnsealed cid.Cid, vanillaProofs storage.ReplicaVanillaProofs) (storiface.CallID, error) //perm:admin diff --git a/api/proxy_gen.go b/api/proxy_gen.go index e353a7c6e89..a68340f608c 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -872,6 +872,8 @@ type WorkerStruct struct { Fetch func(p0 context.Context, p1 storage.SectorRef, p2 storiface.SectorFileType, p3 storiface.PathType, p4 storiface.AcquireMode) (storiface.CallID, error) `perm:"admin"` + FinalizeReplicaUpdate func(p0 context.Context, p1 storage.SectorRef, p2 []storage.Range) (storiface.CallID, error) `perm:"admin"` + FinalizeSector func(p0 context.Context, p1 storage.SectorRef, p2 []storage.Range) (storiface.CallID, error) `perm:"admin"` GenerateSectorKeyFromData func(p0 context.Context, p1 storage.SectorRef, p2 cid.Cid) (storiface.CallID, error) `perm:"admin"` @@ -5006,6 +5008,17 @@ func (s *WorkerStub) Fetch(p0 context.Context, p1 storage.SectorRef, p2 storifac return *new(storiface.CallID), ErrNotSupported } +func (s *WorkerStruct) FinalizeReplicaUpdate(p0 context.Context, p1 storage.SectorRef, p2 []storage.Range) (storiface.CallID, error) { + if s.Internal.FinalizeReplicaUpdate == nil { + return *new(storiface.CallID), ErrNotSupported + } + return s.Internal.FinalizeReplicaUpdate(p0, p1, p2) +} + +func (s *WorkerStub) FinalizeReplicaUpdate(p0 context.Context, p1 storage.SectorRef, p2 []storage.Range) (storiface.CallID, error) { + return *new(storiface.CallID), ErrNotSupported +} + func (s *WorkerStruct) FinalizeSector(p0 context.Context, p1 storage.SectorRef, p2 []storage.Range) (storiface.CallID, error) { if s.Internal.FinalizeSector == nil { return *new(storiface.CallID), ErrNotSupported diff --git a/extern/sector-storage/ffiwrapper/sealer_cgo.go b/extern/sector-storage/ffiwrapper/sealer_cgo.go index c35cefd56e7..cdda79a7548 100644 --- a/extern/sector-storage/ffiwrapper/sealer_cgo.go +++ b/extern/sector-storage/ffiwrapper/sealer_cgo.go @@ -843,6 +843,82 @@ func (sb *Sealer) FinalizeSector(ctx context.Context, sector storage.SectorRef, return ffi.ClearCache(uint64(ssize), paths.Cache) } +func (sb *Sealer) FinalizeReplicaUpdate(ctx context.Context, sector storage.SectorRef, keepUnsealed []storage.Range) error { + ssize, err := sector.ProofType.SectorSize() + if err != nil { + return err + } + maxPieceSize := abi.PaddedPieceSize(ssize) + + if len(keepUnsealed) > 0 { // TODO dedupe with the above + + sr := partialfile.PieceRun(0, maxPieceSize) + + for _, s := range keepUnsealed { + si := &rlepluslazy.RunSliceIterator{} + if s.Offset != 0 { + si.Runs = append(si.Runs, rlepluslazy.Run{Val: false, Len: uint64(s.Offset)}) + } + si.Runs = append(si.Runs, rlepluslazy.Run{Val: true, Len: uint64(s.Size)}) + + var err error + sr, err = rlepluslazy.Subtract(sr, si) + if err != nil { + return err + } + } + + paths, done, err := sb.sectors.AcquireSector(ctx, sector, storiface.FTUnsealed, 0, storiface.PathStorage) + if err != nil { + return xerrors.Errorf("acquiring sector cache path: %w", err) + } + defer done() + + pf, err := partialfile.OpenPartialFile(maxPieceSize, paths.Unsealed) + if err == nil { + var at uint64 + for sr.HasNext() { + r, err := sr.NextRun() + if err != nil { + _ = pf.Close() + return err + } + + offset := at + at += r.Len + if !r.Val { + continue + } + + err = pf.Free(storiface.PaddedByteIndex(abi.UnpaddedPieceSize(offset).Padded()), abi.UnpaddedPieceSize(r.Len).Padded()) + if err != nil { + _ = pf.Close() + return xerrors.Errorf("free partial file range: %w", err) + } + } + + if err := pf.Close(); err != nil { + return err + } + } else { + if !xerrors.Is(err, os.ErrNotExist) { + return xerrors.Errorf("opening partial file: %w", 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() + + return ffi.ClearCache(uint64(ssize), paths.Cache) + + // TODO: ^ above but for snapdeals +} + func (sb *Sealer) ReleaseUnsealed(ctx context.Context, sector storage.SectorRef, safeToFree []storage.Range) error { // This call is meant to mark storage as 'freeable'. Given that unsealing is // very expensive, we don't remove data as soon as we can - instead we only diff --git a/extern/sector-storage/manager.go b/extern/sector-storage/manager.go index 475c399e90b..f1f84a05777 100644 --- a/extern/sector-storage/manager.go +++ b/extern/sector-storage/manager.go @@ -577,6 +577,74 @@ func (m *Manager) FinalizeSector(ctx context.Context, sector storage.SectorRef, return nil } +func (m *Manager) FinalizeReplicaUpdate(ctx context.Context, sector storage.SectorRef, keepUnsealed []storage.Range) error { + ctx, cancel := context.WithCancel(ctx) + defer cancel() + + if err := m.index.StorageLock(ctx, sector.ID, storiface.FTNone, storiface.FTSealed|storiface.FTUnsealed|storiface.FTCache|storiface.FTUpdate|storiface.FTUpdateCache); err != nil { + return xerrors.Errorf("acquiring sector lock: %w", err) + } + + fts := storiface.FTUnsealed + { + unsealedStores, err := m.index.StorageFindSector(ctx, sector.ID, storiface.FTUnsealed, 0, false) + if err != nil { + return xerrors.Errorf("finding unsealed sector: %w", err) + } + + if len(unsealedStores) == 0 { // Is some edge-cases unsealed sector may not exist already, that's fine + fts = storiface.FTNone + } + } + + pathType := storiface.PathStorage + { + sealedStores, err := m.index.StorageFindSector(ctx, sector.ID, storiface.FTUpdate, 0, false) + if err != nil { + return xerrors.Errorf("finding sealed sector: %w", err) + } + + for _, store := range sealedStores { + if store.CanSeal { + pathType = storiface.PathSealing + break + } + } + } + + selector := newExistingSelector(m.index, sector.ID, storiface.FTCache|storiface.FTSealed|storiface.FTUpdate|storiface.FTUpdateCache, false) + + err := m.sched.Schedule(ctx, sector, sealtasks.TTFinalizeReplicaUpdate, selector, + m.schedFetch(sector, storiface.FTCache|storiface.FTSealed|storiface.FTUpdate|storiface.FTUpdateCache|fts, pathType, storiface.AcquireMove), + func(ctx context.Context, w Worker) error { + _, err := m.waitSimpleCall(ctx)(w.FinalizeReplicaUpdate(ctx, sector, keepUnsealed)) + return err + }) + if err != nil { + return err + } + + fetchSel := newAllocSelector(m.index, storiface.FTCache|storiface.FTSealed|storiface.FTUpdate|storiface.FTUpdateCache, storiface.PathStorage) + moveUnsealed := fts + { + if len(keepUnsealed) == 0 { + moveUnsealed = storiface.FTNone + } + } + + err = m.sched.Schedule(ctx, sector, sealtasks.TTFetch, fetchSel, + m.schedFetch(sector, storiface.FTCache|storiface.FTSealed|storiface.FTUpdate|storiface.FTUpdateCache|moveUnsealed, storiface.PathStorage, storiface.AcquireMove), + func(ctx context.Context, w Worker) error { + _, err := m.waitSimpleCall(ctx)(w.MoveStorage(ctx, sector, storiface.FTCache|storiface.FTSealed|storiface.FTUpdate|storiface.FTUpdateCache|moveUnsealed)) + return err + }) + if err != nil { + return xerrors.Errorf("moving sector to storage: %w", err) + } + + return nil +} + func (m *Manager) ReleaseUnsealed(ctx context.Context, sector storage.SectorRef, safeToFree []storage.Range) error { return nil } diff --git a/extern/sector-storage/sealtasks/task.go b/extern/sector-storage/sealtasks/task.go index 8b91d5b291d..654ad25b186 100644 --- a/extern/sector-storage/sealtasks/task.go +++ b/extern/sector-storage/sealtasks/task.go @@ -14,10 +14,11 @@ const ( TTFetch TaskType = "seal/v0/fetch" TTUnseal TaskType = "seal/v0/unseal" - TTReplicaUpdate TaskType = "seal/v0/replicaupdate" - TTProveReplicaUpdate1 TaskType = "seal/v0/provereplicaupdate/1" - TTProveReplicaUpdate2 TaskType = "seal/v0/provereplicaupdate/2" - TTRegenSectorKey TaskType = "seal/v0/regensectorkey" + TTReplicaUpdate TaskType = "seal/v0/replicaupdate" + TTProveReplicaUpdate1 TaskType = "seal/v0/provereplicaupdate/1" + TTProveReplicaUpdate2 TaskType = "seal/v0/provereplicaupdate/2" + TTRegenSectorKey TaskType = "seal/v0/regensectorkey" + TTFinalizeReplicaUpdate TaskType = "seal/v0/finalize/replicaupdate" ) var order = map[TaskType]int{ @@ -48,10 +49,11 @@ var shortNames = map[TaskType]string{ TTFetch: "GET", TTUnseal: "UNS", - TTReplicaUpdate: "RU", - TTProveReplicaUpdate1: "PR1", - TTProveReplicaUpdate2: "PR2", - TTRegenSectorKey: "GSK", + TTReplicaUpdate: "RU", + TTProveReplicaUpdate1: "PR1", + TTProveReplicaUpdate2: "PR2", + TTRegenSectorKey: "GSK", + TTFinalizeReplicaUpdate: "FRU", } func (a TaskType) MuchLess(b TaskType) (bool, bool) { diff --git a/extern/sector-storage/storiface/worker.go b/extern/sector-storage/storiface/worker.go index 8bb6a256a1f..476854cd776 100644 --- a/extern/sector-storage/storiface/worker.go +++ b/extern/sector-storage/storiface/worker.go @@ -120,6 +120,7 @@ type WorkerCalls interface { SealCommit1(ctx context.Context, sector storage.SectorRef, ticket abi.SealRandomness, seed abi.InteractiveSealRandomness, pieces []abi.PieceInfo, cids storage.SectorCids) (CallID, error) SealCommit2(ctx context.Context, sector storage.SectorRef, c1o storage.Commit1Out) (CallID, error) FinalizeSector(ctx context.Context, sector storage.SectorRef, keepUnsealed []storage.Range) (CallID, error) + FinalizeReplicaUpdate(ctx context.Context, sector storage.SectorRef, keepUnsealed []storage.Range) (CallID, error) ReleaseUnsealed(ctx context.Context, sector storage.SectorRef, safeToFree []storage.Range) (CallID, error) ReplicaUpdate(ctx context.Context, sector storage.SectorRef, pieces []abi.PieceInfo) (CallID, error) ProveReplicaUpdate1(ctx context.Context, sector storage.SectorRef, sectorKey, newSealed, newUnsealed cid.Cid) (CallID, error) diff --git a/extern/sector-storage/worker_local.go b/extern/sector-storage/worker_local.go index a5f5a0b9d31..232877f2f1a 100644 --- a/extern/sector-storage/worker_local.go +++ b/extern/sector-storage/worker_local.go @@ -162,20 +162,21 @@ func (l *LocalWorker) ffiExec() (ffiwrapper.Storage, error) { type ReturnType string const ( - AddPiece ReturnType = "AddPiece" - SealPreCommit1 ReturnType = "SealPreCommit1" - SealPreCommit2 ReturnType = "SealPreCommit2" - SealCommit1 ReturnType = "SealCommit1" - SealCommit2 ReturnType = "SealCommit2" - FinalizeSector ReturnType = "FinalizeSector" - ReplicaUpdate ReturnType = "ReplicaUpdate" - ProveReplicaUpdate1 ReturnType = "ProveReplicaUpdate1" - ProveReplicaUpdate2 ReturnType = "ProveReplicaUpdate2" - GenerateSectorKey ReturnType = "GenerateSectorKey" - ReleaseUnsealed ReturnType = "ReleaseUnsealed" - MoveStorage ReturnType = "MoveStorage" - UnsealPiece ReturnType = "UnsealPiece" - Fetch ReturnType = "Fetch" + AddPiece ReturnType = "AddPiece" + SealPreCommit1 ReturnType = "SealPreCommit1" + SealPreCommit2 ReturnType = "SealPreCommit2" + SealCommit1 ReturnType = "SealCommit1" + SealCommit2 ReturnType = "SealCommit2" + FinalizeSector ReturnType = "FinalizeSector" + FinalizeReplicaUpdate ReturnType = "FinalizeReplicaUpdate" + ReplicaUpdate ReturnType = "ReplicaUpdate" + ProveReplicaUpdate1 ReturnType = "ProveReplicaUpdate1" + ProveReplicaUpdate2 ReturnType = "ProveReplicaUpdate2" + GenerateSectorKey ReturnType = "GenerateSectorKey" + ReleaseUnsealed ReturnType = "ReleaseUnsealed" + MoveStorage ReturnType = "MoveStorage" + UnsealPiece ReturnType = "UnsealPiece" + Fetch ReturnType = "Fetch" ) // in: func(WorkerReturn, context.Context, CallID, err string) @@ -456,6 +457,27 @@ func (l *LocalWorker) FinalizeSector(ctx context.Context, sector storage.SectorR }) } +func (l *LocalWorker) FinalizeReplicaUpdate(ctx context.Context, sector storage.SectorRef, keepUnsealed []storage.Range) (storiface.CallID, error) { + sb, err := l.executor() + if err != nil { + return storiface.UndefCall, err + } + + return l.asyncCall(ctx, sector, FinalizeReplicaUpdate, func(ctx context.Context, ci storiface.CallID) (interface{}, error) { + if err := sb.FinalizeReplicaUpdate(ctx, sector, keepUnsealed); err != nil { + return nil, xerrors.Errorf("finalizing sector: %w", err) + } + + if len(keepUnsealed) == 0 { + if err := l.storage.Remove(ctx, sector.ID, storiface.FTUnsealed, true, nil); err != nil { + return nil, xerrors.Errorf("removing unsealed data: %w", err) + } + } + + return nil, err + }) +} + func (l *LocalWorker) ReleaseUnsealed(ctx context.Context, sector storage.SectorRef, safeToFree []storage.Range) (storiface.CallID, error) { return storiface.UndefCall, xerrors.Errorf("implement me") } diff --git a/extern/storage-sealing/states_replica_update.go b/extern/storage-sealing/states_replica_update.go index 43d5467ed55..39565b2536e 100644 --- a/extern/storage-sealing/states_replica_update.go +++ b/extern/storage-sealing/states_replica_update.go @@ -203,6 +203,15 @@ func (m *Sealing) handleReplicaUpdateWait(ctx statemachine.Context, sector Secto } func (m *Sealing) handleFinalizeReplicaUpdate(ctx statemachine.Context, sector SectorInfo) error { + cfg, err := m.getConfig() + if err != nil { + return xerrors.Errorf("getting sealing config: %w", err) + } + + if err := m.sealer.FinalizeReplicaUpdate(sector.sealingCtx(ctx.Context()), m.minerSector(sector.SectorType, sector.SectorNumber), sector.keepUnsealedRanges(false, cfg.AlwaysKeepUnsealedCopy)); err != nil { + return ctx.Send(SectorFinalizeFailed{xerrors.Errorf("finalize sector: %w", err)}) + } + return ctx.Send(SectorFinalized{}) } diff --git a/go.mod b/go.mod index 2ad4bfdce1a..2b8bd6645ab 100644 --- a/go.mod +++ b/go.mod @@ -51,7 +51,7 @@ require ( github.com/filecoin-project/specs-actors/v5 v5.0.4 github.com/filecoin-project/specs-actors/v6 v6.0.1 github.com/filecoin-project/specs-actors/v7 v7.0.0-rc1 - github.com/filecoin-project/specs-storage v0.1.1-0.20211228030229-6d460d25a0c9 + github.com/filecoin-project/specs-storage v0.1.1-0.20220202201749-ae62d2332aa8 github.com/filecoin-project/test-vectors/schema v0.0.5 github.com/gbrlsnchs/jwt/v3 v3.0.1 github.com/gdamore/tcell/v2 v2.2.0 diff --git a/go.sum b/go.sum index bb6a3f92d8d..2172d098912 100644 --- a/go.sum +++ b/go.sum @@ -384,6 +384,8 @@ github.com/filecoin-project/specs-actors/v7 v7.0.0-rc1 h1:FuDaXIbcw2hRsFI8SDTmsG github.com/filecoin-project/specs-actors/v7 v7.0.0-rc1/go.mod h1:TA5FwCna+Yi36POaT7SLKXsgEDvJwc0V/L6ZsO19B9M= github.com/filecoin-project/specs-storage v0.1.1-0.20211228030229-6d460d25a0c9 h1:oUYOvF7EvdXS0Zmk9mNkaB6Bu0l+WXBYPzVodKMiLug= github.com/filecoin-project/specs-storage v0.1.1-0.20211228030229-6d460d25a0c9/go.mod h1:Tb88Zq+IBJbvAn3mS89GYj3jdRThBTE/771HCVZdRJU= +github.com/filecoin-project/specs-storage v0.1.1-0.20220202201749-ae62d2332aa8 h1:lHg1G44FX6LNuIcGJWE6ty4dH+WoFIA2UIfGGV06Hpg= +github.com/filecoin-project/specs-storage v0.1.1-0.20220202201749-ae62d2332aa8/go.mod h1:Tb88Zq+IBJbvAn3mS89GYj3jdRThBTE/771HCVZdRJU= 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= From e271bae5ecd9cb1028e9ba5e79dfa0206aa832a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 3 Feb 2022 12:51:59 +0000 Subject: [PATCH 322/393] try ClearCache for update cache --- build/openrpc/full.json.gz | Bin 26594 -> 26596 bytes build/openrpc/miner.json.gz | Bin 12784 -> 12787 bytes build/openrpc/worker.json.gz | Bin 3918 -> 3962 bytes documentation/en/api-v0-methods-worker.md | 36 +++++++ .../sector-storage/ffiwrapper/sealer_cgo.go | 88 ++++++------------ extern/sector-storage/mock/mock.go | 4 + itests/ccupgrade_test.go | 6 +- 7 files changed, 74 insertions(+), 60 deletions(-) diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index ae8f0b86655688ef335478f8abf47bf58d1ca299..2bf4bcf6168f3918d6cf7982ce9550d42502eb26 100644 GIT binary patch delta 25998 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 INAhk00OW#epa1{> diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index d6c6806caadfecc60a2bad43c9b8e54d73222d61..e1499549e458313246cb81d2ae5b31f55056cb67 100644 GIT binary patch literal 3962 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 diff --git a/documentation/en/api-v0-methods-worker.md b/documentation/en/api-v0-methods-worker.md index 959265a4def..382d43b372f 100644 --- a/documentation/en/api-v0-methods-worker.md +++ b/documentation/en/api-v0-methods-worker.md @@ -10,6 +10,7 @@ * [Add](#Add) * [AddPiece](#AddPiece) * [Finalize](#Finalize) + * [FinalizeReplicaUpdate](#FinalizeReplicaUpdate) * [FinalizeSector](#FinalizeSector) * [Generate](#Generate) * [GenerateSectorKeyFromData](#GenerateSectorKeyFromData) @@ -1112,6 +1113,41 @@ Response: ## Finalize +### FinalizeReplicaUpdate + + +Perms: admin + +Inputs: +```json +[ + { + "ID": { + "Miner": 1000, + "Number": 9 + }, + "ProofType": 8 + }, + [ + { + "Offset": 1024, + "Size": 1024 + } + ] +] +``` + +Response: +```json +{ + "Sector": { + "Miner": 1000, + "Number": 9 + }, + "ID": "07070707-0707-0707-0707-070707070707" +} +``` + ### FinalizeSector diff --git a/extern/sector-storage/ffiwrapper/sealer_cgo.go b/extern/sector-storage/ffiwrapper/sealer_cgo.go index cdda79a7548..5b7f2acc52a 100644 --- a/extern/sector-storage/ffiwrapper/sealer_cgo.go +++ b/extern/sector-storage/ffiwrapper/sealer_cgo.go @@ -769,7 +769,7 @@ func (sb *Sealer) ReleaseSealed(ctx context.Context, sector storage.SectorRef) e return xerrors.Errorf("not supported at this layer") } -func (sb *Sealer) FinalizeSector(ctx context.Context, sector storage.SectorRef, keepUnsealed []storage.Range) error { +func (sb *Sealer) freeUnsealed(ctx context.Context, sector storage.SectorRef, keepUnsealed []storage.Range) error { ssize, err := sector.ProofType.SectorSize() if err != nil { return err @@ -834,6 +834,19 @@ func (sb *Sealer) FinalizeSector(ctx context.Context, sector storage.SectorRef, } + return nil +} + +func (sb *Sealer) FinalizeSector(ctx context.Context, sector storage.SectorRef, keepUnsealed []storage.Range) error { + ssize, err := sector.ProofType.SectorSize() + if err != nil { + return err + } + + if err := sb.freeUnsealed(ctx, sector, keepUnsealed); 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) @@ -848,75 +861,36 @@ func (sb *Sealer) FinalizeReplicaUpdate(ctx context.Context, sector storage.Sect if err != nil { return err } - maxPieceSize := abi.PaddedPieceSize(ssize) - - if len(keepUnsealed) > 0 { // TODO dedupe with the above - sr := partialfile.PieceRun(0, maxPieceSize) + if err := sb.freeUnsealed(ctx, sector, keepUnsealed); err != nil { + return err + } - for _, s := range keepUnsealed { - si := &rlepluslazy.RunSliceIterator{} - if s.Offset != 0 { - si.Runs = append(si.Runs, rlepluslazy.Run{Val: false, Len: uint64(s.Offset)}) - } - si.Runs = append(si.Runs, rlepluslazy.Run{Val: true, Len: uint64(s.Size)}) + { + 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() - var err error - sr, err = rlepluslazy.Subtract(sr, si) - if err != nil { - return err - } + if err := ffi.ClearCache(uint64(ssize), paths.Cache); err != nil { + return xerrors.Errorf("clear cache: %w", err) } + } - paths, done, err := sb.sectors.AcquireSector(ctx, sector, storiface.FTUnsealed, 0, storiface.PathStorage) + { + paths, done, err := sb.sectors.AcquireSector(ctx, sector, storiface.FTUpdateCache, 0, storiface.PathStorage) if err != nil { return xerrors.Errorf("acquiring sector cache path: %w", err) } defer done() - pf, err := partialfile.OpenPartialFile(maxPieceSize, paths.Unsealed) - if err == nil { - var at uint64 - for sr.HasNext() { - r, err := sr.NextRun() - if err != nil { - _ = pf.Close() - return err - } - - offset := at - at += r.Len - if !r.Val { - continue - } - - err = pf.Free(storiface.PaddedByteIndex(abi.UnpaddedPieceSize(offset).Padded()), abi.UnpaddedPieceSize(r.Len).Padded()) - if err != nil { - _ = pf.Close() - return xerrors.Errorf("free partial file range: %w", err) - } - } - - if err := pf.Close(); err != nil { - return err - } - } else { - if !xerrors.Is(err, os.ErrNotExist) { - return xerrors.Errorf("opening partial file: %w", err) - } + if err := ffi.ClearCache(uint64(ssize), paths.UpdateCache); err != nil { + return xerrors.Errorf("clear cache: %w", 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() - - return ffi.ClearCache(uint64(ssize), paths.Cache) - - // TODO: ^ above but for snapdeals + return nil } func (sb *Sealer) ReleaseUnsealed(ctx context.Context, sector storage.SectorRef, safeToFree []storage.Range) error { diff --git a/extern/sector-storage/mock/mock.go b/extern/sector-storage/mock/mock.go index c99af89e7f4..9f7c17f2cc5 100644 --- a/extern/sector-storage/mock/mock.go +++ b/extern/sector-storage/mock/mock.go @@ -477,6 +477,10 @@ func (mgr *SectorMgr) FinalizeSector(context.Context, storage.SectorRef, []stora return nil } +func (mgr *SectorMgr) FinalizeReplicaUpdate(context.Context, storage.SectorRef, []storage.Range) error { + return nil +} + func (mgr *SectorMgr) ReleaseUnsealed(ctx context.Context, sector storage.SectorRef, safeToFree []storage.Range) error { return nil } diff --git a/itests/ccupgrade_test.go b/itests/ccupgrade_test.go index 51e70dd5bda..11ff12be1bb 100644 --- a/itests/ccupgrade_test.go +++ b/itests/ccupgrade_test.go @@ -37,12 +37,12 @@ func TestCCUpgrade(t *testing.T) { } { height := height // make linters happy by copying t.Run(fmt.Sprintf("upgrade-%d", height), func(t *testing.T) { - runTestCCUpgrade(t, height) + runTestCCUpgrade(t) }) } } -func runTestCCUpgrade(t *testing.T, upgradeHeight abi.ChainEpoch) *kit.TestFullNode { +func runTestCCUpgrade(t *testing.T) *kit.TestFullNode { ctx := context.Background() blockTime := 1 * time.Millisecond @@ -137,7 +137,7 @@ func TestCCUpgradeAndPoSt(t *testing.T) { kit.QuietMiningLogs() t.Run("upgrade and then post", func(t *testing.T) { ctx := context.Background() - n := runTestCCUpgrade(t, 100) + n := runTestCCUpgrade(t) ts, err := n.ChainHead(ctx) require.NoError(t, err) start := ts.Height() From 6675aec686bc6803dc757d71c862ccc22fa94d08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 3 Feb 2022 13:04:09 +0000 Subject: [PATCH 323/393] mod tidy --- go.sum | 2 -- 1 file changed, 2 deletions(-) diff --git a/go.sum b/go.sum index 2172d098912..c42f248948b 100644 --- a/go.sum +++ b/go.sum @@ -382,8 +382,6 @@ github.com/filecoin-project/specs-actors/v7 v7.0.0-20211117170924-fd07a4c7dff9/g github.com/filecoin-project/specs-actors/v7 v7.0.0-20211222192039-c83bea50c402/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= github.com/filecoin-project/specs-actors/v7 v7.0.0-rc1 h1:FuDaXIbcw2hRsFI8SDTmsGGCE+NumpF6aiBoU/2X5W4= github.com/filecoin-project/specs-actors/v7 v7.0.0-rc1/go.mod h1:TA5FwCna+Yi36POaT7SLKXsgEDvJwc0V/L6ZsO19B9M= -github.com/filecoin-project/specs-storage v0.1.1-0.20211228030229-6d460d25a0c9 h1:oUYOvF7EvdXS0Zmk9mNkaB6Bu0l+WXBYPzVodKMiLug= -github.com/filecoin-project/specs-storage v0.1.1-0.20211228030229-6d460d25a0c9/go.mod h1:Tb88Zq+IBJbvAn3mS89GYj3jdRThBTE/771HCVZdRJU= github.com/filecoin-project/specs-storage v0.1.1-0.20220202201749-ae62d2332aa8 h1:lHg1G44FX6LNuIcGJWE6ty4dH+WoFIA2UIfGGV06Hpg= github.com/filecoin-project/specs-storage v0.1.1-0.20220202201749-ae62d2332aa8/go.mod h1:Tb88Zq+IBJbvAn3mS89GYj3jdRThBTE/771HCVZdRJU= github.com/filecoin-project/test-vectors/schema v0.0.5 h1:w3zHQhzM4pYxJDl21avXjOKBLF8egrvwUwjpT8TquDg= From 7fa84518c8bfe1ffdf44c2514c31c11c7295e328 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 8 Feb 2022 14:28:13 +0100 Subject: [PATCH 324/393] itests: Print API info env vars in ThroughRPC tests --- itests/ccupgrade_test.go | 13 ++----------- itests/kit/rpc.go | 5 ++++- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/itests/ccupgrade_test.go b/itests/ccupgrade_test.go index 11ff12be1bb..2fda4240668 100644 --- a/itests/ccupgrade_test.go +++ b/itests/ccupgrade_test.go @@ -30,23 +30,14 @@ func TestCCUpgrade(t *testing.T) { //stm: @MINER_SECTOR_LIST_001 kit.QuietMiningLogs() - for _, height := range []abi.ChainEpoch{ - -1, // before - 162, // while sealing - 560, // after upgrade deal - } { - height := height // make linters happy by copying - t.Run(fmt.Sprintf("upgrade-%d", height), func(t *testing.T) { - runTestCCUpgrade(t) - }) - } + runTestCCUpgrade(t) } func runTestCCUpgrade(t *testing.T) *kit.TestFullNode { ctx := context.Background() blockTime := 1 * time.Millisecond - client, miner, ens := kit.EnsembleMinimal(t, kit.GenesisNetworkVersion(network.Version15)) + client, miner, ens := kit.EnsembleMinimal(t, kit.GenesisNetworkVersion(network.Version15), kit.ThroughRPC()) ens.InterconnectAll().BeginMiningMustPost(blockTime) maddr, err := miner.ActorAddress(ctx) diff --git a/itests/kit/rpc.go b/itests/kit/rpc.go index 35153eb644b..55521fb66ed 100644 --- a/itests/kit/rpc.go +++ b/itests/kit/rpc.go @@ -39,6 +39,7 @@ func fullRpc(t *testing.T, f *TestFullNode) *TestFullNode { require.NoError(t, err) srv, maddr := CreateRPCServer(t, handler, l) + fmt.Printf("FULLNODE RPC ENV FOR CLI DEBUGGING `export FULLNODE_API_INFO=%s`\n", "ws://"+srv.Listener.Addr().String()) cl, stop, err := client.NewFullNodeRPCV1(context.Background(), "ws://"+srv.Listener.Addr().String()+"/rpc/v1", nil) require.NoError(t, err) @@ -54,7 +55,9 @@ func minerRpc(t *testing.T, m *TestMiner) *TestMiner { srv, maddr := CreateRPCServer(t, handler, m.RemoteListener) - fmt.Println("creating RPC server for", m.ActorAddr, "at: ", srv.Listener.Addr().String()) + fmt.Printf("creating RPC server for %s at %s\n", m.ActorAddr, srv.Listener.Addr().String()) + fmt.Printf("SP RPC ENV FOR CLI DEBUGGING `export STORAGE_API_INFO=%s`\n", "ws://"+srv.Listener.Addr().String()) + url := "ws://" + srv.Listener.Addr().String() + "/rpc/v0" cl, stop, err := client.NewStorageMinerRPCV0(context.Background(), url, nil) require.NoError(t, err) From 09cfad9d7117eba29316cbb8158cbeedf7a89d83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 8 Feb 2022 15:06:42 +0100 Subject: [PATCH 325/393] Add FinalizeReplicaUpdate into some more places --- api/api_storage.go | 1 + api/proxy_gen.go | 13 ++++++++++ cmd/lotus-seal-worker/main.go | 2 +- extern/sector-storage/manager.go | 6 ++++- extern/sector-storage/mock/mock.go | 4 ++++ extern/sector-storage/storiface/worker.go | 1 + extern/sector-storage/worker_local.go | 29 ++++++++++++----------- extern/sector-storage/worker_tracked.go | 4 ++++ itests/kit/rpc.go | 2 +- 9 files changed, 45 insertions(+), 17 deletions(-) diff --git a/api/api_storage.go b/api/api_storage.go index c032a8e1b64..616a7be4949 100644 --- a/api/api_storage.go +++ b/api/api_storage.go @@ -130,6 +130,7 @@ type StorageMiner interface { ReturnProveReplicaUpdate1(ctx context.Context, callID storiface.CallID, vanillaProofs storage.ReplicaVanillaProofs, err *storiface.CallError) error //perm:admin retry:true ReturnProveReplicaUpdate2(ctx context.Context, callID storiface.CallID, proof storage.ReplicaUpdateProof, err *storiface.CallError) error //perm:admin retry:true ReturnGenerateSectorKeyFromData(ctx context.Context, callID storiface.CallID, err *storiface.CallError) error //perm:admin retry:true + ReturnFinalizeReplicaUpdate(ctx context.Context, callID storiface.CallID, err *storiface.CallError) error //perm:admin retry:true ReturnReleaseUnsealed(ctx context.Context, callID storiface.CallID, err *storiface.CallError) error //perm:admin retry:true 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 diff --git a/api/proxy_gen.go b/api/proxy_gen.go index a68340f608c..ad16a018e6d 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -723,6 +723,8 @@ type StorageMinerStruct struct { 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"` + ReturnFinalizeSector func(p0 context.Context, p1 storiface.CallID, p2 *storiface.CallError) error `perm:"admin"` ReturnGenerateSectorKeyFromData func(p0 context.Context, p1 storiface.CallID, p2 *storiface.CallError) error `perm:"admin"` @@ -4282,6 +4284,17 @@ func (s *StorageMinerStub) ReturnFetch(p0 context.Context, p1 storiface.CallID, return ErrNotSupported } +func (s *StorageMinerStruct) ReturnFinalizeReplicaUpdate(p0 context.Context, p1 storiface.CallID, p2 *storiface.CallError) error { + if s.Internal.ReturnFinalizeReplicaUpdate == nil { + return ErrNotSupported + } + return s.Internal.ReturnFinalizeReplicaUpdate(p0, p1, p2) +} + +func (s *StorageMinerStub) ReturnFinalizeReplicaUpdate(p0 context.Context, p1 storiface.CallID, p2 *storiface.CallError) error { + return ErrNotSupported +} + func (s *StorageMinerStruct) ReturnFinalizeSector(p0 context.Context, p1 storiface.CallID, p2 *storiface.CallError) error { if s.Internal.ReturnFinalizeSector == nil { return ErrNotSupported diff --git a/cmd/lotus-seal-worker/main.go b/cmd/lotus-seal-worker/main.go index 2e326e9c75d..84ff1ccddc5 100644 --- a/cmd/lotus-seal-worker/main.go +++ b/cmd/lotus-seal-worker/main.go @@ -261,7 +261,7 @@ var runCmd = &cli.Command{ var taskTypes []sealtasks.TaskType - taskTypes = append(taskTypes, sealtasks.TTFetch, sealtasks.TTCommit1, sealtasks.TTProveReplicaUpdate1, sealtasks.TTFinalize) + taskTypes = append(taskTypes, sealtasks.TTFetch, sealtasks.TTCommit1, sealtasks.TTProveReplicaUpdate1, sealtasks.TTFinalize, sealtasks.TTFinalizeReplicaUpdate) if cctx.Bool("addpiece") { taskTypes = append(taskTypes, sealtasks.TTAddPiece) diff --git a/extern/sector-storage/manager.go b/extern/sector-storage/manager.go index f1f84a05777..fcbfa2e69f7 100644 --- a/extern/sector-storage/manager.go +++ b/extern/sector-storage/manager.go @@ -146,7 +146,7 @@ func New(ctx context.Context, lstor *stores.Local, stor *stores.Remote, ls store go m.sched.runSched() localTasks := []sealtasks.TaskType{ - sealtasks.TTCommit1, sealtasks.TTProveReplicaUpdate1, sealtasks.TTFinalize, sealtasks.TTFetch, + sealtasks.TTCommit1, sealtasks.TTProveReplicaUpdate1, sealtasks.TTFinalize, sealtasks.TTFetch, sealtasks.TTFinalizeReplicaUpdate, } if sc.AllowAddPiece { localTasks = append(localTasks, sealtasks.TTAddPiece) @@ -943,6 +943,10 @@ func (m *Manager) ReturnProveReplicaUpdate2(ctx context.Context, callID storifac return m.returnResult(ctx, callID, proof, err) } +func (m *Manager) ReturnFinalizeReplicaUpdate(ctx context.Context, callID storiface.CallID, err *storiface.CallError) error { + return m.returnResult(ctx, callID, nil, err) +} + func (m *Manager) ReturnGenerateSectorKeyFromData(ctx context.Context, callID storiface.CallID, err *storiface.CallError) error { return m.returnResult(ctx, callID, nil, err) } diff --git a/extern/sector-storage/mock/mock.go b/extern/sector-storage/mock/mock.go index 9f7c17f2cc5..77126517665 100644 --- a/extern/sector-storage/mock/mock.go +++ b/extern/sector-storage/mock/mock.go @@ -581,6 +581,10 @@ func (mgr *SectorMgr) ReturnGenerateSectorKeyFromData(ctx context.Context, callI panic("not supported") } +func (mgr *SectorMgr) ReturnFinalizeReplicaUpdate(ctx context.Context, callID storiface.CallID, err *storiface.CallError) error { + panic("not supported") +} + func (m mockVerifProver) VerifySeal(svi proof.SealVerifyInfo) (bool, error) { plen, err := svi.SealProof.ProofSize() if err != nil { diff --git a/extern/sector-storage/storiface/worker.go b/extern/sector-storage/storiface/worker.go index 476854cd776..eedbc82074b 100644 --- a/extern/sector-storage/storiface/worker.go +++ b/extern/sector-storage/storiface/worker.go @@ -183,6 +183,7 @@ type WorkerReturn interface { ReturnProveReplicaUpdate1(ctx context.Context, callID CallID, proofs storage.ReplicaVanillaProofs, err *CallError) error ReturnProveReplicaUpdate2(ctx context.Context, callID CallID, proof storage.ReplicaUpdateProof, err *CallError) error ReturnGenerateSectorKeyFromData(ctx context.Context, callID CallID, err *CallError) error + ReturnFinalizeReplicaUpdate(ctx context.Context, callID CallID, err *CallError) error ReturnMoveStorage(ctx context.Context, callID CallID, err *CallError) error ReturnUnsealPiece(ctx context.Context, callID CallID, err *CallError) error ReturnReadPiece(ctx context.Context, callID CallID, ok bool, err *CallError) error diff --git a/extern/sector-storage/worker_local.go b/extern/sector-storage/worker_local.go index 232877f2f1a..572d482edc8 100644 --- a/extern/sector-storage/worker_local.go +++ b/extern/sector-storage/worker_local.go @@ -214,20 +214,21 @@ func rfunc(in interface{}) func(context.Context, storiface.CallID, storiface.Wor } var returnFunc = map[ReturnType]func(context.Context, storiface.CallID, storiface.WorkerReturn, interface{}, *storiface.CallError) error{ - AddPiece: rfunc(storiface.WorkerReturn.ReturnAddPiece), - SealPreCommit1: rfunc(storiface.WorkerReturn.ReturnSealPreCommit1), - SealPreCommit2: rfunc(storiface.WorkerReturn.ReturnSealPreCommit2), - SealCommit1: rfunc(storiface.WorkerReturn.ReturnSealCommit1), - SealCommit2: rfunc(storiface.WorkerReturn.ReturnSealCommit2), - FinalizeSector: rfunc(storiface.WorkerReturn.ReturnFinalizeSector), - ReleaseUnsealed: rfunc(storiface.WorkerReturn.ReturnReleaseUnsealed), - ReplicaUpdate: rfunc(storiface.WorkerReturn.ReturnReplicaUpdate), - ProveReplicaUpdate1: rfunc(storiface.WorkerReturn.ReturnProveReplicaUpdate1), - ProveReplicaUpdate2: rfunc(storiface.WorkerReturn.ReturnProveReplicaUpdate2), - GenerateSectorKey: rfunc(storiface.WorkerReturn.ReturnGenerateSectorKeyFromData), - MoveStorage: rfunc(storiface.WorkerReturn.ReturnMoveStorage), - UnsealPiece: rfunc(storiface.WorkerReturn.ReturnUnsealPiece), - Fetch: rfunc(storiface.WorkerReturn.ReturnFetch), + AddPiece: rfunc(storiface.WorkerReturn.ReturnAddPiece), + SealPreCommit1: rfunc(storiface.WorkerReturn.ReturnSealPreCommit1), + SealPreCommit2: rfunc(storiface.WorkerReturn.ReturnSealPreCommit2), + SealCommit1: rfunc(storiface.WorkerReturn.ReturnSealCommit1), + SealCommit2: rfunc(storiface.WorkerReturn.ReturnSealCommit2), + FinalizeSector: rfunc(storiface.WorkerReturn.ReturnFinalizeSector), + ReleaseUnsealed: rfunc(storiface.WorkerReturn.ReturnReleaseUnsealed), + ReplicaUpdate: rfunc(storiface.WorkerReturn.ReturnReplicaUpdate), + ProveReplicaUpdate1: rfunc(storiface.WorkerReturn.ReturnProveReplicaUpdate1), + ProveReplicaUpdate2: rfunc(storiface.WorkerReturn.ReturnProveReplicaUpdate2), + GenerateSectorKey: rfunc(storiface.WorkerReturn.ReturnGenerateSectorKeyFromData), + FinalizeReplicaUpdate: rfunc(storiface.WorkerReturn.ReturnFinalizeReplicaUpdate), + MoveStorage: rfunc(storiface.WorkerReturn.ReturnMoveStorage), + UnsealPiece: rfunc(storiface.WorkerReturn.ReturnUnsealPiece), + Fetch: rfunc(storiface.WorkerReturn.ReturnFetch), } func (l *LocalWorker) asyncCall(ctx context.Context, sector storage.SectorRef, rt ReturnType, work func(ctx context.Context, ci storiface.CallID) (interface{}, error)) (storiface.CallID, error) { diff --git a/extern/sector-storage/worker_tracked.go b/extern/sector-storage/worker_tracked.go index a1c6474224b..91da0fee590 100644 --- a/extern/sector-storage/worker_tracked.go +++ b/extern/sector-storage/worker_tracked.go @@ -215,4 +215,8 @@ func (t *trackedWorker) ProveReplicaUpdate2(ctx context.Context, sector storage. }) } +func (t *trackedWorker) FinalizeReplicaUpdate(ctx context.Context, sector storage.SectorRef, keepUnsealed []storage.Range) (storiface.CallID, error) { + return t.tracker.track(ctx, t.execute, t.wid, t.workerInfo, sector, sealtasks.TTFinalizeReplicaUpdate, func() (storiface.CallID, error) { return t.Worker.FinalizeReplicaUpdate(ctx, sector, keepUnsealed) }) +} + var _ Worker = &trackedWorker{} diff --git a/itests/kit/rpc.go b/itests/kit/rpc.go index 55521fb66ed..61c8a7b2330 100644 --- a/itests/kit/rpc.go +++ b/itests/kit/rpc.go @@ -56,7 +56,7 @@ func minerRpc(t *testing.T, m *TestMiner) *TestMiner { srv, maddr := CreateRPCServer(t, handler, m.RemoteListener) fmt.Printf("creating RPC server for %s at %s\n", m.ActorAddr, srv.Listener.Addr().String()) - fmt.Printf("SP RPC ENV FOR CLI DEBUGGING `export STORAGE_API_INFO=%s`\n", "ws://"+srv.Listener.Addr().String()) + fmt.Printf("SP RPC ENV FOR CLI DEBUGGING `export MINER_API_INFO=%s`\n", "ws://"+srv.Listener.Addr().String()) url := "ws://" + srv.Listener.Addr().String() + "/rpc/v0" cl, stop, err := client.NewStorageMinerRPCV0(context.Background(), url, nil) From 4ad97f6a36496598e764c9818de8fb4ac6a0f8eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 8 Feb 2022 15:29:30 +0100 Subject: [PATCH 326/393] make gen --- build/openrpc/full.json.gz | Bin 26596 -> 26595 bytes build/openrpc/miner.json.gz | Bin 12787 -> 12837 bytes build/openrpc/worker.json.gz | Bin 3962 -> 3963 bytes documentation/en/api-v0-methods-miner.md | 25 +++++++++++++++++++++++ itests/ccupgrade_test.go | 5 +++++ itests/kit/node_miner.go | 6 ++++-- 6 files changed, 34 insertions(+), 2 deletions(-) diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 2bf4bcf6168f3918d6cf7982ce9550d42502eb26..9ce70f34d872bf52fc3667414098844610ad4f82 100644 GIT binary patch delta 25369 zcmb4~Q+Q=v)TLwFI8nt(#kOtRwv7|pwo|cfo0W=fyJB{IfA>XSc3#FLjyk%kz~b$myJvt$dx zd;J{H3@}To%vM=~?5$4)>_|5&-<9dMDl=q60mUv5qX|aHFiYq&g*dVxW30#0U!{-Q z6Zw^oI$Ku@7S(j-O>ujx_?LEe@x#W5B-q7nSvqO>bHL$mjXIMS%?G$YQ)dG;_2~?F z>Z^MQUK(qvXRX6)`C2nBGB-f z$_&E{`z`v>*+9spJK*v9n325vK_hD^K7#Iq(_$mziwpxNFbtXEPa+&UU^vwE9f=Nz z%M~~73xS2lDxUy|XJ7lib-RoW2`WK=AKv$poqE~Q1xkJRXROF2L-q!BuD*H8gc@Hj z9qZ*(9|Z3sYQ#K*ScKYis1t>FpDlMtCXkw^&q z<%A-mSM6lX2+ch!;^{l8F~TcI*&=&C6Ly5!PoVjd5zLn&#S)63qom(qASDOO`>q6Us!EfaUOKuDC{n$828pX53�v`VO`t-^=m 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

mN-=!#l3 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 z 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 DxOMj! literal 12787 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 F0sv?}0hs^* diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index e1499549e458313246cb81d2ae5b31f55056cb67..c3d282151f2f3a0727ab96bf722a6ace3571de91 100644 GIT binary patch literal 3963 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 V#o}i1{{a91|NlMbCS(TY002`~%Ps%_ literal 3962 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 Uyj}i(00030|2QrmiU#HY0D|M 0 { tm.FlushSealingBatches(ctx) @@ -105,9 +108,8 @@ func (tm *TestMiner) PledgeSectors(ctx context.Context, n, existing int, blockNo } build.Clock.Sleep(100 * time.Millisecond) - fmt.Printf("WaitSeal: %d %+v\n", len(toCheck), states) + fmt.Printf("WaitSectorsProving: %d %+v\n", len(toCheck), states) } - } func (tm *TestMiner) StartPledge(ctx context.Context, n, existing int, blockNotif <-chan struct{}) map[abi.SectorNumber]struct{} { From c8e03412487a8afb14f5db9d4983db38a7035803 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 8 Feb 2022 17:03:51 +0100 Subject: [PATCH 327/393] Fix missing FinalizeReplicaUpdate in tests --- extern/sector-storage/sched_test.go | 4 ++++ extern/sector-storage/teststorage_test.go | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/extern/sector-storage/sched_test.go b/extern/sector-storage/sched_test.go index 4042f39054b..10d182973c8 100644 --- a/extern/sector-storage/sched_test.go +++ b/extern/sector-storage/sched_test.go @@ -119,6 +119,10 @@ func (s *schedTestWorker) GenerateSectorKeyFromData(ctx context.Context, sector panic("implement me") } +func (s *schedTestWorker) FinalizeReplicaUpdate(ctx context.Context, sector storage.SectorRef, keepUnsealed []storage.Range) (storiface.CallID, error) { + panic("implement me") +} + func (s *schedTestWorker) MoveStorage(ctx context.Context, sector storage.SectorRef, types storiface.SectorFileType) (storiface.CallID, error) { panic("implement me") } diff --git a/extern/sector-storage/teststorage_test.go b/extern/sector-storage/teststorage_test.go index cb15184be04..6c6eef0a6db 100644 --- a/extern/sector-storage/teststorage_test.go +++ b/extern/sector-storage/teststorage_test.go @@ -87,6 +87,10 @@ func (t *testExec) GenerateSectorKeyFromData(ctx context.Context, sector storage panic("implement me") } +func (t *testExec) FinalizeReplicaUpdate(ctx context.Context, sector storage.SectorRef, keepUnsealed []storage.Range) error { + panic("implement me") +} + func (t *testExec) NewSector(ctx context.Context, sector storage.SectorRef) error { panic("implement me") } From 6123339baff58913be3124d6216fef1ef3a593af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 8 Feb 2022 17:45:26 +0100 Subject: [PATCH 328/393] Make FinalizeReplicaUpdate actually do cleanup --- extern/sector-storage/ffiwrapper/sealer_cgo.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/extern/sector-storage/ffiwrapper/sealer_cgo.go b/extern/sector-storage/ffiwrapper/sealer_cgo.go index 5b7f2acc52a..01b40a869a5 100644 --- a/extern/sector-storage/ffiwrapper/sealer_cgo.go +++ b/extern/sector-storage/ffiwrapper/sealer_cgo.go @@ -13,6 +13,7 @@ import ( "io" "math/bits" "os" + "path/filepath" "runtime" "github.com/ipfs/go-cid" @@ -885,8 +886,8 @@ func (sb *Sealer) FinalizeReplicaUpdate(ctx context.Context, sector storage.Sect } defer done() - if err := ffi.ClearCache(uint64(ssize), paths.UpdateCache); err != nil { - return xerrors.Errorf("clear cache: %w", err) + if err := os.Remove(filepath.Join(paths.UpdateCache, "sc-02-data-tree-d.dat")); err != nil { + return xerrors.Errorf("clear update cache: %w", err) } } From 316836f43b3b6320399efc04e2c16ec1f1fc0004 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 8 Feb 2022 12:00:55 -0500 Subject: [PATCH 329/393] deps: update go-paramfetch to v0.0.4 --- go.mod | 2 +- go.sum | 4 ++-- testplans/lotus-soup/go.sum | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 2ad4bfdce1a..0a2c4b83441 100644 --- a/go.mod +++ b/go.mod @@ -39,7 +39,7 @@ require ( github.com/filecoin-project/go-fil-markets v1.19.0 github.com/filecoin-project/go-jsonrpc v0.1.5 github.com/filecoin-project/go-padreader v0.0.1 - github.com/filecoin-project/go-paramfetch v0.0.3-0.20220111000201-e42866db1a53 + github.com/filecoin-project/go-paramfetch v0.0.4 github.com/filecoin-project/go-state-types v0.1.3 github.com/filecoin-project/go-statemachine v1.0.1 github.com/filecoin-project/go-statestore v0.2.0 diff --git a/go.sum b/go.sum index bb6a3f92d8d..bef9c9250d7 100644 --- a/go.sum +++ b/go.sum @@ -342,8 +342,8 @@ github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20/go.m github.com/filecoin-project/go-padreader v0.0.0-20210723183308-812a16dc01b1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= github.com/filecoin-project/go-padreader v0.0.1 h1:8h2tVy5HpoNbr2gBRr+WD6zV6VD6XHig+ynSGJg8ZOs= github.com/filecoin-project/go-padreader v0.0.1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= -github.com/filecoin-project/go-paramfetch v0.0.3-0.20220111000201-e42866db1a53 h1:+nripp+UI/rhl01w9Gs4V0XDGaVPYPMGU/D/gNVLue0= -github.com/filecoin-project/go-paramfetch v0.0.3-0.20220111000201-e42866db1a53/go.mod h1:1FH85P8U+DUEmWk1Jkw3Bw7FrwTVUNHk/95PSPG+dts= +github.com/filecoin-project/go-paramfetch v0.0.4 h1:H+Me8EL8T5+79z/KHYQQcT8NVOzYVqXIi7nhb48tdm8= +github.com/filecoin-project/go-paramfetch v0.0.4/go.mod h1:1FH85P8U+DUEmWk1Jkw3Bw7FrwTVUNHk/95PSPG+dts= github.com/filecoin-project/go-state-types v0.0.0-20200903145444-247639ffa6ad/go.mod h1:IQ0MBPnonv35CJHtWSN3YY1Hz2gkPru1Q9qoaYLxx9I= 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= diff --git a/testplans/lotus-soup/go.sum b/testplans/lotus-soup/go.sum index 4ec1a8316f7..090c0f7e4cb 100644 --- a/testplans/lotus-soup/go.sum +++ b/testplans/lotus-soup/go.sum @@ -433,8 +433,8 @@ github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20/go.m github.com/filecoin-project/go-padreader v0.0.0-20210723183308-812a16dc01b1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= github.com/filecoin-project/go-padreader v0.0.1 h1:8h2tVy5HpoNbr2gBRr+WD6zV6VD6XHig+ynSGJg8ZOs= github.com/filecoin-project/go-padreader v0.0.1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= -github.com/filecoin-project/go-paramfetch v0.0.3-0.20220111000201-e42866db1a53 h1:+nripp+UI/rhl01w9Gs4V0XDGaVPYPMGU/D/gNVLue0= -github.com/filecoin-project/go-paramfetch v0.0.3-0.20220111000201-e42866db1a53/go.mod h1:1FH85P8U+DUEmWk1Jkw3Bw7FrwTVUNHk/95PSPG+dts= +github.com/filecoin-project/go-paramfetch v0.0.4 h1:H+Me8EL8T5+79z/KHYQQcT8NVOzYVqXIi7nhb48tdm8= +github.com/filecoin-project/go-paramfetch v0.0.4/go.mod h1:1FH85P8U+DUEmWk1Jkw3Bw7FrwTVUNHk/95PSPG+dts= github.com/filecoin-project/go-state-types v0.0.0-20200903145444-247639ffa6ad/go.mod h1:IQ0MBPnonv35CJHtWSN3YY1Hz2gkPru1Q9qoaYLxx9I= 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= From b6c141c05960773c8f449181838877262150d33a Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 8 Feb 2022 12:06:33 -0500 Subject: [PATCH 330/393] nit: edit a comment --- extern/storage-sealing/upgrade_queue.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extern/storage-sealing/upgrade_queue.go b/extern/storage-sealing/upgrade_queue.go index 343d6ca9554..86083930d6a 100644 --- a/extern/storage-sealing/upgrade_queue.go +++ b/extern/storage-sealing/upgrade_queue.go @@ -108,7 +108,7 @@ func sectorActive(ctx context.Context, api SealingAPI, maddr address.Address, to if err != nil { return false, xerrors.Errorf("failed to check active sectors: %w", err) } - // Ensure the upgraded sector is active + // Check if sector is among active sectors var found bool for _, si := range active { if si.SectorNumber == sector { From 1af8987c7968d862dcf5a0653ade2d4967330b62 Mon Sep 17 00:00:00 2001 From: zenground0 Date: Sun, 9 Jan 2022 15:53:02 +0530 Subject: [PATCH 331/393] StartEpochSealingBuffer triggers packing on timer --- extern/storage-sealing/input.go | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/extern/storage-sealing/input.go b/extern/storage-sealing/input.go index f3259f0cced..910db382b7d 100644 --- a/extern/storage-sealing/input.go +++ b/extern/storage-sealing/input.go @@ -16,6 +16,7 @@ import ( "github.com/filecoin-project/specs-storage/storage" "github.com/filecoin-project/lotus/api" + "github.com/filecoin-project/lotus/build" sectorstorage "github.com/filecoin-project/lotus/extern/sector-storage" "github.com/filecoin-project/lotus/extern/sector-storage/ffiwrapper" "github.com/filecoin-project/lotus/extern/storage-sealing/sealiface" @@ -117,9 +118,29 @@ func (m *Sealing) maybeStartSealing(ctx statemachine.Context, sector SectorInfo, return false, xerrors.Errorf("getting storage config: %w", err) } - // todo check deal age, start sealing if any deal has less than X (configurable) to start deadline sealTime := time.Unix(sector.CreationTime, 0).Add(cfg.WaitDealsDelay) + // check deal age, start sealing when the deal closest to starting is within slack time + safeSealTime := sealTime + _, current, err := m.Api.ChainHead(ctx.Context()) + blockTime := time.Second * time.Duration(build.BlockDelaySecs) + if err != nil { + return false, xerrors.Errorf("API error getting head: %w", err) + } + for _, piece := range sector.Pieces { + if piece.DealInfo == nil { // skip padding + continue + } + dealSafeSealEpoch := piece.DealInfo.DealProposal.StartEpoch - cfg.StartEpochSealingBuffer + dealSafeSealTime := time.Now().Add(time.Duration(dealSafeSealEpoch-current) * blockTime) + if dealSafeSealTime.Before(safeSealTime) { + safeSealTime = dealSafeSealTime + } + } + + if safeSealTime.Before(sealTime) { + sealTime = safeSealTime + } if now.After(sealTime) { log.Infow("starting to seal deal sector", "sector", sector.SectorNumber, "trigger", "wait-timeout") return true, ctx.Send(SectorStartPacking{}) From 4d8b912acc25867918a293b4074be9143d1388e5 Mon Sep 17 00:00:00 2001 From: zenground0 Date: Sun, 9 Jan 2022 17:48:14 +0530 Subject: [PATCH 332/393] New config for turning off auto deal creation --- .../gomock_reflect_442895147/prog.go | 66 +++++++++++++++++++ extern/storage-sealing/input.go | 4 ++ extern/storage-sealing/sealiface/config.go | 2 + node/config/def.go | 1 + node/config/types.go | 2 + node/modules/storageminer.go | 4 +- 6 files changed, 77 insertions(+), 2 deletions(-) create mode 100644 extern/storage-sealing/gomock_reflect_442895147/prog.go diff --git a/extern/storage-sealing/gomock_reflect_442895147/prog.go b/extern/storage-sealing/gomock_reflect_442895147/prog.go new file mode 100644 index 00000000000..9ad67db0724 --- /dev/null +++ b/extern/storage-sealing/gomock_reflect_442895147/prog.go @@ -0,0 +1,66 @@ + +package main + +import ( + "encoding/gob" + "flag" + "fmt" + "os" + "path" + "reflect" + + "github.com/golang/mock/mockgen/model" + + pkg_ "github.com/filecoin-project/lotus/extern/storage-sealing" +) + +var output = flag.String("output", "", "The output file name, or empty to use stdout.") + +func main() { + flag.Parse() + + its := []struct{ + sym string + typ reflect.Type + }{ + + { "Context", reflect.TypeOf((*pkg_.Context)(nil)).Elem()}, + + } + pkg := &model.Package{ + // NOTE: This behaves contrary to documented behaviour if the + // package name is not the final component of the import path. + // The reflect package doesn't expose the package name, though. + Name: path.Base("github.com/filecoin-project/lotus/extern/storage-sealing"), + } + + for _, it := range its { + intf, err := model.InterfaceFromInterfaceType(it.typ) + if err != nil { + fmt.Fprintf(os.Stderr, "Reflection: %v\n", err) + os.Exit(1) + } + intf.Name = it.sym + pkg.Interfaces = append(pkg.Interfaces, intf) + } + + outfile := os.Stdout + if len(*output) != 0 { + var err error + outfile, err = os.Create(*output) + if err != nil { + fmt.Fprintf(os.Stderr, "failed to open output file %q", *output) + } + defer func() { + if err := outfile.Close(); err != nil { + fmt.Fprintf(os.Stderr, "failed to close output file %q", *output) + os.Exit(1) + } + }() + } + + if err := gob.NewEncoder(outfile).Encode(pkg); err != nil { + fmt.Fprintf(os.Stderr, "gob encode: %v\n", err) + os.Exit(1) + } +} diff --git a/extern/storage-sealing/input.go b/extern/storage-sealing/input.go index 910db382b7d..a7428ad073c 100644 --- a/extern/storage-sealing/input.go +++ b/extern/storage-sealing/input.go @@ -496,6 +496,10 @@ func (m *Sealing) tryCreateDealSector(ctx context.Context, sp abi.RegisteredSeal return xerrors.Errorf("getting storage config: %w", err) } + if !cfg.MakeNewSectorForDeals { + return nil + } + if cfg.MaxSealingSectorsForDeals > 0 && m.stats.curSealing() >= cfg.MaxSealingSectorsForDeals { return nil } diff --git a/extern/storage-sealing/sealiface/config.go b/extern/storage-sealing/sealiface/config.go index d8a12283cdc..852034aa7fb 100644 --- a/extern/storage-sealing/sealiface/config.go +++ b/extern/storage-sealing/sealiface/config.go @@ -18,6 +18,8 @@ type Config struct { // includes failed, 0 = no limit MaxSealingSectorsForDeals uint64 + MakeNewSectorForDeals bool + WaitDealsDelay time.Duration CommittedCapacitySectorLifetime time.Duration diff --git a/node/config/def.go b/node/config/def.go index 644c28bea69..eded665fff8 100644 --- a/node/config/def.go +++ b/node/config/def.go @@ -156,6 +156,7 @@ func DefaultStorageMiner() *StorageMiner { ConsiderVerifiedStorageDeals: true, ConsiderUnverifiedStorageDeals: true, PieceCidBlocklist: []cid.Cid{}, + MakeNewSectorForDeals: true, // TODO: It'd be nice to set this based on sector size MaxDealStartDelay: Duration(time.Hour * 24 * 14), ExpectedSealDuration: Duration(time.Hour * 24), diff --git a/node/config/types.go b/node/config/types.go index 715f4824861..db38ccd2327 100644 --- a/node/config/types.go +++ b/node/config/types.go @@ -120,6 +120,8 @@ type DealmakingConfig struct { // This includes the time the deal will need to get transferred and published // before being assigned to a sector ExpectedSealDuration Duration + // Whether new sectors are sealed to pack incoming deals + MakeNewSectorForDeals bool // Maximum amount of time proposed deal StartEpoch can be in future MaxDealStartDelay Duration // When a deal is ready to publish, the amount of time to wait for more diff --git a/node/modules/storageminer.go b/node/modules/storageminer.go index da1a016f77e..acae45e9063 100644 --- a/node/modules/storageminer.go +++ b/node/modules/storageminer.go @@ -925,6 +925,8 @@ func ToSealingConfig(cfg *config.StorageMiner) sealiface.Config { MaxWaitDealsSectors: cfg.Sealing.MaxWaitDealsSectors, MaxSealingSectors: cfg.Sealing.MaxSealingSectors, MaxSealingSectorsForDeals: cfg.Sealing.MaxSealingSectorsForDeals, + StartEpochSealingBuffer: abi.ChainEpoch(cfg.Dealmaking.StartEpochSealingBuffer), + MakeNewSectorForDeals: true, CommittedCapacitySectorLifetime: time.Duration(cfg.Sealing.CommittedCapacitySectorLifetime), WaitDealsDelay: time.Duration(cfg.Sealing.WaitDealsDelay), AlwaysKeepUnsealedCopy: cfg.Sealing.AlwaysKeepUnsealedCopy, @@ -950,8 +952,6 @@ func ToSealingConfig(cfg *config.StorageMiner) sealiface.Config { TerminateBatchMax: cfg.Sealing.TerminateBatchMax, TerminateBatchMin: cfg.Sealing.TerminateBatchMin, TerminateBatchWait: time.Duration(cfg.Sealing.TerminateBatchWait), - - StartEpochSealingBuffer: abi.ChainEpoch(cfg.Dealmaking.StartEpochSealingBuffer), } } From a19c0a82559557d97bcbd69576c848092d3fbd84 Mon Sep 17 00:00:00 2001 From: zenground0 Date: Mon, 10 Jan 2022 15:53:25 +0530 Subject: [PATCH 333/393] Remove extra file --- .../gomock_reflect_442895147/prog.go | 66 ------------------- 1 file changed, 66 deletions(-) delete mode 100644 extern/storage-sealing/gomock_reflect_442895147/prog.go diff --git a/extern/storage-sealing/gomock_reflect_442895147/prog.go b/extern/storage-sealing/gomock_reflect_442895147/prog.go deleted file mode 100644 index 9ad67db0724..00000000000 --- a/extern/storage-sealing/gomock_reflect_442895147/prog.go +++ /dev/null @@ -1,66 +0,0 @@ - -package main - -import ( - "encoding/gob" - "flag" - "fmt" - "os" - "path" - "reflect" - - "github.com/golang/mock/mockgen/model" - - pkg_ "github.com/filecoin-project/lotus/extern/storage-sealing" -) - -var output = flag.String("output", "", "The output file name, or empty to use stdout.") - -func main() { - flag.Parse() - - its := []struct{ - sym string - typ reflect.Type - }{ - - { "Context", reflect.TypeOf((*pkg_.Context)(nil)).Elem()}, - - } - pkg := &model.Package{ - // NOTE: This behaves contrary to documented behaviour if the - // package name is not the final component of the import path. - // The reflect package doesn't expose the package name, though. - Name: path.Base("github.com/filecoin-project/lotus/extern/storage-sealing"), - } - - for _, it := range its { - intf, err := model.InterfaceFromInterfaceType(it.typ) - if err != nil { - fmt.Fprintf(os.Stderr, "Reflection: %v\n", err) - os.Exit(1) - } - intf.Name = it.sym - pkg.Interfaces = append(pkg.Interfaces, intf) - } - - outfile := os.Stdout - if len(*output) != 0 { - var err error - outfile, err = os.Create(*output) - if err != nil { - fmt.Fprintf(os.Stderr, "failed to open output file %q", *output) - } - defer func() { - if err := outfile.Close(); err != nil { - fmt.Fprintf(os.Stderr, "failed to close output file %q", *output) - os.Exit(1) - } - }() - } - - if err := gob.NewEncoder(outfile).Encode(pkg); err != nil { - fmt.Fprintf(os.Stderr, "gob encode: %v\n", err) - os.Exit(1) - } -} From 2aa5911fb93f3236d4bbe069dcf3ebd3dcd65626 Mon Sep 17 00:00:00 2001 From: zenground0 Date: Mon, 10 Jan 2022 16:03:27 +0530 Subject: [PATCH 334/393] config gen --- node/config/doc_gen.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/node/config/doc_gen.go b/node/config/doc_gen.go index c3730cbace6..a0ead4532b6 100644 --- a/node/config/doc_gen.go +++ b/node/config/doc_gen.go @@ -240,6 +240,12 @@ Default value: 1 minute.`, This includes the time the deal will need to get transferred and published before being assigned to a sector`, }, + { + Name: "MakeNewSectorForDeals", + Type: "bool", + + Comment: `Whether new sectors are sealed to pack incoming deals`, + }, { Name: "MaxDealStartDelay", Type: "Duration", From 5a09b6496da48b627f88859bbf7613d2d93f8644 Mon Sep 17 00:00:00 2001 From: zenground0 Date: Mon, 10 Jan 2022 16:31:58 +0530 Subject: [PATCH 335/393] Actually read config value --- node/modules/storageminer.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/node/modules/storageminer.go b/node/modules/storageminer.go index acae45e9063..f4a2364fd56 100644 --- a/node/modules/storageminer.go +++ b/node/modules/storageminer.go @@ -926,7 +926,7 @@ func ToSealingConfig(cfg *config.StorageMiner) sealiface.Config { MaxSealingSectors: cfg.Sealing.MaxSealingSectors, MaxSealingSectorsForDeals: cfg.Sealing.MaxSealingSectorsForDeals, StartEpochSealingBuffer: abi.ChainEpoch(cfg.Dealmaking.StartEpochSealingBuffer), - MakeNewSectorForDeals: true, + MakeNewSectorForDeals: cfg.Dealmaking.MakeNewSectorForDeals, CommittedCapacitySectorLifetime: time.Duration(cfg.Sealing.CommittedCapacitySectorLifetime), WaitDealsDelay: time.Duration(cfg.Sealing.WaitDealsDelay), AlwaysKeepUnsealedCopy: cfg.Sealing.AlwaysKeepUnsealedCopy, From 1e524b721056a69982f7e5ce3cb16e56c3b15368 Mon Sep 17 00:00:00 2001 From: zenground0 Date: Tue, 8 Feb 2022 12:39:18 -0500 Subject: [PATCH 336/393] Review Response --- extern/storage-sealing/input.go | 10 +++------- node/config/types.go | 4 +++- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/extern/storage-sealing/input.go b/extern/storage-sealing/input.go index a7428ad073c..199892ca8f1 100644 --- a/extern/storage-sealing/input.go +++ b/extern/storage-sealing/input.go @@ -121,26 +121,22 @@ func (m *Sealing) maybeStartSealing(ctx statemachine.Context, sector SectorInfo, sealTime := time.Unix(sector.CreationTime, 0).Add(cfg.WaitDealsDelay) // check deal age, start sealing when the deal closest to starting is within slack time - safeSealTime := sealTime _, current, err := m.Api.ChainHead(ctx.Context()) blockTime := time.Second * time.Duration(build.BlockDelaySecs) if err != nil { return false, xerrors.Errorf("API error getting head: %w", err) } for _, piece := range sector.Pieces { - if piece.DealInfo == nil { // skip padding + if piece.DealInfo == nil { continue } dealSafeSealEpoch := piece.DealInfo.DealProposal.StartEpoch - cfg.StartEpochSealingBuffer dealSafeSealTime := time.Now().Add(time.Duration(dealSafeSealEpoch-current) * blockTime) - if dealSafeSealTime.Before(safeSealTime) { - safeSealTime = dealSafeSealTime + if dealSafeSealTime.Before(sealTime) { + sealTime = dealSafeSealTime } } - if safeSealTime.Before(sealTime) { - sealTime = safeSealTime - } if now.After(sealTime) { log.Infow("starting to seal deal sector", "sector", sector.SectorNumber, "trigger", "wait-timeout") return true, ctx.Send(SectorStartPacking{}) diff --git a/node/config/types.go b/node/config/types.go index db38ccd2327..a03e3d3eade 100644 --- a/node/config/types.go +++ b/node/config/types.go @@ -120,7 +120,9 @@ type DealmakingConfig struct { // This includes the time the deal will need to get transferred and published // before being assigned to a sector ExpectedSealDuration Duration - // Whether new sectors are sealed to pack incoming deals + // Whether new sectors are created to pack incoming deals + // When this is set to false no new sectors will be created for sealing incoming deals + // This is useful for forcing all deals to be assigned as snap deals to sectors marked for upgrade MakeNewSectorForDeals bool // Maximum amount of time proposed deal StartEpoch can be in future MaxDealStartDelay Duration From e32704e7f6ab2cd3d97579d570e8c460638c7266 Mon Sep 17 00:00:00 2001 From: zenground0 Date: Tue, 8 Feb 2022 12:56:32 -0500 Subject: [PATCH 337/393] Update node doc gen --- node/config/doc_gen.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/node/config/doc_gen.go b/node/config/doc_gen.go index a0ead4532b6..79fcf7e43c6 100644 --- a/node/config/doc_gen.go +++ b/node/config/doc_gen.go @@ -244,7 +244,9 @@ before being assigned to a sector`, Name: "MakeNewSectorForDeals", Type: "bool", - Comment: `Whether new sectors are sealed to pack incoming deals`, + Comment: `Whether new sectors are created to pack incoming deals +When this is set to false no new sectors will be created for sealing incoming deals +This is useful for forcing all deals to be assigned as snap deals to sectors marked for upgrade`, }, { Name: "MaxDealStartDelay", From 485568d4609429d85a00d0ae597681b8a85ec9a9 Mon Sep 17 00:00:00 2001 From: zenground0 Date: Tue, 8 Feb 2022 13:52:24 -0500 Subject: [PATCH 338/393] make docsgen-cli --- documentation/en/default-lotus-miner-config.toml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/documentation/en/default-lotus-miner-config.toml b/documentation/en/default-lotus-miner-config.toml index 47ac9f1e7ed..d8c774c7589 100644 --- a/documentation/en/default-lotus-miner-config.toml +++ b/documentation/en/default-lotus-miner-config.toml @@ -167,6 +167,14 @@ # env var: LOTUS_DEALMAKING_EXPECTEDSEALDURATION #ExpectedSealDuration = "24h0m0s" + # Whether new sectors are created to pack incoming deals + # When this is set to false no new sectors will be created for sealing incoming deals + # This is useful for forcing all deals to be assigned as snap deals to sectors marked for upgrade + # + # type: bool + # env var: LOTUS_DEALMAKING_MAKENEWSECTORFORDEALS + #MakeNewSectorForDeals = true + # Maximum amount of time proposed deal StartEpoch can be in future # # type: Duration From 67e3f182f5b1d56a8972c559b56b803d958692ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 9 Feb 2022 11:28:37 +0100 Subject: [PATCH 339/393] Use tagged specs-storage --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 2b8bd6645ab..76ba9f283c2 100644 --- a/go.mod +++ b/go.mod @@ -51,7 +51,7 @@ require ( github.com/filecoin-project/specs-actors/v5 v5.0.4 github.com/filecoin-project/specs-actors/v6 v6.0.1 github.com/filecoin-project/specs-actors/v7 v7.0.0-rc1 - github.com/filecoin-project/specs-storage v0.1.1-0.20220202201749-ae62d2332aa8 + github.com/filecoin-project/specs-storage v0.2.0 github.com/filecoin-project/test-vectors/schema v0.0.5 github.com/gbrlsnchs/jwt/v3 v3.0.1 github.com/gdamore/tcell/v2 v2.2.0 diff --git a/go.sum b/go.sum index c42f248948b..a3136319acd 100644 --- a/go.sum +++ b/go.sum @@ -382,8 +382,8 @@ github.com/filecoin-project/specs-actors/v7 v7.0.0-20211117170924-fd07a4c7dff9/g github.com/filecoin-project/specs-actors/v7 v7.0.0-20211222192039-c83bea50c402/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= github.com/filecoin-project/specs-actors/v7 v7.0.0-rc1 h1:FuDaXIbcw2hRsFI8SDTmsGGCE+NumpF6aiBoU/2X5W4= github.com/filecoin-project/specs-actors/v7 v7.0.0-rc1/go.mod h1:TA5FwCna+Yi36POaT7SLKXsgEDvJwc0V/L6ZsO19B9M= -github.com/filecoin-project/specs-storage v0.1.1-0.20220202201749-ae62d2332aa8 h1:lHg1G44FX6LNuIcGJWE6ty4dH+WoFIA2UIfGGV06Hpg= -github.com/filecoin-project/specs-storage v0.1.1-0.20220202201749-ae62d2332aa8/go.mod h1:Tb88Zq+IBJbvAn3mS89GYj3jdRThBTE/771HCVZdRJU= +github.com/filecoin-project/specs-storage v0.2.0 h1:Y4UDv0apRQ3zI2GiPPubi8JblpUZZphEdaJUxCutfyg= +github.com/filecoin-project/specs-storage v0.2.0/go.mod h1:Tb88Zq+IBJbvAn3mS89GYj3jdRThBTE/771HCVZdRJU= 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= From 947000c94f8180bef7281617b2ae89a077e3382d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 9 Feb 2022 12:41:39 +0100 Subject: [PATCH 340/393] fsm: Call ReleaseSectorKey after WinningPoSt lookback period --- cmd/lotus-miner/info.go | 3 + extern/storage-sealing/fsm.go | 18 ++++- extern/storage-sealing/fsm_events.go | 15 ++++ extern/storage-sealing/sector_state.go | 8 ++- extern/storage-sealing/states_failed.go | 10 +++ .../storage-sealing/states_replica_update.go | 72 +++++++++++++++++++ 6 files changed, 124 insertions(+), 2 deletions(-) diff --git a/cmd/lotus-miner/info.go b/cmd/lotus-miner/info.go index 39de942aa28..1133908cab9 100644 --- a/cmd/lotus-miner/info.go +++ b/cmd/lotus-miner/info.go @@ -466,6 +466,7 @@ var stateOrder = map[sealing.SectorState]stateMeta{} var stateList = []stateMeta{ {col: 39, state: "Total"}, {col: color.FgGreen, state: sealing.Proving}, + {col: color.FgGreen, state: sealing.UpdateActivating}, {col: color.FgBlue, state: sealing.Empty}, {col: color.FgBlue, state: sealing.WaitDeals}, @@ -496,6 +497,7 @@ var stateList = []stateMeta{ {col: color.FgYellow, state: sealing.SubmitReplicaUpdate}, {col: color.FgYellow, state: sealing.ReplicaUpdateWait}, {col: color.FgYellow, state: sealing.FinalizeReplicaUpdate}, + {col: color.FgYellow, state: sealing.ReleaseSectorKey}, {col: color.FgCyan, state: sealing.Terminating}, {col: color.FgCyan, state: sealing.TerminateWait}, @@ -524,6 +526,7 @@ var stateList = []stateMeta{ {col: color.FgRed, state: sealing.SnapDealsAddPieceFailed}, {col: color.FgRed, state: sealing.SnapDealsDealsExpired}, {col: color.FgRed, state: sealing.ReplicaUpdateFailed}, + {col: color.FgRed, state: sealing.ReleaseSectorKeyFailed}, } func init() { diff --git a/extern/storage-sealing/fsm.go b/extern/storage-sealing/fsm.go index 83874e907de..35965e8a231 100644 --- a/extern/storage-sealing/fsm.go +++ b/extern/storage-sealing/fsm.go @@ -169,7 +169,14 @@ var fsmPlanners = map[SectorState]func(events []statemachine.Event, state *Secto on(SectorAbortUpgrade{}, AbortUpgrade), ), FinalizeReplicaUpdate: planOne( - on(SectorFinalized{}, Proving), + on(SectorFinalized{}, UpdateActivating), + ), + UpdateActivating: planOne( + on(SectorUpdateActive{}, ReleaseSectorKey), + ), + ReleaseSectorKey: planOne( + on(SectorKeyReleased{}, Proving), + on(SectorReleaseKeyFailed{}, ReleaseSectorKeyFailed), ), // Sealing errors @@ -250,6 +257,9 @@ var fsmPlanners = map[SectorState]func(events []statemachine.Event, state *Secto on(SectorInvalidDealIDs{}, SnapDealsRecoverDealIDs), on(SectorDealsExpired{}, SnapDealsDealsExpired), ), + ReleaseSectorKeyFailed: planOne( + on(SectorUpdateActive{}, ReleaseSectorKey), + ), // Post-seal @@ -477,6 +487,10 @@ func (m *Sealing) plan(events []statemachine.Event, state *SectorInfo) (func(sta return m.handleReplicaUpdateWait, processed, nil case FinalizeReplicaUpdate: return m.handleFinalizeReplicaUpdate, processed, nil + case UpdateActivating: + return m.handleUpdateActivating, processed, nil + case ReleaseSectorKey: + return m.handleReleaseSectorKey, processed, nil // Handled failure modes case AddPieceFailed: @@ -513,6 +527,8 @@ func (m *Sealing) plan(events []statemachine.Event, state *SectorInfo) (func(sta return m.handleSnapDealsRecoverDealIDs, processed, nil case ReplicaUpdateFailed: return m.handleSubmitReplicaUpdateFailed, processed, nil + case ReleaseSectorKeyFailed: + return m.handleReleaseSectorKeyFailed, 0, err case AbortUpgrade: return m.handleAbortUpgrade, processed, nil diff --git a/extern/storage-sealing/fsm_events.go b/extern/storage-sealing/fsm_events.go index 395c4b94a74..fc3b774f963 100644 --- a/extern/storage-sealing/fsm_events.go +++ b/extern/storage-sealing/fsm_events.go @@ -335,6 +335,14 @@ type SectorReplicaUpdateLanded struct{} func (evt SectorReplicaUpdateLanded) apply(state *SectorInfo) {} +type SectorUpdateActive struct{} + +func (evt SectorUpdateActive) apply(state *SectorInfo) {} + +type SectorKeyReleased struct{} + +func (evt SectorKeyReleased) apply(state *SectorInfo) {} + // Failed state recovery type SectorRetrySealPreCommit1 struct{} @@ -445,6 +453,13 @@ type SectorSubmitReplicaUpdateFailed struct{} func (evt SectorSubmitReplicaUpdateFailed) apply(state *SectorInfo) {} +type SectorReleaseKeyFailed struct{ error } + +func (evt SectorReleaseKeyFailed) FormatError(xerrors.Printer) (next error) { + return evt.error +} +func (evt SectorReleaseKeyFailed) apply(state *SectorInfo) {} + // Faults type SectorFaulty struct{} diff --git a/extern/storage-sealing/sector_state.go b/extern/storage-sealing/sector_state.go index ba6df7ff486..5c2c56171a5 100644 --- a/extern/storage-sealing/sector_state.go +++ b/extern/storage-sealing/sector_state.go @@ -52,11 +52,14 @@ var ExistSectorStateList = map[SectorState]struct{}{ ProveReplicaUpdate: {}, SubmitReplicaUpdate: {}, ReplicaUpdateWait: {}, + UpdateActivating: {}, + ReleaseSectorKey: {}, FinalizeReplicaUpdate: {}, SnapDealsAddPieceFailed: {}, SnapDealsDealsExpired: {}, SnapDealsRecoverDealIDs: {}, ReplicaUpdateFailed: {}, + ReleaseSectorKeyFailed: {}, AbortUpgrade: {}, } @@ -104,6 +107,8 @@ const ( SubmitReplicaUpdate SectorState = "SubmitReplicaUpdate" ReplicaUpdateWait SectorState = "ReplicaUpdateWait" FinalizeReplicaUpdate SectorState = "FinalizeReplicaUpdate" + UpdateActivating SectorState = "UpdateActivating" + ReleaseSectorKey SectorState = "ReleaseSectorKey" // error modes FailedUnrecoverable SectorState = "FailedUnrecoverable" @@ -124,6 +129,7 @@ const ( SnapDealsRecoverDealIDs SectorState = "SnapDealsRecoverDealIDs" AbortUpgrade SectorState = "AbortUpgrade" ReplicaUpdateFailed SectorState = "ReplicaUpdateFailed" + ReleaseSectorKeyFailed SectorState = "ReleaseSectorKeyFailed" Faulty SectorState = "Faulty" // sector is corrupted or gone for some reason FaultReported SectorState = "FaultReported" // sector has been declared as a fault on chain @@ -153,7 +159,7 @@ func toStatState(st SectorState, finEarly bool) statSectorState { return sstProving } return sstSealing - case Proving, Removed, Removing, Terminating, TerminateWait, TerminateFinality, TerminateFailed: + case Proving, UpdateActivating, ReleaseSectorKey, Removed, Removing, Terminating, TerminateWait, TerminateFinality, TerminateFailed: return sstProving } diff --git a/extern/storage-sealing/states_failed.go b/extern/storage-sealing/states_failed.go index c32ac4c3a9f..5ed1f38cb91 100644 --- a/extern/storage-sealing/states_failed.go +++ b/extern/storage-sealing/states_failed.go @@ -244,6 +244,16 @@ func (m *Sealing) handleSubmitReplicaUpdateFailed(ctx statemachine.Context, sect return ctx.Send(SectorRetrySubmitReplicaUpdate{}) } +func (m *Sealing) handleReleaseSectorKeyFailed(ctx statemachine.Context, sector SectorInfo) error { + // not much we can do, wait for a bit and try again + + if err := failedCooldown(ctx, sector); err != nil { + return err + } + + return ctx.Send(SectorUpdateActive{}) +} + func (m *Sealing) handleCommitFailed(ctx statemachine.Context, sector SectorInfo) error { tok, _, err := m.Api.ChainHead(ctx.Context()) if err != nil { diff --git a/extern/storage-sealing/states_replica_update.go b/extern/storage-sealing/states_replica_update.go index 39565b2536e..b7e433e44a8 100644 --- a/extern/storage-sealing/states_replica_update.go +++ b/extern/storage-sealing/states_replica_update.go @@ -2,12 +2,15 @@ package sealing import ( "bytes" + "context" + "time" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-state-types/exitcode" statemachine "github.com/filecoin-project/go-statemachine" api "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/chain/actors/builtin/miner" + "github.com/filecoin-project/lotus/chain/actors/policy" "golang.org/x/xerrors" ) @@ -215,6 +218,75 @@ func (m *Sealing) handleFinalizeReplicaUpdate(ctx statemachine.Context, sector S return ctx.Send(SectorFinalized{}) } +func (m *Sealing) handleUpdateActivating(ctx statemachine.Context, sector SectorInfo) error { + try := func() error { + mw, err := m.Api.StateWaitMsg(ctx.Context(), *sector.ReplicaUpdateMessage) + if err != nil { + return err + } + + tok, height, err := m.Api.ChainHead(ctx.Context()) + if err != nil { + return err + } + + nv, err := m.Api.StateNetworkVersion(ctx.Context(), tok) + if err != nil { + return err + } + + lb := policy.GetWinningPoStSectorSetLookback(nv) + + targetHeight := mw.Height + lb + InteractivePoRepConfidence + delay := 50 * time.Millisecond + + for { + if height >= targetHeight { + break + } + + wctx, cancel := context.WithTimeout(ctx.Context(), delay) + <-wctx.Done() + cancel() + + // increasing backoff; can't just calculate the correct time because integration tests do funny things with time + delay = delay * 10 / 3 + if delay > 5*time.Minute { + delay = 5 * time.Minute + } + + _, height, err = m.Api.ChainHead(ctx.Context()) + if err != nil { + return err + } + } + + return nil + } + + for { + err := try() + if err == nil { + break + } + + log.Errorw("error in handleUpdateActivating", "error", err) + + // likely an API issue, sleep for a bit and retry + time.Sleep(time.Minute) + } + + return ctx.Send(SectorUpdateActive{}) +} + +func (m *Sealing) handleReleaseSectorKey(ctx statemachine.Context, sector SectorInfo) error { + if err := m.sealer.ReleaseSectorKey(sector.sealingCtx(ctx.Context()), m.minerSector(sector.SectorType, sector.SectorNumber)); err != nil { + return ctx.Send(SectorReleaseKeyFailed{err}) + } + + return ctx.Send(SectorKeyReleased{}) +} + func handleErrors(ctx statemachine.Context, err error, sector SectorInfo) error { switch err.(type) { case *ErrApi: From 026c51033cff76fa6939b4f70351c75dc252bef7 Mon Sep 17 00:00:00 2001 From: Rob Quist Date: Wed, 9 Feb 2022 13:34:55 +0100 Subject: [PATCH 341/393] perf: chain: Make drand logs in daemon less noisy (#7955) Makes logs less noisy --- chain/beacon/drand/drand.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/chain/beacon/drand/drand.go b/chain/beacon/drand/drand.go index 7dfd02233e1..118ab36e6c7 100644 --- a/chain/beacon/drand/drand.go +++ b/chain/beacon/drand/drand.go @@ -142,7 +142,7 @@ func (db *DrandBeacon) Entry(ctx context.Context, round uint64) <-chan beacon.Re go func() { start := build.Clock.Now() - log.Infow("start fetching randomness", "round", round) + log.Debugw("start fetching randomness", "round", round) resp, err := db.client.Get(ctx, round) var br beacon.Response @@ -152,7 +152,7 @@ func (db *DrandBeacon) Entry(ctx context.Context, round uint64) <-chan beacon.Re br.Entry.Round = resp.Round() br.Entry.Data = resp.Signature() } - log.Infow("done fetching randomness", "round", round, "took", build.Clock.Since(start)) + log.Debugw("done fetching randomness", "round", round, "took", build.Clock.Since(start)) out <- br close(out) }() From b1a74d71f17d77c7d7271717b4329ea13d6e3347 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 9 Feb 2022 14:41:36 +0100 Subject: [PATCH 342/393] Fix CheckProvable with updated sectors --- extern/sector-storage/faults.go | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/extern/sector-storage/faults.go b/extern/sector-storage/faults.go index 7fdf5c337e8..f7a764e5027 100644 --- a/extern/sector-storage/faults.go +++ b/extern/sector-storage/faults.go @@ -55,6 +55,25 @@ func (m *Manager) CheckProvable(ctx context.Context, pp abi.RegisteredPoStProof, return nil } + // temporary hack to make the check work with snapdeals + // will go away in https://github.com/filecoin-project/lotus/pull/7971 + if lp.Sealed == "" || lp.Cache == "" { + // maybe it's update + lockedUpdate, err := m.index.StorageTryLock(ctx, sector.ID, storiface.FTUpdate|storiface.FTUpdateCache, storiface.FTNone) + if err != nil { + return xerrors.Errorf("acquiring sector lock: %w", err) + } + if lockedUpdate { + lp, _, err = m.localStore.AcquireSector(ctx, sector, storiface.FTUpdate|storiface.FTUpdateCache, storiface.FTNone, storiface.PathStorage, storiface.AcquireMove) + if err != nil { + log.Warnw("CheckProvable Sector FAULT: acquire sector in checkProvable", "sector", sector, "error", err) + bad[sector.ID] = fmt.Sprintf("acquire sector failed: %s", err) + return nil + } + lp.Sealed, lp.Cache = lp.Update, lp.UpdateCache + } + } + if lp.Sealed == "" || lp.Cache == "" { log.Warnw("CheckProvable Sector FAULT: cache and/or sealed paths not found", "sector", sector, "sealed", lp.Sealed, "cache", lp.Cache) bad[sector.ID] = fmt.Sprintf("cache and/or sealed paths not found, cache %q, sealed %q", lp.Cache, lp.Sealed) From 6cb411e5bb94725c99ce7080db6809adab7cfa6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 9 Feb 2022 14:46:29 +0100 Subject: [PATCH 343/393] proofs master --- extern/filecoin-ffi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extern/filecoin-ffi b/extern/filecoin-ffi index c03fc07aadf..a6b1db270d0 160000 --- a/extern/filecoin-ffi +++ b/extern/filecoin-ffi @@ -1 +1 @@ -Subproject commit c03fc07aadf76b464644c785f59292b93542c0ee +Subproject commit a6b1db270d0175a92311c8e3e7351f37c2c160ca From f33cf74d0f4c1b2a35032991a918842c279bc87f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 9 Feb 2022 14:54:36 +0100 Subject: [PATCH 344/393] ffiwrapper: Use ClearCache for update cache cleanup --- extern/sector-storage/ffiwrapper/sealer_cgo.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/extern/sector-storage/ffiwrapper/sealer_cgo.go b/extern/sector-storage/ffiwrapper/sealer_cgo.go index 01b40a869a5..5b7f2acc52a 100644 --- a/extern/sector-storage/ffiwrapper/sealer_cgo.go +++ b/extern/sector-storage/ffiwrapper/sealer_cgo.go @@ -13,7 +13,6 @@ import ( "io" "math/bits" "os" - "path/filepath" "runtime" "github.com/ipfs/go-cid" @@ -886,8 +885,8 @@ func (sb *Sealer) FinalizeReplicaUpdate(ctx context.Context, sector storage.Sect } defer done() - if err := os.Remove(filepath.Join(paths.UpdateCache, "sc-02-data-tree-d.dat")); err != nil { - return xerrors.Errorf("clear update cache: %w", err) + if err := ffi.ClearCache(uint64(ssize), paths.UpdateCache); err != nil { + return xerrors.Errorf("clear cache: %w", err) } } From cce77196cd8b3c6a5f0b2ae349bf6853a6cd1a53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 9 Feb 2022 16:22:35 +0100 Subject: [PATCH 345/393] proofs v11.0.2 --- extern/filecoin-ffi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extern/filecoin-ffi b/extern/filecoin-ffi index a6b1db270d0..5ec5d805c01 160000 --- a/extern/filecoin-ffi +++ b/extern/filecoin-ffi @@ -1 +1 @@ -Subproject commit a6b1db270d0175a92311c8e3e7351f37c2c160ca +Subproject commit 5ec5d805c01ea85224f6448dd6c6fa0a2a73c028 From e129ae370664408585b8b3c992e02c0135805d4f Mon Sep 17 00:00:00 2001 From: vyzo Date: Wed, 9 Feb 2022 18:34:50 +0200 Subject: [PATCH 346/393] refactor nextBatch in badger markset --- blockstore/splitstore/markset_badger.go | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/blockstore/splitstore/markset_badger.go b/blockstore/splitstore/markset_badger.go index b2a689261b3..659d3b5ddc7 100644 --- a/blockstore/splitstore/markset_badger.go +++ b/blockstore/splitstore/markset_badger.go @@ -108,10 +108,7 @@ func (s *BadgerMarkSet) BeginCriticalSection() error { var seqno int if len(s.pend) > 0 { write = true - seqno := s.seqno - s.seqno++ - s.writing[seqno] = s.pend - s.pend = make(map[string]struct{}) + seqno = s.nextBatch() } s.persist = true @@ -282,11 +279,7 @@ func (s *BadgerMarkSet) put(key string) (write bool, seqno int) { return false, 0 } - seqno = s.seqno - s.seqno++ - s.writing[seqno] = s.pend - s.pend = make(map[string]struct{}) - + seqno = s.nextBatch() return true, seqno } @@ -300,12 +293,16 @@ func (s *BadgerMarkSet) putMany(batch []cid.Cid) (write bool, seqno int) { return false, 0 } - seqno = s.seqno + seqno = s.nextBatch() + return true, seqno +} + +func (s *BadgerMarkSet) nextBatch() int { + seqno := s.seqno s.seqno++ s.writing[seqno] = s.pend s.pend = make(map[string]struct{}) - - return true, seqno + return seqno } func (s *BadgerMarkSet) write(seqno int) (err error) { From 84d70caa8767c7003f0f1e2d53cff163fbd28841 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 9 Feb 2022 17:47:53 +0100 Subject: [PATCH 347/393] sealing: Use ChainAt in handleUpdateActivating --- .../storage-sealing/states_replica_update.go | 34 +++++-------------- 1 file changed, 9 insertions(+), 25 deletions(-) diff --git a/extern/storage-sealing/states_replica_update.go b/extern/storage-sealing/states_replica_update.go index b7e433e44a8..b0fada5aabe 100644 --- a/extern/storage-sealing/states_replica_update.go +++ b/extern/storage-sealing/states_replica_update.go @@ -5,6 +5,7 @@ import ( "context" "time" + "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-state-types/exitcode" statemachine "github.com/filecoin-project/go-statemachine" @@ -225,7 +226,7 @@ func (m *Sealing) handleUpdateActivating(ctx statemachine.Context, sector Sector return err } - tok, height, err := m.Api.ChainHead(ctx.Context()) + tok, _, err := m.Api.ChainHead(ctx.Context()) if err != nil { return err } @@ -238,30 +239,13 @@ func (m *Sealing) handleUpdateActivating(ctx statemachine.Context, sector Sector lb := policy.GetWinningPoStSectorSetLookback(nv) targetHeight := mw.Height + lb + InteractivePoRepConfidence - delay := 50 * time.Millisecond - - for { - if height >= targetHeight { - break - } - - wctx, cancel := context.WithTimeout(ctx.Context(), delay) - <-wctx.Done() - cancel() - - // increasing backoff; can't just calculate the correct time because integration tests do funny things with time - delay = delay * 10 / 3 - if delay > 5*time.Minute { - delay = 5 * time.Minute - } - - _, height, err = m.Api.ChainHead(ctx.Context()) - if err != nil { - return err - } - } - return nil + return m.events.ChainAt(func(context.Context, TipSetToken, abi.ChainEpoch) error { + return ctx.Send(SectorUpdateActive{}) + }, func(ctx context.Context, ts TipSetToken) error { + log.Warn("revert in handleUpdateActivating") + return nil + }, InteractivePoRepConfidence, targetHeight) } for { @@ -276,7 +260,7 @@ func (m *Sealing) handleUpdateActivating(ctx statemachine.Context, sector Sector time.Sleep(time.Minute) } - return ctx.Send(SectorUpdateActive{}) + return nil } func (m *Sealing) handleReleaseSectorKey(ctx statemachine.Context, sector SectorInfo) error { From 8b68d37e84df4205f7db641c28b6a4e5018fdd6a Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Wed, 9 Feb 2022 13:33:47 -0500 Subject: [PATCH 348/393] remove change log --- CHANGELOG.md | 72 ---------------------------------------------------- 1 file changed, 72 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2b1e87ce7ad..a420421de89 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,77 +1,5 @@ # Lotus changelog -# 1.14.0-rc6 / 2022-02-08 - -This is the sixth release candidate for the mandatory release v1.14.0 of Lotus that introduces [Filecoin network v15, codenamed the OhSnap upgrade](https://github.com/filecoin-project/community/discussions/74?sort=new#discussioncomment-1922550). - -The OhSnap upgrade introduces the following FIPs, delivered in [actors v7-rc1](https://github.com/filecoin-project/specs-actors/releases/tag/v7.0.0-rc1): -- [FIP-0019 Snap Deals](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0019.md) -- [FIP-0028 Remove Datacap from Verified clients](https://github.com/filecoin-project/FIPs/pull/226) - -Note: -- This release candidate includes the [final proof params](https://proofs.filecoin.io) for Snap Deals. -- It only sets upgrade epoch for Butterfly-SnapNet and calibnet, and it does not set the upgrade epochs for mainnet. - -## Calibration Upgrade - -The calibnet will be upgraded to Network v15 OhSnap at epoch 682006, around 2022-02-10T19:23:00Z. - -To join the network, simply build lotus by running `make calibnet`. - -New proof params for Snap Deals should be downloaded upon your nodes restart. - - The parameters are pinged on IPFS gateway https://proofs.filecoin.io and the CIDs can be found [here](https://github.com/filecoin-project/lotus/blob/release/v1.14.0/build/proof-params/parameters.json), please let the lotus team know in #lotus-ohsnap if the params are not fetched automatically. You can also download the params manually from s3://proof-params-ap/filecoin-snapdeal-parameters/. - - -## New Features and Changes -- Integrate actor v7-rc1: - - Integrate v7 actors ([#7617](https://github.com/filecoin-project/lotus/pull/7617)) - - feat: state: Fast migration for v15 ([#7933](https://github.com/filecoin-project/lotus/pull/7933)) - - fix: blockstore: Add missing locks to autobatch::Get() [#7939](https://github.com/filecoin-project/lotus/pull/7939)) - - correctness fixes for the autobatch blockstore ([#7940](https://github.com/filecoin-project/lotus/pull/7940)) -- Implement and support [FIP-0019 Snap Deals](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0019.md) - - chore: deps: Integrate proof v11.0.0 ([#7923](https://github.com/filecoin-project/lotus/pull/7923)) - - Snap Deals Lotus Integration: FSM Posting and integration test ([#7810](https://github.com/filecoin-project/lotus/pull/7810)) - - Feat/sector storage unseal ([#7730](https://github.com/filecoin-project/lotus/pull/7730)) - - Feat/snap deals storage ([#7615](https://github.com/filecoin-project/lotus/pull/7615)) - - fix: sealing: Add more deal expiration checks during PRU pipeline ([#7871](https://github.com/filecoin-project/lotus/pull/7871)) - - chore: deps: Update go-paramfetch ([#7917](https://github.com/filecoin-project/lotus/pull/7917)) - - feat: #7880 gas: add gas charge for VerifyReplicaUpdate ([#7897](https://github.com/filecoin-project/lotus/pull/7897)) - - enhancement: sectors: disable existing cc upgrade path 2 days before the upgrade epoch ([#7900](https://github.com/filecoin-project/lotus/pull/7900)) - -## Improvements -- updating to new datastore/blockstore code with contexts ([#7646](https://github.com/filecoin-project/lotus/pull/7646)) -- reorder transfer checks so as to ensure sending 2B FIL to yourself fails if you don't have that amount ([#7637](https://github.com/filecoin-project/lotus/pull/7637)) -- VM: Circ supply should be constant per epoch ([#7811](https://github.com/filecoin-project/lotus/pull/7811)) - -## Bug Fixes -- Fix: state: circsuypply calc around null blocks ([#7890](https://github.com/filecoin-project/lotus/pull/7890)) -- Mempool msg selection should respect block message limits ([#7321](https://github.com/filecoin-project/lotus/pull/7321)) - SplitStore: supress compaction near upgrades ([#7734](https://github.com/filecoin-project/lotus/pull/7734)) - -## Others -- chore: create pull_request_template.md ([#7726](https://github.com/filecoin-project/lotus/pull/7726)) - -## Contributors - -| Contributor | Commits | Lines ± | Files Changed | -|-------------|---------|---------|---------------| -| Aayush Rajasekaran | 41 | +5538/-1205 | 189 | -| zenground0 | 11 | +3316/-524 | 124 | -| Jennifer Wang | 29 | +714/-599 | 68 | -| ZenGround0 | 3 | +263/-25 | 11 | -| c r | 2 | +198/-30 | 6 | -| vyzo | 4 | +189/-7 | 7 | -| Aayush | 11 | +146/-48 | 49 | -| web3-bot | 10 | +99/-17 | 10 | -| Steven Allen | 1 | +55/-37 | 1 | -| Jiaying Wang | 5 | +30/-8 | 5 | -| Jakub Sztandera | 2 | +8/-3 | 3 | -| Łukasz Magiera | 1 | +3/-3 | 2 | -| Travis Person | 1 | +2/-2 | 2 | -| Rod Vagg | 1 | +2/-2 | 2 | - - - # v1.13.2 / 2022-01-09 Lotus v1.13.2 is a *highly recommended* feature release with remarkable retrieval improvements, new features like From 7b7733077ac53d122d33e25923c815c69a3cbe43 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Tue, 8 Feb 2022 02:10:09 -0500 Subject: [PATCH 349/393] update the proofs in test plans` --- testplans/docker-images/proof-parameters.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/testplans/docker-images/proof-parameters.json b/testplans/docker-images/proof-parameters.json index c991c7e1840..88bb0bfa34b 100644 --- a/testplans/docker-images/proof-parameters.json +++ b/testplans/docker-images/proof-parameters.json @@ -30,23 +30,23 @@ "sector_size": 2048 }, "v28-empty-sector-update-merkletree-poseidon_hasher-8-8-0-3b7f44a9362e3985369454947bc94022e118211e49fd672d52bec1cbfd599d18.params": { - "cid": "QmeNqDvsvyam4vqwCkstbxgb9S7RZEUeBDrJvBWKcpFKr6", - "digest": "532b53883ed4f794cb9d0db583d0df59", + "cid": "QmNPc75iEfcahCwNKdqnWLtxnjspUGGR4iscjiz3wP3RtS", + "digest": "1b3cfd761a961543f9eb273e435a06a2", "sector_size": 34359738368 }, "v28-empty-sector-update-merkletree-poseidon_hasher-8-8-0-3b7f44a9362e3985369454947bc94022e118211e49fd672d52bec1cbfd599d18.vk": { - "cid": "QmdLWr6moLUPScJZwoBckWqAeJkrBPAJPNLz8mWAfTdmXH", - "digest": "46990eb1bf5159c394a10309f269c1b6", + "cid": "QmdFFUe1gcz9MMHc6YW8aoV48w4ckvcERjt7PkydQAMfCN", + "digest": "3a6941983754737fde880d29c7094905", "sector_size": 34359738368 }, "v28-empty-sector-update-merkletree-poseidon_hasher-8-8-2-102e1444a7e9a97ebf1e3d6855dcc77e66c011ea66f936d9b2c508f87f2f83a7.params": { - "cid": "QmdQsi9uFhxK9cGwuK4rHuwKQoHkz6upYTCz4UdLiy1vA2", - "digest": "4223c63dbd94de1538006a14f37179e3", + "cid": "QmUB6xTVjzBQGuDNeyJMrrJ1byk58vhPm8eY2Lv9pgwanp", + "digest": "1a392e7b759fb18e036c7559b5ece816", "sector_size": 68719476736 }, "v28-empty-sector-update-merkletree-poseidon_hasher-8-8-2-102e1444a7e9a97ebf1e3d6855dcc77e66c011ea66f936d9b2c508f87f2f83a7.vk": { - "cid": "QmPirFX9wX99iMGA6zFY2CvcrdcDkj73X4MP6DLduvpbk9", - "digest": "ce39b614d788d3aef26bac1b28521d94", + "cid": "Qmd794Jty7k26XJ8Eg4NDEks65Qk8G4GVfGkwqvymv8HAg", + "digest": "80e366df2f1011953c2d01c7b7c9ee8e", "sector_size": 68719476736 }, "v28-proof-of-spacetime-fallback-merkletree-poseidon_hasher-8-0-0-0170db1f394b35d995252228ee359194b13199d259380541dc529fb0099096b0.params": { From cd3772bf4f98f1cf77906af8b0edf25a75f2aa67 Mon Sep 17 00:00:00 2001 From: Jiaying Wang <42981373+jennijuju@users.noreply.github.com> Date: Wed, 9 Feb 2022 19:08:00 -0500 Subject: [PATCH 350/393] Update go.mod MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Łukasz Magiera --- go.mod | 4 ---- 1 file changed, 4 deletions(-) diff --git a/go.mod b/go.mod index 611c33dfa83..0a2c4b83441 100644 --- a/go.mod +++ b/go.mod @@ -174,7 +174,3 @@ require ( replace github.com/filecoin-project/filecoin-ffi => ./extern/filecoin-ffi replace github.com/filecoin-project/test-vectors => ./extern/test-vectors - -//replace github.com/filecoin-project/specs-actors/v7 => /Users/zenground0/pl/repos/specs-actors - -// replace github.com/filecon-project/specs-storage => /Users/zenground0/pl/repos/specs-storage From 1d67b7ffb60deb1857e793a50987296d32622600 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Wed, 9 Feb 2022 19:31:50 -0500 Subject: [PATCH 351/393] undo ffi --- extern/filecoin-ffi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extern/filecoin-ffi b/extern/filecoin-ffi index c03fc07aadf..5ec5d805c01 160000 --- a/extern/filecoin-ffi +++ b/extern/filecoin-ffi @@ -1 +1 @@ -Subproject commit c03fc07aadf76b464644c785f59292b93542c0ee +Subproject commit 5ec5d805c01ea85224f6448dd6c6fa0a2a73c028 From 1916561e60e3a2a2e8b306cb161dae9ef75f856f Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Thu, 10 Feb 2022 23:38:41 -0500 Subject: [PATCH 352/393] bump the version to v1.15.0-rc1 --- build/openrpc/full.json.gz | Bin 26596 -> 26596 bytes build/openrpc/miner.json.gz | Bin 12903 -> 12903 bytes build/openrpc/worker.json.gz | Bin 3960 -> 3960 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 +- 7 files changed, 4 insertions(+), 4 deletions(-) diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 368f32aa9c4f1988b87731e2736c950e1e0a573a..ed1abf06e2aadc4a1bdc3a1463a3140e3f88c43d 100644 GIT binary patch literal 26596 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 A82|tP literal 26596 zcmb5VQ*lmR|6M3G;VaKFZt|I1ff5q^jF1k1 z*=91PiEjGa*kpS{Bw^VJ`x9p z>dqdBCt6~(Fa)pEHt~1ztpy_{g3n+lAXEqW{b7c`sXFNALW zcYEZ3`flQFk*eQSMkprI%Vm5 z%~r}+A3xFWHX{G;w-W;ngF7FDf*}Kc1q4-y0JA__Gi2q5NA*C&e^RL7&&3rRA3qkX#Aqye-@;q&~IIe`=Uc`&nt9s^14 ze4_GE(&XB0j2z?vmh%=%D z4*)#lBFRxP86IcY6~l%=F``bZlgw4ZOU8*C~!z%tH2jbdyO^=*uJbdi5zwGak35NVXHTvL$V}7{M zE}s`brkH$v!!Un%Vy~9h9!eq{<@cW~JKO84aK3-0shKsQMnw#A#4bdGCfb5(f(1h9 z|9y^QhR^cuA$FR=F$k~I4}RJGia#z*aNdHmw(wskw!zx2`sGF1=+5C`#x60vm`s% zu9d$d^$fi@dE3#S&s7J0aif4vB}W!bst#CDG9l$l z&>%n&fX)zTBia8}6f%AWP9nj*!g=IF<%&?c3m&Ks6VA{R%q<1$Gw6-hGu|np(J-We z(H!3ak?An@hR0#Am4OiGR@!_li$3K!LA!x7S1UC*$Ipzvki>IFey-Un7S3G(s{`M| z$j>QLS4nd84eN*HcsswbpO5sxvflwB7JrCDI&H+LT)bVJHgWbBg&TlY<98&$%-1jn zo<8*22fzmbN<%DRKjgCsMQW#t>97&HXFAm57l1LuCqUT>XEzvjkm`5CIRk`0MWPje zfFqypzPDim>)8wh6+aS-ZasAbbR^s3gDH5M^?pHZ@Z1xD;0_c5U$hL%q#>FI<(uzS zwZCi3$orH15ec}( zpJ;d&EsGd&FRtNx)ViNniHE0)BUO%=9NY_cKvFG#;7PWxK_Q1d<>gemhAuS|;I{HJWrDv~#j)XNY8W z%l?Y(_N*UZ?BrEPQ} zP&GQk0i)kbY}KRaZz7!Q(B!C!1VSKU5-?c|5}U*MY!JXuxI4n$PYft9pJ*^c7hyVg z`)Y~x{B=38-q-vKa#$vf%)=kYuh81S+sDiOhp+L+v_Pd(xaBwo{x{WqvP%O6(q+S1VZo7+D1X5JGuDo?c>9o{h$3i z^V_qBqS6#%?>9{a25bDRZ@(9#g5lZyI*)0fVF8FE+BW>SZAFaVwxC9mbaSw=tbdY57SK{46WE=0g0=cpS z^YPe;Sa4-_GvF%XIk@+?Ha~?Mi=|0#3l=MMO73r=t@Dg;c@Cwp z?^A2-X29arUa`IHBw`VcBoM+&nB?nU>kfO0QHMC|p1ar-DxYGYE_r9QJ+5>9#Kxqb zZsW>YPF=@lRdORf;i+^~;x`>sxhY>$LE^!pxT~niYZ0=?nUNA+4LvD)*M*7Z^SW3n zFX)IMH}?jieP}2Cj%GpC7A`gJl-y_$gkA;JMUq0+GF#w^y~Q1n=i|MqYhNzIk|Qu_ z-q!!Lw4Hz1iua(p*0A__;xIW0L)_^@a&K!p$=%SSs!>p$%3dR3V=rvVL&QyNrKY$b zRb=$%W9cyFQs$?N8~cs8oq69s{>lL-)ZM+|bU0%xw~v448d6yOY{}(MlGvP&F{>XK z{Sz+CtH|faeULTc#)?`tJnt!OP%78kk(y2U7{8H>2{;QC{@B1WuXo2(yLf5*^t%{O z#RB6wDq!H21nzUj$-_1&GIy;)vNWwy9mp%`%X?xI{ErUSt}yC!NoEYH!=~VHThmMX zJ+bt^h?HDWn|&r7k zOjt-sB0!&`{&&t(6N6es{Gjis1+F>&PSvi#ujhkl%JC| z&f87XJaa&KKpCWk;bw8o*3^o)k)KW2P=*R=qbvPdb>PC2;p{|sA;!QlNIGOg75NEH z-O-2v@4lI>zg^ygEYmB<+6dQ~v%JSV6Vp8M{($})bP%t?@4ei%<{Ea5$=%VEKObjv z6g_~{?~biFW4%83C3MB^z$}+?IvEV<+KL?-NN*2n=vGp3l;28}hWBrsFq-jCi$Lv6 zrkii$x~lAK#Ffa`>VBLkZ?9y{clKEbx`!TI?Ed4w*CPTU)avOD#%sWe_#;kk;r10*+*kMEza*t>`Nl%eL6c|qA(9H;Y3sJnn(~8i)Hgl=wCmYz)sF&9xg=Vx@r5Rn?tF$$@S}mqZz|3 zzuIa}S}Q0fUrWPtJA~{6a=S)V3|DLekym86PGYW{oTe1qxAzHU?NOr>X`LC*{4b7N z=_t0a5TOq|xK55ZB!N-zCxszslX^j))NP0XFOy-3Zq+qTyUsdLz}L1#DN^t9@w1$C z(%cnPRmm?7F;~YTFIOZ)$dR~#2>=RPnZRjteSt)&T-a-zaP@=@$zS=HB3V2lG~3Z0 zaRV94*+YX0OE*(UDMboE)Guu?XIJLcx57 zOgYxKH!KvU>vpLDJ?e{yHljw2^csUbynFnz|0wuZt*%i&LXgH(ED0C9Y z(%JT)=2Pl+2Fu13)zoG>&ldL8^3cXuI4R#2mKYva0)Fj;5sM@ZA{7$$`{|(u!N8GQ zlw^C~mEo+-$y4dRzvzY-0RV;_^BafMki9Jz{G`&qlFrZ=FByvCXL|UaJ18|j+b`~*}OE_I$Ls;~a z@iHVD*x|WOeR3ZzH~ygsU!PmO_WF*~xv!l9J~)(L!*(hMqi-4#Ixy10d^ zxs3K%Q%a5n3;{H=M-T`EUIfRW$a%8iwTkF4HTVpLAi<(H-Ha~7K|#Pl^!&>Z>JN)h z@w2xdskS_NiG~yX70S4nqUO#M?0lhOBJh5qpMc-U>9^sX*s=Xj76S>I)w9UAZ%Fc={h_dT3-JE>b@wTz7icRZS43ch&h-fl}iD2$cG+Dp@mm=;f9o}L#SQg zO_fSPmCdY*{+G(ZY?&657A;pCg3SgLD@fHNtlKSx+TQj&Nqq-$omqlr#uIL4UK`}B z8_5lOTuH5gF4P1M%GO#XcQCQwlD9~V!HNNaY8%2|D{t}qS(1E*aB^Yf%aO!*Ci5U# z*8yb_g~Fw)xxTi0^Ca-dp@VOR1LZncoV_)zU!d$=XinS*!7>)+pz%tz ztp>c5?VD_@r_Y#nnI~>*a+By)R6T9ehY;R_jJ%uve zhnzQ>x|$9IStbZ2lZdj}6gW+Gn7Q|ul}(~oK7~;M$g_eJ9iA$N0Qm3)vl4!E%oprC z6*L|-R<1YD`}yW=Y(^l$P}7>xYt+zs%+zLnWqolysn*kSt5TiFx<)#>eS_$7euicd z9d}>b)9Nx#lJ*(;m!fndj(LX>2iqB2QOY#Y?e&yu!>0fX6=wW?Ra&r!6ioLl6Ugb=Fe~etr z&|$LRSf5ZR6}S0kf$MMw@R>C4zML+!OGlLa0Ud$8bXs62NPwYIh=ZB1?1Wn7=xEV#yaxpfHe zZ{S=5x8yA_PVb=fdn|b*=~!9*^hu?PF4hcDEhGPLux>VGiY!s@7B@pW>A?efk)#pH>5nV+-`5OPCS8Z7y#daPWIalw19;2?aL8T%IO!9P7TmKtd#J3Z zyGuS0TU_sN9(l2(Yj59wfng~U-KHwo;9o@5m_lNm`km7A_xEIm$!K=>vPI<4%~y zf58EzVl**IB1=M2deys^IX}9eRJ^SqYV58@W)jn9$$O}vQXxyb6Z$Uk!uu~8Rd>rn zY{lc?*ZXn|^hd{#jK;sV&T*I?lt}A_zA3ZTWNxoD2-r)YCt!!fkL~Rg&gdsgfNg(_ z^oRjTp2d1P?;KcuajAfdu)R&tZ)&way@%1JYEV!ND?K*8wfh;4xKgvPLngnFQ)(Ld zFSIw|KrBT8A;o3YQ*$h9k#-~h45>T;{5gkD7|+(zBUO(eMZA8jdc$rKoqVBz%><&E z`SO>_xm?02syq%?OT{EZ+7S=HZtuR7(LDlf5c;y6SWd2d1=PgXwi{v?GW8kAAMAc)E{f?G{=XujXn55WEf!1& zB>VdbCEUv~hk*Y?Hx$Zp8=td>MB}rjJSP8C%);$thpCm; zmM5O`_Dr0>!=TMi^?qrtPf;{WnPN4kha^3o_2o<6{_8z(N9f|rT)4=#rO11Lb#dp-!r^RJrfEwrcg_941JzE8zD7-FbIvJwYa;cR zBIlN(n-IGGhQtUIf`?~8O7%6m9#4CZoC&1B|#2kP1VRPqhpTa@%O+s!QZi7n;wV@@C8Vs5`7FZ+W& zej)0q=hiKyI*1f!z#th{1V%><`+~+){`C_Sk8y_GHN0i)L-v9R|8Wv3pxmctW)K3& zk^z%ZIoAn%VI_+P`8y1(^_ZO1uggqDeynCp|pft8ugSP;ErEttaf-wMR*D0iW z6nKY)-k>e_3+fflDXTVY1nw1SiV}H&Jpu+7021?)*L@af9-3K4V0E7lG3_>m&y2KpH+6reS!{1XAX(hI_nCfg#BZ2;h73Ykq zb5bP{T!M!%nN(ZY10DzLd0pvd7OJ`wr^=pR;<`+MGlb$dNL+ueQryFZs?do-5^Ya; z(3q%{_4cWanU*@FfqDerI9fc=Gyhi|N57#+U$JMJvs*TE&FL+T9T8@jF2{Y3^`bE` z2m(A9E@z%cqic(f@>oq#xJ-!N+>x^~diWLh&r);w4--^8zIaVaJYwDqexg6~$d%sj zX@s1CGpN=AIdc@TVAy28agMhf7z z?$`dvy5Cga^!JdNe7Nm@b+PxXWlx>4_TYZFuiV;&!mo?LmFcw%If?aft1KOu2dPhi z+T!{Yj%*j>e$`zGc`mwt{x6uMWE+MMi)m;yfM9Z*ogCQ5-OhHFfaEyV+r&4xk z5`4FvH?!c+lT`W~L}WTJ1acUF$j=L%gO-475z-&?nr%613>#vFnl58aaOfDs!lG=x zFwE|z_Xl;QAFO+RB?FR{K>idfK_l-EIxCKI6Ln#YZDjdg*b9N-82RmN`oB^dkaw{kT7+?A=K+hK4mR^X&7sz2zr3x;AiOgNQMde}w%7xY;Ib+SHOeE<8q*+CO>* zctw;_NjZ_9X63s7@#}*4O2>w(u}*;ZO)8N?^!Y)8Qt-KNW)qAT$e^Yy=P}^4NAoaq zT+ba9462}Rd(Mw0Rha8L5)%j~KmCxw?T5}Rzhcsa5Qts)b}FfApg+m;&R!mVQ}_#i z{--L(qw-0yRH*IRF{hRs^3r!>to z1`Go0Jo&IpCLexqVxVnZ8T&{~jkiK^%+0w~84@-AJzk*2r7Q;HtaX(92G8A#G}0l4 zRU`AdbNFnzqADGY_2_I}6UBtYFS*YA-huvDFE6nfNXT}#`xy2hY`LwJ|m=Yy2d-Xkq{`@bSrEMUe8{7L+Fh2Kw zqCH^|`w4vK>jh4w=>Jp90#qtL24y$Uf}uotKz)ITA?p-+)?fZ%t0!H_FIoF@xw>KF z>3-qR?9$;&W!%&eM}UE{$Vf8UX}^S4!Y^f3xc02YY(p&4Ufd*YAh8jFCH3lse|~ViCwQI4Sl zt5Ax}|9z|>iCw8ZNZoRwzipMPQ>-Ujj!p>V{vRZ6X3TDc@@OSnFlI}UX%WC<;XONh zAC*(;S}&6fqk;VJCNX`4Nt?CvHirsSBSbgubYuximB4V&)%zQpYQQ9WO21{y>~Urv zOS{u|WQd-^j7EsXC{FO!`Urg{i>(|NzB7xh=`QX@O(w*2bkH>+y zRbheU;%2i1OSY7U8=RYi;V7LzlPYK`lXPk)x_%f-SULdO*tsLuDtQs6RcnO%^n1>_ z3Sj@M3|5Ahoo_EM*fVzbba3GN1}K}{_6CONSTb>^oSA<62Qrv3TUIcxaT*l1WfruR z&gsvOp9ePnHK6l57ax}Q#UaaouZaAQKGV}(7ujw`=6S*ktCc-plWCTdPz7JizkYnn zu6L$-1mArXX?(`)IOzs1RiyhIc~&Z#e3BPj_=D-vp$6|x6Xa(0%1^vGv9{mx1k>ib@Pme3Gx6Wy_VyQprA zR8yhRF1iUPGX8CXmM|S02V3Qud|-JX`c zGMbC0pc;_6A0}QCo?A`ht{UJ$c=*JeY|wR&PEr{F{c|LX#~nvpzMO~6cr2STSOlTg z4V*SH#X63I_uBu_jGm&fe?T(z4nj2|sWgd9RUclIHmmAjnDQ!)J+B@?#((797f+IL z;B+oqvXQS)pM1TX2WOo!X)AKzEn1ZqOD0N$zaX&IoHN|Tg202v2$0L3AkD2|QI!^S zasN|Nr6wW_rD+^>o-leGxhkTXBbq9fN{`^fPxY!zce^8D)Q9N7l{miO;U;DOL~I)g zq}wKRLEtRje;c;o;D|K(6GH*-<0TFC;hk~z!<72=1|=Hi$P-#loNqR9dd;P@LtSgw z-OwEREv==*FA+O{;bm2@Pc2sUXRn{UR*EU^LrDHQ`DcaO^`-q3vQj3zI$vhF*_~%3 z^|lKaC!7pM9ky|bZlA``CEQG2JGq4w)nx=Uz9%s)VJ1KUiH;HW=mR?BHWet*K#)Q*|l5 z`g*H<(%C7U(q!G%@nYQ7IwM7C%$4W5Y~u~Igr@0f0lvB#( zWEQS--Z5S7_*uA)v7R&)<%Vdx@~wIFpGx-HBi0_AId zQ!0q5257Hvy?}Uqk7N06BK5<_(j-OWFxb&%P8#oMdq<=I%P3561~e4r{y1U=!P5vp z;3>G&{1m%A6eBXew&d0~SSt5m3olIR3W7D~;-SI<6;3Q&i-xL;K!f|LX4SNn>;1}@ zzIju11LI>crK1KS=RoEB-=|%K<}sA!1pQV~uUZ~{>p0ZOGNY1+EGoD1)iR?K0XKw0 zRmO#ksbU{J3<@OWI#dlMSK0&6q8$$uh0zzc_7SLZGJgRJgLQV;pE@%t7=&Pg-Y9Uc zG7f+U@&6>wMuZ?TCLncDlz7mK9d2_$FF@YaQ>=x=1*_WTW_B@M;!s_{K_bWqUGUtV zNob-jz!;Kf!%7Oqt!~|NJ~CvXu367Mz`w28XOpt2;bv~W^O)H0)PsWS&9AfNjH~uaEjaoAGGPKZVy^|lM@sdr z`^NG{gNYe20?q;KYn9IJDv#!pL=7J5A{{%H0B4yORC-ll=-@i~7YZ&4E)v`d;EYFH z;ftDPmqCa@tHGm6|vp!)iH%3TGp`|&zQHA0zhOkpiuHswG-@N*?CTOA?jhlfbUxG^ktXDK)RQMJs;0d% zXp5bk8y=x~FaS{KZR%hlzmE*Uxb97=V$&-)Nv`4^c|8SJ(l+k#y31@XHMTxsK$|ak zifix=sl0U^%XNAI9eK2x%DN4v92tvih0|oNY-h%ek~@nLFAsIKl9DV^40m&g2n3t~had^y60wK`w)S?*MUHY$pHzGwz`uC9&yX)Z zu4bW0!xiY84{dmlaIKe_4~Ph%TNMNC*A(dw>fA_g3d60JHG1NRx5Dy(JEUXVHTx@` z-sxUPs2FC4%)o`jzy{S6XI+p}fZ#T5y0&T+v!&94F^CO4&OlSZhUQI9g5IPIG5tWOaRWeX~8~5MvtYYzIj*gVB{?r_Tra0e8|riow5w zE}nm2;Ux@zQvlfO7=VEO=OXxx`m}LvVfU>f;6M1|Il2?INsVpa>O*Nx-YELC^rhqU zr34>2rYbXEB}d$*C_oOi`SX{w6#EwIQ1bSh_L!OfPYc8>pcV=FTV(5IQ^8(@{9`o??j=E}e~|lDP|ym{20{cVASp13 z&Y=eyh8aMZNn|@aF)fd+n!X&MFH0?Lc^na`5mUj{vx}n6HGyU}-RdP9m*xf7^0i=pAXSOgV*HAYI! zXfW9#{MT_Guio3u&8hl(IGXBjc-t9)zbC~$5-L(YK)EMJxhHBM3>;0#KG{Do%%0D! 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 Date: Thu, 10 Feb 2022 23:42:38 -0500 Subject: [PATCH 353/393] add changelog --- CHANGELOG.md | 174 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 174 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a420421de89..fd29ea152ed 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,178 @@ # Lotus changelog +# 1.15.0-rc1 / 2022-02-10 + +This is the first release candidates of v1.15.0, detailed changelog will be updated later. + +- github.com/filecoin-project/lotus: + - bump the version to v1.15.0-rc1 + - chore: build: v1.14.0 -> master ([filecoin-project/lotus#8053](https://github.com/filecoin-project/lotus/pull/8053)) + - FinalizeReplicaUpdate ([filecoin-project/lotus#8018](https://github.com/filecoin-project/lotus/pull/8018)) + - splitstore sortless compaction ([filecoin-project/lotus#8008](https://github.com/filecoin-project/lotus/pull/8008)) + - perf: chain: Make drand logs in daemon less noisy (#7955) ([filecoin-project/lotus#7955](https://github.com/filecoin-project/lotus/pull/7955)) + - chore: shed: storage stats 2.0 ([filecoin-project/lotus#7941](https://github.com/filecoin-project/lotus/pull/7941)) + - StartEpochSealingBuffer triggers packing on timer ([filecoin-project/lotus#7905](https://github.com/filecoin-project/lotus/pull/7905)) + - deps: update go-paramfetch to v0.0.4 ([filecoin-project/lotus#8050](https://github.com/filecoin-project/lotus/pull/8050)) + - fix: sealing: Stop recovery attempts after fault ([filecoin-project/lotus#8014](https://github.com/filecoin-project/lotus/pull/8014)) + - chore: update build and deps ([filecoin-project/lotus#8047](https://github.com/filecoin-project/lotus/pull/8047)) + - update libp2p to v0.18.0-rc4 ([filecoin-project/lotus#8044](https://github.com/filecoin-project/lotus/pull/8044)) + - update go-libp2p to v0.18.0-rc3 ([filecoin-project/lotus#8022](https://github.com/filecoin-project/lotus/pull/8022)) + - misc: api: Annotate lotus tests according to listed behaviors ([filecoin-project/lotus#7835](https://github.com/filecoin-project/lotus/pull/7835)) + - some basic splitstore refactors ([filecoin-project/lotus#7999](https://github.com/filecoin-project/lotus/pull/7999)) + - feat: mpool: Cache state nonces ([filecoin-project/lotus#8005](https://github.com/filecoin-project/lotus/pull/8005)) + - chore: sealer: quieten a log ([filecoin-project/lotus#7998](https://github.com/filecoin-project/lotus/pull/7998)) + - chore: build: make the OhSnap epoch configurable by an envvar for devnets ([filecoin-project/lotus#7995](https://github.com/filecoin-project/lotus/pull/7995)) + - chore: chain: fix log ([filecoin-project/lotus#7993](https://github.com/filecoin-project/lotus/pull/7993)) + - tvx: supply network version when extracting messages. ([filecoin-project/lotus#7996](https://github.com/filecoin-project/lotus/pull/7996)) + - fix: sealer: manager should lock Unsealed for ReplicaUpdate ([filecoin-project/lotus#7986](https://github.com/filecoin-project/lotus/pull/7986)) + - chore: remove inaccurate comment in sealtasks ([filecoin-project/lotus#7977](https://github.com/filecoin-project/lotus/pull/7977)) + - update go-libp2p to v0.18.0-rc2 ([filecoin-project/lotus#7984](https://github.com/filecoin-project/lotus/pull/7984)) + - Fix: sealer: ReplicaUpdate should fetch the correct files ([filecoin-project/lotus#7983](https://github.com/filecoin-project/lotus/pull/7983)) + - libp2p v0.18.0-rc1 and initial resource manager integration ([filecoin-project/lotus#7969](https://github.com/filecoin-project/lotus/pull/7969)) + - chore: merge release/v1.14.0 PRs into master ([filecoin-project/lotus#7979](https://github.com/filecoin-project/lotus/pull/7979)) + - chore: update PR template ([filecoin-project/lotus#7918](https://github.com/filecoin-project/lotus/pull/7918)) + - Fix: chain: create a new VM for each epoch ([filecoin-project/lotus#7966](https://github.com/filecoin-project/lotus/pull/7966)) + - feat(deps): update markets stack ([filecoin-project/lotus#7959](https://github.com/filecoin-project/lotus/pull/7959)) + - Use go-libp2p-connmgr v0.3.1 ([filecoin-project/lotus#7957](https://github.com/filecoin-project/lotus/pull/7957)) + - feat: #7747 sealing: Adding conf variable for capping number of concurrent unsealing jobs (#7884) ([filecoin-project/lotus#7884](https://github.com/filecoin-project/lotus/pull/7884)) + - build: release: bump master version to v1.15.0-dev ([filecoin-project/lotus#7922](https://github.com/filecoin-project/lotus/pull/7922)) + - feat: build: butterfly SNAPNET ([filecoin-project/lotus#7932](https://github.com/filecoin-project/lotus/pull/7932)) + - correctness fixes for the autobatch blockstore ([filecoin-project/lotus#7940](https://github.com/filecoin-project/lotus/pull/7940)) + - fix: #7869 sealing: Add more deal expiration checks during PRU pipeline ([filecoin-project/lotus#7871](https://github.com/filecoin-project/lotus/pull/7871)) + - fix: blockstore: Add missing locks to autobatch::Get() ([filecoin-project/lotus#7939](https://github.com/filecoin-project/lotus/pull/7939)) + - feat: state: Fast migration for v15 ([filecoin-project/lotus#7933](https://github.com/filecoin-project/lotus/pull/7933)) + - enhancement: #7891 sectors: disable existing existing cc upgrade path 2 days before the upgrade epoch ([filecoin-project/lotus#7900](https://github.com/filecoin-project/lotus/pull/7900)) + - chore: deps: Integrate proof v11.0.0 ([filecoin-project/lotus#7923](https://github.com/filecoin-project/lotus/pull/7923)) + - Snap Deals Lotus Integration: FSM Posting and integration test ([filecoin-project/lotus#7810](https://github.com/filecoin-project/lotus/pull/7810)) + - chore: deps: Update go-paramfetch ([filecoin-project/lotus#7917](https://github.com/filecoin-project/lotus/pull/7917)) + - feat: #7880 gas: add gas charge for VerifyReplicaUpdate ([filecoin-project/lotus#7897](https://github.com/filecoin-project/lotus/pull/7897)) + - misc: build: v1.13.2 back to master ([filecoin-project/lotus#7910](https://github.com/filecoin-project/lotus/pull/7910)) + - FIX: #7904 CI: generated vectors from v7 for bleeding edge ([filecoin-project/lotus#7903](https://github.com/filecoin-project/lotus/pull/7903)) + - misc: docs: remove issue number from the pr title ([filecoin-project/lotus#7902](https://github.com/filecoin-project/lotus/pull/7902)) + - Fix: state: circsuypply calc around null blocks ([filecoin-project/lotus#7890](https://github.com/filecoin-project/lotus/pull/7890)) + - test vector runner fixes for v6 vectors ([filecoin-project/lotus#7881](https://github.com/filecoin-project/lotus/pull/7881)) + - Shed: Add a util to send a batch of messages ([filecoin-project/lotus#7667](https://github.com/filecoin-project/lotus/pull/7667)) + - Snapcraft grade no develgrade ([filecoin-project/lotus#7802](https://github.com/filecoin-project/lotus/pull/7802)) + - fix: doc generation struct slice example value ([filecoin-project/lotus#7851](https://github.com/filecoin-project/lotus/pull/7851)) + - fix: returned error not be accept correctly ([filecoin-project/lotus#7852](https://github.com/filecoin-project/lotus/pull/7852)) + - Add api for transfer diagnostics ([filecoin-project/lotus#7759](https://github.com/filecoin-project/lotus/pull/7759)) + - Refactor: VM: Remove the NetworkVersionGetter ([filecoin-project/lotus#7818](https://github.com/filecoin-project/lotus/pull/7818)) + - fix: #7577 markets: When retrying Add Piece, first seek to start of reader ([filecoin-project/lotus#7812](https://github.com/filecoin-project/lotus/pull/7812)) + - feat: #6017 market: retrieval ask CLI command ([filecoin-project/lotus#7814](https://github.com/filecoin-project/lotus/pull/7814)) + - misc: n/a sealing: Fix grammatical error in a log warning message ([filecoin-project/lotus#7831](https://github.com/filecoin-project/lotus/pull/7831)) + - sectors update-state checks if sector exists before changing its state ([filecoin-project/lotus#7762](https://github.com/filecoin-project/lotus/pull/7762)) + - refactor: state: Move randomness versioning out of the VM ([filecoin-project/lotus#7816](https://github.com/filecoin-project/lotus/pull/7816)) + - feat(graphsync): allow setting of per-peer incoming requests for miners ([filecoin-project/lotus#7578](https://github.com/filecoin-project/lotus/pull/7578)) + - updating to new datastore/blockstore code with contexts ([filecoin-project/lotus#7646](https://github.com/filecoin-project/lotus/pull/7646)) + - Shed: Add a util to list terminated deals ([filecoin-project/lotus#7774](https://github.com/filecoin-project/lotus/pull/7774)) + - VM: Circ supply should be constant per epoch ([filecoin-project/lotus#7811](https://github.com/filecoin-project/lotus/pull/7811)) + - chore: create pull_request_template.md ([filecoin-project/lotus#7726](https://github.com/filecoin-project/lotus/pull/7726)) + - Mempool msg selection should respect block message limits ([filecoin-project/lotus#7321](https://github.com/filecoin-project/lotus/pull/7321)) + - Merge v15 work into master ([filecoin-project/lotus#7784](https://github.com/filecoin-project/lotus/pull/7784)) + - Expose EnableGasTracing as an env_var ([filecoin-project/lotus#7750](https://github.com/filecoin-project/lotus/pull/7750)) + - Minor improvement for OpenTelemetry ([filecoin-project/lotus#7760](https://github.com/filecoin-project/lotus/pull/7760)) + - Sort lotus-miner retrieval-deals by dealId ([filecoin-project/lotus#7749](https://github.com/filecoin-project/lotus/pull/7749)) + - Make retrieval even faster ([filecoin-project/lotus#7746](https://github.com/filecoin-project/lotus/pull/7746)) + - dep/fix 7701 Dependency: update to ipld-legacy to v0.1.1 ([filecoin-project/lotus#7751](https://github.com/filecoin-project/lotus/pull/7751)) + - Command to list active sector locks ([filecoin-project/lotus#7735](https://github.com/filecoin-project/lotus/pull/7735)) + - dagstore pieceReader: Always read full in ReadAt ([filecoin-project/lotus#7737](https://github.com/filecoin-project/lotus/pull/7737)) + - SplitStore: supress compaction near upgrades ([filecoin-project/lotus#7734](https://github.com/filecoin-project/lotus/pull/7734)) + - Disable appimage ([filecoin-project/lotus#7707](https://github.com/filecoin-project/lotus/pull/7707)) + - Initial switch to OpenTelemetry ([filecoin-project/lotus#7725](https://github.com/filecoin-project/lotus/pull/7725)) + - Bump the master version to v1.13.3-dev ([filecoin-project/lotus#7717](https://github.com/filecoin-project/lotus/pull/7717)) +- github.com/filecoin-project/dagstore (v0.4.3 -> v0.4.4): + failed to fetch repo +- github.com/filecoin-project/go-amt-ipld/v4 (null -> v4.0.0): + - v4 (#60) ([filecoin-project/go-amt-ipld#60](https://github.com/filecoin-project/go-amt-ipld/pull/60)) + - Merge pull request from GHSA-3wpc-wmc7-8p5g + - add .github/workflows/tagpush.yml + - add .github/workflows/release-check.yml + - add .github/workflows/releaser.yml + - update .github/workflows/go-check.yml + - update .github/workflows/go-test.yml + - add version.json file + - fix: fix bitWidth error message (#58) ([filecoin-project/go-amt-ipld#58](https://github.com/filecoin-project/go-amt-ipld/pull/58)) + - update .github/workflows/go-check.yml + - update .github/workflows/go-test.yml + - update .github/workflows/automerge.yml +- github.com/filecoin-project/go-commp-utils (v0.1.2 -> v0.1.3): + - chore(deps): clean up dependencies (#7) ([filecoin-project/go-commp-utils#7](https://github.com/filecoin-project/go-commp-utils/pull/7)) +- github.com/filecoin-project/go-ds-versioning (v0.1.0 -> v0.1.1): + - update to context datastores (#3) ([filecoin-project/go-ds-versioning#3](https://github.com/filecoin-project/go-ds-versioning/pull/3)) + - ci(circle): fix versions (#4) ([filecoin-project/go-ds-versioning#4](https://github.com/filecoin-project/go-ds-versioning/pull/4)) +- github.com/filecoin-project/go-fil-markets (v1.13.4 -> v1.19.0): + - release: v1.19.0 + - Update to go-data-transfer v1.14.0 / go-libp2p v0.18.0-rc1 (#669) ([filecoin-project/go-fil-markets#669](https://github.com/filecoin-project/go-fil-markets/pull/669)) + - release: v1.18.0 (#671) ([filecoin-project/go-fil-markets#671](https://github.com/filecoin-project/go-fil-markets/pull/671)) + - revert index provider PR #629 and associated PRs (#670) ([filecoin-project/go-fil-markets#670](https://github.com/filecoin-project/go-fil-markets/pull/670)) + - log advertisement cid for announcement and update deps (#667) ([filecoin-project/go-fil-markets#667](https://github.com/filecoin-project/go-fil-markets/pull/667)) + - release: v1.15.0 ([filecoin-project/go-fil-markets#661](https://github.com/filecoin-project/go-fil-markets/pull/661)) + - retrieve by any CID (not just root CID) and reference provider integration (#629) ([filecoin-project/go-fil-markets#629](https://github.com/filecoin-project/go-fil-markets/pull/629)) + - release: v1.14.1 ([filecoin-project/go-fil-markets#660](https://github.com/filecoin-project/go-fil-markets/pull/660)) + - refactor: isolate commp in its own package to avoid exposing pulling filecoin-ffi (#659) ([filecoin-project/go-fil-markets#659](https://github.com/filecoin-project/go-fil-markets/pull/659)) + - release: v1.14.0 ([filecoin-project/go-fil-markets#658](https://github.com/filecoin-project/go-fil-markets/pull/658)) + - add SeekStart method to inflator reader (#656) ([filecoin-project/go-fil-markets#656](https://github.com/filecoin-project/go-fil-markets/pull/656)) + - Merge tag 'v1.13.6' + - Timeout provider after waiting a period of time for transfer to restart (#655) ([filecoin-project/go-fil-markets#655](https://github.com/filecoin-project/go-fil-markets/pull/655)) + - Update to context datastores (#653) ([filecoin-project/go-fil-markets#653](https://github.com/filecoin-project/go-fil-markets/pull/653)) + - Fix and de-dupe link to spec (#652) ([filecoin-project/go-fil-markets#652](https://github.com/filecoin-project/go-fil-markets/pull/652)) + - release: v1.13.4 (#651) ([filecoin-project/go-fil-markets#651](https://github.com/filecoin-project/go-fil-markets/pull/651)) +- github.com/filecoin-project/go-paramfetch (v0.0.2 -> v0.0.4): + - retry fetching once before erroring ([filecoin-project/go-paramfetch#22](https://github.com/filecoin-project/go-paramfetch/pull/22)) + - Always verify SnapDeals params ([filecoin-project/go-paramfetch#20](https://github.com/filecoin-project/go-paramfetch/pull/20)) +- github.com/filecoin-project/go-state-types (v0.1.1 -> v0.1.3): + - CBOR encode Addr Pairs for keys (#35) ([filecoin-project/go-state-types#35](https://github.com/filecoin-project/go-state-types/pull/35)) + - Add AddrPairKey (#34) ([filecoin-project/go-state-types#34](https://github.com/filecoin-project/go-state-types/pull/34)) +- github.com/filecoin-project/go-statestore (v0.1.1 -> v0.2.0): + - update to context datastores ([filecoin-project/go-statestore#10](https://github.com/filecoin-project/go-statestore/pull/10)) +- github.com/filecoin-project/go-storedcounter (v0.0.0-20200421200003-1c99c62e8a5b -> v0.1.0): + - Update go-datastore ([filecoin-project/go-storedcounter#1](https://github.com/filecoin-project/go-storedcounter/pull/1)) +- github.com/filecoin-project/specs-actors/v2 (v2.3.5 -> v2.3.6): + - Update to context datastores (#1541) ([filecoin-project/specs-actors#1541](https://github.com/filecoin-project/specs-actors/pull/1541)) +- github.com/filecoin-project/specs-storage (v0.1.1-0.20201105051918-5188d9774506 -> v0.2.0): + - FinalizeReplicaUpdate (#22) ([filecoin-project/specs-storage#22](https://github.com/filecoin-project/specs-storage/pull/22)) + - Add release of sectorkey and replica update ([filecoin-project/specs-storage#20](https://github.com/filecoin-project/specs-storage/pull/20)) + - Feat/update post gen (#19) ([filecoin-project/specs-storage#19](https://github.com/filecoin-project/specs-storage/pull/19)) + - Add sector key to ReplicaUpdate iface method (#18) ([filecoin-project/specs-storage#18](https://github.com/filecoin-project/specs-storage/pull/18)) + - Update for snap deals (#17) ([filecoin-project/specs-storage#17](https://github.com/filecoin-project/specs-storage/pull/17)) + - Merge remote-tracking branch 'origin/feat/sector-ref' + +Contributors + +| Contributor | Commits | Lines ± | Files Changed | +|-------------|---------|---------|---------------| +| Aayush Rajasekaran | 116 | +12792/-3989 | 579 | +| zenground0 | 38 | +8894/-1521 | 343 | +| vyzo | 121 | +4537/-1470 | 258 | +| zl | 1 | +3725/-309 | 8 | +| dirkmc | 7 | +1392/-1110 | 61 | +| Jennifer Wang | 55 | +890/-806 | 121 | +| Łukasz Magiera | 35 | +1143/-339 | 104 | +| whyrusleeping | 2 | +483/-585 | 28 | +| Darko Brdareski | 14 | +725/-276 | 154 | +| Rod Vagg | 3 | +45/-949 | 12 | +| hannahhoward | 10 | +481/-133 | 35 | +| Hannah Howard | 3 | +371/-234 | 22 | +| c r | 4 | +425/-75 | 18 | +| TheMenko | 8 | +237/-179 | 17 | +| Aayush | 15 | +197/-106 | 57 | +| ZenGround0 | 3 | +263/-25 | 11 | +| Dirk McCormick | 12 | +188/-40 | 27 | +| Peter Rabbitson | 3 | +128/-62 | 3 | +| Steven Allen | 2 | +110/-74 | 2 | +| Raúl Kripalani | 6 | +128/-49 | 9 | +| Whyrusleeping | 1 | +76/-70 | 8 | +| web3-bot | 10 | +99/-17 | 10 | +| Jiaying Wang | 15 | +58/-23 | 15 | +| Aarsh Shah | 1 | +23/-19 | 5 | +| Travis Person | 2 | +2/-20 | 4 | +| Jakub Sztandera | 3 | +13/-5 | 5 | +| gstuart | 3 | +12/-1 | 3 | +| Cory Schwartz | 4 | +5/-6 | 4 | +| pefish | 1 | +4/-3 | 1 | +| Colin Kennedy | 1 | +4/-2 | 1 | +| Rob Quist | 1 | +2/-2 | 1 | +| shotcollin | 1 | +1/-1 | 1 | + # v1.13.2 / 2022-01-09 From 75b8e4c981cf8baac73d654110b33fdedfd66a67 Mon Sep 17 00:00:00 2001 From: Aayush Date: Mon, 14 Feb 2022 13:28:49 -0500 Subject: [PATCH 354/393] fix: sealer: allow enable/disabling ReplicaUpdate tasks --- cmd/lotus-miner/init.go | 15 +++++++++------ cmd/lotus-seal-worker/main.go | 8 ++++++++ cmd/lotus-seal-worker/tasks.go | 13 ++++++++----- documentation/en/cli-lotus-worker.md | 5 +++-- documentation/en/default-lotus-miner-config.toml | 3 +++ extern/sector-storage/manager.go | 4 ++++ node/config/def.go | 1 + 7 files changed, 36 insertions(+), 13 deletions(-) diff --git a/cmd/lotus-miner/init.go b/cmd/lotus-miner/init.go index ae742c66301..59ea75b10c3 100644 --- a/cmd/lotus-miner/init.go +++ b/cmd/lotus-miner/init.go @@ -467,12 +467,15 @@ func storageMinerInit(ctx context.Context, cctx *cli.Context, api v1api.FullNode stor := stores.NewRemote(lstor, si, http.Header(sa), 10, &stores.DefaultPartialFileHandler{}) smgr, err := sectorstorage.New(ctx, lstor, stor, lr, si, sectorstorage.SealerConfig{ - ParallelFetchLimit: 10, - AllowAddPiece: true, - AllowPreCommit1: true, - AllowPreCommit2: true, - AllowCommit: true, - AllowUnseal: true, + ParallelFetchLimit: 10, + AllowAddPiece: true, + AllowPreCommit1: true, + AllowPreCommit2: true, + AllowCommit: true, + AllowUnseal: true, + AllowReplicaUpdate: true, + AllowProveReplicaUpdate2: true, + AllowRegenSectorKey: true, }, wsts, smsts) if err != nil { return err diff --git a/cmd/lotus-seal-worker/main.go b/cmd/lotus-seal-worker/main.go index 84ff1ccddc5..2116dd228d3 100644 --- a/cmd/lotus-seal-worker/main.go +++ b/cmd/lotus-seal-worker/main.go @@ -173,6 +173,11 @@ var runCmd = &cli.Command{ Usage: "enable prove replica update 2", Value: true, }, + &cli.BoolFlag{ + Name: "regen-sector-key", + Usage: "enable regen sector key", + Value: true, + }, &cli.IntFlag{ Name: "parallel-fetch-limit", Usage: "maximum fetch operations to run in parallel", @@ -284,6 +289,9 @@ var runCmd = &cli.Command{ if cctx.Bool("prove-replica-update2") { taskTypes = append(taskTypes, sealtasks.TTProveReplicaUpdate2) } + if cctx.Bool("regen-sector-key") { + taskTypes = append(taskTypes, sealtasks.TTRegenSectorKey) + } if len(taskTypes) == 0 { return xerrors.Errorf("no task types specified") diff --git a/cmd/lotus-seal-worker/tasks.go b/cmd/lotus-seal-worker/tasks.go index 02e5d6cfd8e..52133d09d16 100644 --- a/cmd/lotus-seal-worker/tasks.go +++ b/cmd/lotus-seal-worker/tasks.go @@ -22,11 +22,14 @@ var tasksCmd = &cli.Command{ } var allowSetting = map[sealtasks.TaskType]struct{}{ - sealtasks.TTAddPiece: {}, - sealtasks.TTPreCommit1: {}, - sealtasks.TTPreCommit2: {}, - sealtasks.TTCommit2: {}, - sealtasks.TTUnseal: {}, + sealtasks.TTAddPiece: {}, + sealtasks.TTPreCommit1: {}, + sealtasks.TTPreCommit2: {}, + sealtasks.TTCommit2: {}, + sealtasks.TTUnseal: {}, + sealtasks.TTReplicaUpdate: {}, + sealtasks.TTProveReplicaUpdate2: {}, + sealtasks.TTRegenSectorKey: {}, } var settableStr = func() string { diff --git a/documentation/en/cli-lotus-worker.md b/documentation/en/cli-lotus-worker.md index 89def0b5380..04f55e99c7d 100644 --- a/documentation/en/cli-lotus-worker.md +++ b/documentation/en/cli-lotus-worker.md @@ -46,6 +46,7 @@ OPTIONS: --commit enable commit (32G sectors: all cores or GPUs, 128GiB Memory + 64GiB swap) (default: true) --replica-update enable replica update (default: true) --prove-replica-update2 enable prove replica update 2 (default: true) + --regen-sector-key enable regen sector key (default: true) --parallel-fetch-limit value maximum fetch operations to run in parallel (default: 5) --timeout value used when 'listen' is unspecified. must be a valid duration recognized by golang's time.ParseDuration function (default: "30m") --help, -h show help (default: false) @@ -170,7 +171,7 @@ NAME: lotus-worker tasks enable - Enable a task type USAGE: - lotus-worker tasks enable [command options] [UNS|C2|PC2|PC1|AP] + lotus-worker tasks enable [command options] [UNS|C2|PC2|PC1|PR2|RU|AP|GSK] OPTIONS: --help, -h show help (default: false) @@ -183,7 +184,7 @@ NAME: lotus-worker tasks disable - Disable a task type USAGE: - lotus-worker tasks disable [command options] [UNS|C2|PC2|PC1|AP] + lotus-worker tasks disable [command options] [UNS|C2|PC2|PC1|PR2|RU|AP|GSK] OPTIONS: --help, -h show help (default: false) diff --git a/documentation/en/default-lotus-miner-config.toml b/documentation/en/default-lotus-miner-config.toml index d8c774c7589..818f0b73c8f 100644 --- a/documentation/en/default-lotus-miner-config.toml +++ b/documentation/en/default-lotus-miner-config.toml @@ -438,6 +438,9 @@ # env var: LOTUS_STORAGE_ALLOWPROVEREPLICAUPDATE2 #AllowProveReplicaUpdate2 = true + # env var: LOTUS_STORAGE_ALLOWREGENSECTORKEY + #AllowRegenSectorKey = true + # env var: LOTUS_STORAGE_RESOURCEFILTERING #ResourceFiltering = "hardware" diff --git a/extern/sector-storage/manager.go b/extern/sector-storage/manager.go index fcbfa2e69f7..897ba4f0611 100644 --- a/extern/sector-storage/manager.go +++ b/extern/sector-storage/manager.go @@ -105,6 +105,7 @@ type SealerConfig struct { AllowUnseal bool AllowReplicaUpdate bool AllowProveReplicaUpdate2 bool + AllowRegenSectorKey bool // ResourceFiltering instructs the system which resource filtering strategy // to use when evaluating tasks against this worker. An empty value defaults @@ -169,6 +170,9 @@ func New(ctx context.Context, lstor *stores.Local, stor *stores.Remote, ls store if sc.AllowProveReplicaUpdate2 { localTasks = append(localTasks, sealtasks.TTProveReplicaUpdate2) } + if sc.AllowRegenSectorKey { + localTasks = append(localTasks, sealtasks.TTRegenSectorKey) + } wcfg := WorkerConfig{ IgnoreResourceFiltering: sc.ResourceFiltering == ResourceFilteringDisabled, diff --git a/node/config/def.go b/node/config/def.go index 1573508665c..aceeaadf5df 100644 --- a/node/config/def.go +++ b/node/config/def.go @@ -139,6 +139,7 @@ func DefaultStorageMiner() *StorageMiner { AllowUnseal: true, AllowReplicaUpdate: true, AllowProveReplicaUpdate2: true, + AllowRegenSectorKey: true, // Default to 10 - tcp should still be able to figure this out, and // it's the ratio between 10gbit / 1gbit From 71f0f4c33545b4ab65d34d44b86f862725e4c60e Mon Sep 17 00:00:00 2001 From: Aayush Date: Wed, 16 Feb 2022 13:04:48 -0500 Subject: [PATCH 355/393] feat: tweak v15 migration params --- chain/consensus/filcns/upgrades.go | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/chain/consensus/filcns/upgrades.go b/chain/consensus/filcns/upgrades.go index 2fa020d3db4..116684b9f44 100644 --- a/chain/consensus/filcns/upgrades.go +++ b/chain/consensus/filcns/upgrades.go @@ -165,13 +165,8 @@ func DefaultUpgradeSchedule() stmgr.UpgradeSchedule { Migration: UpgradeActorsV7, PreMigrations: []stmgr.PreMigration{{ PreMigration: PreUpgradeActorsV7, - StartWithin: 120, + StartWithin: 180, DontStartWithin: 60, - StopWithin: 35, - }, { - PreMigration: PreUpgradeActorsV7, - StartWithin: 30, - DontStartWithin: 15, StopWithin: 5, }}, Expensive: true, @@ -1264,7 +1259,7 @@ func upgradeActorsV7Common( root cid.Cid, epoch abi.ChainEpoch, ts *types.TipSet, config nv15.Config, ) (cid.Cid, error) { - writeStore := blockstore.NewAutobatch(ctx, sm.ChainStore().StateBlockstore(), units.GiB) + writeStore := blockstore.NewAutobatch(ctx, sm.ChainStore().StateBlockstore(), units.GiB/4) // TODO: pretty sure we'd achieve nothing by doing this, confirm in review //buf := blockstore.NewTieredBstore(sm.ChainStore().StateBlockstore(), writeStore) store := store.ActorStore(ctx, writeStore) From ae7e5f4b2c65359247588d46454d9831f0684352 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Wed, 16 Feb 2022 19:31:45 -0500 Subject: [PATCH 356/393] typo in variable name --- cmd/lotus-seal-worker/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/lotus-seal-worker/main.go b/cmd/lotus-seal-worker/main.go index 2116dd228d3..9e6843dbf42 100644 --- a/cmd/lotus-seal-worker/main.go +++ b/cmd/lotus-seal-worker/main.go @@ -283,7 +283,7 @@ var runCmd = &cli.Command{ if cctx.Bool("commit") { taskTypes = append(taskTypes, sealtasks.TTCommit2) } - if cctx.Bool("replicaupdate") { + if cctx.Bool("replica-update") { taskTypes = append(taskTypes, sealtasks.TTReplicaUpdate) } if cctx.Bool("prove-replica-update2") { From 3399f721132df8a2c52289ae0b3ef4ce0d895706 Mon Sep 17 00:00:00 2001 From: Aayush Date: Wed, 16 Feb 2022 19:24:28 -0500 Subject: [PATCH 357/393] sealer: fix error message --- extern/storage-sealing/checks.go | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/extern/storage-sealing/checks.go b/extern/storage-sealing/checks.go index 56b0677c468..dc045ded216 100644 --- a/extern/storage-sealing/checks.go +++ b/extern/storage-sealing/checks.go @@ -214,8 +214,13 @@ func checkReplicaUpdate(ctx context.Context, maddr address.Address, si SectorInf if err != nil { return &ErrApi{xerrors.Errorf("calling StateComputeDataCommitment: %w", err)} } - if si.UpdateUnsealed == nil || !commD.Equals(*si.UpdateUnsealed) { - return &ErrBadRU{xerrors.Errorf("on chain CommD differs from sector: %s != %s", commD, si.CommD)} + + if si.UpdateUnsealed == nil { + return &ErrBadRU{xerrors.New("nil UpdateUnsealed cid after replica update")} + } + + if !commD.Equals(*si.UpdateUnsealed) { + return &ErrBadRU{xerrors.Errorf("calculated CommD differs from updated replica: %s != %s", commD, *si.UpdateUnsealed)} } if si.UpdateSealed == nil { From a57594729412710c32077d574424482b6190c1b1 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 22 Feb 2022 12:19:26 +0200 Subject: [PATCH 358/393] update go-libp2p to v0.18.0-rc5 --- go.mod | 4 ++-- go.sum | 11 ++++++----- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/go.mod b/go.mod index f22400ded5a..1f22c71a26b 100644 --- a/go.mod +++ b/go.mod @@ -108,7 +108,7 @@ require ( github.com/kelseyhightower/envconfig v1.4.0 github.com/libp2p/go-buffer-pool v0.0.2 github.com/libp2p/go-eventbus v0.2.1 - github.com/libp2p/go-libp2p v0.18.0-rc4 + github.com/libp2p/go-libp2p v0.18.0-rc5 github.com/libp2p/go-libp2p-connmgr v0.3.1 // indirect github.com/libp2p/go-libp2p-core v0.14.0 github.com/libp2p/go-libp2p-discovery v0.6.0 @@ -120,7 +120,7 @@ require ( github.com/libp2p/go-libp2p-record v0.1.3 github.com/libp2p/go-libp2p-resource-manager v0.1.3 github.com/libp2p/go-libp2p-routing-helpers v0.2.3 - github.com/libp2p/go-libp2p-swarm v0.10.1 + github.com/libp2p/go-libp2p-swarm v0.10.2 github.com/libp2p/go-libp2p-tls v0.3.1 github.com/libp2p/go-libp2p-yamux v0.8.2 github.com/libp2p/go-maddr-filter v0.1.0 diff --git a/go.sum b/go.sum index 6b725b5df74..08eb1c9ee0b 100644 --- a/go.sum +++ b/go.sum @@ -995,8 +995,8 @@ github.com/libp2p/go-libp2p v0.14.4/go.mod h1:EIRU0Of4J5S8rkockZM7eJp2S0UrCyi55m 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-rc1/go.mod h1:RgYlH7IIWHXREimC92bw5Lg1V2R5XmSzuLHb5fTnr+8= -github.com/libp2p/go-libp2p v0.18.0-rc4 h1:OUsSbeu7q+Ck/bV9wHDxFzb08ORqBupHhpCmRBhWrJ8= -github.com/libp2p/go-libp2p v0.18.0-rc4/go.mod h1:wzmsk1ioOq9FGQys2BN5BIw4nugP6+R+CyW3JbPEbbs= +github.com/libp2p/go-libp2p v0.18.0-rc5 h1:88wWDHb9nNo0vBNCupLde3OTnFAkugOCNkrDfl3ivK4= +github.com/libp2p/go-libp2p v0.18.0-rc5/go.mod h1:aZPS5l84bDvCvP4jkyEUT/J6YOpUq33Fgqrs3K59mpI= 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 h1:rABPCO77SjdbJ/eJ/ynIo8vWICy1VEnL5JAxJbQLo1E= github.com/libp2p/go-libp2p-asn-util v0.1.0/go.mod h1:wu+AnM9Ii2KgO5jMmS1rz9dvzTdj8BXqsPR9HR0XB7I= @@ -1181,8 +1181,8 @@ github.com/libp2p/go-libp2p-swarm v0.5.3/go.mod h1:NBn7eNW2lu568L7Ns9wdFrOhgRlkR 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.1 h1:lXW3pgGt+BVmkzcFX61erX7l6Lt+WAamNhwa2Kf3eJM= -github.com/libp2p/go-libp2p-swarm v0.10.1/go.mod h1:Pdkq0QU5a+qu+oyqIV3bknMsnzk9lnNyKvB9acJ5aZs= +github.com/libp2p/go-libp2p-swarm v0.10.2 h1:UaXf+CTq6Ns1N2V1EgqJ9Q3xaRsiN7ImVlDMpirMAWw= +github.com/libp2p/go-libp2p-swarm v0.10.2/go.mod h1:Pdkq0QU5a+qu+oyqIV3bknMsnzk9lnNyKvB9acJ5aZs= 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= @@ -1298,8 +1298,9 @@ github.com/libp2p/go-tcp-transport v0.2.3/go.mod h1:9dvr03yqrPyYGIEN6Dy5UvdJZjyP 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= 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 h1:3ZPW8HAuyRAuFzyabE0hSrCXKKSWzROnZZX7DtcIatY= github.com/libp2p/go-tcp-transport v0.5.0/go.mod h1:UPPL0DIjQqiWRwVAb+CEQlaAG0rp/mCqJfIhFcLHc4Y= +github.com/libp2p/go-tcp-transport v0.5.1 h1:edOOs688VLZAozWC7Kj5/6HHXKNwi9M6wgRmmLa8M6Q= +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= From 30ae1dd8e8ca3f09d6281124d51be10c39102ba2 Mon Sep 17 00:00:00 2001 From: Aayush Date: Tue, 1 Mar 2022 09:47:44 -0500 Subject: [PATCH 359/393] Lotus release v1.15.0-rc2 --- CHANGELOG.md | 4 ++-- build/openrpc/full.json.gz | Bin 26596 -> 26596 bytes build/openrpc/miner.json.gz | Bin 12926 -> 12926 bytes build/openrpc/worker.json.gz | Bin 3960 -> 3960 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, 6 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 158935b2542..44eae6e4bfa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,7 @@ # Lotus changelog -# 1.15.0-rc1 / 2022-02-10 +# 1.15.0-rc2 / 2022-03-01 -This is the first release candidates of v1.15.0, detailed changelog will be updated later. +This is the second release candidates of v1.15.0, detailed changelog will be updated later. - github.com/filecoin-project/lotus: - bump the version to v1.15.0-rc1 diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index ed1abf06e2aadc4a1bdc3a1463a3140e3f88c43d..6b5c3135fcbc36def3460027b158c12914a40818 100644 GIT binary patch delta 23 fcmaEIp7F_f#tD6lwj29>(>Vf5dgp4ovoZhxf@%pR delta 23 fcmaEIp7F_f#tD6lrW^Zx(>Ww#XYgvevoZhxeG3Rl diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index 5a8c320f373874e20dea11be258166c213a4d2c4..f64a87117de1c34302520d8acff22c5c837d562d 100644 GIT binary patch delta 21 dcmeyD@-JmV7h~1N?$?GKoIfWDiB~c)004LP2=M>_ delta 21 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 Date: Wed, 2 Mar 2022 15:20:18 -0500 Subject: [PATCH 360/393] Revert "update go-libp2p to v0.18.0-rc5" This reverts commit a57594729412710c32077d574424482b6190c1b1. --- go.mod | 4 ++-- go.sum | 11 +++++------ 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/go.mod b/go.mod index 51623166c6f..bd3ab2f4ac7 100644 --- a/go.mod +++ b/go.mod @@ -110,7 +110,7 @@ require ( github.com/kelseyhightower/envconfig v1.4.0 github.com/libp2p/go-buffer-pool v0.0.2 github.com/libp2p/go-eventbus v0.2.1 - github.com/libp2p/go-libp2p v0.18.0-rc5 + github.com/libp2p/go-libp2p v0.18.0-rc4 github.com/libp2p/go-libp2p-connmgr v0.3.1 // indirect github.com/libp2p/go-libp2p-core v0.14.0 github.com/libp2p/go-libp2p-discovery v0.6.0 @@ -122,7 +122,7 @@ require ( github.com/libp2p/go-libp2p-record v0.1.3 github.com/libp2p/go-libp2p-resource-manager v0.1.3 github.com/libp2p/go-libp2p-routing-helpers v0.2.3 - github.com/libp2p/go-libp2p-swarm v0.10.2 + github.com/libp2p/go-libp2p-swarm v0.10.1 github.com/libp2p/go-libp2p-tls v0.3.1 github.com/libp2p/go-libp2p-yamux v0.8.2 github.com/libp2p/go-maddr-filter v0.1.0 diff --git a/go.sum b/go.sum index 08eb1c9ee0b..6b725b5df74 100644 --- a/go.sum +++ b/go.sum @@ -995,8 +995,8 @@ github.com/libp2p/go-libp2p v0.14.4/go.mod h1:EIRU0Of4J5S8rkockZM7eJp2S0UrCyi55m 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-rc1/go.mod h1:RgYlH7IIWHXREimC92bw5Lg1V2R5XmSzuLHb5fTnr+8= -github.com/libp2p/go-libp2p v0.18.0-rc5 h1:88wWDHb9nNo0vBNCupLde3OTnFAkugOCNkrDfl3ivK4= -github.com/libp2p/go-libp2p v0.18.0-rc5/go.mod h1:aZPS5l84bDvCvP4jkyEUT/J6YOpUq33Fgqrs3K59mpI= +github.com/libp2p/go-libp2p v0.18.0-rc4 h1:OUsSbeu7q+Ck/bV9wHDxFzb08ORqBupHhpCmRBhWrJ8= +github.com/libp2p/go-libp2p v0.18.0-rc4/go.mod h1:wzmsk1ioOq9FGQys2BN5BIw4nugP6+R+CyW3JbPEbbs= 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 h1:rABPCO77SjdbJ/eJ/ynIo8vWICy1VEnL5JAxJbQLo1E= github.com/libp2p/go-libp2p-asn-util v0.1.0/go.mod h1:wu+AnM9Ii2KgO5jMmS1rz9dvzTdj8BXqsPR9HR0XB7I= @@ -1181,8 +1181,8 @@ github.com/libp2p/go-libp2p-swarm v0.5.3/go.mod h1:NBn7eNW2lu568L7Ns9wdFrOhgRlkR 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 h1:UaXf+CTq6Ns1N2V1EgqJ9Q3xaRsiN7ImVlDMpirMAWw= -github.com/libp2p/go-libp2p-swarm v0.10.2/go.mod h1:Pdkq0QU5a+qu+oyqIV3bknMsnzk9lnNyKvB9acJ5aZs= +github.com/libp2p/go-libp2p-swarm v0.10.1 h1:lXW3pgGt+BVmkzcFX61erX7l6Lt+WAamNhwa2Kf3eJM= +github.com/libp2p/go-libp2p-swarm v0.10.1/go.mod h1:Pdkq0QU5a+qu+oyqIV3bknMsnzk9lnNyKvB9acJ5aZs= 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= @@ -1298,9 +1298,8 @@ github.com/libp2p/go-tcp-transport v0.2.3/go.mod h1:9dvr03yqrPyYGIEN6Dy5UvdJZjyP 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= 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 h1:3ZPW8HAuyRAuFzyabE0hSrCXKKSWzROnZZX7DtcIatY= github.com/libp2p/go-tcp-transport v0.5.0/go.mod h1:UPPL0DIjQqiWRwVAb+CEQlaAG0rp/mCqJfIhFcLHc4Y= -github.com/libp2p/go-tcp-transport v0.5.1 h1:edOOs688VLZAozWC7Kj5/6HHXKNwi9M6wgRmmLa8M6Q= -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= From 7207740af42e3743ca885a939a0b3bbdc198bef7 Mon Sep 17 00:00:00 2001 From: Aayush Date: Wed, 2 Mar 2022 15:21:10 -0500 Subject: [PATCH 361/393] Revert "update libp2p to v0.18.0-rc4" This reverts commit 80e9f762610cc70807b33bf77b99dbb4f58b173b. --- go.mod | 6 +++--- go.sum | 10 ++++------ 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index bd3ab2f4ac7..43a5a3850d4 100644 --- a/go.mod +++ b/go.mod @@ -110,7 +110,7 @@ require ( github.com/kelseyhightower/envconfig v1.4.0 github.com/libp2p/go-buffer-pool v0.0.2 github.com/libp2p/go-eventbus v0.2.1 - github.com/libp2p/go-libp2p v0.18.0-rc4 + github.com/libp2p/go-libp2p v0.18.0-rc3 github.com/libp2p/go-libp2p-connmgr v0.3.1 // indirect github.com/libp2p/go-libp2p-core v0.14.0 github.com/libp2p/go-libp2p-discovery v0.6.0 @@ -118,13 +118,13 @@ require ( github.com/libp2p/go-libp2p-noise v0.3.0 github.com/libp2p/go-libp2p-peerstore v0.6.0 github.com/libp2p/go-libp2p-pubsub v0.6.1 - github.com/libp2p/go-libp2p-quic-transport v0.16.1 + github.com/libp2p/go-libp2p-quic-transport v0.16.0 github.com/libp2p/go-libp2p-record v0.1.3 github.com/libp2p/go-libp2p-resource-manager v0.1.3 github.com/libp2p/go-libp2p-routing-helpers v0.2.3 github.com/libp2p/go-libp2p-swarm v0.10.1 github.com/libp2p/go-libp2p-tls v0.3.1 - github.com/libp2p/go-libp2p-yamux v0.8.2 + github.com/libp2p/go-libp2p-yamux v0.8.1 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 diff --git a/go.sum b/go.sum index 6b725b5df74..5162d7084f8 100644 --- a/go.sum +++ b/go.sum @@ -995,8 +995,8 @@ github.com/libp2p/go-libp2p v0.14.4/go.mod h1:EIRU0Of4J5S8rkockZM7eJp2S0UrCyi55m 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-rc1/go.mod h1:RgYlH7IIWHXREimC92bw5Lg1V2R5XmSzuLHb5fTnr+8= -github.com/libp2p/go-libp2p v0.18.0-rc4 h1:OUsSbeu7q+Ck/bV9wHDxFzb08ORqBupHhpCmRBhWrJ8= -github.com/libp2p/go-libp2p v0.18.0-rc4/go.mod h1:wzmsk1ioOq9FGQys2BN5BIw4nugP6+R+CyW3JbPEbbs= +github.com/libp2p/go-libp2p v0.18.0-rc3 h1:tI+dAFDgOCeHRF6FgvXpqbrVz+ZFabX/pXO2BUdHu4o= +github.com/libp2p/go-libp2p v0.18.0-rc3/go.mod h1:WYL+Xw1iuwi6rdfzw5VIEpD+HqzYucHZ6fcUuumbI3M= 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 h1:rABPCO77SjdbJ/eJ/ynIo8vWICy1VEnL5JAxJbQLo1E= github.com/libp2p/go-libp2p-asn-util v0.1.0/go.mod h1:wu+AnM9Ii2KgO5jMmS1rz9dvzTdj8BXqsPR9HR0XB7I= @@ -1148,9 +1148,8 @@ github.com/libp2p/go-libp2p-quic-transport v0.11.2/go.mod h1:wlanzKtIh6pHrq+0U3p 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 h1:aVg9/jr+R2esov5sH7wkXrmYmqJiUjtLMLYX3L9KYdY= 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 h1:N/XqYXHurphPLDfXYhll8NyqzdZYQqAF4GIr7+SmLV8= -github.com/libp2p/go-libp2p-quic-transport v0.16.1/go.mod h1:1BXjVMzr+w7EkPfiHkKnwsWjPjtfaNT0q8RS3tGDvEQ= 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= @@ -1230,9 +1229,8 @@ github.com/libp2p/go-libp2p-yamux v0.5.4/go.mod h1:tfrXbyaTqqSU654GTvK3ocnSZL3Bu 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 h1:pi7zUeZ4Z9TpbUMntvSvoP3dFD4SEw/VPybxBcOZGzg= github.com/libp2p/go-libp2p-yamux v0.8.1/go.mod h1:rUozF8Jah2dL9LLGyBaBeTQeARdwhefMCTQVQt6QobE= -github.com/libp2p/go-libp2p-yamux v0.8.2 h1:6GKWntresp0TFxMP/oSoH96nV8XKJRdynXsdp43dn0Y= -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= From 94678bacea480310987556bab7d5038dad963507 Mon Sep 17 00:00:00 2001 From: Aayush Date: Wed, 2 Mar 2022 15:21:31 -0500 Subject: [PATCH 362/393] Revert "update go-libp2p to v0.18.0-rc3" This reverts commit e78c4ab9b302a9fd4c00449d3143145b7ff3f234. --- go.mod | 4 ++-- go.sum | 11 +++++------ 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/go.mod b/go.mod index 43a5a3850d4..9e243483339 100644 --- a/go.mod +++ b/go.mod @@ -110,7 +110,7 @@ require ( github.com/kelseyhightower/envconfig v1.4.0 github.com/libp2p/go-buffer-pool v0.0.2 github.com/libp2p/go-eventbus v0.2.1 - github.com/libp2p/go-libp2p v0.18.0-rc3 + github.com/libp2p/go-libp2p v0.18.0-rc2 github.com/libp2p/go-libp2p-connmgr v0.3.1 // indirect github.com/libp2p/go-libp2p-core v0.14.0 github.com/libp2p/go-libp2p-discovery v0.6.0 @@ -120,7 +120,7 @@ require ( github.com/libp2p/go-libp2p-pubsub v0.6.1 github.com/libp2p/go-libp2p-quic-transport v0.16.0 github.com/libp2p/go-libp2p-record v0.1.3 - github.com/libp2p/go-libp2p-resource-manager v0.1.3 + github.com/libp2p/go-libp2p-resource-manager v0.1.2 github.com/libp2p/go-libp2p-routing-helpers v0.2.3 github.com/libp2p/go-libp2p-swarm v0.10.1 github.com/libp2p/go-libp2p-tls v0.3.1 diff --git a/go.sum b/go.sum index 5162d7084f8..48c9ce0903f 100644 --- a/go.sum +++ b/go.sum @@ -995,8 +995,8 @@ github.com/libp2p/go-libp2p v0.14.4/go.mod h1:EIRU0Of4J5S8rkockZM7eJp2S0UrCyi55m 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-rc1/go.mod h1:RgYlH7IIWHXREimC92bw5Lg1V2R5XmSzuLHb5fTnr+8= -github.com/libp2p/go-libp2p v0.18.0-rc3 h1:tI+dAFDgOCeHRF6FgvXpqbrVz+ZFabX/pXO2BUdHu4o= -github.com/libp2p/go-libp2p v0.18.0-rc3/go.mod h1:WYL+Xw1iuwi6rdfzw5VIEpD+HqzYucHZ6fcUuumbI3M= +github.com/libp2p/go-libp2p v0.18.0-rc2 h1:ZLzGMdp1cVwxmA0vFpPVUDPQYUdHHGX7I58nXwpNr7Y= +github.com/libp2p/go-libp2p v0.18.0-rc2/go.mod h1:gGNCvn0T19AzyNPDWej2vsAlZFZVnS+IxqckjnsOyM0= 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 h1:rABPCO77SjdbJ/eJ/ynIo8vWICy1VEnL5JAxJbQLo1E= github.com/libp2p/go-libp2p-asn-util v0.1.0/go.mod h1:wu+AnM9Ii2KgO5jMmS1rz9dvzTdj8BXqsPR9HR0XB7I= @@ -1157,8 +1157,8 @@ github.com/libp2p/go-libp2p-record v0.1.2/go.mod h1:pal0eNcT5nqZaTV7UGhqeGqxFgGd 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.0/go.mod h1:wJPNjeE4XQlxeidwqVY5G6DLOKqFK33u2n8blpl0I6Y= -github.com/libp2p/go-libp2p-resource-manager v0.1.3 h1:Umf0tW6WNXSb6Uoma0YT56azB5iikL/aeGAP7s7+f5o= -github.com/libp2p/go-libp2p-resource-manager v0.1.3/go.mod h1:wJPNjeE4XQlxeidwqVY5G6DLOKqFK33u2n8blpl0I6Y= +github.com/libp2p/go-libp2p-resource-manager v0.1.2 h1:t66B/6EF6ivWEUgvO34NKOT3oPtkb+JTBJHdsIMx+mg= +github.com/libp2p/go-libp2p-resource-manager v0.1.2/go.mod h1:wJPNjeE4XQlxeidwqVY5G6DLOKqFK33u2n8blpl0I6Y= 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= @@ -1211,9 +1211,8 @@ github.com/libp2p/go-libp2p-transport-upgrader v0.4.3/go.mod h1:bpkldbOWXMrXhpZb github.com/libp2p/go-libp2p-transport-upgrader v0.4.6/go.mod h1:JE0WQuQdy+uLZ5zOaI3Nw9dWGYJIA7mywEtP2lMvnyk= 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 h1:ADnLrL7fC4Vy7HPjk9oGof7nDeTqGXuof85Ar6kin9Q= 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 h1:MSMe+tUfxpC9GArTz7a4G5zQKQgGh00Vio87d3j3xIg= -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-yamux v0.1.2/go.mod h1:xUoV/RmYkg6BW/qGxA9XJyg+HzXFYkeXbnhjmnYzKp8= github.com/libp2p/go-libp2p-yamux v0.1.3/go.mod h1:VGSQVrqkh6y4nm0189qqxMtvyBft44MOYYPpYKXiVt4= From 2aab4d4f05e426aa75c60d08198af46967fd4350 Mon Sep 17 00:00:00 2001 From: Aayush Date: Wed, 2 Mar 2022 15:22:06 -0500 Subject: [PATCH 363/393] Revert "update go-libp2p to v0.18.0-rc2" This reverts commit 6e5f5214636599e20f57b9f120f8de091b14b0cc. --- go.mod | 6 +++--- go.sum | 9 +++------ 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index 9e243483339..ce96e08b14d 100644 --- a/go.mod +++ b/go.mod @@ -110,7 +110,7 @@ require ( github.com/kelseyhightower/envconfig v1.4.0 github.com/libp2p/go-buffer-pool v0.0.2 github.com/libp2p/go-eventbus v0.2.1 - github.com/libp2p/go-libp2p v0.18.0-rc2 + github.com/libp2p/go-libp2p v0.18.0-rc1 github.com/libp2p/go-libp2p-connmgr v0.3.1 // indirect github.com/libp2p/go-libp2p-core v0.14.0 github.com/libp2p/go-libp2p-discovery v0.6.0 @@ -122,9 +122,9 @@ require ( github.com/libp2p/go-libp2p-record v0.1.3 github.com/libp2p/go-libp2p-resource-manager v0.1.2 github.com/libp2p/go-libp2p-routing-helpers v0.2.3 - github.com/libp2p/go-libp2p-swarm v0.10.1 + github.com/libp2p/go-libp2p-swarm v0.10.0 github.com/libp2p/go-libp2p-tls v0.3.1 - github.com/libp2p/go-libp2p-yamux v0.8.1 + github.com/libp2p/go-libp2p-yamux v0.8.0 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 diff --git a/go.sum b/go.sum index 48c9ce0903f..e6a94176274 100644 --- a/go.sum +++ b/go.sum @@ -994,9 +994,8 @@ github.com/libp2p/go-libp2p v0.14.3/go.mod h1:d12V4PdKbpL0T1/gsUNN8DfgMuRPDX8bS2 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-rc1 h1:CFHROLGmMwe/p8tR3sHahg/1NSaZa2EGbu7nDmdC+RY= github.com/libp2p/go-libp2p v0.18.0-rc1/go.mod h1:RgYlH7IIWHXREimC92bw5Lg1V2R5XmSzuLHb5fTnr+8= -github.com/libp2p/go-libp2p v0.18.0-rc2 h1:ZLzGMdp1cVwxmA0vFpPVUDPQYUdHHGX7I58nXwpNr7Y= -github.com/libp2p/go-libp2p v0.18.0-rc2/go.mod h1:gGNCvn0T19AzyNPDWej2vsAlZFZVnS+IxqckjnsOyM0= 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 h1:rABPCO77SjdbJ/eJ/ynIo8vWICy1VEnL5JAxJbQLo1E= github.com/libp2p/go-libp2p-asn-util v0.1.0/go.mod h1:wu+AnM9Ii2KgO5jMmS1rz9dvzTdj8BXqsPR9HR0XB7I= @@ -1179,9 +1178,8 @@ github.com/libp2p/go-libp2p-swarm v0.5.0/go.mod h1:sU9i6BoHE0Ve5SKz3y9WfKrh8dUat 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= github.com/libp2p/go-libp2p-swarm v0.9.0/go.mod h1:2f8d8uxTJmpeqHF/1ujjdXZp+98nNIbujVOMEZxCbZ8= +github.com/libp2p/go-libp2p-swarm v0.10.0 h1:1yr7UCwxCN92cw9g9Q+fnJSlk7lOB1RetoEewxhGVL0= github.com/libp2p/go-libp2p-swarm v0.10.0/go.mod h1:71ceMcV6Rg/0rIQ97rsZWMzto1l9LnNquef+efcRbmA= -github.com/libp2p/go-libp2p-swarm v0.10.1 h1:lXW3pgGt+BVmkzcFX61erX7l6Lt+WAamNhwa2Kf3eJM= -github.com/libp2p/go-libp2p-swarm v0.10.1/go.mod h1:Pdkq0QU5a+qu+oyqIV3bknMsnzk9lnNyKvB9acJ5aZs= 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= @@ -1227,9 +1225,8 @@ 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 h1:APQYlttIj+Rr5sfa6siojwsi0ZwcIh/exHIUl9hZr6o= github.com/libp2p/go-libp2p-yamux v0.8.0/go.mod h1:yTkPgN2ib8FHyU1ZcVD7aelzyAqXXwEPbyx+aSKm9h8= -github.com/libp2p/go-libp2p-yamux v0.8.1 h1:pi7zUeZ4Z9TpbUMntvSvoP3dFD4SEw/VPybxBcOZGzg= -github.com/libp2p/go-libp2p-yamux v0.8.1/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= From 6dc696b7459cbcacc1cf3d36c1120f0ab7a47242 Mon Sep 17 00:00:00 2001 From: Aayush Date: Wed, 2 Mar 2022 15:29:25 -0500 Subject: [PATCH 364/393] Revert "feat: update to go-fil-markets v1.19.0" This reverts commit 8a47a71772a412597c34af114ebc36e34a52f72d. --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index ce96e08b14d..b66011246e5 100644 --- a/go.mod +++ b/go.mod @@ -38,7 +38,7 @@ require ( github.com/filecoin-project/go-data-transfer v1.14.0 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.19.0 + github.com/filecoin-project/go-fil-markets v1.19.0-rc1 github.com/filecoin-project/go-jsonrpc v0.1.5 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 e6a94176274..050cd48009f 100644 --- a/go.sum +++ b/go.sum @@ -327,8 +327,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.19.0 h1:kap2q2wTM6tfkVO5gMA5DD9GUeTvkDhMfhjCtEwMDM8= -github.com/filecoin-project/go-fil-markets v1.19.0/go.mod h1:qsb3apmo4RSJYCEq40QxVdU7UZospN6nFJLOBHuaIbc= +github.com/filecoin-project/go-fil-markets v1.19.0-rc1 h1:T8Ql+Yj9bm0nzn9o43WBrRGxtWj2aYRq2UY7hDaep0I= +github.com/filecoin-project/go-fil-markets v1.19.0-rc1/go.mod h1:qsb3apmo4RSJYCEq40QxVdU7UZospN6nFJLOBHuaIbc= 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= From 17ac5835081bf840a1264eaac843cea3e8112556 Mon Sep 17 00:00:00 2001 From: Aayush Date: Wed, 2 Mar 2022 15:29:26 -0500 Subject: [PATCH 365/393] Revert "close the rcmgr on shutdown" This reverts commit 73ec10a49ea6f80b338ada16c16a089f40f645d6. --- node/modules/lp2p/rcmgr.go | 6 ------ 1 file changed, 6 deletions(-) diff --git a/node/modules/lp2p/rcmgr.go b/node/modules/lp2p/rcmgr.go index 8b286ff5ee6..df52b4a4f39 100644 --- a/node/modules/lp2p/rcmgr.go +++ b/node/modules/lp2p/rcmgr.go @@ -1,7 +1,6 @@ package lp2p import ( - "context" "errors" "fmt" "os" @@ -57,11 +56,6 @@ func ResourceManager(lc fx.Lifecycle, repo repo.LockedRepo) (network.ResourceMan return nil, fmt.Errorf("error creating resource manager: %w", err) } - lc.Append(fx.Hook{ - OnStop: func(_ context.Context) error { - return mgr.Close() - }}) - return mgr, nil } From 48e28898a66dcd66522e3978206b1e54db1b8b24 Mon Sep 17 00:00:00 2001 From: Aayush Date: Wed, 2 Mar 2022 15:29:27 -0500 Subject: [PATCH 366/393] Revert "fix lint" This reverts commit 325a4c0e5b16a50fd2d3b89663e065a9116aeacb. --- cli/net.go | 26 +++++++++++++++----------- node/modules/lp2p/rcmgr.go | 2 +- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/cli/net.go b/cli/net.go index 524b0d753e5..18f21f767fc 100644 --- a/cli/net.go +++ b/cli/net.go @@ -643,7 +643,9 @@ var NetStatCmd = &cli.Command{ } enc := json.NewEncoder(os.Stdout) - return enc.Encode(result) + enc.Encode(result) + + return nil }, } @@ -692,19 +694,21 @@ var NetLimitCmd = &cli.Command{ return api.NetSetLimit(ctx, scope, limit) - } + } else { + if len(args) != 1 { + return xerrors.Errorf("must specify exactly one scope") + } + scope := args[0] - if len(args) != 1 { - return xerrors.Errorf("must specify exactly one scope") - } - scope := args[0] + result, err := api.NetLimit(ctx, scope) + if err != nil { + return err + } - result, err := api.NetLimit(ctx, scope) - if err != nil { - return err + enc := json.NewEncoder(os.Stdout) + enc.Encode(result) } - enc := json.NewEncoder(os.Stdout) - return enc.Encode(result) + return nil }, } diff --git a/node/modules/lp2p/rcmgr.go b/node/modules/lp2p/rcmgr.go index df52b4a4f39..a012fc1f427 100644 --- a/node/modules/lp2p/rcmgr.go +++ b/node/modules/lp2p/rcmgr.go @@ -26,7 +26,7 @@ func ResourceManager(lc fx.Lifecycle, repo repo.LockedRepo) (network.ResourceMan limitsIn, err := os.Open(limitsFile) switch { case err == nil: - defer limitsIn.Close() //nolint:errcheck + defer limitsIn.Close() limiter, err = rcmgr.NewDefaultLimiterFromJSON(limitsIn) if err != nil { return nil, fmt.Errorf("error parsing limit file: %w", err) From 7dbf0ced82374a0b57c1650b43eee0fb1ee14f53 Mon Sep 17 00:00:00 2001 From: Aayush Date: Wed, 2 Mar 2022 15:39:14 -0500 Subject: [PATCH 367/393] Revert "make gen and friends" This reverts commit b360c9403f12b460081a32ce9c6e06a450f089cb. --- api/mocks/mock_full.go | 44 -------- api/proxy_gen.go | 39 ------- api/v0api/v0mocks/mock_full.go | 44 -------- documentation/en/api-v0-methods-miner.md | 117 -------------------- documentation/en/api-v0-methods.md | 117 -------------------- documentation/en/api-v1-unstable-methods.md | 117 -------------------- documentation/en/cli-lotus-miner.md | 54 --------- documentation/en/cli-lotus.md | 54 --------- 8 files changed, 586 deletions(-) diff --git a/api/mocks/mock_full.go b/api/mocks/mock_full.go index e985a794d0c..3f9d75433c5 100644 --- a/api/mocks/mock_full.go +++ b/api/mocks/mock_full.go @@ -1811,21 +1811,6 @@ func (mr *MockFullNodeMockRecorder) NetFindPeer(arg0, arg1 interface{}) *gomock. return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetFindPeer", reflect.TypeOf((*MockFullNode)(nil).NetFindPeer), arg0, arg1) } -// NetLimit mocks base method. -func (m *MockFullNode) NetLimit(arg0 context.Context, arg1 string) (api.NetLimit, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "NetLimit", arg0, arg1) - ret0, _ := ret[0].(api.NetLimit) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// NetLimit indicates an expected call of NetLimit. -func (mr *MockFullNodeMockRecorder) NetLimit(arg0, arg1 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetLimit", reflect.TypeOf((*MockFullNode)(nil).NetLimit), arg0, arg1) -} - // NetPeerInfo mocks base method. func (m *MockFullNode) NetPeerInfo(arg0 context.Context, arg1 peer.ID) (*api.ExtendedPeerInfo, error) { m.ctrl.T.Helper() @@ -1871,35 +1856,6 @@ func (mr *MockFullNodeMockRecorder) NetPubsubScores(arg0 interface{}) *gomock.Ca return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetPubsubScores", reflect.TypeOf((*MockFullNode)(nil).NetPubsubScores), arg0) } -// NetSetLimit mocks base method. -func (m *MockFullNode) NetSetLimit(arg0 context.Context, arg1 string, arg2 api.NetLimit) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "NetSetLimit", arg0, arg1, arg2) - ret0, _ := ret[0].(error) - return ret0 -} - -// NetSetLimit indicates an expected call of NetSetLimit. -func (mr *MockFullNodeMockRecorder) NetSetLimit(arg0, arg1, arg2 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetSetLimit", reflect.TypeOf((*MockFullNode)(nil).NetSetLimit), arg0, arg1, arg2) -} - -// NetStat mocks base method. -func (m *MockFullNode) NetStat(arg0 context.Context, arg1 string) (api.NetStat, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "NetStat", arg0, arg1) - ret0, _ := ret[0].(api.NetStat) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// NetStat indicates an expected call of NetStat. -func (mr *MockFullNodeMockRecorder) NetStat(arg0, arg1 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetStat", reflect.TypeOf((*MockFullNode)(nil).NetStat), arg0, arg1) -} - // NodeStatus mocks base method. func (m *MockFullNode) NodeStatus(arg0 context.Context, arg1 bool) (api.NodeStatus, error) { m.ctrl.T.Helper() diff --git a/api/proxy_gen.go b/api/proxy_gen.go index 25a1730afea..f2bc95a90b2 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -587,17 +587,11 @@ type NetStruct struct { NetFindPeer func(p0 context.Context, p1 peer.ID) (peer.AddrInfo, error) `perm:"read"` - NetLimit func(p0 context.Context, p1 string) (NetLimit, error) `perm:"read"` - NetPeerInfo func(p0 context.Context, p1 peer.ID) (*ExtendedPeerInfo, error) `perm:"read"` NetPeers func(p0 context.Context) ([]peer.AddrInfo, error) `perm:"read"` NetPubsubScores func(p0 context.Context) ([]PubsubScore, error) `perm:"read"` - - NetSetLimit func(p0 context.Context, p1 string, p2 NetLimit) error `perm:"admin"` - - NetStat func(p0 context.Context, p1 string) (NetStat, error) `perm:"read"` } } @@ -3637,17 +3631,6 @@ func (s *NetStub) NetFindPeer(p0 context.Context, p1 peer.ID) (peer.AddrInfo, er return *new(peer.AddrInfo), ErrNotSupported } -func (s *NetStruct) NetLimit(p0 context.Context, p1 string) (NetLimit, error) { - if s.Internal.NetLimit == nil { - return *new(NetLimit), ErrNotSupported - } - return s.Internal.NetLimit(p0, p1) -} - -func (s *NetStub) NetLimit(p0 context.Context, p1 string) (NetLimit, error) { - return *new(NetLimit), ErrNotSupported -} - func (s *NetStruct) NetPeerInfo(p0 context.Context, p1 peer.ID) (*ExtendedPeerInfo, error) { if s.Internal.NetPeerInfo == nil { return nil, ErrNotSupported @@ -3681,28 +3664,6 @@ func (s *NetStub) NetPubsubScores(p0 context.Context) ([]PubsubScore, error) { return *new([]PubsubScore), ErrNotSupported } -func (s *NetStruct) NetSetLimit(p0 context.Context, p1 string, p2 NetLimit) error { - if s.Internal.NetSetLimit == nil { - return ErrNotSupported - } - return s.Internal.NetSetLimit(p0, p1, p2) -} - -func (s *NetStub) NetSetLimit(p0 context.Context, p1 string, p2 NetLimit) error { - return ErrNotSupported -} - -func (s *NetStruct) NetStat(p0 context.Context, p1 string) (NetStat, error) { - if s.Internal.NetStat == nil { - return *new(NetStat), ErrNotSupported - } - return s.Internal.NetStat(p0, p1) -} - -func (s *NetStub) NetStat(p0 context.Context, p1 string) (NetStat, error) { - return *new(NetStat), ErrNotSupported -} - func (s *SignableStruct) Sign(p0 context.Context, p1 SignFunc) error { if s.Internal.Sign == nil { return ErrNotSupported diff --git a/api/v0api/v0mocks/mock_full.go b/api/v0api/v0mocks/mock_full.go index 26d7959404b..3e9caaee822 100644 --- a/api/v0api/v0mocks/mock_full.go +++ b/api/v0api/v0mocks/mock_full.go @@ -1724,21 +1724,6 @@ func (mr *MockFullNodeMockRecorder) NetFindPeer(arg0, arg1 interface{}) *gomock. return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetFindPeer", reflect.TypeOf((*MockFullNode)(nil).NetFindPeer), arg0, arg1) } -// NetLimit mocks base method. -func (m *MockFullNode) NetLimit(arg0 context.Context, arg1 string) (api.NetLimit, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "NetLimit", arg0, arg1) - ret0, _ := ret[0].(api.NetLimit) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// NetLimit indicates an expected call of NetLimit. -func (mr *MockFullNodeMockRecorder) NetLimit(arg0, arg1 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetLimit", reflect.TypeOf((*MockFullNode)(nil).NetLimit), arg0, arg1) -} - // NetPeerInfo mocks base method. func (m *MockFullNode) NetPeerInfo(arg0 context.Context, arg1 peer.ID) (*api.ExtendedPeerInfo, error) { m.ctrl.T.Helper() @@ -1784,35 +1769,6 @@ func (mr *MockFullNodeMockRecorder) NetPubsubScores(arg0 interface{}) *gomock.Ca return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetPubsubScores", reflect.TypeOf((*MockFullNode)(nil).NetPubsubScores), arg0) } -// NetSetLimit mocks base method. -func (m *MockFullNode) NetSetLimit(arg0 context.Context, arg1 string, arg2 api.NetLimit) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "NetSetLimit", arg0, arg1, arg2) - ret0, _ := ret[0].(error) - return ret0 -} - -// NetSetLimit indicates an expected call of NetSetLimit. -func (mr *MockFullNodeMockRecorder) NetSetLimit(arg0, arg1, arg2 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetSetLimit", reflect.TypeOf((*MockFullNode)(nil).NetSetLimit), arg0, arg1, arg2) -} - -// NetStat mocks base method. -func (m *MockFullNode) NetStat(arg0 context.Context, arg1 string) (api.NetStat, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "NetStat", arg0, arg1) - ret0, _ := ret[0].(api.NetStat) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// NetStat indicates an expected call of NetStat. -func (mr *MockFullNodeMockRecorder) NetStat(arg0, arg1 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetStat", reflect.TypeOf((*MockFullNode)(nil).NetStat), arg0, arg1) -} - // PaychAllocateLane mocks base method. func (m *MockFullNode) PaychAllocateLane(arg0 context.Context, arg1 address.Address) (uint64, error) { m.ctrl.T.Helper() diff --git a/documentation/en/api-v0-methods-miner.md b/documentation/en/api-v0-methods-miner.md index a84f8984287..1c3bbb5b1ea 100644 --- a/documentation/en/api-v0-methods-miner.md +++ b/documentation/en/api-v0-methods-miner.md @@ -81,12 +81,9 @@ * [NetConnectedness](#NetConnectedness) * [NetDisconnect](#NetDisconnect) * [NetFindPeer](#NetFindPeer) - * [NetLimit](#NetLimit) * [NetPeerInfo](#NetPeerInfo) * [NetPeers](#NetPeers) * [NetPubsubScores](#NetPubsubScores) - * [NetSetLimit](#NetSetLimit) - * [NetStat](#NetStat) * [Pieces](#Pieces) * [PiecesGetCIDInfo](#PiecesGetCIDInfo) * [PiecesGetPieceInfo](#PiecesGetPieceInfo) @@ -1706,32 +1703,6 @@ Response: } ``` -### NetLimit - - -Perms: read - -Inputs: -```json -[ - "string value" -] -``` - -Response: -```json -{ - "Memory": 123, - "Streams": 3, - "StreamsInbound": 1, - "StreamsOutbound": 2, - "Conns": 4, - "ConnsInbound": 3, - "ConnsOutbound": 4, - "FD": 5 -} -``` - ### NetPeerInfo @@ -1817,94 +1788,6 @@ Response: ] ``` -### NetSetLimit - - -Perms: admin - -Inputs: -```json -[ - "string value", - { - "Memory": 123, - "Streams": 3, - "StreamsInbound": 1, - "StreamsOutbound": 2, - "Conns": 4, - "ConnsInbound": 3, - "ConnsOutbound": 4, - "FD": 5 - } -] -``` - -Response: `{}` - -### NetStat - - -Perms: read - -Inputs: -```json -[ - "string value" -] -``` - -Response: -```json -{ - "System": { - "NumStreamsInbound": 123, - "NumStreamsOutbound": 123, - "NumConnsInbound": 123, - "NumConnsOutbound": 123, - "NumFD": 123, - "Memory": 9 - }, - "Transient": { - "NumStreamsInbound": 123, - "NumStreamsOutbound": 123, - "NumConnsInbound": 123, - "NumConnsOutbound": 123, - "NumFD": 123, - "Memory": 9 - }, - "Services": { - "abc": { - "NumStreamsInbound": 1, - "NumStreamsOutbound": 2, - "NumConnsInbound": 3, - "NumConnsOutbound": 4, - "NumFD": 5, - "Memory": 123 - } - }, - "Protocols": { - "abc": { - "NumStreamsInbound": 1, - "NumStreamsOutbound": 2, - "NumConnsInbound": 3, - "NumConnsOutbound": 4, - "NumFD": 5, - "Memory": 123 - } - }, - "Peers": { - "abc": { - "NumStreamsInbound": 1, - "NumStreamsOutbound": 2, - "NumConnsInbound": 3, - "NumConnsOutbound": 4, - "NumFD": 5, - "Memory": 123 - } - } -} -``` - ## Pieces diff --git a/documentation/en/api-v0-methods.md b/documentation/en/api-v0-methods.md index 883d4d27499..88c4d818760 100644 --- a/documentation/en/api-v0-methods.md +++ b/documentation/en/api-v0-methods.md @@ -128,12 +128,9 @@ * [NetConnectedness](#NetConnectedness) * [NetDisconnect](#NetDisconnect) * [NetFindPeer](#NetFindPeer) - * [NetLimit](#NetLimit) * [NetPeerInfo](#NetPeerInfo) * [NetPeers](#NetPeers) * [NetPubsubScores](#NetPubsubScores) - * [NetSetLimit](#NetSetLimit) - * [NetStat](#NetStat) * [Paych](#Paych) * [PaychAllocateLane](#PaychAllocateLane) * [PaychAvailableFunds](#PaychAvailableFunds) @@ -3824,32 +3821,6 @@ Response: } ``` -### NetLimit - - -Perms: read - -Inputs: -```json -[ - "string value" -] -``` - -Response: -```json -{ - "Memory": 123, - "Streams": 3, - "StreamsInbound": 1, - "StreamsOutbound": 2, - "Conns": 4, - "ConnsInbound": 3, - "ConnsOutbound": 4, - "FD": 5 -} -``` - ### NetPeerInfo @@ -3935,94 +3906,6 @@ Response: ] ``` -### NetSetLimit - - -Perms: admin - -Inputs: -```json -[ - "string value", - { - "Memory": 123, - "Streams": 3, - "StreamsInbound": 1, - "StreamsOutbound": 2, - "Conns": 4, - "ConnsInbound": 3, - "ConnsOutbound": 4, - "FD": 5 - } -] -``` - -Response: `{}` - -### NetStat - - -Perms: read - -Inputs: -```json -[ - "string value" -] -``` - -Response: -```json -{ - "System": { - "NumStreamsInbound": 123, - "NumStreamsOutbound": 123, - "NumConnsInbound": 123, - "NumConnsOutbound": 123, - "NumFD": 123, - "Memory": 9 - }, - "Transient": { - "NumStreamsInbound": 123, - "NumStreamsOutbound": 123, - "NumConnsInbound": 123, - "NumConnsOutbound": 123, - "NumFD": 123, - "Memory": 9 - }, - "Services": { - "abc": { - "NumStreamsInbound": 1, - "NumStreamsOutbound": 2, - "NumConnsInbound": 3, - "NumConnsOutbound": 4, - "NumFD": 5, - "Memory": 123 - } - }, - "Protocols": { - "abc": { - "NumStreamsInbound": 1, - "NumStreamsOutbound": 2, - "NumConnsInbound": 3, - "NumConnsOutbound": 4, - "NumFD": 5, - "Memory": 123 - } - }, - "Peers": { - "abc": { - "NumStreamsInbound": 1, - "NumStreamsOutbound": 2, - "NumConnsInbound": 3, - "NumConnsOutbound": 4, - "NumFD": 5, - "Memory": 123 - } - } -} -``` - ## Paych The Paych methods are for interacting with and managing payment channels diff --git a/documentation/en/api-v1-unstable-methods.md b/documentation/en/api-v1-unstable-methods.md index a5fdd999429..7d5f4665e91 100644 --- a/documentation/en/api-v1-unstable-methods.md +++ b/documentation/en/api-v1-unstable-methods.md @@ -134,12 +134,9 @@ * [NetConnectedness](#NetConnectedness) * [NetDisconnect](#NetDisconnect) * [NetFindPeer](#NetFindPeer) - * [NetLimit](#NetLimit) * [NetPeerInfo](#NetPeerInfo) * [NetPeers](#NetPeers) * [NetPubsubScores](#NetPubsubScores) - * [NetSetLimit](#NetSetLimit) - * [NetStat](#NetStat) * [Node](#Node) * [NodeStatus](#NodeStatus) * [Paych](#Paych) @@ -4185,32 +4182,6 @@ Response: } ``` -### NetLimit - - -Perms: read - -Inputs: -```json -[ - "string value" -] -``` - -Response: -```json -{ - "Memory": 123, - "Streams": 3, - "StreamsInbound": 1, - "StreamsOutbound": 2, - "Conns": 4, - "ConnsInbound": 3, - "ConnsOutbound": 4, - "FD": 5 -} -``` - ### NetPeerInfo @@ -4296,94 +4267,6 @@ Response: ] ``` -### NetSetLimit - - -Perms: admin - -Inputs: -```json -[ - "string value", - { - "Memory": 123, - "Streams": 3, - "StreamsInbound": 1, - "StreamsOutbound": 2, - "Conns": 4, - "ConnsInbound": 3, - "ConnsOutbound": 4, - "FD": 5 - } -] -``` - -Response: `{}` - -### NetStat - - -Perms: read - -Inputs: -```json -[ - "string value" -] -``` - -Response: -```json -{ - "System": { - "NumStreamsInbound": 123, - "NumStreamsOutbound": 123, - "NumConnsInbound": 123, - "NumConnsOutbound": 123, - "NumFD": 123, - "Memory": 9 - }, - "Transient": { - "NumStreamsInbound": 123, - "NumStreamsOutbound": 123, - "NumConnsInbound": 123, - "NumConnsOutbound": 123, - "NumFD": 123, - "Memory": 9 - }, - "Services": { - "abc": { - "NumStreamsInbound": 1, - "NumStreamsOutbound": 2, - "NumConnsInbound": 3, - "NumConnsOutbound": 4, - "NumFD": 5, - "Memory": 123 - } - }, - "Protocols": { - "abc": { - "NumStreamsInbound": 1, - "NumStreamsOutbound": 2, - "NumConnsInbound": 3, - "NumConnsOutbound": 4, - "NumFD": 5, - "Memory": 123 - } - }, - "Peers": { - "abc": { - "NumStreamsInbound": 1, - "NumStreamsOutbound": 2, - "NumConnsInbound": 3, - "NumConnsOutbound": 4, - "NumFD": 5, - "Memory": 123 - } - } -} -``` - ## Node These methods are general node management and status commands diff --git a/documentation/en/cli-lotus-miner.md b/documentation/en/cli-lotus-miner.md index bce1f1c47e4..ab0622ab10d 100644 --- a/documentation/en/cli-lotus-miner.md +++ b/documentation/en/cli-lotus-miner.md @@ -1160,8 +1160,6 @@ COMMANDS: reachability Print information about reachability from the internet bandwidth Print bandwidth usage information block Manage network connection gating rules - stat Report resource usage for a scope - limit Get or set resource limits for a scope help, h Shows a list of commands or help for one command OPTIONS: @@ -1430,58 +1428,6 @@ OPTIONS: ``` -### lotus-miner net stat -``` -NAME: - lotus-miner net stat - Report resource usage for a scope - -USAGE: - lotus-miner net stat [command options] scope - -DESCRIPTION: - Report resource usage for a scope. - - The scope can be one of the following: - - system -- reports the system aggregate resource usage. - - transient -- reports the transient resource usage. - - svc: -- reports the resource usage of a specific service. - - proto: -- reports the resource usage of a specific protocol. - - peer: -- reports the resource usage of a specific peer. - - all -- reports the resource usage for all currently active scopes. - - -OPTIONS: - --help, -h show help (default: false) - -``` - -### lotus-miner net limit -``` -NAME: - lotus-miner net limit - Get or set resource limits for a scope - -USAGE: - lotus-miner net limit [command options] scope [limit] - -DESCRIPTION: - Get or set resource limits for a scope. - - The scope can be one of the following: - - system -- reports the system aggregate resource usage. - - transient -- reports the transient resource usage. - - svc: -- reports the resource usage of a specific service. - - proto: -- reports the resource usage of a specific protocol. - - peer: -- reports the resource usage of a specific peer. - - The limit is json-formatted, with the same structure as the limits file. - - -OPTIONS: - --set set the limit for a scope (default: false) - --help, -h show help (default: false) - -``` - ## lotus-miner pieces ``` NAME: diff --git a/documentation/en/cli-lotus.md b/documentation/en/cli-lotus.md index a5fd6deb935..b69ae2cacb5 100644 --- a/documentation/en/cli-lotus.md +++ b/documentation/en/cli-lotus.md @@ -2616,8 +2616,6 @@ COMMANDS: reachability Print information about reachability from the internet bandwidth Print bandwidth usage information block Manage network connection gating rules - stat Report resource usage for a scope - limit Get or set resource limits for a scope help, h Shows a list of commands or help for one command OPTIONS: @@ -2886,58 +2884,6 @@ OPTIONS: ``` -### lotus net stat -``` -NAME: - lotus net stat - Report resource usage for a scope - -USAGE: - lotus net stat [command options] scope - -DESCRIPTION: - Report resource usage for a scope. - - The scope can be one of the following: - - system -- reports the system aggregate resource usage. - - transient -- reports the transient resource usage. - - svc: -- reports the resource usage of a specific service. - - proto: -- reports the resource usage of a specific protocol. - - peer: -- reports the resource usage of a specific peer. - - all -- reports the resource usage for all currently active scopes. - - -OPTIONS: - --help, -h show help (default: false) - -``` - -### lotus net limit -``` -NAME: - lotus net limit - Get or set resource limits for a scope - -USAGE: - lotus net limit [command options] scope [limit] - -DESCRIPTION: - Get or set resource limits for a scope. - - The scope can be one of the following: - - system -- reports the system aggregate resource usage. - - transient -- reports the transient resource usage. - - svc: -- reports the resource usage of a specific service. - - proto: -- reports the resource usage of a specific protocol. - - peer: -- reports the resource usage of a specific peer. - - The limit is json-formatted, with the same structure as the limits file. - - -OPTIONS: - --set set the limit for a scope (default: false) - --help, -h show help (default: false) - -``` - ## lotus sync ``` NAME: From bf0470ad0903e7c780f95a6c0cd4cb5de29652fe Mon Sep 17 00:00:00 2001 From: Aayush Date: Wed, 2 Mar 2022 15:39:15 -0500 Subject: [PATCH 368/393] Revert "fix issues with fil-markets/data-transfer updates" This reverts commit ca4ee1e8cfb202c8f76f63d5b1a6f3aff6ec24e6. --- markets/loggers/loggers.go | 1 + 1 file changed, 1 insertion(+) diff --git a/markets/loggers/loggers.go b/markets/loggers/loggers.go index 0d542a45dcd..2d13a64a19d 100644 --- a/markets/loggers/loggers.go +++ b/markets/loggers/loggers.go @@ -40,6 +40,7 @@ func DataTransferLogger(event datatransfer.Event, state datatransfer.ChannelStat "sent", state.Sent(), "received", state.Received(), "queued", state.Queued(), + "received count", state.ReceivedCidsTotal(), "total size", state.TotalSize(), "remote peer", state.OtherPeer(), "event message", event.Message, From a7e02f7207180c42655a60efb0ab1443d0e1a3e6 Mon Sep 17 00:00:00 2001 From: Aayush Date: Wed, 2 Mar 2022 15:39:16 -0500 Subject: [PATCH 369/393] Revert "update go-fil-markets@v0.19.0-rc1" This reverts commit 2e5474e864d0f3ffd323f881946faa1b7c0a707d. --- go.mod | 5 +++-- go.sum | 8 ++++---- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index b66011246e5..e59744190c4 100644 --- a/go.mod +++ b/go.mod @@ -35,10 +35,10 @@ require ( github.com/filecoin-project/go-cbor-util v0.0.1 github.com/filecoin-project/go-commp-utils v0.1.3 github.com/filecoin-project/go-crypto v0.0.1 - github.com/filecoin-project/go-data-transfer v1.14.0 + github.com/filecoin-project/go-data-transfer v1.13.0 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.19.0-rc1 + github.com/filecoin-project/go-fil-markets v1.17.0 github.com/filecoin-project/go-jsonrpc v0.1.5 github.com/filecoin-project/go-padreader v0.0.1 github.com/filecoin-project/go-paramfetch v0.0.4 @@ -126,6 +126,7 @@ require ( github.com/libp2p/go-libp2p-tls v0.3.1 github.com/libp2p/go-libp2p-yamux v0.8.0 github.com/libp2p/go-maddr-filter v0.1.0 + github.com/libp2p/go-yamux/v3 v3.0.2 // indirect 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 diff --git a/go.sum b/go.sum index 050cd48009f..7d5b7200f71 100644 --- a/go.sum +++ b/go.sum @@ -316,8 +316,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-data-transfer v1.14.0 h1:4pnfJk8FYtqcdAg+QRGzaz57seUC/Tz+HJgPuGB7zdg= -github.com/filecoin-project/go-data-transfer v1.14.0/go.mod h1:wNJKhaLLYBJDM3VFvgvYi4iUjPa69pz/1Q5Q4HzX2wE= +github.com/filecoin-project/go-data-transfer v1.13.0 h1:UqjBfacClqAmnzukek1oPxJXDM3l5UI/WX8CRN2/VkM= +github.com/filecoin-project/go-data-transfer v1.13.0/go.mod h1:TcUtAdQl1ofnLV9oH3gPC93Hjce9yuKnq4O4j2M/BU4= 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= @@ -327,8 +327,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.19.0-rc1 h1:T8Ql+Yj9bm0nzn9o43WBrRGxtWj2aYRq2UY7hDaep0I= -github.com/filecoin-project/go-fil-markets v1.19.0-rc1/go.mod h1:qsb3apmo4RSJYCEq40QxVdU7UZospN6nFJLOBHuaIbc= +github.com/filecoin-project/go-fil-markets v1.17.0 h1:i9U6hZ+peri6Ygfwoda0YBk4bo1SHkd58EPBRgXCRlQ= +github.com/filecoin-project/go-fil-markets v1.17.0/go.mod h1:tKRMkDovSJiUo8yDt6YQM/gHMfNVYya0YTdayGhRnRY= 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= From ce040b7d338c39bd551180ae1ec615a5a23de446 Mon Sep 17 00:00:00 2001 From: Aayush Date: Wed, 2 Mar 2022 15:39:17 -0500 Subject: [PATCH 370/393] Revert "add description for net stat and limit commands" This reverts commit 19c8ea328808c36d2d7128dd4e45e8d5098914ef. --- cli/net.go | 25 ++----------------------- 1 file changed, 2 insertions(+), 23 deletions(-) diff --git a/cli/net.go b/cli/net.go index 18f21f767fc..104b4b40ebd 100644 --- a/cli/net.go +++ b/cli/net.go @@ -611,18 +611,8 @@ var NetBlockListCmd = &cli.Command{ var NetStatCmd = &cli.Command{ Name: "stat", - Usage: "Report resource usage for a scope", + Usage: "report resource stat for a scope", ArgsUsage: "scope", - Description: `Report resource usage for a scope. - - The scope can be one of the following: - - system -- reports the system aggregate resource usage. - - transient -- reports the transient resource usage. - - svc: -- reports the resource usage of a specific service. - - proto: -- reports the resource usage of a specific protocol. - - peer: -- reports the resource usage of a specific peer. - - all -- reports the resource usage for all currently active scopes. -`, Action: func(cctx *cli.Context) error { api, closer, err := GetAPI(cctx) if err != nil { @@ -651,19 +641,8 @@ var NetStatCmd = &cli.Command{ var NetLimitCmd = &cli.Command{ Name: "limit", - Usage: "Get or set resource limits for a scope", + Usage: "get or set resource limit for a scope", ArgsUsage: "scope [limit]", - Description: `Get or set resource limits for a scope. - - The scope can be one of the following: - - system -- reports the system aggregate resource usage. - - transient -- reports the transient resource usage. - - svc: -- reports the resource usage of a specific service. - - proto: -- reports the resource usage of a specific protocol. - - peer: -- reports the resource usage of a specific peer. - - The limit is json-formatted, with the same structure as the limits file. -`, Flags: []cli.Flag{ &cli.BoolFlag{ Name: "set", From 4968babb32a3e18437354ebdd52bd5dc89c80c63 Mon Sep 17 00:00:00 2001 From: Aayush Date: Wed, 2 Mar 2022 15:39:17 -0500 Subject: [PATCH 371/393] Revert "go mod: update go-libp2p-resource-manager@v0.1.2" This reverts commit 6260271b780ad2a7d9cd4d15c5646c843136c54c. --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index e59744190c4..0f3ae1da737 100644 --- a/go.mod +++ b/go.mod @@ -120,7 +120,7 @@ require ( github.com/libp2p/go-libp2p-pubsub v0.6.1 github.com/libp2p/go-libp2p-quic-transport v0.16.0 github.com/libp2p/go-libp2p-record v0.1.3 - github.com/libp2p/go-libp2p-resource-manager v0.1.2 + github.com/libp2p/go-libp2p-resource-manager v0.1.1 github.com/libp2p/go-libp2p-routing-helpers v0.2.3 github.com/libp2p/go-libp2p-swarm v0.10.0 github.com/libp2p/go-libp2p-tls v0.3.1 diff --git a/go.sum b/go.sum index 7d5b7200f71..a3eff47942a 100644 --- a/go.sum +++ b/go.sum @@ -1156,8 +1156,8 @@ github.com/libp2p/go-libp2p-record v0.1.2/go.mod h1:pal0eNcT5nqZaTV7UGhqeGqxFgGd 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.0/go.mod h1:wJPNjeE4XQlxeidwqVY5G6DLOKqFK33u2n8blpl0I6Y= -github.com/libp2p/go-libp2p-resource-manager v0.1.2 h1:t66B/6EF6ivWEUgvO34NKOT3oPtkb+JTBJHdsIMx+mg= -github.com/libp2p/go-libp2p-resource-manager v0.1.2/go.mod h1:wJPNjeE4XQlxeidwqVY5G6DLOKqFK33u2n8blpl0I6Y= +github.com/libp2p/go-libp2p-resource-manager v0.1.1 h1:JZ++ezpl2SVP2bj4Z+EPSmrKFS9vQVpkgC28G3DBJcA= +github.com/libp2p/go-libp2p-resource-manager v0.1.1/go.mod h1:wJPNjeE4XQlxeidwqVY5G6DLOKqFK33u2n8blpl0I6Y= 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= From 581cb34b11695a8666280ccb3bdb690b2e0a8570 Mon Sep 17 00:00:00 2001 From: Aayush Date: Wed, 2 Mar 2022 15:39:18 -0500 Subject: [PATCH 372/393] Revert "go mod: update go-yamux@v3.0.2" This reverts commit 83427c478f5af534e39f92dcc2f378627ce63fef. --- go.mod | 1 - go.sum | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 0f3ae1da737..8fd765eda87 100644 --- a/go.mod +++ b/go.mod @@ -126,7 +126,6 @@ require ( github.com/libp2p/go-libp2p-tls v0.3.1 github.com/libp2p/go-libp2p-yamux v0.8.0 github.com/libp2p/go-maddr-filter v0.1.0 - github.com/libp2p/go-yamux/v3 v3.0.2 // indirect 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 diff --git a/go.sum b/go.sum index a3eff47942a..e29c59dba1e 100644 --- a/go.sum +++ b/go.sum @@ -1317,9 +1317,8 @@ 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.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 h1:lIdxHGVZ+y/EHgCrqGNt4Q+Mk9qu26MbOWH/yRw+Ihk= github.com/libp2p/go-yamux/v3 v3.0.1/go.mod h1:s2LsDhHbh+RfCsQoICSYt58U2f8ijtPANFD8BmE74Bo= -github.com/libp2p/go-yamux/v3 v3.0.2 h1:LW0q5+A1Wy0npEsPJP9wmare2NH4ohNluN5EWVwv2mE= -github.com/libp2p/go-yamux/v3 v3.0.2/go.mod h1:s2LsDhHbh+RfCsQoICSYt58U2f8ijtPANFD8BmE74Bo= 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= From e49d499bb5d108e92a38f5a58f740837fa9a2981 Mon Sep 17 00:00:00 2001 From: Aayush Date: Wed, 2 Mar 2022 15:39:18 -0500 Subject: [PATCH 373/393] Revert "fix mocknet.New invocation" This reverts commit 0870f48b5caaaa78e505b398ce13962b5ecdbc19. --- chain/sync_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/chain/sync_test.go b/chain/sync_test.go index 35566169f2c..0779551bca5 100644 --- a/chain/sync_test.go +++ b/chain/sync_test.go @@ -104,7 +104,7 @@ func prepSyncTest(t testing.TB, h int) *syncTestUtil { ctx: ctx, cancel: cancel, - mn: mocknet.New(), + mn: mocknet.New(ctx), g: g, us: filcns.DefaultUpgradeSchedule(), } @@ -158,7 +158,7 @@ func prepSyncTestWithV5Height(t testing.TB, h int, v5height abi.ChainEpoch) *syn ctx: ctx, cancel: cancel, - mn: mocknet.New(), + mn: mocknet.New(ctx), g: g, us: sched, } From f281027a1c204cb18c41c917ec385a56d382e707 Mon Sep 17 00:00:00 2001 From: Aayush Date: Wed, 2 Mar 2022 15:39:19 -0500 Subject: [PATCH 374/393] Revert "fix mocknet.New invocation" This reverts commit c3fb68545a7fe8ce572f947907100e46d2d52fdb. --- itests/kit/ensemble.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/itests/kit/ensemble.go b/itests/kit/ensemble.go index 0227ee81e70..dfd3d8cd74a 100644 --- a/itests/kit/ensemble.go +++ b/itests/kit/ensemble.go @@ -277,7 +277,7 @@ func (n *Ensemble) Start() *Ensemble { // We haven't been bootstrapped yet, we need to generate genesis and // create the networking backbone. gtempl = n.generateGenesis() - n.mn = mocknet.New() + n.mn = mocknet.New(ctx) } // --------------------- From f9f6f35b93d6565f71e1e5ab08c893746054655b Mon Sep 17 00:00:00 2001 From: Aayush Date: Wed, 2 Mar 2022 15:39:19 -0500 Subject: [PATCH 375/393] Revert "go mod: update go-libp2p-pubsub" This reverts commit aa599bfaf99aca0048e76eb8c742385df74eee60. --- go.mod | 2 +- go.sum | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 8fd765eda87..b46b653d561 100644 --- a/go.mod +++ b/go.mod @@ -117,7 +117,7 @@ require ( github.com/libp2p/go-libp2p-kad-dht v0.15.0 github.com/libp2p/go-libp2p-noise v0.3.0 github.com/libp2p/go-libp2p-peerstore v0.6.0 - github.com/libp2p/go-libp2p-pubsub v0.6.1 + github.com/libp2p/go-libp2p-pubsub v0.6.0 github.com/libp2p/go-libp2p-quic-transport v0.16.0 github.com/libp2p/go-libp2p-record v0.1.3 github.com/libp2p/go-libp2p-resource-manager v0.1.1 diff --git a/go.sum b/go.sum index e29c59dba1e..02acbd5e6bf 100644 --- a/go.sum +++ b/go.sum @@ -1138,9 +1138,8 @@ 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.1.1/go.mod h1:ZwlKzRSe1eGvSIdU5bD7+8RZN/Uzw0t1Bp9R1znpR/Q= +github.com/libp2p/go-libp2p-pubsub v0.6.0 h1:98+RXuEWW17U6cAijK1yaTf6mw/B+n5yPA421z+dlo0= github.com/libp2p/go-libp2p-pubsub v0.6.0/go.mod h1:nJv87QM2cU0w45KPR1rZicq+FmFIOD16zmT+ep1nOmg= -github.com/libp2p/go-libp2p-pubsub v0.6.1 h1:wycbV+f4rreCoVY61Do6g/BUk0RIrbNRcYVbn+QkjGk= -github.com/libp2p/go-libp2p-pubsub v0.6.1/go.mod h1:nJv87QM2cU0w45KPR1rZicq+FmFIOD16zmT+ep1nOmg= 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= From 11fc068cfe09a7e33d4329f4bcea26c3f6ef0a83 Mon Sep 17 00:00:00 2001 From: Aayush Date: Wed, 2 Mar 2022 15:39:19 -0500 Subject: [PATCH 376/393] Revert "go mod: go-libp2p-resource-manager@v0.1.1" This reverts commit 62c0f35b5ab2f17b63f90c6a1ed220d3e6e9e7ac. --- go.mod | 2 +- go.sum | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index b46b653d561..432ce74867d 100644 --- a/go.mod +++ b/go.mod @@ -120,7 +120,7 @@ require ( github.com/libp2p/go-libp2p-pubsub v0.6.0 github.com/libp2p/go-libp2p-quic-transport v0.16.0 github.com/libp2p/go-libp2p-record v0.1.3 - github.com/libp2p/go-libp2p-resource-manager v0.1.1 + github.com/libp2p/go-libp2p-resource-manager v0.1.0 github.com/libp2p/go-libp2p-routing-helpers v0.2.3 github.com/libp2p/go-libp2p-swarm v0.10.0 github.com/libp2p/go-libp2p-tls v0.3.1 diff --git a/go.sum b/go.sum index 02acbd5e6bf..c23fb89e3bc 100644 --- a/go.sum +++ b/go.sum @@ -1154,9 +1154,8 @@ github.com/libp2p/go-libp2p-record v0.1.1/go.mod h1:VRgKajOyMVgP/F0L5g3kH7SVskp1 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.0 h1:tYpbhLPVC4egLavupAi9jGKKLeMemyGq5tnfBc8taBs= github.com/libp2p/go-libp2p-resource-manager v0.1.0/go.mod h1:wJPNjeE4XQlxeidwqVY5G6DLOKqFK33u2n8blpl0I6Y= -github.com/libp2p/go-libp2p-resource-manager v0.1.1 h1:JZ++ezpl2SVP2bj4Z+EPSmrKFS9vQVpkgC28G3DBJcA= -github.com/libp2p/go-libp2p-resource-manager v0.1.1/go.mod h1:wJPNjeE4XQlxeidwqVY5G6DLOKqFK33u2n8blpl0I6Y= 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= From 99e1b9e2aa3979f22654d974f1eb6d43247b851a Mon Sep 17 00:00:00 2001 From: Aayush Date: Wed, 2 Mar 2022 15:39:20 -0500 Subject: [PATCH 377/393] Revert "add net stat and limit cli" This reverts commit 0de1566eaff66bbd4574ae9806968dde6c676a5f. --- cli/net.go | 85 ------------------------------------------------------ 1 file changed, 85 deletions(-) diff --git a/cli/net.go b/cli/net.go index 104b4b40ebd..fdd0a13d656 100644 --- a/cli/net.go +++ b/cli/net.go @@ -36,8 +36,6 @@ var NetCmd = &cli.Command{ NetReachability, NetBandwidthCmd, NetBlockCmd, - NetStatCmd, - NetLimitCmd, }, } @@ -608,86 +606,3 @@ var NetBlockListCmd = &cli.Command{ return nil }, } - -var NetStatCmd = &cli.Command{ - Name: "stat", - Usage: "report resource stat for a scope", - ArgsUsage: "scope", - Action: func(cctx *cli.Context) error { - api, closer, err := GetAPI(cctx) - if err != nil { - return err - } - defer closer() - ctx := ReqContext(cctx) - - args := cctx.Args().Slice() - if len(args) != 1 { - return xerrors.Errorf("must specify exactly one scope") - } - scope := args[0] - - result, err := api.NetStat(ctx, scope) - if err != nil { - return err - } - - enc := json.NewEncoder(os.Stdout) - enc.Encode(result) - - return nil - }, -} - -var NetLimitCmd = &cli.Command{ - Name: "limit", - Usage: "get or set resource limit for a scope", - ArgsUsage: "scope [limit]", - Flags: []cli.Flag{ - &cli.BoolFlag{ - Name: "set", - Usage: "set the limit for a scope", - }, - }, - Action: func(cctx *cli.Context) error { - api, closer, err := GetAPI(cctx) - if err != nil { - return err - } - defer closer() - ctx := ReqContext(cctx) - args := cctx.Args().Slice() - - if cctx.Bool("set") { - if len(args) != 2 { - return xerrors.Errorf("must specify exactly a scope and a limit") - } - scope := args[0] - limitStr := args[1] - - var limit atypes.NetLimit - err := json.Unmarshal([]byte(limitStr), &limit) - if err != nil { - return xerrors.Errorf("error decoding limit: %w", err) - } - - return api.NetSetLimit(ctx, scope, limit) - - } else { - if len(args) != 1 { - return xerrors.Errorf("must specify exactly one scope") - } - scope := args[0] - - result, err := api.NetLimit(ctx, scope) - if err != nil { - return err - } - - enc := json.NewEncoder(os.Stdout) - enc.Encode(result) - } - - return nil - }, -} From bac17061d45dc85ea04421ffcc25d215527a555c Mon Sep 17 00:00:00 2001 From: Aayush Date: Wed, 2 Mar 2022 15:39:21 -0500 Subject: [PATCH 378/393] Revert "add examples to docgen" This reverts commit 39bf59d37217bd31f6708947717568183dc24882. --- api/docgen/docgen.go | 28 ---------------------------- 1 file changed, 28 deletions(-) diff --git a/api/docgen/docgen.go b/api/docgen/docgen.go index 1190b0dc406..57159993590 100644 --- a/api/docgen/docgen.go +++ b/api/docgen/docgen.go @@ -300,34 +300,6 @@ func init() { Error: "", }) addExample(storiface.ResourceTable) - addExample(network.ScopeStat{ - Memory: 123, - NumStreamsInbound: 1, - NumStreamsOutbound: 2, - NumConnsInbound: 3, - NumConnsOutbound: 4, - NumFD: 5, - }) - addExample(map[string]network.ScopeStat{ - "abc": { - Memory: 123, - NumStreamsInbound: 1, - NumStreamsOutbound: 2, - NumConnsInbound: 3, - NumConnsOutbound: 4, - NumFD: 5, - }}) - addExample(api.NetLimit{ - Memory: 123, - StreamsInbound: 1, - StreamsOutbound: 2, - Streams: 3, - ConnsInbound: 3, - ConnsOutbound: 4, - Conns: 4, - FD: 5, - }) - } func GetAPIType(name, pkg string) (i interface{}, t reflect.Type, permStruct []reflect.Type) { From b8747e3afcf67cfabe822ddf5b6d31c8306b8eeb Mon Sep 17 00:00:00 2001 From: Aayush Date: Wed, 2 Mar 2022 15:39:21 -0500 Subject: [PATCH 379/393] Revert "add resource manager Net(Set)Limit api" This reverts commit 554848fe6b2384780b08632c71c304df899a7200. --- api/api_net.go | 4 +- api/types.go | 16 +--- node/impl/net/rcmgr.go | 171 +---------------------------------------- 3 files changed, 3 insertions(+), 188 deletions(-) diff --git a/api/api_net.go b/api/api_net.go index 7dddb09ac0a..0a389e5ed6b 100644 --- a/api/api_net.go +++ b/api/api_net.go @@ -52,9 +52,7 @@ type Net interface { NetBlockList(ctx context.Context) (NetBlockList, error) //perm:read // ResourceManager API - NetStat(ctx context.Context, scope string) (NetStat, error) //perm:read - NetLimit(ctx context.Context, scope string) (NetLimit, error) //perm:read - NetSetLimit(ctx context.Context, scope string, limit NetLimit) error //perm:admin + NetStat(ctx context.Context, scope string) (NetStat, error) //perm:read // ID returns peerID of libp2p node backing this API ID(context.Context) (peer.ID, error) //perm:read diff --git a/api/types.go b/api/types.go index c688edf4b5f..66fb7985060 100644 --- a/api/types.go +++ b/api/types.go @@ -135,21 +135,7 @@ type NetStat struct { Transient *network.ScopeStat `json:",omitempty"` Services map[string]network.ScopeStat `json:",omitempty"` Protocols map[string]network.ScopeStat `json:",omitempty"` - Peers map[string]network.ScopeStat `json:",omitempty"` -} - -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 - FD int + Peers map[string]network.ScopeStat } type ExtendedPeerInfo struct { diff --git a/node/impl/net/rcmgr.go b/node/impl/net/rcmgr.go index 1b6d57d8e8c..2084d3a3576 100644 --- a/node/impl/net/rcmgr.go +++ b/node/impl/net/rcmgr.go @@ -85,7 +85,7 @@ func (a *NetAPI) NetStat(ctx context.Context, scope string) (result api.NetStat, p := scope[5:] pid, err := peer.IDFromString(p) if err != nil { - return result, xerrors.Errorf("invalid peer ID: %s: %w", p, err) + return result, err } err = a.ResourceManager.ViewPeer(pid, func(s network.PeerScope) error { stat := s.Stat() @@ -100,172 +100,3 @@ func (a *NetAPI) NetStat(ctx context.Context, scope string) (result api.NetStat, return result, xerrors.Errorf("invalid scope %s", scope) } } - -func (a *NetAPI) NetLimit(ctx context.Context, scope string) (result api.NetLimit, err error) { - getLimit := func(s network.ResourceScope) error { - limiter, ok := s.(rcmgr.ResourceScopeLimiter) - if !ok { - return xerrors.Errorf("resource scope doesn't implement ResourceScopeLimiter interface") - } - - 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) - } - - return nil - } - - switch { - case scope == "system": - err = a.ResourceManager.ViewSystem(func(s network.ResourceScope) error { - return getLimit(s) - }) - return result, err - - case scope == "transient": - err = a.ResourceManager.ViewTransient(func(s network.ResourceScope) error { - return getLimit(s) - }) - return result, err - - case strings.HasPrefix(scope, "svc:"): - svc := scope[4:] - err = a.ResourceManager.ViewService(svc, func(s network.ServiceScope) error { - return getLimit(s) - }) - return result, err - - case strings.HasPrefix(scope, "proto:"): - proto := scope[6:] - err = a.ResourceManager.ViewProtocol(protocol.ID(proto), func(s network.ProtocolScope) error { - return getLimit(s) - }) - return result, err - - case strings.HasPrefix(scope, "peer:"): - p := scope[5:] - pid, err := peer.IDFromString(p) - if err != nil { - return result, xerrors.Errorf("invalid peer ID: %s: %w", p, err) - } - err = a.ResourceManager.ViewPeer(pid, func(s network.PeerScope) error { - return getLimit(s) - }) - return result, err - - default: - return result, xerrors.Errorf("invalid scope %s", scope) - } -} - -func (a *NetAPI) NetSetLimit(ctx context.Context, scope string, limit api.NetLimit) error { - setLimit := func(s network.ResourceScope) error { - limiter, ok := s.(rcmgr.ResourceScopeLimiter) - if !ok { - 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, - }, - } - } - - limiter.SetLimit(newLimit) - return nil - } - - switch { - case scope == "system": - err := a.ResourceManager.ViewSystem(func(s network.ResourceScope) error { - return setLimit(s) - }) - return err - - case scope == "transient": - err := a.ResourceManager.ViewTransient(func(s network.ResourceScope) error { - return setLimit(s) - }) - return err - - case strings.HasPrefix(scope, "svc:"): - svc := scope[4:] - err := a.ResourceManager.ViewService(svc, func(s network.ServiceScope) error { - return setLimit(s) - }) - return err - - case strings.HasPrefix(scope, "proto:"): - proto := scope[6:] - err := a.ResourceManager.ViewProtocol(protocol.ID(proto), func(s network.ProtocolScope) error { - return setLimit(s) - }) - return err - - case strings.HasPrefix(scope, "peer:"): - p := scope[5:] - pid, err := peer.IDFromString(p) - if err != nil { - return xerrors.Errorf("invalid peer ID: %s: %w", p, err) - } - err = a.ResourceManager.ViewPeer(pid, func(s network.PeerScope) error { - return setLimit(s) - }) - return err - - default: - return xerrors.Errorf("invalid scope %s", scope) - } -} From e9e28f75e2d42d49d6cb881dceb24d51aa195633 Mon Sep 17 00:00:00 2001 From: Aayush Date: Wed, 2 Mar 2022 15:39:22 -0500 Subject: [PATCH 380/393] Revert "add resource manager NetStat api" This reverts commit d05d5bcb70a55411cb4cc5bdeb1b7edcecfca617. --- api/api_net.go | 3 -- api/types.go | 9 ---- node/impl/net/net.go | 13 +++--- node/impl/net/rcmgr.go | 102 ----------------------------------------- 4 files changed, 6 insertions(+), 121 deletions(-) delete mode 100644 node/impl/net/rcmgr.go diff --git a/api/api_net.go b/api/api_net.go index 0a389e5ed6b..4cf9ca336a3 100644 --- a/api/api_net.go +++ b/api/api_net.go @@ -51,9 +51,6 @@ type Net interface { NetBlockRemove(ctx context.Context, acl NetBlockList) error //perm:admin NetBlockList(ctx context.Context) (NetBlockList, error) //perm:read - // ResourceManager API - NetStat(ctx context.Context, scope string) (NetStat, error) //perm:read - // ID returns peerID of libp2p node backing this API ID(context.Context) (peer.ID, error) //perm:read } diff --git a/api/types.go b/api/types.go index 66fb7985060..81345306d61 100644 --- a/api/types.go +++ b/api/types.go @@ -12,7 +12,6 @@ import ( "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" ma "github.com/multiformats/go-multiaddr" @@ -130,14 +129,6 @@ type NetBlockList struct { IPSubnets []string } -type NetStat struct { - System *network.ScopeStat `json:",omitempty"` - Transient *network.ScopeStat `json:",omitempty"` - Services map[string]network.ScopeStat `json:",omitempty"` - Protocols map[string]network.ScopeStat `json:",omitempty"` - Peers map[string]network.ScopeStat -} - type ExtendedPeerInfo struct { ID peer.ID Agent string diff --git a/node/impl/net/net.go b/node/impl/net/net.go index 27e7734a164..a1003ffe5f2 100644 --- a/node/impl/net/net.go +++ b/node/impl/net/net.go @@ -25,13 +25,12 @@ import ( type NetAPI struct { fx.In - RawHost lp2p.RawHost - Host host.Host - Router lp2p.BaseIpfsRouting - ConnGater *conngater.BasicConnectionGater - ResourceManager network.ResourceManager - Reporter metrics.Reporter - Sk *dtypes.ScoreKeeper + RawHost lp2p.RawHost + Host host.Host + Router lp2p.BaseIpfsRouting + ConnGater *conngater.BasicConnectionGater + Reporter metrics.Reporter + Sk *dtypes.ScoreKeeper } func (a *NetAPI) ID(context.Context) (peer.ID, error) { diff --git a/node/impl/net/rcmgr.go b/node/impl/net/rcmgr.go deleted file mode 100644 index 2084d3a3576..00000000000 --- a/node/impl/net/rcmgr.go +++ /dev/null @@ -1,102 +0,0 @@ -package net - -import ( - "context" - "strings" - - "golang.org/x/xerrors" - - "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/filecoin-project/lotus/api" -) - -func (a *NetAPI) NetStat(ctx context.Context, scope string) (result api.NetStat, err error) { - switch { - case scope == "all": - rapi, ok := a.ResourceManager.(rcmgr.ResourceManagerState) - if !ok { - return result, xerrors.Errorf("rexource manager does not support ResourceManagerState API") - } - - stat := rapi.Stat() - result.System = &stat.System - result.Transient = &stat.Transient - if len(stat.Services) > 0 { - result.Services = stat.Services - } - if len(stat.Protocols) > 0 { - result.Protocols = make(map[string]network.ScopeStat, len(stat.Protocols)) - for proto, stat := range stat.Protocols { - result.Protocols[string(proto)] = stat - } - } - if len(stat.Peers) > 0 { - result.Peers = make(map[string]network.ScopeStat, len(stat.Peers)) - for p, stat := range stat.Peers { - result.Peers[p.Pretty()] = stat - } - } - - return result, nil - - case scope == "system": - err = a.ResourceManager.ViewSystem(func(s network.ResourceScope) error { - stat := s.Stat() - result.System = &stat - return nil - }) - return result, err - - case scope == "transient": - err = a.ResourceManager.ViewTransient(func(s network.ResourceScope) error { - stat := s.Stat() - result.Transient = &stat - return nil - }) - return result, err - - case strings.HasPrefix(scope, "svc:"): - svc := scope[4:] - err = a.ResourceManager.ViewService(svc, func(s network.ServiceScope) error { - stat := s.Stat() - result.Services = map[string]network.ScopeStat{ - svc: stat, - } - return nil - }) - return result, err - - case strings.HasPrefix(scope, "proto:"): - proto := scope[6:] - err = a.ResourceManager.ViewProtocol(protocol.ID(proto), func(s network.ProtocolScope) error { - stat := s.Stat() - result.Protocols = map[string]network.ScopeStat{ - proto: stat, - } - return nil - }) - return result, err - - case strings.HasPrefix(scope, "peer:"): - p := scope[5:] - pid, err := peer.IDFromString(p) - if err != nil { - return result, err - } - err = a.ResourceManager.ViewPeer(pid, func(s network.PeerScope) error { - stat := s.Stat() - result.Peers = map[string]network.ScopeStat{ - p: stat, - } - return nil - }) - return result, err - - default: - return result, xerrors.Errorf("invalid scope %s", scope) - } -} From b5912d15432dff51c9e6784f3efd0ed100e949d6 Mon Sep 17 00:00:00 2001 From: Aayush Date: Wed, 2 Mar 2022 15:39:22 -0500 Subject: [PATCH 381/393] Revert "instantiate resource manager in DI" This reverts commit 8d3f98fe386f96a3824b0ae7da39a0be463772e0. --- node/builder.go | 6 ---- node/modules/lp2p/rcmgr.go | 66 -------------------------------------- 2 files changed, 72 deletions(-) delete mode 100644 node/modules/lp2p/rcmgr.go diff --git a/node/builder.go b/node/builder.go index 6770e8dc8f7..96d217ec348 100644 --- a/node/builder.go +++ b/node/builder.go @@ -15,7 +15,6 @@ import ( logging "github.com/ipfs/go-log/v2" 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" @@ -69,7 +68,6 @@ var ( BandwidthReporterKey = special{11} // Libp2p option ConnGaterKey = special{12} // libp2p option DAGStoreKey = special{13} // constructor returns multiple values - ResourceManagerKey = special{14} // Libp2p option ) type invoke int @@ -217,10 +215,6 @@ var LibP2P = Options( Override(ConnectionManagerKey, lp2p.ConnectionManager(50, 200, 20*time.Second, nil)), Override(new(*conngater.BasicConnectionGater), lp2p.ConnGater), Override(ConnGaterKey, lp2p.ConnGaterOption), - - // Services (resource management) - Override(new(network.ResourceManager), lp2p.ResourceManager), - Override(ResourceManagerKey, lp2p.ResourceManagerOption), ) func IsType(t repo.RepoType) func(s *Settings) bool { diff --git a/node/modules/lp2p/rcmgr.go b/node/modules/lp2p/rcmgr.go deleted file mode 100644 index a012fc1f427..00000000000 --- a/node/modules/lp2p/rcmgr.go +++ /dev/null @@ -1,66 +0,0 @@ -package lp2p - -import ( - "errors" - "fmt" - "os" - "path/filepath" - - "go.uber.org/fx" - - "github.com/libp2p/go-libp2p" - "github.com/libp2p/go-libp2p-core/network" - rcmgr "github.com/libp2p/go-libp2p-resource-manager" - - "github.com/filecoin-project/lotus/node/repo" -) - -func ResourceManager(lc fx.Lifecycle, repo repo.LockedRepo) (network.ResourceManager, error) { - var limiter *rcmgr.BasicLimiter - var opts []rcmgr.Option - - repoPath := repo.Path() - - // create limiter -- parse $repo/limits.json if exists - limitsFile := filepath.Join(repoPath, "limits.json") - limitsIn, err := os.Open(limitsFile) - switch { - case err == nil: - defer limitsIn.Close() - limiter, err = rcmgr.NewDefaultLimiterFromJSON(limitsIn) - if err != nil { - return nil, fmt.Errorf("error parsing limit file: %w", err) - } - - case errors.Is(err, os.ErrNotExist): - limiter = rcmgr.NewDefaultLimiter() - - default: - return nil, err - } - - // TODO: also set appropriate default limits for lotus protocols - libp2p.SetDefaultServiceLimits(limiter) - - if os.Getenv("LOTUS_DEBUG_RCMGR") != "" { - debugPath := filepath.Join(repoPath, "debug") - if err := os.MkdirAll(debugPath, 0755); err != nil { - return nil, fmt.Errorf("error creating debug directory: %w", err) - } - traceFile := filepath.Join(debugPath, "rcmgr.json.gz") - opts = append(opts, rcmgr.WithTrace(traceFile)) - } - - mgr, err := rcmgr.NewResourceManager(limiter, opts...) - if err != nil { - return nil, fmt.Errorf("error creating resource manager: %w", err) - } - - return mgr, nil -} - -func ResourceManagerOption(mgr network.ResourceManager) Libp2pOpts { - return Libp2pOpts{ - Opts: []libp2p.Option{libp2p.ResourceManager(mgr)}, - } -} From 85886287b43bba6f0aae8eda2079cf5182ef7c97 Mon Sep 17 00:00:00 2001 From: Aayush Date: Wed, 2 Mar 2022 15:39:23 -0500 Subject: [PATCH 382/393] Revert "use the libp2p connmgr" This reverts commit 826cdb2186e49d7f5a48d8ba25a9b820b634a42f. --- node/modules/lp2p/libp2p.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/node/modules/lp2p/libp2p.go b/node/modules/lp2p/libp2p.go index 997792d4825..5d8ece732d2 100644 --- a/node/modules/lp2p/libp2p.go +++ b/node/modules/lp2p/libp2p.go @@ -10,10 +10,10 @@ import ( logging "github.com/ipfs/go-log/v2" "github.com/libp2p/go-libp2p" + connmgr "github.com/libp2p/go-libp2p-connmgr" "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" ) From 04f2d3543bca94a50a9fde4b89b94110eaf23e86 Mon Sep 17 00:00:00 2001 From: Aayush Date: Wed, 2 Mar 2022 15:39:23 -0500 Subject: [PATCH 383/393] Revert "go mod: go-libp2p-resource-manager" This reverts commit c394fbdfc3aaf369dc517446a9fd9fac74007b7c. --- go.mod | 1 - 1 file changed, 1 deletion(-) diff --git a/go.mod b/go.mod index 432ce74867d..0c388823bc7 100644 --- a/go.mod +++ b/go.mod @@ -120,7 +120,6 @@ require ( github.com/libp2p/go-libp2p-pubsub v0.6.0 github.com/libp2p/go-libp2p-quic-transport v0.16.0 github.com/libp2p/go-libp2p-record v0.1.3 - github.com/libp2p/go-libp2p-resource-manager v0.1.0 github.com/libp2p/go-libp2p-routing-helpers v0.2.3 github.com/libp2p/go-libp2p-swarm v0.10.0 github.com/libp2p/go-libp2p-tls v0.3.1 From 08bbfed8254ad56123d880d65b34c960da97ae3a Mon Sep 17 00:00:00 2001 From: Aayush Date: Wed, 2 Mar 2022 15:39:24 -0500 Subject: [PATCH 384/393] Revert "go mod: go-libp2p@v0.18.0-rc1" This reverts commit 2fb5837a55ed8d9e8319be512b45b874452562ce. --- go.mod | 16 +++++++-------- go.sum | 63 ++++++++++++++++++++-------------------------------------- 2 files changed, 29 insertions(+), 50 deletions(-) diff --git a/go.mod b/go.mod index 0c388823bc7..0a4943f12b4 100644 --- a/go.mod +++ b/go.mod @@ -94,7 +94,7 @@ require ( github.com/ipfs/go-ipld-cbor v0.0.6 github.com/ipfs/go-ipld-format v0.2.0 github.com/ipfs/go-ipld-legacy v0.1.1 // indirect - github.com/ipfs/go-log/v2 v2.5.0 + github.com/ipfs/go-log/v2 v2.4.0 github.com/ipfs/go-merkledag v0.5.1 github.com/ipfs/go-metrics-interface v0.0.1 github.com/ipfs/go-metrics-prometheus v0.0.2 @@ -110,26 +110,26 @@ require ( github.com/kelseyhightower/envconfig v1.4.0 github.com/libp2p/go-buffer-pool v0.0.2 github.com/libp2p/go-eventbus v0.2.1 - github.com/libp2p/go-libp2p v0.18.0-rc1 - github.com/libp2p/go-libp2p-connmgr v0.3.1 // indirect - github.com/libp2p/go-libp2p-core v0.14.0 + github.com/libp2p/go-libp2p v0.17.0 + github.com/libp2p/go-libp2p-connmgr v0.3.1 + github.com/libp2p/go-libp2p-core v0.13.0 github.com/libp2p/go-libp2p-discovery v0.6.0 github.com/libp2p/go-libp2p-kad-dht v0.15.0 github.com/libp2p/go-libp2p-noise v0.3.0 github.com/libp2p/go-libp2p-peerstore v0.6.0 github.com/libp2p/go-libp2p-pubsub v0.6.0 - github.com/libp2p/go-libp2p-quic-transport v0.16.0 + github.com/libp2p/go-libp2p-quic-transport v0.15.2 github.com/libp2p/go-libp2p-record v0.1.3 github.com/libp2p/go-libp2p-routing-helpers v0.2.3 - github.com/libp2p/go-libp2p-swarm v0.10.0 + github.com/libp2p/go-libp2p-swarm v0.9.0 github.com/libp2p/go-libp2p-tls v0.3.1 - github.com/libp2p/go-libp2p-yamux v0.8.0 + github.com/libp2p/go-libp2p-yamux v0.7.0 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.4.1 github.com/multiformats/go-multiaddr-dns v0.3.1 github.com/multiformats/go-multibase v0.0.3 github.com/multiformats/go-multihash v0.1.0 diff --git a/go.sum b/go.sum index c23fb89e3bc..8a04740cc08 100644 --- a/go.sum +++ b/go.sum @@ -807,9 +807,8 @@ github.com/ipfs/go-log/v2 v2.1.2-0.20200626104915-0016c0b4b3e4/go.mod h1:2v2nsGf github.com/ipfs/go-log/v2 v2.1.2/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHntrv9KM= 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 h1:iR/2o9PGWanVJrBgIH5Ff8mPGOwpqLaPIAFqSnsdlzk= github.com/ipfs/go-log/v2 v2.4.0/go.mod h1:nPZnh7Cj7lwS3LpRU5Mwr2ol1c2gXIEXuF6aywqrtmo= -github.com/ipfs/go-log/v2 v2.5.0 h1:+MhAooFd9XZNvR0i9FriKW6HB0ql7HNXUuflWtc0dd4= -github.com/ipfs/go-log/v2 v2.5.0/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI= github.com/ipfs/go-merkledag v0.0.6/go.mod h1:QYPdnlvkOg7GnQRofu9XZimC5ZW5Wi3bKys/4GQQfto= github.com/ipfs/go-merkledag v0.2.3/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= github.com/ipfs/go-merkledag v0.2.4/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= @@ -960,6 +959,7 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/libp2p/go-addr-util v0.0.1/go.mod h1:4ac6O7n9rIAKB1dnd+s8IbbMXkt+oBpzX4/+RACcnlQ= github.com/libp2p/go-addr-util v0.0.2/go.mod h1:Ecd6Fb3yIuLzq4bD7VcywcVSBtefcAwnUISBM3WG15E= +github.com/libp2p/go-addr-util v0.1.0 h1:acKsntI33w2bTU7tC9a0SaPimJGfSI0bFKC18ChxeVI= 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= @@ -993,9 +993,8 @@ 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.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 h1:8l4GV401OSd4dFRyHDtIT/mEzdh/aQGoFC8xshYgm5M= github.com/libp2p/go-libp2p v0.17.0/go.mod h1:Fkin50rsGdv5mm5BshBUtPRZknt9esfmYXBOYcwOTgw= -github.com/libp2p/go-libp2p v0.18.0-rc1 h1:CFHROLGmMwe/p8tR3sHahg/1NSaZa2EGbu7nDmdC+RY= -github.com/libp2p/go-libp2p v0.18.0-rc1/go.mod h1:RgYlH7IIWHXREimC92bw5Lg1V2R5XmSzuLHb5fTnr+8= 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 h1:rABPCO77SjdbJ/eJ/ynIo8vWICy1VEnL5JAxJbQLo1E= github.com/libp2p/go-libp2p-asn-util v0.1.0/go.mod h1:wu+AnM9Ii2KgO5jMmS1rz9dvzTdj8BXqsPR9HR0XB7I= @@ -1007,6 +1006,7 @@ github.com/libp2p/go-libp2p-autonat v0.2.1/go.mod h1:MWtAhV5Ko1l6QBsHQNSuM6b1sRk github.com/libp2p/go-libp2p-autonat v0.2.2/go.mod h1:HsM62HkqZmHR2k1xgX34WuWDzk/nBwNHoeyyT4IWV6A= 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 h1:rCP5s+A2dlhM1Xd66wurE0k7S7pPmM0D+FlqqSBXxks= 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= @@ -1022,9 +1022,8 @@ github.com/libp2p/go-libp2p-circuit v0.1.1/go.mod h1:Ahq4cY3V9VJcHcn1SBXjr78AbFk 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 h1:eqQ3sEYkGTtybWgr6JLqJY6QLtPWRErvFjFDfAOO1wc= 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= @@ -1063,9 +1062,8 @@ github.com/libp2p/go-libp2p-core v0.9.0/go.mod h1:ESsbz31oC3C1AvMJoGx26RTuCkNhmk github.com/libp2p/go-libp2p-core v0.10.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= 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 h1:IFG/s8dN6JN2OTrXX9eq2wNU/Zlz2KLdwZUp5FplgXI= github.com/libp2p/go-libp2p-core v0.13.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= -github.com/libp2p/go-libp2p-core v0.14.0 h1:0kYSgiK/D7Eo28GTuRXo5YHsWwAisVpFCqCVPUd/vJs= -github.com/libp2p/go-libp2p-core v0.14.0/go.mod h1:tLasfcVdTXnixsLB0QYaT1syJOhsbrhG7q6pGrHtBg8= 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= @@ -1100,9 +1098,8 @@ github.com/libp2p/go-libp2p-mplex v0.2.1/go.mod h1:SC99Rxs8Vuzrf/6WhmH41kNn13TiY 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.4.0/go.mod h1:yCyWJE2sc6TBTnFpjvLuEJgTSw/u+MamvzILKdX7asw= +github.com/libp2p/go-libp2p-mplex v0.4.1 h1:/pyhkP1nLwjG3OM+VuaNJkQT/Pqq73WzB3aDN3Fx1sc= github.com/libp2p/go-libp2p-mplex v0.4.1/go.mod h1:cmy+3GfqfM1PceHTLL7zQzAAYaryDu6iPSC+CIb094g= -github.com/libp2p/go-libp2p-mplex v0.5.0 h1:vt3k4E4HSND9XH4Z8rUpacPJFSAgLOv6HDvG8W9Ks9E= -github.com/libp2p/go-libp2p-mplex v0.5.0/go.mod h1:eLImPJLkj3iG5t5lq68w3Vm5NAQ5BcKwrrb2VmOYb3M= 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= @@ -1145,17 +1142,14 @@ github.com/libp2p/go-libp2p-quic-transport v0.10.0/go.mod h1:RfJbZ8IqXIhxBRm5hqU 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= 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 h1:wHBEceRy+1/8Ec8dAIyr+/P7L2YefIGprPVy5LrMM+k= 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 h1:aVg9/jr+R2esov5sH7wkXrmYmqJiUjtLMLYX3L9KYdY= -github.com/libp2p/go-libp2p-quic-transport v0.16.0/go.mod h1:1BXjVMzr+w7EkPfiHkKnwsWjPjtfaNT0q8RS3tGDvEQ= 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.0 h1:tYpbhLPVC4egLavupAi9jGKKLeMemyGq5tnfBc8taBs= -github.com/libp2p/go-libp2p-resource-manager v0.1.0/go.mod h1:wJPNjeE4XQlxeidwqVY5G6DLOKqFK33u2n8blpl0I6Y= 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= @@ -1175,9 +1169,8 @@ 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.5.3/go.mod h1:NBn7eNW2lu568L7Ns9wdFrOhgRlkRnIDg0FLKbuu3i8= github.com/libp2p/go-libp2p-swarm v0.8.0/go.mod h1:sOMp6dPuqco0r0GHTzfVheVBh6UEL0L1lXUZ5ot2Fvc= +github.com/libp2p/go-libp2p-swarm v0.9.0 h1:LdWjHDVjPMYt3NCG2EHcQiIP8XzA8BHhHz8ZLAYol2Y= github.com/libp2p/go-libp2p-swarm v0.9.0/go.mod h1:2f8d8uxTJmpeqHF/1ujjdXZp+98nNIbujVOMEZxCbZ8= -github.com/libp2p/go-libp2p-swarm v0.10.0 h1:1yr7UCwxCN92cw9g9Q+fnJSlk7lOB1RetoEewxhGVL0= -github.com/libp2p/go-libp2p-swarm v0.10.0/go.mod h1:71ceMcV6Rg/0rIQ97rsZWMzto1l9LnNquef+efcRbmA= 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= @@ -1189,9 +1182,8 @@ github.com/libp2p/go-libp2p-testing v0.3.0/go.mod h1:efZkql4UZ7OVsEfaxNHZPzIehts github.com/libp2p/go-libp2p-testing v0.4.0/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotlKsNSbKQ/lImlOWF0= 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 h1:tV/wz6mS1VoAYA/5DGTiyzw9TJ+eXMCMvzU5VPLJSgg= github.com/libp2p/go-libp2p-testing v0.6.0/go.mod h1:QBk8fqIL1XNcno/l3/hhaIEn4aLRijpYOR+zVjjlh+A= -github.com/libp2p/go-libp2p-testing v0.7.0 h1:9bfyhNINizxuLrKsenzGaZalXRXIaAEmx1BP/PzF1gM= -github.com/libp2p/go-libp2p-testing v0.7.0/go.mod h1:OLbdn9DbgdMwv00v+tlp1l3oe2Cl+FAjoWIA2pa0X6E= 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 h1:lsE2zYte+rZCEOHF72J1Fg3XK3dGQyKvI6i5ehJfEp0= @@ -1206,9 +1198,8 @@ 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.4.6/go.mod h1:JE0WQuQdy+uLZ5zOaI3Nw9dWGYJIA7mywEtP2lMvnyk= 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 h1:GfMCU+2aGGEm1zW3UcOz6wYSn8tXQalFfVfcww99i5A= 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 h1:ADnLrL7fC4Vy7HPjk9oGof7nDeTqGXuof85Ar6kin9Q= -github.com/libp2p/go-libp2p-transport-upgrader v0.7.0/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-yamux v0.1.2/go.mod h1:xUoV/RmYkg6BW/qGxA9XJyg+HzXFYkeXbnhjmnYzKp8= github.com/libp2p/go-libp2p-yamux v0.1.3/go.mod h1:VGSQVrqkh6y4nm0189qqxMtvyBft44MOYYPpYKXiVt4= @@ -1222,9 +1213,8 @@ github.com/libp2p/go-libp2p-yamux v0.4.0/go.mod h1:+DWDjtFMzoAwYLVkNZftoucn7PelN github.com/libp2p/go-libp2p-yamux v0.5.0/go.mod h1:AyR8k5EzyM2QN9Bbdg6X1SkVVuqLwTGf0L4DFq9g6po= 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 h1:bVXHbTj/XH4uBBsPrg26BlDABk5WYRlssY73P0SjhPc= github.com/libp2p/go-libp2p-yamux v0.7.0/go.mod h1:fMyA0CsPfHkIuBU0wjRGrCjTBFiXTXxG0k5M4ETv+08= -github.com/libp2p/go-libp2p-yamux v0.8.0 h1:APQYlttIj+Rr5sfa6siojwsi0ZwcIh/exHIUl9hZr6o= -github.com/libp2p/go-libp2p-yamux v0.8.0/go.mod h1:yTkPgN2ib8FHyU1ZcVD7aelzyAqXXwEPbyx+aSKm9h8= 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= @@ -1236,9 +1226,8 @@ github.com/libp2p/go-mplex v0.1.0/go.mod h1:SXgmdki2kwCUlCCbfGLEgHjC4pFqhTp0ZoV6 github.com/libp2p/go-mplex v0.1.1/go.mod h1:Xgz2RDCi3co0LeZfgjm4OgUF15+sVR8SRcu3SFXI1lk= 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 h1:U1T+vmCYJaEoDJPV1aq31N56hS+lJgb397GsylNSgrU= github.com/libp2p/go-mplex v0.3.0/go.mod h1:0Oy/A9PQlwBytDRp4wSkFnzHYDKcpLot35JQ6msjvYQ= -github.com/libp2p/go-mplex v0.4.0 h1:Ukkez9/4EOX5rTw4sHefNJp10dksftAA05ZgyjplUbM= -github.com/libp2p/go-mplex v0.4.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= @@ -1253,9 +1242,8 @@ github.com/libp2p/go-nat v0.1.0/go.mod h1:X7teVkwRHNInVNWQiO/tAiAVRwSr5zoRz4YSTC github.com/libp2p/go-netroute v0.1.2/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk= github.com/libp2p/go-netroute v0.1.3/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk= github.com/libp2p/go-netroute v0.1.5/go.mod h1:V1SR3AaECRkEQCoFFzYwVYWvYIEtlxx89+O3qcpCl4A= +github.com/libp2p/go-netroute v0.1.6 h1:ruPJStbYyXVYGQ81uzEDzuvbYRLKRrLvTYd33yomC38= github.com/libp2p/go-netroute v0.1.6/go.mod h1:AqhkMh0VuWmfgtxKPp3Oc1LdU5QSWS7wl0QLhSZqXxQ= -github.com/libp2p/go-netroute v0.2.0 h1:0FpsbsvuSnAhXFnCY0VLFbJOzaK0VnP0r1QT/o4nWRE= -github.com/libp2p/go-netroute v0.2.0/go.mod h1:Vio7LTzZ+6hoT4CMZi5/6CpY3Snzh2vgZhWgxMNwlQI= github.com/libp2p/go-openssl v0.0.2/go.mod h1:v8Zw2ijCSWBQi8Pq5GAixw6DbFfa9u6VIYDXnvOXkc0= 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= @@ -1274,14 +1262,14 @@ github.com/libp2p/go-reuseport-transport v0.1.0 h1:C3PHeHjmnz8m6f0uydObj02tMEoi7 github.com/libp2p/go-reuseport-transport v0.1.0/go.mod h1:vev0C0uMkzriDY59yFHD9v+ujJvYmDQVLowvAjEOmfw= 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 h1:yD80l2ZOdGksnOyHrhxDdTDFrf7Oy+v3FMVArIRgZxQ= github.com/libp2p/go-sockaddr v0.1.1/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= 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= 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 h1:TqnSHPJEIqDEO7h1wZZ0p3DXdvDSiLHQidKKUGZtiOY= 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 h1:HsM/9OdtqnIzjVXcxTXjmqKrj3gJ8kacaOJwJS1ipaY= -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= @@ -1289,9 +1277,8 @@ github.com/libp2p/go-tcp-transport v0.2.0/go.mod h1:vX2U0CnWimU4h0SGSEsg++AzvBcr 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= +github.com/libp2p/go-tcp-transport v0.4.0 h1:VDyg4j6en3OuXf90gfDQh5Sy9KowO9udnd0OU8PP6zg= 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 h1:3ZPW8HAuyRAuFzyabE0hSrCXKKSWzROnZZX7DtcIatY= -github.com/libp2p/go-tcp-transport v0.5.0/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= @@ -1300,9 +1287,8 @@ github.com/libp2p/go-ws-transport v0.1.2/go.mod h1:dsh2Ld8F+XNmzpkaAijmg5Is+e9l6 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.4.0/go.mod h1:EcIEKqf/7GDjth6ksuS/6p7R49V4CBY6/E7R/iyhYUA= +github.com/libp2p/go-ws-transport v0.5.0 h1:cO6x4P0v6PfxbKnxmf5cY2Ny4OPDGYkUqNvZzp/zdlo= github.com/libp2p/go-ws-transport v0.5.0/go.mod h1:I2juo1dNTbl8BKSBYo98XY85kU2xds1iamArLvl8kNg= -github.com/libp2p/go-ws-transport v0.6.0 h1:326XBL6Q+5CQ2KtjXz32+eGu02W/Kz2+Fm4SpXdr0q4= -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= @@ -1314,9 +1300,8 @@ github.com/libp2p/go-yamux v1.4.0/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/h 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.2.0/go.mod h1:3So6P6TV6r75R9jiBpiIKgU/66lOarCZjqROGxzPpPQ= +github.com/libp2p/go-yamux/v2 v2.3.0 h1:luRV68GS1vqqr6EFUjtu1kr51d+IbW0gSowu8emYWAI= 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 h1:lIdxHGVZ+y/EHgCrqGNt4Q+Mk9qu26MbOWH/yRw+Ihk= -github.com/libp2p/go-yamux/v3 v3.0.1/go.mod h1:s2LsDhHbh+RfCsQoICSYt58U2f8ijtPANFD8BmE74Bo= 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= @@ -1324,9 +1309,8 @@ github.com/lucas-clemente/quic-go v0.11.2/go.mod h1:PpMmPfPKO9nKJ/psF49ESTAGQSdf 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= +github.com/lucas-clemente/quic-go v0.24.0 h1:ToR7SIIEdrgOhgVTHvPgdVRJfgVy+N0wQAagH7L4d5g= github.com/lucas-clemente/quic-go v0.24.0/go.mod h1:paZuzjXCE5mj6sikVLMvqXk8lJV2AsqtJ6bDhjEfxx0= -github.com/lucas-clemente/quic-go v0.25.0 h1:K+X9Gvd7JXsOHtU0N2icZ2Nw3rx82uBej3mP4CLgibc= -github.com/lucas-clemente/quic-go v0.25.0/go.mod h1:YtzP8bxRVCBlO77yRanE264+fY/T2U9ZlW1AaHOsMOg= 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= @@ -1353,8 +1337,6 @@ github.com/marten-seemann/qtls-go1-16 v0.1.4/go.mod h1:gNpI2Ol+lRS3WwSOtIUUtRwZE 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 h1:P9ggrs5xtwiqXv/FHNwntmuLMNq3KaSIG93AtAZ48xk= github.com/marten-seemann/qtls-go1-17 v0.1.0/go.mod h1:fz4HIxByo+LlWcreM4CZOYNuz3taBQ8rN2X6FqvaWo8= -github.com/marten-seemann/qtls-go1-18 v0.1.0-beta.1 h1:EnzzN9fPUkUck/1CuY1FlzBaIYMoiBsdwTNmNGkwUUM= -github.com/marten-seemann/qtls-go1-18 v0.1.0-beta.1/go.mod h1:PUhIQk19LoFt2174H4+an8TYvWOGjb/hHwphBeaDHwI= 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= @@ -1453,9 +1435,8 @@ 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 h1:Pq37uLx3hsyNlTDir7FZyU8+cFCTqd5y1KiM2IzOutI= 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-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= @@ -1576,8 +1557,6 @@ github.com/openzipkin/zipkin-go v0.2.5/go.mod h1:KpXfKdgRDnnhsxw4pNIH9Md5lyFqKUa 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= From 898f523162c3c3e438e1be39ffaf5f120d02af4f Mon Sep 17 00:00:00 2001 From: Aayush Date: Wed, 2 Mar 2022 15:41:41 -0500 Subject: [PATCH 385/393] Upgrade to go-data-transfer 1.14.1 --- go.mod | 2 +- go.sum | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 0a4943f12b4..f8a1b1d7621 100644 --- a/go.mod +++ b/go.mod @@ -35,7 +35,7 @@ require ( github.com/filecoin-project/go-cbor-util v0.0.1 github.com/filecoin-project/go-commp-utils v0.1.3 github.com/filecoin-project/go-crypto v0.0.1 - github.com/filecoin-project/go-data-transfer v1.13.0 + github.com/filecoin-project/go-data-transfer v1.14.1 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.17.0 diff --git a/go.sum b/go.sum index 8a04740cc08..cb7fb0a34df 100644 --- a/go.sum +++ b/go.sum @@ -316,8 +316,9 @@ 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-data-transfer v1.13.0 h1:UqjBfacClqAmnzukek1oPxJXDM3l5UI/WX8CRN2/VkM= github.com/filecoin-project/go-data-transfer v1.13.0/go.mod h1:TcUtAdQl1ofnLV9oH3gPC93Hjce9yuKnq4O4j2M/BU4= +github.com/filecoin-project/go-data-transfer v1.14.1 h1:c6V9mXzC1uLAoSCqWQe4lHrN/iwMGPw36xoDDYHlH/M= +github.com/filecoin-project/go-data-transfer v1.14.1/go.mod h1:TcUtAdQl1ofnLV9oH3gPC93Hjce9yuKnq4O4j2M/BU4= 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= From 1bc1cd33662c6137a357b21f8af6be1877a74eb3 Mon Sep 17 00:00:00 2001 From: Aayush Date: Wed, 2 Mar 2022 15:41:53 -0500 Subject: [PATCH 386/393] Upgrade to go-fil-markets 1.19.2 --- go.mod | 3 ++- go.sum | 5 ++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index f8a1b1d7621..08cbb4f99f4 100644 --- a/go.mod +++ b/go.mod @@ -36,9 +36,10 @@ require ( github.com/filecoin-project/go-commp-utils v0.1.3 github.com/filecoin-project/go-crypto v0.0.1 github.com/filecoin-project/go-data-transfer v1.14.1 + github.com/filecoin-project/go-ds-versioning v0.1.1 // indirect 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.17.0 + github.com/filecoin-project/go-fil-markets v1.19.2 github.com/filecoin-project/go-jsonrpc v0.1.5 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 cb7fb0a34df..930ebb0746c 100644 --- a/go.sum +++ b/go.sum @@ -316,7 +316,6 @@ 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-data-transfer v1.13.0/go.mod h1:TcUtAdQl1ofnLV9oH3gPC93Hjce9yuKnq4O4j2M/BU4= github.com/filecoin-project/go-data-transfer v1.14.1 h1:c6V9mXzC1uLAoSCqWQe4lHrN/iwMGPw36xoDDYHlH/M= github.com/filecoin-project/go-data-transfer v1.14.1/go.mod h1:TcUtAdQl1ofnLV9oH3gPC93Hjce9yuKnq4O4j2M/BU4= github.com/filecoin-project/go-ds-versioning v0.0.0-20211206185234-508abd7c2aff/go.mod h1:C9/l9PnB1+mwPa26BBVpCjG/XQCB0yj/q5CK2J8X1I4= @@ -328,8 +327,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.17.0 h1:i9U6hZ+peri6Ygfwoda0YBk4bo1SHkd58EPBRgXCRlQ= -github.com/filecoin-project/go-fil-markets v1.17.0/go.mod h1:tKRMkDovSJiUo8yDt6YQM/gHMfNVYya0YTdayGhRnRY= +github.com/filecoin-project/go-fil-markets v1.19.2 h1:E+e0OhGAxluSbMExcEH91FErWwMQlkMlpF/Ijjny6Z0= +github.com/filecoin-project/go-fil-markets v1.19.2/go.mod h1:hYDiJHSKib3wo33rfKM1ujyaY2E0KFdsX6JdzaXTI08= 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= From ebe1ca7c771657ed68be1574ada0a1695bad4996 Mon Sep 17 00:00:00 2001 From: Aayush Date: Wed, 2 Mar 2022 15:48:07 -0500 Subject: [PATCH 387/393] make gen --- build/openrpc/full.json.gz | Bin 26596 -> 26594 bytes build/openrpc/miner.json.gz | Bin 12926 -> 12927 bytes build/openrpc/worker.json.gz | Bin 3960 -> 3962 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 6b5c3135fcbc36def3460027b158c12914a40818..5d87fffe9153a4decdbe8e68e87ac05a1d675f8a 100644 GIT binary patch delta 21159 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 |coh_y>%%D@F6TG=k9%qVV${;L(E1ooES0^Gt( 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 delta 21149 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

rMx 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

u)RVlW=36c}wH?W#*z~H+XG;b6uCjK>#qx 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 diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index f64a87117de1c34302520d8acff22c5c837d562d..5d05474e602abc3936d1d5f590e5b7810681d8c9 100644 GIT binary patch delta 12303 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 delta 12290 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≀gT7urlaP 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 Ui<`y&2LJ&7|ENzSa0cc80MtdrmjD0& literal 3960 zcmV-;4~Os{iwFP!00000|Lk4sa@#hPeiaP%Pu!tpillCy$&bWov))ZoHLly)jXfKP zge2A^$daHP#iMuM0ZB=`%7jEpw2kRZYJmXG0dOuKZU>LhaWU~+9iGE(N9pvT1Wht^ z;Q1q@Cbcj;ho2l8_~7gK0=yevLJ8hu&o>)45~#@ci2&B*mKNbnwOpzx?fZci6k4UZB$xuqyV( zm4WUMiht0~Mf86OxLx2=$3rvRxxzYiysvmF0apRvZqdZ-ToV@=297GYGJj$TxGE_7 zqOI%tfG9cvZ`eaUR+%6^P;eP|u!v;L3UVzzPxE|IKWhr6fmeOXll-y{QXhWqj`_`2e?e zEo-p~In89KVg(|rvDFeVb%ydF`tP*hpVfbGCp!@f^J68^ zebPSI=*MMLVYe?q+a!r!app+Imr|nb?Xy)o8=rg{)0D_{eQ@-Gp8jakc`yMUwjGLr zWs*B6!N9ZNIh<4K`sZh7voK3XckHui3?fcl&tZI>SqzYzO)O_}W+R_s?+m%-nd><} z7XLTHq%(8=<5N$THP)s)6#12)iG>YLBodb@03s*g&BSr6ZTKKATnrDQ9^*g*8&-;) zKZlnu(tFmJT<64zPwO|6l7wAk`UNMRX1Ji9TpQ97f~AVmmh zHy_7{&f{b)k^D{%yZy6cU`|*Yvf31;UG+mXKr4{zD@3kka^D=Ns{zsFfoWbtD@h&n zF|tfDg9)a5>V+xwz|5R|sK%G=+~b{@5=c`Z&6kEWm3|34FbT5EpZF_wEmKF=u7N1; z3Rqzsyvt#$^sk7_xIsV>1C4=#lGd(3f&d4tP~bLzgN#&HTh4lfzfY$=rfi%PO@iSP zQTX>Vy~@SW=c^j4bb3T@w;tPZ%}h94;c#D?!&L{{9d0}pyLsBE@G)F$RAgDw+OXKEe#8WOh{k^7zwzQX&#~j(Ngn@NS`VMA)lH*wVH%t+ zwv>2N-gaASh2w3NBDcZu#!~(C%66zAgn~;06KYP)f>rJd(*PbL?_)xlarUt_J&p2A zOfrjwrtjO#0OEY;1tZ0wC~Lbl^(@2wXS@*1?;Hxv9^ANeq)U zkzm4jXGKtg}u4A_hRzT#7Ym;mw6NkGy$rRP4v+dk9?e=u#{joLwKkThkZFsd!1Gz`MA!d1eFX2 zU3s7mwC<42gcD38lWXK-Q|(fMYK9d}8EK>bKpFK@tR$10Vnxf2OK&(DsakKOq=zPv z+!QOlW65U!=(0Izk8BRxBb%eP$mUX78&ln}ZIhmL>oumiq{AB1s^ptCrd9daYD|yF zO4gVjk(K(4DW`1KZA|%Pvl(N$(z3h%@2!A_aM)2O#5BA z-&F=`fy>>4j}0}sz?!Ox(p8k6Hc;deW@Nb%JEz6`^mF{En%Wx;)S=oR7MRq&rYTxa z9%-7Kl@7TpkF**RHG$dxL()_{V8AT7J2}#2%7%-nbr)b{?7@j&>f49*%a_NFI`Q)=nOh zcHTlBj&>eu9*%Y%TONvb!qT}OZf0`+>{mL6a!-}}YJYf`#iVeY3#?yX?kc06rgXJ5 zU`TkbCO9cHhKj88M)FWohM7)L2bww@^;B(8_iECb8L`fJY{|^p$|Fi<&U7A6G7D|# zK6CQ|rb^)K!Hj8T`nAr^_hDrFTIXhZQ#S3Xcb2hrxwC8%mP&7ooBGTuuaMSlS9cK7 z8s_G;326?A9#u%Q2KJajnzFFYJ@%s8b3u4}PV6bQWrbSoDTzI$9qp^wQ#$sZQh{L= z`%CRvxEK3NVt+~OFTI@oB@fRq@x$}tcX%NdUfXhvPaH9A7QsIIrB`vpw5>->Q{Yut z)V4^iu&BbK3XA$IEowm6U&55OVeeI(3J|9Po-m~1R6v_f1uU1Gx7RlpWFJ?Tx8qy> z%Yr+y>pZInszrv^~|aM zbP=W4BjZ%hb$)r`6UQiIB&p(Xqy+b|puroVuhc&ox#uqvDn_MZJZ;?)&|tTe7ZL_x zAQy*0`0U){t0+PaXEcOF$$Fyrb4D^s&~GYsQM!pDT2ZS4m9!yR(enw+FGBl>&^|BC zrwzNsK5dNX+~@RWVVUCKK2a=C>~~^Uz_M<0Okq`9TvAbeTyAN_Ya`)(inuEYkDAL= zDMo6j`h)(oI~oorr+BK$rw$uAXN*r|jN8hMrT zX`lZh)T}G3rD}GcetjfAS9wy`vNh}!;5K~RZS%LbW8m8YcAA;Cj*-c~+b2dw1d0}`Nn$mrHYD6Fc_urL=JF1l7YQr1B4G)*y>-c$ z&R>X_mW4uW`3auA#`IWnV0hgb_$OyRH){*Iz`ko@kU2RVV z{tvO_|Gj!Y*U5j)@gHyB!t|C$j%V@Mn?U^n^@pfm=@p~?uh_!K$JgP>c5HAW{!HmZ zzM+~S-4t-ow@@69YL%k40jP^tRE1*|j`ejqR<&Q|SZ(K?_pEVLsLYL`i5WYD%MT}! zYb^GRtde4f$m958Rv77GU$;7yd)r`YEFlI^Uh?Ik+Sr?$;%0H?ec*~%}0 zWfdIt2on=C-1RXJ%X;R@rIoz+qcb}J>Thk`L=D@t(yMKTbtkN6gci!IIhw@=f-hV zG>hv!n3@KI;h;L};|5abuP3BP%c3Ea|Y%8(NmzD_iSgPB!3hPmKx*K z-vhccj&AI9X1Z}=$*fhn*#_*K7vkrLCWWUHp6;c2x?xGYCuY*e9^QQgYE!tDMX3F@ zj?xS@=>}8HPOc~kZ`ca`ZG$&_1uIEnZAI*n36LT{NKccAv~U zoQcaPfk{BYI=CH)k8~#@)-f$GOdm}wMq5OydnM88lx|71x+_e7C80EM>&>cQ8Bm-! zjbsHL(oRvoe$_7ue1XB07u`>R@%`4UmObP9I<~)ANZJ3lgw_2 zjTV5SI}8w*;s@Yk-64h#r~{aJM>9k*`$3U^2bj1UfmP#G2G*;Ul!{4c0yV5ctctq= zm32lbiE9(zQh8?>VN_aP#YvYgpJsU`nQhabbUk}3QI4&0O{#596s`(Y@(`)G#dQYX zdUaB*mfYL^6Zv-^BHPC)(TS3!(u|SC45A;BiQcRzmFz@)`$~11wdN%{*UXC29X|)B zhm*}SMM(HQ60Vh8pk!kbA%GnOJSte5d`H#QA>M1ogmk|O>F$->U|fv}@B0nwa>Y|% z8@b=|1Aps>r5~5uCdTWUw@i(nsGe)WoNP(4BCK+N)0;q+RScqs1NNQ>KhcWZh&-LY z%7WWUub7msRO|dPJXO2vducCx>8M|FwJ16v9PVmzYEPo%u5Wo=6BiiYQrVnMdD78*m*@!rgA}qStrxg2?wSmn+$(5N{mpOrET&j4Iwl)vt zKrha+1?0s!xUk)Zt45yGE9 Date: Tue, 1 Mar 2022 21:56:12 -0500 Subject: [PATCH 388/393] pay for the collateral difference needed if the miner available balance is insufficient --- extern/storage-sealing/states_replica_update.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extern/storage-sealing/states_replica_update.go b/extern/storage-sealing/states_replica_update.go index 8683a11d84d..bede7a5fa81 100644 --- a/extern/storage-sealing/states_replica_update.go +++ b/extern/storage-sealing/states_replica_update.go @@ -168,7 +168,7 @@ func (m *Sealing) handleSubmitReplicaUpdate(ctx statemachine.Context, sector Sec log.Errorf("no good address to send replica update message from: %+v", err) return ctx.Send(SectorSubmitReplicaUpdateFailed{}) } - mcid, err := m.Api.SendMsg(ctx.Context(), from, m.maddr, miner.Methods.ProveReplicaUpdates, big.Zero(), big.Int(m.feeCfg.MaxCommitGasFee), enc.Bytes()) + mcid, err := m.Api.SendMsg(ctx.Context(), from, m.maddr, miner.Methods.ProveReplicaUpdates, collateral, big.Int(m.feeCfg.MaxCommitGasFee), enc.Bytes()) if err != nil { log.Errorf("handleSubmitReplicaUpdate: error sending message: %+v", err) return ctx.Send(SectorSubmitReplicaUpdateFailed{}) From 7073f31f84ad30e296ee7562390321c959d674cb Mon Sep 17 00:00:00 2001 From: zenground0 Date: Wed, 2 Mar 2022 09:33:33 -0700 Subject: [PATCH 389/393] Handle finalize failures in fsm --- cmd/lotus-miner/info.go | 1 + extern/storage-sealing/fsm.go | 6 ++ extern/storage-sealing/sector_state.go | 130 +++++++++++++------------ 3 files changed, 73 insertions(+), 64 deletions(-) diff --git a/cmd/lotus-miner/info.go b/cmd/lotus-miner/info.go index 1133908cab9..249a839d6af 100644 --- a/cmd/lotus-miner/info.go +++ b/cmd/lotus-miner/info.go @@ -527,6 +527,7 @@ var stateList = []stateMeta{ {col: color.FgRed, state: sealing.SnapDealsDealsExpired}, {col: color.FgRed, state: sealing.ReplicaUpdateFailed}, {col: color.FgRed, state: sealing.ReleaseSectorKeyFailed}, + {col: color.FgRed, state: sealing.FinalizeReplicaUpdateFailed}, } func init() { diff --git a/extern/storage-sealing/fsm.go b/extern/storage-sealing/fsm.go index 251d3a74aee..8678a0fe913 100644 --- a/extern/storage-sealing/fsm.go +++ b/extern/storage-sealing/fsm.go @@ -175,6 +175,7 @@ var fsmPlanners = map[SectorState]func(events []statemachine.Event, state *Secto ), FinalizeReplicaUpdate: planOne( on(SectorFinalized{}, UpdateActivating), + on(SectorFinalizeFailed{}, FinalizeReplicaUpdateFailed), ), UpdateActivating: planOne( on(SectorUpdateActive{}, ReleaseSectorKey), @@ -267,6 +268,9 @@ var fsmPlanners = map[SectorState]func(events []statemachine.Event, state *Secto ReleaseSectorKeyFailed: planOne( on(SectorUpdateActive{}, ReleaseSectorKey), ), + FinalizeReplicaUpdateFailed: planOne( + on(SectorRetryFinalize{}, FinalizeReplicaUpdate), + ), // Post-seal @@ -536,6 +540,8 @@ func (m *Sealing) plan(events []statemachine.Event, state *SectorInfo) (func(sta return m.handleSubmitReplicaUpdateFailed, processed, nil case ReleaseSectorKeyFailed: return m.handleReleaseSectorKeyFailed, 0, err + case FinalizeReplicaUpdateFailed: + return m.handleFinalizeFailed, processed, nil case AbortUpgrade: return m.handleAbortUpgrade, processed, nil diff --git a/extern/storage-sealing/sector_state.go b/extern/storage-sealing/sector_state.go index 5c2c56171a5..0f8228d027f 100644 --- a/extern/storage-sealing/sector_state.go +++ b/extern/storage-sealing/sector_state.go @@ -3,64 +3,65 @@ package sealing type SectorState string var ExistSectorStateList = map[SectorState]struct{}{ - Empty: {}, - WaitDeals: {}, - Packing: {}, - AddPiece: {}, - AddPieceFailed: {}, - GetTicket: {}, - PreCommit1: {}, - PreCommit2: {}, - PreCommitting: {}, - PreCommitWait: {}, - SubmitPreCommitBatch: {}, - PreCommitBatchWait: {}, - WaitSeed: {}, - Committing: {}, - CommitFinalize: {}, - CommitFinalizeFailed: {}, - SubmitCommit: {}, - CommitWait: {}, - SubmitCommitAggregate: {}, - CommitAggregateWait: {}, - FinalizeSector: {}, - Proving: {}, - FailedUnrecoverable: {}, - SealPreCommit1Failed: {}, - SealPreCommit2Failed: {}, - PreCommitFailed: {}, - ComputeProofFailed: {}, - CommitFailed: {}, - PackingFailed: {}, - FinalizeFailed: {}, - DealsExpired: {}, - RecoverDealIDs: {}, - Faulty: {}, - FaultReported: {}, - FaultedFinal: {}, - Terminating: {}, - TerminateWait: {}, - TerminateFinality: {}, - TerminateFailed: {}, - Removing: {}, - RemoveFailed: {}, - Removed: {}, - SnapDealsWaitDeals: {}, - SnapDealsAddPiece: {}, - SnapDealsPacking: {}, - UpdateReplica: {}, - ProveReplicaUpdate: {}, - SubmitReplicaUpdate: {}, - ReplicaUpdateWait: {}, - UpdateActivating: {}, - ReleaseSectorKey: {}, - FinalizeReplicaUpdate: {}, - SnapDealsAddPieceFailed: {}, - SnapDealsDealsExpired: {}, - SnapDealsRecoverDealIDs: {}, - ReplicaUpdateFailed: {}, - ReleaseSectorKeyFailed: {}, - AbortUpgrade: {}, + Empty: {}, + WaitDeals: {}, + Packing: {}, + AddPiece: {}, + AddPieceFailed: {}, + GetTicket: {}, + PreCommit1: {}, + PreCommit2: {}, + PreCommitting: {}, + PreCommitWait: {}, + SubmitPreCommitBatch: {}, + PreCommitBatchWait: {}, + WaitSeed: {}, + Committing: {}, + CommitFinalize: {}, + CommitFinalizeFailed: {}, + SubmitCommit: {}, + CommitWait: {}, + SubmitCommitAggregate: {}, + CommitAggregateWait: {}, + FinalizeSector: {}, + Proving: {}, + FailedUnrecoverable: {}, + SealPreCommit1Failed: {}, + SealPreCommit2Failed: {}, + PreCommitFailed: {}, + ComputeProofFailed: {}, + CommitFailed: {}, + PackingFailed: {}, + FinalizeFailed: {}, + DealsExpired: {}, + RecoverDealIDs: {}, + Faulty: {}, + FaultReported: {}, + FaultedFinal: {}, + Terminating: {}, + TerminateWait: {}, + TerminateFinality: {}, + TerminateFailed: {}, + Removing: {}, + RemoveFailed: {}, + Removed: {}, + SnapDealsWaitDeals: {}, + SnapDealsAddPiece: {}, + SnapDealsPacking: {}, + UpdateReplica: {}, + ProveReplicaUpdate: {}, + SubmitReplicaUpdate: {}, + ReplicaUpdateWait: {}, + UpdateActivating: {}, + ReleaseSectorKey: {}, + FinalizeReplicaUpdate: {}, + SnapDealsAddPieceFailed: {}, + SnapDealsDealsExpired: {}, + SnapDealsRecoverDealIDs: {}, + ReplicaUpdateFailed: {}, + ReleaseSectorKeyFailed: {}, + FinalizeReplicaUpdateFailed: {}, + AbortUpgrade: {}, } // cmd/lotus-miner/info.go defines CLI colors corresponding to these states @@ -124,12 +125,13 @@ const ( RecoverDealIDs SectorState = "RecoverDealIDs" // snap deals error modes - SnapDealsAddPieceFailed SectorState = "SnapDealsAddPieceFailed" - SnapDealsDealsExpired SectorState = "SnapDealsDealsExpired" - SnapDealsRecoverDealIDs SectorState = "SnapDealsRecoverDealIDs" - AbortUpgrade SectorState = "AbortUpgrade" - ReplicaUpdateFailed SectorState = "ReplicaUpdateFailed" - ReleaseSectorKeyFailed SectorState = "ReleaseSectorKeyFailed" + SnapDealsAddPieceFailed SectorState = "SnapDealsAddPieceFailed" + SnapDealsDealsExpired SectorState = "SnapDealsDealsExpired" + SnapDealsRecoverDealIDs SectorState = "SnapDealsRecoverDealIDs" + AbortUpgrade SectorState = "AbortUpgrade" + ReplicaUpdateFailed SectorState = "ReplicaUpdateFailed" + ReleaseSectorKeyFailed SectorState = "ReleaseSectorKeyFailed" + FinalizeReplicaUpdateFailed SectorState = "FinalizeReplicaUpdateFailed" Faulty SectorState = "Faulty" // sector is corrupted or gone for some reason FaultReported SectorState = "FaultReported" // sector has been declared as a fault on chain From 2e1bb7e8cc7604e3c257d0d5415ce362c0c06a11 Mon Sep 17 00:00:00 2001 From: Aayush Date: Wed, 2 Mar 2022 16:55:33 -0500 Subject: [PATCH 390/393] Lotus release v1.15.0-rc3 --- CHANGELOG.md | 4 ++-- build/openrpc/full.json.gz | Bin 26594 -> 26594 bytes build/openrpc/miner.json.gz | Bin 12927 -> 12927 bytes build/openrpc/worker.json.gz | Bin 3962 -> 3962 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, 6 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 44eae6e4bfa..b687cfb7c7b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,7 @@ # Lotus changelog -# 1.15.0-rc2 / 2022-03-01 +# 1.15.0-rc3 / 2022-03-02 -This is the second release candidates of v1.15.0, detailed changelog will be updated later. +This is the third release candidates of v1.15.0, detailed changelog will be updated later. This RC drops the libp2p upgrade that was included in the earlier 2 RCs. - github.com/filecoin-project/lotus: - bump the version to v1.15.0-rc1 diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 5d87fffe9153a4decdbe8e68e87ac05a1d675f8a..6baa5905bfef54c12e5b734437e0093c5707e9de 100644 GIT binary patch literal 26594 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 Gu>S*yyWxKT delta 26551 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 diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index 5d05474e602abc3936d1d5f590e5b7810681d8c9..48524e76fd398063db7935762abd305874a6d3e4 100644 GIT binary patch delta 21 dcmeyL@;_xl7i0X!?l*=U<&Uo=idQl*004Zh3B>>a delta 21 ccmeyL@;_xl7o-2i?l*=U61}B$;+0Gc0CdL)yZ`_I diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index 89d26d1617df98cc652350e8b25e5e0d3dbb18ff..7c4eac1de0dff757047bd7343ef3cb13bf31401e 100644 GIT binary patch delta 21 dcmew*_e*X Date: Wed, 9 Mar 2022 16:51:48 -0500 Subject: [PATCH 391/393] update v1.15.0 changelog --- CHANGELOG.md | 275 +++++++++++++++++++++------------------------------ 1 file changed, 111 insertions(+), 164 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a8b8755606e..b50d7cc9e74 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,177 +1,123 @@ # Lotus changelog -# 1.15.0-rc3 / 2022-03-02 - -This is the third release candidates of v1.15.0, detailed changelog will be updated later. This RC drops the libp2p upgrade that was included in the earlier 2 RCs. - -- github.com/filecoin-project/lotus: - - bump the version to v1.15.0-rc1 - - chore: build: v1.14.0 -> master ([filecoin-project/lotus#8053](https://github.com/filecoin-project/lotus/pull/8053)) - - FinalizeReplicaUpdate ([filecoin-project/lotus#8018](https://github.com/filecoin-project/lotus/pull/8018)) - - splitstore sortless compaction ([filecoin-project/lotus#8008](https://github.com/filecoin-project/lotus/pull/8008)) - - perf: chain: Make drand logs in daemon less noisy (#7955) ([filecoin-project/lotus#7955](https://github.com/filecoin-project/lotus/pull/7955)) - - chore: shed: storage stats 2.0 ([filecoin-project/lotus#7941](https://github.com/filecoin-project/lotus/pull/7941)) - - StartEpochSealingBuffer triggers packing on timer ([filecoin-project/lotus#7905](https://github.com/filecoin-project/lotus/pull/7905)) - - deps: update go-paramfetch to v0.0.4 ([filecoin-project/lotus#8050](https://github.com/filecoin-project/lotus/pull/8050)) - - fix: sealing: Stop recovery attempts after fault ([filecoin-project/lotus#8014](https://github.com/filecoin-project/lotus/pull/8014)) - - chore: update build and deps ([filecoin-project/lotus#8047](https://github.com/filecoin-project/lotus/pull/8047)) - - update libp2p to v0.18.0-rc4 ([filecoin-project/lotus#8044](https://github.com/filecoin-project/lotus/pull/8044)) - - update go-libp2p to v0.18.0-rc3 ([filecoin-project/lotus#8022](https://github.com/filecoin-project/lotus/pull/8022)) - - misc: api: Annotate lotus tests according to listed behaviors ([filecoin-project/lotus#7835](https://github.com/filecoin-project/lotus/pull/7835)) - - some basic splitstore refactors ([filecoin-project/lotus#7999](https://github.com/filecoin-project/lotus/pull/7999)) - - feat: mpool: Cache state nonces ([filecoin-project/lotus#8005](https://github.com/filecoin-project/lotus/pull/8005)) - - chore: sealer: quieten a log ([filecoin-project/lotus#7998](https://github.com/filecoin-project/lotus/pull/7998)) - - chore: build: make the OhSnap epoch configurable by an envvar for devnets ([filecoin-project/lotus#7995](https://github.com/filecoin-project/lotus/pull/7995)) - - chore: chain: fix log ([filecoin-project/lotus#7993](https://github.com/filecoin-project/lotus/pull/7993)) - - tvx: supply network version when extracting messages. ([filecoin-project/lotus#7996](https://github.com/filecoin-project/lotus/pull/7996)) - - fix: sealer: manager should lock Unsealed for ReplicaUpdate ([filecoin-project/lotus#7986](https://github.com/filecoin-project/lotus/pull/7986)) - - chore: remove inaccurate comment in sealtasks ([filecoin-project/lotus#7977](https://github.com/filecoin-project/lotus/pull/7977)) - - update go-libp2p to v0.18.0-rc2 ([filecoin-project/lotus#7984](https://github.com/filecoin-project/lotus/pull/7984)) - - Fix: sealer: ReplicaUpdate should fetch the correct files ([filecoin-project/lotus#7983](https://github.com/filecoin-project/lotus/pull/7983)) - - libp2p v0.18.0-rc1 and initial resource manager integration ([filecoin-project/lotus#7969](https://github.com/filecoin-project/lotus/pull/7969)) - - chore: merge release/v1.14.0 PRs into master ([filecoin-project/lotus#7979](https://github.com/filecoin-project/lotus/pull/7979)) - - chore: update PR template ([filecoin-project/lotus#7918](https://github.com/filecoin-project/lotus/pull/7918)) - - Fix: chain: create a new VM for each epoch ([filecoin-project/lotus#7966](https://github.com/filecoin-project/lotus/pull/7966)) - - feat(deps): update markets stack ([filecoin-project/lotus#7959](https://github.com/filecoin-project/lotus/pull/7959)) - - Use go-libp2p-connmgr v0.3.1 ([filecoin-project/lotus#7957](https://github.com/filecoin-project/lotus/pull/7957)) - - feat: #7747 sealing: Adding conf variable for capping number of concurrent unsealing jobs (#7884) ([filecoin-project/lotus#7884](https://github.com/filecoin-project/lotus/pull/7884)) - - build: release: bump master version to v1.15.0-dev ([filecoin-project/lotus#7922](https://github.com/filecoin-project/lotus/pull/7922)) - - feat: build: butterfly SNAPNET ([filecoin-project/lotus#7932](https://github.com/filecoin-project/lotus/pull/7932)) - - correctness fixes for the autobatch blockstore ([filecoin-project/lotus#7940](https://github.com/filecoin-project/lotus/pull/7940)) - - fix: #7869 sealing: Add more deal expiration checks during PRU pipeline ([filecoin-project/lotus#7871](https://github.com/filecoin-project/lotus/pull/7871)) - - fix: blockstore: Add missing locks to autobatch::Get() ([filecoin-project/lotus#7939](https://github.com/filecoin-project/lotus/pull/7939)) - - feat: state: Fast migration for v15 ([filecoin-project/lotus#7933](https://github.com/filecoin-project/lotus/pull/7933)) - - enhancement: #7891 sectors: disable existing existing cc upgrade path 2 days before the upgrade epoch ([filecoin-project/lotus#7900](https://github.com/filecoin-project/lotus/pull/7900)) - - chore: deps: Integrate proof v11.0.0 ([filecoin-project/lotus#7923](https://github.com/filecoin-project/lotus/pull/7923)) - - Snap Deals Lotus Integration: FSM Posting and integration test ([filecoin-project/lotus#7810](https://github.com/filecoin-project/lotus/pull/7810)) - - chore: deps: Update go-paramfetch ([filecoin-project/lotus#7917](https://github.com/filecoin-project/lotus/pull/7917)) - - feat: #7880 gas: add gas charge for VerifyReplicaUpdate ([filecoin-project/lotus#7897](https://github.com/filecoin-project/lotus/pull/7897)) - - misc: build: v1.13.2 back to master ([filecoin-project/lotus#7910](https://github.com/filecoin-project/lotus/pull/7910)) - - FIX: #7904 CI: generated vectors from v7 for bleeding edge ([filecoin-project/lotus#7903](https://github.com/filecoin-project/lotus/pull/7903)) - - misc: docs: remove issue number from the pr title ([filecoin-project/lotus#7902](https://github.com/filecoin-project/lotus/pull/7902)) - - Fix: state: circsuypply calc around null blocks ([filecoin-project/lotus#7890](https://github.com/filecoin-project/lotus/pull/7890)) - - test vector runner fixes for v6 vectors ([filecoin-project/lotus#7881](https://github.com/filecoin-project/lotus/pull/7881)) - - Shed: Add a util to send a batch of messages ([filecoin-project/lotus#7667](https://github.com/filecoin-project/lotus/pull/7667)) - - Snapcraft grade no develgrade ([filecoin-project/lotus#7802](https://github.com/filecoin-project/lotus/pull/7802)) - - fix: doc generation struct slice example value ([filecoin-project/lotus#7851](https://github.com/filecoin-project/lotus/pull/7851)) - - fix: returned error not be accept correctly ([filecoin-project/lotus#7852](https://github.com/filecoin-project/lotus/pull/7852)) - - Add api for transfer diagnostics ([filecoin-project/lotus#7759](https://github.com/filecoin-project/lotus/pull/7759)) - - Refactor: VM: Remove the NetworkVersionGetter ([filecoin-project/lotus#7818](https://github.com/filecoin-project/lotus/pull/7818)) - - fix: #7577 markets: When retrying Add Piece, first seek to start of reader ([filecoin-project/lotus#7812](https://github.com/filecoin-project/lotus/pull/7812)) - - feat: #6017 market: retrieval ask CLI command ([filecoin-project/lotus#7814](https://github.com/filecoin-project/lotus/pull/7814)) - - misc: n/a sealing: Fix grammatical error in a log warning message ([filecoin-project/lotus#7831](https://github.com/filecoin-project/lotus/pull/7831)) - - sectors update-state checks if sector exists before changing its state ([filecoin-project/lotus#7762](https://github.com/filecoin-project/lotus/pull/7762)) - - refactor: state: Move randomness versioning out of the VM ([filecoin-project/lotus#7816](https://github.com/filecoin-project/lotus/pull/7816)) - - feat(graphsync): allow setting of per-peer incoming requests for miners ([filecoin-project/lotus#7578](https://github.com/filecoin-project/lotus/pull/7578)) - - updating to new datastore/blockstore code with contexts ([filecoin-project/lotus#7646](https://github.com/filecoin-project/lotus/pull/7646)) - - Shed: Add a util to list terminated deals ([filecoin-project/lotus#7774](https://github.com/filecoin-project/lotus/pull/7774)) - - VM: Circ supply should be constant per epoch ([filecoin-project/lotus#7811](https://github.com/filecoin-project/lotus/pull/7811)) - - chore: create pull_request_template.md ([filecoin-project/lotus#7726](https://github.com/filecoin-project/lotus/pull/7726)) - - Mempool msg selection should respect block message limits ([filecoin-project/lotus#7321](https://github.com/filecoin-project/lotus/pull/7321)) - - Merge v15 work into master ([filecoin-project/lotus#7784](https://github.com/filecoin-project/lotus/pull/7784)) - - Expose EnableGasTracing as an env_var ([filecoin-project/lotus#7750](https://github.com/filecoin-project/lotus/pull/7750)) - - Minor improvement for OpenTelemetry ([filecoin-project/lotus#7760](https://github.com/filecoin-project/lotus/pull/7760)) - - Sort lotus-miner retrieval-deals by dealId ([filecoin-project/lotus#7749](https://github.com/filecoin-project/lotus/pull/7749)) - - Make retrieval even faster ([filecoin-project/lotus#7746](https://github.com/filecoin-project/lotus/pull/7746)) - - dep/fix 7701 Dependency: update to ipld-legacy to v0.1.1 ([filecoin-project/lotus#7751](https://github.com/filecoin-project/lotus/pull/7751)) - - Command to list active sector locks ([filecoin-project/lotus#7735](https://github.com/filecoin-project/lotus/pull/7735)) - - dagstore pieceReader: Always read full in ReadAt ([filecoin-project/lotus#7737](https://github.com/filecoin-project/lotus/pull/7737)) - - SplitStore: supress compaction near upgrades ([filecoin-project/lotus#7734](https://github.com/filecoin-project/lotus/pull/7734)) - - Disable appimage ([filecoin-project/lotus#7707](https://github.com/filecoin-project/lotus/pull/7707)) - - Initial switch to OpenTelemetry ([filecoin-project/lotus#7725](https://github.com/filecoin-project/lotus/pull/7725)) - - Bump the master version to v1.13.3-dev ([filecoin-project/lotus#7717](https://github.com/filecoin-project/lotus/pull/7717)) -- github.com/filecoin-project/dagstore (v0.4.3 -> v0.4.4): - failed to fetch repo -- github.com/filecoin-project/go-amt-ipld/v4 (null -> v4.0.0): - - v4 (#60) ([filecoin-project/go-amt-ipld#60](https://github.com/filecoin-project/go-amt-ipld/pull/60)) - - Merge pull request from GHSA-3wpc-wmc7-8p5g - - add .github/workflows/tagpush.yml - - add .github/workflows/release-check.yml - - add .github/workflows/releaser.yml - - update .github/workflows/go-check.yml - - update .github/workflows/go-test.yml - - add version.json file - - fix: fix bitWidth error message (#58) ([filecoin-project/go-amt-ipld#58](https://github.com/filecoin-project/go-amt-ipld/pull/58)) - - update .github/workflows/go-check.yml - - update .github/workflows/go-test.yml - - update .github/workflows/automerge.yml + +# 1.15.0 / 2022-03-09 + +This is an optional release with retrieval improvements(client side), SP ux with unsealing, snap deals and regular deal making and many other new features, improvements and bug fixes. + +## Highlights +- feat:sealing: StartEpochSealingBuffer triggers packing on time([filecoin-project/lotus#7905](https://github.com/filecoin-project/lotus/pull/7905)) + - use the `StartEpochSealingBuffer` configuration variable as a way to enforce that sectors are packed for sealing / updating no matter how many deals they have if the nearest deal start date is close enough to the present. +- feat: #6017 market: retrieval ask CLI command ([filecoin-project/lotus#7814](https://github.com/filecoin-project/lotus/pull/7814)) +- feat(graphsync): allow setting of per-peer incoming requests for miners ([filecoin-project/lotus#7578](https://github.com/filecoin-project/lotus/pull/7578)) + - by setting `SimultaneousTransfersForStoragePerClient` in deal making configuration. +- Make retrieval even faster ([filecoin-project/lotus#7746](https://github.com/filecoin-project/lotus/pull/7746)) +- feat: #7747 sealing: Adding conf variable for capping number of concurrent unsealing jobs (#7884) ([filecoin-project/lotus#7884](https://github.com/filecoin-project/lotus/pull/7884)) + - by setting `MaxConcurrentUnseals` in `DAGStoreConfig` + +## New Features +- fix: sealing: Stop recovery attempts after fault ([filecoin-project/lotus#8014](https://github.com/filecoin-project/lotus/pull/8014)) +- feat: mpool: Cache state nonces ([filecoin-project/lotus#8005](https://github.com/filecoin-project/lotus/pull/8005)) +- chore: build: make the OhSnap epoch configurable by an envvar for devnets ([filecoin-project/lotus#7995](https://github.com/filecoin-project/lotus/pull/7995)) +- Shed: Add a util to send a batch of messages ([filecoin-project/lotus#7667](https://github.com/filecoin-project/lotus/pull/7667)) +- Add api for transfer diagnostics ([filecoin-project/lotus#7759](https://github.com/filecoin-project/lotus/pull/7759)) +- Shed: Add a util to list terminated deals ([filecoin-project/lotus#7774](https://github.com/filecoin-project/lotus/pull/7774)) +- Expose EnableGasTracing as an env_var ([filecoin-project/lotus#7750](https://github.com/filecoin-project/lotus/pull/7750)) +- Command to list active sector locks ([filecoin-project/lotus#7735](https://github.com/filecoin-project/lotus/pull/7735)) +- Initial switch to OpenTelemetry ([filecoin-project/lotus#7725](https://github.com/filecoin-project/lotus/pull/7725)) + +## Improvements +- splitstore sortless compaction ([filecoin-project/lotus#8008](https://github.com/filecoin-project/lotus/pull/8008)) +- perf: chain: Make drand logs in daemon less noisy (#7955) ([filecoin-project/lotus#7955](https://github.com/filecoin-project/lotus/pull/7955)) +- chore: shed: storage stats 2.0 ([filecoin-project/lotus#7941](https://github.com/filecoin-project/lotus/pull/7941)) +- misc: api: Annotate lotus tests according to listed behaviors ([filecoin-project/lotus#7835](https://github.com/filecoin-project/lotus/pull/7835)) +- some basic splitstore refactors ([filecoin-project/lotus#7999](https://github.com/filecoin-project/lotus/pull/7999)) +- chore: sealer: quieten a log ([filecoin-project/lotus#7998](https://github.com/filecoin-project/lotus/pull/7998)) +- tvx: supply network version when extracting messages. ([filecoin-project/lotus#7996](https://github.com/filecoin-project/lotus/pull/7996)) +- chore: remove inaccurate comment in sealtasks ([filecoin-project/lotus#7977](https://github.com/filecoin-project/lotus/pull/7977)) +- Refactor: VM: Remove the NetworkVersionGetter ([filecoin-project/lotus#7818](https://github.com/filecoin-project/lotus/pull/7818)) +- refactor: state: Move randomness versioning out of the VM ([filecoin-project/lotus#7816](https://github.com/filecoin-project/lotus/pull/7816)) +- updating to new datastore/blockstore code with contexts ([filecoin-project/lotus#7646](https://github.com/filecoin-project/lotus/pull/7646)) +- Mempool msg selection should respect block message limits ([filecoin-project/lotus#7321](https://github.com/filecoin-project/lotus/pull/7321)) +- Minor improvement for OpenTelemetry ([filecoin-project/lotus#7760](https://github.com/filecoin-project/lotus/pull/7760)) +- Sort lotus-miner retrieval-deals by dealId ([filecoin-project/lotus#7749](https://github.com/filecoin-project/lotus/pull/7749)) +- dagstore pieceReader: Always read full in ReadAt ([filecoin-project/lotus#7737](https://github.com/filecoin-project/lotus/pull/7737)) + +## Bug Fixes +- fix:snap: pay for the collateral difference needed if the miner available balance is insufficient ([filecoin-project/lotus#8234](https://github.com/filecoin-project/lotus/pull/8234)) +- sealer: fix error message ([filecoin-project/lotus#8136](https://github.com/filecoin-project/lotus/pull/8136)) +- typo in variable name ([filecoin-project/lotus#8134](https://github.com/filecoin-project/lotus/pull/8134)) +- fix: sealer: allow enable/disabling ReplicaUpdate tasks ([filecoin-project/lotus#8093](https://github.com/filecoin-project/lotus/pull/8093)) +- chore: chain: fix log ([filecoin-project/lotus#7993](https://github.com/filecoin-project/lotus/pull/7993)) +- Fix: chain: create a new VM for each epoch ([filecoin-project/lotus#7966](https://github.com/filecoin-project/lotus/pull/7966)) +- fix: doc generation struct slice example value ([filecoin-project/lotus#7851](https://github.com/filecoin-project/lotus/pull/7851)) +- fix: returned error not be accept correctly ([filecoin-project/lotus#7852](https://github.com/filecoin-project/lotus/pull/7852)) +- fix: #7577 markets: When retrying Add Piece, first seek to start of reader ([filecoin-project/lotus#7812](https://github.com/filecoin-project/lotus/pull/7812)) +- misc: n/a sealing: Fix grammatical error in a log warning message ([filecoin-project/lotus#7831](https://github.com/filecoin-project/lotus/pull/7831)) +- sectors update-state checks if sector exists before changing its state ([filecoin-project/lotus#7762](https://github.com/filecoin-project/lotus/pull/7762)) +- SplitStore: supress compaction near upgrades ([filecoin-project/lotus#7734](https://github.com/filecoin-project/lotus/pull/7734)) + +## Dependency Updates - github.com/filecoin-project/go-commp-utils (v0.1.2 -> v0.1.3): - - chore(deps): clean up dependencies (#7) ([filecoin-project/go-commp-utils#7](https://github.com/filecoin-project/go-commp-utils/pull/7)) -- github.com/filecoin-project/go-ds-versioning (v0.1.0 -> v0.1.1): - - update to context datastores (#3) ([filecoin-project/go-ds-versioning#3](https://github.com/filecoin-project/go-ds-versioning/pull/3)) - - ci(circle): fix versions (#4) ([filecoin-project/go-ds-versioning#4](https://github.com/filecoin-project/go-ds-versioning/pull/4)) -- github.com/filecoin-project/go-fil-markets (v1.13.4 -> v1.19.0): - - release: v1.19.0 - - Update to go-data-transfer v1.14.0 / go-libp2p v0.18.0-rc1 (#669) ([filecoin-project/go-fil-markets#669](https://github.com/filecoin-project/go-fil-markets/pull/669)) - - release: v1.18.0 (#671) ([filecoin-project/go-fil-markets#671](https://github.com/filecoin-project/go-fil-markets/pull/671)) - - revert index provider PR #629 and associated PRs (#670) ([filecoin-project/go-fil-markets#670](https://github.com/filecoin-project/go-fil-markets/pull/670)) - - log advertisement cid for announcement and update deps (#667) ([filecoin-project/go-fil-markets#667](https://github.com/filecoin-project/go-fil-markets/pull/667)) - - release: v1.15.0 ([filecoin-project/go-fil-markets#661](https://github.com/filecoin-project/go-fil-markets/pull/661)) - - retrieve by any CID (not just root CID) and reference provider integration (#629) ([filecoin-project/go-fil-markets#629](https://github.com/filecoin-project/go-fil-markets/pull/629)) - - release: v1.14.1 ([filecoin-project/go-fil-markets#660](https://github.com/filecoin-project/go-fil-markets/pull/660)) - - refactor: isolate commp in its own package to avoid exposing pulling filecoin-ffi (#659) ([filecoin-project/go-fil-markets#659](https://github.com/filecoin-project/go-fil-markets/pull/659)) - - release: v1.14.0 ([filecoin-project/go-fil-markets#658](https://github.com/filecoin-project/go-fil-markets/pull/658)) - - add SeekStart method to inflator reader (#656) ([filecoin-project/go-fil-markets#656](https://github.com/filecoin-project/go-fil-markets/pull/656)) - - Merge tag 'v1.13.6' - - Timeout provider after waiting a period of time for transfer to restart (#655) ([filecoin-project/go-fil-markets#655](https://github.com/filecoin-project/go-fil-markets/pull/655)) - - Update to context datastores (#653) ([filecoin-project/go-fil-markets#653](https://github.com/filecoin-project/go-fil-markets/pull/653)) - - Fix and de-dupe link to spec (#652) ([filecoin-project/go-fil-markets#652](https://github.com/filecoin-project/go-fil-markets/pull/652)) - - release: v1.13.4 (#651) ([filecoin-project/go-fil-markets#651](https://github.com/filecoin-project/go-fil-markets/pull/651)) -- github.com/filecoin-project/go-paramfetch (v0.0.2 -> v0.0.4): - - retry fetching once before erroring ([filecoin-project/go-paramfetch#22](https://github.com/filecoin-project/go-paramfetch/pull/22)) - - Always verify SnapDeals params ([filecoin-project/go-paramfetch#20](https://github.com/filecoin-project/go-paramfetch/pull/20)) -- github.com/filecoin-project/go-state-types (v0.1.1 -> v0.1.3): - - CBOR encode Addr Pairs for keys (#35) ([filecoin-project/go-state-types#35](https://github.com/filecoin-project/go-state-types/pull/35)) - - Add AddrPairKey (#34) ([filecoin-project/go-state-types#34](https://github.com/filecoin-project/go-state-types/pull/34)) +- github.com/filecoin-project/dagstore (v0.4.3 -> v0.4.4): +- github.com/filecoin-project/go-fil-markets (v1.13.4 -> v1.19.2): - github.com/filecoin-project/go-statestore (v0.1.1 -> v0.2.0): - - update to context datastores ([filecoin-project/go-statestore#10](https://github.com/filecoin-project/go-statestore/pull/10)) - github.com/filecoin-project/go-storedcounter (v0.0.0-20200421200003-1c99c62e8a5b -> v0.1.0): - - Update go-datastore ([filecoin-project/go-storedcounter#1](https://github.com/filecoin-project/go-storedcounter/pull/1)) - github.com/filecoin-project/specs-actors/v2 (v2.3.5 -> v2.3.6): - - Update to context datastores (#1541) ([filecoin-project/specs-actors#1541](https://github.com/filecoin-project/specs-actors/pull/1541)) -- github.com/filecoin-project/specs-storage (v0.1.1-0.20201105051918-5188d9774506 -> v0.2.0): - - FinalizeReplicaUpdate (#22) ([filecoin-project/specs-storage#22](https://github.com/filecoin-project/specs-storage/pull/22)) - - Add release of sectorkey and replica update ([filecoin-project/specs-storage#20](https://github.com/filecoin-project/specs-storage/pull/20)) - - Feat/update post gen (#19) ([filecoin-project/specs-storage#19](https://github.com/filecoin-project/specs-storage/pull/19)) - - Add sector key to ReplicaUpdate iface method (#18) ([filecoin-project/specs-storage#18](https://github.com/filecoin-project/specs-storage/pull/18)) - - Update for snap deals (#17) ([filecoin-project/specs-storage#17](https://github.com/filecoin-project/specs-storage/pull/17)) - - Merge remote-tracking branch 'origin/feat/sector-ref' + - feat(deps): update markets stack ([filecoin-project/lotus#7959](https://github.com/filecoin-project/lotus/pull/7959)) + - Use go-libp2p-connmgr v0.3.1 ([filecoin-project/lotus#7957](https://github.com/filecoin-project/lotus/pull/7957)) + - dep/fix 7701 Dependency: update to ipld-legacy to v0.1.1 ([filecoin-project/lotus#7751](https://github.com/filecoin-project/lotus/pull/7751)) -Contributors +## Others +- chore: backport: release ([filecoin-project/lotus#8245](https://github.com/filecoin-project/lotus/pull/8245)) +- Lotus release v1.15.0-rc3 ([filecoin-project/lotus#8236](https://github.com/filecoin-project/lotus/pull/8236)) +- Lotus release v1.15.0-rc2 ([filecoin-project/lotus#8211](https://github.com/filecoin-project/lotus/pull/8211)) +- Merge branch 'releases' into release/v1.15.0 +- chore: build: backport releases ([filecoin-project/lotus#8193](https://github.com/filecoin-project/lotus/pull/8193)) +- Merge branch 'releases' into release/v1.15.0 +- bump the version to v1.15.0-rc1 +- chore: build: v1.14.0 -> master ([filecoin-project/lotus#8053](https://github.com/filecoin-project/lotus/pull/8053)) +- chore: merge release/v1.14.0 PRs into master ([filecoin-project/lotus#7979](https://github.com/filecoin-project/lotus/pull/7979)) +- chore: update PR template ([filecoin-project/lotus#7918](https://github.com/filecoin-project/lotus/pull/7918)) +- build: release: bump master version to v1.15.0-dev ([filecoin-project/lotus#7922](https://github.com/filecoin-project/lotus/pull/7922)) +- misc: docs: remove issue number from the pr title ([filecoin-project/lotus#7902](https://github.com/filecoin-project/lotus/pull/7902)) +- Snapcraft grade no develgrade ([filecoin-project/lotus#7802](https://github.com/filecoin-project/lotus/pull/7802)) +- chore: create pull_request_template.md ([filecoin-project/lotus#7726](https://github.com/filecoin-project/lotus/pull/7726)) +- Disable appimage ([filecoin-project/lotus#7707](https://github.com/filecoin-project/lotus/pull/7707)) +## Contributors | Contributor | Commits | Lines ± | Files Changed | |-------------|---------|---------|---------------| -| Aayush Rajasekaran | 116 | +12792/-3989 | 579 | -| zenground0 | 38 | +8894/-1521 | 343 | -| vyzo | 121 | +4537/-1470 | 258 | -| zl | 1 | +3725/-309 | 8 | -| dirkmc | 7 | +1392/-1110 | 61 | -| Jennifer Wang | 55 | +890/-806 | 121 | -| Łukasz Magiera | 35 | +1143/-339 | 104 | -| whyrusleeping | 2 | +483/-585 | 28 | +| @arajasek | 73 | +7232/-2778 | 386 | +| @zenground0 | 27 | +5604/-1049 | 219 | +| @vyzo | 118 | +4356/-1470 | 253 | +| @zl | 1 | +3725/-309 | 8 | +| @dirkmc | 7 | +1392/-1110 | 61 | +| arajasek | 37 | +221/-1329 | 90 | +| @magik6k | 33 | +1138/-336 | 101 | +| @whyrusleeping | 2 | +483/-585 | 28 | | Darko Brdareski | 14 | +725/-276 | 154 | -| Rod Vagg | 3 | +45/-949 | 12 | -| hannahhoward | 10 | +481/-133 | 35 | -| Hannah Howard | 3 | +371/-234 | 22 | -| c r | 4 | +425/-75 | 18 | -| TheMenko | 8 | +237/-179 | 17 | -| Aayush | 15 | +197/-106 | 57 | -| ZenGround0 | 3 | +263/-25 | 11 | -| Dirk McCormick | 12 | +188/-40 | 27 | -| Peter Rabbitson | 3 | +128/-62 | 3 | -| Steven Allen | 2 | +110/-74 | 2 | -| Raúl Kripalani | 6 | +128/-49 | 9 | -| Whyrusleeping | 1 | +76/-70 | 8 | -| web3-bot | 10 | +99/-17 | 10 | -| Jiaying Wang | 15 | +58/-23 | 15 | -| Aarsh Shah | 1 | +23/-19 | 5 | -| Travis Person | 2 | +2/-20 | 4 | -| Jakub Sztandera | 3 | +13/-5 | 5 | -| gstuart | 3 | +12/-1 | 3 | -| Cory Schwartz | 4 | +5/-6 | 4 | -| pefish | 1 | +4/-3 | 1 | +| @rvagg | 2 | +43/-947 | 10 | +| @hannahhoward | 5 | +436/-335 | 31 | +| @hannahhoward | 12 | +507/-133 | 37 | +| @jennijuju | 27 | +333/-178 | 54 | +| @TheMenko | 8 | +237/-179 | 17 | +| c r | 2 | +227/-45 | 12 | +| @dirkmck | 12 | +188/-40 | 27 | +| @ribasushi | 3 | +128/-62 | 3 | +| @raulk | 6 | +128/-49 | 9 | +| @Whyrusleeping | 1 | +76/-70 | 8 | +| @Stebalien | 1 | +55/-37 | 1 | +| @jennijuju | 11 | +29/-16 | 11 | +| @aarshkshah1992 | 1 | +23/-19 | 5 | +| @travisperson | 1 | +0/-18 | 2 | +| @gstuart | 3 | +12/-1 | 3 | +| @coryschwartz | 4 | +5/-6 | 4 | +| @pefish | 1 | +4/-3 | 1 | +| @Kubuxu | 1 | +5/-2 | 2 | | Colin Kennedy | 1 | +4/-2 | 1 | | Rob Quist | 1 | +2/-2 | 1 | -| shotcollin | 1 | +1/-1 | 1 | +| @shotcollin | 1 | +1/-1 | 1 | + # 1.14.4 / 2022-03-03 @@ -1061,7 +1007,7 @@ This is a **highly recommended** but optional Lotus v1.11.1 release that introd | dependabot[bot] | 1 | +3/-3 | 1 | | zhoutian527 | 1 | +2/-2 | 1 | | xloem | 1 | +4/-0 | 1 | -| @travisperson| 2 | +2/-2 | 3 | +| | 2 | +2/-2 | 3 | | Liviu Damian | 2 | +2/-2 | 2 | | @jimpick | 2 | +2/-2 | 2 | | Frank | 1 | +3/-0 | 1 | @@ -1073,6 +1019,7 @@ This is a **highly recommended** but optional Lotus v1.11.1 release that introd This is a **highly recommended** release of Lotus that have many bug fixes, improvements and new features. ## Highlights +- Miner SimultaneousTransfers config ([filecoin-project/lotus#6612](https://github.com/filecoin-project/lotus/pull/6612)) - Miner SimultaneousTransfers config ([filecoin-project/lotus#6612](https://github.com/filecoin-project/lotus/pull/6612)) - Set `SimultaneousTransfers` in lotus miner config to configure the maximum number of parallel online data transfers, including both storage and retrieval deals. - Dynamic Retrieval pricing ([filecoin-project/lotus#6175](https://github.com/filecoin-project/lotus/pull/6175)) @@ -1227,7 +1174,7 @@ This is a **highly recommended** release of Lotus that have many bug fixes, impr | @Stebalien | 106 | +7653/-2718 | 273 | | dirkmc | 11 | +2580/-1371 | 77 | | @dirkmc | 39 | +1865/-1194 | 79 | -| @Kubuxu | 19 | +1973/-485 | 81 | +| | 19 | +1973/-485 | 81 | | @vyzo | 4 | +1748/-330 | 50 | | @aarshkshah1992 | 5 | +1462/-213 | 27 | | @coryschwartz | 35 | +568/-206 | 59 | From 1daaba9224a9ecdb1081d82118c10da25556fc36 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Wed, 9 Mar 2022 18:32:02 -0500 Subject: [PATCH 392/393] bump the version to v1.15.0 --- build/openrpc/full.json.gz | Bin 26594 -> 26589 bytes build/openrpc/miner.json.gz | Bin 12927 -> 12924 bytes build/openrpc/worker.json.gz | Bin 3962 -> 3959 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 +- 7 files changed, 4 insertions(+), 4 deletions(-) diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 6baa5905bfef54c12e5b734437e0093c5707e9de..301ea5703e3adcb8154349fafca2f576fce63876 100644 GIT binary patch delta 26468 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

|FasKQQqbu%Jv2)#7J1l7BR1ksh7-JcVU|K zOdr)xnyhG?5a!keZjnQy$7R3Y|Q5yL4mJIgyHq-xQF!S>biV)*? z4pm1)&6d&Kb)>#mV8eW8e{B!_m$amQkRFFG^wdVhSBzQ(!-Y>^m1H3Ig`V6k|F3uI z?sd@%SeX)CMVYK^?|6K}UERBNndjs*Q^>U2;?|Yx);2GtlIwWfQ@8U2PI+cMS|S7z zmJ(2tA$$d65~SbXn&mFpnL9h?Ld{)3mGdFHP;+;7%m6rhO$o)i=Mrm5BUW=d%=T>9 zlI&rf&w|;d4U?_^f5=>6owck}vOoHwMWFYRdDqa*8jD z>|S=cy}G%2mL>J-vQ^bOZI{V~^31{@SOCZbSdyMYA-;zaJF%gh#3`QAKT%l)^e!Hp{7+f z9$jv+s_1}b@36C4oz?2(uam#dYF%ez=yg-#upV-TS)~i>!5wUqC2S?XaEtU{d4AR) zCzw;kP8B;>S7|W2QGv`MfSrAf{p`u%zl*#sf;f@g$&-@9lJt4OC73 zfY89SZx;Sz%~TQ`2tj}u2Xs<#5Qs(q6EBFxLI9Y^0Ad+aJPxRL?V<CjpLK2&2Qv4kx=1#xf#%v)Pmqf9ztl)1(&-r%7|$`Po6pWv8hx znvavVMphYvOFUCq!whkjouJmoMgga#R!X_tXaMJ! z?k8TVe>e__wJZ81IwU$E7_Jf0d5)m^S6IMdgl;g6S+D>?m{5j%aNzsWY>BdO`j8$$!=X!z)g@ ze?WK#(j7>5ApIUex`VwA_Bz<>V6TI{U19HTT@pqG#?BPR>56-G^;Lmy`Pt4YXjgO9 zC)~|CTEx4JSU2HBLrErjDnP4_dXJLOtOT~+Bg)k*7%L5Bw& z9&~uHD<0gdOWP{|%PLV0?L!<=cV`Ize|ExseTOSl#ws+Ry{6!Vmzggyfo_RYal8OL zf`ma&j5atq?gay;?G&ma=_^^0;gAX>3}oc ze|bkfz%F@#OCvYOL1GmVN3WnG}GwCOu)1;<+B3p(#MHsqJhL6C!_@8C}JvWpK=6V5!Dh5Ho&EE zr3;;C#-Q9d2V`R5oc+) z9N5IWM##e+*5F}pMViyYh%fS$JfG_PXL!xquONLtC<@x@OC8HmS2o zolWX&(#L3%zOGBz&hT`Ffadnm%>BCZdyZDF3{|c-2pi&)>+L}2w0EY)e*-l&96)ja z$pIt>kRBsIdQ+FiIo0#4`0R5OdUV+r-1F6$9a0*vR&dYfdeAfAvUAQqI2?Ab4(qz3 zXwF~lK;%Oi+|_U2|?&UFExBLsQ3 zXl_-t&ZJ3Ak8SYvTjhDae=*)Tnn6t7hSZzc+cajOPUehcyFWW78HM)Q>NF>w{3pF| zKv*2NFbEL0v{TZwmWjGY94Hf7jPZsJ+5())k5>W3N_;DnYY9^3hy~G4_3t2#yI76g=Lu75n)WLiQ^Bv50F#j>a{H?k~{tQpwBYtoLaRA2wI#dX*6Xvg= z(`HYD=dS{K4xZ&9e=~BgXuRR_rJSA67S&hxbIJ8fH7q7qF-f;NjpRlFofvTc7nY!E zz-N#r!TYzE&-@79e-c0=z(Pd$6Lr6HcY%~Om?U%q z>Z=LNuist>a+lezqlMViEjM3PS0LL(W@bIK5|s&CiG)n9s57=y)irfObWZUNB1RG< z#w!=G8c|`8y(yZArX6T$+36#TzB#M9-vgIX>+KpHWqB^QR@xXr55=;1^w)}Q zZ;swHs?tADw|nu;+AAnhxdXAXHKN$KM;j#Vr(INf#*%4sz&VYHyaM*!$*Hn1Zd55u z%uNUR%R>=|f0%#}MVR{iocd)PMjW7!db9isM11qHQ@u|0+HNzrL31|Yk5Od14R=Cl zfs4uX!kZyK4mx|)3S?HZ5d}?6&{B&TO*g1BgKk%CmhYpLm00A@)NMEF9qq-`Q;Yov2WW#LuqGwhIA*f7G7%zTCVX4t|&M7RNf=LO*V~ zXI5;ht@&cIWn*C#dA`3ZN7q#!>@_4yUnNs|PifK%F;vyLozmc}y%o-d^qoPyK7IP~ zP^xkc_4_&XaW4lt%30Uli4K>4eJwHi7P-qe`w$v*CGY<7DdPh;{~7uT@e^iK?L(z zu6aEoPt~Wj&fGrq1K94`B!?v(mULLsVacvo@^wS@|BG7~u5xvfQU9KAkgqy(+e5xa zqXWG`&itUX_Zpi#Rp#{1oTj3vf~fa+{bp?{`sKIGHz&@QShM2x&f=|}4py!mx9(2) zf1lwUUT1C}Kwf%>@*T=|DBq#{$B6RZG~`nkC~<|H>RI(4i}AbS`JQvI=el2o=9`gx zLoU!N9N%kPNV`m(%i+8O><+Ly!2XZ{yMw?E0y_xoAn+rEz+0OQ8S@3eS|tqHsDB?J z6Fni{zGI*By|#~?FnLKsC)h0vLxEtoe>GNQNepn7J>lLkZ#kIRVcJKCY1f(C2Y_WA zI&|pJp+kobA0s;4s!2DlkRIeQYYhyus&$x9hr(tBn^0U*qE%1Vh}?2?|v;{dbSM>b`H{jKfMu<+tApx(85_0Mo1^H^sz)XOsz zUE+`-ehL}i+T0X{H%7y%x9>240p<%;sgj;@`TX0!D z@>YtY;$wD`%=xL*W{CAvvtifze|UA7!^fr@wrg_Kp23ATI|u?QI6j4>z3-qz!P0y1 z96U=l%jy+IiFmc%*leRHsu-@<7mw8>uF@6he#t}GMp@IvHmb>Hs%Bo2rubb<{Pu{f zf`_grFc_fB6E;74OCOR^1J^45dG!@+*~{5_QFFpq#Ed*dOSOe{l1VFO(aw z!XuIQR~%6?!OA@F>`2`{z%eF`y1jE69#V9uG{y}4JhN5$Xe1r_D z?NOWRQCk}`-<`I#yLlhX@#)X6Kvw0%!W5ULfiH`ng3Pac=gns z4_Qg<)a2=`kc@{5G0QG#e;>*sp|!#uPhW~8VdcIQiqX~Pd}ohUxjd|G52p&9Ds-yw zDXPM~noOTkrXSHD5MAt~`*dY{3(3R&#u4_HYBEi@!Humcwen#Xcy{KH;9C!5iTUjL z62C;H7|7E)!aj%uH%#sVK)_Hid8x{bF`25_lVzVnKENrp4RFE%f0la(bCpQ~0=;oH z1P~liA9>)}?F@S}pc7SOiSj)0_GJjYYviY`h_QRFb6k8BrDl-LHu7$helmu3O-;3~ zqU2Rgl1RC--lL9UxYO&5%;`m#K){max#rOJUe>+s4g7qRy>_dM3C}h40#C>dV@pVn=utdCxu{uZ4Uvw7sDTO+z zpMX2?tR(A~%kq?Z19~hX(=KA(?8Uu9Nr%RMA{wg_sAb)>?z(GD#m$?V>@sqhonqDz zQ;M1u;ziyx*jA_rT8(!Mt}IS8w=0W~>TBJW&D95ZRsVWUf9CDYnnTp`BY#4-XK*3# zeYYu{)nCo4&fol@`mBPQw9BIz@Dmp=Q5$pzvP{pcre?|3AsA9$Qbrj25R?H@x9tAh6bS>ZNG z&3;?!BjvYEe_N_+ZJScP?iiVFA1_}OlW2S=o9M#ar*2gNcfP-+qc*BExDAn7Hn{UI z*T~>bH&Ak|3XzlBrL$a`7s!hcKZ_8a%Y!FXM`Tu8tiyqfs+3{U#=)MPAW0|Q2ZX0H zo(T>VP4(zj5D{PX0#6B4`sMrJQqGL+M#=G`{1w?pf3m%|wjW8An-5ORRf#z@mF#W+ zR`ajhC$w+J`sh+scl3kwdgIb!>iO_gQDk)dhPjp7VpLa}I7&iv8|NRU?i#+W^MYoU z+*VC40BNph9Mj2)Q+4~_GFNo(W5+z@*ln1*4f8d1(XOi)*{(S>suotaQ=>-R7H1QT zTFYfgf5RctF76$RgQHJLg1l(@`h}NPwjm`vq9rTs7)QucRNG#^nxohnd}r-GxocFn zM@=UIwb^#ym$ir0qR;BL@c_RFMcoaV9@5t&v>SN5;7H~VD#Xw5+-<8%q(#P61Nz7{ z&{}}xI&POn=&=fvMjvt2r*7w9a;_drS5GT>f9m`#&fntvEl<+l((k6)Pq-$xF$39J z2R#;;TT{;070K>29kbWi;%J7v>x&Q(AC9{^#41Vkjc?VT&%v`XrGYJ?&9hVuZq@hd zh-XWEcF@*ATL*0&v~|$dL0boHe=fBBDI8V7Se@PQXQVt_S8Tf5l-bO*r ze_0iiK3A~Q3U$f`s}bi4P&4U<%h%!HrGu9aUOIT`;N_!%mzC+6j{r zi-!%2UNz-aYp5ir##vMQHPiv zVs?o6DI(^_n!<4VbyMCkEhf9?iZBS+2ULIkR=w|R2V9q?l&EwdcEz*0XD<30Nxy!L zudnF-@9YwEKEc*L!5@9(-hmwlb{yDw&|v5BW)XVRlz}fvs}hgrcs0DENZebbf1T~Y z)f_kXaelSfT^D5Mc0qqW;&Hp64(2$R<6w>pvRjKFJD1hLWp%Ix=%dY=oV6Dma&+K% zLRtTY+9${^)NjAPeu={iB&xPcon2`6o)Tx5d)FL?Sma7kWPr~Q2;*^pJ#dW{$!GvN zk#DB>1`%*_oIJlGPZG%&=7X)@2eOwOf<-dplkN#De?a;Ke~d@iAn36*Ow);}~zqTju2r$ew@%5u4wYqNRNMwaOy6pP)m5sZ1Z z65$Ag01!%EqPtMcA)sIL8RUR^UL1j2%x9Q@fYR$R^sWICgH#ZoT;7`BpXkhekb8^B zk;Z!Gf7`B|H0^DFO-{P19kt|z)#%CTZF+gs>`^|M?psEhij~E$I9UDqz{lmF9&Oho zN0fr;2v)@0T1j_NvreYJP)qP5Vhm1EjZA-WLT;$HJcKlDt(VAAlXnZjE!&M^4P=$P zovUt1V=R&6SW0!#6)Cc5tgZ+Ph0Vvfu;XTse@qeExFT01qYT3^z(^5K$Z{%wDyjYp z10jrr0mww94RAR_S0pKlnY@rpQSkvKFF6fgYUQ8{F@T9e;ZPW_{%d-g0aXe4l#hKgr z4NP~c%5Qyiay%&I=N^-=9xQ*Y{l?wyj5Ye*p{gD~8~JJuXxoQd}- zWv!Zjt*a%I{f9Uc9VS{SBNp+>;;Y z?H%Sv)JKE;&Eeo&s@-Y^-b3~~6JPj^5?V);Ndk#>>g_wE4awm-gbaVZL+DWPC7yh~ zLD5^r@f?b|W4w?^^$Zah@P+y45+{RyjwUflC|^IT%4Zw0n4zdgkS4feOTN5jFp znCN7y`9jj>n94!-)IWbr{d1$A-ss0S`Z?zXKGEG^|GPvS7xCDGL6FKGH!%=M74kEj7n!zb~Gx@@k{k( z8;5MFS}i}X(yum!6Gh!=;Hx^ADZESwmKIf2MZ;=nF*G>~pu@6BMyl;9NX?oyR{#~Q zkk-wn220zTRc29J8i{?>ww_^1b=)V&uOBCjoiOfA7;7g{%T@fih4>>o8#@}+Trs4! zgybHPFT=7s#$12oNYri5rH4Jj?d0$0;Mp98U)6{Bro6?H$nu>zv&Dvhi)!-i!!L?G zwAsYVv1kTg@EHP7J-(e$hSV+_)4O$GjQA}=YWs}eQoa8t%YdVkV|GO@KOcYI2NyFM z2R`64%m9bi$>trnMhgZoVH`pK|L<+L%|*HX%qZ8UT^4`$Wq#t9soKh^7CNP|t}SM> zy~8)Rwnuvdc@dZ2idzQlp8!uX$Kbmaob58{% zVh4PZ;b~WEh2uJp4T|j4Tz;lhCXT!~fE<&l(9A){@c0s$I!ICx5kJNom-HGDb)0TF z4kr`-XBRP?JpVMh&rW{5nxgB}N7Rt7Lth)zKAWdP)*sLzcnaw$-Ujs%K@ z8h~VRJ3|pl1AijQsYe5VxzHg)DaA1ZlmrW*AwV)2#g}36Tz=vHf`eS>L5tw_{KTw` z&CS1eSK$=p+HTENIBFHrc^G%dr)gGh5y}4bTPc4Oa#R%xsVU1=KF2(aE##f5(qm9$ z+Pme6G;fLjnZX;LZ1U z_v+QN8r<2PRGqWWhG3pc1)N=Q3;$ObVzRMEY{WQB!YiO0sW4B*^otWvVE%v;76}-c z&#b;21v`E&&Q1$6`sPp{@5`2KVQv<1kWNV1A1o5^Y;-mss6ztxq_I!KT{1Jhq`{8{ z9UDTBdfp9iCpDz!{i`$#E5Nw;hO%0mMxHwJvyiJLvK$tK$_&YyXY;cO@zDPWr5|Jw zB5mCmoB=(eRBo&|YAH$uXaBph&UxSMq%4j|e9ZpHMO@}I&$z)85r24Oe~+^YyEYI&%sfFngt#Z&03v|ZH{HT55I z6~$(3HEQZ=Ml*N0wcUDOw0mPJHTHep@Ec>q)_FWFDPfHS~g=*cn@@zF77aS-mGC%Z_a4BVv-kzO#d znQ>$6V`2woV^1ZtGOJ~Sc_Yh@m??}I+(_inW0w*=+|RnMq795ig-wA{>Io#iAmpT- zE=sLn6V4HkSYiroe#`;AFz#;xgoo5KsgF>=BIK~(WDL%WpTHj zm7zC1Avg#_pj5e5d>aqz=Zyx|{NR`31XJsbSY(yg3Q*EMcMqk^sLtK9$p;lJjNhO= zLj;HB?qa17e)Nd?#*8c#6-aFa8k14MQo%JMAYXxmZku?Cjr9B2S08d(-|?w6?>Y|P zJUDc0wTrHQY)n*%tF2=)*$WjYOS%8Uyx0)N;<*KX-nISWmW8E2C$aW^j-0i)@SnJN z`Ig_hrY~crou1+1Vch>7d(k1RM?zbO)}Vo!=4QX@PW2NE?1FFJd6t{Wb5#7 z1X_iAd$OKxOR#SV#_D{6{ct|bk^}D;9UFHs=#q~VWLdcU4zMBkkv&)tcpbvL)iegh zGJLQ$HvaZS{7NR+ILp%}0r$@b{E|@SOcLxYIYTy|lJ=+wpu*nNJ0|TFi`@eV!}-mj8f}ZxZ@V0HG62;3b}znT z-%Fdl&6 ziHE&QoEqgeO2I3lOJ+E$)Sme4@;hq^m))L6%34cC-@&vqVq0$wicW+wFYo{! zueHZtkFzx5PO)xZKPqp4aj; zDda0d_PTASklspgp)XQf26vBD-PaETszjsDe5lM?by!my5#Yj%%>~^cCbQCJTMcDd zTKH^}O|#G&2Z^x}p6;Y?G5igFqhh;1imptoDQzJ-?YW^&GY8~~YFQ+ylOmUPvt zDx|j6_9E%0E_Csbe*)zo_&1}p)Z3qOROMWL?3NpxMC|yt%JRbGR&C;Gc3T2R^rad$ zMN{FWu}RD2v^pj1{9~Qqp?!%?(rVR)L55%>iFQB<#@9?AYK283TzTf_T`^`M|9_!?KmaH z--pPgjjv?-*j*-KI4p+iVN^Nkx$U{n=Vs9;`9${EEZn+J@mgbiih{bPgc306&{Na_;Pw$NHH4Zah{ZFvqef$v0j#HRG$?G))I5yWD3)N!~L zy~E_4s7CC3d0&=~`BSJ}|9*{#mzviKGS&RHPsf}Mk<~%en%hkldP>>Gz|QkIJRwq&8-KllU}t*k$(PxFPx52t+K^%B^c;&w^0>u8j-4#{MT| z@{%%hvB(+6@LPL_OX7Y$=zTQ_LK$B%XXTD*ztTLHS-Nt(Nc;DI=q;ZwzAR=zKgU{v zKyT4G%Zj5CI{JpTxQhkr8ptnS6!lvHpxEmR@BKFp&jkZ9|6K%lcfZU%$1zvZm~1^3 zi&=TDDnojc?ODa!f{=582)3oF`EJ)T})^ zq|*wibkU^!T>OKBsgAHpFfFY>joE~-))nKgNvK6vwp<5nN+VD3$5B#riX$Q+K)19B zM$^W^HaoU8(C#zQR%ov_bUR7a?_Q}U_*zH33^n%)d%qpMT(337dKyR-r}xtkna~)y ze>1yh)sb&c7P>dHhBhMew|bFM2ES5Iz**O0xwmD?wt02y`%@*l79X!%+%fa-=K)_M zp8Ko}<=Cqp_^p$(brnJBGAL~l0OC-8Y|z|#kPH3x<-ZS4t==~e59a~>n z9)sp(v>n>X6d;fARJX{we;*~3Dqxzy;v9KI{5~7=#NVZVlT>}8#MrmwusnvWM`OF? zzG?+LGt5nIZiZeRKby33gWK4yP^Yn5?0zYUT@!0V&Z_vZy7VdS?`9>mN`p<;b1Ynz zJsv)|cKFC#4XqMMry;fgpCbqVd5{OM={9O+P}YbTwMv{^BsD~=8XY{7oT&3@t#ehY zGgmIc>X2&O+?|y(&_s)V_=<_>NK&u}Lr^7I6SlRGEXFTDv5wV%yXpXCM|)YzR<>fu&(ow$xs?97pi<_g_UVVUukA47%nD}pZOSkkp@KsjYqi)7!!Rm)(Kmlj5PR? za3mA$(ECul+wb9##qJ3y@rx-SGn~8S_sbipL~s;^$orN~aS?S%Rm3UJpJdmxPZE4l zm@1Px9mDx&6^R@hgXG8{n5+8EEL42To@_wrTJ$vI46;bMjP~RojWLogzU5wjM%U{aK1XLFHR^(m9kr=J*H@bNAxeVXBZHK)EIQ&N=kU3zORK8Me=u3`AcV?d%6RwJwdB$Nu3`*NvgG2D^rFnqLVdd!jDfAFxKk;7B#aTKg zP@9h_P^rCIB8=f26q)?QjFNvIcr~<4(^`|$)J+V#Y~Jv^6h5kqQpehw$l!Ps(v`e>sMQ z5h7#UCAu8+WA)?j^#3sSM@+D0+9pi!iN?_zMbu|VL9V$1zISu#|F~;LJ*}WHGeJ&4 zTwflwYFkoVuLq4Tkgx6(KC#=GTs51iC`|pL;PnQ=)Zhp*Rr<{*v&|(Y9#>SGE0>)h zjK4OLyB^K%)l_Inn8{*$c&Sosa2Hgh8a`mMdu&Wox_4iXV`>ls)fQ2n6#Ws#5V<13 zg9QMY9WvYo(*Hrq;tY`lCh^B2jz**I7Xs-Q{m;}G-#%}a=-DG9_-hJFtSN@gX{Hv5 z+kk7~U+%ucx#bUY85f!bgo5V%C1t~26mJqR+HzJG2~F&M?ncR*mtw6tL)4}5?-~7{ zVkC)4@Jt5p-K~X}mK+$A_$E^?XWDhL0ldEvjm~;@u+?avooyobECVD{uFlmnn3^vYI4pBH) zlEp(2$?;Lt>@eiQzS)I8!_QWyjg6pYI;?Kc<3~c*r@QXf%{AM}A=*@=o|*(#fElNy zyl+?hjF3X+2a`+iy+`@_N%$#3;w}Z5Dr4TEfO8vopF?9!Z0~jg^!9V4&qQ_kP4Imq z8;%-xVx5<6D!pK?BB?c)Qn1wpL)2u-D-(B_qdZCw|8%yhKDsA`Milt zf>&@Z)O75(22T0f{Se#Ex9>jX*o>d@RYUWx*~_MvZ3pp}tNM%=f1saG(w^<2u(Dka zAHvfQ6_6WkuiT42Gen(LsfB?mr}frXDUBR$>$QhF6FLsJumGEH!1N z8c5J5=qHD8mxgpOG03;G+~%29Ri6lq^)!i8fSqtC2BUZCjL*jTHIACFcZ>K!&jrKj zgX6%^X7o>-?@w$9hY#h;Z!oAVS?cj58jUL@)|5_{=7^OSO^Jy@jog5tq%H{0Mn6y4 zTOe%HEick!A6}87heQalD>7+f(H0-Byli01dcx!4bPl%B`)*8r;v5bkG*nTY!mKI^ z{;k@C!dvq&clwuB1=4A5HL|)iIekcnf7kZn1!o{ye zoC_g*V)~oJQEL$&{t;$0AO6GjkHepHaI)hX&X{njpe?;LJo*;kW4U9@SJ^VTSPy^M z3h}606#dGQsz=#eQ>%_TyY(~ivu?tx+ILNe*JY0LPMoCBB!m6T{hI;C1(s z_IVNW4d=?2PtMZ7Hzd>S0A1M_T`%o`FT)4$;*mb_9ehA8xvu}8I?&35#_Ml`RnNcj zm$93GT4MdN18!Djl2D7Y8O^t90WfM;V_BLiS$4XKgH>ADqRXlW#Qd#rFjvXN-n51K zUWlT{kEfwWz_?D<#=y~`m?+@g?XU?-cloA^edXvnV1z!>x3x2gC-&8 z2UmSkEsXT_6TNM=HpQFW_Sy3SD;+12yCV^oiw)A=rODLB1}&X4|5m$JcfRwr>I(k% zN>r+2N_eZ0nh zHs4a$n#HaJ5z~&YWj9!83CUI7_F3NI9_+=uq1zAh{^Ja-Dd|0{m~X8A#hzx*Y%THm zeI0~9@t+dz1GFhqo(VgAMz9VmyAI1@55jF9GhiSTrFfzL>vuO) z!iUh$-dPl)Hau9IM)bd2Lqd1w57+=$=#nJ}qEq?uNODL?Ga*~(iCM@Xk`FS2w7&Ff zlX1{3Xl^go_X5k1l71|EhhQ$SpwI?_I6}Sp4^j%&yw6oc|DE9TMN5}IElSNpf&bbN zvjAybbdYcxhkS5Xa!WY;tY9=a)c&}R0F)^=e2CO3razfj7v={o`0DReF$h%SgrfAa z!5-ETAQU#-IMaa?;_CaH#Cr_|Rn`PDtfWoGE#OIq`{$4pK!GCTGbAj-bRujp33?y# zd`OLL-;-%dGmcM(6z#c24z!;mS^v|;LBR>ejzW8niGK6tVa2E{`^3?UlOGxNo?;~? z41?)LcjsB5as%!Y0*MKRfrzmcNAX5uGzDawZ40Ck(2{8ol%k+m;-h>-QA7m>eHJic zN#b>=K?aJ8bk#wxL;5}}CZ-nn0eW|H#Koe2E5fP!G24*X-LDA`sK`i5Z+4P~1l*tg`V5B{_flO^AWbJenK6LK8;k9&% z_pzRg_Q&8`-Ds1{e|`unwp0#mch?VHyaS9o#T4P=p6qXPj4iP^W-oz|cw5E@nzU{- z(vITap~&Zyywe+%!Ze;Z@NbyA;wEeVd$Z>ZJ`*rK$K(w%y1QZ$bs?F)4USiqLBDGY z3;x24HV$}Dq9LYsdG0wK79GiP4Dykh9i~m=*>?JP_~E~DQmnOMpP%_IsTi*$^u$;>zbXy>`UWBUujL?1g*!X{zct7I z-*V`V>+gl~=0+iGuZugBcn_xNN+=S-+e^wU;H$l=OTtRAP)=jAC{>mL&;6F1yyTEC+xs3x6t z+wFKJlE=QblI@SA4H5I<*&&EWUvrTuN8PvDi;4Anlvm=0PAz9-71_x|CN)@rZ8&MG znohKh+`3bwEtgsaW}{l&TE10zWb0=3+Jf@g7p)(>fVN&Yreq2sY(QP!dkE&R-Zm-G zx(h|QsWdlP$RV`Zo{Ljc+n`0=2(LwJaJ38-e%$U%veCdj0lLhQ-xtdIi9qd#L#*u2|fUPZcY&+(|% zWLz8|jyE5jycP)>0>T6!G06dQHV7j#T?kG{-0*>zQH(n}-bXR3N-9TNjegQp=fr6m zGd@V+$Cwr6#b2-N-)BE#`sR&3uJ0gt*>t+Yec*ac^GdubvDU#0^ z!FBWg$mrl}LBpl1_`3=LI$xx)4JUSrQ-HG1bNNl&4)?7-MA!Hpny8z|AHJGuz5UL{hGhxo?XrqI)Om% zAYQpb<#CJxR~tbs7l>nEKQU*g)yXW=X0|el4CzMc>!aVAs+p=G#cDozE`Fw5yw9ZO zE!^eB-b-Bs(j2yYVzvLcZ>=lB$0wHgl1p#ja-~0EnGFpf`jJ%2$WLP&DK#FrOIx%> zUeb`3{7B7bJmn%u(rS6s>J7Kui_KyOs)mwAq~_vE_4CFBirpqYJ^a*etbe=0edK_Z z$!(p)Q`%(!9jT5xKseRaMJjnU5;zcvH)P>$D{dPvYm#178n@n?1zSR?nq8HT zHCZ;%s!bp8Rp-fFZ92(2BR8GKxg>b2b<5VGV$Abf4v>2s`DwJr zku`4_uT#XV)91c)*>)ceDSSF}f1Nvh9uncL9F>eBJf)Q)ODAl*Tykx{>#O=p`2e&s zXFpM}WVZf{nft1MAxC>D{e$>zZKrlzYo^oq^UbfZAI8-gWV@*iWKoq+8CO`=eBsem zQx6`UP=7V#@Ee{lFOk5<<8JJ@7i^l;lJ&&>_T=wIgZ6L642JfWt0Wx3vrB(H!kUp-Bmmhr>znYWo zl@&_B;DIBZl;34AOO2Vwm4bD1gsNZgPUKe=rxy+ZNAHK|NkgPPwwlxoTc;$yI9LWdw*T3{V>bPLTsz}J4QVk^zUOXOa$XWr-ZIxSc#9lB9oH& zu#p(0k~9g4bDUjj<3*-He&6`vd~vQ;!eplR=C0ds_-*p?M$NLc;$^>>ZI|9G_55%@ zwcV0&OrMC~yV`4i2Dn*-;wIv+uP5u2^w1aJFXQ0Y`9l1Ct|!X7ho9g1?273%OBKSK zO1sLcfyIJUrPM$50~q#P%-vh zfBX+FOp|7fL~7xq0dykm>6qlOjwmgRSoH4dzCDMgy6QGfMdcOV=Y&<^yX z3ihSbaRbLA&(;0s3ZTm41~$X-N|4P?SZAe~tn0H0X6E4xLsFu8+8 zrS7BXaL3jgE`mf=Xo~d(-+R}#_#z}5rP?+uO<|+*6L?iI#=g4qi zJrBlLagHMhzg7&!0xhv#EVMrI5k>C8Avj-)T0Dw`{6(ctw%NsiO}lODTX72PzUTx7 znJ;B(U0Oz8$)ePj?W1eTpS~O|nM0vsx5;(F^L*{nAEPI8g%yBjSo_dgJKU3Y{9?%E zvLh6-!)gV=leKtkqT0*kIs-<0MXXmdU_Mo2{PG{trAqt7Kzl{mr*n%Uz83d@LOv5J zyrc_a_~*4tL=M~Wzg5|=E6eYy?0={Ksj`{aaft#t+wA`cfe+O7y=HET%WO2xgReF7 z?fd*y(n$?Py0^wiB$g0GX55A*s1=X;>|Jd$TAnU!aoQ_9Z1w>n^gYX{efe~Eeb1Tf z?-UtBHVyu4h!kdM@vxa>5|0f$YL_o)As;&jILrqq$&8yCqn|3K=D%jUjaJN`x2#g@ zc^Pog%x|f-tYlAR#Y%0w+8)S$n&<{EhmSqLwkV-);~2Nm{k=0Ki``$YY3O08Mcsp+v*)>+hLacq@!I+E~v zh#zODwgB4sO=jFAggirU_9x$YX>x$`-P;lwx#W~tK7L29I7uz~4V zJ@FzOR*!`(U)k`c9=}za!cDaH@(s}2`Hg6q4X{lQx}_wYjG34=w#$k}s8_v+dHG-p z**$ENd?_ip?fiWblchm-jf>M**-gE!jk?F;o?8gi-RZ7|nxQIQV^Ls?nVMr3w^OdH zUj!|uJD_dUV7yF>qd|y|TuZBam&)e-SWwTVli3}tjDcSZL4+b}D_ z0SyRF%7x1!1(yEV-y-)Z`(wUjLZ%!Mzo#~PEW)w6RooC(N^8Dfo1323*pQPRt#R=z zWj)1~Dl>}0yAdR^vpGRR$5rnX^r!TGI@h)Cw+CWv-Eq0=JH|Wg&K`}IN>77QU3mOs zdTbSNc4h3wiLx`iH(_3szk_aKFmVJdkXf&_JmIW*H^6Nu)}MfHe}1OtKnV1rB?yVn z;?BM#R0vD)gFoIGCa7+~uuiS6ZPRe`_h2INW%~=9_a0+dm6?akoqY)!I2z2`?^lw_mIAEE% z!vMlhIYfd5saTnfr&II)f?v#_(C{Yl_Rg|b!GKk;b#`5sF!YL`{&#~GYq z>L0djKQ2n~QO_!u)AR+|gA0~Im+N~vX?{PoS2A{nxN)@$(nb~jQAUR$AIRqSx6w^p zCOR~jSpz5jHTlu54%~H_ z_ofM%N0H5}l$afJ3%!#t?rW_Z*R3_oi;dgBDg;6k+LKcOop;ouo26uqt+=BY&xcQ> zMrUdL&o1_~bUuIs^AKQnFG4NY=6y@XljhMEc)(B8x<)&JMf!#>hqDwyfMc9sfu@`} zb-doUT=SZWHy=-0Dq-0|4fBGoQ}Z&>Ar{~mKW!HHOQa4TadhN4MRFluevVD29WCh| zp-_}6MSY0cT+^_AwtzBw>XRekK*UdZctHPH!1TdKclHYvX^xXjYA32fRqTdKif+jT zJ=iqX7JI`T#omTVsRcPUT9aQaa1Ivd!7@OVg5zhEc}heGt)Z=a;a--+2ZyUyx2Hl( zHa03Ae0Ety2ITd&pn|UM=5i$*CQ~6;#>T3{7Xm-Bu{#53D5$r$z=mch8ZbQ6{{nP| Bu8IHv delta 26488 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 Kx0~A&c>)0C)KMM) delta 12899 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�D;LiA7<#xY}W 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 N|NnR6)?pWU0ssqiTNeNT diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index 7c4eac1de0dff757047bd7343ef3cb13bf31401e..ac6a52b566a1e9239537f983748fbc64fe0c7c4f 100644 GIT binary patch delta 3866 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 diff --git a/build/version.go b/build/version.go index 64109f1d89a..356e3aa7c91 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.15.0-rc3" +const BuildVersion = "1.15.0" 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 0bab16abbd2..6f64ce5e498 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.15.0-rc3 + 1.15.0 COMMANDS: init Initialize a lotus miner repo diff --git a/documentation/en/cli-lotus-worker.md b/documentation/en/cli-lotus-worker.md index 7f7cad36af2..322b1c3e499 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.15.0-rc3 + 1.15.0 COMMANDS: run Start lotus worker diff --git a/documentation/en/cli-lotus.md b/documentation/en/cli-lotus.md index a9c4d142b30..59e48aeb57b 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.15.0-rc3 + 1.15.0 COMMANDS: daemon Start a lotus daemon process From 98642ec4b5c7fdc166b6c625b5250fefed727415 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Thu, 10 Mar 2022 17:28:40 -0500 Subject: [PATCH 393/393] fix the change log --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b50d7cc9e74..21b501fa3f1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,7 +15,6 @@ This is an optional release with retrieval improvements(client side), SP ux with - by setting `MaxConcurrentUnseals` in `DAGStoreConfig` ## New Features -- fix: sealing: Stop recovery attempts after fault ([filecoin-project/lotus#8014](https://github.com/filecoin-project/lotus/pull/8014)) - feat: mpool: Cache state nonces ([filecoin-project/lotus#8005](https://github.com/filecoin-project/lotus/pull/8005)) - chore: build: make the OhSnap epoch configurable by an envvar for devnets ([filecoin-project/lotus#7995](https://github.com/filecoin-project/lotus/pull/7995)) - Shed: Add a util to send a batch of messages ([filecoin-project/lotus#7667](https://github.com/filecoin-project/lotus/pull/7667)) @@ -43,6 +42,7 @@ This is an optional release with retrieval improvements(client side), SP ux with - dagstore pieceReader: Always read full in ReadAt ([filecoin-project/lotus#7737](https://github.com/filecoin-project/lotus/pull/7737)) ## Bug Fixes +- fix: sealing: Stop recovery attempts after fault ([filecoin-project/lotus#8014](https://github.com/filecoin-project/lotus/pull/8014)) - fix:snap: pay for the collateral difference needed if the miner available balance is insufficient ([filecoin-project/lotus#8234](https://github.com/filecoin-project/lotus/pull/8234)) - sealer: fix error message ([filecoin-project/lotus#8136](https://github.com/filecoin-project/lotus/pull/8136)) - typo in variable name ([filecoin-project/lotus#8134](https://github.com/filecoin-project/lotus/pull/8134))

(`#wt?c$#i9}Fi+f3KB5meUrN9@ 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